0.10684
@@ -1534,7 +1534,7 @@ exports[`OrderContent should render without error, open order 1`] = `
}
.c4 img {
- width: 19px;
+ width: 20px;
height: 40px;
object-fit: cover;
}
@@ -1664,7 +1664,7 @@ exports[`OrderContent should render without error, open order 1`] = `
>
252.074
@@ -1734,7 +1734,7 @@ exports[`OrderContent should render without error, open order 1`] = `
>
0.10684
diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/parseLocal.ts b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/parseLocal.ts
index 531962bd233..4d6c7387ab1 100644
--- a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/parseLocal.ts
+++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/parseLocal.ts
@@ -317,7 +317,6 @@ export async function signatureToActivity(
switch (signature.type) {
case SignatureType.SIGN_UNISWAPX_ORDER:
case SignatureType.SIGN_UNISWAPX_V2_ORDER:
- case SignatureType.SIGN_PRIORITY_ORDER:
case SignatureType.SIGN_LIMIT: {
// Only returns Activity items for orders that don't have an on-chain counterpart
if (isOnChainOrder(signature.status)) {
diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/parseRemote.tsx b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/parseRemote.tsx
index 16e3443e527..41bc895888f 100644
--- a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/parseRemote.tsx
+++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/parseRemote.tsx
@@ -495,7 +495,7 @@ function parseUniswapXOrder(activity: OrderActivity): Activity | undefined {
// If the order is open, do not render it.
if (signature.status === UniswapXOrderStatus.OPEN) {
- return undefined
+ return
}
const { inputToken, inputTokenQuantity, outputToken, outputTokenQuantity } = activity.details
diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/utils.ts b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/utils.ts
index a953f6bd2c0..85073f7bf82 100644
--- a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/utils.ts
+++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/utils.ts
@@ -1,7 +1,7 @@
import { TransactionRequest } from '@ethersproject/abstract-provider'
import { Web3Provider } from '@ethersproject/providers'
import { permit2Address } from '@uniswap/permit2-sdk'
-import { CosignedPriorityOrder, CosignedV2DutchOrder, DutchOrder, getCancelMultipleParams } from '@uniswap/uniswapx-sdk'
+import { CosignedV2DutchOrder, DutchOrder, getCancelMultipleParams } from '@uniswap/uniswapx-sdk'
import { Activity } from 'components/AccountDrawer/MiniPortfolio/Activity/types'
import { getYear, isSameDay, isSameMonth, isSameWeek, isSameYear } from 'date-fns'
import { ContractTransaction } from 'ethers/lib/ethers'
@@ -100,9 +100,7 @@ function getCancelMultipleUniswapXOrdersParams(
.map(({ encodedOrder, type }) =>
type === SignatureType.SIGN_UNISWAPX_V2_ORDER
? CosignedV2DutchOrder.parse(encodedOrder, chainId)
- : type === SignatureType.SIGN_PRIORITY_ORDER
- ? CosignedPriorityOrder.parse(encodedOrder, chainId)
- : DutchOrder.parse(encodedOrder, chainId),
+ : DutchOrder.parse(encodedOrder, chainId),
)
.map((order) => order.info.nonce)
return getCancelMultipleParams(nonces)
@@ -155,7 +153,7 @@ async function cancelMultipleUniswapXOrders({
}) {
const cancelParams = getCancelMultipleUniswapXOrdersParams(orders, chainId)
if (!permit2 || !provider) {
- return undefined
+ return
}
try {
const transactions: ContractTransaction[] = []
@@ -179,7 +177,7 @@ async function getCancelMultipleUniswapXOrdersTransaction(
): Promise
{
const cancelParams = getCancelMultipleUniswapXOrdersParams(orders, chainId)
if (!permit2 || cancelParams.length === 0) {
- return undefined
+ return
}
try {
const tx = await permit2.populateTransaction.invalidateUnorderedNonces(cancelParams[0].word, cancelParams[0].mask)
@@ -213,7 +211,7 @@ export function useCreateCancelTransactionRequest(
params.orders.filter(({ encodedOrder }) => Boolean(encodedOrder)).length === 0 ||
!permit2
) {
- return undefined
+ return
}
return getCancelMultipleUniswapXOrdersTransaction(params.orders, params.chainId, permit2)
}, [params, permit2])
diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/Pools/useMultiChainPositions.tsx b/apps/web/src/components/AccountDrawer/MiniPortfolio/Pools/useMultiChainPositions.tsx
index 3ca93e7d6da..a3e35f8aa86 100644
--- a/apps/web/src/components/AccountDrawer/MiniPortfolio/Pools/useMultiChainPositions.tsx
+++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/Pools/useMultiChainPositions.tsx
@@ -212,7 +212,7 @@ export default function useMultiChainPositions(
// Fetches positions when existing positions are stale and the document has focus
useEffect(() => {
if (positionsFetching.current || cachedPositions?.stale === false) {
- return undefined
+ return
} else if (document.hasFocus()) {
fetchAllPositions()
} else {
@@ -226,7 +226,7 @@ export default function useMultiChainPositions(
window.removeEventListener('focus', onFocus)
}
}
- return undefined
+ return
}, [fetchAllPositions, positionsFetching, cachedPositions?.stale])
const positionsWithFeesAndPrices: PositionInfo[] | undefined = useMemo(
diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/Tokens/TokensTab.tsx b/apps/web/src/components/AccountDrawer/MiniPortfolio/Tokens/TokensTab.tsx
index 24bd3116b7b..f02737c0958 100644
--- a/apps/web/src/components/AccountDrawer/MiniPortfolio/Tokens/TokensTab.tsx
+++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/Tokens/TokensTab.tsx
@@ -8,7 +8,7 @@ import PortfolioRow, {
import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks'
import { DeltaArrow } from 'components/Tokens/TokenDetails/Delta'
import Row from 'components/deprecated/Row'
-import { useTokenBalancesQuery } from 'graphql/data/apollo/AdaptiveTokenBalancesProvider'
+import { useTokenBalancesQuery } from 'graphql/data/apollo/TokenBalancesProvider'
import { PortfolioBalance, PortfolioToken } from 'graphql/data/portfolios'
import { getTokenDetailsURL, gqlToCurrency } from 'graphql/data/util'
import styled from 'lib/styled-components'
@@ -106,13 +106,13 @@ function TokenRow({
element={InterfaceElementName.MINI_PORTFOLIO_TOKEN_ROW}
properties={{
chain_id: currency.chainId,
- token_name: token?.name ?? token?.project?.name,
+ token_name: token?.project?.name ?? token?.name,
address: token?.address,
}}
>
}
- title={{token?.name ?? token?.project?.name}}
+ title={{token?.project?.name ?? token?.name}}
descriptor={
{formatNumber({
diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/__snapshots__/PortfolioLogo.test.tsx.snap b/apps/web/src/components/AccountDrawer/MiniPortfolio/__snapshots__/PortfolioLogo.test.tsx.snap
index b1b6c9715ba..9e514fdd053 100644
--- a/apps/web/src/components/AccountDrawer/MiniPortfolio/__snapshots__/PortfolioLogo.test.tsx.snap
+++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/__snapshots__/PortfolioLogo.test.tsx.snap
@@ -13,7 +13,7 @@ exports[`PortfolioLogo renders with L2 icon 1`] = `
}
.c1 img {
- width: 19px;
+ width: 20px;
height: 40px;
object-fit: cover;
}
@@ -136,7 +136,7 @@ exports[`PortfolioLogo renders without L2 icon 1`] = `
}
.c1 img {
- width: 19px;
+ width: 20px;
height: 40px;
object-fit: cover;
}
diff --git a/apps/web/src/components/AccountDrawer/index.tsx b/apps/web/src/components/AccountDrawer/index.tsx
index a1aeb5a9adf..c2640b5406b 100644
--- a/apps/web/src/components/AccountDrawer/index.tsx
+++ b/apps/web/src/components/AccountDrawer/index.tsx
@@ -13,11 +13,10 @@ import styled, { css } from 'lib/styled-components'
import { useEffect, useRef, useState } from 'react'
import { ChevronsRight } from 'react-feather'
import { useGesture } from 'react-use-gesture'
-import { BREAKPOINTS } from 'theme'
+import { BREAKPOINTS, NAV_HEIGHT } from 'theme'
import { ClickableStyle } from 'theme/components'
import { Z_INDEX } from 'theme/zIndex'
import Trace from 'uniswap/src/features/telemetry/Trace'
-import { INTERFACE_NAV_HEIGHT } from 'uniswap/src/theme/heights'
import { isMobileWeb } from 'utilities/src/platform'
const DRAWER_WIDTH_XL = '390px'
@@ -100,9 +99,9 @@ const Container = styled.div<{ isUniExtensionAvailable?: boolean; $open?: boolea
const ExtensionContainerStyles = css`
height: auto;
- max-height: calc(100% - ${INTERFACE_NAV_HEIGHT + 16}px);
+ max-height: calc(100% - ${NAV_HEIGHT + 16}px);
right: 12px;
- top: ${INTERFACE_NAV_HEIGHT}px;
+ top: ${NAV_HEIGHT}px;
${ScrollBarStyles}
`
@@ -116,8 +115,8 @@ const AccountDrawerWrapper = styled.div<{ open: boolean; isUniExtensionAvailable
z-index: ${Z_INDEX.modal};
position: absolute;
margin-right: 0;
- top: ${({ open }) => (open ? `calc(-1 * (100% - ${INTERFACE_NAV_HEIGHT}px))` : 0)};
- height: calc(100% - ${INTERFACE_NAV_HEIGHT}px);
+ top: ${({ open }) => (open ? `calc(-1 * (100% - ${NAV_HEIGHT}px))` : 0)};
+ height: calc(100% - ${NAV_HEIGHT}px);
width: 100%;
max-width: 100%;
diff --git a/apps/web/src/components/AddressQRModal.tsx b/apps/web/src/components/AddressQRModal.tsx
index 9a9be9ee7fd..513011f5ed0 100644
--- a/apps/web/src/components/AddressQRModal.tsx
+++ b/apps/web/src/components/AddressQRModal.tsx
@@ -58,11 +58,9 @@ export function AddressQRModal({ accountAddress }: { accountAddress: Address })
{
}
}
-// eslint-disable-next-line consistent-return
export function formatHistoryDuration(duration: HistoryDuration): string {
switch (duration) {
case HistoryDuration.FiveMinute:
diff --git a/apps/web/src/components/Charts/VolumeChart/utils.ts b/apps/web/src/components/Charts/VolumeChart/utils.ts
index b09ee580dae..b247b2666e6 100644
--- a/apps/web/src/components/Charts/VolumeChart/utils.ts
+++ b/apps/web/src/components/Charts/VolumeChart/utils.ts
@@ -205,7 +205,7 @@ export function calculateColumnPositionsInPlace(
if (common.spacing > 0 && minColumnWidth < alignToMinimalWidthLimit) {
;(items as ColumnPositionItem[]).forEach((item: ColumnPositionItem, index: number) => {
if (!item.column || index < startIndex || index > endIndex) {
- return undefined
+ return
}
const width = item.column.right - item.column.left + 1
if (width <= minColumnWidth) {
diff --git a/apps/web/src/components/Charts/utils.tsx b/apps/web/src/components/Charts/utils.tsx
index 96d07f82b79..e52e0b7a773 100644
--- a/apps/web/src/components/Charts/utils.tsx
+++ b/apps/web/src/components/Charts/utils.tsx
@@ -27,7 +27,6 @@ export const CHART_TYPE_LABELS: Record
* Custom time formatter used to customize tick mark labels on the time scale.
* Follows the function signature of lightweight-charts' TickMarkFormatter.
*/
-// eslint-disable-next-line consistent-return
export function formatTickMarks(time: UTCTimestamp, tickMarkType: TickMarkType, locale: string): string {
const date = new Date(time.valueOf() * 1000)
switch (tickMarkType) {
diff --git a/apps/web/src/components/ConfirmSwapModal/Pending.tsx b/apps/web/src/components/ConfirmSwapModal/Pending.tsx
index 596117e17c8..0f8bf41bb75 100644
--- a/apps/web/src/components/ConfirmSwapModal/Pending.tsx
+++ b/apps/web/src/components/ConfirmSwapModal/Pending.tsx
@@ -137,7 +137,7 @@ export function Pending({
} else if (uniswapXOrder && uniswapXOrder.status === UniswapXOrderStatus.FILLED) {
txHash = uniswapXOrder.txHash
} else {
- return undefined
+ return
}
return getExplorerLink(chainId || UniverseChainId.Mainnet, txHash, ExplorerDataType.TRANSACTION)
}, [chainId, swapResult, uniswapXOrder])
diff --git a/apps/web/src/components/ConfirmSwapModal/ProgressIndicator.tsx b/apps/web/src/components/ConfirmSwapModal/ProgressIndicator.tsx
index e3849bc781d..c3b892873c6 100644
--- a/apps/web/src/components/ConfirmSwapModal/ProgressIndicator.tsx
+++ b/apps/web/src/components/ConfirmSwapModal/ProgressIndicator.tsx
@@ -1,5 +1,5 @@
import { ConfirmModalState } from 'components/ConfirmSwapModal'
-import { Step, StepDetails } from 'components/ConfirmSwapModal/Step'
+import { Step } from 'components/ConfirmSwapModal/Step'
import { Sign } from 'components/Icons/Sign'
import { Swap } from 'components/Icons/Swap'
import CurrencyLogo from 'components/Logo/CurrencyLogo'
@@ -18,7 +18,7 @@ import { useIsTransactionConfirmed, useSwapTransactionStatus } from 'state/trans
import { colors } from 'theme/colors'
import { Divider } from 'theme/components'
import { UniswapXOrderStatus } from 'types/uniswapx'
-import { StepStatus } from 'uniswap/src/components/ConfirmSwapModal/types'
+import { StepDetails, StepStatus } from 'uniswap/src/components/ConfirmSwapModal/Step'
import { uniswapUrls } from 'uniswap/src/constants/urls'
import { TransactionStatus } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks'
import { t } from 'uniswap/src/i18n'
diff --git a/apps/web/src/components/ConfirmSwapModal/Step.tsx b/apps/web/src/components/ConfirmSwapModal/Step.tsx
index 483bca8c887..23b5129b5ff 100644
--- a/apps/web/src/components/ConfirmSwapModal/Step.tsx
+++ b/apps/web/src/components/ConfirmSwapModal/Step.tsx
@@ -5,28 +5,7 @@ import Row, { RowBetween } from 'components/deprecated/Row'
import styled, { Keyframes, keyframes } from 'lib/styled-components'
import { ReactElement, useEffect, useState } from 'react'
import { ExternalLink, ThemedText } from 'theme/components'
-import { StepStatus } from 'uniswap/src/components/ConfirmSwapModal/types'
-
-export interface StepDetails {
- // Left-justified icon representing the step and grayed out when step is not active
- icon: ReactElement
- // Ripple animation around the icon of the currently active step (use color extraction to select)
- rippleColor?: string
- // Text shown before the step becomes active
- previewTitle: string
- // Text shown when the step is active and awaiting user input
- actionRequiredTitle: string | ReactElement
- // Text shown when user input has been accepted and step has yet to complete
- inProgressTitle?: string
- // Amount of time in seconds the user has to take action on a step (e.g. UniswapX exclusivity window)
- timeToStart?: number
- // Text shown when timeToStart is exceeded (countdown reaches zero)
- delayedStartTitle?: string
- // Anchor text displayed for the Learn-More link
- learnMoreLinkText?: string
- // URL for Learn-More link (opened in new tab)
- learnMoreLinkHref?: string
-}
+import { StepDetails, StepStatus } from 'uniswap/src/components/ConfirmSwapModal/Step'
const ringAnimation = keyframes`
0% {
@@ -135,7 +114,7 @@ export function Step({ stepStatus, stepDetails }: { stepStatus: StepStatus; step
setSecondsRemaining(stepDetails.timeToStart)
} else {
setSecondsRemaining(null)
- return undefined
+ return
}
const timer = setInterval(() => {
diff --git a/apps/web/src/components/ConfirmSwapModal/index.tsx b/apps/web/src/components/ConfirmSwapModal/index.tsx
index 3d731feb9e3..57055b11742 100644
--- a/apps/web/src/components/ConfirmSwapModal/index.tsx
+++ b/apps/web/src/components/ConfirmSwapModal/index.tsx
@@ -9,6 +9,7 @@ import { MODAL_TRANSITION_DURATION } from 'components/Modal'
import { AutoColumn } from 'components/deprecated/Column'
import { SwapDetails } from 'components/swap/SwapDetails'
import { SwapPreview } from 'components/swap/SwapPreview'
+import { Field } from 'components/swap/constants'
import { useConfirmModalState } from 'hooks/useConfirmModalState'
import { Allowance, AllowanceState } from 'hooks/usePermit2Allowance'
import { SwapResult } from 'hooks/useSwapCallback'
@@ -25,7 +26,6 @@ import { FadePresence } from 'theme/components/FadePresence'
import { UniswapXOrderStatus } from 'types/uniswapx'
import { TransactionStatus } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks'
import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send'
-import { CurrencyField } from 'uniswap/src/types/currency'
import { SignatureExpiredError, UniswapXv2HardQuoteError } from 'utils/errors'
import { formatSwapPriceUpdatedEventProperties } from 'utils/loggingFormatters'
import { didUserReject } from 'utils/swapErrorToUserReadableMessage'
@@ -75,7 +75,7 @@ export function ConfirmSwapModal({
clearSwapState: () => void
onAcceptChanges?: () => void
onConfirm: () => void
- onCurrencySelection: (field: CurrencyField, currency: Currency) => void
+ onCurrencySelection: (field: Field, currency: Currency) => void
onDismiss: () => void
onXV2RetryWithClassic?: () => void
}) {
@@ -121,7 +121,7 @@ export function ConfirmSwapModal({
return approvalError
}
if (swapError instanceof SignatureExpiredError) {
- return undefined
+ return
}
if (swapError instanceof UniswapXv2HardQuoteError) {
return PendingModalError.XV2_HARD_QUOTE_ERROR
@@ -129,7 +129,7 @@ export function ConfirmSwapModal({
if (swapError && !didUserReject(swapError)) {
return PendingModalError.CONFIRMATION_ERROR
}
- return undefined
+ return
}, [approvalError, swapError])
// Determine which view to show based on confirm modal state and other conditions
diff --git a/apps/web/src/components/CurrencyInputPanel/LimitPriceInputPanel/LimitPriceInputLabel.tsx b/apps/web/src/components/CurrencyInputPanel/LimitPriceInputPanel/LimitPriceInputLabel.tsx
index 325d07eeb99..13bdb191137 100644
--- a/apps/web/src/components/CurrencyInputPanel/LimitPriceInputPanel/LimitPriceInputLabel.tsx
+++ b/apps/web/src/components/CurrencyInputPanel/LimitPriceInputPanel/LimitPriceInputLabel.tsx
@@ -1,7 +1,7 @@
import { Currency } from '@uniswap/sdk-core'
import CurrencyLogo from 'components/Logo/CurrencyLogo'
import Row from 'components/deprecated/Row'
-import { PrefetchBalancesWrapper } from 'graphql/data/apollo/AdaptiveTokenBalancesProvider'
+import { PrefetchBalancesWrapper } from 'graphql/data/apollo/TokenBalancesProvider'
import styled from 'lib/styled-components'
import { ClickableStyle, ThemedText } from 'theme/components'
import { Text } from 'ui/src'
diff --git a/apps/web/src/components/CurrencyInputPanel/LimitPriceInputPanel/LimitPriceInputPanel.tsx b/apps/web/src/components/CurrencyInputPanel/LimitPriceInputPanel/LimitPriceInputPanel.tsx
index 82d4c46fe63..473e3750233 100644
--- a/apps/web/src/components/CurrencyInputPanel/LimitPriceInputPanel/LimitPriceInputPanel.tsx
+++ b/apps/web/src/components/CurrencyInputPanel/LimitPriceInputPanel/LimitPriceInputPanel.tsx
@@ -12,7 +12,7 @@ import { StyledNumericalInput } from 'components/NumericalInput'
import CurrencySearchModal from 'components/SearchModal/CurrencySearchModal'
import Row from 'components/deprecated/Row'
import { parseUnits } from 'ethers/lib/utils'
-import { PrefetchBalancesWrapper } from 'graphql/data/apollo/AdaptiveTokenBalancesProvider'
+import { PrefetchBalancesWrapper } from 'graphql/data/apollo/TokenBalancesProvider'
import JSBI from 'jsbi'
import styled from 'lib/styled-components'
import { ReversedArrowsIcon } from 'nft/components/icons'
diff --git a/apps/web/src/components/CurrencyInputPanel/SwapCurrencyInputPanel.tsx b/apps/web/src/components/CurrencyInputPanel/SwapCurrencyInputPanel.tsx
index 6f2f903d893..5deac4befab 100644
--- a/apps/web/src/components/CurrencyInputPanel/SwapCurrencyInputPanel.tsx
+++ b/apps/web/src/components/CurrencyInputPanel/SwapCurrencyInputPanel.tsx
@@ -14,7 +14,7 @@ import Tooltip from 'components/Tooltip'
import { AutoColumn } from 'components/deprecated/Column'
import { RowBetween, RowFixed } from 'components/deprecated/Row'
import { useIsSupportedChainId } from 'constants/chains'
-import { PrefetchBalancesWrapper } from 'graphql/data/apollo/AdaptiveTokenBalancesProvider'
+import { PrefetchBalancesWrapper } from 'graphql/data/apollo/TokenBalancesProvider'
import { useAccount } from 'hooks/useAccount'
import styled, { useTheme } from 'lib/styled-components'
import ms from 'ms'
diff --git a/apps/web/src/components/CurrencyInputPanel/index.tsx b/apps/web/src/components/CurrencyInputPanel/index.tsx
index 6f2f7b090d7..abbf11eefcb 100644
--- a/apps/web/src/components/CurrencyInputPanel/index.tsx
+++ b/apps/web/src/components/CurrencyInputPanel/index.tsx
@@ -11,7 +11,7 @@ import { Input as NumericalInput } from 'components/NumericalInput'
import CurrencySearchModal from 'components/SearchModal/CurrencySearchModal'
import { RowBetween, RowFixed } from 'components/deprecated/Row'
import { useIsSupportedChainId } from 'constants/chains'
-import { PrefetchBalancesWrapper } from 'graphql/data/apollo/AdaptiveTokenBalancesProvider'
+import { PrefetchBalancesWrapper } from 'graphql/data/apollo/TokenBalancesProvider'
import { useAccount } from 'hooks/useAccount'
import styled, { useTheme } from 'lib/styled-components'
import { darken } from 'polished'
diff --git a/apps/web/src/components/DropdownSelector/index.tsx b/apps/web/src/components/DropdownSelector/index.tsx
index fe2392c953c..4b872c9ec22 100644
--- a/apps/web/src/components/DropdownSelector/index.tsx
+++ b/apps/web/src/components/DropdownSelector/index.tsx
@@ -2,6 +2,7 @@ import FilterButton from 'components/DropdownSelector/FilterButton'
import { MouseoverTooltip, TooltipSize } from 'components/Tooltip'
import { useOnClickOutside } from 'hooks/useOnClickOutside'
import { useRef } from 'react'
+import { NAV_HEIGHT } from 'theme'
import {
AnimatePresence,
Flex,
@@ -16,7 +17,6 @@ import {
import { RotatableChevron } from 'ui/src/components/icons/RotatableChevron'
import { zIndices } from 'ui/src/theme'
import { iconSizes } from 'ui/src/theme/iconSizes'
-import { INTERFACE_NAV_HEIGHT } from 'uniswap/src/theme/heights'
export const InternalMenuItem = styled(Text, {
display: 'flex',
@@ -156,7 +156,7 @@ export function DropdownSelector({
isOpen={isOpen && isSheet}
onClose={() => toggleOpen(false)}
{...dropdownStyle}
- maxHeight={`calc(100dvh - ${INTERFACE_NAV_HEIGHT}px)`}
+ maxHeight={`calc(100dvh - ${NAV_HEIGHT}px)`}
>
{internalMenuItems}
diff --git a/apps/web/src/components/FeatureFlagModal/FeatureFlagModal.tsx b/apps/web/src/components/FeatureFlagModal/FeatureFlagModal.tsx
index 88facb1ce2d..4588dc6e72a 100644
--- a/apps/web/src/components/FeatureFlagModal/FeatureFlagModal.tsx
+++ b/apps/web/src/components/FeatureFlagModal/FeatureFlagModal.tsx
@@ -223,10 +223,6 @@ export default function FeatureFlagModal() {
flag={FeatureFlags.IndicativeSwapQuotes}
label="[Universal Swap Flow Only] Enable Quick Routes"
/>
-
{
- setCreateFeeValue('')
- setCreateModeEnabled(false)
- setFeeTierSearchModalOpen(false)
- }
- const { t } = useTranslation()
- const [searchValue, setSearchValue] = useState('')
- const [createFeeValue, setCreateFeeValue] = useState('')
- const [createModeEnabled, setCreateModeEnabled] = useState(false)
- const { formatPercent } = useFormatter()
- const [autoDecrementing, setAutoDecrementing] = useState(false)
- const [autoIncrementing, setAutoIncrementing] = useState(false)
- const [holdDuration, setHoldDuration] = useState(0)
- const hiddenObserver = useResizeObserver()
-
- useEffect(() => {
- let interval: NodeJS.Timeout
- let holdTimeout: NodeJS.Timeout
- const baseInterval = 100
- let currentInterval = baseInterval
-
- if (autoDecrementing || autoIncrementing) {
- holdTimeout = setTimeout(() => {
- setHoldDuration((prev) => prev + 1)
- }, ms('1s'))
-
- if (holdDuration >= 2) {
- currentInterval = baseInterval / 2
- }
- if (holdDuration >= 4) {
- currentInterval = baseInterval / 4
- }
- if (holdDuration >= 6) {
- currentInterval = baseInterval / 8
- }
-
- interval = setInterval(() => {
- setCreateFeeValue((prev) => {
- let newValue = parseFloat(prev)
- if (autoDecrementing) {
- newValue -= 0.01
- if (newValue < 0) {
- return '0'
- }
- } else if (autoIncrementing) {
- newValue += 0.01
- if (newValue > 100) {
- return '100'
- }
- }
- return newValue.toFixed(2)
- })
- }, currentInterval)
-
- return () => {
- clearInterval(interval)
- clearTimeout(holdTimeout)
- }
- }
-
- return () => {
- clearInterval(interval)
- clearTimeout(holdTimeout)
- setHoldDuration(0) // Reset hold duration on release
- }
- }, [autoDecrementing, autoIncrementing, holdDuration])
-
- // TODO(WEB-4920): use tiers from Positions API for this specific pool, not presets.
- const feeTiers = [FeeAmount.LOWEST, FeeAmount.LOW, FeeAmount.MEDIUM, FeeAmount.HIGH]
-
- return (
-
-
-
- {createModeEnabled && (
- setCreateModeEnabled(false)}>
-
-
- )}
-
- {createModeEnabled ? t('fee.tier.create') : t('fee.tier.select')}
-
-
-
-
- {createModeEnabled ? (
-
-
- {t('fee.tier.create.description')}
-
-
- {
- setAutoDecrementing(true)
- }}
- onPressOut={() => {
- setAutoDecrementing(false)
- }}
- onPress={() => {
- setCreateFeeValue((prev) => {
- if (!prev || prev === '') {
- return '0'
- }
- const newValue = parseFloat(prev) - 0.01
- if (newValue < 0) {
- return '0'
- }
- return newValue.toFixed(2)
- })
- }}
- {...ClickableTamaguiStyle}
- >
- -
-
-
-
- {
- if (parseInt(input) > 100) {
- setCreateFeeValue('100')
- } else {
- setCreateFeeValue(input)
- }
- }}
- placeholder="0"
- maxDecimals={2}
- maxLength={4}
- $width={createFeeValue && hiddenObserver.width ? hiddenObserver.width + 1 : undefined}
- />
- %
- {createFeeValue}
-
-
- {
- setAutoIncrementing(true)
- }}
- onPressOut={() => {
- setAutoIncrementing(false)
- }}
- onPress={() => {
- setCreateFeeValue((prev) => {
- if (!prev || prev === '') {
- return '0.01'
- }
- const newValue = parseFloat(prev) + 0.01
- if (newValue > 100) {
- return '100'
- }
- return newValue.toFixed(2)
- })
- }}
- {...ClickableTamaguiStyle}
- >
- +
-
-
- {/* TODO(WEB-4920): search existing fee tiers for a match and optionally show this, with real TVL value */}
- {/*
- {t('fee.tier.alreadyExists', { formattedTVL: '$289.6K' })}
- */}
- {/* TODO(WEB-4920): search existing fee tiers for close matches and optionally similar list */}
-
-
-
- ) : (
- <>
-
-
- {
- setSearchValue(event.target.value)
- }}
- value={searchValue}
- />
-
-
- {/* TODO(WEB-4920): filter fee tiers based on search term */}
- {feeTiers.map((feeTier) => (
- {
- setPositionState((prevState) => ({ ...prevState, fee: feeTier }))
- onClose()
- }}
- >
-
- {formatPercent(new Percent(feeTier, 1000000))}
-
- {/* TODO(WEB-4920): use real data from positions API */}
-
- $289.6K TVL
-
-
- {t('fee.tier.percent.select', { percentage: 4 })}
-
-
-
- {feeTier === selectedFee && }
-
- ))}
-
-
-
- {t('fee.tier.missing.description')}
-
- }
- onPress={() => setCreateModeEnabled(true)}
- >
- {t('fee.tier.create.button')}
-
-
- >
- )}
-
-
- )
-}
diff --git a/apps/web/src/components/Liquidity/LiquidityPositionAmountsTile.tsx b/apps/web/src/components/Liquidity/LiquidityPositionAmountsTile.tsx
deleted file mode 100644
index ea07a8e2aed..00000000000
--- a/apps/web/src/components/Liquidity/LiquidityPositionAmountsTile.tsx
+++ /dev/null
@@ -1,63 +0,0 @@
-import { Currency, CurrencyAmount } from '@uniswap/sdk-core'
-import { useCurrencyInfo } from 'hooks/Tokens'
-import { Flex, Text } from 'ui/src'
-import { CurrencyLogo } from 'uniswap/src/components/CurrencyLogo/CurrencyLogo'
-
-export function LiquidityPositionAmountsTile({
- currency0Amount,
- currency1Amount,
-}: {
- currency0Amount: CurrencyAmount
- currency1Amount: CurrencyAmount
-}) {
- // TODO(WEB-4920): skip GraphQL call once backend provides image URLs
- const currencyInfo0 = useCurrencyInfo(currency0Amount.currency)
- const currencyInfo1 = useCurrencyInfo(currency1Amount.currency)
- // TODO(WEB-4920): calculate real values for USD amounts and percentages
- return (
-
-
-
-
-
- {currency0Amount.currency.symbol}
-
-
-
-
- {currency0Amount.toFixed()}
-
-
- ($0)
-
-
-
- 45%
-
-
-
-
-
-
-
-
- {currency1Amount.currency.symbol}
-
-
-
-
- {currency1Amount.toFixed()}
-
-
- ($0)
-
-
-
- 55%
-
-
-
-
-
- )
-}
diff --git a/apps/web/src/components/Liquidity/LiquidityPositionCard.tsx b/apps/web/src/components/Liquidity/LiquidityPositionCard.tsx
index 69fb51c4b2e..f847a9396aa 100644
--- a/apps/web/src/components/Liquidity/LiquidityPositionCard.tsx
+++ b/apps/web/src/components/Liquidity/LiquidityPositionCard.tsx
@@ -21,7 +21,6 @@ export function LiquidityPositionCard({ liquidityPosition, ...rest }: { liquidit
borderRadius="$rounded20"
borderColor="$surface3"
width="100%"
- overflow="hidden"
{...rest}
>
diff --git a/apps/web/src/components/Liquidity/LiquidityPositionInfo.tsx b/apps/web/src/components/Liquidity/LiquidityPositionInfo.tsx
index 4a25637dea7..0c65d5ec3cd 100644
--- a/apps/web/src/components/Liquidity/LiquidityPositionInfo.tsx
+++ b/apps/web/src/components/Liquidity/LiquidityPositionInfo.tsx
@@ -1,11 +1,10 @@
// eslint-disable-next-line no-restricted-imports
import { Position } from '@uniswap/client-pools/dist/pools/v1/types_pb'
-import { BadgeData, LiquidityPositionInfoBadges } from 'components/Liquidity/LiquidityPositionInfoBadges'
+import { LiquidityPositionInfoBadges } from 'components/Liquidity/LiquidityPositionInfoBadges'
import { LiquidityPositionStatusIndicator } from 'components/Liquidity/LiquidityPositionStatusIndicator'
import { getProtocolVersionLabel, usePositionInfo } from 'components/Liquidity/utils'
import { DoubleCurrencyAndChainLogo } from 'components/Logo/DoubleLogo'
import { Flex, Text } from 'ui/src'
-import { DocumentList } from 'ui/src/components/icons/DocumentList'
interface LiquidityPositionInfoProps {
position: Position
@@ -33,15 +32,7 @@ export function LiquidityPositionInfo({ position }: LiquidityPositionInfoProps)
}
- : undefined,
- feeTier ? { label: `${Number(feeTier) / 10000}%` } : undefined,
- ].filter(Boolean) as BadgeData[]
- }
+ labels={[versionLabel, v4hook, feeTier].filter(Boolean) as string[]}
/>
diff --git a/apps/web/src/components/Liquidity/LiquidityPositionInfoBadges.test.tsx b/apps/web/src/components/Liquidity/LiquidityPositionInfoBadges.test.tsx
index 178b9c00a05..7a37d352316 100644
--- a/apps/web/src/components/Liquidity/LiquidityPositionInfoBadges.test.tsx
+++ b/apps/web/src/components/Liquidity/LiquidityPositionInfoBadges.test.tsx
@@ -1,21 +1,19 @@
import { LiquidityPositionInfoBadges } from 'components/Liquidity/LiquidityPositionInfoBadges'
import { render } from 'test-utils/render'
-const testBadgeData = [{ label: 'test', copyable: true }, { label: 'test2' }]
-
describe('LiquidityPositionInfoBadges', () => {
it('should render with default size', () => {
- const { getByText } = render()
+ const { getByText } = render()
expect(getByText('test')).toBeInTheDocument()
})
it('should render with small size', () => {
- const { getByText } = render()
+ const { getByText } = render()
expect(getByText('test')).toBeInTheDocument()
})
- it('should render with multiple badges', () => {
- const { getByText } = render()
+ it('should render with multiple labels', () => {
+ const { getByText } = render()
expect(getByText('test')).toBeInTheDocument()
expect(getByText('test2')).toBeInTheDocument()
})
diff --git a/apps/web/src/components/Liquidity/LiquidityPositionInfoBadges.tsx b/apps/web/src/components/Liquidity/LiquidityPositionInfoBadges.tsx
index 7e9b18eba9e..d00db7ea315 100644
--- a/apps/web/src/components/Liquidity/LiquidityPositionInfoBadges.tsx
+++ b/apps/web/src/components/Liquidity/LiquidityPositionInfoBadges.tsx
@@ -1,11 +1,6 @@
-import { CopyHelper } from 'theme/components'
import { styled, Text } from 'ui/src'
-import { isAddress, shortenAddress } from 'utilities/src/addresses'
-export const PositionInfoBadge = styled(Text, {
- display: 'flex',
- flexDirection: 'row',
- gap: '$spacing2',
+const PositionInfoBadge = styled(Text, {
variant: 'body3',
color: '$neutral2',
backgroundColor: '$surface3',
@@ -41,41 +36,20 @@ function getPlacement(index: number, length: number): 'start' | 'middle' | 'end'
return length === 1 ? 'only' : index === 0 ? 'start' : index === length - 1 ? 'end' : 'middle'
}
-export interface BadgeData {
- label: string
- copyable?: boolean
- icon?: JSX.Element
-}
-
export function LiquidityPositionInfoBadges({
- badges,
+ labels,
size = 'default',
}: {
- badges: BadgeData[]
+ labels: string[]
size: 'small' | 'default'
}): JSX.Element {
return (
<>
- {badges.map(({ label, copyable, icon }, index) => {
- const displayLabel = isAddress(label) ? shortenAddress(label) : label
- return (
-
- {icon}
- {copyable ? (
-
- {displayLabel}
-
- ) : (
- displayLabel
- )}
-
- )
- })}
+ {labels.map((label, index) => (
+
+ {label}
+
+ ))}
>
)
}
diff --git a/apps/web/src/components/Liquidity/LiquidityPositionPriceRangeTile.tsx b/apps/web/src/components/Liquidity/LiquidityPositionPriceRangeTile.tsx
deleted file mode 100644
index 52a19a4a9d5..00000000000
--- a/apps/web/src/components/Liquidity/LiquidityPositionPriceRangeTile.tsx
+++ /dev/null
@@ -1,130 +0,0 @@
-// eslint-disable-next-line no-restricted-imports
-import { PositionStatus } from '@uniswap/client-pools/dist/pools/v1/types_pb'
-import { Currency, Price } from '@uniswap/sdk-core'
-import { LiquidityPositionStatusIndicator } from 'components/Liquidity/LiquidityPositionStatusIndicator'
-import { useMemo, useState } from 'react'
-import { Flex, SegmentedControl, SegmentedControlOption, Text, styled } from 'ui/src'
-import { Trans } from 'uniswap/src/i18n'
-
-const InnerTile = styled(Flex, {
- grow: true,
- alignItems: 'center',
- gap: '$gap8',
- borderRadius: '$rounded12',
- backgroundColor: '$surface3',
- p: '$padding16',
-})
-
-interface LiquidityPositionPriceRangeTileProps {
- status: PositionStatus
- minPrice: Price
- maxPrice: Price
- currentPrice: Price
-}
-
-export function LiquidityPositionPriceRangeTile({
- status,
- minPrice,
- maxPrice,
- currentPrice,
-}: LiquidityPositionPriceRangeTileProps) {
- const [pricesInverted, setPricesInverted] = useState(false)
- const currencyASymbol = currentPrice.baseCurrency.symbol
- const currencyBSymbol = currentPrice.quoteCurrency.symbol
-
- const controlOptions: SegmentedControlOption[] = useMemo(() => {
- return [
- {
- value: currencyASymbol ?? '',
- display: {currencyASymbol},
- },
- {
- value: currencyBSymbol ?? '',
- display: {currencyBSymbol},
- },
- ]
- }, [currencyASymbol, currencyBSymbol])
-
- if (!currencyASymbol || !currencyBSymbol) {
- throw new Error('LiquidityPositionPriceRangeTile: Currency symbols are required')
- }
-
- const displayMinPrice = pricesInverted ? minPrice.invert() : minPrice
- const displayMaxPrice = pricesInverted ? maxPrice.invert() : maxPrice
- const displayCurrentPrice = pricesInverted ? currentPrice.invert() : currentPrice
- const displayASymbol = pricesInverted ? currencyBSymbol : currencyASymbol
- const displayBSymbol = pricesInverted ? currencyASymbol : currencyBSymbol
-
- return (
-
-
-
-
-
-
-
-
- {
- setPricesInverted(selected !== currencyASymbol)
- }}
- />
-
-
-
-
-
-
-
- {displayMinPrice.toFixed()}
-
-
-
-
-
-
-
-
-
-
- {displayMaxPrice.toFixed()}
-
-
-
-
-
-
-
-
-
-
-
- {displayCurrentPrice.toFixed()}
-
-
-
-
-
-
- )
-}
diff --git a/apps/web/src/components/Liquidity/PositionNFT.tsx b/apps/web/src/components/Liquidity/PositionNFT.tsx
deleted file mode 100644
index ebde1e1aa34..00000000000
--- a/apps/web/src/components/Liquidity/PositionNFT.tsx
+++ /dev/null
@@ -1,79 +0,0 @@
-import { useRef, useState } from 'react'
-// eslint-disable-next-line @typescript-eslint/no-restricted-imports
-import styled from 'styled-components'
-
-// snapshots a src img into a canvas
-function getSnapshot(src: HTMLImageElement, canvas: HTMLCanvasElement, targetHeight: number) {
- const context = canvas.getContext('2d')
-
- if (context) {
- let { width, height } = src
-
- // src may be hidden and not have the target dimensions
- const ratio = width / height
- height = targetHeight
- width = Math.round(ratio * targetHeight)
-
- // Ensure crispness at high DPIs
- canvas.width = width * devicePixelRatio
- canvas.height = height * devicePixelRatio
- canvas.style.width = width + 'px'
- canvas.style.height = height + 'px'
- context.scale(devicePixelRatio, devicePixelRatio)
-
- context.clearRect(0, 0, width, height)
- context.drawImage(src, 0, 0, width, height)
- }
-}
-
-const NFTGrid = styled.div`
- display: grid;
- grid-template: 'overlap';
- min-height: 400px;
-`
-
-const NFTCanvas = styled.canvas`
- grid-area: overlap;
-`
-
-const NFTImage = styled.img`
- grid-area: overlap;
- height: 400px;
- /* Ensures SVG appears on top of canvas. */
- z-index: 1;
-`
-
-export function PositionNFT({ image, height: targetHeight }: { image: string; height: number }) {
- const [animate, setAnimate] = useState(false)
-
- const canvasRef = useRef(null)
- const imageRef = useRef(null)
-
- return (
- {
- setAnimate(true)
- }}
- onMouseLeave={() => {
- // snapshot the current frame so the transition to the canvas is smooth
- if (imageRef.current && canvasRef.current) {
- getSnapshot(imageRef.current, canvasRef.current, targetHeight)
- }
- setAnimate(false)
- }}
- >
-
- {
- // snapshot for the canvas
- if (imageRef.current && canvasRef.current) {
- getSnapshot(imageRef.current, canvasRef.current, targetHeight)
- }
- }}
- />
-
- )
-}
diff --git a/apps/web/src/components/Liquidity/utils.tsx b/apps/web/src/components/Liquidity/utils.tsx
index 44b94557871..2cb1c8cfcdb 100644
--- a/apps/web/src/components/Liquidity/utils.tsx
+++ b/apps/web/src/components/Liquidity/utils.tsx
@@ -6,9 +6,12 @@ import {
Token as RestToken,
} from '@uniswap/client-pools/dist/pools/v1/types_pb'
import { Currency, CurrencyAmount, Token } from '@uniswap/sdk-core'
+import { Position as V3PositionSDK } from '@uniswap/v3-sdk'
+import { usePool } from 'hooks/usePools'
import { useMemo } from 'react'
import { useAppSelector } from 'state/hooks'
import { AppTFunction } from 'ui/src/i18n/types'
+import { shortenAddress } from 'utilities/src/addresses'
export function getProtocolVersionLabel(version: ProtocolVersion): string | undefined {
switch (version) {
@@ -22,23 +25,6 @@ export function getProtocolVersionLabel(version: ProtocolVersion): string | unde
return undefined
}
-export function getProtocolVersionFromString(version?: string): ProtocolVersion {
- if (!version) {
- return ProtocolVersion.V4
- }
-
- switch (version.toLowerCase()) {
- case 'v2':
- return ProtocolVersion.V2
- case 'v3':
- return ProtocolVersion.V3
- case 'v4':
- return ProtocolVersion.V4
- }
-
- return ProtocolVersion.V4
-}
-
export function getProtocolStatusLabel(status: PositionStatus, t: AppTFunction): string | undefined {
switch (status) {
case PositionStatus.IN_RANGE:
@@ -51,10 +37,7 @@ export function getProtocolStatusLabel(status: PositionStatus, t: AppTFunction):
return undefined
}
-function parseRestToken(token?: RestToken): Token | undefined {
- if (!token) {
- return undefined
- }
+function parseRestToken(token: RestToken): Currency {
return new Token(token.chainId, token.address, token.decimals, token.symbol)
}
@@ -66,60 +49,58 @@ export type PositionInfo = {
currency1Amount: CurrencyAmount
feeTier?: string
v4hook?: string
- liquidityToken?: Token
}
export function usePositionInfo(position?: Position): PositionInfo | undefined {
// TODO(WEB-4920): remove this as the API should return the needed information - make this function a synchronous non-hook.
// Optimistically fetch the v3Pool, which should be undefined for non-v3 positions
- // const [, v3Pool] = usePool(
- // (position as any)?.v3Position?.token0 ? parseRestToken((position as any).v3Position.token0) : undefined,
- // (position as any)?.v3Position?.token1 ? parseRestToken((position as any).v3Position.token1) : undefined,
- // parseInt((position as any)?.v3Position?.feeTier),
- // )
+ const [, v3Pool] = usePool(
+ (position as any)?.v3Position?.token0 ? parseRestToken((position as any).v3Position.token0) : undefined,
+ (position as any)?.v3Position?.token1 ? parseRestToken((position as any).v3Position.token1) : undefined,
+ parseInt((position as any)?.v3Position?.feeTier),
+ )
return useMemo(() => {
- if (!position?.position) {
+ if (!position) {
return undefined
- } else if (position.position.case === 'v2Pair') {
- const v2Pair = position.position.value
- const token0 = parseRestToken(v2Pair.token0)
- const token1 = parseRestToken(v2Pair.token1)
- if (!token0 || !token1) {
+ } else if ((position as any).v2Pair) {
+ const v2Pair = (position as any).v2Pair
+ if (!v2Pair.token0 || !v2Pair.token1) {
return undefined
}
+ const token0 = parseRestToken(v2Pair.token0)
+ const token1 = parseRestToken(v2Pair.token1)
+
return {
status: position.status,
feeTier: undefined,
v4hook: undefined,
version: position.protocolVersion,
restPosition: position,
- liquidityToken: parseRestToken(v2Pair.liquidityToken),
// TODO(WEB-4920): test this with a real position and verify the decimals are correct here
currency0Amount: CurrencyAmount.fromRawAmount(token0, v2Pair.reserve0.toString()),
currency1Amount: CurrencyAmount.fromRawAmount(token1, v2Pair.reserve1.toString()),
}
- } else if (position.position.case === 'v3Position') {
- const v3Position = position.position.value
- const token0 = parseRestToken(v3Position.token0)
- const token1 = parseRestToken(v3Position.token1)
- if (!token0 || !token1) {
+ } else if ((position as any).v3Position) {
+ const v3Position = (position as any).v3Position
+ if (!v3Position.token0 || !v3Position.token1 || !v3Pool) {
return undefined
}
+ const token0 = parseRestToken(v3Position.token0)
+ const token1 = parseRestToken(v3Position.token1)
// eslint-disable-next-line @typescript-eslint/no-unused-vars
- // const v3PositionSDK = new V3PositionSDK({
- // pool: v3Pool,
- // liquidity: v3Position.liquidity,
- // tickLower: parseInt(v3Position.tickLower),
- // tickUpper: parseInt(v3Position.tickUpper),
- // })
+ const v3PositionSDK = new V3PositionSDK({
+ pool: v3Pool,
+ liquidity: v3Position.liquidity,
+ tickLower: v3Position.tickLower,
+ tickUpper: v3Position.tickUpper,
+ })
return {
status: position.status,
feeTier: v3Position.feeTier,
version: position.protocolVersion,
v4hook: undefined,
- liquidityToken: undefined,
restPosition: position,
// TODO(WEB-4920): test this with a real position and use instead of the hardcoded amounts
// currency0Amount: v3PositionSDK.amount0,
@@ -128,19 +109,19 @@ export function usePositionInfo(position?: Position): PositionInfo | undefined {
currency1Amount: CurrencyAmount.fromRawAmount(token1, '1'),
}
} else {
- const v4Position = position.position.value
- const token0 = parseRestToken(v4Position?.poolPosition?.token0)
- const token1 = parseRestToken(v4Position?.poolPosition?.token1)
- if (!token0 || !token1) {
+ const v4Position = (position as any).v4Position
+ if (!v4Position.poolPosition?.token0 || !v4Position.poolPosition?.token1) {
return undefined
}
+ const token0 = parseRestToken(v4Position.poolPosition.token0)
+ const token1 = parseRestToken(v4Position.poolPosition.token1)
+
return {
status: position.status,
feeTier: undefined,
version: position.protocolVersion,
- v4hook: v4Position?.hooks[0]?.address,
- liquidityToken: undefined,
+ v4hook: v4Position.hooks[0]?.address ? shortenAddress(v4Position.hooks[0].address) : undefined,
restPosition: position,
currency0Amount: CurrencyAmount.fromRawAmount(
token0,
@@ -152,7 +133,7 @@ export function usePositionInfo(position?: Position): PositionInfo | undefined {
),
}
}
- }, [position])
+ }, [position, v3Pool])
}
/**
diff --git a/apps/web/src/components/Logo/DoubleLogo.tsx b/apps/web/src/components/Logo/DoubleLogo.tsx
index c4200ff040e..b909a86b025 100644
--- a/apps/web/src/components/Logo/DoubleLogo.tsx
+++ b/apps/web/src/components/Logo/DoubleLogo.tsx
@@ -89,7 +89,7 @@ export const SingleLogoContainer = styled.div<{ size: number }>`
const DoubleLogoContainer = styled.div<{ size: number }>`
${logoContainerCss}
img {
- width: ${({ size }) => size / 2 - 1}px;
+ width: ${({ size }) => size / 2}px;
height: ${({ size }) => size}px;
object-fit: cover;
}
diff --git a/apps/web/src/components/NavBar/NavDropdown/NavDropdown.tsx b/apps/web/src/components/NavBar/NavDropdown/NavDropdown.tsx
index d3a028896c0..89f91ad3ce2 100644
--- a/apps/web/src/components/NavBar/NavDropdown/NavDropdown.tsx
+++ b/apps/web/src/components/NavBar/NavDropdown/NavDropdown.tsx
@@ -1,6 +1,6 @@
import { ReactNode, RefObject } from 'react'
+import { NAV_HEIGHT } from 'theme'
import { Flex, Popover, WebBottomSheet, styled, useScrollbarStyles, useShadowPropsMedium } from 'ui/src'
-import { INTERFACE_NAV_HEIGHT } from 'uniswap/src/theme/heights'
const NavDropdownContent = styled(Flex, {
borderRadius: '$rounded16',
@@ -8,17 +8,14 @@ const NavDropdownContent = styled(Flex, {
borderStyle: 'solid',
borderColor: '$surface2',
backgroundColor: '$surface1',
- maxHeight: `calc(100dvh - ${INTERFACE_NAV_HEIGHT * 2}px)`,
+ overflow: 'scroll',
+ maxHeight: `calc(100dvh - ${NAV_HEIGHT * 2}px)`,
$sm: {
width: '100%',
borderRadius: '$none',
borderWidth: 0,
shadowColor: '$transparent',
- maxHeight: `calc(100dvh - ${INTERFACE_NAV_HEIGHT}px)`,
- },
- '$platform-web': {
- overflowY: 'auto',
- overflowX: 'hidden',
+ maxHeight: `calc(100dvh - ${NAV_HEIGHT}px)`,
},
})
diff --git a/apps/web/src/components/NavBar/SearchBar/SuggestionRow.tsx b/apps/web/src/components/NavBar/SearchBar/SuggestionRow.tsx
index c268316741c..209c654a7c8 100644
--- a/apps/web/src/components/NavBar/SearchBar/SuggestionRow.tsx
+++ b/apps/web/src/components/NavBar/SearchBar/SuggestionRow.tsx
@@ -11,7 +11,7 @@ import { getTokenDetailsURL, supportedChainIdFromGQLChain } from 'graphql/data/u
import styled, { css } from 'lib/styled-components'
import { searchGenieCollectionToTokenSearchResult, searchTokenToTokenSearchResult } from 'lib/utils/searchBar'
import { GenieCollection } from 'nft/types'
-import { useCallback, useEffect, useMemo, useState } from 'react'
+import { useCallback, useEffect, useState } from 'react'
import { useDispatch } from 'react-redux'
import { Link, useNavigate } from 'react-router-dom'
import { EllipsisStyle, ThemedText } from 'theme/components'
@@ -23,7 +23,6 @@ import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send'
import { InterfaceSearchResultSelectionProperties } from 'uniswap/src/features/telemetry/types'
import { Trans, useTranslation } from 'uniswap/src/i18n'
import { UniverseChainId } from 'uniswap/src/types/chains'
-import { shortenAddress } from 'uniswap/src/utils/addresses'
import { NumberType, useFormatter } from 'utils/formatNumbers'
const PriceChangeContainer = styled.div`
@@ -50,13 +49,16 @@ const SuggestionRowStyles = css<{ $isFocused: boolean }>`
background: ${theme.surface2};
`}
`
-
const StyledLink = styled(Link)`
${SuggestionRowStyles}
`
const SkeletonSuggestionRow = styled.div`
${SuggestionRowStyles}
`
+const PrimaryContainer = styled(Column)`
+ align-items: flex-start;
+ width: 90%;
+`
const CollectionImageStyles = css`
width: 36px;
height: 36px;
@@ -145,14 +147,6 @@ export function SuggestionRow({
}
}, [toggleOpen, isHovered, suggestion, navigate, handleClick, path])
- const shortenedAddress = useMemo(() => {
- if (isToken && suggestion.address && suggestion.address !== NATIVE_CHAIN_ID) {
- return shortenAddress(suggestion.address)
- }
-
- return null
- }, [suggestion, isToken])
-
return (
isHovered && setHoveredIndex(undefined)}
data-testid={isToken ? `searchbar-token-row-${suggestion.chain}-${suggestion.address ?? NATIVE_CHAIN_ID}` : ''}
>
-
+
{isToken ? (
setBrokenCollectionImage(true)}
/>
)}
-
-
+
+
{suggestion.name}
{isToken ? : suggestion.isVerified && }
-
-
- {isToken
- ? suggestion.symbol
- : t('search.results.count', {
- count: suggestion?.stats?.total_supply ?? 0,
- })}
-
- {shortenedAddress && (
-
- {shortenedAddress}
-
- )}
-
-
+
+ {isToken
+ ? suggestion.symbol
+ : t('search.results.count', {
+ count: suggestion?.stats?.total_supply ?? 0,
+ })}
+
+
diff --git a/apps/web/src/components/NavBar/SearchBar/__snapshots__/SearchBarDropdown.test.tsx.snap b/apps/web/src/components/NavBar/SearchBar/__snapshots__/SearchBarDropdown.test.tsx.snap
index f0ff210e469..993bca0ec32 100644
--- a/apps/web/src/components/NavBar/SearchBar/__snapshots__/SearchBarDropdown.test.tsx.snap
+++ b/apps/web/src/components/NavBar/SearchBar/__snapshots__/SearchBarDropdown.test.tsx.snap
@@ -228,7 +228,7 @@ exports[`disable nft on searchbar dropdown should not render popular nft collect
+ {/* TODO: fee tier selection component. collapse if step === SET_PRICE_RANGE */}
+ {/* TODO: price range component. hide if step === SELECT_FEE_TIER */}
)
}
-
-/**
- * The page for migrating any v3 LP position to v4.
- */
-export default function MigrateV3() {
- // TODO(WEB-4920): replace this with real data fetching
- const { data } = useGetPositionsQuery()
- const position = data?.positions[1]
- const positionInfo = usePositionInfo(position)
-
- if (!position || !positionInfo) {
- // TODO(WEB-4920): handle loading/error states (including if the position is for v2)
- return null
- }
- const { currency0Amount, currency1Amount } = positionInfo
- return (
-
-
-
-
-
- )
-}
diff --git a/apps/web/src/pages/Pool/Positions/PositionPage.tsx b/apps/web/src/pages/Pool/Positions/PositionPage.tsx
deleted file mode 100644
index 86e2e2fc34b..00000000000
--- a/apps/web/src/pages/Pool/Positions/PositionPage.tsx
+++ /dev/null
@@ -1,196 +0,0 @@
-import { Price } from '@uniswap/sdk-core'
-import { BreadcrumbNavContainer, BreadcrumbNavLink } from 'components/BreadcrumbNav'
-import { LiquidityPositionAmountsTile } from 'components/Liquidity/LiquidityPositionAmountsTile'
-import { LiquidityPositionInfo } from 'components/Liquidity/LiquidityPositionInfo'
-import { LiquidityPositionPriceRangeTile } from 'components/Liquidity/LiquidityPositionPriceRangeTile'
-import { PositionNFT } from 'components/Liquidity/PositionNFT'
-import { usePositionInfo } from 'components/Liquidity/utils'
-import { LoadingFullscreen } from 'components/Loader/styled'
-import { usePositionTokenURI } from 'hooks/usePositionTokenURI'
-import { useState } from 'react'
-import { ChevronRight } from 'react-feather'
-import { Navigate, useParams } from 'react-router-dom'
-import { setOpenModal } from 'state/application/reducer'
-import { useAppDispatch } from 'state/hooks'
-import { ClickableTamaguiStyle } from 'theme/components'
-import { Flex, Main, Switch, Text, styled } from 'ui/src'
-import { useGetPositionsQuery } from 'uniswap/src/data/rest/getPositions'
-import { FeatureFlags } from 'uniswap/src/features/gating/flags'
-import { useFeatureFlagWithLoading } from 'uniswap/src/features/gating/hooks'
-import { ModalName } from 'uniswap/src/features/telemetry/constants'
-import { Trans } from 'uniswap/src/i18n'
-
-const BodyWrapper = styled(Main, {
- backgroundColor: '$surface1',
- display: 'flex',
- flexDirection: 'column',
- gap: '$spacing32',
- mx: 'auto',
- width: '100%',
- zIndex: '$default',
- p: '$spacing24',
-})
-
-// TODO: replace with Spore button once available
-export const HeaderButton = styled(Flex, {
- row: true,
- backgroundColor: '$surface2',
- borderRadius: '$rounded12',
- alignItems: 'center',
- justifyContent: 'center',
- gap: '$gap4',
- py: '$padding8',
- px: '$padding12',
- ...ClickableTamaguiStyle,
- variants: {
- emphasis: {
- primary: {
- backgroundColor: '$accent3',
- },
- secondary: {
- backgroundColor: '$surface2',
- },
- },
- } as const,
-})
-
-export default function PositionPage() {
- const { positionId } = useParams<{ positionId: string }>()
- // const { t } = useTranslation()
- // TODO(WEB-4920): replace this with real query fetching the position by ID
- const { data } = useGetPositionsQuery()
- const position = data?.positions[1]
- const positionInfo = usePositionInfo(position)
- const metadata = usePositionTokenURI(positionId ? parseInt(positionId) : undefined)
-
- const dispatch = useAppDispatch()
- const [collectAsWeth, setCollectAsWeth] = useState(false)
-
- const { value: v4Enabled, isLoading } = useFeatureFlagWithLoading(FeatureFlags.V4Everywhere)
-
- if (!isLoading && !v4Enabled) {
- return
- }
-
- if (!position || !positionInfo) {
- // TODO(WEB-4920): handle loading/error states
- return null
- }
-
- const { currency0Amount, currency1Amount, status } = positionInfo
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
- {
- dispatch(setOpenModal({ name: ModalName.AddLiquidity, initialState: position }))
- }}
- >
-
-
-
-
- {
- dispatch(setOpenModal({ name: ModalName.RemoveLiquidity, initialState: position }))
- }}
- >
-
-
-
-
-
-
-
-
-
- {'result' in metadata ? (
-
- ) : (
-
- )}
-
-
-
-
-
-
-
- {/* TODO(WEB-4920): get est. USD value of position */}
- $5678.90
-
-
-
-
-
-
-
-
- {
- // TODO(WEB-4920): open claim fees modal
- }}
- >
-
-
-
-
-
-
- $1,084.61
-
-
-
-
-
-
- {
- setCollectAsWeth((prev) => !prev)
- }}
- />
-
-
-
-
-
-
- )
-}
diff --git a/apps/web/src/pages/Pool/Positions/V2PositionPage.tsx b/apps/web/src/pages/Pool/Positions/V2PositionPage.tsx
deleted file mode 100644
index 1b77e08cea7..00000000000
--- a/apps/web/src/pages/Pool/Positions/V2PositionPage.tsx
+++ /dev/null
@@ -1,175 +0,0 @@
-import { Percent } from '@uniswap/sdk-core'
-import { BreadcrumbNavContainer, BreadcrumbNavLink } from 'components/BreadcrumbNav'
-import { LiquidityPositionInfo } from 'components/Liquidity/LiquidityPositionInfo'
-import { usePositionInfo } from 'components/Liquidity/utils'
-import { DoubleCurrencyAndChainLogo } from 'components/Logo/DoubleLogo'
-import { useTotalSupply } from 'hooks/useTotalSupply'
-import JSBI from 'jsbi'
-import { useTokenBalance } from 'lib/hooks/useCurrencyBalance'
-import { HeaderButton } from 'pages/Pool/Positions/PositionPage'
-import { ChevronRight } from 'react-feather'
-import { Navigate, useNavigate } from 'react-router-dom'
-import { setOpenModal } from 'state/application/reducer'
-import { useAppDispatch } from 'state/hooks'
-import { Flex, Main, Text, styled } from 'ui/src'
-import { useGetPositionsQuery } from 'uniswap/src/data/rest/getPositions'
-import { FeatureFlags } from 'uniswap/src/features/gating/flags'
-import { useFeatureFlagWithLoading } from 'uniswap/src/features/gating/hooks'
-import { ModalName } from 'uniswap/src/features/telemetry/constants'
-import { Trans } from 'uniswap/src/i18n'
-import { useFormatter } from 'utils/formatNumbers'
-import { useAccount } from 'wagmi'
-
-const BodyWrapper = styled(Main, {
- backgroundColor: '$surface1',
- display: 'flex',
- flexDirection: 'column',
- alignItems: 'center',
- mx: 'auto',
- width: '100%',
- zIndex: '$default',
- p: '$spacing24',
-})
-
-export default function V2PositionPage() {
- // const { currencyIdA, currencyIdB } = useParams<{ positionId: string }>()
- // TODO(WEB-4920): replace this with real query fetching the position by the params above
- const { data } = useGetPositionsQuery()
- const position = data?.positions[0]
- const positionInfo = usePositionInfo(position)
- const dispatch = useAppDispatch()
- const navigate = useNavigate()
- const account = useAccount()
- const { formatPercent } = useFormatter()
-
- const userDefaultPoolBalance = useTokenBalance(account.address, positionInfo?.liquidityToken)
- const totalPoolTokens = useTotalSupply(positionInfo?.liquidityToken)
-
- const poolTokenPercentage =
- !!userDefaultPoolBalance &&
- !!totalPoolTokens &&
- JSBI.greaterThanOrEqual(totalPoolTokens.quotient, userDefaultPoolBalance.quotient)
- ? new Percent(userDefaultPoolBalance.quotient, totalPoolTokens.quotient)
- : undefined
-
- const { value: v4Enabled, isLoading } = useFeatureFlagWithLoading(FeatureFlags.V4Everywhere)
-
- if (!isLoading && !v4Enabled) {
- return
- }
-
- if (!position || !positionInfo) {
- // TODO(WEB-4920): handle loading/error states
- return null
- }
-
- const { currency0Amount, currency1Amount } = positionInfo
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
- {
- navigate('/migrate/v2')
- }}
- >
-
-
-
-
- {
- dispatch(setOpenModal({ name: ModalName.AddLiquidity, initialState: position }))
- }}
- >
-
-
-
-
- {
- dispatch(setOpenModal({ name: ModalName.RemoveLiquidity, initialState: position }))
- }}
- >
-
-
-
-
-
-
-
-
-
-
- {/* TODO(WEB-4920): get real USD position value */}
- $1482.21
-
-
-
-
-
-
- {userDefaultPoolBalance ? userDefaultPoolBalance.toSignificant(4) : '-'}
-
-
-
-
-
-
-
-
- {currency0Amount.toSignificant(4)}
-
-
-
-
-
-
-
-
- {currency1Amount.toSignificant(4)}
-
-
-
-
-
-
-
- {formatPercent(poolTokenPercentage)}
-
-
-
-
- )
-}
diff --git a/apps/web/src/pages/Pool/Positions/create/AddHook.tsx b/apps/web/src/pages/Pool/Positions/create/AddHook.tsx
deleted file mode 100644
index 426aff323d8..00000000000
--- a/apps/web/src/pages/Pool/Positions/create/AddHook.tsx
+++ /dev/null
@@ -1,60 +0,0 @@
-import { AdvancedButton } from 'pages/Pool/Positions/create/shared'
-import { useState } from 'react'
-import { Button } from 'ui/src'
-import { DocumentList } from 'ui/src/components/icons/DocumentList'
-import { X } from 'ui/src/components/icons/X'
-import { Flex } from 'ui/src/components/layout/Flex'
-import { fonts } from 'ui/src/theme'
-import { TextInput } from 'uniswap/src/components/input/TextInput'
-import { useTranslation } from 'uniswap/src/i18n'
-
-export function AddHook() {
- const { t } = useTranslation()
-
- const [hookInputEnabled, setHookInputEnabled] = useState(false)
- const [hookAddress, setHookAddress] = useState('')
-
- const handleToggleHookInput = () => {
- setHookInputEnabled((prev) => !prev)
- setHookAddress('')
- }
-
- if (hookInputEnabled) {
- return (
-
- setHookAddress(text)}
- />
-
-
- )
- }
-
- return
-}
diff --git a/apps/web/src/pages/Pool/Positions/create/CreatePosition.tsx b/apps/web/src/pages/Pool/Positions/create/CreatePosition.tsx
deleted file mode 100644
index 5445f2a6c18..00000000000
--- a/apps/web/src/pages/Pool/Positions/create/CreatePosition.tsx
+++ /dev/null
@@ -1,242 +0,0 @@
-/* eslint-disable-next-line no-restricted-imports */
-import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb'
-import { getProtocolVersionFromString, getProtocolVersionLabel } from 'components/Liquidity/utils'
-import { PoolProgressIndicator } from 'components/PoolProgressIndicator/PoolProgressIndicator'
-import {
- DEFAULT_PRICE_RANGE_STATE,
- PriceRangeContextProvider,
- useCreatePositionContext,
- usePriceRangeContext,
-} from 'pages/Pool/Positions/create/CreatePositionContext'
-import { CreatePositionContextProvider } from 'pages/Pool/Positions/create/CreatePositionContextProvider'
-import { EditRangeSelectionStep, EditSelectTokensStep } from 'pages/Pool/Positions/create/EditStep'
-import { SelectPriceRangeStep } from 'pages/Pool/Positions/create/RangeSelectionStep'
-import { SelectTokensStep } from 'pages/Pool/Positions/create/SelectTokenStep'
-import { DEFAULT_POSITION_STATE, PositionFlowStep } from 'pages/Pool/Positions/create/types'
-import { useCallback, useMemo } from 'react'
-import { Navigate, useParams } from 'react-router-dom'
-import { Button, Flex, Text } from 'ui/src'
-import { AngleRightSmall } from 'ui/src/components/icons/AngleRightSmall'
-import { RotatableChevron } from 'ui/src/components/icons/RotatableChevron'
-import { RotateLeft } from 'ui/src/components/icons/RotateLeft'
-import { Settings } from 'ui/src/components/icons/Settings'
-import { iconSizes } from 'ui/src/theme/iconSizes'
-import { ActionSheetDropdown } from 'uniswap/src/components/dropdowns/ActionSheetDropdown'
-import { FeatureFlags } from 'uniswap/src/features/gating/flags'
-import { useFeatureFlagWithLoading } from 'uniswap/src/features/gating/hooks'
-import { Trans, useTranslation } from 'uniswap/src/i18n'
-
-function CreatePositionInner() {
- const {
- positionState: { protocolVersion },
- step,
- setStep,
- } = useCreatePositionContext()
- const v2Selected = protocolVersion === ProtocolVersion.V2
-
- const handleContinue = useCallback(() => {
- if (v2Selected) {
- setStep(PositionFlowStep.DEPOSIT)
- } else {
- setStep((prevStep) => prevStep + 1)
- }
- }, [setStep, v2Selected])
-
- return (
-
- {step === PositionFlowStep.SELECT_TOKENS_AND_FEE_TIER ? (
-
- ) : step === PositionFlowStep.PRICE_RANGE ? (
- <>
-
-
- >
- ) : (
- <>
-
- {!v2Selected && }
- >
- )}
-
- )
-}
-
-const Sidebar = () => {
- const { t } = useTranslation()
- const {
- positionState: { protocolVersion },
- step,
- } = useCreatePositionContext()
-
- const PoolProgressSteps = useMemo(() => {
- if (protocolVersion === ProtocolVersion.V2) {
- return [
- { label: t(`position.step.select`), active: step === PositionFlowStep.SELECT_TOKENS_AND_FEE_TIER },
- { label: t(`position.step.deposit`), active: step == PositionFlowStep.DEPOSIT },
- ]
- }
-
- return [
- { label: t(`position.step.select`), active: step === PositionFlowStep.SELECT_TOKENS_AND_FEE_TIER },
- { label: t(`position.step.range`), active: step === PositionFlowStep.PRICE_RANGE },
- { label: t(`position.step.deposit`), active: step == PositionFlowStep.DEPOSIT },
- ]
- }, [protocolVersion, step, t])
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- )
-}
-
-const Toolbar = () => {
- const {
- positionState: { protocolVersion },
- setPositionState,
- setStep,
- } = useCreatePositionContext()
- const { setPriceRangeState } = usePriceRangeContext()
-
- const handleReset = useCallback(() => {
- setPositionState(DEFAULT_POSITION_STATE)
- setPriceRangeState(DEFAULT_PRICE_RANGE_STATE)
- setStep(PositionFlowStep.SELECT_TOKENS_AND_FEE_TIER)
- }, [setPositionState, setPriceRangeState, setStep])
-
- const handleVersionChange = useCallback(
- (version: ProtocolVersion) => {
- setPositionState(() => ({
- ...DEFAULT_POSITION_STATE,
- protocolVersion: version,
- }))
- setPriceRangeState(DEFAULT_PRICE_RANGE_STATE)
- setStep(PositionFlowStep.SELECT_TOKENS_AND_FEE_TIER)
- },
- [setPositionState, setPriceRangeState, setStep],
- )
-
- const versionOptions = useMemo(
- () =>
- [ProtocolVersion.V2, ProtocolVersion.V3, ProtocolVersion.V4]
- .filter((version) => version != protocolVersion)
- .map((version) => ({
- key: `version-${version}`,
- onPress: () => handleVersionChange(version),
- render: () => (
-
-
-
-
-
- ),
- })),
- [handleVersionChange, protocolVersion],
- )
-
- return (
-
-
-
-
-
-
-
- )
-}
-
-export function CreatePosition() {
- const { value: v4Enabled, isLoading } = useFeatureFlagWithLoading(FeatureFlags.V4Everywhere)
- const { protocolVersion } = useParams<{ protocolVersion: string }>()
-
- if (!isLoading && !v4Enabled) {
- return
- }
-
- if (isLoading) {
- return null
- }
- return (
-
-
-
-
-
-
-
-
-
-
-
- )
-}
diff --git a/apps/web/src/pages/Pool/Positions/create/CreatePositionContext.tsx b/apps/web/src/pages/Pool/Positions/create/CreatePositionContext.tsx
deleted file mode 100644
index 45a3d9a681f..00000000000
--- a/apps/web/src/pages/Pool/Positions/create/CreatePositionContext.tsx
+++ /dev/null
@@ -1,49 +0,0 @@
-/* eslint-disable-next-line no-restricted-imports */
-import {
- CreatePositionContextType,
- DEFAULT_POSITION_STATE,
- PositionFlowStep,
- PriceRangeContextType,
- PriceRangeState,
-} from 'pages/Pool/Positions/create/types'
-import React, { useContext, useState } from 'react'
-
-export const CreatePositionContext = React.createContext({
- step: PositionFlowStep.SELECT_TOKENS_AND_FEE_TIER,
- setStep: () => undefined,
- positionState: DEFAULT_POSITION_STATE,
- setPositionState: () => undefined,
- feeTierSearchModalOpen: false,
- setFeeTierSearchModalOpen: () => undefined,
- derivedPositionInfo: {
- pool: undefined,
- },
-})
-
-export const useCreatePositionContext = () => {
- return useContext(CreatePositionContext)
-}
-
-export const DEFAULT_PRICE_RANGE_STATE: PriceRangeState = {
- priceInverted: false,
- fullRange: true,
- minPrice: '0',
- maxPrice: 'INF',
-}
-
-const PriceRangeContext = React.createContext({
- priceRangeState: DEFAULT_PRICE_RANGE_STATE,
- setPriceRangeState: () => undefined,
-})
-
-export const usePriceRangeContext = () => {
- return useContext(PriceRangeContext)
-}
-
-export function PriceRangeContextProvider({ children }: { children: React.ReactNode }) {
- const [priceRangeState, setPriceRangeState] = useState(DEFAULT_PRICE_RANGE_STATE)
-
- return (
- {children}
- )
-}
diff --git a/apps/web/src/pages/Pool/Positions/create/CreatePositionContextProvider.tsx b/apps/web/src/pages/Pool/Positions/create/CreatePositionContextProvider.tsx
deleted file mode 100644
index c0248087865..00000000000
--- a/apps/web/src/pages/Pool/Positions/create/CreatePositionContextProvider.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import { FeeTierSearchModal } from 'components/Liquidity/FeeTierSearchModal'
-import { CreatePositionContext } from 'pages/Pool/Positions/create/CreatePositionContext'
-import { useDerivedPositionInfo } from 'pages/Pool/Positions/create/hooks'
-import { DEFAULT_POSITION_STATE, PositionFlowStep, PositionState } from 'pages/Pool/Positions/create/types'
-import { useState } from 'react'
-
-export function CreatePositionContextProvider({
- children,
- initialState = {},
-}: {
- children: React.ReactNode
- initialState?: Partial
-}) {
- const [positionState, setPositionState] = useState({ ...DEFAULT_POSITION_STATE, ...initialState })
- const [step, setStep] = useState(PositionFlowStep.SELECT_TOKENS_AND_FEE_TIER)
- const derivedPositionInfo = useDerivedPositionInfo(positionState)
- const [feeTierSearchModalOpen, setFeeTierSearchModalOpen] = useState(false)
-
- return (
-
- {children}
-
-
- )
-}
diff --git a/apps/web/src/pages/Pool/Positions/create/EditStep.tsx b/apps/web/src/pages/Pool/Positions/create/EditStep.tsx
deleted file mode 100644
index 604f1efab00..00000000000
--- a/apps/web/src/pages/Pool/Positions/create/EditStep.tsx
+++ /dev/null
@@ -1,93 +0,0 @@
-import { DoubleCurrencyLogo } from 'components/Logo/DoubleLogo'
-import { useCreatePositionContext, usePriceRangeContext } from 'pages/Pool/Positions/create/CreatePositionContext'
-import { Container } from 'pages/Pool/Positions/create/shared'
-import { PositionFlowStep } from 'pages/Pool/Positions/create/types'
-import { useCallback } from 'react'
-import { Button, Flex, FlexProps, Text } from 'ui/src'
-import { Edit } from 'ui/src/components/icons/Edit'
-import { iconSizes } from 'ui/src/theme'
-import { Trans } from 'uniswap/src/i18n'
-
-const EditStep = ({ children, onClick, ...rest }: { children: JSX.Element; onClick: () => void } & FlexProps) => {
- return (
-
- {children}
-
-
- )
-}
-
-export const EditSelectTokensStep = (props?: FlexProps) => {
- const {
- positionState: {
- tokenInputs: { TOKEN0: token0, TOKEN1: token1 },
- },
- setStep,
- } = useCreatePositionContext()
- const currencies = [token0, token1]
-
- const handleEdit = useCallback(() => {
- setStep(PositionFlowStep.SELECT_TOKENS_AND_FEE_TIER)
- }, [setStep])
-
- return (
-
-
-
-
- {token0?.symbol}
- /
- {token1?.symbol}
-
-
-
- )
-}
-
-export const EditRangeSelectionStep = (props?: FlexProps) => {
- const {
- positionState: {
- tokenInputs: { TOKEN0: token0, TOKEN1: token1 },
- },
- setStep,
- } = useCreatePositionContext()
- const {
- priceRangeState: { priceInverted },
- } = usePriceRangeContext()
-
- const baseCurrency = priceInverted ? token1 : token0
- const quoteCurrency = priceInverted ? token0 : token1
-
- const handleEdit = useCallback(() => {
- setStep(PositionFlowStep.PRICE_RANGE)
- }, [setStep])
-
- return (
-
-
-
-
-
-
-
-
-
-
- {`283,923,000 ${baseCurrency?.symbol + '/' + quoteCurrency?.symbol}`}
-
-
-
-
-
- {`481,848,481 ${baseCurrency?.symbol + '/' + quoteCurrency?.symbol}`}
-
-
-
-
- )
-}
diff --git a/apps/web/src/pages/Pool/Positions/create/RangeSelectionStep.tsx b/apps/web/src/pages/Pool/Positions/create/RangeSelectionStep.tsx
deleted file mode 100644
index eda93cab403..00000000000
--- a/apps/web/src/pages/Pool/Positions/create/RangeSelectionStep.tsx
+++ /dev/null
@@ -1,234 +0,0 @@
-import { useCreatePositionContext, usePriceRangeContext } from 'pages/Pool/Positions/create/CreatePositionContext'
-import { Container } from 'pages/Pool/Positions/create/shared'
-import { useCallback, useMemo } from 'react'
-import { Minus, Plus } from 'react-feather'
-import { Button, Flex, FlexProps, SegmentedControl, Text, useSporeColors } from 'ui/src'
-import { SwapActionButton } from 'ui/src/components/icons/SwapActionButton'
-import { fonts } from 'ui/src/theme'
-import { AmountInput } from 'uniswap/src/components/CurrencyInputPanel/AmountInput'
-import { Trans, useTranslation } from 'uniswap/src/i18n'
-
-enum RangeSelectionInput {
- MIN,
- MAX,
-}
-
-enum RangeSelection {
- FULL = 'FULL',
- CUSTOM = 'CUSTOM',
-}
-
-function RangeControl({ value, active }: { value: string; active: boolean }) {
- return (
-
- {value}
-
- )
-}
-
-function RangeInput({ input }: { input: RangeSelectionInput }) {
- const colors = useSporeColors()
- const { t } = useTranslation()
-
- const {
- positionState: {
- tokenInputs: { TOKEN0: token0, TOKEN1: token1 },
- },
- } = useCreatePositionContext()
- const {
- priceRangeState: { minPrice, maxPrice, priceInverted },
- setPriceRangeState,
- } = usePriceRangeContext()
-
- const baseCurrency = priceInverted ? token1 : token0
- const quoteCurrency = priceInverted ? token0 : token1
-
- const handlePriceRangeInput = useCallback(
- (input: RangeSelectionInput, value: string) => {
- if (input === RangeSelectionInput.MIN) {
- setPriceRangeState((prev) => ({ ...prev, minPrice: value }))
- } else {
- setPriceRangeState((prev) => ({ ...prev, maxPrice: value }))
- }
- },
- [setPriceRangeState],
- )
-
- return (
-
-
-
- {input === RangeSelectionInput.MIN ? t(`pool.minPrice`) : t(`pool.maxPrice`)}
-
- handlePriceRangeInput(input, text)}
- />
-
-
-
-
-
-
-
-
-
- )
-}
-
-export const SelectPriceRangeStep = ({ onContinue, ...rest }: { onContinue: () => void } & FlexProps) => {
- const { t } = useTranslation()
-
- const {
- positionState: {
- tokenInputs: { TOKEN0: token0, TOKEN1: token1 },
- },
- } = useCreatePositionContext()
- const {
- priceRangeState: { priceInverted, fullRange },
- setPriceRangeState,
- } = usePriceRangeContext()
-
- const baseCurrency = priceInverted ? token1 : token0
- const quoteCurrency = priceInverted ? token0 : token1
-
- const controlOptions = useMemo(() => {
- return [{ value: token0?.symbol ?? '' }, { value: token1?.symbol ?? '' }]
- }, [token0?.symbol, token1?.symbol])
-
- const handleSelectToken = useCallback(
- (option: string) => {
- if (option === token0?.symbol) {
- setPriceRangeState((prevState) => ({ ...prevState, priceInverted: false }))
- } else {
- setPriceRangeState((prevState) => ({ ...prevState, priceInverted: true }))
- }
- },
- [token0?.symbol, setPriceRangeState],
- )
-
- const handleSelectRange = useCallback(
- (option: RangeSelection) => {
- if (option === RangeSelection.FULL) {
- setPriceRangeState((prevState) => ({ ...prevState, fullRange: true }))
- } else {
- setPriceRangeState((prevState) => ({ ...prevState, fullRange: false }))
- }
- },
- [setPriceRangeState],
- )
-
- const segmentedControlRangeOptions = [
- { display: , value: RangeSelection.FULL },
- { display: , value: RangeSelection.CUSTOM },
- ]
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- )
-}
diff --git a/apps/web/src/pages/Pool/Positions/create/SelectTokenStep.tsx b/apps/web/src/pages/Pool/Positions/create/SelectTokenStep.tsx
deleted file mode 100644
index fce536207e6..00000000000
--- a/apps/web/src/pages/Pool/Positions/create/SelectTokenStep.tsx
+++ /dev/null
@@ -1,301 +0,0 @@
-// eslint-disable-next-line no-restricted-imports
-import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb'
-import { Currency, Percent } from '@uniswap/sdk-core'
-import { FeeAmount } from '@uniswap/v3-sdk'
-import { PositionInfoBadge } from 'components/Liquidity/LiquidityPositionInfoBadges'
-import { DoubleCurrencyAndChainLogo } from 'components/Logo/DoubleLogo'
-import CurrencySearchModal from 'components/SearchModal/CurrencySearchModal'
-import { useCurrencyInfo } from 'hooks/Tokens'
-import { AddHook } from 'pages/Pool/Positions/create/AddHook'
-import { useCreatePositionContext } from 'pages/Pool/Positions/create/CreatePositionContext'
-import { AdvancedButton, Container } from 'pages/Pool/Positions/create/shared'
-import { useCallback, useReducer, useState } from 'react'
-import { TamaguiClickableStyle } from 'theme/components'
-import { PositionField } from 'types/position'
-import { Button, Flex, FlexProps, Text, styled } from 'ui/src'
-import { CheckCircleFilled } from 'ui/src/components/icons/CheckCircleFilled'
-import { Dollar } from 'ui/src/components/icons/Dollar'
-import { RotatableChevron } from 'ui/src/components/icons/RotatableChevron'
-import { iconSizes } from 'ui/src/theme'
-import { TokenLogo } from 'uniswap/src/components/CurrencyLogo/TokenLogo'
-import { Trans, useTranslation } from 'uniswap/src/i18n'
-import { useFormatter } from 'utils/formatNumbers'
-
-const CurrencySelector = ({ currency, onPress }: { currency?: Currency; onPress: () => void }) => {
- const { t } = useTranslation()
- // TODO: remove when backend returns token logos in graphql response: WEB-4920
- const currencyInfo = useCurrencyInfo(currency)
-
- return (
-
- )
-}
-
-interface FeeTier {
- value: number
- title: string
- selectionPercent: number
-}
-
-const FeeTierContainer = styled(Flex, {
- flex: 1,
- width: '100%',
- p: '$spacing12',
- gap: '$spacing8',
- justifyContent: 'space-between',
- borderRadius: '$rounded12',
- borderWidth: 1,
- borderColor: '$surface3',
- ...TamaguiClickableStyle,
-})
-
-const FeeTier = ({
- feeTier,
- selected,
- onSelect,
-}: {
- feeTier: FeeTier
- selected: boolean
- onSelect: (value: number) => void
-}) => {
- return (
- onSelect(feeTier.value)} background={selected ? '$surface3' : '$surface1'}>
-
- {feeTier.value / 10000}%
- {selected && }
-
- {feeTier.title}
-
- {feeTier.selectionPercent}% select
-
-
- )
-}
-
-export function SelectTokensStep({
- onContinue,
- tokensLocked,
- ...rest
-}: { tokensLocked?: boolean; onContinue: () => void } & FlexProps) {
- const { formatPercent } = useFormatter()
- const { t } = useTranslation()
-
- const {
- positionState: {
- tokenInputs: { TOKEN0: token0, TOKEN1: token1 },
- fee,
- protocolVersion,
- },
- setPositionState,
- derivedPositionInfo,
- setFeeTierSearchModalOpen,
- } = useCreatePositionContext()
-
- const [currencySearchInputState, setCurrencySearchInputState] = useState(undefined)
- const [isShowMoreFeeTiersEnabled, toggleShowMoreFeeTiersEnabled] = useReducer((state) => !state, false)
- const continueButtonEnabled = !!derivedPositionInfo.pool
-
- const handleCurrencySelect = useCallback(
- (currency: Currency) => {
- switch (currencySearchInputState) {
- case PositionField.TOKEN0:
- case PositionField.TOKEN1:
- setPositionState((prevState) => ({
- ...prevState,
- tokenInputs: { ...prevState.tokenInputs, [currencySearchInputState]: currency },
- }))
- break
- default:
- break
- }
- },
- [currencySearchInputState, setPositionState],
- )
-
- const handleFeeTierSelect = useCallback(
- (feeTier: number) => {
- setPositionState((prevState) => ({ ...prevState, fee: feeTier }))
- },
- [setPositionState],
- )
-
- const feeTiers = [
- { value: FeeAmount.LOWEST, title: t(`fee.bestForVeryStable`), selectionPercent: 0 },
- { value: FeeAmount.LOW, title: t(`fee.bestForStablePairs`), selectionPercent: 0 },
- { value: FeeAmount.MEDIUM, title: t(`fee.bestForMost`), selectionPercent: 96 },
- { value: FeeAmount.HIGH, title: t(`fee.bestForExotic`), selectionPercent: 4 },
- ]
-
- return (
- <>
-
-
-
-
- {tokensLocked ? t('pool.tokenPair') : t('pool.selectPair')}
-
- {tokensLocked ? t('position.migrate.liquidity') : t('position.provide.liquidity')}
-
-
- {tokensLocked && token0 && token1 ? (
-
-
-
-
- {token0.symbol} / {token1.symbol}
-
-
-
- ) : (
-
- setCurrencySearchInputState(PositionField.TOKEN0)} />
- setCurrencySearchInputState(PositionField.TOKEN1)} />
-
- )}
- {protocolVersion === ProtocolVersion.V4 && }
-
-
-
-
-
-
-
-
- {protocolVersion === ProtocolVersion.V2 ? t('fee.tier.description.v2') : t('fee.tier.description')}
-
-
-
- {protocolVersion !== ProtocolVersion.V2 && (
-
-
-
-
-
-
-
-
-
-
-
- {fee === FeeAmount.MEDIUM ? (
-
-
-
- ) : feeTiers.find((tier) => tier.value === fee) ? null : (
-
-
-
- )}
-
-
-
- {isShowMoreFeeTiersEnabled && (
-
- {feeTiers.map((feeTier) => (
-
- ))}
-
- )}
- {protocolVersion === ProtocolVersion.V4 && (
- {
- setFeeTierSearchModalOpen(true)
- }}
- />
- )}
-
- )}
-
-
-
- setCurrencySearchInputState(undefined)}
- onCurrencySelect={handleCurrencySelect}
- />
- >
- )
-}
diff --git a/apps/web/src/pages/Pool/Positions/create/hooks.tsx b/apps/web/src/pages/Pool/Positions/create/hooks.tsx
deleted file mode 100644
index c03b3d33ebb..00000000000
--- a/apps/web/src/pages/Pool/Positions/create/hooks.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import { useAccount } from 'hooks/useAccount'
-import { PositionInfo, PositionState } from 'pages/Pool/Positions/create/types'
-import { useMemo } from 'react'
-import { useGetPoolsByTokens } from 'uniswap/src/data/rest/getPools'
-import { UniverseChainId } from 'uniswap/src/types/chains'
-
-export function useDerivedPositionInfo(state: PositionState): PositionInfo {
- const { chainId } = useAccount()
- const tokens = [
- state.tokenInputs.TOKEN0?.isNative ? state.tokenInputs.TOKEN0.wrapped : state.tokenInputs.TOKEN0,
- state.tokenInputs.TOKEN1?.isNative ? state.tokenInputs.TOKEN1.wrapped : state.tokenInputs.TOKEN1,
- ]
- const sortedTokens = tokens.sort((a, b) => (!b ? -1 : a?.sortsBefore(b) ? -1 : 1))
- const { data } = useGetPoolsByTokens({
- fee: state.fee,
- chainId: chainId ?? (UniverseChainId.Mainnet as number),
- protocolVersions: [state.protocolVersion],
- token0: sortedTokens[0]?.address,
- token1: sortedTokens[1]?.address,
- })
-
- return useMemo(
- () => ({
- pool: data?.pools?.[0],
- }),
- [data?.pools],
- )
-}
diff --git a/apps/web/src/pages/Pool/Positions/create/shared.tsx b/apps/web/src/pages/Pool/Positions/create/shared.tsx
deleted file mode 100644
index a2ef7a86030..00000000000
--- a/apps/web/src/pages/Pool/Positions/create/shared.tsx
+++ /dev/null
@@ -1,50 +0,0 @@
-import { Flex, GeneratedIcon, Text, styled } from 'ui/src'
-import { InfoCircleFilled } from 'ui/src/components/icons/InfoCircleFilled'
-import { iconSizes } from 'ui/src/theme'
-import { useTranslation } from 'uniswap/src/i18n'
-
-export const Container = styled(Flex, {
- gap: 32,
- p: '$spacing24',
- borderRadius: '$rounded20',
- borderWidth: '$spacing1',
- borderColor: '$surface3',
- maxWidth: 580,
- overflow: 'hidden',
-})
-
-export function AdvancedButton({
- title,
- tooltip = true,
- Icon,
- onPress,
-}: {
- title: string
- tooltip?: boolean
- Icon: GeneratedIcon
- onPress: () => void
-}) {
- const { t } = useTranslation()
- return (
-
-
-
-
- {title}
-
-
-
- ({t('common.advanced')})
-
- {/* TODO(WEB-4920): implement tooltip text here */}
- {tooltip && }
-
- )
-}
diff --git a/apps/web/src/pages/Pool/Positions/create/types.ts b/apps/web/src/pages/Pool/Positions/create/types.ts
deleted file mode 100644
index f38fc022522..00000000000
--- a/apps/web/src/pages/Pool/Positions/create/types.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-// eslint-disable-next-line no-restricted-imports
-import { Pool, ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb'
-import { Currency } from '@uniswap/sdk-core'
-import { Dispatch, SetStateAction } from 'react'
-import { PositionField } from 'types/position'
-
-export enum PositionFlowStep {
- SELECT_TOKENS_AND_FEE_TIER,
- PRICE_RANGE,
- DEPOSIT,
-}
-
-export interface PositionState {
- protocolVersion: ProtocolVersion
- tokenInputs: { [field in PositionField]?: Currency }
- fee: number
- hook?: string
-}
-
-export const DEFAULT_POSITION_STATE: PositionState = {
- tokenInputs: {},
- fee: 3000,
- hook: undefined,
- protocolVersion: ProtocolVersion.UNSPECIFIED,
-}
-
-export interface PositionInfo {
- pool?: Pool
-}
-
-export type CreatePositionContextType = {
- step: PositionFlowStep
- setStep: Dispatch>
- positionState: PositionState
- setPositionState: Dispatch>
- derivedPositionInfo: PositionInfo
- feeTierSearchModalOpen: boolean
- setFeeTierSearchModalOpen: Dispatch>
-}
-
-export interface PriceRangeState {
- priceInverted: boolean
- fullRange: boolean
- minPrice: string
- maxPrice: string
-}
-
-export type PriceRangeContextType = {
- priceRangeState: PriceRangeState
- setPriceRangeState: Dispatch>
-}
diff --git a/apps/web/src/pages/Pool/Positions/index.tsx b/apps/web/src/pages/Pool/Positions/index.tsx
index c3f2e4a3d21..a0fb4f53251 100644
--- a/apps/web/src/pages/Pool/Positions/index.tsx
+++ b/apps/web/src/pages/Pool/Positions/index.tsx
@@ -1,15 +1,13 @@
/* eslint-disable-next-line no-restricted-imports */
-import { Position, PositionStatus, ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb'
+import { PositionStatus, ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb'
import { LiquidityPositionCard } from 'components/Liquidity/LiquidityPositionCard'
import { useAccount } from 'hooks/useAccount'
import { PositionsHeader } from 'pages/Pool/Positions/PositionsHeader'
-import { useCallback, useState } from 'react'
-import { useNavigate } from 'react-router-dom'
+import { useState } from 'react'
import { ClickableTamaguiStyle } from 'theme/components'
import { Flex } from 'ui/src'
import { useGetPositionsQuery } from 'uniswap/src/data/rest/getPositions'
import { UniverseChainId } from 'uniswap/src/types/chains'
-import { logger } from 'utilities/src/logger/logger'
export default function Positions() {
const [chainFilter, setChainFilter] = useState(null)
@@ -24,31 +22,16 @@ export default function Positions() {
PositionStatus.CLOSED,
])
- const navigate = useNavigate()
const account = useAccount()
const { address } = account
const { data } = useGetPositionsQuery({
+ chainIds: chainFilter ? [chainFilter] : undefined,
+ protocolVersions: versionFilter,
+ positionStatuses: statusFilter,
address,
})
- const onNavigateToPosition = useCallback(
- (position: Position) => {
- if (position.position.case === 'v2Pair' && position.position.value.token0 && position.position.value.token1) {
- navigate(`/positions/v2/${position.position.value.token0.address}/${position.position.value.token1.address}`)
- } else if (position.position.case === 'v3Position') {
- navigate(`/positions/v3/${position.position.value.tokenId}`)
- } else if (position.position.case === 'v4Position') {
- navigate(`/positions/v4/${position.position.value.poolPosition?.tokenId}`)
- } else {
- logger.error('Invalid position', {
- tags: { file: 'Positions/index.tsx', function: 'onPress' },
- })
- }
- },
- [navigate],
- )
-
// TODO(WEB-4920): implement pagination w/ max 8 positions per page.
return (
@@ -82,7 +65,9 @@ export default function Positions() {
key={index}
liquidityPosition={position}
{...ClickableTamaguiStyle}
- onPress={() => onNavigateToPosition(position)}
+ onPress={() => {
+ // TODO(WEB-4920): navigate to the PosDP for this position
+ }}
/>
)
})}
diff --git a/apps/web/src/pages/RemoveLiquidity/index.tsx b/apps/web/src/pages/RemoveLiquidity/index.tsx
index f1f91aeec0e..72a51b10496 100644
--- a/apps/web/src/pages/RemoveLiquidity/index.tsx
+++ b/apps/web/src/pages/RemoveLiquidity/index.tsx
@@ -15,7 +15,6 @@ import { BlueCard, LightCard } from 'components/Card/cards'
import CurrencyInputPanel from 'components/CurrencyInputPanel'
import CurrencyLogo from 'components/Logo/CurrencyLogo'
import { DoubleCurrencyLogo } from 'components/Logo/DoubleLogo'
-import { ConnectWalletButtonText } from 'components/NavBar/accountCTAsExperimentUtils'
import { AddRemoveTabs } from 'components/NavigationTabs'
import { MinimalPositionCard } from 'components/PositionCard'
import Slider from 'components/Slider'
@@ -49,6 +48,8 @@ import { useUserSlippageToleranceWithDefault } from 'state/user/hooks'
import { StyledInternalLink, ThemedText } from 'theme/components'
import { Text } from 'ui/src'
import { WRAPPED_NATIVE_CURRENCY } from 'uniswap/src/constants/tokens'
+import { AccountCTAsExperimentGroup, Experiments } from 'uniswap/src/features/gating/experiments'
+import { useExperimentGroupName } from 'uniswap/src/features/gating/hooks'
import Trace from 'uniswap/src/features/telemetry/Trace'
import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send'
import { Trans } from 'uniswap/src/i18n'
@@ -502,6 +503,10 @@ function RemoveLiquidity() {
liquidityPercentChangeCallback,
)
+ const accountsCTAExperimentGroup = useExperimentGroupName(Experiments.AccountCTAs)
+ const isSignIn = accountsCTAExperimentGroup === AccountCTAsExperimentGroup.SignInSignUp
+ const isLogIn = accountsCTAExperimentGroup === AccountCTAsExperimentGroup.LogInCreateAccount
+
if (!networkSupportsV2) {
return
}
@@ -710,7 +715,13 @@ function RemoveLiquidity() {
element={InterfaceElementName.CONNECT_WALLET_BUTTON}
>
-
+ {isSignIn ? (
+
+ ) : isLogIn ? (
+
+ ) : (
+
+ )}
) : (
diff --git a/apps/web/src/pages/RouteDefinitions.tsx b/apps/web/src/pages/RouteDefinitions.tsx
index 43eeb2f5dd2..0b11a79b5da 100644
--- a/apps/web/src/pages/RouteDefinitions.tsx
+++ b/apps/web/src/pages/RouteDefinitions.tsx
@@ -8,7 +8,7 @@ import { t } from 'uniswap/src/i18n'
import { isBrowserRouterEnabled } from 'utils/env'
// High-traffic pages (index and /swap) should not be lazy-loaded.
import Landing from 'pages/Landing'
-import { CreatePosition } from 'pages/Pool/Positions/create/CreatePosition'
+import { NewPosition } from 'pages/LegacyPool/NewPosition'
import Swap from 'pages/Swap'
const NftExplore = lazy(() => import('nft/pages/explore'))
@@ -25,8 +25,6 @@ const NotFound = lazy(() => import('pages/NotFound'))
const Pool = lazy(() => import('pages/Pool'))
const LegacyPool = lazy(() => import('pages/LegacyPool'))
const LegacyPositionPage = lazy(() => import('pages/LegacyPool/PositionPage'))
-const PositionPage = lazy(() => import('pages/Pool/Positions/PositionPage'))
-const V2PositionPage = lazy(() => import('pages/Pool/Positions/V2PositionPage'))
const LegacyPoolV2 = lazy(() => import('pages/LegacyPool/v2'))
const PoolDetails = lazy(() => import('pages/PoolDetails'))
const PoolFinder = lazy(() => import('pages/PoolFinder'))
@@ -204,14 +202,8 @@ export const routes: RouteDefinition[] = [
}),
// Refreshed pool routes
createRouteDefinition({
- path: '/positions/create',
- getElement: () => ,
- getTitle: getPositionPageTitle,
- getDescription: getPositionPageDescription,
- }),
- createRouteDefinition({
- path: '/positions/create/:protocolVersion',
- getElement: () => ,
+ path: '/positions/new',
+ getElement: () => ,
getTitle: getPositionPageTitle,
getDescription: getPositionPageDescription,
}),
@@ -221,24 +213,6 @@ export const routes: RouteDefinition[] = [
getTitle: getPositionPageTitle,
getDescription: getPositionPageDescription,
}),
- createRouteDefinition({
- path: '/positions/v2/:currencyIdA/:currencyIdB',
- getElement: () => ,
- getTitle: getPositionPageTitle,
- getDescription: getPositionPageDescription,
- }),
- createRouteDefinition({
- path: '/positions/v3/:tokenId',
- getElement: () => ,
- getTitle: getPositionPageTitle,
- getDescription: getPositionPageDescription,
- }),
- createRouteDefinition({
- path: '/positions/v4/:tokenId',
- getElement: () => ,
- getTitle: getPositionPageTitle,
- getDescription: getPositionPageDescription,
- }),
createRouteDefinition({
path: '/migrate/v3/:positionId', // Position token ID (v3)
getElement: () => ,
diff --git a/apps/web/src/pages/Swap/Buy/BuyFormButton.tsx b/apps/web/src/pages/Swap/Buy/BuyFormButton.tsx
index 02a3140b983..a28788d2860 100644
--- a/apps/web/src/pages/Swap/Buy/BuyFormButton.tsx
+++ b/apps/web/src/pages/Swap/Buy/BuyFormButton.tsx
@@ -1,10 +1,11 @@
import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks'
import { ButtonLight } from 'components/Button/buttons'
-import { ConnectWalletButtonText } from 'components/NavBar/accountCTAsExperimentUtils'
import { useBuyFormContext } from 'pages/Swap/Buy/BuyFormContext'
import { Button, Flex, SpinningLoader, Text, WidthAnimator } from 'ui/src'
import { iconSizes } from 'ui/src/theme'
-import { useTranslation } from 'uniswap/src/i18n'
+import { AccountCTAsExperimentGroup, Experiments } from 'uniswap/src/features/gating/experiments'
+import { useExperimentGroupName } from 'uniswap/src/features/gating/hooks'
+import { Trans, useTranslation } from 'uniswap/src/i18n'
import { useAccount } from 'wagmi'
interface BuyFormButtonProps {
@@ -20,10 +21,20 @@ export function BuyFormButton({ forceDisabled }: BuyFormButtonProps) {
const { inputAmount } = buyFormState
const { notAvailableInThisRegion, quotes, fetchingQuotes, error } = derivedBuyFormInfo
+ const accountsCTAExperimentGroup = useExperimentGroupName(Experiments.AccountCTAs)
+ const isSignIn = accountsCTAExperimentGroup === AccountCTAsExperimentGroup.SignInSignUp
+ const isLogIn = accountsCTAExperimentGroup === AccountCTAsExperimentGroup.LogInCreateAccount
+
if (!account.isConnected) {
return (
-
+ {isSignIn ? (
+
+ ) : isLogIn ? (
+
+ ) : (
+
+ )}
)
}
diff --git a/apps/web/src/pages/Swap/Buy/CountryListModal.tsx b/apps/web/src/pages/Swap/Buy/CountryListModal.tsx
index c43160e22d3..6401f678ef6 100644
--- a/apps/web/src/pages/Swap/Buy/CountryListModal.tsx
+++ b/apps/web/src/pages/Swap/Buy/CountryListModal.tsx
@@ -5,12 +5,12 @@ import { ContentWrapper } from 'pages/Swap/Buy/shared'
import { ChangeEvent, useCallback, useMemo, useRef, useState } from 'react'
import AutoSizer from 'react-virtualized-auto-sizer'
import { FixedSizeList } from 'react-window'
+import { NAV_HEIGHT } from 'theme'
import { CloseIcon } from 'theme/components'
import { AdaptiveWebModal, Flex, styled } from 'ui/src'
import { Text } from 'ui/src/components/text/Text'
import { FORCountry } from 'uniswap/src/features/fiatOnRamp/types'
import { useTranslation } from 'uniswap/src/i18n'
-import { INTERFACE_NAV_HEIGHT } from 'uniswap/src/theme/heights'
import { bubbleToTop } from 'utilities/src/primitives/array'
const ROW_ITEM_SIZE = 56
@@ -67,7 +67,7 @@ export function CountryListModal({
flex={1}
onClose={closeModal}
maxHeight={700}
- $sm={{ height: `calc(100dvh - ${INTERFACE_NAV_HEIGHT}px)` }}
+ $sm={{ height: `calc(100dvh - ${NAV_HEIGHT}px)` }}
>
diff --git a/apps/web/src/pages/Swap/Buy/__snapshots__/PredefinedAmount.test.tsx.snap b/apps/web/src/pages/Swap/Buy/__snapshots__/PredefinedAmount.test.tsx.snap
index ae19017a0d8..d5abc5106c7 100644
--- a/apps/web/src/pages/Swap/Buy/__snapshots__/PredefinedAmount.test.tsx.snap
+++ b/apps/web/src/pages/Swap/Buy/__snapshots__/PredefinedAmount.test.tsx.snap
@@ -69,7 +69,7 @@ exports[`PredefinedAmount renders correctly with amount= 300 , currentAmount= "1
$300
@@ -148,7 +148,7 @@ exports[`PredefinedAmount renders correctly with amount= 1000 , currentAmount= "
$1000
diff --git a/apps/web/src/pages/Swap/Limit/LimitExpirySection.tsx b/apps/web/src/pages/Swap/Limit/LimitExpirySection.tsx
index d701f65c822..b055200e1ab 100644
--- a/apps/web/src/pages/Swap/Limit/LimitExpirySection.tsx
+++ b/apps/web/src/pages/Swap/Limit/LimitExpirySection.tsx
@@ -29,8 +29,7 @@ const LimitExpiryButton = styled.button<{ $selected: boolean }>`
const EXPIRY_OPTIONS = [LimitsExpiry.Day, LimitsExpiry.Week, LimitsExpiry.Month, LimitsExpiry.Year]
-// eslint-disable-next-line consistent-return
-function getExpiryLabelText(expiry: LimitsExpiry): string {
+function getExpiryLabelText(expiry: LimitsExpiry) {
switch (expiry) {
case LimitsExpiry.Day:
return t('common.oneDay')
diff --git a/apps/web/src/pages/Swap/Limit/LimitForm.tsx b/apps/web/src/pages/Swap/Limit/LimitForm.tsx
index c3a7fc40cb2..473c9bdb4a8 100644
--- a/apps/web/src/pages/Swap/Limit/LimitForm.tsx
+++ b/apps/web/src/pages/Swap/Limit/LimitForm.tsx
@@ -12,11 +12,11 @@ import {
useCurrentPriceAdjustment,
} from 'components/CurrencyInputPanel/LimitPriceInputPanel/useCurrentPriceAdjustment'
import SwapCurrencyInputPanel from 'components/CurrencyInputPanel/SwapCurrencyInputPanel'
-import { ConnectWalletButtonText } from 'components/NavBar/accountCTAsExperimentUtils'
import Column from 'components/deprecated/Column'
import Row from 'components/deprecated/Row'
+import { Field } from 'components/swap/constants'
import { ArrowContainer, ArrowWrapper, SwapSection } from 'components/swap/styled'
-import { getChain, useIsSupportedChainId, useIsUniswapXSupportedChain } from 'constants/chains'
+import { getChain, isUniswapXSupportedChain, useIsSupportedChainId } from 'constants/chains'
import { ZERO_PERCENT } from 'constants/misc'
import { useAccount } from 'hooks/useAccount'
import usePermit2Allowance, { AllowanceState } from 'hooks/usePermit2Allowance'
@@ -37,8 +37,11 @@ import { CurrencyState } from 'state/swap/types'
import { useSwapAndLimitContext } from 'state/swap/useSwapContext'
import { Anchor, Text, styled as tamaguiStyled } from 'ui/src'
import { AlertTriangleFilled } from 'ui/src/components/icons/AlertTriangleFilled'
+import { colors, validColor } from 'ui/src/theme'
import { nativeOnChain } from 'uniswap/src/constants/tokens'
import { uniswapUrls } from 'uniswap/src/constants/urls'
+import { AccountCTAsExperimentGroup, Experiments } from 'uniswap/src/features/gating/experiments'
+import { useExperimentGroupName } from 'uniswap/src/features/gating/hooks'
import { Locale } from 'uniswap/src/features/language/constants'
import Trace from 'uniswap/src/features/telemetry/Trace'
import { ElementName, InterfacePageNameLocal } from 'uniswap/src/features/telemetry/constants'
@@ -97,7 +100,6 @@ function LimitForm({ onCurrencyChange }: LimitFormProps) {
setCurrencyState,
} = useSwapAndLimitContext()
const isSupportedChain = useIsSupportedChainId(chainId)
- const isUniswapXSupportedChain = useIsUniswapXSupportedChain(chainId)
const { limitState, setLimitState, derivedLimitInfo } = useLimitContext()
const { currencyBalances, parsedAmounts, parsedLimitPrice, limitOrderTrade, marketPrice } = derivedLimitInfo
@@ -171,8 +173,7 @@ function LimitForm({ onCurrencyChange }: LimitFormProps) {
const onSelectCurrency = useCallback(
(type: keyof CurrencyState, newCurrency: Currency) => {
if ((type === 'inputCurrency' ? outputCurrency : inputCurrency)?.equals(newCurrency)) {
- switchTokens()
- return
+ return switchTokens()
}
const [newInput, newOutput] =
type === 'inputCurrency' ? [newCurrency, outputCurrency] : [inputCurrency, newCurrency]
@@ -227,56 +228,54 @@ function LimitForm({ onCurrencyChange }: LimitFormProps) {
}, [])
const maxInputAmount: CurrencyAmount | undefined = useMemo(
- () => maxAmountSpend(currencyBalances[CurrencyField.INPUT]),
+ () => maxAmountSpend(currencyBalances[Field.INPUT]),
[currencyBalances],
)
- const showMaxButton = Boolean(
- maxInputAmount?.greaterThan(0) && !parsedAmounts[CurrencyField.INPUT]?.equalTo(maxInputAmount),
- )
+ const showMaxButton = Boolean(maxInputAmount?.greaterThan(0) && !parsedAmounts[Field.INPUT]?.equalTo(maxInputAmount))
const handleMaxInput = useCallback(() => {
maxInputAmount && onTypeInput('inputAmount')(maxInputAmount.toExact())
}, [maxInputAmount, onTypeInput])
const hasInsufficientFunds =
- parsedAmounts.input && currencyBalances.input ? currencyBalances.input.lessThan(parsedAmounts.input) : false
+ parsedAmounts.INPUT && currencyBalances.INPUT ? currencyBalances.INPUT.lessThan(parsedAmounts.INPUT) : false
const allowance = usePermit2Allowance(
- parsedAmounts.input?.currency?.isNative ? undefined : (parsedAmounts.input as CurrencyAmount),
+ parsedAmounts.INPUT?.currency?.isNative ? undefined : (parsedAmounts.INPUT as CurrencyAmount),
isSupportedChain ? UNIVERSAL_ROUTER_ADDRESS(chainId) : undefined,
TradeFillType.UniswapX,
)
- const fiatValueTradeInput = useUSDPrice(parsedAmounts.input)
- const fiatValueTradeOutput = useUSDPrice(parsedAmounts.output)
+ const fiatValueTradeInput = useUSDPrice(parsedAmounts.INPUT)
+ const fiatValueTradeOutput = useUSDPrice(parsedAmounts.OUTPUT)
const formattedAmounts = useMemo(() => {
// if there is no Price field, then just default to user-typed amounts
if (!limitState.limitPrice) {
return {
- [CurrencyField.INPUT]: limitState.inputAmount,
- [CurrencyField.OUTPUT]: limitState.outputAmount,
+ [Field.INPUT]: limitState.inputAmount,
+ [Field.OUTPUT]: limitState.outputAmount,
}
}
const formattedInput = limitState.isInputAmountFixed
? limitState.inputAmount
: formatCurrencyAmount({
- amount: derivedLimitInfo.parsedAmounts[CurrencyField.INPUT],
+ amount: derivedLimitInfo.parsedAmounts[Field.INPUT],
type: NumberType.SwapTradeAmount,
placeholder: '',
})
const formattedOutput = limitState.isInputAmountFixed
? formatCurrencyAmount({
- amount: derivedLimitInfo.parsedAmounts[CurrencyField.OUTPUT],
+ amount: derivedLimitInfo.parsedAmounts[Field.OUTPUT],
type: NumberType.SwapTradeAmount,
placeholder: '',
})
: limitState.outputAmount
return {
- [CurrencyField.INPUT]: formattedInput,
- [CurrencyField.OUTPUT]: formattedOutput,
+ [Field.INPUT]: formattedInput,
+ [Field.OUTPUT]: formattedOutput,
}
}, [
limitState.limitPrice,
@@ -319,7 +318,7 @@ function LimitForm({ onCurrencyChange }: LimitFormProps) {
}
- value={formattedAmounts[CurrencyField.INPUT]}
+ value={formattedAmounts[Field.INPUT]}
showMaxButton={showMaxButton}
currency={inputCurrency ?? null}
currencyField={CurrencyField.INPUT}
@@ -346,7 +345,7 @@ function LimitForm({ onCurrencyChange }: LimitFormProps) {
}
- value={formattedAmounts[CurrencyField.OUTPUT]}
+ value={formattedAmounts[Field.OUTPUT]}
showMaxButton={false}
currency={outputCurrency ?? null}
currencyField={CurrencyField.OUTPUT}
@@ -367,7 +366,7 @@ function LimitForm({ onCurrencyChange }: LimitFormProps) {
hasInsufficientFunds={hasInsufficientFunds}
limitPriceError={priceError}
/>
- {isUniswapXSupportedChain && !!priceError && inputCurrency && outputCurrency && limitOrderTrade && (
+ {isUniswapXSupportedChain(chainId) && !!priceError && inputCurrency && outputCurrency && limitOrderTrade && (
)}
-
+
- {!isUniswapXSupportedChain ? (
+ {!isUniswapXSupportedChain(chainId) ? (
{
- onSelectCurrency(field === CurrencyField.INPUT ? 'inputCurrency' : 'outputCurrency', currency)
+ onCurrencySelection={(field: Field, currency) => {
+ onSelectCurrency(field === Field.INPUT ? 'inputCurrency' : 'outputCurrency', currency)
}}
onConfirm={handleSubmit}
onDismiss={() => {
@@ -466,7 +465,11 @@ function SubmitOrderButton({
const account = useAccount()
const { chainId } = useSwapAndLimitContext()
- if (!useIsUniswapXSupportedChain(chainId)) {
+ const accountsCTAExperimentGroup = useExperimentGroupName(Experiments.AccountCTAs)
+ const isSignIn = accountsCTAExperimentGroup === AccountCTAsExperimentGroup.SignInSignUp
+ const isLogIn = accountsCTAExperimentGroup === AccountCTAsExperimentGroup.LogInCreateAccount
+
+ if (!isUniswapXSupportedChain(chainId)) {
return (
@@ -477,7 +480,13 @@ function SubmitOrderButton({
if (!account.isConnected) {
return (
-
+ {isSignIn ? (
+
+ ) : isLogIn ? (
+
+ ) : (
+
+ )}
)
}
@@ -504,7 +513,7 @@ function SubmitOrderButton({
data-testid="submit-order-button"
disabled={!trade || !!limitPriceError}
>
-
+
diff --git a/apps/web/src/pages/Swap/Send/SendCurrencyInputForm.tsx b/apps/web/src/pages/Swap/Send/SendCurrencyInputForm.tsx
index 03659cd04c3..b99403d0a3b 100644
--- a/apps/web/src/pages/Swap/Send/SendCurrencyInputForm.tsx
+++ b/apps/web/src/pages/Swap/Send/SendCurrencyInputForm.tsx
@@ -10,7 +10,7 @@ import CurrencySearchModal from 'components/SearchModal/CurrencySearchModal'
import Column from 'components/deprecated/Column'
import Row, { RowBetween } from 'components/deprecated/Row'
import { getChain, useSupportedChainId } from 'constants/chains'
-import { PrefetchBalancesWrapper } from 'graphql/data/apollo/AdaptiveTokenBalancesProvider'
+import { PrefetchBalancesWrapper } from 'graphql/data/apollo/TokenBalancesProvider'
import { useActiveLocalCurrency, useActiveLocalCurrencyComponents } from 'hooks/useActiveLocalCurrency'
import { useUSDPrice } from 'hooks/useUSDPrice'
import styled, { css } from 'lib/styled-components'
diff --git a/apps/web/src/pages/Swap/Send/SendForm.tsx b/apps/web/src/pages/Swap/Send/SendForm.tsx
index 17a3e7ec3f0..11f1f39ccc5 100644
--- a/apps/web/src/pages/Swap/Send/SendForm.tsx
+++ b/apps/web/src/pages/Swap/Send/SendForm.tsx
@@ -1,7 +1,6 @@
import { InterfaceElementName, InterfaceEventName } from '@uniswap/analytics-events'
import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks'
import { ButtonLight, ButtonPrimary } from 'components/Button/buttons'
-import { ConnectWalletButtonText } from 'components/NavBar/accountCTAsExperimentUtils'
import Column from 'components/deprecated/Column'
import { useIsSupportedChainId } from 'constants/chains'
import { useAccount } from 'hooks/useAccount'
@@ -18,6 +17,8 @@ import { SendContextProvider, useSendContext } from 'state/send/SendContext'
import { CurrencyState } from 'state/swap/types'
import { useSwapAndLimitContext } from 'state/swap/useSwapContext'
import { UNIVERSE_CHAIN_INFO } from 'uniswap/src/constants/chains'
+import { AccountCTAsExperimentGroup, Experiments } from 'uniswap/src/features/gating/experiments'
+import { useExperimentGroupName } from 'uniswap/src/features/gating/hooks'
import Trace from 'uniswap/src/features/telemetry/Trace'
import { InterfacePageNameLocal } from 'uniswap/src/features/telemetry/constants'
import { Trans } from 'uniswap/src/i18n'
@@ -186,6 +187,10 @@ function SendFormInner({ disableTokenInputs = false, onCurrencyChange }: SendFor
.catch(() => undefined)
}, [handleModalState, sendCallback, setSendState])
+ const accountsCTAExperimentGroup = useExperimentGroupName(Experiments.AccountCTAs)
+ const isSignIn = accountsCTAExperimentGroup === AccountCTAsExperimentGroup.SignInSignUp
+ const isLogIn = accountsCTAExperimentGroup === AccountCTAsExperimentGroup.LogInCreateAccount
+
return (
<>
@@ -198,7 +203,13 @@ function SendFormInner({ disableTokenInputs = false, onCurrencyChange }: SendFor
element={InterfaceElementName.CONNECT_WALLET_BUTTON}
>
-
+ {isSignIn ? (
+
+ ) : isLogIn ? (
+
+ ) : (
+
+ )}
) : !multichainUXEnabled && initialChainId && initialChainId !== account.chainId ? (
diff --git a/apps/web/src/pages/Swap/Send/__snapshots__/SendCurrencyInputForm.test.tsx.snap b/apps/web/src/pages/Swap/Send/__snapshots__/SendCurrencyInputForm.test.tsx.snap
index 019b8f55a53..62f8e2aa521 100644
--- a/apps/web/src/pages/Swap/Send/__snapshots__/SendCurrencyInputForm.test.tsx.snap
+++ b/apps/web/src/pages/Swap/Send/__snapshots__/SendCurrencyInputForm.test.tsx.snap
@@ -13,7 +13,7 @@ exports[`SendCurrencyInputform renders input in fiat correctly 1`] = `
}
.c23 img {
- width: 17px;
+ width: 18px;
height: 36px;
object-fit: cover;
}
@@ -584,7 +584,7 @@ exports[`SendCurrencyInputform renders input in token amount correctly 1`] = `
}
.c22 img {
- width: 17px;
+ width: 18px;
height: 36px;
object-fit: cover;
}
@@ -1139,7 +1139,7 @@ exports[`SendCurrencyInputform should render placeholder values 1`] = `
}
.c23 img {
- width: 17px;
+ width: 18px;
height: 36px;
object-fit: cover;
}
diff --git a/apps/web/src/pages/Swap/Send/__snapshots__/SendRecipientForm.test.tsx.snap b/apps/web/src/pages/Swap/Send/__snapshots__/SendRecipientForm.test.tsx.snap
index 845168c55f2..83fa766cead 100644
--- a/apps/web/src/pages/Swap/Send/__snapshots__/SendRecipientForm.test.tsx.snap
+++ b/apps/web/src/pages/Swap/Send/__snapshots__/SendRecipientForm.test.tsx.snap
@@ -351,7 +351,7 @@ exports[`SendCurrencyInputform should render correctly with unitag 1`] = `
diff --git a/apps/web/src/pages/Swap/SwapForm.tsx b/apps/web/src/pages/Swap/SwapForm.tsx
index 63077f938d9..5d7dc92fca1 100644
--- a/apps/web/src/pages/Swap/SwapForm.tsx
+++ b/apps/web/src/pages/Swap/SwapForm.tsx
@@ -3,7 +3,6 @@ import {
InterfaceEventName,
InterfaceSectionName,
SwapEventName,
- SwapPriceImpactUserResponse,
} from '@uniswap/analytics-events'
import { Currency, CurrencyAmount, Token } from '@uniswap/sdk-core'
import { UNIVERSAL_ROUTER_ADDRESS } from '@uniswap/universal-router-sdk'
@@ -13,13 +12,13 @@ import { GrayCard } from 'components/Card/cards'
import { ConfirmSwapModal } from 'components/ConfirmSwapModal'
import SwapCurrencyInputPanel from 'components/CurrencyInputPanel/SwapCurrencyInputPanel'
import ErrorIcon from 'components/Icons/Error'
-import { ConnectWalletButtonText } from 'components/NavBar/accountCTAsExperimentUtils'
import TokenSafetyModal from 'components/TokenSafety/TokenSafetyModal'
import Column, { AutoColumn } from 'components/deprecated/Column'
import Row from 'components/deprecated/Row'
import PriceImpactModal from 'components/swap/PriceImpactModal'
import SwapDetailsDropdown from 'components/swap/SwapDetailsDropdown'
import confirmPriceImpactWithoutFee from 'components/swap/confirmPriceImpactWithoutFee'
+import { Field } from 'components/swap/constants'
import { ArrowContainer, ArrowWrapper, OutputSwapSection, SwapSection } from 'components/swap/styled'
import { useIsSupportedChainId, useSupportedChainId } from 'constants/chains'
import { useCurrencyInfo } from 'hooks/Tokens'
@@ -53,6 +52,8 @@ import { Text } from 'ui/src'
import { UNIVERSE_CHAIN_INFO } from 'uniswap/src/constants/chains'
import { SafetyLevel } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks'
import { CurrencyInfo } from 'uniswap/src/features/dataApi/types'
+import { AccountCTAsExperimentGroup, Experiments } from 'uniswap/src/features/gating/experiments'
+import { useExperimentGroupName } from 'uniswap/src/features/gating/hooks'
import Trace from 'uniswap/src/features/telemetry/Trace'
import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send'
import { WrapType } from 'uniswap/src/features/transactions/types/wrap'
@@ -136,10 +137,10 @@ export function SwapForm({
useEffect(() => {
// Force exact input if the user switches to an output token with tax
- if (outputTokenHasTax && independentField === CurrencyField.OUTPUT) {
+ if (outputTokenHasTax && independentField === Field.OUTPUT) {
setSwapState((state) => ({
...state,
- independentField: CurrencyField.INPUT,
+ independentField: Field.INPUT,
typedValue: '',
}))
}
@@ -149,39 +150,39 @@ export function SwapForm({
wrapType,
execute: onWrap,
inputError: wrapInputError,
- } = useWrapCallback(currencies[CurrencyField.INPUT], currencies[CurrencyField.OUTPUT], typedValue)
+ } = useWrapCallback(currencies[Field.INPUT], currencies[Field.OUTPUT], typedValue)
const showWrap: boolean = wrapType !== WrapType.NotApplicable
const parsedAmounts = useMemo(
() =>
showWrap
? {
- [CurrencyField.INPUT]: parsedAmount,
- [CurrencyField.OUTPUT]: parsedAmount,
+ [Field.INPUT]: parsedAmount,
+ [Field.OUTPUT]: parsedAmount,
}
: {
- [CurrencyField.INPUT]: independentField === CurrencyField.INPUT ? parsedAmount : trade?.inputAmount,
- [CurrencyField.OUTPUT]: independentField === CurrencyField.OUTPUT ? parsedAmount : trade?.outputAmount,
+ [Field.INPUT]: independentField === Field.INPUT ? parsedAmount : trade?.inputAmount,
+ [Field.OUTPUT]: independentField === Field.OUTPUT ? parsedAmount : trade?.outputAmount,
},
[independentField, parsedAmount, showWrap, trade],
)
- const showFiatValueInput = Boolean(parsedAmounts[CurrencyField.INPUT])
- const showFiatValueOutput = Boolean(parsedAmounts[CurrencyField.OUTPUT])
+ const showFiatValueInput = Boolean(parsedAmounts[Field.INPUT])
+ const showFiatValueOutput = Boolean(parsedAmounts[Field.OUTPUT])
const getSingleUnitAmount = (currency?: Currency) => {
if (!currency) {
- return undefined
+ return
}
return CurrencyAmount.fromRawAmount(currency, JSBI.BigInt(10 ** currency.decimals))
}
const fiatValueInput = useUSDPrice(
- parsedAmounts[CurrencyField.INPUT] ?? getSingleUnitAmount(currencies[CurrencyField.INPUT]),
- currencies[CurrencyField.INPUT],
+ parsedAmounts[Field.INPUT] ?? getSingleUnitAmount(currencies[Field.INPUT]),
+ currencies[Field.INPUT],
)
const fiatValueOutput = useUSDPrice(
- parsedAmounts[CurrencyField.OUTPUT] ?? getSingleUnitAmount(currencies[CurrencyField.OUTPUT]),
- currencies[CurrencyField.OUTPUT],
+ parsedAmounts[Field.OUTPUT] ?? getSingleUnitAmount(currencies[Field.OUTPUT]),
+ currencies[Field.OUTPUT],
)
const [routeNotFound, routeIsLoading, routeIsSyncing] = useMemo(
@@ -208,26 +209,25 @@ export function SwapForm({
)
const { onSwitchTokens, onCurrencySelection, onUserInput } = useSwapActionHandlers()
- const dependentField: CurrencyField =
- independentField === CurrencyField.INPUT ? CurrencyField.OUTPUT : CurrencyField.INPUT
+ const dependentField: Field = independentField === Field.INPUT ? Field.OUTPUT : Field.INPUT
const handleTypeInput = useCallback(
(value: string) => {
- onUserInput(CurrencyField.INPUT, value)
+ onUserInput(Field.INPUT, value)
maybeLogFirstSwapAction(trace)
},
[onUserInput, trace],
)
const handleTypeOutput = useCallback(
(value: string) => {
- onUserInput(CurrencyField.OUTPUT, value)
+ onUserInput(Field.OUTPUT, value)
maybeLogFirstSwapAction(trace)
},
[onUserInput, trace],
)
const navigate = useNavigate()
- const swapIsUnsupported = useIsSwapUnsupported(currencies[CurrencyField.INPUT], currencies[CurrencyField.OUTPUT])
+ const swapIsUnsupported = useIsSwapUnsupported(currencies[Field.INPUT], currencies[Field.OUTPUT])
const isLandingPage = useIsLandingPage()
const navigateToSwapWithParams = useCallback(() => {
@@ -248,6 +248,12 @@ export function SwapForm({
swapState.typedValue,
])
+ // reset if they close warning without tokens in params
+ const handleDismissTokenWarning = useCallback(() => {
+ setDismissTokenWarning(true)
+ navigate('/swap')
+ }, [navigate])
+
// modal and loading
const [{ showConfirm, tradeToConfirm, swapError, swapResult }, setSwapFormState] = useState<{
showConfirm: boolean
@@ -310,28 +316,24 @@ export function SwapForm({
const selectChain = useSelectChain()
const userHasSpecifiedInputOutput = Boolean(
- currencies[CurrencyField.INPUT] &&
- currencies[CurrencyField.OUTPUT] &&
- parsedAmounts[independentField]?.greaterThan(JSBI.BigInt(0)),
+ currencies[Field.INPUT] && currencies[Field.OUTPUT] && parsedAmounts[independentField]?.greaterThan(JSBI.BigInt(0)),
)
const maximumAmountIn = useMaxAmountIn(trade, allowedSlippage)
const allowance = usePermit2Allowance(
maximumAmountIn ??
- (parsedAmounts[CurrencyField.INPUT]?.currency.isToken
- ? (parsedAmounts[CurrencyField.INPUT] as CurrencyAmount
)
+ (parsedAmounts[Field.INPUT]?.currency.isToken
+ ? (parsedAmounts[Field.INPUT] as CurrencyAmount)
: undefined),
supportedChainId ? UNIVERSAL_ROUTER_ADDRESS(supportedChainId) : undefined,
trade?.fillType,
)
const maxInputAmount: CurrencyAmount | undefined = useMemo(
- () => maxAmountSpend(currencyBalances[CurrencyField.INPUT]),
+ () => maxAmountSpend(currencyBalances[Field.INPUT]),
[currencyBalances],
)
- const showMaxButton = Boolean(
- maxInputAmount?.greaterThan(0) && !parsedAmounts[CurrencyField.INPUT]?.equalTo(maxInputAmount),
- )
+ const showMaxButton = Boolean(maxInputAmount?.greaterThan(0) && !parsedAmounts[Field.INPUT]?.equalTo(maxInputAmount))
const swapFiatValues = useMemo(() => {
return { amountIn: fiatValueTradeInput.data, amountOut: fiatValueTradeOutput.data, feeUsd: outputFeeFiatValue }
}, [fiatValueTradeInput.data, fiatValueTradeOutput.data, outputFeeFiatValue])
@@ -403,13 +405,13 @@ export function SwapForm({
swapError: undefined,
txHash,
}))
- onUserInput(CurrencyField.INPUT, '')
+ onUserInput(Field.INPUT, '')
} catch (error) {
if (!didUserReject(error)) {
sendAnalyticsEvent(SwapEventName.SWAP_ERROR, {
wrapType,
- input: currencies[CurrencyField.INPUT],
- output: currencies[CurrencyField.OUTPUT],
+ input: currencies[Field.INPUT],
+ output: currencies[Field.OUTPUT],
})
} else {
logger.debug('SwapForm', 'handleOnWrap', 'rejected wrap/unwrap')
@@ -442,7 +444,7 @@ export function SwapForm({
setSwapState((state) => ({ ...state, routerPreferenceOverride: undefined }))
// If there was a swap, we want to clear the input
if (swapResult) {
- onUserInput(CurrencyField.INPUT, '')
+ onUserInput(Field.INPUT, '')
}
}, [onUserInput, setSwapState, swapResult])
@@ -452,7 +454,7 @@ export function SwapForm({
const handleInputSelect = useCallback(
(inputCurrency: Currency) => {
- onCurrencySelection(CurrencyField.INPUT, inputCurrency)
+ onCurrencySelection(Field.INPUT, inputCurrency)
onCurrencyChange?.({
inputCurrency,
outputCurrency: currencyState.outputCurrency,
@@ -464,13 +466,13 @@ export function SwapForm({
const inputCurrencyNumericalInputRef = useRef(null)
const handleMaxInput = useCallback(() => {
- maxInputAmount && onUserInput(CurrencyField.INPUT, maxInputAmount.toExact())
+ maxInputAmount && onUserInput(Field.INPUT, maxInputAmount.toExact())
maybeLogFirstSwapAction(trace)
}, [maxInputAmount, onUserInput, trace])
const handleOutputSelect = useCallback(
(outputCurrency: Currency) => {
- onCurrencySelection(CurrencyField.OUTPUT, outputCurrency)
+ onCurrencySelection(Field.OUTPUT, outputCurrency)
onCurrencyChange?.({
inputCurrency: currencyState.inputCurrency,
outputCurrency,
@@ -498,7 +500,7 @@ export function SwapForm({
!isLandingPage && !showWrap && userHasSpecifiedInputOutput && (trade || routeIsLoading || routeIsSyncing),
)
- const inputCurrency = currencies[CurrencyField.INPUT] ?? undefined
+ const inputCurrency = currencies[Field.INPUT] ?? undefined
const switchingChain = useAppSelector((state) => state.wallets.switchingChain)
const targetChain = switchingChain ? switchingChain : undefined
@@ -506,23 +508,18 @@ export function SwapForm({
// @ts-ignore
const isUsingBlockedExtension = window.ethereum?.['isPocketUniverseZ']
+ const accountsCTAExperimentGroup = useExperimentGroupName(Experiments.AccountCTAs)
+ const isSignIn = accountsCTAExperimentGroup === AccountCTAsExperimentGroup.SignInSignUp
+ const isLogIn = accountsCTAExperimentGroup === AccountCTAsExperimentGroup.LogInCreateAccount
+
return (
<>
0 && !dismissTokenWarning}
token0={urlTokensNotInDefault[0]}
token1={urlTokensNotInDefault[1]}
- onAcknowledge={handleConfirmTokenWarning}
- onReject={() => {
- setDismissTokenWarning(true)
- onCurrencySelection(CurrencyField.INPUT, undefined)
- onCurrencySelection(CurrencyField.OUTPUT, undefined)
- }}
- closeModalOnly={() => {
- setDismissTokenWarning(true)
- }}
- onToken0BlockAcknowledged={() => onCurrencySelection(CurrencyField.INPUT, undefined)}
- onToken1BlockAcknowledged={() => onCurrencySelection(CurrencyField.OUTPUT, undefined)}
+ onContinue={handleConfirmTokenWarning}
+ onCancel={handleDismissTokenWarning}
showCancel={true}
/>
{trade && showConfirm && (
@@ -555,16 +552,8 @@ export function SwapForm({
{showPriceImpactModal && showPriceImpactWarning && (
{
- sendAnalyticsEvent(SwapEventName.SWAP_PRICE_IMPACT_ACKNOWLEDGED, {
- response: SwapPriceImpactUserResponse.REJECTED,
- })
- setShowPriceImpactModal(false)
- }}
+ onDismiss={() => setShowPriceImpactModal(false)}
onContinue={() => {
- sendAnalyticsEvent(SwapEventName.SWAP_PRICE_IMPACT_ACKNOWLEDGED, {
- response: SwapPriceImpactUserResponse.ACCEPTED,
- })
setShowPriceImpactModal(false)
handleContinueToReview()
}}
@@ -576,17 +565,17 @@ export function SwapForm({
}
disabled={disableTokenInputs}
- value={formattedAmounts[CurrencyField.INPUT]}
+ value={formattedAmounts[Field.INPUT]}
showMaxButton={showMaxButton}
- currency={currencies[CurrencyField.INPUT] ?? null}
+ currency={currencies[Field.INPUT] ?? null}
currencyField={CurrencyField.INPUT}
onUserInput={handleTypeInput}
onMax={handleMaxInput}
fiatValue={showFiatValueInput ? fiatValueInput : undefined}
onCurrencySelect={handleInputSelect}
- otherCurrency={currencies[CurrencyField.OUTPUT]}
+ otherCurrency={currencies[Field.OUTPUT]}
id={InterfaceSectionName.CURRENCY_INPUT_PANEL}
- loading={independentField === CurrencyField.OUTPUT && routeIsSyncing}
+ loading={independentField === Field.OUTPUT && routeIsSyncing}
initialCurrencyLoading={initialCurrencyLoading}
ref={inputCurrencyNumericalInputRef}
/>
@@ -622,7 +611,7 @@ export function SwapForm({
}
@@ -630,12 +619,12 @@ export function SwapForm({
hideBalance={false}
fiatValue={showFiatValueOutput ? fiatValueOutput : undefined}
priceImpact={stablecoinPriceImpact}
- currency={currencies[CurrencyField.OUTPUT] ?? null}
+ currency={currencies[Field.OUTPUT] ?? null}
currencyField={CurrencyField.OUTPUT}
onCurrencySelect={handleOutputSelect}
- otherCurrency={currencies[CurrencyField.INPUT]}
+ otherCurrency={currencies[Field.INPUT]}
id={InterfaceSectionName.CURRENCY_OUTPUT_PANEL}
- loading={independentField === CurrencyField.INPUT && routeIsSyncing}
+ loading={independentField === Field.INPUT && routeIsSyncing}
numericalInputSettings={{
// We disable numerical input here if the selected token has tax, since we cannot guarantee exact_outputs for FOT tokens
disabled: inputTokenHasTax || outputTokenHasTax,
@@ -643,7 +632,7 @@ export function SwapForm({
onDisabledClick: () => inputCurrencyNumericalInputRef.current?.focus(),
disabledTooltipBody: (
),
}}
@@ -687,7 +676,13 @@ export function SwapForm({
element={InterfaceElementName.CONNECT_WALLET_BUTTON}
>
-
+ {isSignIn ? (
+
+ ) : isLogIn ? (
+
+ ) : (
+
+ )}
) : !multichainUXEnabled && initialChainId && initialChainId !== connectedChainId ? (
diff --git a/apps/web/src/pages/Swap/index.tsx b/apps/web/src/pages/Swap/index.tsx
index e6e015c103b..fc3a402259b 100644
--- a/apps/web/src/pages/Swap/index.tsx
+++ b/apps/web/src/pages/Swap/index.tsx
@@ -3,8 +3,8 @@ import { Currency } from '@uniswap/sdk-core'
import { NetworkAlert } from 'components/NetworkAlert'
import { SwitchLocaleLink } from 'components/SwitchLocaleLink'
import SwapHeader from 'components/swap/SwapHeader'
+import { Field } from 'components/swap/constants'
import { PageWrapper, SwapWrapper } from 'components/swap/styled'
-import { PrefetchBalancesWrapper } from 'graphql/data/apollo/AdaptiveTokenBalancesProvider'
import { useScreenSize } from 'hooks/screenSize/useScreenSize'
import { BuyForm } from 'pages/Swap/Buy/BuyForm'
import { LimitFormWrapper } from 'pages/Swap/Limit/LimitForm'
@@ -14,8 +14,6 @@ import { ReactNode, useState } from 'react'
import { useLocation } from 'react-router-dom'
import { InterfaceTrade, TradeState } from 'state/routing/types'
import { isPreviewTrade } from 'state/routing/utils'
-import { useSwapCallback } from 'state/sagas/transactions/swapSaga'
-import { useWrapCallback } from 'state/sagas/transactions/wrapSaga'
import { SwapAndLimitContextProvider, SwapContextProvider } from 'state/swap/SwapContext'
import { useInitialCurrencyState } from 'state/swap/hooks'
import { CurrencyState, SwapAndLimitContext } from 'state/swap/types'
@@ -25,19 +23,13 @@ import { AppTFunction } from 'ui/src/i18n/types'
import { FeatureFlags } from 'uniswap/src/features/gating/flags'
import { useFeatureFlag } from 'uniswap/src/features/gating/hooks'
import Trace from 'uniswap/src/features/telemetry/Trace'
-import { SwapRedirectFn } from 'uniswap/src/features/transactions/TransactionModal/TransactionModalContext'
import { SwapFlow } from 'uniswap/src/features/transactions/swap/SwapFlow'
-import { useSwapPrefilledState } from 'uniswap/src/features/transactions/swap/hooks/useSwapPrefilledState'
import { Deadline } from 'uniswap/src/features/transactions/swap/settings/configs/Deadline'
-import { currencyToAsset } from 'uniswap/src/features/transactions/swap/utils/asset'
import { useTranslation } from 'uniswap/src/i18n'
import { InterfaceChainId } from 'uniswap/src/types/chains'
-import { CurrencyField } from 'uniswap/src/types/currency'
import { SwapTab } from 'uniswap/src/types/screens/interface'
import noop from 'utilities/src/react/noop'
-const WEB_CUSTOM_SWAP_SETTINGS = [Deadline]
-
export function getIsReviewableQuote(
trade: InterfaceTrade | undefined,
tradeState: TradeState,
@@ -104,13 +96,11 @@ export function Swap({
initialCurrencyLoading = false,
chainId,
hideHeader = false,
- hideFooter = false,
onCurrencyChange,
multichainUXEnabled = false,
disableTokenInputs = false,
compact = false,
syncTabToUrl,
- swapRedirectCallback,
}: {
className?: string
chainId?: InterfaceChainId
@@ -119,19 +109,16 @@ export function Swap({
initialInputCurrency?: Currency
initialOutputCurrency?: Currency
initialTypedValue?: string
- initialIndependentField?: CurrencyField
+ initialIndependentField?: Field
initialCurrencyLoading?: boolean
compact?: boolean
syncTabToUrl: boolean
multichainUXEnabled?: boolean
hideHeader?: boolean
- hideFooter?: boolean
- swapRedirectCallback?: SwapRedirectFn
}) {
const isDark = useIsDarkMode()
const screenSize = useScreenSize()
const forAggregatorEnabled = useFeatureFlag(FeatureFlags.ForAggregator)
-
const universalSwapFlow = useFeatureFlag(FeatureFlags.UniversalSwap)
if (universalSwapFlow) {
@@ -142,17 +129,7 @@ export function Swap({
initialOutputCurrency={initialOutputCurrency}
multichainUXEnabled={multichainUXEnabled}
>
-
-
-
+
)
}
@@ -206,72 +183,36 @@ const TAB_TYPE_TO_LABEL = {
}
function UniversalSwapFlow({
- hideHeader = false,
- hideFooter = false,
- disableTokenInputs = false,
- initialInputCurrency,
- initialOutputCurrency,
- initialTypedValue,
- initialIndependentField,
onCurrencyChange,
- swapRedirectCallback,
+ disableTokenInputs = false,
}: {
- hideHeader?: boolean
- hideFooter?: boolean
- disableTokenInputs?: boolean
- initialInputCurrency?: Currency
- initialOutputCurrency?: Currency
- initialTypedValue?: string
- initialIndependentField?: CurrencyField
onCurrencyChange?: (selected: CurrencyState) => void
- swapRedirectCallback?: SwapRedirectFn
+ disableTokenInputs?: boolean
}) {
const [currentTab, setCurrentTab] = useState(SwapTab.Swap)
const { t } = useTranslation()
const forAggregatorEnabled = useFeatureFlag(FeatureFlags.ForAggregator)
- const swapCallback = useSwapCallback()
- const wrapCallback = useWrapCallback()
-
- const input = currencyToAsset(initialInputCurrency)
- const output = currencyToAsset(initialOutputCurrency)
-
- const prefilledState = useSwapPrefilledState({
- input,
- output,
- exactAmountToken: initialTypedValue ?? '',
- exactCurrencyField: initialIndependentField ?? CurrencyField.INPUT,
- })
return (
-
+
- {!hideHeader &&
- SWAP_TABS.map((tab) => (
- setCurrentTab(tab)}
- >
-
- {TAB_TYPE_TO_LABEL[tab](t)}
-
-
- ))}
+ {SWAP_TABS.map((tab) => (
+ setCurrentTab(tab)}
+ >
+
+ {TAB_TYPE_TO_LABEL[tab](t)}
+
+
+ ))}
{currentTab === SwapTab.Swap && (
-
+
)}
{currentTab === SwapTab.Limit && }
{currentTab === SwapTab.Send && (
diff --git a/apps/web/src/pages/TokenDetails/index.tsx b/apps/web/src/pages/TokenDetails/index.tsx
index 02dd545479c..b64a65cfd5d 100644
--- a/apps/web/src/pages/TokenDetails/index.tsx
+++ b/apps/web/src/pages/TokenDetails/index.tsx
@@ -5,7 +5,7 @@ import { TokenDetailsPageSkeleton } from 'components/Tokens/TokenDetails/Skeleto
import { useChainFromUrlParam } from 'constants/chains'
import { useTokenWarning } from 'constants/deprecatedTokenSafety'
import { NATIVE_CHAIN_ID, UNKNOWN_TOKEN_SYMBOL } from 'constants/tokens'
-import { useTokenBalancesQuery } from 'graphql/data/apollo/AdaptiveTokenBalancesProvider'
+import { useTokenBalancesQuery } from 'graphql/data/apollo/TokenBalancesProvider'
import { getSupportedGraphQlChain, gqlToCurrency } from 'graphql/data/util'
import { useCurrency } from 'hooks/Tokens'
import { useAccount } from 'hooks/useAccount'
@@ -123,7 +123,7 @@ function useCreateTDPContext(): PendingTDPContext | LoadedTDPContext {
const tokenColor =
useSrcColor(
extractedColorSrc,
- tokenQuery.data?.token?.name ?? tokenQuery.data?.token?.project?.name,
+ tokenQuery.data?.token?.project?.name ?? tokenQuery.data?.token?.name,
theme.surface2,
).tokenColor ?? undefined
diff --git a/apps/web/src/pages/__snapshots__/routes.test.ts.snap b/apps/web/src/pages/__snapshots__/routes.test.ts.snap
index 18907c51030..553d131803d 100644
--- a/apps/web/src/pages/__snapshots__/routes.test.ts.snap
+++ b/apps/web/src/pages/__snapshots__/routes.test.ts.snap
@@ -132,15 +132,7 @@ Array [
"getElement": [Function],
"getTitle": [Function],
"nestedPaths": Array [],
- "path": "/positions/create",
- },
- Object {
- "enabled": [Function],
- "getDescription": [Function],
- "getElement": [Function],
- "getTitle": [Function],
- "nestedPaths": Array [],
- "path": "/positions/create/:protocolVersion",
+ "path": "/positions/new",
},
Object {
"enabled": [Function],
@@ -150,30 +142,6 @@ Array [
"nestedPaths": Array [],
"path": "/positions",
},
- Object {
- "enabled": [Function],
- "getDescription": [Function],
- "getElement": [Function],
- "getTitle": [Function],
- "nestedPaths": Array [],
- "path": "/positions/v2/:currencyIdA/:currencyIdB",
- },
- Object {
- "enabled": [Function],
- "getDescription": [Function],
- "getElement": [Function],
- "getTitle": [Function],
- "nestedPaths": Array [],
- "path": "/positions/v3/:tokenId",
- },
- Object {
- "enabled": [Function],
- "getDescription": [Function],
- "getElement": [Function],
- "getTitle": [Function],
- "nestedPaths": Array [],
- "path": "/positions/v4/:tokenId",
- },
Object {
"enabled": [Function],
"getDescription": [Function],
diff --git a/apps/web/src/pages/paths.ts b/apps/web/src/pages/paths.ts
index bb7eaed7fc7..1f825b1efa8 100644
--- a/apps/web/src/pages/paths.ts
+++ b/apps/web/src/pages/paths.ts
@@ -30,11 +30,7 @@ export const paths = [
'/pools',
'/pools/:tokenId',
'/positions',
- '/positions/create',
- '/positions/create/:protocolVersion',
- '/positions/v2/:currencyIdA/:currencyIdB',
- '/positions/v3/:tokenId',
- '/positions/v4/:tokenId',
+ '/positions/new',
'/add/v2',
'/add',
'/increase',
diff --git a/apps/web/src/setupTests.ts b/apps/web/src/setupTests.ts
index 06b21653492..09f764b041e 100644
--- a/apps/web/src/setupTests.ts
+++ b/apps/web/src/setupTests.ts
@@ -15,7 +15,6 @@ import { Readable } from 'stream'
import { toBeVisible } from 'test-utils/matchers'
import { mocked } from 'test-utils/mocked'
import { useFeatureFlag } from 'uniswap/src/features/gating/hooks'
-import { mockLocalizationContext } from 'uniswap/src/test/mocks/locale'
import { TextDecoder, TextEncoder } from 'util'
setupi18n()
@@ -83,8 +82,6 @@ jest.mock('@popperjs/core', () => {
}
})
-jest.mock('uniswap/src/features/language/LocalizationContext', () => mockLocalizationContext({}))
-
jest.mock('@web3-react/core', () => {
const web3React = jest.requireActual('@web3-react/core')
const { Empty } = jest.requireActual('@web3-react/empty')
diff --git a/apps/web/src/state/activity/polling/orders.ts b/apps/web/src/state/activity/polling/orders.ts
index 06fde5c5823..48e23cc6a3b 100644
--- a/apps/web/src/state/activity/polling/orders.ts
+++ b/apps/web/src/state/activity/polling/orders.ts
@@ -41,14 +41,6 @@ async function fetchLimitStatuses(account: string, orders: UniswapXOrderDetails[
)
}
-async function fetchPriorityStatuses(account: string, orders: UniswapXOrderDetails[]): Promise {
- return fetchStatuses(
- orders,
- (order) => order.type === SignatureType.SIGN_PRIORITY_ORDER,
- (hashes) => `/orders?swapper=${account}&orderHashes=${hashes}&orderType=${OffchainOrderType.PRIORITY_ORDER}`,
- )
-}
-
async function fetchOrderStatuses(account: string, orders: UniswapXOrderDetails[]): Promise {
return fetchStatuses(
orders,
@@ -85,7 +77,6 @@ export function usePollPendingOrders(onActivityUpdate: OnActivityUpdate) {
await Promise.all([
fetchOrderStatuses(account.address, pendingOrders),
fetchLimitStatuses(account.address, pendingOrders),
- fetchPriorityStatuses(account.address, pendingOrders),
])
).flat()
@@ -135,7 +126,7 @@ export function usePollPendingOrders(onActivityUpdate: OnActivityUpdate) {
timeout = setTimeout(getOrderStatuses, currentDelay)
return () => clearTimeout(timeout)
}
- return undefined
+ return
}, [account.address, currentDelay, onActivityUpdate, pendingOrders, provider, realtimeEnabled])
return null
diff --git a/apps/web/src/state/activity/polling/transactions.ts b/apps/web/src/state/activity/polling/transactions.ts
index f0ff95c01e4..684f191ca64 100644
--- a/apps/web/src/state/activity/polling/transactions.ts
+++ b/apps/web/src/state/activity/polling/transactions.ts
@@ -120,7 +120,7 @@ export function usePollPendingTransactions(onActivityUpdate: OnActivityUpdate) {
useEffect(() => {
if (!account.chainId || !provider || !lastBlockNumber || !hasPending) {
- return undefined
+ return
}
const cancels = pendingTransactions
diff --git a/apps/web/src/state/application/reducer.test.ts b/apps/web/src/state/application/reducer.test.ts
index ea4f30b3afc..89f6cd1541d 100644
--- a/apps/web/src/state/application/reducer.test.ts
+++ b/apps/web/src/state/application/reducer.test.ts
@@ -3,7 +3,6 @@ import reducer, {
addPopup,
ApplicationModal,
ApplicationState,
- PopupType,
removePopup,
setCloseModal,
setOpenModal,
@@ -26,27 +25,27 @@ describe('application reducer', () => {
describe('popupList', () => {
describe('addPopup', () => {
it('adds the popup to list with a generated id', () => {
- store.dispatch(addPopup({ content: { type: PopupType.Transaction, hash: 'abc' } }))
+ store.dispatch(addPopup({ content: { txn: { hash: 'abc' } } }))
const list = store.getState().popupList
expect(list).toEqual([
{
key: expect.any(String),
show: true,
- content: { type: PopupType.Transaction, hash: 'abc' },
+ content: { txn: { hash: 'abc' } },
removeAfterMs: 10000,
},
])
})
it('replaces any existing popups with the same key', () => {
- store.dispatch(addPopup({ key: 'abc', content: { type: PopupType.Transaction, hash: 'abc' } }))
- store.dispatch(addPopup({ key: 'abc', content: { type: PopupType.Transaction, hash: 'abc' } }))
+ store.dispatch(addPopup({ key: 'abc', content: { txn: { hash: 'abc' } } }))
+ store.dispatch(addPopup({ key: 'abc', content: { txn: { hash: 'def' } } }))
const list = store.getState().popupList
expect(list).toEqual([
{
key: 'abc',
show: true,
- content: { type: PopupType.Transaction, hash: 'abc' },
+ content: { txn: { hash: 'def' } },
removeAfterMs: 10000,
},
])
@@ -55,7 +54,7 @@ describe('application reducer', () => {
describe('removePopup', () => {
beforeEach(() => {
- store.dispatch(addPopup({ key: 'abc', content: { type: PopupType.Transaction, hash: 'abc' } }))
+ store.dispatch(addPopup({ key: 'abc', content: { txn: { hash: 'abc' } } }))
})
it('hides the popup', () => {
@@ -65,7 +64,7 @@ describe('application reducer', () => {
{
key: 'abc',
show: false,
- content: { type: PopupType.Transaction, hash: 'abc' },
+ content: { txn: { hash: 'abc' } },
removeAfterMs: 10000,
},
])
diff --git a/apps/web/src/state/application/reducer.ts b/apps/web/src/state/application/reducer.ts
index c7afb5ca341..ac901e294b4 100644
--- a/apps/web/src/state/application/reducer.ts
+++ b/apps/web/src/state/application/reducer.ts
@@ -60,7 +60,7 @@ type AddLiquidityModalParams = {
type RemoveLiquidityModalParams = {
name: typeof ModalName.RemoveLiquidity
- initialState: Position
+ initialState?: Position
}
export type OpenModalParams =
@@ -108,12 +108,7 @@ const applicationSlice = createSlice({
state.openModal = null
}
},
- addPopup(
- state,
- {
- payload: { content, key, removeAfterMs = DEFAULT_TXN_DISMISS_MS },
- }: { payload: { content: PopupContent; key?: string; removeAfterMs?: number } },
- ) {
+ addPopup(state, { payload: { content, key, removeAfterMs = DEFAULT_TXN_DISMISS_MS } }) {
key = key || nanoid()
state.popupList = [
...state.popupList.filter((popup) => popup.key !== key),
diff --git a/apps/web/src/state/burn/hooks.tsx b/apps/web/src/state/burn/hooks.tsx
index a72e01cb648..b5f56026488 100644
--- a/apps/web/src/state/burn/hooks.tsx
+++ b/apps/web/src/state/burn/hooks.tsx
@@ -1,6 +1,5 @@
import { Currency, CurrencyAmount, Percent, Token } from '@uniswap/sdk-core'
import { Pair } from '@uniswap/v2-sdk'
-import { ConnectWalletButtonText } from 'components/NavBar/accountCTAsExperimentUtils'
import { useAccount } from 'hooks/useAccount'
import { useTotalSupply } from 'hooks/useTotalSupply'
import { useV2Pair } from 'hooks/useV2Pairs'
@@ -11,6 +10,8 @@ import { ReactNode, useCallback } from 'react'
import { Field, typeInput } from 'state/burn/actions'
import { useAppDispatch, useAppSelector } from 'state/hooks'
import { InterfaceState } from 'state/webReducer'
+import { AccountCTAsExperimentGroup, Experiments } from 'uniswap/src/features/gating/experiments'
+import { useExperimentGroupName } from 'uniswap/src/features/gating/hooks'
import { Trans } from 'uniswap/src/i18n'
export function useBurnState(): InterfaceState['burn'] {
@@ -121,9 +122,19 @@ export function useDerivedBurnInfo(
: undefined,
}
+ const accountsCTAExperimentGroup = useExperimentGroupName(Experiments.AccountCTAs)
+ const isSignIn = accountsCTAExperimentGroup === AccountCTAsExperimentGroup.SignInSignUp
+ const isLogIn = accountsCTAExperimentGroup === AccountCTAsExperimentGroup.LogInCreateAccount
+
let error: ReactNode | undefined
if (!account.isConnected) {
- error =
+ error = isSignIn ? (
+
+ ) : isLogIn ? (
+
+ ) : (
+
+ )
}
if (!parsedAmounts[Field.LIQUIDITY] || !parsedAmounts[Field.CURRENCY_A] || !parsedAmounts[Field.CURRENCY_B]) {
diff --git a/apps/web/src/state/burn/v3/hooks.tsx b/apps/web/src/state/burn/v3/hooks.tsx
index 981381d5039..f4d26353046 100644
--- a/apps/web/src/state/burn/v3/hooks.tsx
+++ b/apps/web/src/state/burn/v3/hooks.tsx
@@ -1,6 +1,5 @@
import { Currency, CurrencyAmount, Percent } from '@uniswap/sdk-core'
import { Position } from '@uniswap/v3-sdk'
-import { ConnectWalletButtonText } from 'components/NavBar/accountCTAsExperimentUtils'
import { useToken } from 'hooks/Tokens'
import { useAccount } from 'hooks/useAccount'
import { usePool } from 'hooks/usePools'
@@ -10,6 +9,8 @@ import { selectPercent } from 'state/burn/v3/actions'
import { useAppDispatch, useAppSelector } from 'state/hooks'
import { InterfaceState } from 'state/webReducer'
import { PositionDetails } from 'types/position'
+import { AccountCTAsExperimentGroup, Experiments } from 'uniswap/src/features/gating/experiments'
+import { useExperimentGroupName } from 'uniswap/src/features/gating/hooks'
import { Trans } from 'uniswap/src/i18n'
import { unwrappedToken } from 'utils/unwrappedToken'
@@ -74,9 +75,19 @@ export function useDerivedV3BurnInfo(
const outOfRange =
pool && position ? pool.tickCurrent < position.tickLower || pool.tickCurrent > position.tickUpper : false
+ const accountsCTAExperimentGroup = useExperimentGroupName(Experiments.AccountCTAs)
+ const isSignIn = accountsCTAExperimentGroup === AccountCTAsExperimentGroup.SignInSignUp
+ const isLogIn = accountsCTAExperimentGroup === AccountCTAsExperimentGroup.LogInCreateAccount
+
let error: ReactNode | undefined
if (!account.isConnected) {
- error =
+ error = isSignIn ? (
+
+ ) : isLogIn ? (
+
+ ) : (
+
+ )
}
if (percent === 0) {
error = error ??
diff --git a/apps/web/src/state/claim/hooks.ts b/apps/web/src/state/claim/hooks.ts
index 04ac7f48049..38716dd5fb2 100644
--- a/apps/web/src/state/claim/hooks.ts
+++ b/apps/web/src/state/claim/hooks.ts
@@ -179,7 +179,7 @@ export function useClaimCallback(address: string | null | undefined): {
const claimCallback = async function () {
if (!claimData || !address || !provider || !account.chainId || !distributorContract) {
- return undefined
+ return
}
const args = [claimData.index, address, claimData.amount, claimData.proof]
diff --git a/apps/web/src/state/fiatOnRampTransactions/types.ts b/apps/web/src/state/fiatOnRampTransactions/types.ts
index 5522d57ab06..fa36557bf9b 100644
--- a/apps/web/src/state/fiatOnRampTransactions/types.ts
+++ b/apps/web/src/state/fiatOnRampTransactions/types.ts
@@ -7,7 +7,6 @@ export enum FiatOnRampTransactionStatus {
FAILED = 'FAILED',
}
-// eslint-disable-next-line consistent-return
export function backendStatusToFiatOnRampStatus(status: TransactionStatus) {
switch (status) {
case TransactionStatus.Confirmed:
diff --git a/apps/web/src/state/index.ts b/apps/web/src/state/index.ts
index 4dfd196a592..b942e103050 100644
--- a/apps/web/src/state/index.ts
+++ b/apps/web/src/state/index.ts
@@ -8,7 +8,6 @@ import { sentryEnhancer } from 'state/logging'
import { INDEXED_DB_REDUX_TABLE_NAME, PERSIST_VERSION, customCreateMigrate, migrations } from 'state/migrations'
import { quickRouteApi } from 'state/routing/quickRouteSlice'
import { routingApi } from 'state/routing/slice'
-import { rootWebSaga } from 'state/sagas/root'
import { InterfaceState, interfacePersistedStateList, interfaceReducer } from 'state/webReducer'
import { fiatOnRampAggregatorApi } from 'uniswap/src/features/fiatOnRamp/api'
import { isDevEnv, isTestEnv } from 'utilities/src/environment/env'
@@ -33,10 +32,8 @@ const persistConfig: PersistConfig = {
const persistedReducer = persistReducer(persistConfig, interfaceReducer)
-const sagaMiddleware = createSagaMiddleware()
-
export function createDefaultStore() {
- const store = configureStore({
+ return configureStore({
reducer: persistedReducer,
enhancers: (defaultEnhancers) => defaultEnhancers.concat(sentryEnhancer),
middleware: (getDefaultMiddleware) =>
@@ -67,11 +64,8 @@ export function createDefaultStore() {
.concat(routingApi.middleware)
.concat(quickRouteApi.middleware)
.concat(fiatOnRampAggregatorApi.middleware)
- .concat(sagaMiddleware),
+ .concat(createSagaMiddleware()),
})
- sagaMiddleware.run(rootWebSaga)
-
- return store
}
const store = createDefaultStore()
diff --git a/apps/web/src/state/limit/expiryToDeadlineSeconds.ts b/apps/web/src/state/limit/expiryToDeadlineSeconds.ts
index d970cb995ce..7ef50d99ab4 100644
--- a/apps/web/src/state/limit/expiryToDeadlineSeconds.ts
+++ b/apps/web/src/state/limit/expiryToDeadlineSeconds.ts
@@ -3,7 +3,6 @@ import { LimitsExpiry } from 'uniswap/src/types/limits'
const DAY_SECS = ms('1d') / 1000
-// eslint-disable-next-line consistent-return
export function expiryToDeadlineSeconds(expiry: LimitsExpiry): number {
switch (expiry) {
case LimitsExpiry.Day:
diff --git a/apps/web/src/state/limit/hooks.ts b/apps/web/src/state/limit/hooks.ts
index 492f31d31d3..e2b61034968 100644
--- a/apps/web/src/state/limit/hooks.ts
+++ b/apps/web/src/state/limit/hooks.ts
@@ -1,4 +1,5 @@
import { Currency, CurrencyAmount, Price, TradeType } from '@uniswap/sdk-core'
+import { Field } from 'components/swap/constants'
import { isStablecoin } from 'constants/chains'
import { useAccount } from 'hooks/useAccount'
import JSBI from 'jsbi'
@@ -15,11 +16,10 @@ import { useSwapAndLimitContext } from 'state/swap/useSwapContext'
import { nativeOnChain } from 'uniswap/src/constants/tokens'
import { FeatureFlags } from 'uniswap/src/features/gating/flags'
import { useFeatureFlag } from 'uniswap/src/features/gating/hooks'
-import { CurrencyField } from 'uniswap/src/types/currency'
export type LimitInfo = {
- currencyBalances: { [field in CurrencyField]?: CurrencyAmount }
- parsedAmounts: { [field in CurrencyField]?: CurrencyAmount }
+ currencyBalances: { [field in Field]?: CurrencyAmount }
+ parsedAmounts: { [field in Field]?: CurrencyAmount }
parsedLimitPrice?: Price
limitOrderTrade?: LimitOrderTrade
marketPrice?: Price
@@ -55,8 +55,8 @@ export function useDerivedLimitInfo(state: LimitState, setState: Dispatch ({
- [CurrencyField.INPUT]: relevantTokenBalances[0],
- [CurrencyField.OUTPUT]: relevantTokenBalances[1],
+ [Field.INPUT]: relevantTokenBalances[0],
+ [Field.OUTPUT]: relevantTokenBalances[1],
}),
[relevantTokenBalances],
)
@@ -100,8 +100,8 @@ export function useDerivedLimitInfo(state: LimitState, setState: Dispatch }
+ parsedAmounts: { [field in Field]?: CurrencyAmount }
outputAmount?: CurrencyAmount
swapFee?: SwapFeeInfo
}) {
@@ -185,10 +185,10 @@ function useLimitOrderTrade({
}, [account.address, inputCurrency, trade])
const limitOrderTrade = useMemo(() => {
- if (!inputCurrency || !parsedAmounts?.[CurrencyField.INPUT] || !account.address || !outputAmount || !wrapInfo) {
+ if (!inputCurrency || !parsedAmounts?.[Field.INPUT] || !account.address || !outputAmount || !wrapInfo) {
return undefined
}
- const amountIn = CurrencyAmount.fromRawAmount(inputCurrency.wrapped, parsedAmounts?.[CurrencyField.INPUT].quotient)
+ const amountIn = CurrencyAmount.fromRawAmount(inputCurrency.wrapped, parsedAmounts?.[Field.INPUT].quotient)
return new LimitOrderTrade({
amountIn,
amountOut: outputAmount,
diff --git a/apps/web/src/state/migrations/14.ts b/apps/web/src/state/migrations/14.ts
index 8e12ba6dd81..c5523feaf17 100644
--- a/apps/web/src/state/migrations/14.ts
+++ b/apps/web/src/state/migrations/14.ts
@@ -12,7 +12,7 @@ export const hideSpamBalancesAtomName = 'hideSpamBalances'
*/
export const migration14 = (state: PersistAppStateV14 | undefined) => {
if (!state) {
- return undefined
+ return
}
const newState: any = { ...state }
diff --git a/apps/web/src/state/migrations/15.ts b/apps/web/src/state/migrations/15.ts
index ebd9b8dab96..c0ae928266d 100644
--- a/apps/web/src/state/migrations/15.ts
+++ b/apps/web/src/state/migrations/15.ts
@@ -47,7 +47,7 @@ function webResultToUniswapResult(webItem: TokenSearchResultWeb): SearchResult |
*/
export const migration15 = (state: PersistAppStateV15 | undefined) => {
if (!state) {
- return undefined
+ return
}
const newState: any = { ...state }
diff --git a/apps/web/src/state/migrations/16.ts b/apps/web/src/state/migrations/16.ts
index f0ca60f7160..c12920a2e6f 100644
--- a/apps/web/src/state/migrations/16.ts
+++ b/apps/web/src/state/migrations/16.ts
@@ -15,7 +15,7 @@ export type PersistAppStateV16 = {
*/
export const migration16 = (state: PersistAppStateV16 | undefined) => {
if (!state) {
- return undefined
+ return
}
const newState: any = { ...state }
diff --git a/apps/web/src/state/migrations/17.ts b/apps/web/src/state/migrations/17.ts
index 8eb4760636c..640804ad58d 100644
--- a/apps/web/src/state/migrations/17.ts
+++ b/apps/web/src/state/migrations/17.ts
@@ -15,7 +15,7 @@ export type PersistAppStateV17 = {
*/
export const migration17 = (state: PersistAppStateV17 | undefined) => {
if (!state) {
- return undefined
+ return
}
const newState: any = { ...state }
diff --git a/apps/web/src/state/migrations/18.ts b/apps/web/src/state/migrations/18.ts
index e9e3cef0c5a..37bb861d2ef 100644
--- a/apps/web/src/state/migrations/18.ts
+++ b/apps/web/src/state/migrations/18.ts
@@ -13,7 +13,7 @@ export type PersistAppStateV18 = {
*/
export const migration18 = (state: PersistAppStateV18 | undefined) => {
if (!state?.userSettings) {
- return undefined
+ return
}
const newState: any = { ...state }
diff --git a/apps/web/src/state/migrations/19.ts b/apps/web/src/state/migrations/19.ts
index 3afe1a064a9..9d5a7f3ce98 100644
--- a/apps/web/src/state/migrations/19.ts
+++ b/apps/web/src/state/migrations/19.ts
@@ -16,7 +16,7 @@ export type PersistAppStateV19 = {
*/
export const migration19 = (state: PersistAppStateV19 | undefined) => {
if (!state) {
- return undefined
+ return
}
// Copy state
diff --git a/apps/web/src/state/migrations/20.ts b/apps/web/src/state/migrations/20.ts
index dcf248c40ea..4f82071b2b7 100644
--- a/apps/web/src/state/migrations/20.ts
+++ b/apps/web/src/state/migrations/20.ts
@@ -14,7 +14,7 @@ export const activeLocalCurrencyAtomName = 'activeLocalCurrency'
*/
export const migration20 = (state: PersistAppStateV20 | undefined) => {
if (!state) {
- return undefined
+ return
}
// Translate existing atom value
const atomLocalCurrencyAtomValue = localStorage.getItem(activeLocalCurrencyAtomName) as FiatCurrency
diff --git a/apps/web/src/state/mint/hooks.tsx b/apps/web/src/state/mint/hooks.tsx
index 941b516031a..9bb1d08162d 100644
--- a/apps/web/src/state/mint/hooks.tsx
+++ b/apps/web/src/state/mint/hooks.tsx
@@ -1,6 +1,5 @@
import { Currency, CurrencyAmount, Percent, Price, Token } from '@uniswap/sdk-core'
import { Pair } from '@uniswap/v2-sdk'
-import { ConnectWalletButtonText } from 'components/NavBar/accountCTAsExperimentUtils'
import { useAccount } from 'hooks/useAccount'
import { useTotalSupply } from 'hooks/useTotalSupply'
import { PairState, useV2Pair } from 'hooks/useV2Pairs'
@@ -11,6 +10,8 @@ import { useCurrencyBalances } from 'state/connection/hooks'
import { useAppDispatch, useAppSelector } from 'state/hooks'
import { Field, typeInput } from 'state/mint/actions'
import { InterfaceState } from 'state/webReducer'
+import { AccountCTAsExperimentGroup, Experiments } from 'uniswap/src/features/gating/experiments'
+import { useExperimentGroupName } from 'uniswap/src/features/gating/hooks'
import { Trans } from 'uniswap/src/i18n'
import { logger } from 'utilities/src/logger/logger'
@@ -182,9 +183,19 @@ export function useDerivedMintInfo(
}
}, [liquidityMinted, totalSupply])
+ const accountsCTAExperimentGroup = useExperimentGroupName(Experiments.AccountCTAs)
+ const isSignIn = accountsCTAExperimentGroup === AccountCTAsExperimentGroup.SignInSignUp
+ const isLogIn = accountsCTAExperimentGroup === AccountCTAsExperimentGroup.LogInCreateAccount
+
let error: ReactNode | undefined
if (!account.isConnected) {
- error =
+ error = isSignIn ? (
+
+ ) : isLogIn ? (
+
+ ) : (
+
+ )
}
if (pairState === PairState.INVALID) {
diff --git a/apps/web/src/state/mint/v3/hooks.tsx b/apps/web/src/state/mint/v3/hooks.tsx
index 24e91a054c3..2f1c4da3a0e 100644
--- a/apps/web/src/state/mint/v3/hooks.tsx
+++ b/apps/web/src/state/mint/v3/hooks.tsx
@@ -10,7 +10,6 @@ import {
priceToClosestTick,
tickToPrice,
} from '@uniswap/v3-sdk'
-import { ConnectWalletButtonText } from 'components/NavBar/accountCTAsExperimentUtils'
import { BIG_INT_ZERO } from 'constants/misc'
import { useAccount } from 'hooks/useAccount'
import { PoolState, usePool } from 'hooks/usePools'
@@ -32,6 +31,8 @@ import {
} from 'state/mint/v3/actions'
import { tryParseTick } from 'state/mint/v3/utils'
import { InterfaceState } from 'state/webReducer'
+import { AccountCTAsExperimentGroup, Experiments } from 'uniswap/src/features/gating/experiments'
+import { useExperimentGroupName } from 'uniswap/src/features/gating/hooks'
import { Trans } from 'uniswap/src/i18n'
import { getTickToPrice } from 'utils/getTickToPrice'
@@ -449,9 +450,19 @@ export function useV3DerivedMintInfo(
tickUpper,
])
+ const accountsCTAExperimentGroup = useExperimentGroupName(Experiments.AccountCTAs)
+ const isSignIn = accountsCTAExperimentGroup === AccountCTAsExperimentGroup.SignInSignUp
+ const isLogIn = accountsCTAExperimentGroup === AccountCTAsExperimentGroup.LogInCreateAccount
+
let errorMessage: ReactNode | undefined
if (!account.isConnected) {
- errorMessage =
+ errorMessage = isSignIn ? (
+
+ ) : isLogIn ? (
+
+ ) : (
+
+ )
}
if (poolState === PoolState.INVALID) {
diff --git a/apps/web/src/state/routing/slice.ts b/apps/web/src/state/routing/slice.ts
index e88e03e3746..f1e88045a54 100644
--- a/apps/web/src/state/routing/slice.ts
+++ b/apps/web/src/state/routing/slice.ts
@@ -1,5 +1,6 @@
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'
import { Protocol } from '@uniswap/router-sdk'
+import { isUniswapXSupportedChain } from 'constants/chains'
import ms from 'ms'
import {
ClassicAPIConfig,
@@ -14,7 +15,6 @@ import {
URAQuoteResponse,
URAQuoteType,
UniswapXConfig,
- UniswapXPriorityOrdersConfig,
UniswapXv2Config,
} from 'state/routing/types'
import { isExactInput, transformQuoteToTrade } from 'state/routing/utils'
@@ -44,6 +44,7 @@ const DEFAULT_QUERY_PARAMS = {
function getRoutingAPIConfig(args: GetQuoteArgs): RoutingConfig {
const {
account,
+ tokenInChainId,
uniswapXForceSyntheticQuotes,
routerPreference,
protocolPreferences,
@@ -52,8 +53,6 @@ function getRoutingAPIConfig(args: GetQuoteArgs): RoutingConfig {
forceOpenOrders,
deadlineBufferSecs,
isXv2Arbitrum,
- isPriorityOrder,
- isUniswapXSupportedChain,
} = args
const uniswapX: UniswapXConfig = {
@@ -62,11 +61,6 @@ function getRoutingAPIConfig(args: GetQuoteArgs): RoutingConfig {
routingType: URAQuoteType.DUTCH_V1,
}
- const uniswapXPriorityOrders: UniswapXPriorityOrdersConfig = {
- routingType: URAQuoteType.PRIORITY,
- swapper: account,
- }
-
const uniswapXv2: UniswapXv2Config = {
useSyntheticQuotes: uniswapXForceSyntheticQuotes || isXv2Arbitrum,
swapper: account,
@@ -92,12 +86,12 @@ function getRoutingAPIConfig(args: GetQuoteArgs): RoutingConfig {
// If the user has opted out of UniswapX during the opt-out transition period, we should respect that preference and only request classic quotes.
routerPreference === RouterPreference.API ||
routerPreference === INTERNAL_ROUTER_PREFERENCE_PRICE ||
- !isUniswapXSupportedChain
+ (!isUniswapXSupportedChain(tokenInChainId) && !isXv2Arbitrum)
) {
return [classic]
}
- return [isPriorityOrder ? uniswapXPriorityOrders : isXv2 || isXv2Arbitrum ? uniswapXv2 : uniswapX, classic]
+ return [isXv2 || isXv2Arbitrum ? uniswapXv2 : uniswapX, classic]
}
export const routingApi = createApi({
diff --git a/apps/web/src/state/routing/types.ts b/apps/web/src/state/routing/types.ts
index df471da34b2..ee8c9e14e4b 100644
--- a/apps/web/src/state/routing/types.ts
+++ b/apps/web/src/state/routing/types.ts
@@ -6,10 +6,7 @@ import {
DutchOrderInfo,
DutchOrderInfoJSON,
DutchOrderTrade as IDutchOrderTrade,
- PriorityOrderTrade as IPriorityOrderTrade,
V2DutchOrderTrade as IV2DutchOrderTrade,
- UnsignedPriorityOrderInfo,
- UnsignedPriorityOrderInfoJSON,
UnsignedV2DutchOrderInfo,
UnsignedV2DutchOrderInfoJSON,
} from '@uniswap/uniswapx-sdk'
@@ -74,8 +71,6 @@ export interface GetQuoteArgs {
forceOpenOrders: boolean
deadlineBufferSecs: number
arbitrumXV2SlippageTolerance: string
- isPriorityOrder: boolean
- isUniswapXSupportedChain: boolean
}
export type GetQuickQuoteArgs = {
@@ -192,24 +187,6 @@ export type URADutchOrderV2QuoteData = {
portionRecipient?: string
}
-// from `PriorityQuoteDataJSON` in https://github.com/Uniswap/backend/blob/main/packages/services/unified-routing-api/lib/entities/quote/PriorityQuote.ts
-export type URAPriorityOrderQuoteData = {
- orderInfo: UnsignedPriorityOrderInfoJSON
- startTimeBufferSecs: number // ignore for priority order
- deadlineBufferSecs: number // ignore for priority order
- amountInMpsPerPriorityFeeWei: number
- amountOutMpsPerPriorityFeeWei: number
- permitData: PermitTransferFromData
- quoteId: string
- requestId: string
- encodedOrder: string
- orderHash: string
- slippageTolerance: string
- portionBips?: number
- portionAmount?: string
- portionRecipient?: string
-}
-
type URADutchOrderQuoteResponse = {
routing: URAQuoteType.DUTCH_V1
quote: URADutchOrderQuoteData
@@ -225,16 +202,7 @@ type URAClassicQuoteResponse = {
quote: ClassicQuoteData
allQuotes: Array
}
-type URAPriorityOrderQuoteResponse = {
- routing: URAQuoteType.PRIORITY
- quote: URAPriorityOrderQuoteData
- allQuotes: Array
-}
-export type URAQuoteResponse =
- | URAClassicQuoteResponse
- | URADutchOrderQuoteResponse
- | URADutchOrderV2QuoteResponse
- | URAPriorityOrderQuoteResponse
+export type URAQuoteResponse = URAClassicQuoteResponse | URADutchOrderQuoteResponse | URADutchOrderV2QuoteResponse
export type QuickRouteResponse = {
tokenIn: {
@@ -365,7 +333,6 @@ export enum OffchainOrderType {
DUTCH_V2_AUCTION = 'Dutch_V2',
LIMIT_ORDER = 'Limit',
DUTCH_V1_AND_V2 = 'Dutch_V1_V2', // Only used for GET /orders queries. Returns both Dutch V1 and V2 orders.
- PRIORITY_ORDER = 'Priority',
}
export class DutchOrderTrade extends IDutchOrderTrade {
@@ -530,81 +497,6 @@ export class V2DutchOrderTrade extends IV2DutchOrderTrade {
- public readonly fillType = TradeFillType.UniswapX
- public readonly offchainOrderType = OffchainOrderType.PRIORITY_ORDER
-
- quoteId?: string
- requestId?: string
- wrapInfo: WrapInfo
- approveInfo: ApproveInfo
- // The gas estimate of the reference classic trade, if there is one.
- classicGasUseEstimateUSD?: number
- startTimeBufferSecs: number
- deadlineBufferSecs: number
- slippageTolerance: Percent
-
- inputTax = ZERO_PERCENT
- outputTax = ZERO_PERCENT
- swapFee: SwapFeeInfo | undefined
-
- constructor({
- currencyIn,
- currenciesOut,
- orderInfo,
- tradeType,
- quoteId,
- requestId,
- wrapInfo,
- approveInfo,
- classicGasUseEstimateUSD,
- startTimeBufferSecs,
- deadlineBufferSecs,
- slippageTolerance,
- swapFee,
- }: {
- currencyIn: Currency
- currenciesOut: Currency[]
- orderInfo: UnsignedPriorityOrderInfo
- tradeType: TradeType
- quoteId?: string
- requestId?: string
- approveInfo: ApproveInfo
- wrapInfo: WrapInfo
- classicGasUseEstimateUSD?: number
- startTimeBufferSecs: number
- deadlineBufferSecs: number
- slippageTolerance: Percent
- swapFee?: SwapFeeInfo
- }) {
- super({ currencyIn, currenciesOut, orderInfo, tradeType })
- this.quoteId = quoteId
- this.requestId = requestId
- this.approveInfo = approveInfo
- this.wrapInfo = wrapInfo
- this.classicGasUseEstimateUSD = classicGasUseEstimateUSD
- this.deadlineBufferSecs = deadlineBufferSecs
- this.slippageTolerance = slippageTolerance
- this.startTimeBufferSecs = startTimeBufferSecs
- this.swapFee = swapFee
- }
-
- public get totalGasUseEstimateUSD(): number {
- if (this.wrapInfo.needsWrap && this.approveInfo.needsApprove) {
- return this.wrapInfo.wrapGasEstimateUSD + this.approveInfo.approveGasEstimateUSD
- }
-
- if (this.wrapInfo.needsWrap) {
- return this.wrapInfo.wrapGasEstimateUSD
- }
- if (this.approveInfo.needsApprove) {
- return this.approveInfo.approveGasEstimateUSD
- }
-
- return 0
- }
-}
-
export class PreviewTrade {
public readonly fillType = TradeFillType.None
public readonly quoteMethod = QuoteMethod.QUICK_ROUTE
@@ -853,7 +745,7 @@ export class LimitOrderTrade {
}
}
-export type SubmittableTrade = ClassicTrade | DutchOrderTrade | V2DutchOrderTrade | LimitOrderTrade | PriorityOrderTrade
+export type SubmittableTrade = ClassicTrade | DutchOrderTrade | V2DutchOrderTrade | LimitOrderTrade
export type InterfaceTrade = SubmittableTrade | PreviewTrade
export enum QuoteState {
@@ -914,10 +806,9 @@ export enum URAQuoteType {
CLASSIC = 'CLASSIC',
DUTCH_V1 = 'DUTCH_LIMIT', // "dutch limit" refers to dutch. Fully separate from "limit orders"
DUTCH_V2 = 'DUTCH_V2',
- PRIORITY = 'PRIORITY',
}
-/* Config types should match URA config schemas https://github.com/Uniswap/backend/blob/main/packages/services/unified-routing-api/lib/util/validator.ts */
+/* Config types should match URA config schemas `classicConfig`, `dutchLimitConfig`, and `dutchV2Config` at https://github.com/Uniswap/unified-routing-api/blob/main/lib/util/validator.ts */
export type ClassicAPIConfig = {
routingType: URAQuoteType.CLASSIC
@@ -962,13 +853,4 @@ export type UniswapXv2Config = {
slippageTolerance?: string
}
-export type UniswapXPriorityOrdersConfig = {
- routingType: URAQuoteType.PRIORITY
- swapper?: string
- mpsPerPriorityFeeWei?: number
- baselinePriorityFeeWei?: number
- startTimeBufferSecs?: number
- deadlineBufferSecs?: number
-}
-
-export type RoutingConfig = (UniswapXConfig | UniswapXv2Config | ClassicAPIConfig | UniswapXPriorityOrdersConfig)[]
+export type RoutingConfig = (UniswapXConfig | UniswapXv2Config | ClassicAPIConfig)[]
diff --git a/apps/web/src/state/routing/useRoutingAPITrade.test.ts b/apps/web/src/state/routing/useRoutingAPITrade.test.ts
index 9bdd8566c05..d313b0913ba 100644
--- a/apps/web/src/state/routing/useRoutingAPITrade.test.ts
+++ b/apps/web/src/state/routing/useRoutingAPITrade.test.ts
@@ -81,8 +81,6 @@ const MOCK_ARGS: GetQuoteArgs = {
deadlineBufferSecs: 0,
arbitrumXV2SlippageTolerance: undefined as any,
protocolPreferences: undefined,
- isPriorityOrder: false,
- isUniswapXSupportedChain: true,
}
describe('#useRoutingAPITrade ExactIn', () => {
diff --git a/apps/web/src/state/routing/utils.test.ts b/apps/web/src/state/routing/utils.test.ts
index 0c299c074f7..7ce882d9a02 100644
--- a/apps/web/src/state/routing/utils.test.ts
+++ b/apps/web/src/state/routing/utils.test.ts
@@ -43,8 +43,6 @@ function constructArgs(currencyIn: Currency, currencyOut: Currency, isXv2?: bool
forceOpenOrders: false,
deadlineBufferSecs: 30,
arbitrumXV2SlippageTolerance: '0.5',
- isPriorityOrder: false,
- isUniswapXSupportedChain: true,
}
}
diff --git a/apps/web/src/state/routing/utils.ts b/apps/web/src/state/routing/utils.ts
index 1c6626f015a..a506f9e8e8d 100644
--- a/apps/web/src/state/routing/utils.ts
+++ b/apps/web/src/state/routing/utils.ts
@@ -5,9 +5,6 @@ import {
DutchOrderInfo,
DutchOrderInfoJSON,
DutchOutputJSON,
- PriorityOutputJSON,
- UnsignedPriorityOrderInfo,
- UnsignedPriorityOrderInfoJSON,
UnsignedV2DutchOrderInfo,
UnsignedV2DutchOrderInfoJSON,
} from '@uniswap/uniswapx-sdk'
@@ -26,7 +23,6 @@ import {
OffchainOrderType,
PoolType,
PreviewTrade,
- PriorityOrderTrade,
QuickRouteResponse,
QuoteMethod,
QuoteState,
@@ -39,7 +35,6 @@ import {
TradeResult,
URADutchOrderQuoteData,
URADutchOrderV2QuoteData,
- URAPriorityOrderQuoteData,
URAQuoteResponse,
URAQuoteType,
V2DutchOrderTrade,
@@ -95,7 +90,7 @@ export function computeRoutes(args: GetQuoteArgs, routes: ClassicQuoteData['rout
})
} catch (e) {
logger.warn('routing/utils', 'computeRoutes', 'Failed to compute routes', { error: e })
- return undefined
+ return
}
}
@@ -147,28 +142,6 @@ function toUnsignedV2DutchOrderInfo(orderInfoJSON: UnsignedV2DutchOrderInfoJSON)
}
}
-function toUnsignedPriorityOrderInfo(orderInfoJSON: UnsignedPriorityOrderInfoJSON): UnsignedPriorityOrderInfo {
- const { nonce, auctionStartBlock, baselinePriorityFeeWei, input, outputs } = orderInfoJSON
-
- return {
- ...orderInfoJSON,
- nonce: BigNumber.from(nonce),
- auctionStartBlock: BigNumber.from(auctionStartBlock),
- baselinePriorityFeeWei: BigNumber.from(baselinePriorityFeeWei),
-
- input: {
- ...input,
- amount: BigNumber.from(input.amount),
- mpsPerPriorityFeeWei: BigNumber.from(input.mpsPerPriorityFeeWei),
- },
- outputs: outputs.map((output: PriorityOutputJSON) => ({
- ...output,
- amount: BigNumber.from(output.amount),
- mpsPerPriorityFeeWei: BigNumber.from(output.mpsPerPriorityFeeWei),
- })),
- }
-}
-
// Prepares the currencies used for the actual Swap (either UniswapX or Universal Router)
// May not match `currencyIn` that the user selected because for ETH inputs in UniswapX, the actual
// swap will use WETH.
@@ -223,7 +196,7 @@ function getTradeCurrencies(
}
function getSwapFee(
- data: ClassicQuoteData | URADutchOrderQuoteData | URADutchOrderV2QuoteData | URAPriorityOrderQuoteData,
+ data: ClassicQuoteData | URADutchOrderQuoteData | URADutchOrderV2QuoteData,
): SwapFeeInfo | undefined {
const { portionAmount, portionBips, portionRecipient } = data
@@ -291,8 +264,7 @@ export async function transformQuoteToTrade(
const { tradeType, needsWrapIfUniswapX, isXv2, routerPreference, account, amount } = args
const showUniswapXTrade =
- ((isXv2 ? data.routing === URAQuoteType.DUTCH_V2 : data.routing === URAQuoteType.DUTCH_V1) ||
- data.routing === URAQuoteType.PRIORITY) &&
+ (isXv2 ? data.routing === URAQuoteType.DUTCH_V2 : data.routing === URAQuoteType.DUTCH_V1) &&
routerPreference === RouterPreference.X
const [currencyIn, currencyOut] = getTradeCurrencies(args, showUniswapXTrade)
@@ -341,11 +313,7 @@ export async function transformQuoteToTrade(
})
// If the top-level URA quote type is DUTCH_V1 or DUTCH_V2, then UniswapX is better for the user
- // Or if quote type is PRIORITY, we only use UniswapX
- const isUniswapXBetter =
- data.routing === URAQuoteType.DUTCH_V1 ||
- data.routing === URAQuoteType.DUTCH_V2 ||
- data.routing === URAQuoteType.PRIORITY
+ const isUniswapXBetter = data.routing === URAQuoteType.DUTCH_V1 || data.routing === URAQuoteType.DUTCH_V2
if (isUniswapXBetter) {
const swapFee = getSwapFee(data.quote)
const wrapInfo = await getWrapInfo(needsWrapIfUniswapX, account, currencyIn.chainId, amount, usdCostPerGas)
@@ -395,26 +363,6 @@ export async function transformQuoteToTrade(
state: QuoteState.SUCCESS,
trade: uniswapXTrade,
}
- } else if (data.routing === URAQuoteType.PRIORITY) {
- const orderInfo = toUnsignedPriorityOrderInfo(data.quote.orderInfo)
- const priorityOrderTrade = new PriorityOrderTrade({
- currencyIn,
- currenciesOut: [currencyOut],
- orderInfo,
- tradeType,
- approveInfo,
- wrapInfo,
- startTimeBufferSecs: data.quote.startTimeBufferSecs,
- deadlineBufferSecs: data.quote.deadlineBufferSecs,
- slippageTolerance: toSlippagePercent(data.quote.slippageTolerance),
- classicGasUseEstimateUSD: classicTrade.totalGasUseEstimateUSD,
- swapFee,
- })
-
- return {
- state: QuoteState.SUCCESS,
- trade: priorityOrderTrade,
- }
}
}
@@ -487,19 +435,16 @@ export function isUniswapXTradeType(
export function isUniswapXTrade(
trade?: InterfaceTrade,
-): trade is DutchOrderTrade | V2DutchOrderTrade | LimitOrderTrade | PriorityOrderTrade {
+): trade is DutchOrderTrade | V2DutchOrderTrade | LimitOrderTrade {
return isUniswapXTradeType(trade?.fillType)
}
/* Returns true if trade is a SWAP on UniswapX, not a limit order */
-export function isUniswapXSwapTrade(
- trade?: InterfaceTrade,
-): trade is DutchOrderTrade | V2DutchOrderTrade | PriorityOrderTrade {
+export function isUniswapXSwapTrade(trade?: InterfaceTrade): trade is DutchOrderTrade | V2DutchOrderTrade {
return (
isUniswapXTrade(trade) &&
(trade?.offchainOrderType === OffchainOrderType.DUTCH_AUCTION ||
- trade?.offchainOrderType === OffchainOrderType.DUTCH_V2_AUCTION ||
- trade?.offchainOrderType === OffchainOrderType.PRIORITY_ORDER)
+ trade?.offchainOrderType === OffchainOrderType.DUTCH_V2_AUCTION)
)
}
diff --git a/apps/web/src/state/sagas/root.ts b/apps/web/src/state/sagas/root.ts
deleted file mode 100644
index c70f5bfbaf7..00000000000
--- a/apps/web/src/state/sagas/root.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { PersistState } from 'redux-persist'
-import { swapSaga } from 'state/sagas/transactions/swapSaga'
-import { wrapSaga } from 'state/sagas/transactions/wrapSaga'
-import { delay, select, spawn } from 'typed-redux-saga'
-
-const sagas = [swapSaga.wrappedSaga, wrapSaga.wrappedSaga]
-
-export function* rootWebSaga() {
- // wait until redux-persist has finished rehydration
- while (true) {
- if (yield* select((state: { _persist?: PersistState }): boolean | undefined => state._persist?.rehydrated)) {
- break
- }
- yield* delay(/* REHYDRATION_STATUS_POLLING_INTERVAL */ 50)
- }
-
- for (const wrappedSaga of sagas) {
- yield* spawn(wrappedSaga)
- }
-}
diff --git a/apps/web/src/state/sagas/transactions/swapSaga.ts b/apps/web/src/state/sagas/transactions/swapSaga.ts
deleted file mode 100644
index 955fda5388b..00000000000
--- a/apps/web/src/state/sagas/transactions/swapSaga.ts
+++ /dev/null
@@ -1,319 +0,0 @@
-/* eslint-disable rulesdir/no-undefined-or */
-import { TransactionResponse } from '@ethersproject/providers'
-import { SwapEventName } from '@uniswap/analytics-events'
-import { useTotalBalancesUsdForAnalytics } from 'graphql/data/apollo/useTotalBalancesUsdForAnalytics'
-import { useAccount } from 'hooks/useAccount'
-import useSelectChain from 'hooks/useSelectChain'
-import { formatSwapSignedAnalyticsEventProperties } from 'lib/utils/analytics'
-import { useCallback } from 'react'
-import { useDispatch, useSelector } from 'react-redux'
-import { PopupType, addPopup } from 'state/application/reducer'
-import { handleUniswapXSignatureStep } from 'state/sagas/transactions/uniswapx'
-import {
- HandleOnChainStepParams,
- getSwapTransactionInfo,
- handleApprovalTransactionStep,
- handleOnChainStep,
- handleSignatureStep,
-} from 'state/sagas/transactions/utils'
-import { handleWrapStep } from 'state/sagas/transactions/wrapSaga'
-import invariant from 'tiny-invariant'
-import { call, put } from 'typed-redux-saga'
-import { Routing } from 'uniswap/src/data/tradingApi/__generated__/index'
-import { SignerMnemonicAccountMeta } from 'uniswap/src/features/accounts/types'
-import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext'
-import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send'
-import { selectSwapStartTimestamp } from 'uniswap/src/features/timing/selectors'
-import { updateSwapStartTimestamp } from 'uniswap/src/features/timing/slice'
-import { getBaseTradeAnalyticsProperties } from 'uniswap/src/features/transactions/swap/analytics'
-import {
- SetCurrentStepFn,
- SwapCallback,
- SwapCallbackParams,
-} from 'uniswap/src/features/transactions/swap/types/swapCallback'
-import {
- ValidatedClassicSwapTxAndGasInfo,
- ValidatedSwapTxContext,
- ValidatedUniswapXSwapTxAndGasInfo,
-} from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo'
-import { ClassicTrade } from 'uniswap/src/features/transactions/swap/types/trade'
-import {
- SwapTransactionStep,
- SwapTransactionStepAsync,
- TransactionStep,
- TransactionStepType,
- generateTransactionSteps,
-} from 'uniswap/src/features/transactions/swap/utils/generateTransactionSteps'
-import { isClassic } from 'uniswap/src/features/transactions/swap/utils/routing'
-import { getClassicQuoteFromResponse } from 'uniswap/src/features/transactions/swap/utils/tradingApi'
-import { createSaga } from 'uniswap/src/utils/saga'
-import { percentFromFloat } from 'utilities/src/format/percent'
-import { logger } from 'utilities/src/logger/logger'
-
-// TODO(WEB-4921): Move errors to uniswap package and handle them in UI
-class UnexpectedSwapStateError extends Error {
- constructor(message: string) {
- super(message)
- this.name = 'UnexpectedSwapStateError'
- }
-}
-
-interface HandleSwapStepParams extends Omit {
- step: SwapTransactionStep | SwapTransactionStepAsync
- signature: string | undefined
- trade: ClassicTrade
- analytics: ReturnType
-}
-function* handleSwapTransactionStep(params: HandleSwapStepParams) {
- const { trade, step, signature, analytics } = params
- const info = getSwapTransactionInfo(trade)
- const txRequest = yield* call(getSwapTxRequest, step, signature)
-
- const onModification = (response: TransactionResponse) => {
- sendAnalyticsEvent(SwapEventName.SWAP_MODIFIED_IN_WALLET, {
- txHash: response.hash,
- expected: txRequest.data?.toString() ?? '',
- actual: response.data,
- })
- }
-
- // Now that we have the txRequest, we can create a definitive SwapTransactionStep, incase we started with an async step.
- const onChainStep = { ...step, txRequest }
- const hash = yield* call(handleOnChainStep, { ...params, info, step: onChainStep, onModification })
-
- sendAnalyticsEvent(
- SwapEventName.SWAP_SIGNED,
- formatSwapSignedAnalyticsEventProperties({
- trade,
- allowedSlippage: percentFromFloat(trade.slippageTolerance),
- fiatValues: {
- amountIn: analytics.token_in_amount_usd,
- amountOut: analytics.token_out_amount_usd,
- feeUsd: analytics.fee_usd,
- },
- txHash: hash,
- portfolioBalanceUsd: analytics.total_balances_usd,
- }),
- )
-
- yield* put(addPopup({ content: { type: PopupType.Transaction, hash }, key: hash }))
-
- return
-}
-
-function* getSwapTxRequest(step: SwapTransactionStep | SwapTransactionStepAsync, signature: string | undefined) {
- if (step.type === TransactionStepType.SwapTransaction) {
- return step.txRequest
- }
-
- if (!signature) {
- throw new UnexpectedSwapStateError('Signature required for async swap transaction step')
- }
-
- try {
- const txRequest = yield* call(step.getTxRequest, signature)
- invariant(txRequest !== undefined)
-
- return txRequest
- } catch {
- throw new UnexpectedSwapStateError('Failed to get transaction request')
- }
-}
-
-type SwapParams = {
- selectChain: (chainId: number) => Promise
- startChainId?: number
- account: SignerMnemonicAccountMeta
- analytics: ReturnType
- swapTxContext: ValidatedSwapTxContext
- setCurrentStep: SetCurrentStepFn
- setSteps: (steps: TransactionStep[]) => void
- onSuccess: () => void
- onFailure: () => void
-}
-
-// eslint-disable-next-line consistent-return
-function* swap(params: SwapParams) {
- const { analytics, swapTxContext, selectChain, startChainId, onFailure } = params
- const steps = yield* call(generateTransactionSteps, swapTxContext)
- params.setSteps(steps)
-
- // Switch chains if needed
- const swapChainId = swapTxContext.trade.inputAmount.currency.chainId
- if (swapChainId !== startChainId) {
- const chainSwitched = yield* call(selectChain, swapChainId)
- if (!chainSwitched) {
- onFailure()
- return undefined
- }
- }
-
- switch (swapTxContext.routing) {
- case Routing.CLASSIC:
- return yield* classicSwap({
- ...params,
- swapTxContext,
- steps,
- analytics,
- })
- case Routing.DUTCH_V2:
- return yield* uniswapXSwap({ ...params, swapTxContext, steps })
- // case Routing.BRIDGE:
- // return yield* bridgingSaga({ ...params, swapTxContext })
- }
-}
-
-function* classicSwap(
- params: SwapParams & { swapTxContext: ValidatedClassicSwapTxAndGasInfo; steps: TransactionStep[] },
-) {
- const {
- account,
- setCurrentStep,
- steps,
- swapTxContext: { trade },
- analytics,
- } = params
-
- let signature: string | undefined
-
- try {
- for (const step of steps) {
- switch (step.type) {
- case TransactionStepType.TokenRevocationTransaction:
- case TransactionStepType.TokenApprovalTransaction: {
- yield* call(handleApprovalTransactionStep, { account, step, setCurrentStep })
- break
- }
- case TransactionStepType.Permit2Signature: {
- signature = yield* call(handleSignatureStep, { account, step, setCurrentStep })
- break
- }
- case TransactionStepType.SwapTransaction:
- case TransactionStepType.SwapTransactionAsync: {
- yield* call(handleSwapTransactionStep, { account, signature, step, setCurrentStep, trade, analytics })
- break
- }
- default: {
- throw new UnexpectedSwapStateError('Unexpected step type')
- }
- }
- }
- } catch (e) {
- // TODO(WEB-4921): pass errors to onFailure and to handle in UI
- logger.error(e, { tags: { file: 'swapSaga', function: 'classicSwap' } })
- }
-
- yield* call(params.onSuccess)
-}
-
-function* uniswapXSwap(
- params: SwapParams & {
- swapTxContext: ValidatedUniswapXSwapTxAndGasInfo
- steps: TransactionStep[]
- analytics: ReturnType
- },
-) {
- const {
- account,
- setCurrentStep,
- steps,
- swapTxContext: { trade },
- analytics,
- } = params
-
- try {
- for (const step of steps) {
- switch (step.type) {
- case TransactionStepType.WrapTransaction: {
- yield* call(handleWrapStep, { account, step, setCurrentStep })
- break
- }
- case TransactionStepType.TokenRevocationTransaction:
- case TransactionStepType.TokenApprovalTransaction: {
- yield* call(handleApprovalTransactionStep, { account, step, setCurrentStep })
- break
- }
- case TransactionStepType.UniswapXSignature: {
- yield* call(handleUniswapXSignatureStep, { account, step, setCurrentStep, trade, analytics })
- break
- }
- default: {
- throw new UnexpectedSwapStateError('Unexpected step type')
- }
- }
- }
- } catch (e) {
- // TODO(WEB-4921): pass errors to onFailure and to handle in UI
- logger.error(e, { tags: { file: 'swapSaga', function: 'uniswapXSwap' } })
- }
-
- yield* call(params.onSuccess)
-}
-
-export const swapSaga = createSaga(swap, 'swapSaga')
-
-/** Callback to submit trades and track progress */
-export function useSwapCallback(): SwapCallback {
- const appDispatch = useDispatch()
- const formatter = useLocalizationContext()
- const swapStartTimestamp = useSelector(selectSwapStartTimestamp)
- const selectChain = useSelectChain()
- const startChainId = useAccount().chainId
-
- const portfolioBalanceUsd = useTotalBalancesUsdForAnalytics()
-
- return useCallback(
- (args: SwapCallbackParams) => {
- const {
- account,
- swapTxContext,
- onSuccess,
- onFailure,
- currencyInAmountUSD,
- currencyOutAmountUSD,
- isAutoSlippage,
- isFiatInputMode,
- setCurrentStep,
- setSteps,
- } = args
- const { trade, gasFee } = swapTxContext
-
- const analytics = getBaseTradeAnalyticsProperties({
- formatter,
- trade,
- currencyInAmountUSD,
- currencyOutAmountUSD,
- portfolioBalanceUsd,
- })
- const swapParams = {
- swapTxContext,
- account,
- analytics,
- onSuccess,
- onFailure,
- setCurrentStep,
- setSteps,
- selectChain,
- startChainId,
- }
- appDispatch(swapSaga.actions.trigger(swapParams))
-
- const blockNumber = getClassicQuoteFromResponse(trade?.quote)?.blockNumber?.toString()
-
- sendAnalyticsEvent(SwapEventName.SWAP_SUBMITTED_BUTTON_CLICKED, {
- ...analytics,
- estimated_network_fee_wei: gasFee.value,
- gas_limit: isClassic(swapTxContext) ? swapTxContext.txRequest?.gasLimit?.toString() : undefined,
- transaction_deadline_seconds: trade.deadline,
- swap_quote_block_number: blockNumber,
- is_auto_slippage: isAutoSlippage,
- swap_flow_duration_milliseconds: swapStartTimestamp ? Date.now() - swapStartTimestamp : undefined,
- is_fiat_input_mode: isFiatInputMode,
- })
-
- // Reset swap start timestamp now that the swap has been submitted
- appDispatch(updateSwapStartTimestamp({ timestamp: undefined }))
- },
- [formatter, portfolioBalanceUsd, selectChain, startChainId, appDispatch, swapStartTimestamp],
- )
-}
diff --git a/apps/web/src/state/sagas/transactions/uniswapx.ts b/apps/web/src/state/sagas/transactions/uniswapx.ts
deleted file mode 100644
index ccd015c25b0..00000000000
--- a/apps/web/src/state/sagas/transactions/uniswapx.ts
+++ /dev/null
@@ -1,86 +0,0 @@
-import { formatSwapSignedAnalyticsEventProperties } from 'lib/utils/analytics'
-import { PopupType, addPopup } from 'state/application/reducer'
-import { HandleSignatureStepParams, getSwapTransactionInfo, handleSignatureStep } from 'state/sagas/transactions/utils'
-import { addSignature } from 'state/signatures/reducer'
-import { SignatureType, UnfilledUniswapXOrderDetails } from 'state/signatures/types'
-import { call, put } from 'typed-redux-saga'
-import { UniswapXOrderStatus } from 'types/uniswapx'
-import { submitOrder } from 'uniswap/src/data/apiClients/tradingApi/TradingApiClient'
-import { InterfaceEventNameLocal } from 'uniswap/src/features/telemetry/constants'
-import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send'
-import { getBaseTradeAnalyticsProperties } from 'uniswap/src/features/transactions/swap/analytics'
-import { UniswapXTrade } from 'uniswap/src/features/transactions/swap/types/trade'
-import { UniswapXSignatureStep } from 'uniswap/src/features/transactions/swap/utils/generateTransactionSteps'
-import { UniverseChainId } from 'uniswap/src/types/chains'
-import { percentFromFloat } from 'utilities/src/format/percent'
-import { logger } from 'utilities/src/logger/logger'
-
-interface HandleUniswapXSignatureStepParams extends HandleSignatureStepParams {
- trade: UniswapXTrade
- analytics: ReturnType
-}
-export function* handleUniswapXSignatureStep(params: HandleUniswapXSignatureStepParams) {
- const { trade, analytics } = params
- const quote = trade.quote.quote
- const orderHash = quote.orderId
- const chainId = trade.inputAmount.currency.chainId
- const signatureDetails = getUniswapXSignatureInfo(params.step, trade, chainId)
-
- const analyticsParams: Parameters[0] = {
- trade,
- allowedSlippage: percentFromFloat(trade.slippageTolerance),
- fiatValues: {
- amountIn: analytics.token_in_amount_usd,
- amountOut: analytics.token_out_amount_usd,
- feeUsd: analytics.fee_usd,
- },
- portfolioBalanceUsd: analytics.total_balances_usd,
- }
-
- try {
- const signature = yield* call(handleSignatureStep, params)
-
- sendAnalyticsEvent(
- InterfaceEventNameLocal.UniswapXSignatureRequested,
- formatSwapSignedAnalyticsEventProperties(analyticsParams),
- )
-
- yield* call(submitOrder, { signature, quote, routing: trade.routing })
-
- sendAnalyticsEvent(
- InterfaceEventNameLocal.UniswapXOrderSubmitted,
- formatSwapSignedAnalyticsEventProperties(analyticsParams),
- )
-
- yield* put(addSignature(signatureDetails))
-
- yield* put(addPopup({ content: { type: PopupType.Order, orderHash }, key: orderHash }))
- } catch (e) {
- // TODO(WEB-4921): pass errors to onFailure and to handle in UI
- logger.error(e, { tags: { file: 'uniswapx', function: 'handleUniswapXSignatureStep' } })
-
- sendAnalyticsEvent(InterfaceEventNameLocal.UniswapXOrderPostError, {
- ...formatSwapSignedAnalyticsEventProperties(analyticsParams),
- detail: e.message,
- })
- }
-}
-
-function getUniswapXSignatureInfo(
- step: UniswapXSignatureStep,
- trade: UniswapXTrade,
- chainId: UniverseChainId,
-): UnfilledUniswapXOrderDetails {
- const swapInfo = getSwapTransactionInfo(trade)
-
- return {
- type: SignatureType.SIGN_UNISWAPX_V2_ORDER,
- id: step.quote.orderId,
- addedTime: Date.now(),
- chainId,
- offerer: trade.quote.quote.orderInfo.reactor,
- orderHash: trade.quote.quote.orderId,
- status: UniswapXOrderStatus.OPEN,
- swapInfo,
- }
-}
diff --git a/apps/web/src/state/sagas/transactions/utils.ts b/apps/web/src/state/sagas/transactions/utils.ts
deleted file mode 100644
index 2e4c4460287..00000000000
--- a/apps/web/src/state/sagas/transactions/utils.ts
+++ /dev/null
@@ -1,169 +0,0 @@
-import { JsonRpcSigner, TransactionResponse, Web3Provider } from '@ethersproject/providers'
-import { TradeType } from '@uniswap/sdk-core'
-import { wagmiConfig } from 'components/Web3Provider/wagmiConfig'
-import { clientToProvider } from 'hooks/useEthersProvider'
-import { addTransaction, finalizeTransaction } from 'state/transactions/reducer'
-import {
- ApproveTransactionInfo,
- ExactInputSwapTransactionInfo,
- ExactOutputSwapTransactionInfo,
- TransactionInfo,
- TransactionType,
-} from 'state/transactions/types'
-import { call, put, take } from 'typed-redux-saga'
-import { TransactionStatus } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks'
-import { AccountMeta } from 'uniswap/src/features/accounts/types'
-import { SetCurrentStepFn } from 'uniswap/src/features/transactions/swap/types/swapCallback'
-import { ClassicTrade, UniswapXTrade } from 'uniswap/src/features/transactions/swap/types/trade'
-import {
- OnChainTransactionStep,
- SignatureTransactionStep,
- TokenApprovalTransactionStep,
- TokenRevocationTransactionStep,
- TransactionStep,
-} from 'uniswap/src/features/transactions/swap/utils/generateTransactionSteps'
-import { isUniswapX } from 'uniswap/src/features/transactions/swap/utils/routing'
-import { currencyId } from 'uniswap/src/utils/currencyId'
-import { percentFromFloat } from 'utilities/src/format/percent'
-import { getConnectorClient } from 'wagmi/actions'
-
-class MissingProviderError extends Error {
- constructor(message: string) {
- super(message)
- this.name = 'MissingProviderError'
- }
-}
-class TransactionFailureError extends Error {
- step: TransactionStep
-
- constructor(message: string, step: TransactionStep) {
- super(message)
- this.name = 'TransactionFailureError'
- this.step = step
- }
-}
-
-export interface HandleSignatureStepParams {
- step: T
- setCurrentStep: SetCurrentStepFn
-}
-export function* handleSignatureStep({ setCurrentStep, step }: HandleSignatureStepParams) {
- // Trigger UI prompting user to accept
- setCurrentStep({ step, accepted: false })
-
- const signer = yield* call(getSigner)
- const signature = yield* call([signer, '_signTypedData'], step.domain, step.types, step.values)
-
- return signature
-}
-
-export interface HandleOnChainStepParams {
- account: AccountMeta
- info: TransactionInfo
- step: T
- setCurrentStep: SetCurrentStepFn
- shouldWaitForConfirmation?: boolean
- onModification?: (response: TransactionResponse) => void
-}
-export function* handleOnChainStep(params: HandleOnChainStepParams) {
- const { account, step, setCurrentStep, info, shouldWaitForConfirmation = true, onModification } = params
- const signer = yield* call(getSigner)
-
- // Trigger UI prompting user to accept
- setCurrentStep({ step, accepted: false })
-
- const response = yield* call([signer, 'sendTransaction'], step.txRequest)
- const { hash, nonce, data } = response
-
- // Trigger waiting UI after user accepts
- setCurrentStep({ step, accepted: true })
-
- // Add transaction to local state to start polling for status
- yield* put(addTransaction({ from: account.address, info, hash, nonce, chainId: step.txRequest.chainId }))
-
- if (step.txRequest.data !== data) {
- onModification?.(response)
- }
-
- if (shouldWaitForConfirmation) {
- // Delay returning until transaction is confirmed
- yield* call(waitForTransaction, hash, step)
- }
-
- return hash
-}
-
-interface HandleApprovalStepParams
- extends Omit, 'info'> {}
-export function* handleApprovalTransactionStep(params: HandleApprovalStepParams) {
- const { step } = params
- const info = getApprovalTransactionInfo(step)
- return yield* call(handleOnChainStep, { ...params, info })
-}
-
-function getApprovalTransactionInfo(
- approvalStep: TokenApprovalTransactionStep | TokenRevocationTransactionStep,
-): ApproveTransactionInfo {
- return {
- type: TransactionType.APPROVAL,
- tokenAddress: approvalStep.token.address,
- spender: approvalStep.spender,
- amount: approvalStep.amount,
- }
-}
-
-/** Returns when a transaction is confirmed in local state. Throws an error if the transaction fails. */
-function* waitForTransaction(hash: string, step: TransactionStep) {
- while (true) {
- const { payload } = yield* take>(finalizeTransaction.type)
- if (payload.hash === hash) {
- if (payload.status === TransactionStatus.Confirmed) {
- return
- } else {
- throw new TransactionFailureError('Transaction not successful', step)
- }
- }
- }
-}
-
-async function getProvider(): Promise {
- const client = await getConnectorClient(wagmiConfig)
- const provider = clientToProvider(client)
-
- if (!provider) {
- throw new MissingProviderError(`Failed to get provider during transaction flow`)
- }
-
- return provider
-}
-
-async function getSigner(): Promise {
- return (await getProvider()).getSigner()
-}
-
-type SwapInfo = ExactInputSwapTransactionInfo | ExactOutputSwapTransactionInfo
-export function getSwapTransactionInfo(trade: ClassicTrade): SwapInfo
-export function getSwapTransactionInfo(trade: UniswapXTrade): SwapInfo & { isUniswapXOrder: true }
-export function getSwapTransactionInfo(trade: ClassicTrade | UniswapXTrade): SwapInfo {
- const slippage = percentFromFloat(trade.slippageTolerance)
-
- return {
- type: TransactionType.SWAP,
- inputCurrencyId: currencyId(trade.inputAmount.currency),
- outputCurrencyId: currencyId(trade.outputAmount.currency),
- isUniswapXOrder: isUniswapX(trade),
- ...(trade.tradeType === TradeType.EXACT_INPUT
- ? {
- tradeType: TradeType.EXACT_INPUT,
- inputCurrencyAmountRaw: trade.inputAmount.quotient.toString(),
- expectedOutputCurrencyAmountRaw: trade.outputAmount.quotient.toString(),
- minimumOutputCurrencyAmountRaw: trade.minimumAmountOut(slippage).quotient.toString(),
- }
- : {
- tradeType: TradeType.EXACT_OUTPUT,
- maximumInputCurrencyAmountRaw: trade.maximumAmountIn(slippage).quotient.toString(),
- outputCurrencyAmountRaw: trade.outputAmount.quotient.toString(),
- expectedInputCurrencyAmountRaw: trade.inputAmount.quotient.toString(),
- }),
- }
-}
diff --git a/apps/web/src/state/sagas/transactions/wrapSaga.ts b/apps/web/src/state/sagas/transactions/wrapSaga.ts
deleted file mode 100644
index 06666bc4932..00000000000
--- a/apps/web/src/state/sagas/transactions/wrapSaga.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-import { Web3Provider } from '@ethersproject/providers'
-import { Currency, CurrencyAmount } from '@uniswap/sdk-core'
-import { useEthersWeb3Provider } from 'hooks/useEthersProvider'
-import { useCallback } from 'react'
-import { useDispatch } from 'react-redux'
-import { PopupType, addPopup } from 'state/application/reducer'
-import { HandleOnChainStepParams, handleOnChainStep } from 'state/sagas/transactions/utils'
-import { TransactionType, WrapTransactionInfo } from 'state/transactions/types'
-import { call, put } from 'typed-redux-saga'
-import { WrapCallback, WrapCallbackParams } from 'uniswap/src/features/transactions/swap/types/wrapCallback'
-import {
- TransactionStepType,
- WrapTransactionStep,
-} from 'uniswap/src/features/transactions/swap/utils/generateTransactionSteps'
-import { createSaga } from 'uniswap/src/utils/saga'
-import { logger } from 'utilities/src/logger/logger'
-import noop from 'utilities/src/react/noop'
-
-interface HandleWrapStepParams extends Omit, 'info'> {}
-export function* handleWrapStep(params: HandleWrapStepParams) {
- const info = getWrapTransactionInfo(params.step.amount)
- return yield* call(handleOnChainStep, { ...params, info })
-}
-
-type WrapParams = WrapCallbackParams & { provider: Web3Provider }
-
-function* wrap(params: WrapParams) {
- try {
- const { account, inputCurrencyAmount, txRequest, provider } = params
-
- const step = { type: TransactionStepType.WrapTransaction, txRequest, amount: inputCurrencyAmount } as const
-
- const hash = yield* call(handleWrapStep, {
- step,
- account,
- provider,
- setCurrentStep: noop,
- shouldWaitForConfirmation: false,
- })
-
- yield* put(addPopup({ content: { type: PopupType.Transaction, hash }, key: hash }))
-
- params.onSuccess()
- } catch (error) {
- logger.error(error, { tags: { file: 'wrapSaga', function: 'wrap' } })
- params.onFailure()
- }
-}
-
-function getWrapTransactionInfo(amount: CurrencyAmount): WrapTransactionInfo {
- return amount.currency.isNative
- ? {
- type: TransactionType.WRAP,
- unwrapped: false,
- currencyAmountRaw: amount.quotient.toString(),
- }
- : {
- type: TransactionType.WRAP,
- unwrapped: true,
- currencyAmountRaw: amount.quotient.toString(),
- }
-}
-
-export const wrapSaga = createSaga(wrap, 'wrap')
-
-export function useWrapCallback(): WrapCallback {
- const appDispatch = useDispatch()
- const provider = useEthersWeb3Provider()
-
- return useCallback(
- (params: WrapCallbackParams) => {
- if (!provider) {
- throw new Error('Provider not found')
- }
-
- appDispatch(wrapSaga.actions.trigger({ ...params, provider }))
- },
- [appDispatch, provider],
- )
-}
diff --git a/apps/web/src/state/signatures/hooks.ts b/apps/web/src/state/signatures/hooks.ts
index 23eff76e5b6..023739294d6 100644
--- a/apps/web/src/state/signatures/hooks.ts
+++ b/apps/web/src/state/signatures/hooks.ts
@@ -35,12 +35,9 @@ export function useOrder(orderHash: string): UniswapXOrderDetails | undefined {
const order = signatures[orderHash]
if (
!order ||
- ![
- SignatureType.SIGN_UNISWAPX_ORDER,
- SignatureType.SIGN_UNISWAPX_V2_ORDER,
- SignatureType.SIGN_LIMIT,
- SignatureType.SIGN_PRIORITY_ORDER,
- ].includes(order.type as SignatureType)
+ ![SignatureType.SIGN_UNISWAPX_ORDER, SignatureType.SIGN_UNISWAPX_V2_ORDER, SignatureType.SIGN_LIMIT].includes(
+ order.type as SignatureType,
+ )
) {
return undefined
}
@@ -105,8 +102,7 @@ function isPendingOrder(signature: SignatureDetails): signature is UniswapXOrder
].includes(signature.status)
} else if (
signature.type === SignatureType.SIGN_UNISWAPX_ORDER ||
- signature.type === SignatureType.SIGN_UNISWAPX_V2_ORDER ||
- signature.type === SignatureType.SIGN_PRIORITY_ORDER
+ signature.type === SignatureType.SIGN_UNISWAPX_V2_ORDER
) {
return [
UniswapXOrderStatus.OPEN,
diff --git a/apps/web/src/state/signatures/parseRemote.ts b/apps/web/src/state/signatures/parseRemote.ts
index 8d67ce84e6f..0befa375fb4 100644
--- a/apps/web/src/state/signatures/parseRemote.ts
+++ b/apps/web/src/state/signatures/parseRemote.ts
@@ -14,7 +14,6 @@ const SIGNATURE_TYPE_MAP: { [key in SwapOrderType]: SignatureType } = {
[SwapOrderType.Limit]: SignatureType.SIGN_LIMIT,
[SwapOrderType.Dutch]: SignatureType.SIGN_UNISWAPX_ORDER,
[SwapOrderType.DutchV2]: SignatureType.SIGN_UNISWAPX_V2_ORDER,
- // [SwapOrderType.Priority]: SignatureType.SIGN_PRIORITY_ORDER,
}
const ORDER_STATUS_MAP: { [key in SwapOrderStatus]: UniswapXOrderStatus } = {
diff --git a/apps/web/src/state/signatures/types.ts b/apps/web/src/state/signatures/types.ts
index 1e74fb7fb65..62aae21354a 100644
--- a/apps/web/src/state/signatures/types.ts
+++ b/apps/web/src/state/signatures/types.ts
@@ -14,14 +14,12 @@ export enum SignatureType {
SIGN_UNISWAPX_ORDER = 'signUniswapXOrder',
SIGN_UNISWAPX_V2_ORDER = 'signUniswapXV2Order',
SIGN_LIMIT = 'signLimit',
- SIGN_PRIORITY_ORDER = 'signPriorityOrder',
}
export const OFFCHAIN_ORDER_TYPE_TO_SIGNATURE_TYPE: Partial> = {
[OffchainOrderType.DUTCH_AUCTION]: SignatureType.SIGN_UNISWAPX_ORDER,
[OffchainOrderType.DUTCH_V2_AUCTION]: SignatureType.SIGN_UNISWAPX_V2_ORDER,
[OffchainOrderType.LIMIT_ORDER]: SignatureType.SIGN_LIMIT,
- [OffchainOrderType.PRIORITY_ORDER]: SignatureType.SIGN_PRIORITY_ORDER,
}
interface BaseSignatureFields {
diff --git a/apps/web/src/state/swap/SwapContext.test.tsx b/apps/web/src/state/swap/SwapContext.test.tsx
index 130350be02b..7f4d63e34e5 100644
--- a/apps/web/src/state/swap/SwapContext.test.tsx
+++ b/apps/web/src/state/swap/SwapContext.test.tsx
@@ -1,4 +1,5 @@
import { Percent } from '@uniswap/sdk-core'
+import { Field } from 'components/swap/constants'
import { SwapForm } from 'pages/Swap/SwapForm'
import { SwapAndLimitContextProvider, SwapContextProvider } from 'state/swap/SwapContext'
import { SwapAndLimitContext, SwapInfo } from 'state/swap/types'
@@ -6,7 +7,6 @@ import { useSwapAndLimitContext, useSwapContext } from 'state/swap/useSwapContex
import { render, screen } from 'test-utils/render'
import { nativeOnChain } from 'uniswap/src/constants/tokens'
import { UniverseChainId } from 'uniswap/src/types/chains'
-import { CurrencyField } from 'uniswap/src/types/currency'
import { SwapTab } from 'uniswap/src/types/screens/interface'
jest.mock('hooks/useContract', () => ({
@@ -33,12 +33,12 @@ describe('Swap Context', () => {
allowedSlippage: new Percent(5, 1000),
autoSlippage: new Percent(5, 1000),
currencies: {
- input: undefined,
- output: undefined,
+ INPUT: undefined,
+ OUTPUT: undefined,
},
currencyBalances: {
- input: undefined,
- output: undefined,
+ INPUT: undefined,
+ OUTPUT: undefined,
},
inputError: expect.any(Object),
inputTax: new Percent(0),
@@ -54,7 +54,7 @@ describe('Swap Context', () => {
},
setSwapState: expect.any(Function),
swapState: {
- independentField: 'input',
+ independentField: 'INPUT',
typedValue: '',
},
})
@@ -160,8 +160,8 @@ describe('Combined contexts', () => {
// @ts-ignore rendering TestComponent sets derivedSwapInfo value
expect(derivedSwapInfo?.currencies).toEqual({
- [CurrencyField.INPUT]: nativeOnChain(UniverseChainId.Mainnet),
- [CurrencyField.OUTPUT]: undefined,
+ [Field.INPUT]: nativeOnChain(UniverseChainId.Mainnet),
+ [Field.OUTPUT]: undefined,
})
})
})
diff --git a/apps/web/src/state/swap/SwapContext.tsx b/apps/web/src/state/swap/SwapContext.tsx
index 810866cc7e6..08813ad57c2 100644
--- a/apps/web/src/state/swap/SwapContext.tsx
+++ b/apps/web/src/state/swap/SwapContext.tsx
@@ -1,5 +1,6 @@
import { Currency } from '@uniswap/sdk-core'
-import { useReportTotalBalancesUsdForAnalytics } from 'graphql/data/apollo/useReportTotalBalancesUsdForAnalytics'
+import { Field } from 'components/swap/constants'
+import { useReportTotalBalancesUsdForAnalytics } from 'graphql/data/apollo/TokenBalancesProvider'
import { useAccount } from 'hooks/useAccount'
import usePrevious from 'hooks/usePrevious'
import { useUpdateAtom } from 'jotai/utils'
@@ -9,7 +10,6 @@ import { useDerivedSwapInfo } from 'state/swap/hooks'
import { CurrencyState, SwapAndLimitContext, SwapContext, SwapState, initialSwapState } from 'state/swap/types'
import { useSwapAndLimitContext } from 'state/swap/useSwapContext'
import { InterfaceChainId } from 'uniswap/src/types/chains'
-import { CurrencyField } from 'uniswap/src/types/currency'
import { SwapTab } from 'uniswap/src/types/screens/interface'
import { areCurrenciesEqual } from 'uniswap/src/utils/currencyId'
@@ -135,7 +135,7 @@ export function SwapContextProvider({
children,
}: {
initialTypedValue?: string
- initialIndependentField?: CurrencyField
+ initialIndependentField?: Field
multichainUXEnabled?: boolean
children: React.ReactNode
}) {
diff --git a/apps/web/src/state/swap/hooks.test.ts b/apps/web/src/state/swap/hooks.test.ts
index 0c34748fb36..2f671d17765 100644
--- a/apps/web/src/state/swap/hooks.test.ts
+++ b/apps/web/src/state/swap/hooks.test.ts
@@ -3,7 +3,7 @@ import { parse } from 'qs'
import { queryParametersToCurrencyState, useInitialCurrencyState } from 'state/swap/hooks'
import { ETH_MAINNET } from 'test-utils/constants'
import { renderHook, waitFor } from 'test-utils/render'
-import { UNI, nativeOnChain } from 'uniswap/src/constants/tokens'
+import { MATIC_POLYGON, UNI } from 'uniswap/src/constants/tokens'
import { UniverseChainId } from 'uniswap/src/types/chains'
jest.mock('uniswap/src/features/gating/hooks', () => {
@@ -186,7 +186,7 @@ describe('hooks', () => {
{
tokenBalances: [
{
- token: nativeOnChain(UniverseChainId.Polygon),
+ token: MATIC_POLYGON,
denominatedValue: {
value: 1000,
},
diff --git a/apps/web/src/state/swap/hooks.tsx b/apps/web/src/state/swap/hooks.tsx
index 55ddd9e41f3..f0c330d98f4 100644
--- a/apps/web/src/state/swap/hooks.tsx
+++ b/apps/web/src/state/swap/hooks.tsx
@@ -1,5 +1,5 @@
import { Currency, CurrencyAmount, TradeType } from '@uniswap/sdk-core'
-import { ConnectWalletButtonText } from 'components/NavBar/accountCTAsExperimentUtils'
+import { Field } from 'components/swap/constants'
import { CHAIN_IDS_TO_NAMES, useSupportedChainId } from 'constants/chains'
import { NATIVE_CHAIN_ID } from 'constants/tokens'
import { useCurrency, useCurrencyInfo } from 'hooks/Tokens'
@@ -20,17 +20,18 @@ import { CurrencyState, SerializedCurrencyState, SwapInfo, SwapState } from 'sta
import { useSwapAndLimitContext, useSwapContext } from 'state/swap/useSwapContext'
import { useUserSlippageToleranceWithDefault } from 'state/user/hooks'
import { useTokenProjects } from 'uniswap/src/features/dataApi/tokenProjects'
+import { AccountCTAsExperimentGroup, Experiments } from 'uniswap/src/features/gating/experiments'
+import { useExperimentGroupName } from 'uniswap/src/features/gating/hooks'
import { Trans } from 'uniswap/src/i18n'
import { InterfaceChainId, UniverseChainId } from 'uniswap/src/types/chains'
-import { CurrencyField } from 'uniswap/src/types/currency'
import { areCurrencyIdsEqual, currencyId } from 'uniswap/src/utils/currencyId'
import { isAddress } from 'utilities/src/addresses'
import { getParsedChainId } from 'utils/chains'
export function useSwapActionHandlers(): {
- onCurrencySelection: (field: CurrencyField, currency?: Currency) => void
+ onCurrencySelection: (field: Field, currency: Currency) => void
onSwitchTokens: (options: { newOutputHasTax: boolean; previouslyEstimatedOutput: string }) => void
- onUserInput: (field: CurrencyField, typedValue: string) => void
+ onUserInput: (field: Field, typedValue: string) => void
} {
const { swapState, setSwapState } = useSwapContext()
const { currencyState, setCurrencyState } = useSwapAndLimitContext()
@@ -43,32 +44,31 @@ export function useSwapActionHandlers(): {
)
const onCurrencySelection = useCallback(
- (field: CurrencyField, currency?: Currency) => {
+ (field: Field, currency: Currency) => {
const [currentCurrencyKey, otherCurrencyKey]: (keyof CurrencyState)[] =
- field === CurrencyField.INPUT ? ['inputCurrency', 'outputCurrency'] : ['outputCurrency', 'inputCurrency']
+ field === Field.INPUT ? ['inputCurrency', 'outputCurrency'] : ['outputCurrency', 'inputCurrency']
const otherCurrency = currencyState[otherCurrencyKey]
// the case where we have to swap the order
- if (otherCurrency && currency?.equals(otherCurrency)) {
+ if (otherCurrency && currency.equals(otherCurrency)) {
setCurrencyState({
[currentCurrencyKey]: currency,
[otherCurrencyKey]: currencyState[currentCurrencyKey],
})
setSwapState((swapState) => ({
...swapState,
- independentField:
- swapState.independentField === CurrencyField.INPUT ? CurrencyField.OUTPUT : CurrencyField.INPUT,
+ independentField: swapState.independentField === Field.INPUT ? Field.OUTPUT : Field.INPUT,
}))
// multichain ux case where we set input or output to different chain
- } else if (currency && otherCurrency?.chainId !== currency.chainId) {
- const otherCurrencyTokenProjects = field === CurrencyField.INPUT ? outputTokenProjects : inputTokenProjects
+ } else if (otherCurrency?.chainId !== currency.chainId) {
+ const otherCurrencyTokenProjects = field === Field.INPUT ? outputTokenProjects : inputTokenProjects
const otherCurrency = otherCurrencyTokenProjects?.data?.find(
- (project) => project?.currency.chainId === currency?.chainId,
+ (project) => project?.currency.chainId === currency.chainId,
)
setCurrencyState((state) => ({
...state,
[currentCurrencyKey]: currency,
[otherCurrencyKey]:
- otherCurrency && currency && !areCurrencyIdsEqual(currencyId(currency), otherCurrency.currencyId)
+ otherCurrency && !areCurrencyIdsEqual(currencyId(currency), otherCurrency.currencyId)
? otherCurrency.currency
: undefined,
}))
@@ -91,7 +91,7 @@ export function useSwapActionHandlers(): {
previouslyEstimatedOutput: string
}) => {
// To prevent swaps with FOT tokens as exact-outputs, we leave it as an exact-in swap and use the previously estimated output amount as the new exact-in amount.
- if (newOutputHasTax && swapState.independentField === CurrencyField.INPUT) {
+ if (newOutputHasTax && swapState.independentField === Field.INPUT) {
setSwapState((swapState) => ({
...swapState,
typedValue: previouslyEstimatedOutput,
@@ -99,7 +99,7 @@ export function useSwapActionHandlers(): {
} else {
setSwapState((prev) => ({
...prev,
- independentField: prev.independentField === CurrencyField.INPUT ? CurrencyField.OUTPUT : CurrencyField.INPUT,
+ independentField: prev.independentField === Field.INPUT ? Field.OUTPUT : Field.INPUT,
}))
}
@@ -112,7 +112,7 @@ export function useSwapActionHandlers(): {
)
const onUserInput = useCallback(
- (field: CurrencyField, typedValue: string) => {
+ (field: Field, typedValue: string) => {
setSwapState((state) => {
return {
...state,
@@ -159,7 +159,7 @@ export function useDerivedSwapInfo(state: SwapState): SwapInfo {
useMemo(() => [inputCurrency ?? undefined, outputCurrency ?? undefined], [inputCurrency, outputCurrency]),
)
- const isExactIn: boolean = independentField === CurrencyField.INPUT
+ const isExactIn: boolean = independentField === Field.INPUT
const parsedAmount = useMemo(
() => tryParseCurrencyAmount(typedValue, (isExactIn ? inputCurrency : outputCurrency) ?? undefined),
[inputCurrency, isExactIn, outputCurrency, typedValue],
@@ -188,16 +188,16 @@ export function useDerivedSwapInfo(state: SwapState): SwapInfo {
const currencyBalances = useMemo(
() => ({
- [CurrencyField.INPUT]: relevantTokenBalances[0],
- [CurrencyField.OUTPUT]: relevantTokenBalances[1],
+ [Field.INPUT]: relevantTokenBalances[0],
+ [Field.OUTPUT]: relevantTokenBalances[1],
}),
[relevantTokenBalances],
)
- const currencies: { [field in CurrencyField]?: Currency } = useMemo(
+ const currencies: { [field in Field]?: Currency } = useMemo(
() => ({
- [CurrencyField.INPUT]: inputCurrency,
- [CurrencyField.OUTPUT]: outputCurrency,
+ [Field.INPUT]: inputCurrency,
+ [Field.OUTPUT]: outputCurrency,
}),
[inputCurrency, outputCurrency],
)
@@ -220,14 +220,25 @@ export function useDerivedSwapInfo(state: SwapState): SwapInfo {
isClassicTrade(trade.trade) && (nativeCurrencyBalanceUSD ?? 0) < (trade.trade.totalGasUseEstimateUSDWithBuffer ?? 0)
const { isDisconnected } = useAccount()
+ const accountsCTAExperimentGroup = useExperimentGroupName(Experiments.AccountCTAs)
+ const isSignIn = accountsCTAExperimentGroup === AccountCTAsExperimentGroup.SignInSignUp
+ const isLogIn = accountsCTAExperimentGroup === AccountCTAsExperimentGroup.LogInCreateAccount
+
const inputError = useMemo(() => {
let inputError: ReactNode | undefined
if (!account.isConnected) {
- inputError = isDisconnected ? :
+ const disconnectedInputError = isSignIn ? (
+
+ ) : isLogIn ? (
+
+ ) : (
+
+ )
+ inputError = isDisconnected ? disconnectedInputError :
}
- if (!currencies[CurrencyField.INPUT] || !currencies[CurrencyField.OUTPUT]) {
+ if (!currencies[Field.INPUT] || !currencies[Field.OUTPUT]) {
inputError = inputError ??
}
@@ -247,10 +258,7 @@ export function useDerivedSwapInfo(state: SwapState): SwapInfo {
}
// compare input balance to max input based on version
- const [balanceIn, maxAmountIn] = [
- currencyBalances[CurrencyField.INPUT],
- trade?.trade?.maximumAmountIn(allowedSlippage),
- ]
+ const [balanceIn, maxAmountIn] = [currencyBalances[Field.INPUT], trade?.trade?.maximumAmountIn(allowedSlippage)]
if (balanceIn && maxAmountIn && balanceIn.lessThan(maxAmountIn)) {
inputError = (
@@ -272,6 +280,8 @@ export function useDerivedSwapInfo(state: SwapState): SwapInfo {
currencyBalances,
trade?.trade,
allowedSlippage,
+ isSignIn,
+ isLogIn,
isDisconnected,
nativeCurrency.symbol,
])
@@ -386,7 +396,7 @@ export function useInitialCurrencyState(): {
initialInputCurrency?: Currency
initialOutputCurrency?: Currency
initialTypedValue?: string
- initialField?: CurrencyField
+ initialField?: Field
initialChainId: InterfaceChainId
initialCurrencyLoading: boolean
} {
@@ -445,8 +455,8 @@ export function useInitialCurrencyState(): {
const initialOutputCurrency = useCurrency(initialOutputCurrencyAddress, initialChainId)
const initialTypedValue = initialInputCurrency || initialOutputCurrency ? parsedCurrencyState.value : undefined
const initialField =
- initialTypedValue && parsedCurrencyState.field && parsedCurrencyState.field in CurrencyField
- ? CurrencyField[parsedCurrencyState.field as keyof typeof CurrencyField]
+ initialTypedValue && parsedCurrencyState.field && parsedCurrencyState.field in Field
+ ? Field[parsedCurrencyState.field as keyof typeof Field]
: undefined
return {
diff --git a/apps/web/src/state/swap/types.ts b/apps/web/src/state/swap/types.ts
index 21a88263666..66e80ee9b08 100644
--- a/apps/web/src/state/swap/types.ts
+++ b/apps/web/src/state/swap/types.ts
@@ -1,13 +1,13 @@
import { Currency, CurrencyAmount, Percent } from '@uniswap/sdk-core'
+import { Field } from 'components/swap/constants'
import { Dispatch, ReactNode, SetStateAction, createContext } from 'react'
import { InterfaceTrade, RouterPreference, TradeState } from 'state/routing/types'
import { InterfaceChainId, UniverseChainId } from 'uniswap/src/types/chains'
-import { CurrencyField } from 'uniswap/src/types/currency'
import { SwapTab } from 'uniswap/src/types/screens/interface'
export type SwapInfo = {
- currencies: { [field in CurrencyField]?: Currency }
- currencyBalances: { [field in CurrencyField]?: CurrencyAmount }
+ currencies: { [field in Field]?: Currency }
+ currencyBalances: { [field in Field]?: CurrencyAmount }
inputTax: Percent
outputTax: Percent
outputFeeFiatValue?: number
@@ -44,7 +44,7 @@ export const EMPTY_DERIVED_SWAP_INFO: SwapInfo = Object.freeze({
export const initialSwapState: SwapState = {
typedValue: '',
- independentField: CurrencyField.INPUT,
+ independentField: Field.INPUT,
}
export const SwapContext = createContext({
@@ -113,7 +113,7 @@ export interface CurrencyState {
}
export interface SwapState {
- readonly independentField: CurrencyField
+ readonly independentField: Field
readonly typedValue: string
routerPreferenceOverride?: RouterPreference.API
}
diff --git a/apps/web/src/test-utils/bundle-size-test.ts b/apps/web/src/test-utils/bundle-size-test.ts
index 1ad4d34d269..1e3500cf7ed 100644
--- a/apps/web/src/test-utils/bundle-size-test.ts
+++ b/apps/web/src/test-utils/bundle-size-test.ts
@@ -32,8 +32,8 @@ const entryGzipSize = report.reduce(
0,
)
-// somewhat arbitrary, based on current size (9/19/2024)
-const limit = 2_185_000
+// somewhat arbitrary, based on current size (9/17/2024)
+const limit = 2_165_000
if (entryGzipSize > limit) {
console.error(`Bundle size has grown too big! Entry JS size is ${entryGzipSize}, over the limit of ${limit}.`)
diff --git a/apps/web/src/theme/index.tsx b/apps/web/src/theme/index.tsx
index b570a7ea807..d6827ae8d6b 100644
--- a/apps/web/src/theme/index.tsx
+++ b/apps/web/src/theme/index.tsx
@@ -9,6 +9,8 @@ import { useIsDarkMode } from 'theme/components/ThemeToggle'
import { darkDeprecatedTheme, lightDeprecatedTheme } from 'theme/deprecatedColors'
import { getAccent2, getNeutralContrast } from 'theme/utils'
+export const NAV_HEIGHT = 72
+
export const MEDIA_WIDTHS = {
deprecated_upToExtraSmall: 500,
deprecated_upToSmall: 720,
diff --git a/apps/web/src/tracing/errors.ts b/apps/web/src/tracing/errors.ts
index c051772e891..3ddf42edec8 100644
--- a/apps/web/src/tracing/errors.ts
+++ b/apps/web/src/tracing/errors.ts
@@ -1,6 +1,6 @@
import { ClientOptions, ErrorEvent, EventHint } from '@sentry/types'
import { ProviderRpcError } from '@web3-react/types'
-import { wagmiConfig } from 'components/Web3Provider/wagmiConfig'
+import { wagmiConfig } from 'components/Web3Provider/wagmi'
import { didUserReject } from 'utils/swapErrorToUserReadableMessage'
import { getAccount } from 'wagmi/actions'
diff --git a/apps/web/src/types/position.ts b/apps/web/src/types/position.d.ts
similarity index 84%
rename from apps/web/src/types/position.ts
rename to apps/web/src/types/position.d.ts
index c0ccf926836..bce78b196ce 100644
--- a/apps/web/src/types/position.ts
+++ b/apps/web/src/types/position.d.ts
@@ -15,8 +15,3 @@ export interface PositionDetails {
tokensOwed0: BigNumber
tokensOwed1: BigNumber
}
-
-export enum PositionField {
- TOKEN0 = 'TOKEN0',
- TOKEN1 = 'TOKEN1',
-}
diff --git a/apps/web/src/utils/chains.tsx b/apps/web/src/utils/chains.tsx
index eab8b8d7852..5bb86f45347 100644
--- a/apps/web/src/utils/chains.tsx
+++ b/apps/web/src/utils/chains.tsx
@@ -10,7 +10,7 @@ function getChainIdFromName(name: string) {
export function getParsedChainId(parsedQs?: ParsedQs) {
const chain = parsedQs?.chain
if (!chain || typeof chain !== 'string') {
- return undefined
+ return
}
return getChainIdFromName(chain)
diff --git a/apps/web/src/utils/formatNumbers.test.ts b/apps/web/src/utils/formatNumbers.test.ts
index a0061539023..9153c077465 100644
--- a/apps/web/src/utils/formatNumbers.test.ts
+++ b/apps/web/src/utils/formatNumbers.test.ts
@@ -1,20 +1,24 @@
import { renderHook } from '@testing-library/react'
import { CurrencyAmount, Percent } from '@uniswap/sdk-core'
+import { useLocalCurrencyConversionRate } from 'graphql/data/ConversionRate'
import { useActiveLocalCurrency } from 'hooks/useActiveLocalCurrency'
import { useActiveLocale } from 'hooks/useActiveLocale'
import { mocked } from 'test-utils/mocked'
import { USDC_MAINNET } from 'uniswap/src/constants/tokens'
import { Currency } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks'
import { DEFAULT_LOCAL_CURRENCY, FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants'
-import { useAppFiatCurrency } from 'uniswap/src/features/fiatCurrency/hooks'
import { Locale } from 'uniswap/src/features/language/constants'
import { NumberType, useFormatter } from 'utils/formatNumbers'
jest.mock('hooks/useActiveLocale')
jest.mock('hooks/useActiveLocalCurrency')
-jest.mock('uniswap/src/features/fiatCurrency/hooks')
+jest.mock('graphql/data/ConversionRate')
describe('formatNumber', () => {
+ beforeEach(() => {
+ mocked(useLocalCurrencyConversionRate).mockReturnValue({ data: 1.0, isLoading: false })
+ })
+
it('formats token reference numbers correctly', () => {
const { formatNumber } = renderHook(() => useFormatter()).result.current
@@ -310,6 +314,10 @@ describe('formatNumber', () => {
})
describe('formatUSDPrice', () => {
+ beforeEach(() => {
+ mocked(useLocalCurrencyConversionRate).mockReturnValue({ data: 1.0, isLoading: false })
+ })
+
it('format fiat price correctly', () => {
const { formatFiatPrice } = renderHook(() => useFormatter()).result.current
@@ -346,6 +354,10 @@ describe('formatUSDPrice', () => {
})
describe('formatPercent', () => {
+ beforeEach(() => {
+ mocked(useLocalCurrencyConversionRate).mockReturnValue({ data: 1.0, isLoading: false })
+ })
+
it('should correctly format undefined', () => {
const { formatPercent } = renderHook(() => useFormatter()).result.current
@@ -375,6 +387,10 @@ describe('formatPercent', () => {
})
describe('formatReviewSwapCurrencyAmount', () => {
+ beforeEach(() => {
+ mocked(useLocalCurrencyConversionRate).mockReturnValue({ data: 1.0, isLoading: false })
+ })
+
it('should use TokenTx formatting under a default length', () => {
const { formatReviewSwapCurrencyAmount } = renderHook(() => useFormatter()).result.current
@@ -407,6 +423,10 @@ describe('formatReviewSwapCurrencyAmount', () => {
})
describe('formatDelta', () => {
+ beforeEach(() => {
+ mocked(useLocalCurrencyConversionRate).mockReturnValue({ data: 1.0, isLoading: false })
+ })
+
it.each([[null], [undefined], [Infinity], [NaN]])('should correctly format %p', (value) => {
const { formatDelta } = renderHook(() => useFormatter()).result.current
@@ -437,15 +457,25 @@ describe('formatDelta', () => {
describe('formatToFiatAmount', () => {
it('should return default values when undefined', () => {
+ mocked(useLocalCurrencyConversionRate).mockReturnValue({ data: 1, isLoading: false })
const { convertToFiatAmount } = renderHook(() => useFormatter()).result.current
- expect(convertToFiatAmount(1)).toStrictEqual({ amount: 1.0, currency: DEFAULT_LOCAL_CURRENCY })
+ expect(convertToFiatAmount()).toStrictEqual({ amount: 1.0, currency: DEFAULT_LOCAL_CURRENCY })
})
it('should return input amount for same currency', () => {
- mocked(useAppFiatCurrency).mockReturnValue(FiatCurrency.UnitedStatesDollar)
+ mocked(useActiveLocalCurrency).mockReturnValue(FiatCurrency.UnitedStatesDollar)
+ mocked(useLocalCurrencyConversionRate).mockReturnValue({ data: 1, isLoading: false })
const { convertToFiatAmount } = renderHook(() => useFormatter()).result.current
expect(convertToFiatAmount(12)).toStrictEqual({ amount: 12.0, currency: Currency.Usd })
})
+
+ it('should correctly convert different currency', () => {
+ mocked(useActiveLocalCurrency).mockReturnValue(FiatCurrency.CanadianDollar)
+ mocked(useLocalCurrencyConversionRate).mockReturnValue({ data: 0.5, isLoading: false })
+ const { convertToFiatAmount } = renderHook(() => useFormatter()).result.current
+
+ expect(convertToFiatAmount(12)).toStrictEqual({ amount: 6.0, currency: Currency.Cad })
+ })
})
diff --git a/apps/web/src/utils/formatNumbers.ts b/apps/web/src/utils/formatNumbers.ts
index 6733fa12442..c90a4a90318 100644
--- a/apps/web/src/utils/formatNumbers.ts
+++ b/apps/web/src/utils/formatNumbers.ts
@@ -1,13 +1,13 @@
import { formatEther as ethersFormatEther } from '@ethersproject/units'
import { Currency, CurrencyAmount, Percent, Price, Token } from '@uniswap/sdk-core'
import { getCurrencySymbolDisplayType } from 'constants/localCurrencies'
+import { useLocalCurrencyConversionRate } from 'graphql/data/ConversionRate'
import { useActiveLocalCurrency } from 'hooks/useActiveLocalCurrency'
import { useActiveLocale } from 'hooks/useActiveLocale'
import usePrevious from 'hooks/usePrevious'
import { useCallback, useMemo } from 'react'
import { Bound } from 'state/mint/v3/actions'
import { DEFAULT_LOCAL_CURRENCY, FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants'
-import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext'
import { DEFAULT_LOCALE, Locale } from 'uniswap/src/features/language/constants'
type Nullish = T | null | undefined
@@ -727,6 +727,23 @@ function formatReviewSwapCurrencyAmount(amount: CurrencyAmount, locale
return formattedAmount
}
+function convertToFiatAmount(
+ amount = 1,
+ toCurrency = DEFAULT_LOCAL_CURRENCY,
+ conversionRate = 1,
+): { amount: number; currency: FiatCurrency } {
+ const defaultResult = { amount, currency: DEFAULT_LOCAL_CURRENCY }
+
+ if (defaultResult.currency === toCurrency) {
+ return defaultResult
+ }
+
+ return {
+ amount: amount * conversionRate,
+ currency: toCurrency,
+ }
+}
+
// TODO: https://linear.app/uniswap/issue/WEB-3495/import-useasyncdata-from-mobile
type FiatCurrencyComponents = {
groupingSeparator: string
@@ -818,13 +835,16 @@ function handleFallbackCurrency(
// Constructs an object that injects the correct locale and local currency into each of the above formatter functions.
export function useFormatter() {
const { formatterLocale, formatterLocalCurrency } = useFormatterLocales()
- const { convertFiatAmount, conversionRate: localCurrencyConversionRate } = useLocalizationContext()
+
+ const formatterLocalCurrencyIsUSD = formatterLocalCurrency === FiatCurrency.UnitedStatesDollar
+ const { data: localCurrencyConversionRate, isLoading: localCurrencyConversionRateIsLoading } =
+ useLocalCurrencyConversionRate(formatterLocalCurrency, formatterLocalCurrencyIsUSD)
const previousSelectedCurrency = usePrevious(formatterLocalCurrency)
const previousConversionRate = usePrevious(localCurrencyConversionRate)
- const shouldFallbackToPrevious = !localCurrencyConversionRate
- const shouldFallbackToUSD = !localCurrencyConversionRate
+ const shouldFallbackToPrevious = !localCurrencyConversionRate && localCurrencyConversionRateIsLoading
+ const shouldFallbackToUSD = !localCurrencyConversionRate && !localCurrencyConversionRateIsLoading
const currencyToFormatWith = handleFallbackCurrency(
formatterLocalCurrency,
previousSelectedCurrency,
@@ -928,6 +948,11 @@ export function useFormatter() {
[currencyToFormatWith, formatterLocale],
)
+ const convertToFiatAmountWithLocales = useCallback(
+ (amount?: number) => convertToFiatAmount(amount, currencyToFormatWith, localCurrencyConversionRateToFormatWith),
+ [currencyToFormatWith, localCurrencyConversionRateToFormatWith],
+ )
+
const formatConvertedFiatNumberOrString = useCallback(
(options: Omit) =>
formatNumberOrString({
@@ -941,7 +966,7 @@ export function useFormatter() {
return useMemo(
() => ({
- convertToFiatAmount: convertFiatAmount,
+ convertToFiatAmount: convertToFiatAmountWithLocales,
formatConvertedFiatNumberOrString,
formatCurrencyAmount: formatCurrencyAmountWithLocales,
formatEther: formatEtherwithLocales,
@@ -955,7 +980,7 @@ export function useFormatter() {
formatTickPrice: formatTickPriceWithLocales,
}),
[
- convertFiatAmount,
+ convertToFiatAmountWithLocales,
formatConvertedFiatNumberOrString,
formatCurrencyAmountWithLocales,
formatDeltaWithLocales,
diff --git a/apps/web/src/utils/getFetchPolicyForKey.ts b/apps/web/src/utils/getFetchPolicyForKey.ts
new file mode 100644
index 00000000000..ca6b68bc55f
--- /dev/null
+++ b/apps/web/src/utils/getFetchPolicyForKey.ts
@@ -0,0 +1,16 @@
+import { WatchQueryFetchPolicy } from '@apollo/client'
+
+const keys = new Map()
+
+export const getFetchPolicyForKey = (key: string, expirationMs: number): WatchQueryFetchPolicy => {
+ const lastFetchTimestamp = keys.get(key)
+ const diffFromNow = lastFetchTimestamp ? Date.now() - lastFetchTimestamp : Number.MAX_SAFE_INTEGER
+ let fetchPolicy: WatchQueryFetchPolicy = 'cache-first'
+
+ if (diffFromNow > expirationMs) {
+ keys.set(key, Date.now())
+ fetchPolicy = 'network-only'
+ }
+
+ return fetchPolicy
+}
diff --git a/apps/web/src/utils/prices.ts b/apps/web/src/utils/prices.ts
index 83332c1d1a7..b5af386ab6a 100644
--- a/apps/web/src/utils/prices.ts
+++ b/apps/web/src/utils/prices.ts
@@ -112,7 +112,7 @@ export function getPriceImpactWarning(priceImpact: Percent): 'warning' | 'error'
if (priceImpact.greaterThan(ALLOWED_PRICE_IMPACT_MEDIUM)) {
return 'warning'
}
- return undefined
+ return
}
export function getPriceImpactColor(priceImpact: Percent): keyof DefaultTheme | undefined {
diff --git a/apps/web/src/utils/transfer.ts b/apps/web/src/utils/transfer.ts
index 834052f3bb1..70af6f4d74c 100644
--- a/apps/web/src/utils/transfer.ts
+++ b/apps/web/src/utils/transfer.ts
@@ -39,7 +39,7 @@ async function getTransferTransaction(transferInfo: TransferInfo): Promise
-
-
+
+
diff --git a/packages/ui/src/assets/icons/ellipsis.svg b/packages/ui/src/assets/icons/ellipsis.svg
index f40f628bbc1..86dd1f50c57 100644
--- a/packages/ui/src/assets/icons/ellipsis.svg
+++ b/packages/ui/src/assets/icons/ellipsis.svg
@@ -1,5 +1,6 @@
-
{!isWeb && (
diff --git a/packages/uniswap/src/features/transactions/swap/form/SwapFormSettings.tsx b/packages/uniswap/src/features/transactions/swap/form/SwapFormSettings.tsx
index b0ffca5b5d5..851c4dd383d 100644
--- a/packages/uniswap/src/features/transactions/swap/form/SwapFormSettings.tsx
+++ b/packages/uniswap/src/features/transactions/swap/form/SwapFormSettings.tsx
@@ -43,7 +43,7 @@ export function SwapFormSettings({ customSettings }: { customSettings: SwapSetti
const rightAlignment = isMobileApp ? 24 : 4
return (
-
+
{
+ (currency: Currency, field: CurrencyField) => {
const tradeableAsset: TradeableAsset = {
address: currencyAddress(currency),
chainId: currency.chainId,
@@ -56,7 +55,7 @@ export function SwapTokenSelector({ isModalOpen }: { isModalOpen: boolean }): JS
exactCurrencyField === CurrencyField.INPUT ? CurrencyField.OUTPUT : CurrencyField.INPUT
newState.focusOnCurrencyField = newState.exactCurrencyField
newState[otherField] = previouslySelectedTradableAsset
- } else if (!chainsAreEqual && !isBridgePair) {
+ } else if (!chainsAreEqual) {
// if new token chain changes, try to find the other token's match on the new chain
const otherFieldTokenProjects = otherField === CurrencyField.INPUT ? inputTokenProjects : outputTokenProjects
const otherCurrency = otherFieldTokenProjects?.data?.find(
@@ -74,20 +73,7 @@ export function SwapTokenSelector({ isModalOpen }: { isModalOpen: boolean }): JS
: undefined
}
- if (!isBridgePair) {
- // If selecting output, set the input and output chainIds
- // If selecting input and output is already selected, also set the input chainId
- if (field === CurrencyField.OUTPUT || !!output) {
- filteredChainIds[CurrencyField.INPUT] = currency.chainId
- filteredChainIds[CurrencyField.OUTPUT] = currency.chainId
- // If selecting input, only set the output chainId
- } else {
- filteredChainIds[CurrencyField.OUTPUT] = currency.chainId
- }
-
- newState.filteredChainIds = filteredChainIds
- }
-
+ newState.filteredChainId = currency.chainId
newState[field] = tradeableAsset
updateSwapForm(newState)
@@ -95,23 +81,13 @@ export function SwapTokenSelector({ isModalOpen }: { isModalOpen: boolean }): JS
// Hide screen when done selecting.
onHideTokenSelector()
},
- [
- exactCurrencyField,
- input,
- inputTokenProjects,
- filteredChainIds,
- onHideTokenSelector,
- output,
- outputTokenProjects,
- updateSwapForm,
- ],
+ [exactCurrencyField, input, inputTokenProjects, onHideTokenSelector, output, outputTokenProjects, updateSwapForm],
)
const props: TokenSelectorProps = {
isModalOpen,
activeAccountAddress,
- chainId: filteredChainIds[selectingCurrencyField ?? CurrencyField.INPUT],
- input,
+ chainId: filteredChainId,
// token selector modal will only open on currency field selection; casting to satisfy typecheck here - we should consider refactoring the types here to avoid casting
currencyField: selectingCurrencyField as CurrencyField,
flow: TokenSelectorFlow.Swap,
diff --git a/packages/uniswap/src/features/transactions/swap/form/footer/GasAndWarningRows.web.tsx b/packages/uniswap/src/features/transactions/swap/form/footer/GasAndWarningRows.web.tsx
index e610dcf801e..e200ca3428d 100644
--- a/packages/uniswap/src/features/transactions/swap/form/footer/GasAndWarningRows.web.tsx
+++ b/packages/uniswap/src/features/transactions/swap/form/footer/GasAndWarningRows.web.tsx
@@ -24,7 +24,7 @@ export function GasAndWarningRows(): JSX.Element {
const { derivedSwapInfo } = useSwapFormContext()
const { trade } = derivedSwapInfo
- const priceImpact = trade.trade?.priceImpact ? normalizePriceImpact(trade.trade?.priceImpact) : undefined
+ const priceImpact = trade.trade ? normalizePriceImpact(trade.trade?.priceImpact) : undefined
const [showWarningModal, setShowWarningModal] = useState(false)
diff --git a/packages/uniswap/src/features/transactions/swap/hooks/useAcceptedTrade.ts b/packages/uniswap/src/features/transactions/swap/hooks/useAcceptedTrade.ts
index 464ee9890e8..f114c4145c8 100644
--- a/packages/uniswap/src/features/transactions/swap/hooks/useAcceptedTrade.ts
+++ b/packages/uniswap/src/features/transactions/swap/hooks/useAcceptedTrade.ts
@@ -34,7 +34,7 @@ export function useAcceptedTrade({
const onAcceptTrade = (): undefined => {
if (!trade) {
- return
+ return undefined
}
setAcceptedDerivedSwapInfo(derivedSwapInfo)
diff --git a/packages/uniswap/src/features/transactions/swap/hooks/useDerivedSwapInfo.ts b/packages/uniswap/src/features/transactions/swap/hooks/useDerivedSwapInfo.ts
index b1843ae2f22..07fd4bcdfde 100644
--- a/packages/uniswap/src/features/transactions/swap/hooks/useDerivedSwapInfo.ts
+++ b/packages/uniswap/src/features/transactions/swap/hooks/useDerivedSwapInfo.ts
@@ -89,7 +89,6 @@ export function useDerivedSwapInfo({
currency: otherCurrency,
})
}
- return undefined
}, [exactAmountToken, isWrap, otherCurrency])
const sendPortionEnabled = useFeatureFlag(FeatureFlags.PortionFields)
diff --git a/packages/uniswap/src/features/transactions/swap/hooks/usePermit2Signature.ts b/packages/uniswap/src/features/transactions/swap/hooks/usePermit2Signature.ts
index 21162addaea..8196cb0a126 100644
--- a/packages/uniswap/src/features/transactions/swap/hooks/usePermit2Signature.ts
+++ b/packages/uniswap/src/features/transactions/swap/hooks/usePermit2Signature.ts
@@ -24,7 +24,7 @@ export function usePermit2SignatureWithData({ permitData, skip }: { permitData:
const permitSignatureFetcher = useCallback(async () => {
if (skip || !signer || !domain || !types || !values) {
- return undefined
+ return
}
return await signTypedData(
diff --git a/packages/uniswap/src/features/transactions/swap/hooks/useSetTradeSlippage.ts b/packages/uniswap/src/features/transactions/swap/hooks/useSetTradeSlippage.ts
index 988023a3603..0f9bfd2956d 100644
--- a/packages/uniswap/src/features/transactions/swap/hooks/useSetTradeSlippage.ts
+++ b/packages/uniswap/src/features/transactions/swap/hooks/useSetTradeSlippage.ts
@@ -5,7 +5,6 @@ import { DynamicConfigs, SwapConfigKey } from 'uniswap/src/features/gating/confi
import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks'
import { useUSDCValue } from 'uniswap/src/features/transactions/swap/hooks/useUSDCPrice'
import { Trade, TradeWithStatus } from 'uniswap/src/features/transactions/swap/types/trade'
-import { isBridge } from 'uniswap/src/features/transactions/swap/utils/routing'
import {
getClassicQuoteFromResponse,
transformTradingApiResponseToTrade,
@@ -19,10 +18,6 @@ export function useSetTradeSlippage(
const autoSlippageTolerance = useCalculateAutoSlippage(trade?.trade)
return useMemo(() => {
- if (trade.trade && isBridge(trade.trade)) {
- // Bridge trades don't have slippage
- return { trade, autoSlippageTolerance: 0 }
- }
// If the user has set a custom slippage, use that in the trade instead of the auto-slippage
if (!trade.trade || userSetSlippage) {
return { trade, autoSlippageTolerance }
diff --git a/packages/uniswap/src/features/transactions/swap/hooks/useSwapTxAndGasInfo.test.ts b/packages/uniswap/src/features/transactions/swap/hooks/useSwapTxAndGasInfo.test.ts
index 7dd16a34b7e..6e559cfafa3 100644
--- a/packages/uniswap/src/features/transactions/swap/hooks/useSwapTxAndGasInfo.test.ts
+++ b/packages/uniswap/src/features/transactions/swap/hooks/useSwapTxAndGasInfo.test.ts
@@ -1,7 +1,6 @@
import { renderHook } from '@testing-library/react-hooks'
import { UNI, WBTC } from 'uniswap/src/constants/tokens'
-import { Routing } from 'uniswap/src/data/tradingApi/__generated__/index'
-import { FeeType } from 'uniswap/src/data/tradingApi/types'
+import { FeeType, Routing } from 'uniswap/src/data/tradingApi/__generated__/index'
import { AccountType, SignerMnemonicAccountMeta } from 'uniswap/src/features/accounts/types'
import { DEFAULT_GAS_STRATEGY } from 'uniswap/src/features/gas/hooks'
import { useSwapTxAndGasInfo } from 'uniswap/src/features/transactions/swap/hooks/useSwapTxAndGasInfo'
@@ -65,16 +64,14 @@ describe('useSwapTxAndGasInfo', () => {
const mockSwapTxInfo: TransactionRequestInfo = {
transactionRequest: { to: '0x456', chainId: 1 },
gasFeeResult: { value: '123', isLoading: false, error: null },
- gasEstimate: {
- swapEstimates: {
- activeEstimate: {
- gasLimit: '500000',
- gasFee: '600000',
- maxFeePerGas: '700000',
- maxPriorityFeePerGas: '800000',
- type: FeeType.EIP1559,
- strategy: DEFAULT_GAS_STRATEGY,
- },
+ gasEstimates: {
+ activeEstimate: {
+ gasLimit: '500000',
+ gasFee: '600000',
+ maxFeePerGas: '700000',
+ maxPriorityFeePerGas: '800000',
+ type: FeeType.EIP1559,
+ strategy: DEFAULT_GAS_STRATEGY,
},
},
permitSignature: undefined,
@@ -119,9 +116,10 @@ describe('useSwapTxAndGasInfo', () => {
},
approvalError: false,
indicativeTrade: undefined,
- permit: undefined,
+ permitSignature: undefined,
+ permitData: undefined,
+ permitDataLoading: undefined,
swapRequestArgs: undefined,
- unsigned: false,
})
})
})
diff --git a/packages/uniswap/src/features/transactions/swap/hooks/useSwapTxAndGasInfo.ts b/packages/uniswap/src/features/transactions/swap/hooks/useSwapTxAndGasInfo.ts
index c33571fc8e2..41191a9a968 100644
--- a/packages/uniswap/src/features/transactions/swap/hooks/useSwapTxAndGasInfo.ts
+++ b/packages/uniswap/src/features/transactions/swap/hooks/useSwapTxAndGasInfo.ts
@@ -13,9 +13,8 @@ import {
import { ApprovalAction, Trade } from 'uniswap/src/features/transactions/swap/types/trade'
import { sumGasFees } from 'uniswap/src/features/transactions/swap/utils/gas'
import { isUniswapX } from 'uniswap/src/features/transactions/swap/utils/routing'
-import { validatePermit, validateTransactionRequest } from 'uniswap/src/features/transactions/swap/utils/trade'
+import { validateTransactionRequest } from 'uniswap/src/features/transactions/swap/utils/trade'
import { CurrencyField } from 'uniswap/src/types/currency'
-import { isInterface } from 'utilities/src/platform'
export function useSwapTxAndGasInfo({
derivedSwapInfo,
@@ -36,7 +35,6 @@ export function useSwapTxAndGasInfo({
chainId,
wrapType,
currencyInAmount: currencyAmounts[CurrencyField.INPUT],
- currencyOutAmount: currencyAmounts[CurrencyField.OUTPUT],
routing: trade?.routing,
})
@@ -53,7 +51,7 @@ export function useSwapTxAndGasInfo({
const approvalError = tokenApprovalInfo?.action === ApprovalAction.Unknown
const gasFeeEstimation: SwapGasFeeEstimation = {
- ...swapTxInfo.gasEstimate,
+ swapEstimates: swapTxInfo.gasEstimates,
approvalEstimates: tokenApprovalInfo?.gasEstimates,
}
@@ -62,8 +60,6 @@ export function useSwapTxAndGasInfo({
const approveTxRequest = validateTransactionRequest(tokenApprovalInfo?.txRequest)
const revocationTxRequest = validateTransactionRequest(tokenApprovalInfo?.cancelTxRequest)
const txRequest = validateTransactionRequest(swapTxInfo.transactionRequest)
- const permit = validatePermit(swapTxInfo.permitData)
- const unsigned = Boolean(isInterface && swapTxInfo.permitData)
if (trade?.routing === Routing.DUTCH_V2) {
const signature = swapTxInfo.permitSignature
@@ -84,25 +80,12 @@ export function useSwapTxAndGasInfo({
revocationTxRequest,
orderParams,
gasFee,
- gasFeeEstimation,
gasFeeBreakdown,
approvalError,
- permit,
- }
- } else if (trade?.routing === Routing.BRIDGE) {
- return {
- routing: Routing.BRIDGE,
- trade,
- indicativeTrade: undefined, // Bridge trades don't have indicative trades
- txRequest,
- approveTxRequest,
- revocationTxRequest,
- gasFee,
- gasFeeEstimation,
- approvalError,
+ permitData: swapTxInfo.permitData,
+ permitDataLoading: swapTxInfo.permitDataLoading,
swapRequestArgs: swapTxInfo.swapRequestArgs,
- permit,
- unsigned,
+ permitSignature: swapTxInfo.permitSignature,
}
} else {
return {
@@ -115,18 +98,20 @@ export function useSwapTxAndGasInfo({
gasFee,
gasFeeEstimation,
approvalError,
+ permitData: swapTxInfo.permitData,
+ permitDataLoading: swapTxInfo.permitDataLoading,
swapRequestArgs: swapTxInfo.swapRequestArgs,
- permit,
- unsigned,
+ permitSignature: swapTxInfo.permitSignature,
}
}
}, [
indicativeTrade,
- swapTxInfo.gasEstimate,
+ swapTxInfo.gasEstimates,
swapTxInfo.gasFeeResult,
swapTxInfo.permitSignature,
swapTxInfo.transactionRequest,
swapTxInfo.permitData,
+ swapTxInfo.permitDataLoading,
swapTxInfo.swapRequestArgs,
tokenApprovalInfo,
trade,
diff --git a/packages/uniswap/src/features/transactions/swap/hooks/useSwapWarnings.test.ts b/packages/uniswap/src/features/transactions/swap/hooks/useSwapWarnings.test.ts
index 7b1dd33ed60..8b7cb9a2d25 100644
--- a/packages/uniswap/src/features/transactions/swap/hooks/useSwapWarnings.test.ts
+++ b/packages/uniswap/src/features/transactions/swap/hooks/useSwapWarnings.test.ts
@@ -1,7 +1,6 @@
import { CurrencyAmount } from '@uniswap/sdk-core'
import { WarningLabel } from 'uniswap/src/components/modals/WarningModal/types'
import { DAI, USDC } from 'uniswap/src/constants/tokens'
-import { Locale } from 'uniswap/src/features/language/constants'
import { NativeCurrency } from 'uniswap/src/features/tokens/NativeCurrency'
import { getSwapWarnings } from 'uniswap/src/features/transactions/swap/hooks/useSwapWarnings'
import { DerivedSwapInfo } from 'uniswap/src/features/transactions/swap/types/derivedSwapInfo'
@@ -112,7 +111,7 @@ const tradeErrorState: DerivedSwapInfo = {
gasEstimates: createGasFeeEstimates(),
},
}
-const { formatPercent } = mockLocalizedFormatter(Locale.EnglishUnitedStates)
+const { formatPercent } = mockLocalizedFormatter
describe(getSwapWarnings, () => {
it('catches incomplete form errors', async () => {
diff --git a/packages/uniswap/src/features/transactions/swap/hooks/useTokenApprovalInfo.test.ts b/packages/uniswap/src/features/transactions/swap/hooks/useTokenApprovalInfo.test.ts
index d8c9635c59b..b957603e8da 100644
--- a/packages/uniswap/src/features/transactions/swap/hooks/useTokenApprovalInfo.test.ts
+++ b/packages/uniswap/src/features/transactions/swap/hooks/useTokenApprovalInfo.test.ts
@@ -1,9 +1,8 @@
import { renderHook } from '@testing-library/react-hooks'
import { CurrencyAmount, Token } from '@uniswap/sdk-core'
-import { DAI, USDC } from 'uniswap/src/constants/tokens'
+import { DAI } from 'uniswap/src/constants/tokens'
import { useCheckApprovalQuery } from 'uniswap/src/data/apiClients/tradingApi/useCheckApprovalQuery'
-import { Routing } from 'uniswap/src/data/tradingApi/__generated__/index'
-import { FeeType } from 'uniswap/src/data/tradingApi/types'
+import { FeeType, Routing } from 'uniswap/src/data/tradingApi/__generated__/index'
import { AccountMeta, AccountType } from 'uniswap/src/features/accounts/types'
import { DEFAULT_GAS_STRATEGY } from 'uniswap/src/features/gas/hooks'
import {
@@ -28,16 +27,13 @@ describe('useTokenApprovalInfo', () => {
const mockAccount: AccountMeta = { address: '0x123', type: AccountType.SignerMnemonic }
const mockTokenIn = new Token(UniverseChainId.Mainnet, DAI.address, DAI.decimals, DAI.symbol, DAI.name)
- const mockTokenOut = new Token(UniverseChainId.Mainnet, USDC.address, USDC.decimals, USDC.symbol, USDC.name)
const mockCurrencyInAmount = CurrencyAmount.fromRawAmount(mockTokenIn, '1000000000000000000') // 1 TKIN
- const mockCurrencyOutAmount = CurrencyAmount.fromRawAmount(mockTokenOut, '2000000000000000000') // 2 TKOUT
const mockParams: TokenApprovalInfoParams = {
chainId: UniverseChainId.Mainnet,
wrapType: WrapType.NotApplicable,
currencyInAmount: mockCurrencyInAmount,
- currencyOutAmount: mockCurrencyOutAmount,
routing: Routing.CLASSIC,
account: mockAccount,
skip: false,
diff --git a/packages/uniswap/src/features/transactions/swap/hooks/useTokenApprovalInfo.ts b/packages/uniswap/src/features/transactions/swap/hooks/useTokenApprovalInfo.ts
index d5361b60062..eb3b1842d28 100644
--- a/packages/uniswap/src/features/transactions/swap/hooks/useTokenApprovalInfo.ts
+++ b/packages/uniswap/src/features/transactions/swap/hooks/useTokenApprovalInfo.ts
@@ -20,7 +20,6 @@ export interface TokenApprovalInfoParams {
chainId: WalletChainId
wrapType: WrapType
currencyInAmount: Maybe>
- currencyOutAmount?: Maybe>
routing: Routing | undefined
account?: AccountMeta
skip?: boolean
@@ -35,7 +34,7 @@ interface TokenApprovalGasInfo {
export function useTokenApprovalInfo(
params: TokenApprovalInfoParams,
): (TokenApprovalInfo & TokenApprovalGasInfo) | undefined {
- const { account, chainId, wrapType, currencyInAmount, currencyOutAmount, routing, skip } = params
+ const { account, chainId, wrapType, currencyInAmount, routing, skip } = params
const isWrap = wrapType !== WrapType.NotApplicable
@@ -44,34 +43,22 @@ export function useTokenApprovalInfo(
const currencyIn = routing === Routing.DUTCH_V2 ? currencyInAmount?.currency.wrapped : currencyInAmount?.currency
const amount = currencyInAmount?.quotient.toString()
- const tokenInAddress = getTokenAddressForApi(currencyIn)
-
- // Only used for bridging
- const isBridge = routing === Routing.BRIDGE
- const currencyOut = currencyOutAmount?.currency
- const tokenOutAddress = getTokenAddressForApi(currencyOut)
+ const tokenAddress = getTokenAddressForApi(currencyIn)
const approvalRequestArgs: ApprovalRequest | undefined = useMemo(() => {
- const tokenInChainId = toTradingApiSupportedChainId(chainId)
- const tokenOutChainId = toTradingApiSupportedChainId(currencyOut?.chainId)
+ const supportedChainId = toTradingApiSupportedChainId(chainId)
- if (!address || !amount || !currencyIn || !tokenInAddress || !tokenInChainId) {
- return undefined
- }
- if (isBridge && !tokenOutAddress && !tokenOutChainId) {
+ if (!address || !amount || !currencyIn || !tokenAddress || !supportedChainId) {
return undefined
}
-
return {
walletAddress: address,
- token: tokenInAddress,
+ token: tokenAddress,
amount,
- chainId: tokenInChainId,
+ chainId: supportedChainId,
includeGasInfo: true,
- tokenOut: tokenOutAddress,
- tokenOutChainId,
}
- }, [address, amount, chainId, currencyIn, currencyOut?.chainId, isBridge, tokenInAddress, tokenOutAddress])
+ }, [address, amount, chainId, currencyIn, tokenAddress])
const shouldSkip = skip || !approvalRequestArgs || isWrap || !address
const activeGasStrategy = useActiveGasStrategy(chainId, 'general')
diff --git a/packages/uniswap/src/features/transactions/swap/hooks/useTrade.ts b/packages/uniswap/src/features/transactions/swap/hooks/useTrade.ts
index 8a2c18f2a00..065d0f718be 100644
--- a/packages/uniswap/src/features/transactions/swap/hooks/useTrade.ts
+++ b/packages/uniswap/src/features/transactions/swap/hooks/useTrade.ts
@@ -73,14 +73,7 @@ export function useTrade({
const activeGasStrategy = useActiveGasStrategy(tokenInChainId, 'swap')
const shadowGasStrategies = useShadowGasStrategies(tokenInChainId, 'swap')
- const isBridging = currencyIn?.chainId !== currencyOut?.chainId
-
- const routingPreference = getRoutingPreferenceForSwapRequest(
- tradeProtocolPreference,
- uniswapXEnabled,
- isBridging,
- isUSDQuote,
- )
+ const routingPreference = getRoutingPreferenceForSwapRequest(tradeProtocolPreference, uniswapXEnabled, isUSDQuote)
const requestTradeType =
tradeType === TradeType.EXACT_INPUT ? TradingApiTradeType.EXACT_INPUT : TradingApiTradeType.EXACT_OUTPUT
diff --git a/packages/uniswap/src/features/transactions/swap/hooks/useTransactionRequestInfo.test.ts b/packages/uniswap/src/features/transactions/swap/hooks/useTransactionRequestInfo.test.ts
deleted file mode 100644
index 2e647b4a06b..00000000000
--- a/packages/uniswap/src/features/transactions/swap/hooks/useTransactionRequestInfo.test.ts
+++ /dev/null
@@ -1,123 +0,0 @@
-import { renderHook } from '@testing-library/react-hooks'
-import { providers } from 'ethers/lib/ethers'
-import { useTradingApiSwapQuery } from 'uniswap/src/data/apiClients/tradingApi/useTradingApiSwapQuery'
-import { AccountMeta, AccountType } from 'uniswap/src/features/accounts/types'
-import { useTransactionGasFee } from 'uniswap/src/features/gas/hooks'
-import { GasFeeResult } from 'uniswap/src/features/gas/types'
-import { usePermit2SignatureWithData } from 'uniswap/src/features/transactions/swap/hooks/usePermit2Signature'
-import { useTransactionRequestInfo } from 'uniswap/src/features/transactions/swap/hooks/useTransactionRequestInfo'
-import { useWrapTransactionRequest } from 'uniswap/src/features/transactions/swap/hooks/useWrapTransactionRequest'
-import { WrapType } from 'uniswap/src/features/transactions/types/wrap'
-import { ETH, WETH } from 'uniswap/src/test/fixtures'
-import { createMockDerivedSwapInfo, createMockTokenApprovalInfo } from 'uniswap/src/test/fixtures/transactions/swap'
-import { UniverseChainId } from 'uniswap/src/types/chains'
-
-jest.mock('uniswap/src/data/apiClients/tradingApi/useTradingApiSwapQuery')
-jest.mock('uniswap/src/features/transactions/swap/hooks/usePermit2Signature')
-jest.mock('uniswap/src/features/transactions/swap/hooks/useWrapTransactionRequest')
-jest.mock('uniswap/src/features/gas/hooks')
-jest.mock('uniswap/src/features/gating/hooks', () => {
- return {
- useDynamicConfigValue: jest.fn().mockImplementation((config: unknown, key: unknown, defaultVal: unknown) => {
- return defaultVal
- }),
- }
-})
-
-const mockUseTradingApiSwapQuery = useTradingApiSwapQuery as jest.Mock
-const mockUsePermit2SignatureWithData = usePermit2SignatureWithData as jest.Mock
-const mockUseWrapTransactionRequest = useWrapTransactionRequest as jest.Mock
-const mockUseTransactionGasFee = useTransactionGasFee as jest.Mock
-
-describe('useTransactionRequestInfo', () => {
- const mockAccount: AccountMeta = { address: '0x123', type: AccountType.SignerMnemonic }
- const mockWrapGasFee: GasFeeResult = {
- value: '250000',
- params: {
- gasLimit: '250000',
- maxFeePerGas: '300000',
- maxPriorityFeePerGas: '350000',
- },
- isLoading: false,
- error: null,
- }
- const swapQueryResult = {
- data: {
- requestId: '123',
- swap: {
- from: '0x123',
- data: '0x',
- value: '0',
- to: '0xSwap',
- chainId: UniverseChainId.Mainnet,
- gasLimit: '500000',
- maxFeePerGas: '600000',
- maxPriorityFeePerGas: '700000',
- },
- },
- error: null,
- isLoading: false,
- }
-
- beforeEach(() => {
- jest.clearAllMocks()
- })
-
- it('should include gas fee values from wrapGasFee in the returned wrap transactionRequest', () => {
- // Swap needs wrapping
- const mockDerivedSwapInfo = createMockDerivedSwapInfo(ETH, WETH, '1000000000000000000', '1000000000', {
- wrapType: WrapType.Wrap,
- })
- mockUseWrapTransactionRequest.mockReturnValue({
- to: '0xWrap',
- chainId: UniverseChainId.Mainnet,
- })
- mockUsePermit2SignatureWithData.mockReturnValue({ signature: undefined, isLoading: false })
- mockUseTradingApiSwapQuery.mockReturnValue(swapQueryResult)
- mockUseTransactionGasFee.mockReturnValue(mockWrapGasFee)
-
- const { result } = renderHook(() =>
- useTransactionRequestInfo({
- derivedSwapInfo: mockDerivedSwapInfo,
- tokenApprovalInfo: createMockTokenApprovalInfo(),
- account: mockAccount,
- skip: false,
- }),
- )
-
- expect(result.current.transactionRequest).toMatchObject({
- to: '0xWrap',
- chainId: UniverseChainId.Mainnet,
- gasLimit: '250000',
- maxFeePerGas: '300000',
- maxPriorityFeePerGas: '350000',
- })
- })
-
- it('should return the swap transactionRequest when wrap is not applicable', () => {
- // Swap does not need wrapping
- const mockDerivedSwapInfo = createMockDerivedSwapInfo(ETH, WETH, '1000000000000000000', '1000000000')
-
- mockUseWrapTransactionRequest.mockReturnValue(null)
- mockUsePermit2SignatureWithData.mockReturnValue({ signature: undefined, isLoading: false })
- mockUseTradingApiSwapQuery.mockReturnValue(swapQueryResult)
- mockUseTransactionGasFee.mockReturnValue({ error: null, isLoading: false })
-
- const { result } = renderHook(() =>
- useTransactionRequestInfo({
- derivedSwapInfo: mockDerivedSwapInfo,
- tokenApprovalInfo: createMockTokenApprovalInfo(),
- account: mockAccount,
- skip: false,
- }),
- )
-
- expect(result.current.transactionRequest).toMatchObject({
- to: '0xSwap',
- chainId: UniverseChainId.Mainnet,
- gasLimit: '500000',
- maxFeePerGas: '600000',
- maxPriorityFeePerGas: '700000',
- })
- })
-})
diff --git a/packages/uniswap/src/features/transactions/swap/hooks/useTransactionRequestInfo.ts b/packages/uniswap/src/features/transactions/swap/hooks/useTransactionRequestInfo.ts
index 124e4670be7..9990a06cfbf 100644
--- a/packages/uniswap/src/features/transactions/swap/hooks/useTransactionRequestInfo.ts
+++ b/packages/uniswap/src/features/transactions/swap/hooks/useTransactionRequestInfo.ts
@@ -5,7 +5,6 @@ import { useTradingApiSwapQuery } from 'uniswap/src/data/apiClients/tradingApi/u
import {
CreateSwapRequest,
NullablePermit,
- Routing,
TransactionFailureReason,
} from 'uniswap/src/data/tradingApi/__generated__/index'
import { AccountMeta } from 'uniswap/src/features/accounts/types'
@@ -19,19 +18,14 @@ import { getBaseTradeAnalyticsPropertiesFromSwapInfo } from 'uniswap/src/feature
import { usePermit2SignatureWithData } from 'uniswap/src/features/transactions/swap/hooks/usePermit2Signature'
import { useWrapTransactionRequest } from 'uniswap/src/features/transactions/swap/hooks/useWrapTransactionRequest'
import { DerivedSwapInfo } from 'uniswap/src/features/transactions/swap/types/derivedSwapInfo'
-import { SwapGasFeeEstimation } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo'
import { ApprovalAction, TokenApprovalInfo } from 'uniswap/src/features/transactions/swap/types/trade'
import { isUniswapX } from 'uniswap/src/features/transactions/swap/utils/routing'
-import {
- getBridgeQuoteFromResponse,
- getClassicQuoteFromResponse,
- isClassicQuote,
-} from 'uniswap/src/features/transactions/swap/utils/tradingApi'
+import { getClassicQuoteFromResponse } from 'uniswap/src/features/transactions/swap/utils/tradingApi'
import { GasFeeEstimates } from 'uniswap/src/features/transactions/types/transactionDetails'
import { WrapType } from 'uniswap/src/features/transactions/types/wrap'
import { isDetoxBuild } from 'utilities/src/environment/constants'
import { logger } from 'utilities/src/logger/logger'
-import { isInterface, isMobileApp } from 'utilities/src/platform'
+import { isMobileApp } from 'utilities/src/platform'
import { ONE_SECOND_MS } from 'utilities/src/time/time'
export const UNKNOWN_SIM_ERROR = 'Unknown gas simulation error'
@@ -43,7 +37,7 @@ export interface TransactionRequestInfo {
permitData?: NullablePermit
permitDataLoading?: boolean
gasFeeResult: GasFeeResult
- gasEstimate: SwapGasFeeEstimation
+ gasEstimates?: GasFeeEstimates
swapRequestArgs: CreateSwapRequest | undefined
}
@@ -65,40 +59,37 @@ export function useTransactionRequestInfo({
const { trade: tradeWithStatus, customDeadline } = derivedSwapInfo
const { trade } = tradeWithStatus || { trade: undefined }
- const isBridgeTrade = trade?.routing === Routing.BRIDGE
const permitData = trade?.quote?.permitData
- // checks within functions for type of trade
- const swapQuote = getClassicQuoteFromResponse(trade?.quote) ?? getBridgeQuoteFromResponse(trade?.quote)
+ const swapQuote = getClassicQuoteFromResponse(trade?.quote)
// Quote indicates we need to include a signed permit message
const requiresPermit2Sig = !!permitData
- // On interface, we do not fetch signature until after swap is clicked, as it requires user interaction.
- const signatureInfo = usePermit2SignatureWithData({ permitData, skip: skip || isInterface })
+ const signatureInfo = usePermit2SignatureWithData({ permitData, skip })
/**
- * Simulate transactions to ensure they will not fail on-chain.
- * Do not simulate for bridge transactions or txs that need an approval
- * as those require Tenderly to simulate and it is not currently integrated into the gas servic
+ * Simulate transactions to ensure they will not fail on-chain. Do not simulate for txs that need an approval as those require Tenderly to simulate and it is not currently integrated into the gas service
*/
- const shouldSimulateTxn = isBridgeTrade ? false : tokenApprovalInfo?.action === ApprovalAction.None
- const missingSig = requiresPermit2Sig && !signatureInfo.signature
+ const shouldSimulateTxn = tokenApprovalInfo?.action === ApprovalAction.None
// Format request args
const swapRequestArgs: CreateSwapRequest | undefined = useMemo(() => {
+ if (requiresPermit2Sig && !signatureInfo.signature) {
+ return undefined
+ }
// TODO: MOB(2438) https://linear.app/uniswap/issue/MOB-2438/uniswap-x-clean-old-trading-api-code
if (!swapQuote) {
return undefined
}
// We cant get correct calldata from /swap if we dont have a valid slippage tolerance
- if (tradeWithStatus.trade?.slippageTolerance === undefined && !isBridgeTrade) {
+ if (tradeWithStatus.trade?.slippageTolerance === undefined) {
return undefined
}
- // TODO: update this when api does slippage calculation for us
+ // TODO: remove this when api does slippage calculation for us
// https://linear.app/uniswap/issue/MOB-2581/remove-slippage-adjustment-in-swap-request
- const quote = {
+ const quoteWithSlippage = {
...swapQuote,
- slippage: tradeWithStatus.trade?.slippageTolerance,
+ slippage: tradeWithStatus.trade.slippageTolerance,
}
// if custom deadline is set (in minutes), convert to unix timestamp format from now
@@ -106,7 +97,7 @@ export function useTransactionRequestInfo({
const deadline = customDeadline ? Math.floor(Date.now() / 1000) + deadlineSeconds : undefined
const swapArgs: CreateSwapRequest = {
- quote,
+ quote: quoteWithSlippage,
permitData: permitData ?? undefined,
signature: signatureInfo.signature,
simulateTransaction: shouldSimulateTxn,
@@ -119,13 +110,13 @@ export function useTransactionRequestInfo({
}, [
activeGasStrategy,
customDeadline,
- isBridgeTrade,
permitData,
+ requiresPermit2Sig,
shadowGasStrategies,
shouldSimulateTxn,
signatureInfo.signature,
swapQuote,
- tradeWithStatus,
+ tradeWithStatus.trade?.slippageTolerance,
])
// Wrap transaction request
@@ -138,17 +129,12 @@ export function useTransactionRequestInfo({
wrapGasFeeRef.current = currentWrapGasFee
}
// Wrap gas cost should not change significantly between trades, so we can use the last value if current is unavailable.
- const wrapGasFee: GasFeeResult = useMemo(
+ const wrapGasFee = useMemo(
() => ({ ...currentWrapGasFee, value: currentWrapGasFee.value ?? wrapGasFeeRef.current.value }),
[currentWrapGasFee],
)
- const wrapTxRequestWithGasFee = useMemo(
- () => ({ ...wrapTxRequest, ...(wrapGasFee.params ?? {}) }),
- [wrapTxRequest, wrapGasFee],
- )
-
- const skipTransactionRequest = !swapRequestArgs || isWrapApplicable || skip || missingSig
+ const skipTransactionRequest = !swapRequestArgs || isWrapApplicable || skip
const tradingApiSwapRequestMs = useDynamicConfigValue(
DynamicConfigs.Swap,
@@ -173,8 +159,7 @@ export function useTransactionRequestInfo({
const swapGasFee = swapQuote?.gasFee
// This is a case where simulation fails on backend, meaning txn is expected to fail
- const simulationError =
- isClassicQuote(swapQuote) && swapQuote?.txFailureReasons?.includes(TransactionFailureReason.SIMULATION_ERROR)
+ const simulationError = swapQuote?.txFailureReasons?.includes(TransactionFailureReason.SIMULATION_ERROR)
const gasEstimateError = useMemo(
() => (simulationError ? new Error(UNKNOWN_SIM_ERROR) : error),
[simulationError, error],
@@ -225,27 +210,23 @@ export function useTransactionRequestInfo({
}
}, [data?.swap, derivedSwapInfo, formatter, gasEstimateError, swapRequestArgs, trade])
- const gasEstimate: SwapGasFeeEstimation = useMemo(() => {
+ const gasEstimates = useMemo(() => {
const activeGasEstimate = data?.gasEstimates?.find((e) => areEqualGasStrategies(e.strategy, activeGasStrategy))
- const swapGasEstimate: GasFeeEstimates | undefined = activeGasEstimate
+ return activeGasEstimate
? {
activeEstimate: activeGasEstimate,
shadowEstimates: data?.gasEstimates?.filter((e) => e !== activeGasEstimate),
}
: undefined
- return {
- swapEstimates: swapGasEstimate,
- wrapEstimates: wrapGasFee.gasEstimates,
- }
- }, [data?.gasEstimates, activeGasStrategy, wrapGasFee.gasEstimates])
+ }, [data?.gasEstimates, activeGasStrategy])
return {
gasFeeResult,
- transactionRequest: isWrapApplicable ? wrapTxRequestWithGasFee : data?.swap,
+ transactionRequest: isWrapApplicable ? wrapTxRequest : data?.swap,
permitSignature: signatureInfo.signature,
permitDataLoading: signatureInfo.isLoading,
permitData,
- gasEstimate,
+ gasEstimates,
swapRequestArgs,
}
}
diff --git a/packages/uniswap/src/features/transactions/swap/hooks/useUSDCPrice.ts b/packages/uniswap/src/features/transactions/swap/hooks/useUSDCPrice.ts
index a1eaad6e4ee..2ec119f9cc7 100644
--- a/packages/uniswap/src/features/transactions/swap/hooks/useUSDCPrice.ts
+++ b/packages/uniswap/src/features/transactions/swap/hooks/useUSDCPrice.ts
@@ -63,7 +63,7 @@ export function useUSDCPrice(currency?: Currency): Price | u
return useMemo(() => {
if (!stablecoin) {
- return undefined
+ return
}
if (currencyIsStablecoin) {
@@ -72,7 +72,7 @@ export function useUSDCPrice(currency?: Currency): Price | u
}
if (!trade || !isClassic(trade) || !trade.routes?.[0] || !quoteAmount || !currency) {
- return undefined
+ return
}
const { numerator, denominator } = trade.routes[0].midPrice
diff --git a/packages/uniswap/src/features/transactions/swap/hooks/useWrapTransactionRequest.ts b/packages/uniswap/src/features/transactions/swap/hooks/useWrapTransactionRequest.ts
index 00078485f3e..ca9ee2dbab1 100644
--- a/packages/uniswap/src/features/transactions/swap/hooks/useWrapTransactionRequest.ts
+++ b/packages/uniswap/src/features/transactions/swap/hooks/useWrapTransactionRequest.ts
@@ -42,7 +42,7 @@ const getWrapTransactionRequest = async (
currencyAmountIn: Maybe>,
): Promise => {
if (!address || !currencyAmountIn || !provider || (wrapType === WrapType.NotApplicable && !isUniswapXWrap)) {
- return undefined
+ return
}
const wethContract = await getWethContract(chainId, provider)
diff --git a/packages/uniswap/src/features/transactions/swap/modals/AcrossRoutingInfo.tsx b/packages/uniswap/src/features/transactions/swap/modals/AcrossRoutingInfo.tsx
deleted file mode 100644
index ae394e219ae..00000000000
--- a/packages/uniswap/src/features/transactions/swap/modals/AcrossRoutingInfo.tsx
+++ /dev/null
@@ -1,77 +0,0 @@
-import { useTranslation } from 'react-i18next'
-import { Flex, Text, UniversalImage } from 'ui/src'
-import { ACROSS_LOGO } from 'ui/src/assets'
-import { InfoCircle } from 'ui/src/components/icons/InfoCircle'
-import { iconSizes } from 'ui/src/theme'
-import { WarningInfo } from 'uniswap/src/components/modals/WarningModal/WarningInfo'
-import { WarningSeverity } from 'uniswap/src/components/modals/WarningModal/types'
-import { LearnMoreLink } from 'uniswap/src/components/text/LearnMoreLink'
-import { uniswapUrls } from 'uniswap/src/constants/urls'
-import { ModalName } from 'uniswap/src/features/telemetry/constants'
-import { isMobileApp } from 'utilities/src/platform'
-
-export function AcrossRoutingInfo(): JSX.Element {
- const { t } = useTranslation()
-
- return (
-
-
-
- {t('swap.details.orderRouting')}
-
-
-
-
-
-
- Across API
-
-
-
- }
- infoButton={
- isMobileApp ? (
-
- ) : undefined
- }
- modalProps={{
- caption: t('swap.details.orderRoutingInfo'),
- rejectText: t('common.button.close'),
- modalName: ModalName.AcrossRoutingInfo,
- severity: WarningSeverity.None,
- title: t('swap.details.orderRouting'),
- icon: (
-
- ),
- }}
- tooltipProps={{
- text: (
-
- {t('swap.details.orderRoutingInfo')}
-
- ),
- placement: 'top',
- }}
- trigger={null}
- />
- )
-}
diff --git a/packages/uniswap/src/features/transactions/swap/modals/FeeOnTransferWarning.tsx b/packages/uniswap/src/features/transactions/swap/modals/FeeOnTransferWarning.tsx
index d8dec731890..c40e991e7e5 100644
--- a/packages/uniswap/src/features/transactions/swap/modals/FeeOnTransferWarning.tsx
+++ b/packages/uniswap/src/features/transactions/swap/modals/FeeOnTransferWarning.tsx
@@ -26,7 +26,7 @@ export function FeeOnTransferWarning({ children }: PropsWithChildren): JSX.Eleme
modalProps={{
backgroundIconColor: colors.DEP_magentaDark.val,
caption,
- rejectText: t('common.button.close'),
+ closeText: t('common.button.close'),
icon: (
),
- rejectText: t('common.button.close'),
+ closeText: t('common.button.close'),
icon: ,
modalName: ModalName.NetworkFeeInfo,
severity: WarningSeverity.None,
diff --git a/packages/uniswap/src/features/transactions/swap/modals/PriceImpactWarning.tsx b/packages/uniswap/src/features/transactions/swap/modals/PriceImpactWarning.tsx
index 5d7bc981431..29f28c071b3 100644
--- a/packages/uniswap/src/features/transactions/swap/modals/PriceImpactWarning.tsx
+++ b/packages/uniswap/src/features/transactions/swap/modals/PriceImpactWarning.tsx
@@ -14,7 +14,7 @@ export function PriceImpactWarning({ children, warning }: PropsWithChildren<{ wa
}
isOpen={isOpen}
modalName={ModalName.SwapWarning}
severity={warning.severity}
title={warning.title ?? ''}
onClose={onClose}
- onAcknowledge={onClose}
+ onConfirm={onClose}
/>
)
}
diff --git a/packages/uniswap/src/features/transactions/swap/modals/UniswapXInfo.tsx b/packages/uniswap/src/features/transactions/swap/modals/UniswapXInfo.tsx
index f78242aedfc..e2abd512d6a 100644
--- a/packages/uniswap/src/features/transactions/swap/modals/UniswapXInfo.tsx
+++ b/packages/uniswap/src/features/transactions/swap/modals/UniswapXInfo.tsx
@@ -31,7 +31,7 @@ export function UniswapXInfo({
modalProps={{
backgroundIconColor: opacify(16, colors.uniswapXPurple),
caption: t('uniswapx.description'),
- rejectText: t('common.button.close'),
+ closeText: t('common.button.close'),
icon: ,
modalName: ModalName.UniswapXInfo,
severity: WarningSeverity.None,
diff --git a/packages/uniswap/src/features/transactions/swap/review/EstimatedTime.tsx b/packages/uniswap/src/features/transactions/swap/review/EstimatedTime.tsx
deleted file mode 100644
index 7525d03e82c..00000000000
--- a/packages/uniswap/src/features/transactions/swap/review/EstimatedTime.tsx
+++ /dev/null
@@ -1,48 +0,0 @@
-import { useMemo } from 'react'
-import { useTranslation } from 'react-i18next'
-import { Flex, Text } from 'ui/src'
-import { ONE_MINUTE_MS, ONE_SECOND_MS } from 'utilities/src/time/time'
-
-interface EstimatedTimeProps {
- timeMs?: number
- showOnlyIfLong?: boolean
-}
-
-export function EstimatedTime({ timeMs, showOnlyIfLong }: EstimatedTimeProps): JSX.Element | null {
- const { t } = useTranslation()
-
- const estimatedBridgingTime = useMemo(() => {
- if (!timeMs) {
- return null
- }
-
- const minutes = Math.floor(timeMs / ONE_MINUTE_MS)
- const seconds = Math.floor((timeMs % ONE_MINUTE_MS) / ONE_SECOND_MS)
-
- if (seconds === 0) {
- return t('bridging.estimatedTime.minutesOnly', { minutes })
- } else if (minutes === 0) {
- return t('bridging.estimatedTime.secondsOnly', { seconds })
- } else {
- return t('bridging.estimatedTime.minutesAndSeconds', {
- minutes,
- seconds,
- })
- }
- }, [timeMs, t])
-
- if (!timeMs || !estimatedBridgingTime || (showOnlyIfLong && timeMs < ONE_MINUTE_MS)) {
- return null
- }
-
- return (
-
-
- {t('swap.bridging.estimatedTime')}
-
-
- {estimatedBridgingTime}
-
-
- )
-}
diff --git a/packages/uniswap/src/features/transactions/swap/review/MaxSlippageRow.tsx b/packages/uniswap/src/features/transactions/swap/review/MaxSlippageRow.tsx
index 8eda35beeda..fe4ae674b45 100644
--- a/packages/uniswap/src/features/transactions/swap/review/MaxSlippageRow.tsx
+++ b/packages/uniswap/src/features/transactions/swap/review/MaxSlippageRow.tsx
@@ -1,4 +1,4 @@
-import { TradeType } from '@uniswap/sdk-core'
+import { Currency, TradeType } from '@uniswap/sdk-core'
import { PropsWithChildren } from 'react'
import { useTranslation } from 'react-i18next'
import { Flex, Text, TouchableArea, isWeb, useSporeColors } from 'ui/src'
@@ -13,7 +13,7 @@ import { CurrencyInfo } from 'uniswap/src/features/dataApi/types'
import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext'
import { ModalName } from 'uniswap/src/features/telemetry/constants'
import { DerivedSwapInfo } from 'uniswap/src/features/transactions/swap/types/derivedSwapInfo'
-import { BridgeTrade, IndicativeTrade, TradeWithSlippage } from 'uniswap/src/features/transactions/swap/types/trade'
+import { IndicativeTrade, Trade } from 'uniswap/src/features/transactions/swap/types/trade'
import { slippageToleranceToPercent } from 'uniswap/src/features/transactions/swap/utils/format'
import { NumberType } from 'utilities/src/format/types'
@@ -39,10 +39,6 @@ export function MaxSlippageRow({
throw new Error('Invalid render of `MaxSlippageInfo` with no `acceptedTrade`')
}
- if (acceptedTrade instanceof BridgeTrade) {
- throw new Error('Invalid render of `MaxSlippageInfo` for bridge trade')
- }
-
// If we don't have a custom slippage tolerance set, we won't have a tolerance to display for an indicative quote,
// since only the full quote has a slippage tolerance. In this case, we display a loading state until the full quote is received.
const showLoadingState = acceptedTrade.indicative && !acceptedTrade.slippageTolerance
@@ -87,7 +83,7 @@ export function MaxSlippageRow({
}
type SlippageWarningContentProps = PropsWithChildren<{
- trade: TradeWithSlippage | IndicativeTrade
+ trade: Trade | IndicativeTrade
isCustomSlippage: boolean
autoSlippageTolerance?: number
}>
@@ -186,7 +182,7 @@ export function SlippageWarningContent({
modalProps={{
backgroundIconColor: colors.surface2.get(),
captionComponent: captionContent,
- rejectText: t('common.button.close'),
+ closeText: t('common.button.close'),
icon: ,
modalName: ModalName.SlippageInfo,
severity: WarningSeverity.None,
diff --git a/packages/uniswap/src/features/transactions/swap/review/SwapDetails.tsx b/packages/uniswap/src/features/transactions/swap/review/SwapDetails.tsx
index 2bfc8c8f319..7c52d6ba88f 100644
--- a/packages/uniswap/src/features/transactions/swap/review/SwapDetails.tsx
+++ b/packages/uniswap/src/features/transactions/swap/review/SwapDetails.tsx
@@ -9,13 +9,11 @@ import Trace from 'uniswap/src/features/telemetry/Trace'
import { ElementName } from 'uniswap/src/features/telemetry/constants'
import { FeeOnTransferFeeGroupProps } from 'uniswap/src/features/transactions/TransactionDetails/FeeOnTransferFee'
import { TransactionDetails } from 'uniswap/src/features/transactions/TransactionDetails/TransactionDetails'
-import { EstimatedTime } from 'uniswap/src/features/transactions/swap/review/EstimatedTime'
import { MaxSlippageRow } from 'uniswap/src/features/transactions/swap/review/MaxSlippageRow'
import { SwapRateRatio } from 'uniswap/src/features/transactions/swap/review/SwapRateRatio'
import { DerivedSwapInfo } from 'uniswap/src/features/transactions/swap/types/derivedSwapInfo'
import { UniswapXGasBreakdown } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo'
import { getSwapFeeUsdFromDerivedSwapInfo } from 'uniswap/src/features/transactions/swap/utils/getSwapFeeUsd'
-import { isBridge } from 'uniswap/src/features/transactions/swap/utils/routing'
import { CurrencyField } from 'uniswap/src/types/currency'
import { getFormattedCurrencyAmount, getSymbolDisplayText } from 'uniswap/src/utils/currency'
import { NumberType } from 'utilities/src/format/types'
@@ -51,8 +49,6 @@ export function SwapDetails({
const formatter = useLocalizationContext()
const { convertFiatAmountFormatted, formatPercent } = formatter
- const isBridgeTrade = derivedSwapInfo.trade.trade && isBridge(derivedSwapInfo.trade.trade)
-
const trade = derivedSwapInfo.trade.trade ?? derivedSwapInfo.trade.indicativeTrade
const acceptedTrade = acceptedDerivedSwapInfo.trade.trade ?? acceptedDerivedSwapInfo.trade.indicativeTrade
@@ -81,7 +77,7 @@ export function SwapDetails({
: undefined
const feeOnTransferProps: FeeOnTransferFeeGroupProps | undefined = useMemo(() => {
- if (acceptedTrade.indicative || isBridge(acceptedTrade)) {
+ if (acceptedTrade.indicative) {
return undefined
}
@@ -95,17 +91,13 @@ export function SwapDetails({
tokenSymbol: acceptedTrade.outputAmount.currency.symbol ?? 'Token buy',
},
}
- }, [acceptedTrade])
-
- const estimatedBridgingTime = useMemo(() => {
- const tradeQuote = derivedSwapInfo.trade.trade?.quote
-
- if (!tradeQuote || !isBridge(tradeQuote)) {
- return undefined
- }
-
- return tradeQuote.quote.estimatedFillTimeMs
- }, [derivedSwapInfo.trade.trade?.quote])
+ }, [
+ acceptedTrade.inputAmount.currency.symbol,
+ acceptedTrade.inputTax,
+ acceptedTrade.outputAmount.currency.symbol,
+ acceptedTrade.outputTax,
+ acceptedTrade.indicative,
+ ])
return (
@@ -141,14 +131,11 @@ export function SwapDetails({
- {isBridgeTrade && }
- {!isBridgeTrade && (
-
- )}
+
)
}
diff --git a/packages/uniswap/src/features/transactions/swap/review/SwapReviewScreen.tsx b/packages/uniswap/src/features/transactions/swap/review/SwapReviewScreen.tsx
index 0ee9df7262c..3d9c9556681 100644
--- a/packages/uniswap/src/features/transactions/swap/review/SwapReviewScreen.tsx
+++ b/packages/uniswap/src/features/transactions/swap/review/SwapReviewScreen.tsx
@@ -5,7 +5,7 @@ import { Button, Flex, SpinningLoader, Text, isWeb, useHapticFeedback, useIsShor
import { BackArrow } from 'ui/src/components/icons/BackArrow'
import { AnimatedFlex } from 'ui/src/components/layout/AnimatedFlex'
import { iconSizes } from 'ui/src/theme'
-import { ProgressIndicator } from 'uniswap/src/components/ConfirmSwapModal/ProgressIndicator'
+import ProgressIndicator from 'uniswap/src/components/ConfirmSwapModal/ProgressIndicator'
import { WarningModal } from 'uniswap/src/components/modals/WarningModal/WarningModal'
import { useAccountMeta } from 'uniswap/src/contexts/UniswapContext'
import { AccountType } from 'uniswap/src/features/accounts/types'
@@ -29,14 +29,13 @@ import { TransactionAmountsReview } from 'uniswap/src/features/transactions/swap
import { SwapCallback } from 'uniswap/src/features/transactions/swap/types/swapCallback'
import { isValidSwapTxContext } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo'
import { WrapCallback } from 'uniswap/src/features/transactions/swap/types/wrapCallback'
-import { TransactionStep } from 'uniswap/src/features/transactions/swap/utils/generateTransactionSteps'
+import { TransactionStep, generateSwapSteps } from 'uniswap/src/features/transactions/swap/utils/generateSwapSteps'
import { isUniswapX } from 'uniswap/src/features/transactions/swap/utils/routing'
import { getActionName, isWrapAction } from 'uniswap/src/features/transactions/swap/utils/wrap'
import { WrapType } from 'uniswap/src/features/transactions/types/wrap'
import { TestID } from 'uniswap/src/test/fixtures/testIDs'
import { CurrencyField } from 'uniswap/src/types/currency'
import { createTransactionId } from 'uniswap/src/utils/createTransactionId'
-import { isInterface } from 'utilities/src/platform'
interface SwapReviewScreenProps {
hideContent: boolean
@@ -58,9 +57,7 @@ export function SwapReviewScreen(props: SwapReviewScreenProps): JSX.Element | nu
const account = useAccountMeta()
const { bottomSheetViewStyles, onClose, authTrigger, setScreen } = useTransactionModalContext()
- const [steps, setSteps] = useState([])
- const [currentStep, setCurrentStep] = useState<{ step: TransactionStep; accepted: boolean } | undefined>()
- const isShowingInterfaceReviewSteps = Boolean(isInterface && currentStep)
+ const [currentStep, _setCurrentStep] = useState<{ step: TransactionStep; accepted: boolean } | undefined>()
const swapTxContext = useSwapTxContext()
const { gasFee } = swapTxContext
@@ -74,18 +71,8 @@ export function SwapReviewScreen(props: SwapReviewScreenProps): JSX.Element | nu
isSubmitting,
updateSwapForm,
isFiatMode,
- resetSwapForm,
} = useSwapFormContext()
- const onSuccess = useCallback(() => {
- // On interface, the swap component stays mounted; after swap we reset the form to avoid showing the previous values.
- if (isInterface) {
- resetSwapForm()
- setScreen(TransactionScreen.Form)
- }
- onClose()
- }, [onClose, resetSwapForm, setScreen])
-
const {
autoSlippageTolerance,
chainId,
@@ -100,6 +87,8 @@ export function SwapReviewScreen(props: SwapReviewScreenProps): JSX.Element | nu
const isWrap = isWrapAction(wrapType)
+ const steps = useMemo(() => generateSwapSteps(swapTxContext), [swapTxContext])
+
const { blockingWarning, reviewScreenWarning } = useParsedSwapWarnings()
const {
@@ -122,14 +111,6 @@ export function SwapReviewScreen(props: SwapReviewScreenProps): JSX.Element | nu
setScreen(TransactionScreen.Form)
}, [ctxExactCurrencyField, focusOnCurrencyField, setScreen, updateSwapForm])
- const onSubmitTransactionFailed = useCallback(() => {
- setScreen(TransactionScreen.Review)
-
- // Create a new txId for the next transaction, as the existing one may be used in state to track the failed submission.
- const newTxId = createTransactionId()
- updateSwapForm({ isSubmitting: false, txId: newTxId })
- }, [setScreen, updateSwapForm])
-
const onWrap = useMemo(() => {
const inputCurrencyAmount = currencyAmounts[CurrencyField.INPUT]
const txRequest = isUniswapX(swapTxContext) ? undefined : swapTxContext.txRequest
@@ -138,28 +119,17 @@ export function SwapReviewScreen(props: SwapReviewScreenProps): JSX.Element | nu
}
return () => {
- wrapCallback({
- account,
- inputCurrencyAmount,
- onSuccess,
- onFailure: onSubmitTransactionFailed,
- txRequest,
- txId,
- wrapType,
- gasEstimates: swapTxContext.gasFeeEstimation.wrapEstimates,
- })
+ wrapCallback({ account, inputCurrencyAmount, onSuccess: onClose, txRequest, txId, wrapType })
}
- }, [
- account,
- currencyAmounts,
- isWrap,
- onSuccess,
- onSubmitTransactionFailed,
- swapTxContext,
- txId,
- wrapCallback,
- wrapType,
- ])
+ }, [account, currencyAmounts, isWrap, onClose, swapTxContext, txId, wrapCallback, wrapType])
+
+ const onSubmitTransactionFailed = useCallback(() => {
+ setScreen(TransactionScreen.Review)
+
+ // Create a new txId for the next transaction, as the existing one may be used in state to track the failed submission.
+ const newTxId = createTransactionId()
+ updateSwapForm({ isSubmitting: false, txId: newTxId })
+ }, [setScreen, updateSwapForm])
const { onSwap, validSwap } = useMemo(() => {
const isValidSwap = isValidSwapTxContext(swapTxContext)
@@ -173,12 +143,11 @@ export function SwapReviewScreen(props: SwapReviewScreenProps): JSX.Element | nu
currencyInAmountUSD: currencyAmountsUSDValue[CurrencyField.INPUT],
currencyOutAmountUSD: currencyAmountsUSDValue[CurrencyField.OUTPUT],
isAutoSlippage: !customSlippageTolerance,
- onSuccess,
+ onSubmit: onClose,
+ steps,
onFailure: onSubmitTransactionFailed,
txId,
isFiatInputMode: isFiatMode,
- setCurrentStep,
- setSteps,
})
},
validSwap: true,
@@ -194,7 +163,8 @@ export function SwapReviewScreen(props: SwapReviewScreenProps): JSX.Element | nu
currencyAmountsUSDValue,
customSlippageTolerance,
isFiatMode,
- onSuccess,
+ onClose,
+ steps,
onSubmitTransactionFailed,
swapCallback,
swapTxContext,
@@ -211,7 +181,7 @@ export function SwapReviewScreen(props: SwapReviewScreenProps): JSX.Element | nu
isWrap ? onWrap() : onSwap()
}, [reviewScreenWarning, showWarningModal, warningAcknowledged, isWrap, onWrap, onSwap])
- const onSwapButtonClick = useCallback(async () => {
+ const onSubmitTransaction = useCallback(async () => {
updateSwapForm({ isSubmitting: true })
await hapticFeedback.success()
@@ -291,15 +261,15 @@ export function SwapReviewScreen(props: SwapReviewScreenProps): JSX.Element | nu
{reviewScreenWarning?.warning.title && (
)}
@@ -312,7 +282,9 @@ export function SwapReviewScreen(props: SwapReviewScreenProps): JSX.Element | nu
/>
{currentStep ? (
-
+ acceptedTrade ? (
+
+ ) : null
) : isWrap ? (
>
- {!isShowingInterfaceReviewSteps && (
-
-
- {!isWeb && !showUniswapXSubmittingUI && (
- }
- size={isShortMobileDevice ? 'medium' : 'large'}
- theme="tertiary"
- onPress={onPrev}
- />
- )}
-
+
+ {!isWeb && !showUniswapXSubmittingUI && (
+ }
+ size={isShortMobileDevice ? 'medium' : 'large'}
+ theme="tertiary"
+ onPress={onPrev}
/>
-
-
- )}
+ )}
+
+
+
>
)
}
function SubmitButton({
submitButtonDisabled,
- onSwapButtonClick,
+ onSubmitTransaction,
showUniswapXSubmittingUI,
indicative,
wrapType,
}: {
submitButtonDisabled: boolean
- onSwapButtonClick: () => void
+ onSubmitTransaction: () => void
showUniswapXSubmittingUI: boolean
indicative: boolean
wrapType: WrapType
@@ -422,7 +392,7 @@ function SubmitButton({
icon={BiometricsIcon}
size={size}
testID={TestID.Swap}
- onPress={onSwapButtonClick}
+ onPress={onSubmitTransaction}
>
{actionText}
diff --git a/packages/uniswap/src/features/transactions/swap/review/TransactionAmountsReview.tsx b/packages/uniswap/src/features/transactions/swap/review/TransactionAmountsReview.tsx
index 9b669e06725..25545769b83 100644
--- a/packages/uniswap/src/features/transactions/swap/review/TransactionAmountsReview.tsx
+++ b/packages/uniswap/src/features/transactions/swap/review/TransactionAmountsReview.tsx
@@ -2,23 +2,15 @@ import { useTranslation } from 'react-i18next'
import { Button, Flex, Text, isWeb, useSporeColors } from 'ui/src'
import { ArrowDown } from 'ui/src/components/icons/ArrowDown'
import { X } from 'ui/src/components/icons/X'
-import { iconSizes, validColor } from 'ui/src/theme'
+import { iconSizes } from 'ui/src/theme'
import { CurrencyLogo } from 'uniswap/src/components/CurrencyLogo/CurrencyLogo'
-import { NetworkLogo } from 'uniswap/src/components/CurrencyLogo/NetworkLogo'
-import { UNIVERSE_CHAIN_INFO } from 'uniswap/src/constants/chains'
-import { toSupportedChainId } from 'uniswap/src/features/chains/utils'
import { CurrencyInfo } from 'uniswap/src/features/dataApi/types'
-import { FeatureFlags } from 'uniswap/src/features/gating/flags'
-import { useFeatureFlag } from 'uniswap/src/features/gating/hooks'
import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext'
import { useCurrencyInfo } from 'uniswap/src/features/tokens/useCurrencyInfo'
import { useUSDCValue } from 'uniswap/src/features/transactions/swap/hooks/useUSDCPrice'
import { DerivedSwapInfo } from 'uniswap/src/features/transactions/swap/types/derivedSwapInfo'
-import { isBridge } from 'uniswap/src/features/transactions/swap/utils/routing'
import { WrapType } from 'uniswap/src/features/transactions/types/wrap'
-import { UniverseChainId } from 'uniswap/src/types/chains'
import { CurrencyField } from 'uniswap/src/types/currency'
-import { useNetworkColors } from 'uniswap/src/utils/colors'
import { getSymbolDisplayText } from 'uniswap/src/utils/currency'
import { buildCurrencyId, currencyAddress } from 'uniswap/src/utils/currencyId'
import { NumberType } from 'utilities/src/format/types'
@@ -35,9 +27,6 @@ export function TransactionAmountsReview({
const { t } = useTranslation()
const colors = useSporeColors()
const { convertFiatAmountFormatted, formatCurrencyAmount } = useLocalizationContext()
-
- const isBridgingEnabled = useFeatureFlag(FeatureFlags.Bridging)
-
const {
exactCurrencyField,
trade: { trade, indicativeTrade },
@@ -47,7 +36,6 @@ export function TransactionAmountsReview({
const displayTrade = trade ?? indicativeTrade
const isWrap = wrapType !== WrapType.NotApplicable
- const isBridgeTrade = (isBridgingEnabled && trade && isBridge(trade)) ?? false
// For wraps, we need to detect if WETH is input or output, because we have logic in `useDerivedSwapInfo` that
// sets both currencAmounts to native currency, which would result in native ETH as both tokens for this UI.
@@ -127,7 +115,6 @@ export function TransactionAmountsReview({
formattedTokenAmount={formattedTokenAmountIn}
indicative={isInputIndicative}
shouldDim={shouldDimInput}
- isBridgeTrade={isBridgeTrade}
/>
@@ -138,7 +125,6 @@ export function TransactionAmountsReview({
formattedTokenAmount={formattedTokenAmountOut}
indicative={isOutputIndicative}
shouldDim={shouldDimOutput}
- isBridgeTrade={isBridgeTrade}
/>
)
@@ -150,34 +136,19 @@ function CurrencyValueWithIcon({
formattedTokenAmount,
shouldDim,
indicative,
- isBridgeTrade,
}: {
currencyInfo: CurrencyInfo
formattedFiatAmount: string
formattedTokenAmount: string
shouldDim: boolean
indicative: boolean
- isBridgeTrade: boolean
}): JSX.Element {
const amountColor = indicative ? '$neutral2' : shouldDim ? '$neutral3' : '$neutral1'
const fiatColor = indicative || shouldDim ? '$neutral3' : '$neutral2'
- const chainId = toSupportedChainId(currencyInfo.currency.chainId) ?? UniverseChainId.Mainnet
- const networkColors = useNetworkColors(chainId)
- const networkLabel = UNIVERSE_CHAIN_INFO[chainId].label
- const networkColor = validColor(networkColors.foreground)
-
return (
- {isBridgeTrade && (
-
-
-
- {networkLabel}
-
-
- )}
{formattedTokenAmount} {getSymbolDisplayText(currencyInfo.currency.symbol)}
diff --git a/packages/uniswap/src/features/transactions/swap/settings/configs/ProtocolPreference.tsx b/packages/uniswap/src/features/transactions/swap/settings/configs/ProtocolPreference.tsx
index 83161d52838..714327ed9c9 100644
--- a/packages/uniswap/src/features/transactions/swap/settings/configs/ProtocolPreference.tsx
+++ b/packages/uniswap/src/features/transactions/swap/settings/configs/ProtocolPreference.tsx
@@ -63,7 +63,6 @@ export const ProtocolPreference: SwapSettingConfig = {
},
}
-// eslint-disable-next-line consistent-return
export function getTitleFromProtocolPreference(preference: TradeProtocolPreference, t: TFunction): string {
switch (preference) {
case TradeProtocolPreference.Default:
diff --git a/packages/uniswap/src/features/transactions/swap/settings/configs/Slippage.native.tsx b/packages/uniswap/src/features/transactions/swap/settings/configs/Slippage.native.tsx
index 35f64f2eff8..f48da418b71 100644
--- a/packages/uniswap/src/features/transactions/swap/settings/configs/Slippage.native.tsx
+++ b/packages/uniswap/src/features/transactions/swap/settings/configs/Slippage.native.tsx
@@ -1,4 +1,4 @@
-import { TradeType } from '@uniswap/sdk-core'
+import { Currency, TradeType } from '@uniswap/sdk-core'
import { useTranslation } from 'react-i18next'
import { Flex, Text, TouchableArea, isWeb, useSporeColors } from 'ui/src'
import { PlusMinusButton, PlusMinusButtonType } from 'ui/src/components/button/PlusMinusButton'
@@ -13,7 +13,7 @@ import { useLocalizationContext } from 'uniswap/src/features/language/Localizati
import { useSwapFormContext } from 'uniswap/src/features/transactions/swap/contexts/SwapFormContext'
import { SwapSettingConfig } from 'uniswap/src/features/transactions/swap/settings/configs/types'
import { useSlippageSettings } from 'uniswap/src/features/transactions/swap/settings/useSlippageSettings'
-import { BridgeTrade, TradeWithSlippage } from 'uniswap/src/features/transactions/swap/types/trade'
+import { Trade } from 'uniswap/src/features/transactions/swap/types/trade'
import { slippageToleranceToPercent } from 'uniswap/src/features/transactions/swap/utils/format'
import { getSymbolDisplayText } from 'uniswap/src/utils/currency'
import { NumberType } from 'utilities/src/format/types'
@@ -72,12 +72,6 @@ export const Slippage: SwapSettingConfig = {
onPressPlusMinusButton,
} = useSlippageSettings()
- if (trade instanceof BridgeTrade) {
- // Check exists to make sure trade conforms to TradeWithSlippage,
- // since this component should not be rendered for bridge trades which don't have slippage
- return null
- }
-
return (
@@ -156,7 +150,7 @@ function SlippageMessage({
showEmpty = true,
}: {
inputWarning?: string
- trade: TradeWithSlippage | null
+ trade: Trade | null
slippageTolerance: number
showSlippageWarning: boolean
showEmpty?: boolean
diff --git a/packages/uniswap/src/features/transactions/swap/types/swapCallback.ts b/packages/uniswap/src/features/transactions/swap/types/swapCallback.ts
index 44d237a9a47..5bd4c53a335 100644
--- a/packages/uniswap/src/features/transactions/swap/types/swapCallback.ts
+++ b/packages/uniswap/src/features/transactions/swap/types/swapCallback.ts
@@ -1,9 +1,7 @@
import { CurrencyAmount, Currency } from "@uniswap/sdk-core"
import { SignerMnemonicAccountMeta } from "uniswap/src/features/accounts/types"
import { ValidatedSwapTxContext } from "uniswap/src/features/transactions/swap/types/swapTxAndGasInfo"
-import { TransactionStep } from "uniswap/src/features/transactions/swap/utils/generateTransactionSteps"
-
-export type SetCurrentStepFn = (args: { step: TransactionStep; accepted: boolean }) => void
+import { TransactionStep } from "uniswap/src/features/transactions/swap/utils/generateSwapSteps"
export interface SwapCallbackParams {
account: SignerMnemonicAccountMeta
@@ -11,11 +9,10 @@ export interface SwapCallbackParams {
currencyInAmountUSD: Maybe>
currencyOutAmountUSD: Maybe>
isAutoSlippage: boolean
- onSuccess: () => void
+ onSubmit: () => void
onFailure: () => void
txId?: string
- setCurrentStep: SetCurrentStepFn
- setSteps: (steps: TransactionStep[]) => void
+ steps: TransactionStep[]
isFiatInputMode?: boolean
}
diff --git a/packages/uniswap/src/features/transactions/swap/types/swapTxAndGasInfo.ts b/packages/uniswap/src/features/transactions/swap/types/swapTxAndGasInfo.ts
index 3eefaa5617f..8ab09de0be5 100644
--- a/packages/uniswap/src/features/transactions/swap/types/swapTxAndGasInfo.ts
+++ b/packages/uniswap/src/features/transactions/swap/types/swapTxAndGasInfo.ts
@@ -1,13 +1,12 @@
-import { Routing, CreateSwapRequest } from "uniswap/src/data/tradingApi/__generated__/index"
+import { Routing, NullablePermit, CreateSwapRequest, OrderRequest } from "uniswap/src/data/tradingApi/__generated__/index"
import { GasFeeResult } from "uniswap/src/features/gas/types"
-import { BridgeTrade, ClassicTrade, IndicativeTrade, UniswapXTrade } from "uniswap/src/features/transactions/swap/types/trade"
-import { isBridge, isClassic, isUniswapX } from "uniswap/src/features/transactions/swap/utils/routing"
-import { ValidatedPermit, ValidatedTransactionRequest } from "uniswap/src/features/transactions/swap/utils/trade"
+import { ClassicTrade, IndicativeTrade, UniswapXTrade } from "uniswap/src/features/transactions/swap/types/trade"
+import { isClassic, isUniswapX } from "uniswap/src/features/transactions/swap/utils/routing"
+import { ValidatedTransactionRequest } from "uniswap/src/features/transactions/swap/utils/trade"
import { GasFeeEstimates } from "uniswap/src/features/transactions/types/transactionDetails"
-import { isInterface } from "utilities/src/platform"
-export type SwapTxAndGasInfo = ClassicSwapTxAndGasInfo | UniswapXSwapTxAndGasInfo | BridgeSwapTxAndGasInfo
-export type ValidatedSwapTxContext = ValidatedClassicSwapTxAndGasInfo | ValidatedUniswapXSwapTxAndGasInfo | ValidatedBridgeSwapTxAndGasInfo
+export type SwapTxAndGasInfo = ClassicSwapTxAndGasInfo | UniswapXSwapTxAndGasInfo
+export type ValidatedSwapTxContext = ValidatedClassicSwapTxAndGasInfo | ValidatedUniswapXSwapTxAndGasInfo
export function isValidSwapTxContext(swapTxContext: SwapTxAndGasInfo): swapTxContext is ValidatedSwapTxContext {
// Validation fn prevents/future-proofs typeguard against illicit casts
@@ -17,7 +16,6 @@ export function isValidSwapTxContext(swapTxContext: SwapTxAndGasInfo): swapTxCon
export type SwapGasFeeEstimation = {
swapEstimates?: GasFeeEstimates
approvalEstimates?: GasFeeEstimates
- wrapEstimates?: GasFeeEstimates
}
export type UniswapXGasBreakdown = {
@@ -29,80 +27,39 @@ export type UniswapXGasBreakdown = {
interface BaseSwapTxAndGasInfo {
routing: Routing
- trade?: ClassicTrade | UniswapXTrade | BridgeTrade
+ trade?: ClassicTrade | UniswapXTrade
indicativeTrade: IndicativeTrade | undefined
approvalError: boolean
+ permitData: NullablePermit | undefined
+ permitDataLoading: boolean | undefined
approveTxRequest: ValidatedTransactionRequest | undefined
- permit: ValidatedPermit | undefined
revocationTxRequest: ValidatedTransactionRequest | undefined
gasFee: GasFeeResult
- gasFeeEstimation: SwapGasFeeEstimation
}
export interface ClassicSwapTxAndGasInfo extends BaseSwapTxAndGasInfo {
routing: Routing.CLASSIC
trade?: ClassicTrade
+ txRequest?: ValidatedTransactionRequest
swapRequestArgs: CreateSwapRequest | undefined
-
- /**
- * `unsigned` is true if `txRequest` is undefined due to a permit signature needing to be signed first.
- * This occurs on interface where the user must be prompted to sign a permit before txRequest can be fetched.
- */
- unsigned: boolean
- txRequest: ValidatedTransactionRequest | undefined
+ permitSignature: string | undefined
+ gasFeeEstimation: SwapGasFeeEstimation
}
export interface UniswapXSwapTxAndGasInfo extends BaseSwapTxAndGasInfo {
routing: Routing.DUTCH_V2
trade: UniswapXTrade
wrapTxRequest: ValidatedTransactionRequest | undefined
+ orderParams?: OrderRequest
gasFeeBreakdown: UniswapXGasBreakdown
}
-
-export interface BridgeSwapTxAndGasInfo extends BaseSwapTxAndGasInfo {
- routing: Routing.BRIDGE
- trade: BridgeTrade
- indicativeTrade: undefined
- swapRequestArgs: CreateSwapRequest | undefined
- gasFeeEstimation: SwapGasFeeEstimation
-
- /**
- * `unsigned` is true if `txRequest` is undefined due to a permit signature needing to be signed first.
- * This occurs on interface where the user must be prompted to sign a permit before txRequest can be fetched.
- */
- unsigned: boolean
- txRequest: ValidatedTransactionRequest | undefined
-}
-
interface BaseRequiredSwapTxContextFields {
approvalError: false
gasFee: ValidatedGasFeeResult
}
-export type ValidatedClassicSwapTxAndGasInfo = Required & BaseRequiredSwapTxContextFields & ({
- unsigned: true
- permit: ValidatedPermit
- txRequest: undefined
-} | {
- unsigned: false
- permit: undefined
- txRequest: ValidatedTransactionRequest
-})
-
-type ValidatedBridgeSwapTxAndGasInfo = Required & BaseRequiredSwapTxContextFields & ({
- unsigned: true
- permit: ValidatedPermit
- txRequest: undefined
-} | {
- unsigned: false
- permit: undefined
- txRequest: ValidatedTransactionRequest
-})
-
-export type ValidatedUniswapXSwapTxAndGasInfo = Required & BaseRequiredSwapTxContextFields & {
- // Permit should always be defined for UniswapX orders
- permit: ValidatedPermit
-}
+type ValidatedClassicSwapTxAndGasInfo = Required & BaseRequiredSwapTxContextFields
+type ValidatedUniswapXSwapTxAndGasInfo = Required & BaseRequiredSwapTxContextFields
function validateSwapTxContext(swapTxContext: SwapTxAndGasInfo): ValidatedSwapTxContext | undefined {
const gasFee = validateGasFeeResult(swapTxContext.gasFee)
@@ -112,34 +69,12 @@ function validateSwapTxContext(swapTxContext: SwapTxAndGasInfo): ValidatedSwapTx
if (!swapTxContext.approvalError && swapTxContext.trade) {
const { approvalError } = swapTxContext
- if (isClassic(swapTxContext)) {
- const { trade, txRequest, unsigned, permit } = swapTxContext
-
- if (unsigned) {
- // SwapTxContext should only ever be unsigned / still require a signature on interface.
- if (!isInterface || !permit) {
- return undefined
- }
- return { ...swapTxContext, trade, approvalError, gasFee, unsigned, txRequest: undefined, permit }
- } else if (txRequest) {
- return { ...swapTxContext, trade, approvalError, gasFee, unsigned, txRequest, permit: undefined }
- }
-
- } else if (isBridge(swapTxContext) && swapTxContext.txRequest) {
- const { trade, txRequest, unsigned, permit } = swapTxContext
-
- if (unsigned) {
- // SwapTxContext should only ever be unsigned / still require a signature on interface.
- if (!isInterface || !permit) {
- return undefined
- }
- return { ...swapTxContext, trade, approvalError, gasFee, unsigned, txRequest: undefined, permit }
- } else if (txRequest) {
- return { ...swapTxContext, trade, approvalError, gasFee, unsigned, txRequest, permit: undefined }
- }
- } else if (isUniswapX(swapTxContext) && swapTxContext.permit) {
- const { trade, permit } = swapTxContext
- return { ...swapTxContext, trade, gasFee, approvalError, permit }
+ if (isClassic(swapTxContext) && swapTxContext.trade && swapTxContext.txRequest) {
+ const { trade, txRequest } = swapTxContext
+ return { ...swapTxContext, trade, txRequest, approvalError, gasFee }
+ } else if (isUniswapX(swapTxContext) && swapTxContext.orderParams) {
+ const { trade, orderParams } = swapTxContext
+ return { ...swapTxContext, trade, gasFee, approvalError, orderParams }
}
}
return undefined
diff --git a/packages/uniswap/src/features/transactions/swap/types/trade.ts b/packages/uniswap/src/features/transactions/swap/types/trade.ts
index 9a541e76d14..389aed4b180 100644
--- a/packages/uniswap/src/features/transactions/swap/types/trade.ts
+++ b/packages/uniswap/src/features/transactions/swap/types/trade.ts
@@ -4,7 +4,7 @@ import { UnsignedV2DutchOrderInfo, V2DutchOrderTrade } from '@uniswap/uniswapx-s
import { Route as V2RouteSDK } from '@uniswap/v2-sdk'
import { Route as V3RouteSDK } from '@uniswap/v3-sdk'
import { AxiosError } from 'axios'
-import { BridgeQuoteResponse, ClassicQuoteResponse, DiscriminatedQuoteResponse, DutchQuoteResponse } from 'uniswap/src/data/apiClients/tradingApi/TradingApiClient'
+import { ClassicQuoteResponse, DiscriminatedQuoteResponse, DutchQuoteResponse } from 'uniswap/src/data/apiClients/tradingApi/TradingApiClient'
import { BigNumber, providers } from 'ethers/lib/ethers'
import { PollingInterval } from 'uniswap/src/constants/misc'
import {
@@ -114,9 +114,7 @@ export type Trade<
TInput extends Currency = Currency,
TOutput extends Currency = Currency,
TTradeType extends TradeType = TradeType,
-> = ClassicTrade | UniswapXTrade | BridgeTrade
-
-export type TradeWithSlippage = Exclude
+> = ClassicTrade | UniswapXTrade
// TODO(WALL-4573) - Cleanup usage of optionality/null/undefined
export interface TradeWithStatus {
@@ -261,57 +259,3 @@ export class IndicativeTrade {
this.slippageTolerance = slippageTolerance
}
}
-
-export class BridgeTrade {
- quote: BridgeQuoteResponse
- inputAmount: CurrencyAmount
- outputAmount: CurrencyAmount
- executionPrice: Price
-
- tradeType: TradeType
- readonly routing = Routing.BRIDGE
- readonly indicative = false
- readonly swapFee?: SwapFee
- readonly inputTax: Percent = ZERO_PERCENT
- readonly outputTax: Percent = ZERO_PERCENT
-
- readonly slippageTolerance: undefined
- readonly priceImpact: undefined
- readonly deadline: undefined
-
- constructor({ quote, currencyIn, currencyOut, tradeType }: { quote: BridgeQuoteResponse, currencyIn: Currency, currencyOut: Currency, tradeType: TradeType }) {
- this.quote = quote
- this.swapFee = getSwapFee(quote)
-
- const quoteInputAmount = quote.quote.input?.amount
- const quoteOutputAmount = quote.quote.output?.amount
- if (!quoteInputAmount || !quoteOutputAmount) {
- throw new Error('Error parsing bridge quote currency amounts')
- }
-
- const inputAmount = getCurrencyAmount({ value: quoteInputAmount, valueType: ValueType.Raw, currency: currencyIn })
- const outputAmount = getCurrencyAmount({ value: quoteOutputAmount, valueType: ValueType.Raw, currency: currencyOut })
- if (!inputAmount || !outputAmount) {
- throw new Error('Error parsing bridge quote currency amounts')
- }
-
- this.inputAmount = inputAmount
- this.outputAmount = outputAmount
- this.executionPrice = new Price(currencyIn, currencyOut, quoteInputAmount, quoteOutputAmount)
- this.tradeType = tradeType
- }
-
- /* Bridge trades have no slippage and hence a static execution price.
- The following methods are overridden for compatibility with other trade types */
- worstExecutionPrice(_threshold: Percent): Price {
- return this.executionPrice
- }
-
- maximumAmountIn(_slippageTolerance: Percent, _amountIn?: CurrencyAmount): CurrencyAmount {
- return this.inputAmount
- }
-
- minimumAmountOut(_slippageTolerance: Percent, _amountOut?: CurrencyAmount): CurrencyAmount {
- return this.outputAmount
- }
-}
diff --git a/packages/uniswap/src/features/transactions/swap/types/wrapCallback.ts b/packages/uniswap/src/features/transactions/swap/types/wrapCallback.ts
index b70207e93c7..0e8f5de4b83 100644
--- a/packages/uniswap/src/features/transactions/swap/types/wrapCallback.ts
+++ b/packages/uniswap/src/features/transactions/swap/types/wrapCallback.ts
@@ -1,7 +1,6 @@
import { CurrencyAmount, Currency } from "@uniswap/sdk-core"
+import { providers } from "ethers/lib/ethers"
import { AccountMeta } from "uniswap/src/features/accounts/types"
-import { ValidatedTransactionRequest } from "uniswap/src/features/transactions/swap/utils/trade"
-import { GasFeeEstimates } from "uniswap/src/features/transactions/types/transactionDetails"
import { WrapType } from "uniswap/src/features/transactions/types/wrap"
export type WrapCallbackParams = {
@@ -9,10 +8,8 @@ export type WrapCallbackParams = {
inputCurrencyAmount: CurrencyAmount
wrapType: WrapType.Wrap | WrapType.Unwrap
onSuccess: () => void
- onFailure: () => void
- txRequest: ValidatedTransactionRequest
+ txRequest: providers.TransactionRequest
txId?: string
- gasEstimates?: GasFeeEstimates
}
export type WrapCallback = (params: WrapCallbackParams) => void
diff --git a/packages/uniswap/src/features/transactions/swap/utils/asset.ts b/packages/uniswap/src/features/transactions/swap/utils/asset.ts
deleted file mode 100644
index 26b26be06a1..00000000000
--- a/packages/uniswap/src/features/transactions/swap/utils/asset.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { Currency } from '@uniswap/sdk-core'
-import { AssetType, CurrencyAsset } from 'uniswap/src/entities/assets'
-import { currencyAddress } from 'uniswap/src/utils/currencyId'
-
-export const currencyToAsset = (currency: Currency | undefined): CurrencyAsset | null => {
- if (!currency) {
- return null
- }
-
- return {
- address: currencyAddress(currency),
- chainId: currency.chainId,
- type: AssetType.Currency,
- }
-}
diff --git a/packages/uniswap/src/features/transactions/swap/utils/generateTransactionSteps.test.ts b/packages/uniswap/src/features/transactions/swap/utils/generateSwapSteps.test.ts
similarity index 71%
rename from packages/uniswap/src/features/transactions/swap/utils/generateTransactionSteps.test.ts
rename to packages/uniswap/src/features/transactions/swap/utils/generateSwapSteps.test.ts
index 81a933fde08..4ba88b79c0b 100644
--- a/packages/uniswap/src/features/transactions/swap/utils/generateTransactionSteps.test.ts
+++ b/packages/uniswap/src/features/transactions/swap/utils/generateSwapSteps.test.ts
@@ -5,22 +5,14 @@ import {
UniswapXSwapTxAndGasInfo,
} from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo'
import { ClassicTrade } from 'uniswap/src/features/transactions/swap/types/trade'
-import {
- TransactionStepType,
- generateTransactionSteps,
-} from 'uniswap/src/features/transactions/swap/utils/generateTransactionSteps'
-import { mockPermit } from 'uniswap/src/test/fixtures/permit'
+import { TransactionStepType, generateSwapSteps } from 'uniswap/src/features/transactions/swap/utils/generateSwapSteps'
import {
createMockCurrencyAmount,
createMockTradeWithStatus,
+ createMockUniswapXQuote,
createMockUniswapXTrade,
} from 'uniswap/src/test/fixtures/transactions/swap'
-const UserAgentMock = jest.requireMock('utilities/src/platform')
-jest.mock('utilities/src/platform', () => ({
- ...jest.requireActual('utilities/src/platform'),
-}))
-
const mockTrade = createMockTradeWithStatus(
createMockCurrencyAmount(USDC, '1000000000000000000'),
createMockCurrencyAmount(WBTC, '1000000000000000000'),
@@ -43,7 +35,9 @@ const baseSwapTxContext: SwapTxAndGasInfo = {
gasFee: { error: null, isLoading: false, value: '1000000000000000000' },
gasFeeEstimation: { swapEstimates: undefined, approvalEstimates: undefined },
indicativeTrade: undefined,
- permit: undefined,
+ permitData: null,
+ permitDataLoading: false,
+ permitSignature: undefined,
routing: Routing.CLASSIC,
swapRequestArgs: {
permitData: undefined,
@@ -54,13 +48,12 @@ const baseSwapTxContext: SwapTxAndGasInfo = {
},
trade: mockTrade.trade as ClassicTrade,
txRequest: mockTxRequest,
- unsigned: false,
}
-describe('generateTransactionSteps', () => {
+describe('generateSwapSteps', () => {
describe(Routing.CLASSIC, () => {
it('should return steps for classic trade with txRequest', () => {
- expect(generateTransactionSteps(baseSwapTxContext)).toEqual([
+ expect(generateSwapSteps(baseSwapTxContext)).toEqual([
{
txRequest: baseSwapTxContext.txRequest,
type: TransactionStepType.SwapTransaction,
@@ -75,17 +68,13 @@ describe('generateTransactionSteps', () => {
revocationTxRequest: mockTxRequest,
}
- expect(generateTransactionSteps(swapTxContext)).toEqual([
+ expect(generateSwapSteps(swapTxContext)).toEqual([
{
- amount: '0',
- spender: '0x000000000022D473030F116dDEE9F6B43aC78BA3',
txRequest: swapTxContext.revocationTxRequest,
token: USDC,
type: TransactionStepType.TokenRevocationTransaction,
},
{
- amount: '1000000000000000000',
- spender: '0x000000000022D473030F116dDEE9F6B43aC78BA3',
txRequest: swapTxContext.approveTxRequest,
token: USDC,
type: TransactionStepType.TokenApprovalTransaction,
@@ -103,10 +92,8 @@ describe('generateTransactionSteps', () => {
approveTxRequest: mockTxRequest,
}
- expect(generateTransactionSteps(swapTxContext)).toEqual([
+ expect(generateSwapSteps(swapTxContext)).toEqual([
{
- amount: '1000000000000000000',
- spender: '0x000000000022D473030F116dDEE9F6B43aC78BA3',
txRequest: swapTxContext.approveTxRequest,
token: USDC,
type: TransactionStepType.TokenApprovalTransaction,
@@ -119,26 +106,29 @@ describe('generateTransactionSteps', () => {
})
it('should return steps for classic trade with approval and permit required', () => {
- // We only expect `SwapTransactionAsync` step when on interface swap (unsigned w/o a wallet interaction)
- UserAgentMock.isInterface = true
-
const swapTxContext = {
...baseSwapTxContext,
approveTxRequest: mockTxRequest,
- unsigned: true,
- permit: mockPermit,
+ permitData: {
+ domain: {
+ name: 'Uniswap',
+ version: '1.0',
+ chainId: 1,
+ verifyingContract: '0x123',
+ },
+ },
}
- expect(generateTransactionSteps(swapTxContext)).toEqual([
+ expect(generateSwapSteps(swapTxContext)).toEqual([
{
- amount: '1000000000000000000',
- spender: '0x000000000022D473030F116dDEE9F6B43aC78BA3',
txRequest: swapTxContext.approveTxRequest,
token: USDC,
type: TransactionStepType.TokenApprovalTransaction,
},
{
- ...swapTxContext.permit,
+ ...swapTxContext.permitData,
+ types: undefined,
+ value: undefined,
token: USDC,
type: TransactionStepType.Permit2Signature,
},
@@ -156,6 +146,10 @@ describe('generateTransactionSteps', () => {
...baseSwapTxContext,
trade: mockUniswapXTrade,
routing: Routing.DUTCH_V2,
+ orderParams: {
+ quote: createMockUniswapXQuote(USDC.address),
+ signature: '0x000',
+ },
wrapTxRequest: mockTxRequest,
gasFeeBreakdown: {
approvalCost: '1000000000000000000',
@@ -163,20 +157,27 @@ describe('generateTransactionSteps', () => {
inputTokenSymbol: 'USDC',
wrapCost: '1000000000000000000',
},
- permit: mockPermit,
+ permitData: {
+ domain: {
+ name: 'Uniswap',
+ version: '1.0',
+ chainId: 1,
+ verifyingContract: '0x123',
+ },
+ types: undefined,
+ value: undefined,
+ },
}
- expect(generateTransactionSteps(swapTxContext)).toEqual([
+ expect(generateSwapSteps(swapTxContext)).toEqual([
{
txRequest: swapTxContext.wrapTxRequest,
type: TransactionStepType.WrapTransaction,
- amount: mockUniswapXTrade.inputAmount,
+ native: USDC,
},
{
- ...swapTxContext.permit,
+ ...swapTxContext.permitData,
type: TransactionStepType.UniswapXSignature,
- quote: swapTxContext.trade.quote.quote,
- deadline: mockUniswapXTrade.quote.quote.orderInfo.deadline,
},
])
})
@@ -186,6 +187,10 @@ describe('generateTransactionSteps', () => {
...baseSwapTxContext,
trade: mockUniswapXTrade,
routing: Routing.DUTCH_V2,
+ orderParams: {
+ quote: createMockUniswapXQuote(USDC.address),
+ signature: '0x000',
+ },
approveTxRequest: mockTxRequest,
revocationTxRequest: mockTxRequest,
wrapTxRequest: mockTxRequest,
@@ -195,34 +200,37 @@ describe('generateTransactionSteps', () => {
inputTokenSymbol: 'USDC',
wrapCost: '1000000000000000000',
},
- permit: mockPermit,
+ permitData: {
+ domain: {
+ name: 'Uniswap',
+ version: '1.0',
+ chainId: 1,
+ verifyingContract: '0x123',
+ },
+ types: undefined,
+ value: undefined,
+ },
}
- expect(generateTransactionSteps(swapTxContext)).toEqual([
+ expect(generateSwapSteps(swapTxContext)).toEqual([
{
txRequest: swapTxContext.wrapTxRequest,
type: TransactionStepType.WrapTransaction,
- amount: mockUniswapXTrade.inputAmount,
+ native: USDC,
},
{
- amount: '0',
- spender: '0x000000000022D473030F116dDEE9F6B43aC78BA3',
txRequest: swapTxContext.revocationTxRequest,
token: USDC,
type: TransactionStepType.TokenRevocationTransaction,
},
{
- amount: '44000',
- spender: '0x000000000022D473030F116dDEE9F6B43aC78BA3',
txRequest: swapTxContext.approveTxRequest,
token: USDC,
type: TransactionStepType.TokenApprovalTransaction,
},
{
- ...swapTxContext.permit,
+ ...swapTxContext.permitData,
type: TransactionStepType.UniswapXSignature,
- quote: swapTxContext.trade.quote.quote,
- deadline: mockUniswapXTrade.quote.quote.orderInfo.deadline,
},
])
})
@@ -232,6 +240,10 @@ describe('generateTransactionSteps', () => {
...baseSwapTxContext,
trade: mockUniswapXTrade,
routing: Routing.DUTCH_V2,
+ orderParams: {
+ quote: createMockUniswapXQuote(USDC.address),
+ signature: '0x000',
+ },
approveTxRequest: mockTxRequest,
wrapTxRequest: mockTxRequest,
gasFeeBreakdown: {
@@ -240,27 +252,32 @@ describe('generateTransactionSteps', () => {
inputTokenSymbol: 'USDC',
wrapCost: '1000000000000000000',
},
- permit: mockPermit,
+ permitData: {
+ domain: {
+ name: 'Uniswap',
+ version: '1.0',
+ chainId: 1,
+ verifyingContract: '0x123',
+ },
+ types: undefined,
+ value: undefined,
+ },
}
- expect(generateTransactionSteps(swapTxContext)).toEqual([
+ expect(generateSwapSteps(swapTxContext)).toEqual([
{
txRequest: swapTxContext.wrapTxRequest,
type: TransactionStepType.WrapTransaction,
- amount: mockUniswapXTrade.inputAmount,
+ native: USDC,
},
{
- amount: '44000',
- spender: '0x000000000022D473030F116dDEE9F6B43aC78BA3',
txRequest: swapTxContext.approveTxRequest,
token: USDC,
type: TransactionStepType.TokenApprovalTransaction,
},
{
- ...swapTxContext.permit,
+ ...swapTxContext.permitData,
type: TransactionStepType.UniswapXSignature,
- quote: swapTxContext.trade.quote.quote,
- deadline: mockUniswapXTrade.quote.quote.orderInfo.deadline,
},
])
})
diff --git a/packages/uniswap/src/features/transactions/swap/utils/generateTransactionSteps.ts b/packages/uniswap/src/features/transactions/swap/utils/generateSwapSteps.ts
similarity index 63%
rename from packages/uniswap/src/features/transactions/swap/utils/generateTransactionSteps.ts
rename to packages/uniswap/src/features/transactions/swap/utils/generateSwapSteps.ts
index f18ce7441b0..1c097b79f97 100644
--- a/packages/uniswap/src/features/transactions/swap/utils/generateTransactionSteps.ts
+++ b/packages/uniswap/src/features/transactions/swap/utils/generateSwapSteps.ts
@@ -1,13 +1,11 @@
import { TypedDataDomain, TypedDataField } from '@ethersproject/abstract-signer'
-import { permit2Address } from '@uniswap/permit2-sdk'
-import { Currency, CurrencyAmount, Token } from '@uniswap/sdk-core'
+import { Currency, Token } from '@uniswap/sdk-core'
import { fetchSwap } from 'uniswap/src/data/apiClients/tradingApi/TradingApiClient'
-import { CreateSwapRequest, DutchQuoteV2 } from 'uniswap/src/data/tradingApi/__generated__'
+import { CreateSwapRequest, NullablePermit } from 'uniswap/src/data/tradingApi/__generated__'
import { SwapTxAndGasInfo, isValidSwapTxContext } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo'
-import { BridgeTrade, ClassicTrade, UniswapXTrade } from 'uniswap/src/features/transactions/swap/types/trade'
-import { isBridge, isClassic, isUniswapX } from 'uniswap/src/features/transactions/swap/utils/routing'
+import { ClassicTrade, UniswapXTrade } from 'uniswap/src/features/transactions/swap/types/trade'
+import { isClassic, isUniswapX } from 'uniswap/src/features/transactions/swap/utils/routing'
import {
- ValidatedPermit,
ValidatedTransactionRequest,
validateTransactionRequest,
} from 'uniswap/src/features/transactions/swap/utils/trade'
@@ -37,46 +35,42 @@ type ClassicSwapSteps =
// TODO: add v4 lp flow
export type TransactionStep = ClassicSwapSteps | UniswapXSwapSteps
-export type OnChainTransactionStep = TransactionStep & OnChainTransactionFields
-export type SignatureTransactionStep = TransactionStep & SignTypedDataStepFields
interface SignTypedDataStepFields {
domain: TypedDataDomain
types: Record
- values: Record
+ value: Record
}
-interface OnChainTransactionFields {
- txRequest: ValidatedTransactionRequest
-}
-
-export interface WrapTransactionStep extends OnChainTransactionFields {
+interface WrapTransactionStep {
type: TransactionStepType.WrapTransaction
- amount: CurrencyAmount
+ txRequest: ValidatedTransactionRequest
+ native: Token
}
-export interface TokenApprovalTransactionStep extends OnChainTransactionFields {
+interface TokenApprovalTransactionStep {
type: TransactionStepType.TokenApprovalTransaction
- token: Token
- spender: string
- amount: string
+ txRequest: ValidatedTransactionRequest
+ token: Currency
}
-export interface TokenRevocationTransactionStep extends Omit {
+interface TokenRevocationTransactionStep {
type: TransactionStepType.TokenRevocationTransaction
- amount: '0'
+ txRequest: ValidatedTransactionRequest
+ token: Currency
}
// Classic Swap
-export interface Permit2SignatureStep extends SignTypedDataStepFields {
+interface Permit2SignatureStep extends SignTypedDataStepFields {
type: TransactionStepType.Permit2Signature
token: Currency
}
-export interface SwapTransactionStep extends OnChainTransactionFields {
+interface SwapTransactionStep {
// Swaps that don't require permit
type: TransactionStepType.SwapTransaction
+ txRequest?: ValidatedTransactionRequest
}
-export interface SwapTransactionStepAsync {
+interface SwapTransactionStepAsync {
// Swaps that require permit
type: TransactionStepType.SwapTransactionAsync
getTxRequest(signature: string): Promise // fetches tx request from trading api with signature
@@ -117,10 +111,8 @@ function orderSwapSteps(flow: ClassicSwapFlow): ClassicSwapSteps[] {
}
// UniswapX
-export interface UniswapXSignatureStep extends SignTypedDataStepFields {
+interface UniswapXSignatureStep extends SignTypedDataStepFields {
type: TransactionStepType.UniswapXSignature
- deadline: number
- quote: DutchQuoteV2
}
type UniswapXSwapFlow = {
@@ -152,7 +144,7 @@ function orderUniswapXSteps(flow: UniswapXSwapFlow): UniswapXSwapSteps[] {
function createWrapTransactionStep(
txRequest: ValidatedTransactionRequest | undefined,
- trade: UniswapXTrade | ClassicTrade | BridgeTrade | null,
+ trade: UniswapXTrade | ClassicTrade | null,
): WrapTransactionStep | undefined {
if (!trade) {
return undefined
@@ -162,71 +154,68 @@ function createWrapTransactionStep(
? {
txRequest,
type: TransactionStepType.WrapTransaction,
- amount: trade.inputAmount,
+ native: trade.inputAmount.currency.wrapped,
}
: undefined
}
function createRevocationTransactionStep(
txRequest: ValidatedTransactionRequest | undefined,
- trade: UniswapXTrade | ClassicTrade | BridgeTrade | null,
+ trade: UniswapXTrade | ClassicTrade | null,
): TokenRevocationTransactionStep | undefined {
- // Revocation can copy the approval step aside from type and amount.
- const approvalStep = createApprovalTransactionStep(txRequest, trade)
+ if (!trade) {
+ return undefined
+ }
- return approvalStep
+ return txRequest
? {
- ...approvalStep,
+ txRequest,
type: TransactionStepType.TokenRevocationTransaction,
- amount: '0',
+ token: trade.inputAmount.currency,
}
: undefined
}
function createApprovalTransactionStep(
txRequest: ValidatedTransactionRequest | undefined,
- trade: UniswapXTrade | ClassicTrade | BridgeTrade | null,
+ trade: UniswapXTrade | ClassicTrade | null,
): TokenApprovalTransactionStep | undefined {
if (!trade) {
return undefined
}
- const token = trade.inputAmount.currency.wrapped
-
return txRequest
? {
txRequest,
type: TransactionStepType.TokenApprovalTransaction,
- token,
- amount: trade.inputAmount.quotient.toString(),
- spender: permit2Address(token.chainId),
+ token: trade.inputAmount.currency,
}
: undefined
}
-function createSignOrderUniswapXStep(permitData: ValidatedPermit, quote: DutchQuoteV2): UniswapXSignatureStep {
+function createSignOrderUniswapXStep(permitData: NullablePermit | undefined): UniswapXSignatureStep {
return {
type: TransactionStepType.UniswapXSignature,
- deadline: quote.orderInfo.deadline,
- ...permitData,
- quote,
+ domain: permitData?.domain as TypedDataDomain,
+ types: permitData?.types as Record,
+ value: permitData?.values as Record,
}
}
function createPermit2SignatureStep(
- permitData: ValidatedPermit,
- trade: UniswapXTrade | ClassicTrade | BridgeTrade,
+ permitData: NullablePermit | undefined,
+ trade: UniswapXTrade | ClassicTrade,
): Permit2SignatureStep {
return {
type: TransactionStepType.Permit2Signature,
domain: permitData?.domain as TypedDataDomain,
types: permitData?.types as Record,
- values: permitData?.values as Record,
+ value: permitData?.values as Record,
token: trade.inputAmount.currency,
}
}
-function createSwapTransactionStep(txRequest: ValidatedTransactionRequest): SwapTransactionStep {
+function createSwapTransactionStep(txRequest: ValidatedTransactionRequest | undefined): SwapTransactionStep {
return {
type: TransactionStepType.SwapTransaction,
txRequest,
@@ -241,30 +230,34 @@ function createSwapTransactionAsyncStep(swapRequestArgs: CreateSwapRequest | und
return undefined
}
- const { swap } = await fetchSwap({ ...swapRequestArgs, signature })
+ const { swap } = await fetchSwap({
+ ...swapRequestArgs,
+ signature,
+ })
return validateTransactionRequest(swap)
},
}
}
-export function generateTransactionSteps(swapTxContext: SwapTxAndGasInfo): TransactionStep[] {
+export function generateSwapSteps(swapTxContext: SwapTxAndGasInfo): TransactionStep[] {
const isValidSwap = isValidSwapTxContext(swapTxContext)
if (!isValidSwap) {
return []
}
- const { trade, approveTxRequest, revocationTxRequest } = swapTxContext
+ const { trade, approveTxRequest, revocationTxRequest, permitData } = swapTxContext
if (isClassic(swapTxContext)) {
const { swapRequestArgs } = swapTxContext
+ const isSwapAsync = !!swapTxContext.permitData && !swapTxContext.permitSignature && !swapTxContext.permitDataLoading
- if (swapTxContext.unsigned) {
+ if (isSwapAsync) {
return orderSwapSteps({
revocation: createRevocationTransactionStep(revocationTxRequest, trade),
approval: createApprovalTransactionStep(approveTxRequest, trade),
- permit: createPermit2SignatureStep(swapTxContext.permit, trade),
+ permit: createPermit2SignatureStep(permitData, trade),
swap: createSwapTransactionAsyncStep(swapRequestArgs),
})
}
@@ -280,24 +273,7 @@ export function generateTransactionSteps(swapTxContext: SwapTxAndGasInfo): Trans
revocation: createRevocationTransactionStep(revocationTxRequest, trade),
wrap: createWrapTransactionStep(swapTxContext.wrapTxRequest, trade),
approval: createApprovalTransactionStep(approveTxRequest, trade),
- signOrder: createSignOrderUniswapXStep(swapTxContext.permit, swapTxContext.trade.quote.quote),
- })
- } else if (isBridge(swapTxContext)) {
- const { swapRequestArgs } = swapTxContext
-
- if (swapTxContext.unsigned) {
- return orderSwapSteps({
- revocation: createRevocationTransactionStep(revocationTxRequest, trade),
- approval: createApprovalTransactionStep(approveTxRequest, trade),
- permit: createPermit2SignatureStep(swapTxContext.permit, trade),
- swap: createSwapTransactionAsyncStep(swapRequestArgs),
- })
- }
- return orderSwapSteps({
- revocation: createRevocationTransactionStep(revocationTxRequest, trade),
- approval: createApprovalTransactionStep(approveTxRequest, trade),
- permit: undefined,
- swap: createSwapTransactionStep(swapTxContext.txRequest),
+ signOrder: createSignOrderUniswapXStep(permitData),
})
}
diff --git a/packages/uniswap/src/features/transactions/swap/utils/getSwapFeeUsd.ts b/packages/uniswap/src/features/transactions/swap/utils/getSwapFeeUsd.ts
index fda638ddf45..4ff593bcdaa 100644
--- a/packages/uniswap/src/features/transactions/swap/utils/getSwapFeeUsd.ts
+++ b/packages/uniswap/src/features/transactions/swap/utils/getSwapFeeUsd.ts
@@ -14,7 +14,7 @@ export function getSwapFeeUsd({
outputAmountUsd: CurrencyAmount
}): number | undefined {
if (!trade.swapFee) {
- return undefined
+ return
}
const outputCurrencyPricePerUnitExact = (
@@ -28,7 +28,7 @@ export function getSwapFeeUsd({
})
if (!currencyAmount) {
- return undefined
+ return
}
const feeUsd = parseFloat(outputCurrencyPricePerUnitExact) * parseFloat(currencyAmount.toExact())
diff --git a/packages/uniswap/src/features/transactions/swap/utils/routing.ts b/packages/uniswap/src/features/transactions/swap/utils/routing.ts
index d554f1a3ad0..6adc9155908 100644
--- a/packages/uniswap/src/features/transactions/swap/utils/routing.ts
+++ b/packages/uniswap/src/features/transactions/swap/utils/routing.ts
@@ -9,7 +9,3 @@ export function isUniswapX(
export function isClassic(obj: T): obj is T & { routing: Routing.CLASSIC } {
return obj.routing === Routing.CLASSIC
}
-
-export function isBridge(obj: T): obj is T & { routing: Routing.BRIDGE } {
- return obj.routing === Routing.BRIDGE
-}
diff --git a/packages/uniswap/src/features/transactions/swap/utils/trade.ts b/packages/uniswap/src/features/transactions/swap/utils/trade.ts
index 48d9ea89d8c..69dd5d11f3b 100644
--- a/packages/uniswap/src/features/transactions/swap/utils/trade.ts
+++ b/packages/uniswap/src/features/transactions/swap/utils/trade.ts
@@ -1,15 +1,13 @@
import providers from '@ethersproject/providers'
import { Protocol } from '@uniswap/router-sdk'
import { Percent, TradeType } from '@uniswap/sdk-core'
-import { NullablePermit, Permit } from 'uniswap/src/data/tradingApi/__generated__/index'
import { LocalizationContextState } from 'uniswap/src/features/language/LocalizationContext'
import { IndicativeTrade, Trade } from 'uniswap/src/features/transactions/swap/types/trade'
import { slippageToleranceToPercent } from 'uniswap/src/features/transactions/swap/utils/format'
-import { isBridge, isClassic, isUniswapX } from 'uniswap/src/features/transactions/swap/utils/routing'
+import { isClassic, isUniswapX } from 'uniswap/src/features/transactions/swap/utils/routing'
import { getClassicQuoteFromResponse } from 'uniswap/src/features/transactions/swap/utils/tradingApi'
import {
BaseSwapTransactionInfo,
- BridgeTransactionInfo,
ExactInputSwapTransactionInfo,
ExactOutputSwapTransactionInfo,
GasFeeEstimates,
@@ -23,8 +21,9 @@ export function tradeToTransactionInfo(
trade: Trade,
transactedUSDValue?: number,
gasEstimates?: GasFeeEstimates,
-): ExactInputSwapTransactionInfo | ExactOutputSwapTransactionInfo | BridgeTransactionInfo {
- const slippageTolerancePercent = slippageToleranceToPercent(trade.slippageTolerance ?? 0)
+): ExactInputSwapTransactionInfo | ExactOutputSwapTransactionInfo {
+ const slippageTolerancePercent = slippageToleranceToPercent(trade.slippageTolerance)
+
const { quote, slippageTolerance } = trade
const { quoteId, gasUseEstimate, routeString } = getClassicQuoteFromResponse(quote) ?? {}
@@ -32,20 +31,6 @@ export function tradeToTransactionInfo(
const inputCurrency = isUniswapX(trade) ? trade.inputAmount.currency.wrapped : trade.inputAmount.currency
const outputCurrency = trade.outputAmount.currency
- if (isBridge(trade)) {
- return {
- type: TransactionType.Bridge,
- inputCurrencyId: currencyId(inputCurrency),
- inputCurrencyAmountRaw: trade.inputAmount.quotient.toString(),
- outputCurrencyId: currencyId(outputCurrency),
- outputCurrencyAmountRaw: trade.outputAmount.quotient.toString(),
- quoteId,
- gasUseEstimate,
- transactedUSDValue,
- gasEstimates,
- }
- }
-
const baseTransactionInfo: BaseSwapTransactionInfo = {
type: TransactionType.Swap,
inputCurrencyId: currencyId(inputCurrency),
@@ -139,16 +124,3 @@ export function validateTransactionRequest(
}
return undefined
}
-
-type RemoveUndefined = {
- [P in keyof T]-?: Exclude
-}
-
-export type ValidatedPermit = RemoveUndefined
-export function validatePermit(permit: NullablePermit | undefined): ValidatedPermit | undefined {
- const { domain, types, values } = permit ?? {}
- if (domain && types && values) {
- return { domain, types, values }
- }
- return undefined
-}
diff --git a/packages/uniswap/src/features/transactions/swap/utils/tradingApi.ts b/packages/uniswap/src/features/transactions/swap/utils/tradingApi.ts
index b2bf3f3d445..706d6e231b9 100644
--- a/packages/uniswap/src/features/transactions/swap/utils/tradingApi.ts
+++ b/packages/uniswap/src/features/transactions/swap/utils/tradingApi.ts
@@ -3,11 +3,9 @@ import { Currency, CurrencyAmount, Token, TradeType } from '@uniswap/sdk-core'
import { Pair, Route as V2Route } from '@uniswap/v2-sdk'
import { FeeAmount, Pool, Route as V3Route } from '@uniswap/v3-sdk'
import { BigNumber } from 'ethers/lib/ethers'
-import { UNIVERSE_CHAIN_INFO } from 'uniswap/src/constants/chains'
import { MAX_AUTO_SLIPPAGE_TOLERANCE } from 'uniswap/src/constants/transactions'
import { DiscriminatedQuoteResponse } from 'uniswap/src/data/apiClients/tradingApi/TradingApiClient'
import {
- BridgeQuote,
ClassicQuote,
Quote,
QuoteResponse,
@@ -20,21 +18,20 @@ import {
} from 'uniswap/src/data/tradingApi/__generated__/index'
import { NativeCurrency } from 'uniswap/src/features/tokens/NativeCurrency'
import { ValueType, getCurrencyAmount } from 'uniswap/src/features/tokens/getCurrencyAmount'
-import { BridgeTrade, ClassicTrade, Trade, UniswapXTrade } from 'uniswap/src/features/transactions/swap/types/trade'
+import { ClassicTrade, Trade, UniswapXTrade } from 'uniswap/src/features/transactions/swap/types/trade'
import { TradeProtocolPreference } from 'uniswap/src/features/transactions/types/transactionState'
-import { UniverseChainId } from 'uniswap/src/types/chains'
import { CurrencyField } from 'uniswap/src/types/currency'
import { areAddressesEqual } from 'uniswap/src/utils/addresses'
import { currencyId } from 'uniswap/src/utils/currencyId'
import { logger } from 'utilities/src/logger/logger'
-export const NATIVE_ADDRESS_FOR_TRADING_API = '0x0000000000000000000000000000000000000000'
+const NATIVE_ADDRESS_FOR_TRADING_API = '0x0000000000000000000000000000000000000000'
interface TradingApiResponseToTradeArgs {
currencyIn: Currency
currencyOut: Currency
tradeType: TradeType
- deadline: number | undefined
+ deadline: number
slippageTolerance: number | undefined
data: DiscriminatedQuoteResponse | undefined
}
@@ -46,7 +43,7 @@ export function transformTradingApiResponseToTrade(params: TradingApiResponseToT
case Routing.CLASSIC: {
const routes = computeRoutes(currencyIn.isNative, currencyOut.isNative, data)
- if (!routes || !deadline) {
+ if (!routes) {
return null
}
@@ -73,9 +70,6 @@ export function transformTradingApiResponseToTrade(params: TradingApiResponseToT
return new UniswapXTrade({ quote: data, currencyIn, currencyOut, tradeType })
}
- case Routing.BRIDGE: {
- return new BridgeTrade({ quote: data, currencyIn, currencyOut, tradeType })
- }
default: {
return null
}
@@ -101,13 +95,13 @@ export function computeRoutes(
| undefined {
// TODO : remove quote type check for Uniswap X integration
if (!quoteResponse || !quoteResponse.quote || !isClassicQuote(quoteResponse.quote)) {
- return undefined
+ return
}
const { quote } = quoteResponse
if (!quote.route || quote.route?.length === 0) {
- return undefined
+ return
}
const tokenIn = quote.route[0]?.[0]?.tokenIn
@@ -167,7 +161,7 @@ export function computeRoutes(
}
})
} catch (e) {
- return undefined
+ return
}
}
@@ -231,14 +225,6 @@ function isV3OnlyRouteApi(route: (TradingApiV2PoolInRoute | TradingApiV3PoolInRo
return route.every((pool) => pool.type === 'v3-pool')
}
-export function getTokenAddressFromChainForTradingApi(address: Address, chainId: UniverseChainId): string {
- // For native currencies, we need to map to 0x0000000000000000000000000000000000000000
- if (address === UNIVERSE_CHAIN_INFO[chainId].nativeCurrency.address) {
- return NATIVE_ADDRESS_FOR_TRADING_API
- }
- return address
-}
-
export function getTokenAddressForApi(currency: Maybe): string | undefined {
if (!currency) {
return undefined
@@ -280,10 +266,6 @@ export function getClassicQuoteFromResponse(quote?: QuoteResponse): ClassicQuote
return isClassicQuote(quote?.quote) ? quote.quote : undefined
}
-export function getBridgeQuoteFromResponse(quote?: QuoteResponse): BridgeQuote | undefined {
- return quote?.routing === Routing.BRIDGE ? quote.quote : undefined
-}
-
/**
* The trade object should always have the same currencies and amounts as the form values
* from state - to avoid bad swap submissions we should invalidate the trade object if there are mismatches.
@@ -344,17 +326,12 @@ export function validateTrade({
export function getRoutingPreferenceForSwapRequest(
protocolPreference: TradeProtocolPreference | undefined,
uniswapXEnabled: boolean,
- isBridging: boolean,
isUSDQuote?: boolean,
): RoutingPreference {
if (isUSDQuote) {
return RoutingPreference.CLASSIC
}
- if (isBridging) {
- return RoutingPreference.BEST_PRICE
- }
-
switch (protocolPreference) {
case TradeProtocolPreference.Default:
return uniswapXEnabled ? RoutingPreference.BEST_PRICE_V2 : RoutingPreference.CLASSIC
diff --git a/packages/uniswap/src/features/transactions/types/transactionDetails.ts b/packages/uniswap/src/features/transactions/types/transactionDetails.ts
index 3871f99f243..86cd06f52f4 100644
--- a/packages/uniswap/src/features/transactions/types/transactionDetails.ts
+++ b/packages/uniswap/src/features/transactions/types/transactionDetails.ts
@@ -4,8 +4,7 @@ import { providers } from 'ethers/lib/ethers'
import { GeneratedIcon } from 'ui/src'
import { Warning, WarningColor } from 'uniswap/src/components/modals/WarningModal/types'
import { TransactionListQuery } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks'
-import { Routing } from 'uniswap/src/data/tradingApi/__generated__/index'
-import { GasEstimate } from 'uniswap/src/data/tradingApi/types'
+import { GasEstimate, Routing } from 'uniswap/src/data/tradingApi/__generated__/index'
import { AssetType } from 'uniswap/src/entities/assets'
import { WalletChainId } from 'uniswap/src/types/chains'
import { DappInfo } from 'uniswap/src/types/walletConnect'
@@ -109,14 +108,7 @@ export interface ClassicTransactionDetails extends BaseTransactionDetails {
options: TransactionOptions
}
-export interface BridgeTransactionDetails extends BaseTransactionDetails {
- routing: Routing.BRIDGE
-
- // Info for submitting the tx
- options: TransactionOptions
-}
-
-export type TransactionDetails = UniswapXOrderDetails | ClassicTransactionDetails | BridgeTransactionDetails
+export type TransactionDetails = UniswapXOrderDetails | ClassicTransactionDetails
export enum TransactionStatus {
Canceled = 'cancelled',
@@ -165,7 +157,7 @@ export type FinalizedTransactionDetails = TransactionDetails &
export type TransactionOptions = {
request: providers.TransactionRequest
- timeoutTimestampMs?: number
+ timeoutMs?: number
submitViaPrivateRpc?: boolean
}
@@ -199,7 +191,6 @@ export enum NFTTradeType {
export enum TransactionType {
// Token Specific
Approve = 'approve',
- Bridge = 'bridge',
Swap = 'swap',
Wrap = 'wrap',
@@ -253,16 +244,6 @@ export interface BaseSwapTransactionInfo extends BaseTransactionInfo {
protocol?: Protocol
}
-export interface BridgeTransactionInfo extends BaseTransactionInfo {
- type: TransactionType.Bridge
- inputCurrencyId: string
- inputCurrencyAmountRaw: string
- outputCurrencyId: string
- outputCurrencyAmountRaw: string
- quoteId?: string
- gasUseEstimate?: string
-}
-
export interface ExactInputSwapTransactionInfo extends BaseSwapTransactionInfo {
tradeType: TradeType.EXACT_INPUT
inputCurrencyAmountRaw: string
@@ -392,7 +373,6 @@ export interface UnknownTransactionInfo extends BaseTransactionInfo {
export type TransactionTypeInfo =
| ApproveTransactionInfo
- | BridgeTransactionInfo
| ExactOutputSwapTransactionInfo
| ExactInputSwapTransactionInfo
| ConfirmedSwapTransactionInfo
@@ -415,10 +395,6 @@ export function isConfirmedSwapTypeInfo(typeInfo: TransactionTypeInfo): typeInfo
)
}
-export function isBridgeTypeInfo(typeInfo: TransactionTypeInfo): typeInfo is BridgeTransactionInfo {
- return typeInfo.type === TransactionType.Bridge
-}
-
export function isFinalizedTxStatus(status: TransactionStatus): status is FinalizedTransactionStatus {
return FINAL_STATUSES.some((finalStatus) => finalStatus === status)
}
diff --git a/packages/uniswap/src/i18n/i18n-setup-interface.tsx b/packages/uniswap/src/i18n/i18n-setup-interface.tsx
index 9377af893d5..2e2fb044da6 100644
--- a/packages/uniswap/src/i18n/i18n-setup-interface.tsx
+++ b/packages/uniswap/src/i18n/i18n-setup-interface.tsx
@@ -1,7 +1,6 @@
import i18n from 'i18next'
import resourcesToBackend from 'i18next-resources-to-backend'
import { initReactI18next } from 'react-i18next'
-import { Locale } from 'uniswap/src/features/language/constants'
import enUsLocale from 'uniswap/src/i18n/locales/source/en-US.json'
import { logger } from 'utilities/src/logger/logger'
@@ -18,30 +17,16 @@ export function setupi18n(): undefined {
i18n
.use(initReactI18next)
.use(
- resourcesToBackend((locale: string) => {
+ resourcesToBackend((language: string) => {
// not sure why but it tries to load es THEN es-ES, for any language, but we just want the second
- if (!locale.includes('-')) {
- return undefined
+ if (!language.includes('-')) {
+ return
}
-
- if (locale === Locale.EnglishUnitedStates) {
+ if (language === 'en-US') {
return enUsLocale
}
-
- const localeNameToFileNameOverrides: Record = {
- [Locale.ChineseSimplified]: 'zh-CN',
- [Locale.ChineseTraditional]: 'zh-TW',
- [Locale.SpanishLatam]: Locale.SpanishSpain,
- [Locale.SpanishUnitedStates]: Locale.SpanishSpain,
- }
-
- if (Object.keys(localeNameToFileNameOverrides).includes(locale)) {
- // eslint-disable-next-line no-unsanitized/method
- return import(`./locales/translations/${localeNameToFileNameOverrides[locale]}.json`)
- }
-
// eslint-disable-next-line no-unsanitized/method
- return import(`./locales/translations/${locale}.json`)
+ return import(`./locales/translations/${language}.json`)
}),
)
.on('failedLoading', (language, namespace, msg) => {
diff --git a/packages/uniswap/src/i18n/locales/source/en-US.json b/packages/uniswap/src/i18n/locales/source/en-US.json
index ea55638c696..774bf468656 100644
--- a/packages/uniswap/src/i18n/locales/source/en-US.json
+++ b/packages/uniswap/src/i18n/locales/source/en-US.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Recipient",
"analytics.allow": "Allow analytics",
"analytics.allow.message": "We use anonymized data to enhance your experience with Uniswap Labs products.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}min",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "Enter a percent",
"chart.candlestick": "Candlestick",
"chart.error.pools": "Unable to display historical data for the current pool.",
@@ -162,12 +159,10 @@
"common.adding.v2.liquidity": "Adding V2 liquidity",
"common.addLiquidity": "Add liquidity",
"common.addressOrENS": "Wallet address or ENS name",
- "common.advanced": "Advanced",
"common.allTime": "All time",
"common.amount.label": "Amount",
"common.amountDeposited.label": "{{amount}} Deposited",
"common.amountInput.placeholder": "Input amount",
- "common.amountPerBase": "{{amount}} {{symbolA}} per {{symbolB}}",
"common.app": "App",
"common.approval.cancelled": "Approval cancelled",
"common.approval.failed": "Approval failed",
@@ -299,7 +294,6 @@
"common.currentPrice": "Current price",
"common.currentPrice.label": "Current price:",
"common.custom": "Custom",
- "common.customRange": "Custom range",
"common.dataOutdated": "Data may be outdated",
"common.defaultTradeOptions": "Default trade options",
"common.delegate.cancelled": "Delegate cancelled",
@@ -321,7 +315,6 @@
"common.dismiss": "Dismiss",
"common.displaySettings": "Display settings",
"common.dnsRegistrar": "DNS Registrar",
- "common.dontShowAgain": "Don’t show this again",
"common.download": "Download",
"common.downloadAppStore": "Download in the App Store",
"common.downloadPlayStore": "Download in the Play Store",
@@ -397,7 +390,6 @@
"common.lastPrice": "Last price",
"common.learnMoreSwap": "Learn more about swaps",
"common.legalAndPrivacy": "Legal & Privacy",
- "common.less": "Less",
"common.limit.cancel_one": "Cancel limit",
"common.limit.cancel_other": "Cancel {{count}} limits",
"common.limit.cancelled": "Limit cancelled",
@@ -489,7 +481,6 @@
"common.queue.failed": "Queue failed",
"common.queued": "Queued",
"common.queuing": "Queuing",
- "common.range": "Range",
"common.rate": "Rate",
"common.readMore": "Read more",
"common.receive": "Receive",
@@ -817,19 +808,6 @@
"fee.percentEarned": "The % you will earn in fees.",
"fee.selectPercent": "{{pct}}% select",
"fee.tier": "Fee tier",
- "fee.tier.create": "Create fee tier",
- "fee.tier.create.button": "Create new fee tier",
- "fee.tier.create.description": "Creating a new tier will initialize in a new pool and result in higher than usual network costs.",
- "fee.tier.description": "The amount earned facilitating trades. Choose an amount that suits your risk tolerance and strategy.",
- "fee.tier.description.v2": "The amount earned facilitating trades. All v2 pools have fixed 0.3% fees. For more options, provide liquidity on v4.",
- "fee.tier.label": "The % you will earn in fees",
- "fee.tier.missing.description": "Can’t find the tier you’re looking for?",
- "fee.tier.new": "New tier",
- "fee.tier.percent.select": "{{percentage}}% select",
- "fee.tier.recommended": "Recommended",
- "fee.tier.search": "Create or search for other fee tiers",
- "fee.tier.search.short": "Search tiers",
- "fee.tier.select": "Select fee tier",
"fee.tierExact": "{{fee}} fee tier",
"fiatOffRamp.checkout.title": "Sell with",
"fiatOffRamp.connection.quote": "Selling {{amount}} worth of {{currencySymbol}}",
@@ -1397,7 +1375,6 @@
"pool.startingPrice": "Starting {{sym}} Price:",
"pool.supply": "Supply",
"pool.supplyingMaths": "Supplying {{amtA}} {{symA}} and {{amtB}} {{symB}}",
- "pool.tokenPair": "Token pair",
"pool.top": "Top pools",
"pool.totalTokens": "Your total pool tokens:",
"pool.unclaimedFees": "Unclaimed fees",
@@ -1421,24 +1398,11 @@
"poolFinder.selectToken": "Select a token to find your v2 liquidity.",
"poolFinder.tip": "Tip: Use this tool to find v2 pools that don’t automatically appear in the interface.",
"pools.approving.amount": "Approving {{amount}}",
- "position.addHook": "Add a Hook",
"position.appearHere": "Your position will appear here.",
- "position.currentValue": "Current position value",
- "position.depositedCurrency": "Deposited {{currencySymbol}}",
- "position.migrate.liquidity": "When migrating positions, you cannot change your token pair, but you can add a hook to enhance functionality.",
- "position.new": "New Position",
- "position.new.protocol": "New {{protocol}} Position",
"position.noLiquidity": "Liquidity data not available.",
"position.noLiquidityData": "There is no liquidity data.",
- "position.protocol": "{{protocol}} position",
- "position.provide.liquidity": "Choose the tokens you want to provide liquidity for. You can select tokens on all supported networks.",
- "position.provide.liquidityDescription": "Providing full range liquidity ensures continuous market participation across all possible prices, offering simplicity but with potential for higher impermanent loss.",
- "position.selectRange": "Select price range",
"position.stats.feeApr": "Fee APR",
"position.stats.totalApr": "Total APR",
- "position.step.deposit": "Enter deposit amounts",
- "position.step.range": "Set price range",
- "position.step.select": "Select token pair and fees",
"position.your": "Your position",
"privacy.anonymizedLogs": "The app logs anonymized usage statistics in order to improve over time.",
"privacy.autoRouter": "The app fetches the optimal trade route from a Uniswap Labs server.",
@@ -1693,9 +1657,6 @@
"swap.approveInWallet": "Approve in your wallet",
"swap.balance.amount": "Balance: {{amount}}",
"swap.bestRoute.cost": "Best price route costs ~{{gasPrice}} in gas. ",
- "swap.bridging.estimatedTime": "Est. time",
- "swap.bridging.title": "Swap across networks",
- "swap.bridging.warning.description": "You’re swapping from {{fromNetwork}} to {{toNetwork}}.",
"swap.button.max": "Max",
"swap.button.review": "Review",
"swap.button.submitting": "Submitting swap...",
@@ -1713,8 +1674,6 @@
"swap.details.feeOnTransfer.default": "Token fee",
"swap.details.newQuote.input": "New input",
"swap.details.newQuote.output": "New output",
- "swap.details.orderRouting": "Order routing",
- "swap.details.orderRoutingInfo": "Your price already includes network costs on the destination network and a 0.05% Across fee.",
"swap.details.rate": "Rate",
"swap.details.slippage": "Max slippage",
"swap.details.uniswapFee": "Fee",
@@ -1990,7 +1949,6 @@
"tokens.selector.search.placeholder": "Search tokens",
"tokens.selector.section.bridging": "Swap across networks",
"tokens.selector.section.favorite": "Favorites",
- "tokens.selector.section.otherSearchResults": "Other tokens on {{network}}",
"tokens.selector.section.recent": "Recent searches",
"tokens.selector.section.search": "Search results",
"tokens.selector.section.yours": "Your tokens",
@@ -2171,7 +2129,7 @@
"v3.blast.yield.usdbAndWeth": "On Blast, USDB and WETH are rebasing tokens that automatically earn yield. Due to incompatibility with Uniswap v3, LP positions with USDB or WETH won’t earn rebasing yield, but will in Uniswap v2.",
"v3.continue": "Continue on v3",
"v3.rebase.unavailable": "Rebasing is unavailable on v3",
- "wallet.appSignIn": "Sign in with the app",
+ "wallet.appSignIn": "",
"wallet.connectingAgreement": "By connecting a wallet, you agree to Uniswap Labs’ Terms of Service and consent to its Privacy Policy.",
"wallet.connectionFailed.message": "The connection attempt failed. Please click try again and follow the steps to connect in your wallet.",
"wallet.other": "Other wallets",
diff --git a/packages/uniswap/src/i18n/locales/translations/af-ZA.json b/packages/uniswap/src/i18n/locales/translations/af-ZA.json
index 26808f9e279..ed3d351a43b 100644
--- a/packages/uniswap/src/i18n/locales/translations/af-ZA.json
+++ b/packages/uniswap/src/i18n/locales/translations/af-ZA.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Ontvanger",
"analytics.allow": "Laat ontledings toe",
"analytics.allow.message": "Ons gebruik anonieme data om jou ervaring met Uniswap Labs-produkte te verbeter.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}min",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "Voer 'n persentasie in",
"chart.candlestick": "Kandelaar",
"chart.error.pools": "Kan nie historiese data vir die huidige poel wys nie.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Keur in jou beursie goed",
"swap.balance.amount": "Balans: {{amount}}",
"swap.bestRoute.cost": "Beste prys roete kos ~{{gasPrice}} in gas. ",
- "swap.bridging.estimatedTime": "Geskatte tyd",
"swap.bridging.title": "Ruil oor netwerke",
"swap.bridging.warning.description": "Jy ruil van {{fromNetwork}} na {{toNetwork}}.",
"swap.button.max": "Maks",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Token fooi",
"swap.details.newQuote.input": "Nuwe insette",
"swap.details.newQuote.output": "Nuwe uitset",
- "swap.details.orderRouting": "Bestel roetering",
- "swap.details.orderRoutingInfo": "Jou prys sluit reeds netwerkkoste op die bestemmingsnetwerk en 'n 0.05% Across fooi in.",
"swap.details.rate": "Koers",
"swap.details.slippage": "Maksimum gly",
"swap.details.uniswapFee": "Fooi",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Soek tekens",
"tokens.selector.section.bridging": "Ruil oor netwerke",
"tokens.selector.section.favorite": "Gunstelinge",
- "tokens.selector.section.otherSearchResults": "Ander tekens op {{network}}",
"tokens.selector.section.recent": "Onlangse soektogte",
"tokens.selector.section.search": "Soek Resultate",
"tokens.selector.section.yours": "Jou tekens",
diff --git a/packages/uniswap/src/i18n/locales/translations/ar-SA.json b/packages/uniswap/src/i18n/locales/translations/ar-SA.json
index d613261b91b..0380d9651ab 100644
--- a/packages/uniswap/src/i18n/locales/translations/ar-SA.json
+++ b/packages/uniswap/src/i18n/locales/translations/ar-SA.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "متلقي",
"analytics.allow": "السماح بالتحليلات",
"analytics.allow.message": "نحن نستخدم بيانات مجهولة المصدر لتعزيز تجربتك مع منتجات Uniswap Labs.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}دقيقة {{seconds}}ثانية",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}دقيقة",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}س",
"burn.input.enterAPercent.error": "أدخل نسبة مئوية",
"chart.candlestick": "شمعدان",
"chart.error.pools": "غير قادر على عرض البيانات التاريخية للمجمع الحالي.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "الموافقة في محفظتك",
"swap.balance.amount": "الرصيد: {{amount}}",
"swap.bestRoute.cost": "أفضل سعر لتكاليف الطريق ~{{gasPrice}} بالغاز. ",
- "swap.bridging.estimatedTime": "الوقت المقدر",
"swap.bridging.title": "التبديل عبر الشبكات",
"swap.bridging.warning.description": "أنت تقوم بالتبديل من {{fromNetwork}} إلى {{toNetwork}}.",
"swap.button.max": "الأعلى",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "رسوم رمزية",
"swap.details.newQuote.input": "مدخلات جديدة",
"swap.details.newQuote.output": "إخراج جديد",
- "swap.details.orderRouting": "توجيه الطلب",
- "swap.details.orderRoutingInfo": "يتضمن السعر الخاص بك بالفعل تكاليف الشبكة على شبكة الوجهة ورسومًا بنسبة 0.05%.",
"swap.details.rate": "معدل",
"swap.details.slippage": "أقصى انزلاق",
"swap.details.uniswapFee": "مصاريف",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "رموز البحث",
"tokens.selector.section.bridging": "التبديل عبر الشبكات",
"tokens.selector.section.favorite": "المفضلة",
- "tokens.selector.section.otherSearchResults": "رموز أخرى على {{network}}",
"tokens.selector.section.recent": "عمليات البحث الأخيرة",
"tokens.selector.section.search": "نتائج البحث",
"tokens.selector.section.yours": "الرموز الخاصة بك",
diff --git a/packages/uniswap/src/i18n/locales/translations/ca-ES.json b/packages/uniswap/src/i18n/locales/translations/ca-ES.json
index f60974c8188..412e54d5b8a 100644
--- a/packages/uniswap/src/i18n/locales/translations/ca-ES.json
+++ b/packages/uniswap/src/i18n/locales/translations/ca-ES.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Destinatari",
"analytics.allow": "Permet analítiques",
"analytics.allow.message": "Utilitzem dades anònimes per millorar la vostra experiència amb els productes d'Uniswap Labs.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}min",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "Introduïu un percentatge",
"chart.candlestick": "Candelera",
"chart.error.pools": "No es poden mostrar les dades històriques del grup actual.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Aprova a la teva cartera",
"swap.balance.amount": "Balanç: {{amount}}",
"swap.bestRoute.cost": "La ruta al millor preu costa ~{{gasPrice}} en gasolina. ",
- "swap.bridging.estimatedTime": "Est. temps",
"swap.bridging.title": "Canvia entre xarxes",
"swap.bridging.warning.description": "Estàs canviant de {{fromNetwork}} a {{toNetwork}}.",
"swap.button.max": "Màx",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Quota de testimoni",
"swap.details.newQuote.input": "Nova entrada",
"swap.details.newQuote.output": "Sortida nova",
- "swap.details.orderRouting": "Encaminament de comandes",
- "swap.details.orderRoutingInfo": "El vostre preu ja inclou els costos de xarxa a la xarxa de destinació i una tarifa del 0,05%.",
"swap.details.rate": "Taxa",
"swap.details.slippage": "Lliscament màxim",
"swap.details.uniswapFee": "Quota",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Cerca fitxes",
"tokens.selector.section.bridging": "Canvia entre xarxes",
"tokens.selector.section.favorite": "Preferits",
- "tokens.selector.section.otherSearchResults": "Altres fitxes a {{network}}",
"tokens.selector.section.recent": "Recerques recents",
"tokens.selector.section.search": "Resultats de la cerca",
"tokens.selector.section.yours": "Les teves fitxes",
diff --git a/packages/uniswap/src/i18n/locales/translations/cs-CZ.json b/packages/uniswap/src/i18n/locales/translations/cs-CZ.json
index 57dcc4de50e..3d197dda1a3 100644
--- a/packages/uniswap/src/i18n/locales/translations/cs-CZ.json
+++ b/packages/uniswap/src/i18n/locales/translations/cs-CZ.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Příjemce",
"analytics.allow": "Povolit analýzu",
"analytics.allow.message": "Anonymizovaná data používáme k vylepšení vaší zkušenosti s produkty Uniswap Labs.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}min",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "Zadejte procento",
"chart.candlestick": "Svícen",
"chart.error.pools": "Nelze zobrazit historická data pro aktuální fond.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Schválit v peněžence",
"swap.balance.amount": "Zůstatek: {{amount}}",
"swap.bestRoute.cost": "Nejlepší cena trasy stojí ~{{gasPrice}} v plynu. ",
- "swap.bridging.estimatedTime": "Odhad. čas",
"swap.bridging.title": "Výměna napříč sítěmi",
"swap.bridging.warning.description": "Přepínáte z {{fromNetwork}} na {{toNetwork}}.",
"swap.button.max": "Max",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Token poplatek",
"swap.details.newQuote.input": "Nový vstup",
"swap.details.newQuote.output": "Nový výstup",
- "swap.details.orderRouting": "Směrování objednávky",
- "swap.details.orderRoutingInfo": "Vaše cena již zahrnuje síťové náklady v cílové síti a poplatek 0,05 % Across.",
"swap.details.rate": "Hodnotit",
"swap.details.slippage": "Maximální prokluz",
"swap.details.uniswapFee": "Poplatek",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Hledat tokeny",
"tokens.selector.section.bridging": "Výměna napříč sítěmi",
"tokens.selector.section.favorite": "Oblíbené",
- "tokens.selector.section.otherSearchResults": "Další tokeny na {{network}}",
"tokens.selector.section.recent": "Nedávná vyhledávání",
"tokens.selector.section.search": "Výsledky vyhledávání",
"tokens.selector.section.yours": "Vaše žetony",
diff --git a/packages/uniswap/src/i18n/locales/translations/da-DK.json b/packages/uniswap/src/i18n/locales/translations/da-DK.json
index f4cc6180237..ff54e8c2c59 100644
--- a/packages/uniswap/src/i18n/locales/translations/da-DK.json
+++ b/packages/uniswap/src/i18n/locales/translations/da-DK.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Modtager",
"analytics.allow": "Tillad analyser",
"analytics.allow.message": "Vi bruger anonymiserede data til at forbedre din oplevelse med Uniswap Labs-produkter.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}sek",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}min",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "Indtast en procent",
"chart.candlestick": "Lysestage",
"chart.error.pools": "Kan ikke vise historiske data for den aktuelle pulje.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Godkend i din tegnebog",
"swap.balance.amount": "Saldo: {{amount}}",
"swap.bestRoute.cost": "Bedste pris rute koster ~{{gasPrice}} i gas. ",
- "swap.bridging.estimatedTime": "Est. tid",
"swap.bridging.title": "Byt på tværs af netværk",
"swap.bridging.warning.description": "Du skifter fra {{fromNetwork}} til {{toNetwork}}.",
"swap.button.max": "Maks",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Token gebyr",
"swap.details.newQuote.input": "Nyt input",
"swap.details.newQuote.output": "Nyt output",
- "swap.details.orderRouting": "Ordredirigering",
- "swap.details.orderRoutingInfo": "Din pris inkluderer allerede netværksomkostninger på destinationsnetværket og et 0,05 % tværgående gebyr.",
"swap.details.rate": "Sats",
"swap.details.slippage": "Max glidning",
"swap.details.uniswapFee": "Betaling",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Søg tokens",
"tokens.selector.section.bridging": "Byt på tværs af netværk",
"tokens.selector.section.favorite": "Favoritter",
- "tokens.selector.section.otherSearchResults": "Andre tokens på {{network}}",
"tokens.selector.section.recent": "Seneste søgninger",
"tokens.selector.section.search": "Søgeresultater",
"tokens.selector.section.yours": "Dine tokens",
diff --git a/packages/uniswap/src/i18n/locales/translations/de-DE.json b/packages/uniswap/src/i18n/locales/translations/de-DE.json
index cdff3ac0f20..b05d41eff11 100644
--- a/packages/uniswap/src/i18n/locales/translations/de-DE.json
+++ b/packages/uniswap/src/i18n/locales/translations/de-DE.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Empfänger",
"analytics.allow": "Analysen zulassen",
"analytics.allow.message": "Wir verwenden anonymisierte Daten, um Ihre Erfahrung mit Uniswap Labs-Produkten zu verbessern.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}min",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "Geben Sie einen Prozentsatz ein",
"chart.candlestick": "Leuchter",
"chart.error.pools": "Historische Daten für den aktuellen Pool können nicht angezeigt werden.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Genehmigen Sie in Ihrer Brieftasche",
"swap.balance.amount": "Guthaben: {{amount}}",
"swap.bestRoute.cost": "Die Benzinkosten für die Route zum günstigsten Preis betragen{{gasPrice}} . ",
- "swap.bridging.estimatedTime": "Geschätzte Zeit",
"swap.bridging.title": "Netzwerkübergreifender Austausch",
"swap.bridging.warning.description": "Sie tauschen von {{fromNetwork}} zu {{toNetwork}}.",
"swap.button.max": "Max",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Token-Gebühr",
"swap.details.newQuote.input": "Neuer Input",
"swap.details.newQuote.output": "Neue Ausgabe",
- "swap.details.orderRouting": "Auftragsrouting",
- "swap.details.orderRoutingInfo": "In Ihrem Preis sind bereits die Netzwerkkosten im Zielnetz und eine Across-Gebühr von 0,05 % enthalten.",
"swap.details.rate": "Rate",
"swap.details.slippage": "Maximaler Schlupf",
"swap.details.uniswapFee": "Gebühr",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Suchtoken",
"tokens.selector.section.bridging": "Netzwerkübergreifender Austausch",
"tokens.selector.section.favorite": "Favoriten",
- "tokens.selector.section.otherSearchResults": "Andere Token auf {{network}}",
"tokens.selector.section.recent": "Letzte Suchanfragen",
"tokens.selector.section.search": "Suchergebnisse",
"tokens.selector.section.yours": "Ihre Token",
diff --git a/packages/uniswap/src/i18n/locales/translations/el-GR.json b/packages/uniswap/src/i18n/locales/translations/el-GR.json
index 1dd95cb1d4c..193d9882f61 100644
--- a/packages/uniswap/src/i18n/locales/translations/el-GR.json
+++ b/packages/uniswap/src/i18n/locales/translations/el-GR.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Παραλήπτης",
"analytics.allow": "Να επιτρέπεται η ανάλυση",
"analytics.allow.message": "Χρησιμοποιούμε ανώνυμα δεδομένα για να βελτιώσουμε την εμπειρία σας με τα προϊόντα Uniswap Labs.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}ελάχ",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "Εισαγάγετε ένα ποσοστό",
"chart.candlestick": "Κηροπήγιο",
"chart.error.pools": "Δεν είναι δυνατή η εμφάνιση ιστορικών δεδομένων για την τρέχουσα ομάδα.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Έγκριση στο πορτοφόλι σας",
"swap.balance.amount": "Υπόλοιπο: {{amount}}",
"swap.bestRoute.cost": "Η καλύτερη τιμή διαδρομής κοστίζει ~{{gasPrice}} σε φυσικό αέριο. ",
- "swap.bridging.estimatedTime": "Εκτιμ. φορά",
"swap.bridging.title": "Ανταλλαγή μεταξύ δικτύων",
"swap.bridging.warning.description": "Αλλάζετε από {{fromNetwork}} σε {{toNetwork}}.",
"swap.button.max": "Μέγιστη",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Συμβολική αμοιβή",
"swap.details.newQuote.input": "Νέα εισαγωγή",
"swap.details.newQuote.output": "Νέα έξοδος",
- "swap.details.orderRouting": "Δρομολόγηση παραγγελίας",
- "swap.details.orderRoutingInfo": "Η τιμή σας περιλαμβάνει ήδη το κόστος δικτύου στο δίκτυο προορισμού και 0,05% συνολική χρέωση.",
"swap.details.rate": "Τιμή",
"swap.details.slippage": "Μέγιστη ολίσθηση",
"swap.details.uniswapFee": "Τέλη",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Αναζήτηση διακριτικών",
"tokens.selector.section.bridging": "Ανταλλαγή μεταξύ δικτύων",
"tokens.selector.section.favorite": "Αγαπημένα",
- "tokens.selector.section.otherSearchResults": "Άλλα διακριτικά στο {{network}}",
"tokens.selector.section.recent": "Πρόσφατες αναζητήσεις",
"tokens.selector.section.search": "Αποτελέσματα αναζήτησης",
"tokens.selector.section.yours": "Οι μάρκες σας",
diff --git a/packages/uniswap/src/i18n/locales/translations/es-419.json b/packages/uniswap/src/i18n/locales/translations/es-419.json
deleted file mode 100644
index ea55638c696..00000000000
--- a/packages/uniswap/src/i18n/locales/translations/es-419.json
+++ /dev/null
@@ -1,2222 +0,0 @@
-{
- "account.authHeader.claimReward": "Claim {{amount}} reward",
- "account.cloud.backup.subtitle": "There are multiple recovery phrases backed up to your {{cloudProviderName}}.",
- "account.cloud.backup.title": "Select a backup to restore",
- "account.cloud.button.restore.android": "Restore from Google Drive",
- "account.cloud.button.restore.ios": "Restore from iCloud",
- "account.cloud.empty.description": "It looks like you haven’t backed up any of your recovery phrases to {{cloudProviderName}}.",
- "account.cloud.empty.title": "0 backups found",
- "account.cloud.error.backup.message": "Failed to import backups due to lack of permissions, interruption of authorization, or due to a cloud error",
- "account.cloud.error.backup.title": "Error while importing backups",
- "account.cloud.error.password.title": "Invalid password. Please try again.",
- "account.cloud.error.unavailable.button.cancel": "Not now",
- "account.cloud.error.unavailable.button.settings": "Go to settings",
- "account.cloud.error.unavailable.message.android": "Please verify that you are logged in to a Google account with Google Drive enabled on this device and try again.",
- "account.cloud.error.unavailable.message.ios": "Please verify that you are logged in to an Apple ID with iCloud Drive enabled on this device and try again.",
- "account.cloud.error.unavailable.title.android": "Google Drive not available",
- "account.cloud.error.unavailable.title.ios": "iCloud Drive not available",
- "account.cloud.loading.title": "Searching for backups...",
- "account.cloud.lockout.time.hours_one": "Too many attempts. Try again in 1 hour.",
- "account.cloud.lockout.time.hours_other": "Too many attempts. Try again in {{count}} hours.",
- "account.cloud.lockout.time.minutes_one": "Too many attempts. Try again in 1 minute.",
- "account.cloud.lockout.time.minutes_other": "Too many attempts. Try again in {{count}} minutes.",
- "account.cloud.password.input": "Enter password",
- "account.cloud.password.recoveryPhrase": "Enter your recovery phrase instead",
- "account.cloud.password.subtitle": "This password is required to recover your recovery phrase backup from {{cloudProviderName}}.",
- "account.cloud.password.title": "Enter backup password",
- "account.drawer.gitVersion": "Version: ",
- "account.drawer.modal.body": "Safely store and swap tokens with the Uniswap app. Available on iOS and Android.",
- "account.drawer.modal.dont": "Don’t have a Uniswap wallet?",
- "account.drawer.modal.scan": "Scan with Uniswap Wallet",
- "account.drawer.spamToggle": "Hide unknown tokens & NFTs",
- "account.porfolio.activity.cancelledBelow": "This order was canceled because your balance went below the input amount.",
- "account.portfolio.activity.signLimit": "This order will not fill because your balance went below the input amount. Increase your balance to fix.",
- "account.recoveryPhrase.education.part1": "A recovery phrase (or seed phrase) is a set of words required to access your wallet, like a password.",
- "account.recoveryPhrase.education.part2": "You can enter your recovery phrase on a new device to restore your wallet and its contents.",
- "account.recoveryPhrase.education.part3": "But, if you lose your recovery phrase, you’ll lose access to your wallet.",
- "account.recoveryPhrase.education.part4": "Instead of memorizing your recovery phrase, you can back it up to {{cloudProviderName}} and protect it with a password.",
- "account.recoveryPhrase.education.part5": "You can also manually back up your recovery phrase by writing it down and storing it in a safe place.",
- "account.recoveryPhrase.education.part6": "We recommend using both types of backups, because if you lose your recovery phrase, you won’t be able to restore your wallet.",
- "account.recoveryPhrase.error.invalid": "Invalid phrase",
- "account.recoveryPhrase.error.invalidWord": "Invalid word: {{word}}",
- "account.recoveryPhrase.error.phraseLength": "Recovery phrase must be 12-24 words",
- "account.recoveryPhrase.error.wrong": "Wrong recovery phrase",
- "account.recoveryPhrase.helpText.import": "How do I find my recovery phrase?",
- "account.recoveryPhrase.helpText.restoring": "Try searching again",
- "account.recoveryPhrase.input": "Type your recovery phrase",
- "account.recoveryPhrase.remove.final.description": "Make sure you’ve written down your recovery phrase or backed it up on {{cloudProviderName}}. You will not be able to access your funds otherwise.",
- "account.recoveryPhrase.remove.final.title": "You’re removing your recovery phrase",
- "account.recoveryPhrase.remove.import.description": "You can only store one recovery phrase at a time. To continue importing a new one, you’ll need to remove your current recovery phrase and any associated wallets from this device.",
- "account.recoveryPhrase.remove.initial.description": "This will remove your wallet from this device along with your recovery phrase.",
- "account.recoveryPhrase.remove.initial.title": "You’re removing {{walletName}}",
- "account.recoveryPhrase.remove.mnemonic.description": "It shares the same recovery phrase as {{walletNames, list}}. Your recovery phrase will remain stored until you delete all remaining wallets.",
- "account.recoveryPhrase.subtitle.import": "Your recovery phrase will only be stored locally on your device.",
- "account.recoveryPhrase.subtitle.restoring": "Enter your recovery phrase below, or try searching for backups again.",
- "account.recoveryPhrase.title.import": "Enter your recovery phrase",
- "account.recoveryPhrase.title.restoring": "No backups found",
- "account.transactionSummary.addLiquidity": "Add {{baseSymbol}}/{{quoteSymbol}} V3 liquidity",
- "account.transactionSummary.addLiquidityv2": "Add and to Uniswap V2",
- "account.transactionSummary.approve": "Approve {{tokenSymbol}}",
- "account.transactionSummary.claimFor": "Claim for {{username}}",
- "account.transactionSummary.claimReward": "Claim UNI reward for {{username}}",
- "account.transactionSummary.collectFees": "Collect {{symbol0}}/{{symbol1}} fees",
- "account.transactionSummary.createAddLiquidity": "Create pool and add {{baseSymbol}}/{{quoteSymbol}} V3 liquidity",
- "account.transactionSummary.createPool": "Create {{baseSymbol}}/{{quoteSymbol}} V3 pool",
- "account.transactionSummary.decision.abstain": "Vote to abstain on proposal {{proposalKey}} with reason "{{reason}}"",
- "account.transactionSummary.decision.against": "Vote against proposal {{proposalKey}} with reason "{{reason}}"",
- "account.transactionSummary.decision.for": "Vote for proposal {{proposalKey}} with reason "{{reason: info.reason}}"",
- "account.transactionSummary.delegateSummary": "Delegate voting power to {{username}}",
- "account.transactionSummary.depositLiquidity": "Deposit liquidity",
- "account.transactionSummary.executeProposal": "Execute proposal {{proposalKey}}.",
- "account.transactionSummary.migrateLiquidity": "Migrate {{baseSymbol}}/{{quoteSymbol}} liquidity to V3",
- "account.transactionSummary.queueProposal": "Queue proposal {{proposalKey}}.",
- "account.transactionSummary.removeLiquiditySummary": "Remove and
",
- "account.transactionSummary.revoke": "Revoke {{tokenSymbol}}",
- "account.transactionSummary.sendSummary": "Sent to {{recipient}}",
- "account.transactionSummary.submitProposal": "Submit new proposal",
- "account.transactionSummary.swapExactIn": "Swap exactly for ",
- "account.transactionSummary.swapExactOut": "Swap for exactly ",
- "account.transactionSummary.unwrapTo": "Unwrap to {{symbol}}",
- "account.transactionSummary.vote.abstain": "Vote to abstain on proposal {{proposalKey}}",
- "account.transactionSummary.vote.against": "Vote against proposal {{proposalKey}}",
- "account.transactionSummary.vote.for": "Vote for proposal {{proposalKey}}",
- "account.transactionSummary.withdrawLiquidity": "Withdraw deposited liquidity",
- "account.transactionSummary.wrapTo": "Wrap to {{symbol}}",
- "account.wallet.action.copy": "Copy wallet address",
- "account.wallet.action.report": "Report profile",
- "account.wallet.action.settings": "Wallet settings",
- "account.wallet.action.viewExplorer": "View on {{blockExplorerName}}",
- "account.wallet.button.add": "Add wallet",
- "account.wallet.button.addViewOnly": "Add a view-only wallet",
- "account.wallet.button.create": "Create a new wallet",
- "account.wallet.button.import": "Import a new wallet",
- "account.wallet.button.manage": "Manage wallet",
- "account.wallet.button.remove": "Remove wallet",
- "account.wallet.button.restore": "Restore wallet",
- "account.wallet.button.watch": "Watch a wallet",
- "account.wallet.create.placeholder": "Wallet {{index}}",
- "account.wallet.edit.label.input.placeholder": "Wallet label",
- "account.wallet.header.button.disabled.title": "Edit profile",
- "account.wallet.header.button.title": "Edit label",
- "account.wallet.header.other": "Your other wallets",
- "account.wallet.header.viewOnly": "View-only wallets",
- "account.wallet.menu.copy.title": "Copy wallet address",
- "account.wallet.menu.edit.title": "Edit label",
- "account.wallet.menu.remove.title": "Remove wallet",
- "account.wallet.remove.check": "I backed up my recovery phrase and understand that Uniswap Labs can’t help me recover my wallets if I failed to do so.",
- "account.wallet.remove.title": "Remove {{name}}",
- "account.wallet.remove.viewOnly": "You can always add back view-only wallets by entering the wallet’s address.",
- "account.wallet.restore.description": "Because you’re on a new device, you’ll need to restore your recovery phrase. This will allow you to swap and send tokens.",
- "account.wallet.select.error": "Couldn’t load addresses",
- "account.wallet.select.loading.subtitle": "Your wallets will appear below.",
- "account.wallet.select.loading.title": "Searching for wallets",
- "account.wallet.select.title_one_one": "One wallet found",
- "account.wallet.select.title_one_other": "Select wallets to import",
- "account.wallet.viewOnly.button": "Import wallet",
- "account.wallet.viewOnly.description": "To swap, buy, send, and receive tokens, you need to import this wallet’s recovery phrase.",
- "account.wallet.viewOnly.title": "This wallet is view-only",
- "account.wallet.watch.error.alreadyImported": "This address is already imported",
- "account.wallet.watch.error.notFound": "Address not found",
- "account.wallet.watch.error.smartContract": "Address is a smart contract",
- "account.wallet.watch.message": "Adding a view-only wallet allows you to try out the app or track a wallet. You will not be able to swap or send funds.",
- "account.wallet.watch.placeholder": "ENS or address",
- "account.wallet.watch.title": "Enter a wallet address",
- "activity.pending": "{{pendingActivityCount}} Pending",
- "activity.transaction.receive.descriptor": "{{amountWithSymbol}} from {{walletAddress}}",
- "activity.transaction.send.descriptor": "{{amountWithSymbol}} to {{walletAddress}}",
- "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} for {{amountWithSymbolB}}",
- "activity.transaction.swap.descriptor.formatted": " for ",
- "activity.transaction.tokens.descriptor": "{{amountWithSymbolA}} and {{amountWithSymbolB}}",
- "activity.transaction.tokens.descriptor.formatted": " and ",
- "addLiquidity.shareOfPool": "Share of pool",
- "addressInput.recipient": "Recipient",
- "analytics.allow": "Allow analytics",
- "analytics.allow.message": "We use anonymized data to enhance your experience with Uniswap Labs products.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}min",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
- "burn.input.enterAPercent.error": "Enter a percent",
- "chart.candlestick": "Candlestick",
- "chart.error.pools": "Unable to display historical data for the current pool.",
- "chart.error.tokens": "Unable to display historical data for the current token.",
- "chart.line": "Line chart",
- "chart.missingData": "Missing chart data",
- "chart.price.label.close": "Close",
- "chart.price.label.high": "High",
- "chart.price.label.low": "Low",
- "chart.price.label.open": "Open",
- "chart.settings.unavailable.label": "This setting is unavailable for the current chart",
- "claim.thanks": "Thanks for being part of the Uniswap community ",
- "claim.uni.arrived": "UNI has arrived",
- "common.accept": "Accept",
- "common.activity": "Activity",
- "common.add.label": "Add",
- "common.add.liquidity.cancelled": "Add liquidity cancelled",
- "common.add.liquidity.failed": "Add liquidity failed",
- "common.add.v2.liquidity.cancelled": "Add V2 liquidity cancelled",
- "common.add.v2.liquidity.failed": "Add V2 liquidity failed",
- "common.added.liquidity": "Added liquidity",
- "common.added.v2.liquidity": "Added V2 liquidity",
- "common.addedLiquidity": "Added Liquidity",
- "common.adding.liquidity": "Adding liquidity",
- "common.adding.v2.liquidity": "Adding V2 liquidity",
- "common.addLiquidity": "Add liquidity",
- "common.addressOrENS": "Wallet address or ENS name",
- "common.advanced": "Advanced",
- "common.allTime": "All time",
- "common.amount.label": "Amount",
- "common.amountDeposited.label": "{{amount}} Deposited",
- "common.amountInput.placeholder": "Input amount",
- "common.amountPerBase": "{{amount}} {{symbolA}} per {{symbolB}}",
- "common.app": "App",
- "common.approval.cancelled": "Approval cancelled",
- "common.approval.failed": "Approval failed",
- "common.approve": "Approve",
- "common.approved": "Approved",
- "common.approvePending": "Approval pending...",
- "common.approveSpend": "Approve {{symbol}} spending",
- "common.approving": "Approving",
- "common.automatic": "Auto",
- "common.availableIn": "Uniswap available in: ",
- "common.availableOnIOSAndroid": "Available on iOS and Android",
- "common.availableOnIOSAndroidChrome": "Available on iOS, Android, and Chrome",
- "common.blocked.ifError": "If you believe this is an error, please send an email including your address to ",
- "common.blocked.reason": "This address is blocked on the Uniswap Labs interface because it is associated with one or more blocked activities.",
- "common.blockedAddress": "Blocked address",
- "common.blog": "Blog",
- "common.borrow.cancelled": "Borrow cancelled",
- "common.borrow.failed": "Borrow failed",
- "common.borrowed": "Borrowed",
- "common.borrowing": "Borrowing",
- "common.bought": "Bought",
- "common.brandAssets": "Brand assets",
- "common.burn.cancelled": "Burn cancelled",
- "common.burn.failed": "Burn failed",
- "common.burned": "Burned",
- "common.burning": "Burning",
- "common.button.accept": "Accept",
- "common.button.back": "Back",
- "common.button.buy": "Buy",
- "common.button.cancel": "Cancel",
- "common.button.checkin": "Check in",
- "common.button.close": "Close",
- "common.button.confirm": "Confirm",
- "common.button.connect": "Connect",
- "common.button.continue": "Continue",
- "common.button.copied": "Copied",
- "common.button.copy": "Copy",
- "common.button.create": "Create",
- "common.button.delete": "Delete",
- "common.button.disconnect": "Disconnect",
- "common.button.dismiss": "Dismiss",
- "common.button.done": "Done",
- "common.button.enable": "Enable",
- "common.button.finish": "Finish",
- "common.button.goBack": "Go back",
- "common.button.later": "Maybe later",
- "common.button.learn": "Learn more",
- "common.button.next": "Next",
- "common.button.notNow": "Not now",
- "common.button.ok": "OK",
- "common.button.paste": "Paste",
- "common.button.pay": "Pay",
- "common.button.receive": "Receive",
- "common.button.remove": "Remove",
- "common.button.reset": "Reset",
- "common.button.restore": "Restore",
- "common.button.retry": "Retry",
- "common.button.reveal": "Reveal",
- "common.button.review": "Review",
- "common.button.save": "Save",
- "common.button.scrollDown": "Scroll down",
- "common.button.sell": "Sell",
- "common.button.send": "Send",
- "common.button.setup": "Set up",
- "common.button.share": "Share",
- "common.button.showLess": "Show less",
- "common.button.showMore": "Show more",
- "common.button.sign": "Sign",
- "common.button.skip": "Skip",
- "common.button.swap": "Swap",
- "common.button.tryAgain": "Try again",
- "common.button.understand": "I understand",
- "common.button.view": "View",
- "common.button.yes": "Yes",
- "common.buy.cancelled": "Buy cancelled",
- "common.buy.failed": "Buy failed",
- "common.buy.label": "Buy",
- "common.buyAndSell": "Buy and sell on Uniswap",
- "common.buying": "Buying",
- "common.by": "By",
- "common.cancel.failed": "Cancel failed",
- "common.cancellation.cancelled": "Cancellation cancelled",
- "common.cancellationSubmitted": "Cancellation submitted",
- "common.cancellationSuccessful": "Cancellation successful",
- "common.cancelled": "Cancelled",
- "common.cancelling": "Cancelling",
- "common.cancelOrder": "Cancel order",
- "common.card.error.description": "Something went wrong",
- "common.card.error.title": "Oops! Something went wrong.",
- "common.careers": "Careers",
- "common.chartType": "Chart type",
- "common.checkNetwork": "Check network status here.",
- "common.chromeExtension": "Extension",
- "common.claim.cancelled": "Claim cancelled",
- "common.claim.failed": "Claim failed",
- "common.claimed": "Claimed",
- "common.claiming": "Claiming",
- "common.claimUnis": "Claim your UNI tokens",
- "common.close": "Close",
- "common.closed": "Closed",
- "common.collect.button": "Collect",
- "common.collect.fees.cancelled": "Collect fees cancelled",
- "common.collect.fees.failed": "Collect fees failed",
- "common.collected.fees": "Collected fees",
- "common.collecting.fees": "Collecting fees",
- "common.company": "Company",
- "common.confirm": "Confirm",
- "common.confirmCancellation": "Confirm cancellation",
- "common.confirmSend.button": "Confirm send",
- "common.confirmSwap": "Confirm swap in wallet",
- "common.confirmTimedOut": "Confirmation timed out. Please retry.",
- "common.confirmTransaction.button": "Confirm this transaction in your wallet",
- "common.confirmWallet": "Confirm in wallet",
- "common.connect.button": "Connect",
- "common.connectAWallet.button": "Connect a wallet",
- "common.connectingToChain": "Connecting to {{chainName}}",
- "common.connectingWallet": "Connecting wallet...",
- "common.connectToChain.button": "Connect to {{chainName}}",
- "common.connectWallet.button": "Connect wallet",
- "common.contactUs.button": "Contact us",
- "common.contractInteraction": "Contract Interaction",
- "common.copied": "Copied",
- "common.copyLink.button": "Copy link",
- "common.create.pool.cancelled": "Create pool cancelled",
- "common.create.pool.failed": "Create pool failed",
- "common.created.pool": "Created pool",
- "common.creating.pool": "Creating pool",
- "common.currency": "Currency",
- "common.currentPrice": "Current price",
- "common.currentPrice.label": "Current price:",
- "common.custom": "Custom",
- "common.customRange": "Custom range",
- "common.dataOutdated": "Data may be outdated",
- "common.defaultTradeOptions": "Default trade options",
- "common.delegate.cancelled": "Delegate cancelled",
- "common.delegate.failed": "Delegate failed",
- "common.delegated": "Delegated",
- "common.delegating": "Delegating",
- "common.deploy.cancelled": "Deploy cancelled",
- "common.deploy.failed": "Deploy failed",
- "common.deployed": "Deployed",
- "common.deploying": "Deploying",
- "common.deposit.cancelled": "Deposit cancelled",
- "common.deposit.failed": "Deposit failed",
- "common.deposit.toNetwork": "Deposit tokens to the {{label}} network.",
- "common.deposited": "Deposited",
- "common.depositing": "Depositing",
- "common.detailed.label": "Detailed",
- "common.detected": "Detected",
- "common.developers": "Developers",
- "common.dismiss": "Dismiss",
- "common.displaySettings": "Display settings",
- "common.dnsRegistrar": "DNS Registrar",
- "common.dontShowAgain": "Don’t show this again",
- "common.download": "Download",
- "common.downloadAppStore": "Download in the App Store",
- "common.downloadPlayStore": "Download in the Play Store",
- "common.downloadUniswap": "Download Uniswap",
- "common.downloadUniswapApp": "Download the Uniswap app",
- "common.edit.button": "Edit",
- "common.error.general": "Something went wrong",
- "common.error.label": "Error",
- "common.error.request": "Sorry, an error occured while processing your request. If you request support, be sure to copy the details of this error.",
- "common.error.somethingWrong": "Something went wrong!",
- "common.error.wrong.tryAgain": "Something went wrong. Please try again.",
- "common.errorConnecting.error": "Error connecting",
- "common.errorLoadingData.error": "Error loading data",
- "common.ethereumNameService": "Ethereum Name Service",
- "common.etherscan": "Etherscan",
- "common.etherscan.link": "View on Etherscan",
- "common.ethRegistrarController": "ETH Registrar Controller",
- "common.execute.cancelled": "Execute cancelled",
- "common.execute.failed": "Execute failed",
- "common.executed": "Executed",
- "common.executing": "Executing",
- "common.expired": "Expired",
- "common.expiry": "Expiry",
- "common.explore": "Explore",
- "common.explorer": "Explorer",
- "common.exploreTokens": "Explore tokens",
- "common.extension": "Uniswap Extension",
- "common.failed.error": "Failed",
- "common.failedSwitchNetwork": "Failed to switch networks",
- "common.fee": "Fee",
- "common.fees": "Fees",
- "common.feesEarned.label": "{{symbol}} Fees Earned:",
- "common.feesEarnedPerBase": "{{symbolA}} per {{symbolB}}",
- "common.fetchingRoute": "Fetching route",
- "common.floor": "Floor",
- "common.floorPrice": "Floor price",
- "common.for": "For",
- "common.fullRange": "Full range",
- "common.getApp": "Get app",
- "common.getHelp.button": "Get help",
- "common.getStarted": "Get started",
- "common.getSupport.button": "Get support",
- "common.getTheApp": "Get the app",
- "common.getUniswapWallet": "Get Uniswap Wallet",
- "common.governance": "Governance",
- "common.happyHolidays": "Happy Holidays from the Uniswap team!",
- "common.helpCenter": "Help center",
- "common.hidden": "Hidden",
- "common.hide.button": "Hide",
- "common.highPrice": "High price",
- "common.includes": "Includes",
- "common.info.label": "Info",
- "common.input.noRecipient.error": "Select recipient",
- "common.input.password.confirm": "Confirm password",
- "common.input.password.error.mismatch": "Passwords don’t match",
- "common.input.password.error.weak": "This password is too weak",
- "common.input.password.new": "New password",
- "common.input.password.placeholder": "Password",
- "common.input.password.strength.medium": "Medium",
- "common.input.password.strength.strong": "Strong",
- "common.input.password.strength.weak": "Weak",
- "common.input.search": "Search",
- "common.insufficient.funds": "Insufficient funds",
- "common.insufficientBalance.error": "Insufficient balance",
- "common.insufficientFundsForNetworkFee.error": "Insufficient funds to cover network cost",
- "common.insufficientLiquidity": "Insufficient liquidity",
- "common.insufficientTokenBalance.error": "Insufficient {{tokenSymbol}} balance",
- "common.insufficientTokenBalance.error.simple": "Insufficient {{tokenSymbol}}",
- "common.invalidPair": "Invalid pair",
- "common.invalidRecipient.error": "Invalid recipient",
- "common.iOSAndroid": "iOS and Android",
- "common.language": "Language",
- "common.lastPrice": "Last price",
- "common.learnMoreSwap": "Learn more about swaps",
- "common.legalAndPrivacy": "Legal & Privacy",
- "common.less": "Less",
- "common.limit.cancel_one": "Cancel limit",
- "common.limit.cancel_other": "Cancel {{count}} limits",
- "common.limit.cancelled": "Limit cancelled",
- "common.limit.executed": "Limit executed",
- "common.limit.expired": "Limit expired",
- "common.limit.failed": "Limit failed",
- "common.limit.opened": "Limit opened",
- "common.limit.pending": "Limit pending",
- "common.limits": "Limits",
- "common.limits.approachMax": "Approaching 100 limit maximum",
- "common.limits.cancelProceed": "Cancel limits to proceed",
- "common.limits.expires": "Expires {{timestamp}}",
- "common.limits.open": "Open limits",
- "common.limits.when": "when {{price}} {{outSymbol}}/{{inSymbol}}",
- "common.links": "Links",
- "common.liquidity": "Liquidity",
- "common.loading": "Loading",
- "common.loadingAllowance": "Loading allowance",
- "common.longText.button.less": "Read less",
- "common.longText.button.more": "Read more",
- "common.lowPrice": "Low price",
- "common.manage": "Manage",
- "common.market.label": "Market",
- "common.max": "Max",
- "common.migrate": "Migrate",
- "common.migrate.liquidity.cancelled": "Migrate liquidity cancelled",
- "common.migrate.liquidity.failed": "Migrate liquidity failed",
- "common.migrate.position": "Migrate position",
- "common.migrated.liquidity": "Migrated liquidity",
- "common.migrating.liquidity": "Migrating liquidity",
- "common.mint.cancelled": "Mint cancelled",
- "common.mint.failed": "Mint failed",
- "common.minted": "Minted",
- "common.minting": "Minting",
- "common.mobileWallet": "Mobile wallet",
- "common.more": "More",
- "common.navigation.settings": "Settings",
- "common.navigation.systemSettings": "Settings",
- "common.navigationButton": "Navigation button",
- "common.needHelp": "Need help?",
- "common.networkCost": "Network cost",
- "common.neverMind": "Never mind",
- "common.new": "New",
- "common.nfts": "NFTs",
- "common.noActivity": "No activity yet",
- "common.noAmount.error": "Enter an amount",
- "common.noData": "No data",
- "common.noResults": "No results found.",
- "common.notAvailableInRegion.error": "Not available in your region",
- "common.notCreated.label": "Not created",
- "common.oneDay": "1 day",
- "common.oneHour": "1 hour",
- "common.oneMonth": "1 month",
- "common.oneWeek": "1 week",
- "common.oneYear": "1 year",
- "common.orderCancelled": "Order cancelled",
- "common.orderExecuted": "Order executed",
- "common.orderExpired": "Order expired",
- "common.orderPending": "Order pending",
- "common.outOfRange": "Out of range",
- "common.pageNotFound": "Page not found!",
- "common.pastDay": "Past day",
- "common.pastFiveMinutes": "Past five minutes",
- "common.pastHour": "Past hour",
- "common.pastMonth": "Past month",
- "common.pastWeek": "Past week",
- "common.pastYear": "Past year",
- "common.pay.button": "Pay",
- "common.pending": "Pending",
- "common.pending.cancellation": "Pending cancellation",
- "common.pendingEllipsis": "Pending...",
- "common.permit2": "Permit2",
- "common.pool": "Pool",
- "common.pools": "Pools",
- "common.positionUnavailable": "Position unavailable",
- "common.poweredBy": "Powered by ",
- "common.preview": "Preview",
- "common.price": "Price",
- "common.priceImpact": "Price impact warning",
- "common.priceUpdated": "Price updated",
- "common.privacyPolicy": "Privacy Policy",
- "common.proceed": "Proceed",
- "common.proceedInWallet": "Proceed in your wallet",
- "common.proceedInWallet.short": "Proceed in wallet",
- "common.protocol": "Protocol",
- "common.publicResolver": "Public Resolver",
- "common.purchased": "Purchased",
- "common.queue.cancelled": "Queue cancelled",
- "common.queue.failed": "Queue failed",
- "common.queued": "Queued",
- "common.queuing": "Queuing",
- "common.range": "Range",
- "common.rate": "Rate",
- "common.readMore": "Read more",
- "common.receive": "Receive",
- "common.receive.cancelled": "Receive cancelled",
- "common.receive.failed": "Receive failed",
- "common.received": "Received",
- "common.receiving": "Receiving",
- "common.recent": "Recent",
- "common.rejected": "Rejected",
- "common.reload.label": "Reload the app",
- "common.remove.label": "Remove",
- "common.remove.liquidity.cancelled": "Remove liquidity cancelled",
- "common.remove.liquidity.failed": "Remove liquidity failed",
- "common.removeAmount": "Remove amount",
- "common.removed.liquidity": "Removed liquidity",
- "common.removedLiquidity": "Removed Liquidity",
- "common.removeItem": "Remove item",
- "common.removing.liquidity": "Removing liquidity",
- "common.repaid": "Repaid",
- "common.repay.cancelled": "Repay cancelled",
- "common.repay.failed": "Repay failed",
- "common.repaying": "Repaying",
- "common.resetLimit": "Reset {{symbol}} limit",
- "common.resetLimitWallet": "Reset {{symbol}} limit in wallet",
- "common.resettingLimit": "Resetting {{symbol}} limit...",
- "common.resolveIssue": "Resolve issue",
- "common.resolveIssues": "Resolve {{issues}} issues",
- "common.restricted.region": "Restricted region",
- "common.return.label": "Return",
- "common.returnToTop": "Return to top",
- "common.reverseRegistrar": "Reverse Registrar",
- "common.revoke.approval.failed": "Revoke approval failed",
- "common.revoked.approval": "Revoked approval",
- "common.revokedApproval": "Revoked Approval",
- "common.revoking.approval": "Revoking approval",
- "common.samePrice": "Same price",
- "common.scanQRDownload": "Scan the QR code with your phone to download",
- "common.searchTokensNFT": "Search tokens and NFT collections",
- "common.selectRegion.label": "Select your region",
- "common.selectToken.label": "Select a token",
- "common.sell.label": "Sell",
- "common.send.button": "Send",
- "common.send.cancelled": "Send cancelled",
- "common.send.failed": "Send failed",
- "common.sending": "Sending",
- "common.sent": "Sent",
- "common.settings": "Settings",
- "common.share": "Share",
- "common.share.shareToTwitter": "Share to Twitter",
- "common.share.twitter": "Share on Twitter",
- "common.show.button": "Show",
- "common.showLess.button": "Show less",
- "common.showMore.button": "Show more",
- "common.signatureExpired": "Your signature has expired.",
- "common.signMessage": "Sign message",
- "common.signMessageWallet": "Sign message in wallet",
- "common.simple.label": "Simple",
- "common.sold": "Sold",
- "common.stats": "Stats",
- "common.status": "Status",
- "common.stayConnected": "Stay connected",
- "common.step.number": "Step {{number}}",
- "common.submit.proposal.cancelled": "Submit proposal cancelled",
- "common.submit.proposal.failed": "Submit proposal failed",
- "common.submitted.proposal": "Submitted proposal",
- "common.submitting.proposal": "Submitting proposal",
- "common.success": "Success",
- "common.swap": "Swap",
- "common.swap.cancelled": "Swap cancelled",
- "common.swap.expired": "Swap expired",
- "common.swap.failed": "Swap failed",
- "common.swapped": "Swapped",
- "common.swapPending": "Swap pending...",
- "common.swapping": "Swapping",
- "common.switchNetworks": "Switch networks",
- "common.termsOfService": "Terms of Service",
- "common.text.connected": "Connected",
- "common.text.contract": "Contract",
- "common.text.disconnected": "Disconnected",
- "common.text.error": "Error",
- "common.text.notAvailable": "N/A",
- "common.text.recipient": "To",
- "common.text.sender": "From",
- "common.text.unknown": "Unknown",
- "common.thisMonth": "This month",
- "common.thisWeek": "This week",
- "common.thisYear": "This year",
- "common.time": "Time",
- "common.time.day": "day",
- "common.time.days": "days",
- "common.time.hour": "hour",
- "common.time.hours": "hours",
- "common.time.minute.amt": "{{time}}m",
- "common.time.minutes": "minutes",
- "common.time.month": "month",
- "common.time.months": "months",
- "common.time.past.days": "{{days}}d ago",
- "common.time.past.hours": "{{hours}}h ago",
- "common.time.past.minutes": "{{minutes}}m ago",
- "common.time.past.months": "{{months}}mo ago",
- "common.time.past.seconds": "{{seconds}}s ago",
- "common.time.week": "week",
- "common.time.weeks": "weeks",
- "common.tip.label": "Tip:",
- "common.to": "to",
- "common.today": "Today",
- "common.tokenA": "Token A",
- "common.tokenAmount": "Token amount",
- "common.tokenB": "Token B",
- "common.tokenName": "Token name",
- "common.tokens": "Tokens",
- "common.totalValueLocked": "TVL",
- "common.trade": "Trade",
- "common.trademarkPolicy": "Trademark Policy",
- "common.transactionDetails": "Transaction details",
- "common.transactionId": "Transaction ID",
- "common.transactionPending": "Transaction pending",
- "common.transactions": "Transactions",
- "common.transactionSettings": "Transaction Settings",
- "common.transactionSubmitted": "Transaction submitted",
- "common.transfer": "transfer",
- "common.transfers": "transfers",
- "common.tryAgain.error": "Try again",
- "common.twitter": "Twitter",
- "common.type.label": "Type",
- "common.unavailable": "Unavailable",
- "common.uniGovernance": "UNI Governance",
- "common.uniswapMobile": "Uniswap Mobile",
- "common.uniswapProtocol": "Uniswap Protocol",
- "common.uniswapTVL": "Uniswap TVL",
- "common.uniswapWallet": "Uniswap wallet",
- "common.uniswapX": "UniswapX",
- "common.unknown": "Unknown",
- "common.unknownApproval": "Unknown Approval",
- "common.unknownError.error": "Unknown Error",
- "common.unknownLend": "Unknown Lend",
- "common.unknownMint": "Unknown Mint",
- "common.unknownSend": "Unknown Send",
- "common.unknownSwap": "Unknown Swap",
- "common.unsupportedAsset_one": "Unsupported asset",
- "common.unsupportedAsset_other": "Unsupported assets",
- "common.unwrap.button": "Unwrap",
- "common.unwrap.failed": "Unwrap failed",
- "common.unwrapped": "Unwrapped",
- "common.unwrapping": "Unwrapping",
- "common.version": "Version",
- "common.viewOnBlockExplorer": "View on Block Explorer",
- "common.viewOnExplorer": "View on Explorer",
- "common.volume": "Volume",
- "common.vote": "Vote",
- "common.vote.cancelled": "Vote cancelled",
- "common.vote.failed": "Vote failed",
- "common.voted": "Voted",
- "common.voting": "Voting",
- "common.wallet.approve": "Approve in wallet",
- "common.wallet.label": "Wallet",
- "common.wallet.unsupported": "Unsupported by your wallet",
- "common.walletForSwapping": "The wallet built for swapping. Available on iOS and Android.",
- "common.webApp": "Web app",
- "common.website": "Website",
- "common.whyApprove": "Why do I have to approve a token?",
- "common.whySign": "Why are signatures required?",
- "common.whyWrap": "Why do I have to wrap my {{symbol}}?",
- "common.withdraw.failed": "Withdraw failed",
- "common.withdrawal.amount": "Withdrawal amount",
- "common.withdrawal.cancelled": "Withdrawal cancelled",
- "common.withdrawing": "Withdrawing",
- "common.withdrew": "Withdrew",
- "common.withinRange": "In range",
- "common.wrap": "Wrap {{symbol}}",
- "common.wrap.button": "Wrap",
- "common.wrap.cancelled": "Wrap cancelled",
- "common.wrap.failed": "Wrap failed",
- "common.wrapIn": "Wrap {{symbol}} in wallet",
- "common.wrapped": "Wrapped",
- "common.wrapping": "Wrapping",
- "common.wrappingToken": "Wrapping {{symbol}}...",
- "common.wrongNetwork": "Wrong network",
- "common.your.account.had.insufficient.funds": "Your account had insufficient funds to complete this swap.",
- "common.your.account.has.insufficient.funds": "Your account has insufficient funds to complete this swap.",
- "common.your.limit.could.not.be.fulfilled": "Your limit could not be fulfilled at this time. Please try again.",
- "common.your.swap.could.not.be.fulfilled": "Your swap could not be fulfilled at this time. Please try again.",
- "common.youreBuying": "You’re buying",
- "common.youRecieve": "You receive",
- "common.youreSending": "You’re sending",
- "common.youWillReceive": "You will receive",
- "currency.aud": "Australian Dollar",
- "currency.brl": "Brazilian Real",
- "currency.cad": "Canadian Dollar",
- "currency.cny": "Chinese Yuan",
- "currency.eur": "Euro",
- "currency.gbp": "British Pound",
- "currency.hkd": "Hong Kong Dollar",
- "currency.idr": "Indonesian Rupiah",
- "currency.inr": "Indian Rupee",
- "currency.jpy": "Japanese Yen",
- "currency.krw": "South Korean Won",
- "currency.ngn": "Nigerian Naira",
- "currency.pkr": "Pakistani Rupee",
- "currency.rub": "Russian Ruble",
- "currency.sgd": "Singapore Dollar",
- "currency.thb": "Thai Baht",
- "currency.try": "Turkish Lira",
- "currency.uah": "Ukrainian Hryvnia",
- "currency.usd": "United States Dollar",
- "currency.vnd": "Vietnamese Dong",
- "dapp.request.approve.action": "Approve",
- "dapp.request.approve.fallbackTitle": "Approve this site to access tokens",
- "dapp.request.approve.helptext": "Allow this site to access and spend this token for transactions. Make sure you trust this site.",
- "dapp.request.approve.label": "Wallet",
- "dapp.request.approve.title": "Approve access to {{tokenSymbol}}",
- "dapp.request.base.title": "Transaction request",
- "dapp.request.connect.helptext": "Allow this site to view your wallet address, balance, and request approvals for transactions.",
- "dapp.request.connect.title": "Connect to site",
- "dapp.request.fallback.calldata.label": "Raw data",
- "dapp.request.fallback.function.label": "Function",
- "dapp.request.permit2.description": "Permit2 manages token approvals across multiple dapps.",
- "dapp.request.permit2.header": "Sign Permit2",
- "dapp.request.reject.action": "Reject all",
- "dapp.request.reject.info": "You have {{totalRequestCount}} transaction requests",
- "dapp.request.revoke.action": "Revoke",
- "dapp.request.revoke.helptext": "Allow this site to revoke access to spend this token for transactions. Make sure you trust this site.",
- "dapp.request.revoke.title": "Revoke access to {{tokenSymbol}}",
- "dapp.request.signature.containsUnrenderableCharacters": "This message contains unrenderable characters. Make sure you trust this site.",
- "dapp.request.signature.error.712-spec-compliance": "SignTypedDataRequestContent received data for signing which does not comply with the EIP-712 spec.",
- "dapp.request.signature.header": "Signature request",
- "dapp.request.signature.toggleDataView.raw": "View raw data",
- "dapp.request.signature.toggleDataView.readable": "View original data",
- "dapp.request.warning.notActive.message": "Make sure it’s the right one",
- "dapp.request.warning.notActive.title": "This is not your active wallet",
- "downloadApp.modal.alreadyHaveWallet": "Already have a wallet? ",
- "downloadApp.modal.alreadyHaveWallet.signInLink": "Sign in here",
- "downloadApp.modal.getStarted.description": "Start by downloading the Uniswap Wallet, available on your phone or browser.",
- "downloadApp.modal.getStarted.title": "Get started with Uniswap",
- "downloadApp.modal.signUp.description": "Get started by downloading the Uniswap Wallet, available on your phone or browser.",
- "downloadApp.modal.signUp.title": "Sign up with Uniswap",
- "downloadApp.modal.uniswapProducts.subtitle": "Uniswap products work seamlessly together to create the best onchain experience.",
- "error.access.expiry": "This provides the Uniswap protocol access to your token for trading. For security, it expires after 30 days.",
- "error.dataUnavailable": "Data is unavailable at the moment; we’re working on a fix",
- "error.id": "Error ID: {{eventId}}",
- "error.noData": "No data found",
- "error.request.provideId": "Sorry, an error occured while processing your request. If you request support, be sure to provide your error ID.",
- "error.tokenApproval": "Token approval failed",
- "errors.crash.message": "Something crashed.",
- "errors.crash.restart": "Restart app",
- "errors.crash.title": "Uh oh!",
- "explore.search.action.clear": "Clear all",
- "explore.search.action.viewEtherscan": "View on {{blockExplorerName}}",
- "explore.search.empty.full": "No results found for \"{{searchQuery}}\"",
- "explore.search.error": "Couldn’t load search results",
- "explore.search.label.ownedBy": "Owned by {{ownerAddress}}",
- "explore.search.placeholder": "Search tokens and wallets",
- "explore.search.section.nft": "NFT Collections",
- "explore.search.section.popularNFT": "Popular NFT collections",
- "explore.search.section.popularTokenInfo": "Popular tokens are identified based on their trading volume on Uniswap over the past 24 hours.",
- "explore.search.section.popularTokens": "Popular tokens",
- "explore.search.section.recent": "Recent searches",
- "explore.search.section.suggestedWallets": "Suggested wallets",
- "explore.search.section.tokens": "Tokens",
- "explore.search.section.wallets": "Wallets",
- "explore.tokens.error": "Couldn’t load tokens",
- "explore.tokens.favorite.action.add": "Favorite token",
- "explore.tokens.favorite.action.edit": "Edit favorites",
- "explore.tokens.favorite.action.remove": "Remove favorite",
- "explore.tokens.favorite.title.default": "Favorite tokens",
- "explore.tokens.favorite.title.edit": "Edit favorite tokens",
- "explore.tokens.metadata.marketCap": "{{number}} MCap",
- "explore.tokens.metadata.totalValueLocked": "{{number}} TVL",
- "explore.tokens.metadata.volume": "{{number}} Vol",
- "explore.tokens.sort.label.marketCap": "Market cap",
- "explore.tokens.sort.label.priceDecrease": "Price decrease",
- "explore.tokens.sort.label.priceIncrease": "Price increase",
- "explore.tokens.sort.label.totalValueLocked": "TVL",
- "explore.tokens.sort.label.volume": "Volume",
- "explore.tokens.sort.option.marketCap": "Market cap",
- "explore.tokens.sort.option.priceDecrease": "Price decrease (24H)",
- "explore.tokens.sort.option.priceIncrease": "Price increase (24H)",
- "explore.tokens.sort.option.totalValueLocked": "Uniswap TVL",
- "explore.tokens.sort.option.volume": "Uniswap volume (24H)",
- "explore.tokens.top.title": "Top tokens",
- "explore.transactions.disabled": "Select a network to view recent transactions",
- "explore.unableToDisplayHistorical": "Unable to display historical volume data for the current chain.",
- "explore.unableToDisplayHistoricalTVL": "Unable to display historical TVL data for the current chain.",
- "explore.uniVolume": "Uniswap volume",
- "explore.wallets.favorite.action.add": "Favorite wallet",
- "explore.wallets.favorite.action.edit": "Edit favorites",
- "explore.wallets.favorite.action.remove": "Remove favorite",
- "explore.wallets.favorite.title.default": "Favorite wallets",
- "explore.wallets.favorite.title.edit": "Edit favorite wallets",
- "extension.announcement": "The Uniswap Extension is here. Swap, sign transactions, and send tokens right from your browser.",
- "extension.connection.networks": "Networks",
- "extension.connection.popup": "Your wallet isn’t connected to this site. Look for a “Connect Wallet” or “Log in” button.",
- "extension.connection.popup.trouble": "Trouble connecting?",
- "extension.connection.popupWithButton": "Your wallet isn’t connected to this site.",
- "extension.connection.titleConnected": "Connected",
- "extension.connection.titleNotConnected": "Not connected",
- "extension.introduction": "Introducing the Uniswap Extension.",
- "extension.lock.button.forgot": "Forgot password?",
- "extension.lock.button.reset": "Reset wallet",
- "extension.lock.button.submit": "Unlock",
- "extension.lock.password.error": "Wrong password. Try again",
- "extension.lock.password.reset.initial.description": "Uniswap cannot help recover your password. You need to reset your wallet by re-entering your 12-word recovery phrase.",
- "extension.lock.password.reset.initial.help": "Where do I find my recovery phrase?",
- "extension.lock.password.reset.initial.title": "Forgot password",
- "extension.lock.password.reset.speedbump.description": "Make sure you have your 12-word recovery phrase before you reset your wallet. Otherwise you will not be able to recover your funds.",
- "extension.lock.password.reset.speedbump.help": "I lost my recovery phrase",
- "extension.lock.password.reset.speedbump.title": "Before you continue",
- "extension.lock.subtitle": "Enter your password to unlock",
- "extension.lock.title": "Welcome back",
- "extension.network.notSupported": "Unsupported network",
- "extension.open": "Open Uniswap Extension",
- "extension.popup.chrome.button": "Open extension",
- "extension.popup.chrome.description": "Complete this action by opening the Uniswap extension.",
- "extension.popup.chrome.title": "Continue in Uniswap",
- "extension.settings.password.enter.title": "Enter your current password",
- "extension.settings.password.error.wrong": "Wrong password",
- "extension.settings.password.placeholder": "Current password",
- "extension.warning.storage.button": "Back up",
- "extension.warning.storage.message": "Make sure to back up your recovery phrase to prevent losing access to your wallet and funds.",
- "extension.warning.storage.title": "Your browser is running out of storage",
- "fee.bestForExotic": "Best for exotic pairs.",
- "fee.bestForMost": "Best for most pairs.",
- "fee.bestForStablePairs": "Best for stable pairs.",
- "fee.bestForVeryStable": "Best for very stable pairs.",
- "fee.percentEarned": "The % you will earn in fees.",
- "fee.selectPercent": "{{pct}}% select",
- "fee.tier": "Fee tier",
- "fee.tier.create": "Create fee tier",
- "fee.tier.create.button": "Create new fee tier",
- "fee.tier.create.description": "Creating a new tier will initialize in a new pool and result in higher than usual network costs.",
- "fee.tier.description": "The amount earned facilitating trades. Choose an amount that suits your risk tolerance and strategy.",
- "fee.tier.description.v2": "The amount earned facilitating trades. All v2 pools have fixed 0.3% fees. For more options, provide liquidity on v4.",
- "fee.tier.label": "The % you will earn in fees",
- "fee.tier.missing.description": "Can’t find the tier you’re looking for?",
- "fee.tier.new": "New tier",
- "fee.tier.percent.select": "{{percentage}}% select",
- "fee.tier.recommended": "Recommended",
- "fee.tier.search": "Create or search for other fee tiers",
- "fee.tier.search.short": "Search tiers",
- "fee.tier.select": "Select fee tier",
- "fee.tierExact": "{{fee}} fee tier",
- "fiatOffRamp.checkout.title": "Sell with",
- "fiatOffRamp.connection.quote": "Selling {{amount}} worth of {{currencySymbol}}",
- "fiatOffRamp.unsupportedToken.back": "Go back",
- "fiatOffRamp.unsupportedToken.divider": "Unsupported tokens",
- "fiatOffRamp.unsupportedToken.message": "This token is not supported to sell. Swap this asset to one of the supported tokens.",
- "fiatOffRamp.unsupportedToken.swap": "Swap to a supported token",
- "fiatOffRamp.unsupportedToken.title": "Unsupported token",
- "fiatOffRamp.welcome.tooltip": "Sell your crypto to your bank account or debit card.",
- "fiatOnRamp.button.chooseToken": "Choose token",
- "fiatOnRamp.cexTransferModal.description": "Buying crypto with a card is not supported in your region. Transfer assets from a centralized exchange account to fund your wallet.",
- "fiatOnRamp.cexTransferModal.title": "Transfer to get started",
- "fiatOnRamp.checkout.title": "Checkout with",
- "fiatOnRamp.checkoutWith": "Checkout with",
- "fiatOnRamp.chooseProvider.description": "You’ll continue to the provider’s portal to see the fees associated with your transaction.",
- "fiatOnRamp.completeTransactionHeader": "Complete transaction with {{serviceProvider}}",
- "fiatOnRamp.connection.error": "Connection failed",
- "fiatOnRamp.connection.errorDescription": "Something went wrong connecting with {{serviceProvider}}.",
- "fiatOnRamp.connection.message": "Connecting you to {{serviceProvider}}",
- "fiatOnRamp.connection.quote": "Buying {{amount}} worth of {{currencySymbol}}",
- "fiatOnRamp.connection.terms": "By continuing, you acknowledge that you’ll be subject to the Terms of Service and Privacy Policy with {{serviceProvider}}, as applicable.",
- "fiatOnRamp.continueInTab": "Go to the {{serviceProvider}} tab to continue. It’s safe to close this modal now.",
- "fiatOnRamp.disclaimer": "By continuing, you acknowledge that you’ll be subject to the Terms of Service and Privacy Policy with {{serviceProvider}}, as applicable.",
- "fiatOnRamp.error.default": "Something went wrong.",
- "fiatOnRamp.error.load": "Couldn’t load tokens to buy",
- "fiatOnRamp.error.max": "Maximum {{amount}}",
- "fiatOnRamp.error.min": "Minimum {{amount}}",
- "fiatOnRamp.error.unavailable": "This service is unavailable in your region",
- "fiatOnRamp.error.unsupported": "Not supported in region",
- "fiatOnRamp.error.usd": "Only available to purchase in USD",
- "fiatOnRamp.exchangeRate": "{{outputAmount}} {{outputSymbol}} for {{inputAmount}} {{inputSymbol}}",
- "fiatOnRamp.notAvailable.error": "This service is unavailable in your region",
- "fiatOnRamp.purchasedOn": "Purchased on {{serviceProvider}}",
- "fiatOnRamp.quote.advice": "You’ll continue to the provider’s portal to see the fees associated with your transaction.",
- "fiatOnRamp.quote.type.list": "{{optionsList}}, and other options",
- "fiatOnRamp.quote.type.other": "Other options",
- "fiatOnRamp.quote.type.recent": "Recently used",
- "fiatOnRamp.receiveCrypto.modal.addressQr.supportedNetworks": "You can receive tokens & NFTs on Ethereum, Polygon, Arbitrum, Optimism, Base, BNB, Blast, Avalanche, Zora, and ZKsync.",
- "fiatOnRamp.receiveCrypto.modal.sectionTitle.fromAccount": "From an account",
- "fiatOnRamp.receiveCrypto.title": "Receive crypto",
- "fiatOnRamp.receiveCrypto.transferFunds": "Fund your wallet by transferring crypto from another wallet or account",
- "fiatOnRamp.region.placeholder": "Search by country or region",
- "fiatOnRamp.region.title": "Select your region",
- "fiatOnRamp.summary.total": "{{cryptoAmount}} for {{fiatAmount}}",
- "forceUpgrade.action.confirm": "Update app",
- "forceUpgrade.action.recoveryPhrase": "View recovery phrase",
- "forceUpgrade.description": "The version of Uniswap Wallet you’re using is out of date and is missing critical upgrades. If you don’t update the app or you don’t have your recovery phrase written down, you won’t be able to access your assets.",
- "forceUpgrade.label.recoveryPhrase": "Recovery phrase",
- "forceUpgrade.title": "Update the app to continue",
- "globalPreferences.title": "Global preferences",
- "hero.scroll": "Scroll to learn more",
- "hero.subtitle": "The largest onchain marketplace. Buy and sell crypto on Ethereum and 11+ other chains.",
- "hero.swap.title": "Swap anytime,
anywhere.",
- "hidden.nfts.info.banner.text": "Learn more about hidden NFTs",
- "hidden.nfts.info.text.button": "Hidden NFTs ({{numHidden}})",
- "hidden.nfts.info.text.extension": "These are potential scams and NFTs you’ve hidden. You can right click on an NFT to unhide it.",
- "hidden.nfts.info.text.mobile": "These are potential scams and NFTs you’ve hidden. You can long press on an NFT to unhide it.",
- "hidden.nfts.info.text.title": "Hidden NFTs",
- "hidden.tokens.info.banner.text": "Learn more about hidden tokens",
- "hidden.tokens.info.text.button": "Hidden tokens ({{numHidden}})",
- "hidden.tokens.info.text.info": "These are potential scams, small balances, and tokens you’ve hidden. Hidden tokens are not included in your total wallet balance.",
- "hidden.tokens.info.text.title": "Hidden tokens",
- "home.activity.empty.button": "Receive tokens or NFTs",
- "home.activity.empty.description.default": "When you approve, trade, or transfer tokens or NFTs, your transactions will appear here.",
- "home.activity.empty.description.external": "When this wallet makes transactions, they’ll appear here.",
- "home.activity.empty.title": "No activity yet",
- "home.activity.error.load": "Couldn’t load activity",
- "home.activity.title": "Activity",
- "home.banner.offline": "You are in offline mode",
- "home.explore.footer": "Tap “search” to explore more",
- "home.explore.title": "Explore tokens",
- "home.extension.error": "Error loading accounts",
- "home.feed.empty.description": "When your favorited wallets makes transactions, they’ll appear here.",
- "home.feed.empty.title": "No activity yet",
- "home.feed.error": "Couldn’t load activity",
- "home.feed.title": "Feed",
- "home.label.buy": "Buy",
- "home.label.receive": "Receive",
- "home.label.scan": "Scan",
- "home.label.send": "Send",
- "home.label.swap": "Swap",
- "home.nfts.title": "NFTs",
- "home.tokens.empty.action.buy.description": "Purchase crypto with a debit card or a bank account.",
- "home.tokens.empty.action.buy.title": "Buy crypto with card",
- "home.tokens.empty.action.import.description": "Enter this wallet’s recovery phrase to begin swapping and sending.",
- "home.tokens.empty.action.import.title": "Import wallet",
- "home.tokens.empty.action.receive.description": "Fund your wallet by transferring crypto from another wallet or account.",
- "home.tokens.empty.action.receive.title": "Receive crypto",
- "home.tokens.empty.description": "When this wallet buys or receives tokens, they’ll appear here.",
- "home.tokens.empty.title": "No tokens yet",
- "home.tokens.empty.welcome": "Welcome to your wallet!",
- "home.tokens.empty.welcome.description": "Looks like you have a new wallet. Let’s get it funded before you make your first swap.",
- "home.tokens.error.fetch": "Failed to fetch token balances",
- "home.tokens.error.load": "Couldn’t load token balances",
- "home.tokens.title": "Tokens",
- "home.upsell.receive.cta": "From an account",
- "home.upsell.receive.description": "Fund your wallet by transferring crypto from another wallet or account",
- "home.upsell.receive.title": "Receive crypto",
- "home.warning.viewOnly": "This is a view-only wallet",
- "interface.metatags.description": "Swap or provide liquidity on the Uniswap Protocol",
- "interface.metatags.title": "Uniswap Interface",
- "landing.buildNextGen": "Build the next generation of open applications and tools.",
- "landing.connectWithUs": "Connect with us",
- "landing.devDocs": "Developer docs",
- "landing.directToDeFi": "Go direct to DeFi",
- "landing.followOnX": "Follow @Uniswap on X for the latest updates",
- "landing.protocolDescription": "Uniswap products are powered by the Uniswap Protocol. The protocol is the largest onchain marketplace, with billions of dollars in weekly volume across thousands of tokens on Ethereum and 7+ additional chains.",
- "landing.provideLiquidity.message": "Provide liquidity to pools on the Uniswap Protocol and earn fees on swaps.",
- "landing.swapSimple": "Swapping made simple. Access thousands of tokens on 11+ chains.",
- "landing.teamInsights": "Insights and news from the team",
- "landing.trusted": "Trusted by millions",
- "language.afrikaans": "Afrikaans",
- "language.arabic": "Arabic",
- "language.catalan": "Catalan",
- "language.chineseSimplified": "Chinese, Simplified",
- "language.chineseTraditional": "Chinese, Traditional",
- "language.czech": "Czech",
- "language.danish": "Danish",
- "language.dutch": "Dutch",
- "language.english": "English",
- "language.finnish": "Finnish",
- "language.french": "French",
- "language.greek": "Greek",
- "language.hebrew": "Hebrew",
- "language.hindi": "Hindi",
- "language.hungarian": "Hungarian",
- "language.indonesian": "Indonesian",
- "language.italian": "Italian",
- "language.japanese": "Japanese",
- "language.korean": "Korean",
- "language.malay": "Malay",
- "language.norwegian": "Norwegian",
- "language.polish": "Polish",
- "language.portuguese": "Portuguese",
- "language.romanian": "Romanian",
- "language.russian": "Russian",
- "language.serbian": "Serbian",
- "language.spanishLatam": "Spanish (Latin America)",
- "language.spanishSpain": "Spanish (Spain)",
- "language.spanishUs": "Spanish (US)",
- "language.swahili": "Swahili",
- "language.swedish": "Swedish",
- "language.thai": "Thai",
- "language.turkish": "Turkish",
- "language.ukrainian": "Ukrainian",
- "language.urdu": "Urdu",
- "language.vietnamese": "Vietnamese",
- "limit.open.count_one": "1 open limit",
- "limit.open.count_other": "{{count}} open limits",
- "limitPrice.buyingAboveMarketPrice.error.description": "Your limit price is {{percentage}}% higher than market. Adjust your limit price to proceed.",
- "limitPrice.buyingAboveMarketPrice.error.title": "Buying {{tokenSymbol}} above market price.error",
- "limitPrice.marketPriceNotAvailable.error.description": "We are unable to calculate the current market price. To avoid submitting an order below market price, please check your network connection and try again.",
- "limitPrice.marketPriceNotAvailable.error.title": "Market price not available",
- "limitPrice.sellingBelowMarketPrice.error.description": "Your limit price is {{percentage}}% lower than market. Adjust your limit price to proceed.",
- "limitPrice.sellingBelowMarketPrice.error.title": "Selling {{tokenSymbol}} below market price",
- "limits.form.disclaimer.mainnet": "Only Ethereum mainnet tokens are available for limits. ",
- "limits.form.disclaimer.mainnet.short": "Only Mainnet tokens are available for limits.",
- "limits.form.disclaimer.uniswapx": "Limits may not execute exactly when tokens reach the specified price. ",
- "limits.learnMore": "Learn more about limits",
- "limits.price.input.label": "When 1 is worth",
- "limits.price.label": "Limit price",
- "limits.selectSupportedTokens": "Select supported tokens",
- "liquidity.notEnough.label": "Not enough liquidity to show accurate USD value.",
- "liquidityPool.chart.tooltip.amount": "{{token}} liquidity: {{amount}}",
- "liquidityPool.page.title": "Add liquidity to pools{{version}} on Uniswap",
- "liquidityPool.positions.closed.title": "Closed Positions",
- "liquidityPool.positions.page.title": "Manage {{quoteSymbol}}/{{baseSymbol}} pool liquidity on Uniswap",
- "liquidityPool.positions.page.version.description": "View your active {{version}} liquidity positions. Add new positions.",
- "liquidityPool.positions.page.version.title": "Manage pool liquidity{{version}} on Uniswap",
- "liquidityPool.positions.price": "{{amountWithSymbol}} per {{outputToken}}",
- "liquidityPool.positions.price.formatted": " per ",
- "migrate.allowed": "Allowed",
- "migrate.allowLpMigration": "Allow LP token migration",
- "migrate.connectAccount": "You must connect an account.",
- "migrate.connectWallet": "Connect to a wallet to view your V2 liquidity.",
- "migrate.contract": "Uniswap migration contract",
- "migrate.firstLP": "You are the first liquidity provider for this Uniswap V3 pool. Your liquidity will migrate at the current {{source}} price.",
- "migrate.highGasCost": "Your transaction cost will be much higher as it includes the gas to create the pool.",
- "migrate.invalidRange": "Invalid range selected. The min price must be lower than the max price.",
- "migrate.lpNFT": "{{symA}}/{{symB}} LP NFT",
- "migrate.lpTokens": "{{symA}}/{{symB}} LP tokens",
- "migrate.migrating": "Migrating",
- "migrate.missingV2Position": "Don’t see one of your v2 positions? Import it.",
- "migrate.noV2Liquidity": "No V2 liquidity found.",
- "migrate.positionNoFees": "Your position will not earn fees or be used in trades until the market price moves into your range.",
- "migrate.priceDifference": "Price difference: ",
- "migrate.priceWarning": "You should only deposit liquidity into Uniswap V3 at a price you believe is correct.
If the price seems incorrect, you can either make a swap to move the price or wait for someone else to do so.",
- "migrate.refund": "At least {{amtA}} {{symA}} and {{amtB}} {{symB}} will be refunded to your wallet due to selected price range.",
- "migrate.selectFeeTier": "Select fee tier",
- "migrate.setRange": "Set price range",
- "migrate.symbolPrice": "{{protocolName}} {{tokenSymbol}} Price:",
- "migrate.v2Description": "This tool will safely migrate your {{source}} liquidity to V3. The process is completely trustless thanks to the <0>Uniswap migration contract0> ↗",
- "migrate.v2Instruction": "For each pool shown below, click migrate to remove your liquidity from Uniswap V2 and deposit it into Uniswap V3.",
- "migrate.v2Subtitle": "Migrate your liquidity tokens from Uniswap V2 to Uniswap V3.",
- "migrate.v2Title": "Migrate V2 liquidity",
- "migrate.v3Price": "V3 {{sym}} Price:",
- "mint.v3.input.invalidPrice.error": "Invalid price input",
- "mobile.appRating.button.decline": "Not really",
- "mobile.appRating.description": "Let us know if you’re having a good experience with this app",
- "mobile.appRating.feedback.button.cancel": "Maybe later",
- "mobile.appRating.feedback.button.send": "Send feedback",
- "mobile.appRating.feedback.description": "Let us know how we can improve your experience",
- "mobile.appRating.feedback.title": "We’re sorry to hear that.",
- "mobile.appRating.title": "Enjoying Uniswap Wallet?",
- "mobileAppPromo.banner.getTheApp.link": "Get the Uniswap Wallet app",
- "mobileAppPromo.banner.title": "Uniswap: Crypto & NFT Wallet",
- "moonpay.poweredBy": "Fiat onramp powered by MoonPay USA LLC",
- "moonpay.rampIframe": "MoonPay fiat on-ramp iframe",
- "moonpay.restricted.region": "Moonpay is not available in some regions. Click to learn more.",
- "nav.createAccount.button": "Create account",
- "nav.logIn.button": "Log in",
- "nav.signIn.button": "Sign in",
- "nav.signUp.button": "Sign up",
- "nav.tabs.createPosition": "Create position",
- "nav.tabs.createV2Position": "Create V2 position",
- "nav.tabs.createV3Position": "Create V3 position",
- "nav.tabs.viewPosition": "View position",
- "network.lostConnection": "You may have lost your network connection.",
- "network.mightBeDown": "{{network}} might be down right now, or you may have lost your network connection.",
- "network.warning": "Network warning",
- "nft.addToBag": "Add to bag",
- "nft.authorsCollectionOnUni": "{{name}}’s NFT collection on Uniswap",
- "nft.bag": "Bag",
- "nft.blockedCollection": "This collection is blocked",
- "nft.blockedOpenSea": "Blocked on OpenSea",
- "nft.buyTransferNFTToStart": "Buy or transfer NFTs to this wallet to get started.",
- "nft.buyTransferTokensToStart": "Buy or transfer tokens to this wallet to get started.",
- "nft.card.notAvailable": "Content not
available yet",
- "nft.chainSupportComingSoon": "{{chainName}} support coming soon",
- "nft.collection.title": "Explore and buy on Uniswap",
- "nft.collectionOnUni": "NFT collection on Uniswap",
- "nft.collections": "NFT collections",
- "nft.collectonOnAddress": "NFT collection on Uniswap - {{address}}",
- "nft.complete": "Complete!",
- "nft.editListings": "Edit listings",
- "nft.event": "Event",
- "nft.explore": "Explore NFTs",
- "nft.learnWhy": "Learn why",
- "nft.list.header.lastPrice": "Last",
- "nft.list.title": "List NFTs",
- "nft.listedSignificantly_one": "One NFT is listed {{percentage}} below the collection’s floor price. Are you sure you want to continue?",
- "nft.listedSignificantly_other": "{{count}} NFTs are listed significantly below the collection’s floor price. Are you sure you want to continue?",
- "nft.listForSale": "List for sale",
- "nft.lowPrice": "Low listing price",
- "nft.marketplace.royalty.header": "{{marketName}} fees",
- "nft.maxFees": "Max fees",
- "nft.maxRoyalties": "Max creator royalties",
- "nft.noItems": "No items to display",
- "nft.noneAtAddress": "No collection assets exist at this address",
- "nft.noneFound": "No NFT collections found.",
- "nft.noPools": "No pools yet",
- "nft.notListed": "Not listed",
- "nft.popularCollections": "Popular NFT collections",
- "nft.popularCollectionsInfo": "Popular NFT collections are identified based on their trading volume on Uniswap over the past 24 hours.",
- "nft.proceedsIfSold": "Proceeds if sold",
- "nft.profile.priceInput.warning.alreadyListed": "Already listed at {{tokenAmountWithSymbol}}",
- "nft.profile.priceInput.warning.belowFloor": "{{percentage}} below floor price.",
- "nft.refundsInEth": "Refunds for unavailable items will be given in ETH",
- "nft.removeFromBag": "Remove from bag",
- "nft.reportSpam": "Report as spam",
- "nft.returnToExplore": "Return to NFT Explore",
- "nft.returnToMy": "Return to My NFTs",
- "nft.setPrices": "Set prices to continue",
- "nft.startListing": "Start listing",
- "nft.successListed": "Successfully listed",
- "nft.sweep": "Sweep",
- "nft.unavailableToList": "Unavailable for listing",
- "nft.view": "View NFTs",
- "nft.whyTransaction": "Why is a transaction required?",
- "nft.whyTransaction.reason": "Listing an NFT requires a one-time marketplace approval for each NFT collection.",
- "nft.willAppearHere": "Your onchain transactions and crypto purchases will appear here.",
- "nft.wishGranted": "Uniswap has granted your wish!",
- "nfts.collection.action.approve_one": "Approve collection",
- "nfts.collection.action.approve_other": "Approve collections",
- "nfts.collection.action.sign_one": "Sign listing",
- "nfts.collection.action.sign_other": "Sign listings",
- "nfts.marketplace.fees.deltaMax": "{{percentChanged}} max",
- "nfts.my": "My NFTs",
- "nfts.noneYet": "No NFTs yet",
- "nfts.sell": "Sell NFTs",
- "nfts.viewAndSell": "View and sell NFTs",
- "notFound.oops": "Oops, take me back to Swap",
- "notice.uk": "This web application is provided as a tool for users to interact with the Uniswap Protocol on their own initiative, with no endorsement or recommendation of cryptocurrency trading activities. In doing so, Uniswap is not recommending that users or potential users engage in cryptoasset trading activity, and users or potential users of the web application should not regard this webpage or its contents as involving any form of recommendation, invitation or inducement to deal in cryptoassets.",
- "notice.uk.label": "UK disclaimer:",
- "notification.assetVisibility.hidden": "{{assetName}} hidden",
- "notification.assetVisibility.unhidden": "{{assetName}} unhidden",
- "notification.copied.address": "Address copied",
- "notification.copied.calldata": "Calldata copied",
- "notification.copied.contractAddress": "Contract address copied",
- "notification.copied.failed": "Failed to copy to clipboard",
- "notification.copied.image": "Image copied",
- "notification.copied.nftUrl": "NFT URL copied",
- "notification.copied.tokenUrl": "Token URL copied",
- "notification.copied.transactionId": "Transaction ID copied",
- "notification.copied.unitag": "Username copied",
- "notification.countryChange": "Switched to {{countryName}}",
- "notification.network.changed": "Switched to {{network}}",
- "notification.passwordChanged": "Password changed",
- "notification.restore.success": "Wallet restored!",
- "notification.send.network": "Sending on {{network}}",
- "notification.spam.NFT.successful": "Reported",
- "notification.swap.network": "Swapping on {{network}}",
- "notification.swap.pending.swap": "Swap pending",
- "notification.swap.pending.unwrap": "Unwrap pending",
- "notification.swap.pending.wrap": "Wrap pending",
- "notification.transaction.approve.canceled": "Canceled {{currencySymbol}} approve.",
- "notification.transaction.approve.fail": "Failed to approve {{currencySymbol}} for use with {{address}}.",
- "notification.transaction.approve.success": "Approved {{currencySymbol}} for use with {{address}}.",
- "notification.transaction.pending": "Transaction pending",
- "notification.transaction.swap.canceled": "Canceled {{inputCurrencySymbol}}-{{outputCurrencySymbol}} swap.",
- "notification.transaction.swap.expired": "{{inputCurrencyAmountWithSymbol}} for {{outputCurrencyAmountWithSymbol}} swap expired.",
- "notification.transaction.swap.fail": "Failed to swap {{inputCurrencyAmountWithSymbol}} for {{outputCurrencyAmountWithSymbol}}.",
- "notification.transaction.swap.success": "Swapped {{inputCurrencyAmountWithSymbol}} for {{outputCurrencyAmountWithSymbol}}.",
- "notification.transaction.transfer.canceled": "Canceled {{tokenNameOrAddress}} send",
- "notification.transaction.transfer.fail": "Failed to send {{tokenNameOrAddress}} to {{walletNameOrAddress}}",
- "notification.transaction.transfer.received": "Received {{tokenNameOrAddress}} from {{walletNameOrAddress}}",
- "notification.transaction.transfer.success": "Sent {{tokenNameOrAddress}} to {{walletNameOrAddress}}",
- "notification.transaction.unknown.fail.full": "Failed to transact with {{addressOrEnsName}}",
- "notification.transaction.unknown.fail.short": "Transaction failed",
- "notification.transaction.unknown.success.full": "Transacted with {{addressOrEnsName}}",
- "notification.transaction.unknown.success.short": "Transaction confirmed",
- "notification.transaction.unwrap.canceled": "Canceled {{inputCurrencySymbol}} unwrap.",
- "notification.transaction.unwrap.fail": "Failed to unwrap {{inputCurrencyAmountWithSymbol}}.",
- "notification.transaction.unwrap.success": "Unwrapped {{inputCurrencyAmountWithSymbol}} and received {{outputCurrencyAmountWithSymbol}}.",
- "notification.transaction.wrap.canceled": "Canceled {{inputCurrencySymbol}} wrap.",
- "notification.transaction.wrap.fail": "Failed to wrap {{inputCurrencyAmountWithSymbol}}.",
- "notification.transaction.wrap.success": "Wrapped {{inputCurrencyAmountWithSymbol}} and received {{outputCurrencyAmountWithSymbol}}.",
- "notification.transfer.pending": "Send pending",
- "notification.walletConnect.confirmed": "Transaction confirmed with {{dappName}}",
- "notification.walletConnect.connected": "Connected",
- "notification.walletConnect.disconnected": "Disconnected",
- "notification.walletConnect.failed": "Transaction failed with {{dappName}}",
- "notification.walletConnect.networkChanged.full": "Switched to {{networkName}}",
- "notification.walletConnect.networkChanged.short": "Switched networks",
- "notifications.scantastic.subtitle": "Continue on Uniswap Extension",
- "notifications.scantastic.title": "Success!",
- "onboarding.backup.manual.banner": "We suggest writing this on a piece of paper and storing it in a secure place, like a safe.",
- "onboarding.backup.manual.displayWarning.description": "Read the following carefully before continuing.",
- "onboarding.backup.manual.displayWarning.note.access": "This recovery phrase gives you full access to your wallet and funds",
- "onboarding.backup.manual.displayWarning.note.secure": "View this in private and do not share it with anyone",
- "onboarding.backup.manual.displayWarning.note.storage": "Write it down and keep it in a safe place",
- "onboarding.backup.manual.displayWarning.title": "Some important things to know",
- "onboarding.backup.manual.error": "Invalid or misspelled word",
- "onboarding.backup.manual.placeholder": "Secret word",
- "onboarding.backup.manual.progress": "{{completedStepsCount}}/{{totalStepsCount}} completed",
- "onboarding.backup.manual.selectedWordPlaceholder": "Select word",
- "onboarding.backup.manual.subtitle_one": "What’s the {{count}}st word in your recovery phrase?",
- "onboarding.backup.manual.subtitle_two": "What’s the {{count}}nd word in your recovery phrase?",
- "onboarding.backup.manual.subtitle_few": "What’s the {{count}}rd word in your recovery phrase?",
- "onboarding.backup.manual.subtitle_other": "What’s the {{count}}th word in your recovery phrase?",
- "onboarding.backup.manual.title": "Let’s make sure you’ve recorded it correctly",
- "onboarding.backup.option.badge.quick": "Quick",
- "onboarding.backup.option.cloud.description": "Back up your wallet via {{cloudProviderName}}, protected by a recovery password.",
- "onboarding.backup.option.cloud.title": "Set a recovery password",
- "onboarding.backup.option.manual.description": "Record your 12 secret words on a piece of paper and store it in a safe place.",
- "onboarding.backup.option.manual.title": "Write down recovery phrase",
- "onboarding.backup.reminder.description": "Backing up your wallet ensures you can always recover your assets if you ever lose your phone or get a new device.",
- "onboarding.backup.reminder.title": "It’s time to back up your wallet",
- "onboarding.backup.reminder.warning.description": "If you don’t set up a backup method, you won’t have a way to recover your wallet if you lose your phone, delete the app, or get a new device.",
- "onboarding.backup.reminder.warning.title": "You could lose your funds",
- "onboarding.backup.speedBump.cloud.description": "If you ever forget it, we can’t reset it for you. Write it down in a safe place or store it securely in a password manager.",
- "onboarding.backup.speedBump.cloud.disclaimer": "I understand that Uniswap Labs cannot reset my recovery password.",
- "onboarding.backup.speedBump.cloud.title": "It’s important to save this password",
- "onboarding.backup.speedBump.manual.description": "Make sure you wrote your recovery phrase down correctly and have a safe place to store it.",
- "onboarding.backup.speedBump.manual.disclaimer": "I understand that Uniswap Labs cannot recover my wallet if I lose this.",
- "onboarding.backup.speedBump.manual.title": "Before you finish...",
- "onboarding.backup.subtitle": "This is how you will recover your wallet if you delete the app or lose your device.",
- "onboarding.backup.title.existing": "Back up your wallet",
- "onboarding.backup.title.new": "Choose your backup method",
- "onboarding.backup.view.disclaimer": "I understand that if I lose my recovery phrase, Uniswap Labs cannot help me restore it.",
- "onboarding.backup.view.subtitle.message1": "Read the following carefully before continuing",
- "onboarding.backup.view.subtitle.message2": "You’ll need to enter all 12 of these secret words to recover your wallet.",
- "onboarding.backup.view.title": "Write down your recovery phrase",
- "onboarding.backup.view.warning.message1": "This recovery phrase gives you full access to your wallet and funds",
- "onboarding.backup.view.warning.message2": "Write it down and keep it in a safe place",
- "onboarding.backup.view.warning.message3": "View this in private and do not share it with anyone",
- "onboarding.cloud.confirm.description": "You’ll need to enter this to recover your funds. If you ever forget it, we can’t retrieve it for you.",
- "onboarding.cloud.confirm.title": "Confirm your backup password",
- "onboarding.cloud.createPassword.description": "You’ll need to enter this to recover your funds. If you ever forget it, we can’t retrieve it for you.",
- "onboarding.cloud.createPassword.title": "Create your recovery password",
- "onboarding.complete.button": "Open Uniswap Extension",
- "onboarding.complete.description": "Your wallet is ready to send and receive crypto. Open Uniswap Extension with the shortcut below.",
- "onboarding.complete.go_to_uniswap": "Go to Uniswap Web App",
- "onboarding.complete.pin.description": "Click the pin icon to add Uniswap Extension to your toolbar.",
- "onboarding.complete.pin.title": "Pin Uniswap Extension",
- "onboarding.complete.title": "You’re all set",
- "onboarding.extension.password.subtitle": "You’ll need this to unlock your wallet and access your recovery phrase",
- "onboarding.extension.password.title.default": "Create password",
- "onboarding.extension.password.title.reset": "Reset your password",
- "onboarding.extension.unsupported.android.description": "Uniswap Extension is only compatible with Chrome on desktop.",
- "onboarding.extension.unsupported.android.title": "Chrome on mobile is not supported (yet)",
- "onboarding.extension.unsupported.description": "Uniswap Extension is only compatible with Chrome right now.",
- "onboarding.extension.unsupported.title": "This browser is not supported (yet)",
- "onboarding.home.intro.backup.description": "Set up a recovery plan if you ever lose your phone or get a new one.",
- "onboarding.home.intro.backup.title": "Back up your wallet",
- "onboarding.home.intro.fund.description": "Fund your wallet by buying crypto or transferring from another account.",
- "onboarding.home.intro.fund.title": "Get your first token",
- "onboarding.home.intro.label.required": "Required",
- "onboarding.home.intro.label.swipe": "Swipe",
- "onboarding.home.intro.unitag.description": "Build a personalized web3 profile and easily share your address with friends.",
- "onboarding.home.intro.unitag.title": "Claim your {{unitagDomain}} username",
- "onboarding.home.intro.welcome.description": "Finish setting up your wallet to begin swapping in seconds.",
- "onboarding.home.intro.welcome.title": "Welcome to Uniswap",
- "onboarding.import.error.invalidWords_one": "1 word is invalid or misspelled",
- "onboarding.import.error.invalidWords_other": "{{count}} words are invalid or misspelled",
- "onboarding.import.method.import.message": "Enter your recovery phrase from another crypto wallet",
- "onboarding.import.method.import.title": "Import a wallet",
- "onboarding.import.method.restore.message.android": "Add wallets you’ve backed up to your Google Drive account",
- "onboarding.import.method.restore.message.ios": "Add wallets you’ve backed up to your iCloud account",
- "onboarding.import.method.restore.title": "Restore a wallet",
- "onboarding.import.onDeviceRecovery.other_options": "Create or import a different wallet",
- "onboarding.import.onDeviceRecovery.other_options.label": "Don’t want any of the above?",
- "onboarding.import.onDeviceRecovery.subtitle": "Choose which wallet you want to log back into.",
- "onboarding.import.onDeviceRecovery.title": "Welcome back to Uniswap",
- "onboarding.import.onDeviceRecovery.wallet.button": "View recovery phrase",
- "onboarding.import.onDeviceRecovery.wallet.count_one": "+1 other wallet",
- "onboarding.import.onDeviceRecovery.wallet.count_other": "+{{count}} other wallets",
- "onboarding.import.onDeviceRecovery.warning.caption": "Please ensure you have backed up all of the other wallets. If you ever want to restore them, you’ll need their recovery phrases or corresponding iCloud backups.",
- "onboarding.import.onDeviceRecovery.warning.title": "Are you sure?",
- "onboarding.import.title": "Choose how you want to add your wallet",
- "onboarding.importMnemonic.button.default": "My recovery phrase is 12 words",
- "onboarding.importMnemonic.button.importing": "Importing...",
- "onboarding.importMnemonic.button.longPhrase": "My recovery phrase is longer",
- "onboarding.importMnemonic.error.invalidPhrase": "The phrase you entered is invalid",
- "onboarding.importMnemonic.subtitle": "Type or paste your 12-word recovery phrase",
- "onboarding.importMnemonic.title": "Enter your recovery phrase",
- "onboarding.intro.button.alreadyHave": "I already have a wallet",
- "onboarding.intro.mobileScan.button": "Scan QR code to import",
- "onboarding.intro.mobileScan.title": "Have the Uniswap app?",
- "onboarding.landing.button.add": "Add an existing wallet",
- "onboarding.landing.button.create": "Create a wallet",
- "onboarding.name.wallet.button.text": "Finish",
- "onboarding.name.wallet.subtitle": "This nickname is only visible to you",
- "onboarding.name.wallet.title": "Give your wallet a name",
- "onboarding.notification.permission.message": "To receive notifications, turn on notifications for Uniswap Wallet in your device’s settings.",
- "onboarding.notification.permission.title": "Notifications permission",
- "onboarding.notification.subtitle": "Get notified when your transfers, swaps, and approvals complete.",
- "onboarding.notification.title": "Turn on push notifications",
- "onboarding.recoveryPhrase.confirm.subtitle.combined": "Let’s confirm you got it right. If you lose or write this down incorrectly, you won’t be able to recover your funds.",
- "onboarding.recoveryPhrase.confirm.subtitle.default": "If you lose or write this down incorrectly, you won’t be able to recover your funds.",
- "onboarding.recoveryPhrase.confirm.title": "Let’s confirm you got it right",
- "onboarding.recoveryPhrase.view.subtitle": "You’ll need to enter all 12 of these secret words to recover your wallet.",
- "onboarding.recoveryPhrase.view.title": "Write down your recovery phrase",
- "onboarding.recoveryPhrase.view.title.hasPassword": "If you ever forget your password...",
- "onboarding.recoveryPhrase.warning.final.button": "I’m ready",
- "onboarding.recoveryPhrase.warning.final.message": "Your recovery phrase is what grants you (and anyone who has it) access to your funds. Be sure to keep it to yourself.",
- "onboarding.recoveryPhrase.warning.final.title": "Do this step in a private place",
- "onboarding.recoveryPhrase.warning.screenshot.message": "Anyone who gains access to your photos can access your wallet. We recommend that you write down your words instead.",
- "onboarding.recoveryPhrase.warning.screenshot.title": "Screenshots aren’t secure",
- "onboarding.resetPassword.complete.safety": "Learn more about wallet safety",
- "onboarding.resetPassword.complete.subtitle": "Use your new password to unlock your wallet.",
- "onboarding.resetPassword.complete.title": "Password reset",
- "onboarding.scan.button": "Scan with Uniswap app",
- "onboarding.scan.error": "Sorry, we are unable to load the QR code right now. Please try another onboarding method.",
- "onboarding.scan.otp.error": "The code you submitted is incorrect, or there was an error submitting. Please try again.",
- "onboarding.scan.otp.failed": "Failed attempts: {{number}}",
- "onboarding.scan.otp.subtitle": "Check your Uniswap mobile app for the 6-character code",
- "onboarding.scan.otp.title": "Enter one-time code",
- "onboarding.scan.subtitle": "Scan the QR code with the Uniswap mobile app to begin importing your wallet.",
- "onboarding.scan.title": "Import wallet from the app",
- "onboarding.scan.wifi": "Connect your phone to the same WiFi network as your computer.",
- "onboarding.security.alert.biometrics.message.android": "To use biometrics, set up it first in settings",
- "onboarding.security.alert.biometrics.message.ios": "To use {{biometricsMethod}}, allow access in system settings",
- "onboarding.security.alert.biometrics.title.android": "Biometrics is disabled",
- "onboarding.security.alert.biometrics.title.ios": "{{biometricsMethod}} is disabled",
- "onboarding.security.button.confirm.android": "Enable biometrics",
- "onboarding.security.button.confirm.ios": "Enable {{biometricsMethod}}",
- "onboarding.security.button.setup": "Set up",
- "onboarding.security.subtitle.android": "Add an extra layer of security by requiring biometrics to send transactions.",
- "onboarding.security.subtitle.ios": "Add an extra layer of security by requiring {{biometricsMethod}} to send transactions.",
- "onboarding.security.title": "Protect your wallet",
- "onboarding.selectWallets.error": "Couldn’t load addresses",
- "onboarding.selectWallets.title.default": "Choose wallets to import",
- "onboarding.selectWallets.title.error": "Error importing wallets",
- "onboarding.termsOfService": "By continuing, I agree to the Terms of Service and consent to the Privacy Policy",
- "onboarding.tooltip.recoveryPhrase.trigger": "What’s a recovery phrase?",
- "onboarding.wallet.continue": "Let’s keep it safe",
- "onboarding.wallet.defaultName": "Wallet {{number}}",
- "onboarding.wallet.description.full": "This is your personal space for tokens, NFTs, and all of your trades. Finish setting it up to keep your funds safe.",
- "onboarding.wallet.title": "Welcome to your new wallet",
- "outageBanner.message": "{{chainName}} {{versionDescription}} data is unavailable right now, but we expect the issue to be resolved shortly.",
- "outageBanner.message.sub": "You can still swap and provide liquidity on this chain without issue.",
- "outageBanner.title": "{{versionName}} will be back soon",
- "permit.approval.fail": "Permit approval failed",
- "permit.approval.fail.message": "Permit2 allows token approvals to be shared and managed across different applications.",
- "pool.accruedFees": "View accrued fees and analytics",
- "pool.activePositions.appear": "Your active V3 liquidity positions will appear here.",
- "pool.activeRange": "Active tick range",
- "pool.addLiquidity.seoTitle": "Add liquidity to {{tokenPair}} ({{chain}}) on Uniswap",
- "pool.addMoreLiquidity": "Add more liquidity",
- "pool.apr": "APR",
- "pool.apr.description": "Annualized based on 1 day fees",
- "pool.areCreating": "You are creating a pool",
- "pool.areFirst": "You are the first liquidity provider.",
- "pool.back": "Back to Pool",
- "pool.balances": "Pool balances",
- "pool.claimFees": "Claim fees",
- "pool.collectAs": "Collect as {{nativeWrappedSymbol}}",
- "pool.collected": " Collected",
- "pool.collecting": "Collecting",
- "pool.collectingFees": "Collect fees",
- "pool.collectingFeesWithdraw": "Collecting fees will withdraw currently available fees for you.",
- "pool.confirmSupply": "Confirm supply",
- "pool.connection.networkUnsupported": "Your connected network is unsupported.",
- "pool.create.pair": "Create a pair",
- "pool.createAndSupply": "Create pool & supply",
- "pool.depositAmounts": "Deposit amounts",
- "pool.earnFees": "By adding liquidity you’ll earn 0.3% of all trades on this pair proportional to your share of the pool. Fees are added to the pool, accrue in real time and can be claimed by withdrawing your liquidity.",
- "pool.estimatePercentToRevert": "Output is estimated. If the price changes by more than {{allowed}}% your transaction will revert.",
- "pool.explorers": "Explorers",
- "pool.exporeAnalytics": "Explore Uniswap Analytics.",
- "pool.hideClosed": "Hide closed positions",
- "pool.import": "Import pool",
- "pool.import.v2": "Import V2 pool",
- "pool.increaseLiquidity": "Increase liquidity",
- "pool.initialShare": "Initial prices and pool share",
- "pool.learn": "Learn",
- "pool.learnAbout": "Read more about providing liquidity",
- "pool.learnLiquidity": "Learn about providing liquidity",
- "pool.learnv3LP": "Check out our v3 LP walkthrough and migration guides.",
- "pool.limitFluctuation.warning": "Please be aware that the execution for limits may vary based on real-time market fluctuations and Ethereum network congestion. Limits may not execute exactly when tokens reach the specified price.",
- "pool.liquidity.connectToAdd": "Connect to a wallet to view your liquidity.",
- "pool.liquidity.earn.fee": "Liquidity providers earn a 0.3% fee on all trades proportional to their share of the pool. Fees are added to the pool, accrue in real time and can be claimed by withdrawing your liquidity.",
- "pool.liquidity.outOfSync": "Pool out of sync",
- "pool.liquidity.outOfSync.message": "This pool is out of sync with market prices. Adding liquidity at the suggested ratios may result in loss of funds.",
- "pool.liquidity.ownershipWarning.message": "You are not the owner of this LP position. You will not be able to withdraw the liquidity from this position unless you own the following address: {{ownerAddress}}",
- "pool.liquidity.rewards": "Liquidity provider rewards",
- "pool.liquidity.taxWarning": "Token taxes",
- "pool.liquidity.taxWarning.message": "One or more of these tokens have taxes on transfers. Adding liquidity with V3 may result in loss of funds. Try using V2 instead.",
- "pool.liquidityPoolFeesNotice": "When you add liquidity, you will receive pool tokens representing your position. These tokens automatically earn fees proportional to your share of the pool, and can be redeemed at any time.",
- "pool.manageRewardsLiquidity": "Manage liquidity in rewards pool",
- "pool.max.label": "Max:",
- "pool.maxPrice": "Max price",
- "pool.min.label": "Min:",
- "pool.minPrice": "Min price",
- "pool.mustBeInitialized": "This pool must be initialized before you can add liquidity. To initialize, select a starting price for the pool. Then, enter your liquidity price range and deposit amount. Gas fees will be higher than usual due to the initialization transaction.",
- "pool.newPosition.plus": "+ New position",
- "pool.noLiquidity": "No liquidity found.",
- "pool.onceHappyReview": "Once you are happy with the rate click supply to review.",
- "pool.openToStart": "Open a new position or create a pool to get started.",
- "pool.owner": "Owner",
- "pool.percent": "{{pct}}% pool",
- "pool.pooled": "Pooled {{sym}}:",
- "pool.position.100": "Your position will be 100% at this price.",
- "pool.position.100.at": "Your position will be 100% {{symbol}} at this price.",
- "pool.position.networkConnect": "To view a position, you must be connected to the network it belongs to.",
- "pool.position.willBe100": "Your position will be 100% composed of {{sym}} at this price",
- "pool.positions": "Positions",
- "pool.positions.title": "Your positions",
- "pool.priceRange": "Price range",
- "pool.rangeBadge.tooltip.outsideRange": "The price of this pool is outside of your selected range. Your position is not currently earning fees.",
- "pool.rangeBadge.tooltip.text": "Your position has 0 liquidity, and is not earning fees.",
- "pool.rangeBadge.tooltip.withinRange": "The price of this pool is within your selected range. Your position is currently earning fees.",
- "pool.rates": "Rates",
- "pool.ratioTokenToPrice": "The ratio of tokens you add will set the price of this pool.",
- "pool.removeLiquidity": "Remove liquidity",
- "pool.rewardsPool.label": "Pool tokens in rewards pool:",
- "pool.selectedRange": "Selected range",
- "pool.selectPair": "Select pair",
- "pool.share": "Prices and pool share",
- "pool.share.label": "Your pool share:",
- "pool.shareOf": "Share of Pool:",
- "pool.showClosed": "Show closed positions",
- "pool.specificPosition": "{{symbol}} position",
- "pool.startingPrice": "Starting {{sym}} Price:",
- "pool.supply": "Supply",
- "pool.supplyingMaths": "Supplying {{amtA}} {{symA}} and {{amtB}} {{symB}}",
- "pool.tokenPair": "Token pair",
- "pool.top": "Top pools",
- "pool.totalTokens": "Your total pool tokens:",
- "pool.unclaimedFees": "Unclaimed fees",
- "pool.v2": "v2 pools",
- "pool.v2.add": "Add V2 liquidity",
- "pool.v2.migratev3": "Migrate liquidity to V3",
- "pool.v2liquidity": "V2 liquidity",
- "pool.v3": "v3 pools",
- "pool.v4": "v4 pools",
- "pool.volOverTvl": "1D vol/TVL",
- "pool.volume.sevenDay": "7 day volume",
- "pool.volume.sevenDay.short": "7D vol",
- "pool.yourBalances": "Your balances",
- "pool.yourv2": "Your V2 liquidity",
- "poolFinder.connect": "Connect to a wallet to find pools.",
- "poolFinder.create": "Create pool",
- "poolFinder.found": "Pool found!",
- "poolFinder.managePool": "Manage this pool",
- "poolFinder.noLiquidity": "You don’t have liquidity in this pool yet.",
- "poolFinder.noPoolFound": "No pool found.",
- "poolFinder.selectToken": "Select a token to find your v2 liquidity.",
- "poolFinder.tip": "Tip: Use this tool to find v2 pools that don’t automatically appear in the interface.",
- "pools.approving.amount": "Approving {{amount}}",
- "position.addHook": "Add a Hook",
- "position.appearHere": "Your position will appear here.",
- "position.currentValue": "Current position value",
- "position.depositedCurrency": "Deposited {{currencySymbol}}",
- "position.migrate.liquidity": "When migrating positions, you cannot change your token pair, but you can add a hook to enhance functionality.",
- "position.new": "New Position",
- "position.new.protocol": "New {{protocol}} Position",
- "position.noLiquidity": "Liquidity data not available.",
- "position.noLiquidityData": "There is no liquidity data.",
- "position.protocol": "{{protocol}} position",
- "position.provide.liquidity": "Choose the tokens you want to provide liquidity for. You can select tokens on all supported networks.",
- "position.provide.liquidityDescription": "Providing full range liquidity ensures continuous market participation across all possible prices, offering simplicity but with potential for higher impermanent loss.",
- "position.selectRange": "Select price range",
- "position.stats.feeApr": "Fee APR",
- "position.stats.totalApr": "Total APR",
- "position.step.deposit": "Enter deposit amounts",
- "position.step.range": "Set price range",
- "position.step.select": "Select token pair and fees",
- "position.your": "Your position",
- "privacy.anonymizedLogs": "The app logs anonymized usage statistics in order to improve over time.",
- "privacy.autoRouter": "The app fetches the optimal trade route from a Uniswap Labs server.",
- "privacy.infura": "The app fetches on-chain data and constructs contract calls with an Infura API.",
- "privacy.thirdPartyApis": "This app uses the following third-party APIs:",
- "privacy.trm": "The app securely collects your wallet address and shares it with TRM Labs Inc. for risk and compliance reasons.",
- "privacy.uniswaptos": "Uniswap Labs’ Terms of Service",
- "qrScanner.button.connections_one": "1 app connected",
- "qrScanner.button.connections_other": "{{count}} apps connected",
- "qrScanner.error.camera.message": "To scan a code, allow Camera access in system settings",
- "qrScanner.error.camera.title": "Camera is disabled",
- "qrScanner.error.none": "No QR code found",
- "qrScanner.recipient.action.scan": "Scan a QR code",
- "qrScanner.recipient.action.show": "Show my QR code",
- "qrScanner.recipient.error.message": "Make sure that you’re scanning a valid Ethereum address QR code before trying again.",
- "qrScanner.recipient.error.title": "Invalid QR Code",
- "qrScanner.request.message.unavailable": "No message found.",
- "qrScanner.request.method.default": "Request from {{dappNameOrUrl}}",
- "qrScanner.request.method.signature": "Signature request from {{dappNameOrUrl}}",
- "qrScanner.request.method.transaction": "Transaction request from {{dappNameOrUrl}}",
- "qrScanner.request.withAmount": "Allow {{dappName}} to use up to {{amount}} {{currencySymbol}}?",
- "qrScanner.request.withoutAmount": "Allow {{dappName}} to use your {{currencySymbol}}?",
- "qrScanner.status.connecting": "Connecting...",
- "qrScanner.status.loading": "Loading...",
- "qrScanner.title": "Scan a QR code",
- "qrScanner.wallet.title": "You can receive tokens & NFTs on Ethereum, Polygon, Arbitrum, Optimism, Base, ZKsync, Zora, Avalanche, Celo, Blast, and BNB Chain.",
- "removeLiquidity.collectFees": "You will also collect fees earned from this position.",
- "removeLiquidity.outputEstimated": "Output is estimated. If the price changes by more than {{allowed}}% your transaction will revert.",
- "removeLiquidity.pendingText": "Removing {{amtA}} {{symA}} and {{amtB}} {{symB}}",
- "removeLiquidity.pooled": "Pooled {{symbol}}:",
- "removeLiquidity.removing": "Removing {{amt1}} {{symbol1}} and {{amt2}} {{symbol2}}",
- "removeLiquidity.removingTokensTip": "Tip: Removing pool tokens converts your position back into underlying tokens at the current rate, proportional to your share of the pool. Accrued fees are included in the amounts you receive.",
- "removeLiquidity.uniBurned": "UNI {{a}}/{{b}} Burned",
- "routing.aggregateLiquidity": "When available, aggregates liquidity sources for better prices and gas free swaps.",
- "routing.cheapest": "The Uniswap client selects the cheapest trade option factoring price and network costs.",
- "scantastic.code.expired": "Expired",
- "scantastic.code.subtitle": "Enter this code in the Uniswap Extension. Your recovery phrase will be safely encrypted and transferred.",
- "scantastic.code.timeRemaining.shorthand.hours": "New code in {{hours}}h {{minutes}}m {{seconds}}s",
- "scantastic.code.timeRemaining.shorthand.minutes": "New code in {{minutes}}m {{seconds}}s",
- "scantastic.code.timeRemaining.shorthand.seconds": "New code in {{seconds}}s",
- "scantastic.code.title": "Uniswap one-time code",
- "scantastic.confirmation.button.continue": "Yes, continue",
- "scantastic.confirmation.label.browser": "Browser",
- "scantastic.confirmation.label.device": "Device",
- "scantastic.confirmation.subtitle": "Only continue if you are scanning a QR code from Uniswap Extension on a trusted device.",
- "scantastic.confirmation.title": "Are you trying to import your wallet?",
- "scantastic.confirmation.warning": "Beware of sites and apps impersonating Uniswap. Otherwise your wallet may be compromised.",
- "scantastic.error.encryption": "Failed to prepare seed phrase.",
- "scantastic.error.noCode": "No OTP received. Please try again.",
- "scantastic.error.timeout.message": "Scan the QR code on the Uniswap Extension again to continue syncing your wallet.",
- "scantastic.error.timeout.title": "Your connection timed out",
- "scantastic.modal.ipMismatch.description": "To scan this QR code, your phone must be connected to the same WiFi network as your computer and any VPNs should be temporarily turned off.",
- "scantastic.modal.ipMismatch.title": "Switch your WiFi network",
- "search.chainComing": "Coming soon: search and explore tokens on {{chainName}} Chain",
- "search.results.count_one": "1 item",
- "search.results.count_other": "{{count}} items",
- "search.ukDisclaimer": "Disclaimer for UK residents",
- "send.button.review": "Review transfer",
- "send.gas.error.title": "N/A",
- "send.gas.networkCost.title": "Network cost",
- "send.input.token.balance.title": "Balance: {{balance}} {{symbol}}",
- "send.recipient.header": "Select recipient",
- "send.recipient.input.placeholder": "Search ENS or address",
- "send.recipient.previous_one": "1 previous transfer",
- "send.recipient.previous_other": "{{count}} previous transfers",
- "send.recipient.results.empty": "No results found",
- "send.recipient.results.error": "The address you typed either does not exist or is spelled incorrectly.",
- "send.recipient.section.favorite": "Favorite wallets",
- "send.recipient.section.recent": "Recent",
- "send.recipient.section.search": "Search results",
- "send.recipient.section.viewOnly": "View-only wallets",
- "send.recipient.section.yours": "Your wallets",
- "send.recipient.warning.viewOnly.message": "Only send funds to this wallet if you have the recovery phrase or know the owner of the wallet.",
- "send.recipient.warning.viewOnly.title": "You have this as a view-only wallet",
- "send.recipientSelect.search.empty.message": "When you send tokens to a wallet address, they’ll show up here",
- "send.recipientSelect.search.empty.title": "No wallets saved",
- "send.review.modal.title": "You’re sending",
- "send.review.summary.button.title": "Confirm send",
- "send.search.empty.subtitle": "The address you typed either does not exist or is spelled incorrectly.",
- "send.search.empty.title": "No results found",
- "send.search.placeholder": "Search ENS or address",
- "send.title": "Send",
- "send.warning.blocked.default": "This wallet is blocked",
- "send.warning.blocked.modal.message": "This address is blocked on Uniswap Wallet because it is associated with one or more blocked activities. If you believe this is an error, please email compliance@uniswap.org.",
- "send.warning.blocked.modal.title": "Blocked address",
- "send.warning.blocked.recipient": "Recipient wallet is blocked",
- "send.warning.erc20.message": "You are attempting to send funds to a token address. Sending crypto to this type of address may result in a permanent loss of funds.",
- "send.warning.erc20.title": "This is a token address",
- "send.warning.insufficientFunds.message": "Your {{currencySymbol}} balance has decreased since you entered the amount you’d like to send",
- "send.warning.insufficientFunds.title": "Not enough {{currencySymbol}}",
- "send.warning.insufficientGas.message.withNetwork": "Not enough {{currencySymbol}} on {{networkName}} to send",
- "send.warning.insufficientGas.message.withoutNetwork": "Not enough {{currencySymbol}} to send",
- "send.warning.modal.button.cta.blocking": "OK",
- "send.warning.modal.button.cta.cancel": "Cancel",
- "send.warning.modal.button.cta.confirm": "Confirm",
- "send.warning.newAddress.details.ENS": "ENS",
- "send.warning.newAddress.details.username": "Username",
- "send.warning.newAddress.details.walletAddress": "Wallet Address",
- "send.warning.newAddress.message": "You haven’t transacted with this address before. Please confirm that the address is correct before continuing.",
- "send.warning.newAddress.title": "New address",
- "send.warning.restore": "Restore your wallet to send",
- "send.warning.self.message": "You are attempting to send funds to your current wallet. Sending crypto to this address will incur unnecessary network costs.",
- "send.warning.self.title": "This is your current wallet",
- "send.warning.smartContract.message": "You’re about to send tokens to a special type of address—a smart contract. Double-check it’s the address you intended to send to. If it’s wrong, your tokens could be lost forever.",
- "send.warning.smartContract.title": "Is this a wallet address?",
- "send.warning.viewOnly.message": "You need to import this wallet via recovery phrase to send assets.",
- "send.warning.viewOnly.title": "This wallet is view-only",
- "sendRecipientForm.recentAddresses.label": "Recents",
- "sendReviewModal.title": "Review send",
- "setting.recoveryPhrase.account.show": "Show recovery phrase",
- "setting.recoveryPhrase.action.hide": "Hide recovery phrase",
- "setting.recoveryPhrase.remove": "Remove recovery phrase",
- "setting.recoveryPhrase.remove.confirm.subtitle": "I understand that Uniswap Labs can’t help me recover my wallet if I failed to do so.",
- "setting.recoveryPhrase.remove.confirm.title": "I saved my recovery phrase",
- "setting.recoveryPhrase.remove.initial.subtitle": "Make sure you’ve saved your recovery phrase. You will lose access to your wallets otherwise",
- "setting.recoveryPhrase.remove.initial.title": "Before you continue",
- "setting.recoveryPhrase.remove.password.error": "Wrong password. Try again",
- "setting.recoveryPhrase.remove.subtitle": "Enter your password to confirm",
- "setting.recoveryPhrase.remove.title": "You’re removing your recovery phrase",
- "setting.recoveryPhrase.view.warning.message1": "Anyone who knows your recovery phrase can access your wallet and funds",
- "setting.recoveryPhrase.view.warning.message2": "View this in private",
- "setting.recoveryPhrase.view.warning.message3": "Do not share with anyone",
- "setting.recoveryPhrase.view.warning.message4": "Never enter it to any websites or applications",
- "setting.recoveryPhrase.view.warning.title": "Before you continue",
- "setting.recoveryPhrase.warning.screenshot.message": "Anyone who gains access to your photos can access your wallet. We recommend that you write down your words instead.",
- "setting.recoveryPhrase.warning.screenshot.title": "Screenshots aren’t secure",
- "setting.recoveryPhrase.warning.view.message": "Anyone who knows your recovery phrase can access your wallet and funds.",
- "setting.recoveryPhrase.warning.view.title": "View this in a private place",
- "settings.action.feedback": "Share feedback",
- "settings.action.help": "Get help",
- "settings.action.lock": "Lock wallet",
- "settings.action.privacy": "Privacy policy",
- "settings.action.terms": "Terms of service",
- "settings.footer": "Made with love, \nUniswap Team 🦄",
- "settings.hideSmallBalances": "Hide small balances",
- "settings.maxSlippage": "Max. slippage",
- "settings.screen.appearance.title": "Appearance",
- "settings.section.about": "About",
- "settings.section.preferences": "Preferences",
- "settings.section.security": "Security",
- "settings.section.support": "Support",
- "settings.section.wallet.button.viewAll": "View all",
- "settings.section.wallet.button.viewLess": "View less",
- "settings.section.wallet.label.viewOnly": "View-only",
- "settings.section.wallet.title": "Wallet settings",
- "settings.setting.appearance.option.auto": "Auto",
- "settings.setting.appearance.option.dark.subtitle": "Always use dark mode",
- "settings.setting.appearance.option.dark.title": "Dark mode",
- "settings.setting.appearance.option.device.subtitle": "Default to your device’s appearance",
- "settings.setting.appearance.option.device.title": "Device settings",
- "settings.setting.appearance.option.light.subtitle": "Always use light mode",
- "settings.setting.appearance.option.light.title": "Light mode",
- "settings.setting.appearance.title": "Appearance",
- "settings.setting.backup.create.description": "Setting a password will encrypt your recovery phrase backup, adding an extra level of protection if your {{cloudProviderName}} account is ever compromised.",
- "settings.setting.backup.create.title": "Back up to {{cloudProviderName}}",
- "settings.setting.backup.delete.confirm.message": "Because these wallets share a recovery phrase, it will also delete the backups for these wallets below",
- "settings.setting.backup.delete.confirm.title": "Are you sure?",
- "settings.setting.backup.delete.warning": "If you delete your {{cloudProviderName}} backup, you’ll only be able to recover your wallet with a manual backup of your recovery phrase. Uniswap Labs can’t recover your assets if you lose your recovery phrase.",
- "settings.setting.backup.error.message.full": "Unable to backup recovery phrase to {{cloudProviderName}}. Please ensure you have {{cloudProviderName}} enabled with available storage space and try again.",
- "settings.setting.backup.error.message.short": "Unable to delete backup",
- "settings.setting.backup.error.title": "{{cloudProviderName}} error",
- "settings.setting.backup.modal.description": "You haven’t backed up your recovery phrase to {{cloudProviderName}} yet. By doing so, you can recover your wallet just by being logged into {{cloudProviderName}} on any device.",
- "settings.setting.backup.modal.title": "Back up recovery phrase to {{cloudProviderName}}?",
- "settings.setting.backup.password.error.mismatch": "Passwords do not match",
- "settings.setting.backup.password.medium": "This is a medium password",
- "settings.setting.backup.password.placeholder.confirm": "Confirm password",
- "settings.setting.backup.password.placeholder.create": "Create password",
- "settings.setting.backup.password.strong": "This is a strong password",
- "settings.setting.backup.password.weak": "This is a weak password",
- "settings.setting.backup.recoveryPhrase.label": "Recovery phrase",
- "settings.setting.backup.selected": "{{cloudProviderName}} backup",
- "settings.setting.backup.status.action.delete": "Delete backup",
- "settings.setting.backup.status.complete": "Backed up to {{cloudProviderName}}",
- "settings.setting.backup.status.description": "By having your recovery phrase backed up to {{cloudProviderName}}, you can recover your wallet just by being logged into your {{cloudProviderName}} account on any device.",
- "settings.setting.backup.status.inProgress": "Backing up to {{cloudProviderName}}...",
- "settings.setting.backup.status.recoveryPhrase.backed": "Backed up",
- "settings.setting.backup.status.title": "{{cloudProviderName}} backup",
- "settings.setting.beta.tooltip": "Coming soon",
- "settings.setting.biometrics.appAccess.subtitle.android": "Require biometrics to open app",
- "settings.setting.biometrics.appAccess.subtitle.ios": "Require {{biometricsMethod}} to open app",
- "settings.setting.biometrics.appAccess.title": "App access",
- "settings.setting.biometrics.auth": "Please authenticate",
- "settings.setting.biometrics.off.message.android": "Biometrics is currently turned off for Uniswap Wallet—you can turn it on in your system settings.",
- "settings.setting.biometrics.off.message.ios": "{{biometricsMethod}} is currently turned off for Uniswap Wallet—you can turn it on in your system settings.",
- "settings.setting.biometrics.off.title.android": "Biometrics is turned off",
- "settings.setting.biometrics.off.title.ios": "{{biometricsMethod}} is turned off",
- "settings.setting.biometrics.title": "Biometrics",
- "settings.setting.biometrics.transactions.subtitle.android": "Require biometrics to transact",
- "settings.setting.biometrics.transactions.subtitle.ios": "Require {{biometricsMethod}} to transact",
- "settings.setting.biometrics.transactions.title": "Transactions",
- "settings.setting.biometrics.unavailable.message.android": "Biometrics is not setup on your device. To use biometrics, set it up first in Settings.",
- "settings.setting.biometrics.unavailable.message.ios": "{{biometricsMethod}} is not setup on your device. To use {{biometricsMethod}}, set it up first in Settings.",
- "settings.setting.biometrics.unavailable.title.android": "Biometrics is not setup",
- "settings.setting.biometrics.unavailable.title.ios": "{{biometricsMethod}} is not setup",
- "settings.setting.biometrics.warning.message.android": "If you don’t turn on biometrics, anyone who gains access to your device can open Uniswap Wallet and make transactions.",
- "settings.setting.biometrics.warning.message.ios": "If you don’t turn on {{biometricsMethod}}, anyone who gains access to your device can open Uniswap Wallet and make transactions.",
- "settings.setting.biometrics.warning.title": "Are you sure?",
- "settings.setting.connections.disconnectAll": "Disconnect all",
- "settings.setting.connections.noConnectionsDescription": "Connect to an app by looking for a “Connect Wallet” or “Log in” button.",
- "settings.setting.currency.title": "Local currency",
- "settings.setting.hapticTouch.title": "Haptic touch",
- "settings.setting.helpCenter.title": "Help center",
- "settings.setting.language.button.navigate": "Go to settings",
- "settings.setting.language.description.extension": "Uniswap defaults to your system language settings. To change your preferred language, go to your system settings.",
- "settings.setting.language.description.mobile": "Uniswap defaults to your device‘s language settings. To change your preferred language, go to “Uniswap” in your device settings and tap on “Language”.",
- "settings.setting.language.title": "Language",
- "settings.setting.password.title": "Change password",
- "settings.setting.privacy.analytics.description": "We use anonymous usage data to enhance your experience across Uniswap Labs products. When disabled, we only track errors and essential usage.",
- "settings.setting.privacy.analytics.title": "Allow analytics",
- "settings.setting.privacy.title": "Privacy",
- "settings.setting.recoveryPhrase.password.title": "Enter your password",
- "settings.setting.recoveryPhrase.title": "Recovery phrase",
- "settings.setting.smallBalances.title": "Hide small balances",
- "settings.setting.unknownTokens.title": "Hide unknown tokens",
- "settings.setting.wallet.action.editLabel": "Edit label",
- "settings.setting.wallet.action.editProfile": "Edit profile",
- "settings.setting.wallet.action.remove": "Remove wallet",
- "settings.setting.wallet.connections.title": "Manage connections",
- "settings.setting.wallet.editLabel.description": "Labels are not public. They are stored locally and only visible to you.",
- "settings.setting.wallet.editLabel.save": "Save changes",
- "settings.setting.wallet.label": "Nickname",
- "settings.setting.wallet.notifications.title": "Notifications",
- "settings.setting.wallet.preferences.title": "Wallet preferences",
- "settings.showTestNets": "Show testnets",
- "settings.switchNetwork.warning": "To use Uniswap on {{label}}, switch the network in your wallet’s settings.",
- "settings.title": "Settings",
- "settings.version": "Version {{appVersion}}",
- "speedBump.newAddress.warning.description": "You haven’t transacted with this address before. Make sure it’s the correct address before continuing.",
- "speedBump.newAddress.warning.title": "New address",
- "speedBump.smartContractAddress.warning.description": "You’re about to send tokens to a special type of address - a smart contract. Double-check it’s the address you intended to send to. If it’s wrong, your tokens could be lost forever.",
- "speedBump.smartContractAddress.warning.title": "Is this a wallet address?",
- "stats.24fees": "24H fees",
- "stats.24volume": "24H volume",
- "stats.allTimeFees": "All time LP fees",
- "stats.allTimeSwappers": "All time swappers",
- "stats.allTimeVolume": "All time volume",
- "stats.fdv": "FDV",
- "stats.fdv.description": "Fully diluted valuation (FDV) calculates the total market value assuming all tokens are in circulation.",
- "stats.marketCap": "Market cap",
- "stats.marketCap.description": "Market capitalization is the total market value of an asset’s circulating supply.",
- "stats.tvl": "Total volume",
- "stats.tvl.description": "Total value locked (TVL) is the aggregate amount of the asset available across all Uniswap v3 liquidity pools.",
- "stats.volume.1d": "1 day volume",
- "stats.volume.1d.description": "1 day volume is the amount of the asset that has been traded on Uniswap v3 during the past 24 hours.",
- "stats.volume.1d.short": "1D vol",
- "stats.volume.description": "Volume is the amount of the asset that has been traded on Uniswap v3 during the selected time frame.",
- "swap.allow.oneTime": "Allow {{sym}} (one time)",
- "swap.approvalNeeded": "An approval is needed to use this token. ",
- "swap.approvalPending": "Approval pending",
- "swap.approveAndSubmit": "Approve and submit",
- "swap.approveAndSwap": "Approve and swap",
- "swap.approveInWallet": "Approve in your wallet",
- "swap.balance.amount": "Balance: {{amount}}",
- "swap.bestRoute.cost": "Best price route costs ~{{gasPrice}} in gas. ",
- "swap.bridging.estimatedTime": "Est. time",
- "swap.bridging.title": "Swap across networks",
- "swap.bridging.warning.description": "You’re swapping from {{fromNetwork}} to {{toNetwork}}.",
- "swap.button.max": "Max",
- "swap.button.review": "Review",
- "swap.button.submitting": "Submitting swap...",
- "swap.button.submitting.keep.open": "Keep your wallet open...",
- "swap.button.swap": "Swap",
- "swap.button.unwrap": "Unwrap",
- "swap.button.wrap": "Wrap",
- "swap.buy.countryModal.placeholder": "Search by country or region",
- "swap.cancel.cannotExecute": "Your swap could execute before cancellation is processed. Your network costs cannot be refunded. Do you wish to proceed?",
- "swap.cancel.cannotExecute.plural": "Your swaps could execute before cancellation is processed. Your network costs cannot be refunded. Do you wish to proceed?",
- "swap.confirmLimit": "Confirm limit",
- "swap.confirmSwap": "Confirm swap",
- "swap.deadline.settings.title": "Transaction deadline",
- "swap.details.feeOnTransfer": "{{tokenSymbol}} fee",
- "swap.details.feeOnTransfer.default": "Token fee",
- "swap.details.newQuote.input": "New input",
- "swap.details.newQuote.output": "New output",
- "swap.details.orderRouting": "Order routing",
- "swap.details.orderRoutingInfo": "Your price already includes network costs on the destination network and a 0.05% Across fee.",
- "swap.details.rate": "Rate",
- "swap.details.slippage": "Max slippage",
- "swap.details.uniswapFee": "Fee",
- "swap.enterAmount": "Enter {{sym}} amount",
- "swap.error.default": "You may need to increase your slippage tolerance. Note: fee-on-transfer and rebase tokens are incompatible with Uniswap V3.",
- "swap.error.expectedToFail": "Your swap is expected to fail.",
- "swap.error.modifiedByWallet": "Your swap was modified through your wallet. If this was a mistake, please cancel immediately or risk losing your funds.",
- "swap.error.rejected": "Transaction rejected",
- "swap.error.undefinedObject": "An error occurred when trying to execute this swap. You may need to increase your slippage tolerance. If that does not work, there may be an incompatibility with the token you are trading. Note: fee-on-transfer and rebase tokens are incompatible with Uniswap V3.",
- "swap.error.unknown": "Unknown error.",
- "swap.error.v2.expired": "This transaction could not be sent because the deadline has passed. Please check that your transaction deadline is not too low.",
- "swap.error.v2.k": "The Uniswap invariant x*y=k was not satisfied by the swap. This usually means one of the tokens you are swapping incorporates custom behavior on transfer.",
- "swap.error.v2.slippage": "This transaction will not succeed either due to price movement or fee on transfer. Try increasing your slippage tolerance",
- "swap.error.v2.transferInput": "The input token cannot be transferred. There may be an issue with the input token.",
- "swap.error.v2.transferOutput": "The output token cannot be transferred. There may be an issue with the output token.",
- "swap.error.v3.slippage": "This transaction will not succeed due to price movement. Try increasing your slippage tolerance. Note: fee on transfer and rebase tokens are incompatible with Uniswap V3.",
- "swap.error.v3.transferOutput": "The output token cannot be transferred. There may be an issue with the output token. Note: fee on transfer and rebase tokens are incompatible with Uniswap V3.",
- "swap.estimatedDifference.label": "There will be a large difference between your input and output values due to current liquidity.",
- "swap.fail.message": "Try adjusting slippage to a higher value.",
- "swap.fail.uniswapX": "Swap couldn’t be completed with UniswapX. Try your swap again to route it through the classic Uniswap API.",
- "swap.fees.experience": "This fee is applied on select token pairs to ensure the best experience with Uniswap. It is paid in the output token and has already been factored into the quote.",
- "swap.fees.noFee": "Fees are applied on select token pairs to ensure the best experience with Uniswap. There is no fee associated with this swap.",
- "swap.fetchingBestPrice": "Fetching best price...",
- "swap.fetchingPrice": "Fetching price...",
- "swap.finalizingQuote": "Finalizing quote...",
- "swap.form.header": "Swap",
- "swap.form.insufficientLiquidity": "Insufficient liquidity for this trade.",
- "swap.form.pocketUniverseExtension.warning": "The Pocket Universe extension violates our by modifying our product in a way that is misleading and could harm users. Please disable the extension and reload the page.",
- "swap.form.warning.output.fotFees": "Due to the token fee of {{fotCurrencySymbol}}, swap amounts can only be entered using the input field",
- "swap.form.warning.output.fotFees.fallback": "Due to token fees, swap amounts can only be entered using the input field",
- "swap.form.warning.restore": "Restore your wallet to swap",
- "swap.frontrun.warning": "Your transaction may be frontrun and result in an unfavorable trade.",
- "swap.header.viewOnly": "View-only",
- "swap.impactOfTrade": "The impact your trade has on the market price of this pool.",
- "swap.inputEstimated.atMost": "Input is estimated. You will sell at most or the transaction will revert.",
- "swap.limit": "Limit",
- "swap.limitedAssets.warning": "Some assets are not available through this interface because they may not work well with the smart contracts or we are unable to allow trading for legal reasons.",
- "swap.limitFilled": "Limit filled!",
- "swap.limitSubmitted": "Limit submitted",
- "swap.marketPrice.outsideRange.label": "The market price is outside your specified price range. Single-asset deposit only.",
- "swap.maxPriceSlip.revert": "The maximum amount you are guaranteed to spend. If the price slips any further, your transaction will revert.",
- "swap.minPriceSlip.revert": "If the price moves so that you will receive less than {{amount}}, your transaction will revert.",
- "swap.networkCost.paidIn": "Network cost is paid in {{sym}} on the {{chainName}} network in order to transact.",
- "swap.orderRouting": "Order routing",
- "swap.outputEstimated.atLeast": "Output is estimated. You will receive at least or the transaction will revert.",
- "swap.payAnyway": "Pay Anyway",
- "swap.payAtMost": "Pay at most",
- "swap.payWith": "Pay with",
- "swap.placeOrder": "Place order",
- "swap.priceImpact": "Price impact",
- "swap.receive.atLeast": "Receive at least",
- "swap.request.title.full": "Swap {{inputCurrencySymbol}} → {{outputCurrencySymbol}}",
- "swap.request.title.short": "Swap Tokens",
- "swap.review": "Review swap",
- "swap.review.summary": "You’re swapping",
- "swap.reviewLimit": "Review limit",
- "swap.route.optimizedGasCost": "This route optimizes your total output by considering split routes, multiple hops, and the gas cost of each step.",
- "swap.settings.protection.description": "With swap protection on, your Ethereum transactions will be protected from sandwich attacks, with reduced chances of failure.",
- "swap.settings.protection.subtitle.supported": "{{chainName}} Network",
- "swap.settings.protection.subtitle.unavailable": "Not available on {{chainName}}",
- "swap.settings.protection.title": "Swap protection",
- "swap.settings.routingPreference.option.default.description": "The Uniswap client selects the cheapest trade option factoring price and network costs.",
- "swap.settings.routingPreference.option.default.title": "Default",
- "swap.settings.routingPreference.option.v2.title": "v2 pools",
- "swap.settings.routingPreference.option.v3.title": "v3 pools",
- "swap.settings.routingPreference.title": "Trade options",
- "swap.settings.slippage.control.auto": "Auto",
- "swap.settings.slippage.description": "Your transaction will revert if the price changes more than the slippage percentage.",
- "swap.settings.slippage.input.message": "If the price slips any further, your transaction will revert. Below is the minimum amount you are guaranteed to receive.",
- "swap.settings.slippage.input.receive.title": "Receive at least",
- "swap.settings.slippage.output.message": "If the price slips any further, your transaction will revert. Below is the maximum amount you would need to spend.",
- "swap.settings.slippage.output.spend.title": "Spend at most",
- "swap.settings.slippage.warning.max": "Enter a value less than {{maxSlippageTolerance}}",
- "swap.settings.slippage.warning.message": "Slippage may be higher than necessary",
- "swap.settings.slippage.warning.min": "Enter a value larger than 0",
- "swap.settings.title": "Swap settings",
- "swap.settings.transactionRevertPrice": "Your transaction will revert if the price changes unfavorably by more than this percentage.",
- "swap.signAndSwap": "Sign and swap",
- "swap.slippage.amt": "{{amt}} slippage",
- "swap.slippage.settings.title": "Max slippage",
- "swap.slippage.tooltip": "The maximum price movement before your transaction will revert.",
- "swap.slippageBelow.warning": "Slippage below {{amt}} may result in a failed transaction",
- "swap.submitted": "Swap submitted",
- "swap.success": "Swap success!",
- "swap.taxTooltip.label": "Exact input only",
- "swap.taxTooltip.noTokenSelected": "Fees on the selected output token don’t allow for accurate exact outputs. Use the `Sell` field instead.",
- "swap.taxTooltip.tokenSelected": "{{tokenSymbol}} fees don’t allow for accurate exact outputs. Use the `Sell` field instead.",
- "swap.tokenOwnFees": "Some tokens take a fee when they are bought or sold, which is set by the token issuer. Uniswap does not receive any of these fees.",
- "swap.total": "Total",
- "swap.transaction.deadline": "Transaction deadline",
- "swap.transaction.revertAfter": "Your transaction will revert if it is pending for more than this period of time.",
- "swap.unsupportedAssets.readMore": "Read more about unsupported assets",
- "swap.warning.expectedFailure": "This transaction is expected to fail",
- "swap.warning.feeOnTransfer.message": "Some tokens take a fee when they are bought or sold, which is set by the token issuer. Uniswap does not receive any share of these fees.",
- "swap.warning.feeOnTransfer.title": "Why is there an additional fee?",
- "swap.warning.insufficientBalance.button": "Not enough {{currencySymbol}}",
- "swap.warning.insufficientBalance.title": "You don’t have enough {{currencySymbol}}",
- "swap.warning.insufficientGas.button": "Not enough {{currencySymbol}}",
- "swap.warning.insufficientGas.button.buy": "Buy {{ tokenSymbol }}",
- "swap.warning.insufficientGas.message.withNetwork": "Not enough {{currencySymbol}} on {{networkName}} to swap",
- "swap.warning.insufficientGas.message.withoutNetwork": "Not enough {{currencySymbol}} to swap",
- "swap.warning.insufficientGas.title": "You don’t have enough {{currencySymbol}} to cover the network cost",
- "swap.warning.lowLiquidity.message": "There isn’t currently enough liquidity available between these tokens to perform a swap. Please try again later or select another token.",
- "swap.warning.lowLiquidity.title": "Not enough liquidity",
- "swap.warning.networkFee.allow": "Allow {{ inputTokenSymbol }} (one time)",
- "swap.warning.networkFee.highRelativeToValue": "The network cost exceeds 10% of your total transaction value.",
- "swap.warning.networkFee.message": "This is the cost to process your transaction on the blockchain. Uniswap does not receive any share of these fees.",
- "swap.warning.networkFee.message.uniswapX": "This is the cost to process your transaction on the blockchain. Uniswap does not receive any share of these fees. UniswapX aggregates liquidity sources for better prices and gas free swaps.",
- "swap.warning.networkFee.wrap": "Wrap ETH",
- "swap.warning.offline.message": "You may have lost internet connection or the network may be down. Please check your internet connection and try again.",
- "swap.warning.offline.title": "You’re offline",
- "swap.warning.priceImpact": "This transaction will result in a price impact on the market price of this pool. Do you wish to continue?",
- "swap.warning.priceImpact.message": "Due to the amount of {{outputCurrencySymbol}} liquidity currently available, the more {{inputCurrencySymbol}} you try to swap, the less {{outputCurrencySymbol}} you will receive.",
- "swap.warning.priceImpact.title": "High price impact ({{priceImpactValue}})",
- "swap.warning.queuedOrder.appClosed": "Your transaction wasn’t submitted because you closed the app.",
- "swap.warning.queuedOrder.approvalFailed": "Your transaction wasn’t submitted because token approval failed.",
- "swap.warning.queuedOrder.stale": "Your transaction wasn’t submitted because you closed the app or approval took too long.",
- "swap.warning.queuedOrder.submissionFailed": "There was a problem submitting your transaction.",
- "swap.warning.queuedOrder.title": "Swap cancelled",
- "swap.warning.queuedOrder.wrap.message": "Your ETH will remain wrapped as WETH.",
- "swap.warning.queuedOrder.wrapFailed": "Your transaction wasn’t submitted because the wrap transaction failed.",
- "swap.warning.rateLimit.message": "Please try again in a few minutes.",
- "swap.warning.rateLimit.title": "Rate limit exceeded",
- "swap.warning.router.message": "You may have lost connection or the network may be down. If the problem persists, please try again later.",
- "swap.warning.router.title": "This trade cannot be completed right now",
- "swap.warning.uniswapFee.message.default": "Fees are applied to ensure the best experience with Uniswap. There is no fee associated with this swap.",
- "swap.warning.uniswapFee.message.included": "Fees are applied to ensure the best experience with Uniswap, and have already been factored into this quote.",
- "swap.warning.uniswapFee.title": "Swap fee",
- "swap.warning.viewOnly.message": "You need to import this wallet via recovery phrase to swap tokens.",
- "swap.wrap.token": "Wrap {{sym}}",
- "tdp.balanceSummary.otherNetworks": "On other networks",
- "tdp.balanceSummary.otherNetworksBalance": "Balance on other networks",
- "tdp.balanceSummary.title": "Your balance",
- "tdp.invalidTokenPage.switchChainPrompt": "Switch to {{network}}",
- "tdp.invalidTokenPage.title": "This token doesn’t exist",
- "tdp.invalidTokenPage.titleWithChain": "This token doesn’t exist on {{network}}",
- "tdp.loading.title.default": "token data for ",
- "tdp.loading.title.withChain": "token data for on {{chainName}}",
- "tdp.nameNotFound": "Name not found",
- "tdp.noInfoAvailable": "No token information available",
- "tdp.stats.unsupportedChainDescription": "Token stats and charts for {{chain}} are available on {{infoLink}}",
- "tdp.symbolNotFound": "Symbol not found",
- "themeToggle.theme": "Theme",
- "title.betterPricesMoreListings": "Better prices. More listings. Buy, sell, and trade NFTs across top marketplaces like OpenSea. Explore trending collections.",
- "title.buySellTradeEthereum": "Buy, sell & trade Ethereum and other top tokens on Uniswap",
- "title.createGovernanceOn": "Create a new governance proposal on Uniswap",
- "title.createGovernanceTo": "Create a new governance proposal to be voted on by UNI holders. UNI tokens represent voting shares in Uniswap governance.",
- "title.earnFees": "Earn fees when others swap on Uniswap by adding tokens to liquidity pools.",
- "title.easilyRemove": "Easily remove your liquidity from Uniswap v2 and deposit into Uniswap v3.",
- "title.easilyRemoveV4": "Easily remove your liquidity from Uniswap v2 and v3 to deposit into Uniswap v4.",
- "title.explore": "Explore NFTs on Uniswap",
- "title.exploreNFTs": "Explore and buy NFTs across top marketplaces on Uniswap",
- "title.importLiquidityv2": "Import top liquidity pools (v2) on Uniswap",
- "title.manageNFT": "Manage your NFT collection. View traits, trading activity, descriptions, and other details on your NFTs.",
- "title.migratev2": "Migrate v2 pool liquidity to Uniswap v3",
- "title.migratev3": "Migrate pool liquidity to Uniswap v4",
- "title.placeLimit": "Place limit orders on Uniswap",
- "title.realTime": "Real-time prices, charts, transaction data, and more.",
- "title.removeLiquidityv2": "Remove pool liquidity (v2) on Uniswap",
- "title.removePoolLiquidity": "Remove pool liquidity on Uniswap",
- "title.removeTokensv2": "Remove your tokens from v2 liquidity pools.",
- "title.removev3Liquidity": "Remove your tokens from v3 liquidity pools.",
- "title.sendTokens": "Send tokens on Uniswap",
- "title.swappingMadeSimple": "Swapping made simple. Buy and sell crypto on Ethereum, Base, Arbitrum, Polygon, and more. Trusted by millions.",
- "title.tradeTokens": "Trade tokens and provide liquidity. Real-time prices, charts, transaction data, and more.",
- "title.uniswapTradeCrypto": "Uniswap | Trade crypto and NFTs safely on the top DeFi platform",
- "title.uniToken": "UNI tokens represent voting shares in Uniswap governance. You can vote on each proposal yourself or delegate your votes to a third party.",
- "title.useImportTool": "Use this import tool to find v2 pools that don’t automatically appear in the interface.",
- "title.voteOnGov": "Vote on governance proposals on Uniswap",
- "token.balances.main": "Your balance",
- "token.balances.other": "Balances on other networks",
- "token.balances.viewOnly": "{{ownerAddress}}’s balance",
- "token.bridge": "{{label}} token bridge",
- "token.chart.tooltip": "Fees: {{amount}}",
- "token.error.unknown": "Unknown token",
- "token.fee.buy.label": "buy fee",
- "token.fee.label": "fee",
- "token.fee.sell.label": "sell fee",
- "token.links.title": "Links",
- "token.links.twitter": "Twitter",
- "token.links.website": "Website",
- "token.priceExplorer.error.description": "Something went wrong.",
- "token.priceExplorer.error.title": "Couldn’t load price chart",
- "token.priceExplorer.timeRangeLabel.day": "1D",
- "token.priceExplorer.timeRangeLabel.hour": "1H",
- "token.priceExplorer.timeRangeLabel.month": "1M",
- "token.priceExplorer.timeRangeLabel.week": "1W",
- "token.priceExplorer.timeRangeLabel.year": "1Y",
- "token.safety.blocked.title.tokenNotAvailable": "{{tokenSymbol}} is not available",
- "token.safety.blocked.title.tokensNotAvailable": "{{tokenSymbol0}} and {{tokenSymbol1}} are not available",
- "token.safety.fees.uniswapLabsDoesNotReceive": "Uniswap Labs does not receive any of these fees.",
- "token.safety.warning.alwaysDoYourResearch": "Always do your research",
- "token.safety.warning.blocked.description.default_one": "You can’t trade this token using the Uniswap App.",
- "token.safety.warning.blocked.description.default_other": "You can’t trade these tokens using the Uniswap App.",
- "token.safety.warning.blocked.description.named": "You can’t trade {{tokenSymbol}} using the Uniswap App.",
- "token.safety.warning.dontShowWarningAgain": "Don’t show me this warning again",
- "token.safety.warning.doYourOwnResearch": "Always do your own research before proceeding.",
- "token.safety.warning.feeDetected.title": "Fee detected",
- "token.safety.warning.highFeeDetected.title": "High fee detected",
- "token.safety.warning.honeypot.message": "{{tokenSymbol}} has been flagged as unsellable. Swapping this token may result in a loss of your funds.",
- "token.safety.warning.honeypot.title": "Honeypot detected",
- "token.safety.warning.malicious.general.message": "{{tokenSymbol}} has been flagged as malicious.",
- "token.safety.warning.malicious.impersonator.message": "{{tokenSymbol}} has been flagged for attempting to copy a different token. It may not be the token you are looking to swap.",
- "token.safety.warning.malicious.impersonator.message.short": "{{tokenSymbol}} has been flagged as malicious and may not be the token you are looking to swap.",
- "token.safety.warning.malicious.title": "Malicious token detected",
- "token.safety.warning.medium.heading.default_one": "This token isn’t traded on leading U.S. centralized exchanges.",
- "token.safety.warning.medium.heading.default_other": "These tokens aren’t traded on leading U.S. centralized exchanges.",
- "token.safety.warning.medium.heading.named": "{{tokenSymbol}} isn’t traded on leading U.S. centralized exchanges.",
- "token.safety.warning.notAvailableToTrade": "Not available to trade",
- "token.safety.warning.spam.message": "{{tokenSymbol}} has been flagged as a potential spam token.",
- "token.safety.warning.spam.title": "Spam token detected",
- "token.safety.warning.strong.heading.default_one": "This token isn’t traded on leading U.S. centralized exchanges or frequently swapped on Uniswap.",
- "token.safety.warning.strong.heading.default_other": "These tokens aren’t traded on leading U.S. centralized exchanges or frequently swapped on Uniswap.",
- "token.safety.warning.strong.heading.named": "{{tokenSymbol}} isn’t traded on leading U.S. centralized exchanges or frequently swapped on Uniswap.",
- "token.safety.warning.tokenChargesFee.message": "{{tokenSymbol}} charges a fee when bought or sold. Swapping it may result in a loss of funds.",
- "token.safety.warning.tokenChargesFee.percent.message": "{{tokenSymbol}} charges a {{feePercent}} fee when bought or sold. Swapping it may result in a loss of funds.",
- "token.safety.warning.tokenChargesFee.title": "{{tokenSymbol}} charges a fee",
- "token.safety.warning.tokenChargesHighFee.title": "{{tokenSymbol}} charges a high fee",
- "token.safetyLevel.blocked.header": "Not available",
- "token.safetyLevel.blocked.message": "You can’t trade this token using the Uniswap Wallet.",
- "token.safetyLevel.medium.header": "Caution",
- "token.safetyLevel.medium.message": "This token isn’t traded on leading U.S. centralized exchanges. Always do your own research before proceeding.",
- "token.safetyLevel.medium.message.plural": "These tokens aren’t traded on leading U.S. centralized exchanges. Always do your own research before proceeding.",
- "token.safetyLevel.strong.header": "Warning",
- "token.safetyLevel.strong.message": "This token isn’t traded on leading U.S. centralized exchanges or frequently swapped on Uniswap. Always do your own research before proceeding.",
- "token.selector.search.error": "Couldn’t load search results",
- "token.stats.fullyDilutedValuation": "Fully Diluted Valuation",
- "token.stats.marketCap": "Market Cap",
- "token.stats.priceHighYear": "52W High",
- "token.stats.priceLowYear": "52W Low",
- "token.stats.section.about": "About {{token}}",
- "token.stats.title": "Stats",
- "token.stats.translation.original": "Show original",
- "token.stats.translation.translate": "Translate to {{language}}",
- "token.stats.volume": "24h Volume",
- "token.wrap.fail.message": "Swaps on the Uniswap Protocol can start and end with ETH. However, during the swap, ETH is wrapped into WETH.",
- "token.zeroNativeBalance.description": "To get {{ tokenSymbol }}, you first need {{ nativeTokenSymbol }} to pay for the network cost. Get started by funding your wallet with {{ nativeTokenSymbol }}.",
- "token.zeroNativeBalance.title": "You need {{ nativeTokenName }} ",
- "tokens.action.hide": "Hide Token",
- "tokens.action.unhide": "Unhide Token",
- "tokens.nfts.action.viewOnExplorer": "View on {{blockExplorerName}}",
- "tokens.nfts.collection.error.load.title": "Couldn’t load NFT collection",
- "tokens.nfts.collection.label.items": "Items",
- "tokens.nfts.collection.label.owners": "Owners",
- "tokens.nfts.collection.label.priceFloor": "Floor",
- "tokens.nfts.collection.label.swapVolume": "Volume",
- "tokens.nfts.details.error.load.title": "Couldn’t load NFT details",
- "tokens.nfts.details.network": "Network",
- "tokens.nfts.details.owner": "Owned by",
- "tokens.nfts.details.price": "Current price",
- "tokens.nfts.details.recentPrice": "Last sale price",
- "tokens.nfts.details.traits": "Traits",
- "tokens.nfts.empty.description": "No NFTs found",
- "tokens.nfts.error.unavailable": "Content not available",
- "tokens.nfts.hidden.action.hide": "Hide NFT",
- "tokens.nfts.hidden.action.unhide": "Unhide NFT",
- "tokens.nfts.link.collection": "Collection website",
- "tokens.nfts.list.error.load.title": "Couldn’t load NFTs",
- "tokens.nfts.list.none.button": "Receive NFTs",
- "tokens.nfts.list.none.description.default": "Transfer NFTs from another wallet to get started.",
- "tokens.nfts.list.none.description.external": "When this wallet buys or receives NFTs, they’ll appear here.",
- "tokens.nfts.list.none.title": "No NFTs yet",
- "tokens.noneFound": "No tokens found.",
- "tokens.selector.button.choose": "Select token",
- "tokens.selector.button.clear": "Clear all",
- "tokens.selector.empty.buy.message": "Buy crypto with a card or bank to send tokens.",
- "tokens.selector.empty.buy.title": "Buy crypto",
- "tokens.selector.empty.receive.message": "Transfer tokens from a centralized exchange or another wallet to send tokens.",
- "tokens.selector.empty.receive.title": "Receive tokens",
- "tokens.selector.empty.title": "No tokens yet",
- "tokens.selector.error.load": "Couldn’t load tokens",
- "tokens.selector.search.empty": "No results found for {{searchText}}",
- "tokens.selector.search.placeholder": "Search tokens",
- "tokens.selector.section.bridging": "Swap across networks",
- "tokens.selector.section.favorite": "Favorites",
- "tokens.selector.section.otherSearchResults": "Other tokens on {{network}}",
- "tokens.selector.section.recent": "Recent searches",
- "tokens.selector.section.search": "Search results",
- "tokens.selector.section.yours": "Your tokens",
- "tokens.table.search.placeholder.pools": "Search pools",
- "tokens.table.search.placeholder.tokens": "Search tokens",
- "transaction.action.cancel.button": "Cancel transaction",
- "transaction.action.cancel.description": "If you cancel this transaction before it’s processed by the network, you’ll pay a new network cost instead of the original one.",
- "transaction.action.cancel.title": "Cancel this transaction?",
- "transaction.action.copy": "Copy transaction ID",
- "transaction.action.copyProvider": "Copy {{providerName}} transaction ID",
- "transaction.action.viewEtherscan": "View on {{blockExplorerName}}",
- "transaction.amount.unlimited": "Unlimited",
- "transaction.confirmation.completionTime_one": "Transaction completed in {{count}} second 🎉",
- "transaction.confirmation.completionTime_other": "Transaction completed in {{count}} seconds 🎉",
- "transaction.confirmation.pending.wallet": "Confirm transaction in wallet",
- "transaction.confirmation.submitted.currency.add": "Add {{currency}}",
- "transaction.confirmation.submitted.currency.added": "Added {{currency}}",
- "transaction.confirmation.waiting": "Waiting for confirmation",
- "transaction.date": "Submitted on {{date}}",
- "transaction.details.dappName": "App",
- "transaction.details.from": "From",
- "transaction.details.networkFee": "Network cost",
- "transaction.details.swapRate": "Rate",
- "transaction.details.transactionId": "Transaction ID",
- "transaction.details.uniswapFee": "Fee ({{ feePercent }}%)",
- "transaction.insufficientLiquidity": "Insufficient pool liquidity to complete transaction",
- "transaction.network.all": "All networks",
- "transaction.networkCost.label": "Network cost",
- "transaction.notification.error.cancel": "Unable to cancel transaction",
- "transaction.notification.error.replace": "Unable to replace transaction",
- "transaction.priceImpact.label": "Price impact",
- "transaction.status.approve.canceled": "Canceled approve",
- "transaction.status.approve.canceling": "Canceling approve",
- "transaction.status.approve.failed": "Failed to approve",
- "transaction.status.approve.pending": "Approving",
- "transaction.status.approve.success": "Approved",
- "transaction.status.approve.successDapp": "Approved on {{externalDappName}}",
- "transaction.status.buy.canceled": "Canceled buy",
- "transaction.status.buy.canceling": "Canceling buy",
- "transaction.status.buy.failed": "Failed to buy",
- "transaction.status.buy.pending": "Buying",
- "transaction.status.buy.success": "Bought",
- "transaction.status.buy.successDapp": "Bought on {{externalDappName}}",
- "transaction.status.confirm.canceled": "Canceled confirm",
- "transaction.status.confirm.canceling": "Pending cancellation",
- "transaction.status.confirm.failed": "Failed to confirm",
- "transaction.status.confirm.pending": "Transaction in progress",
- "transaction.status.confirm.success": "Transaction confirmed",
- "transaction.status.confirm.successDapp": "Transaction confirmed on {{externalDappName}}",
- "transaction.status.mint.canceled": "Canceled mint",
- "transaction.status.mint.canceling": "Canceling mint",
- "transaction.status.mint.failed": "Failed to mint",
- "transaction.status.mint.pending": "Minting",
- "transaction.status.mint.success": "Minted",
- "transaction.status.mint.successDapp": "Minted on {{externalDappName}}",
- "transaction.status.purchase.canceled": "Canceled purchase",
- "transaction.status.purchase.canceling": "Canceling purchase",
- "transaction.status.purchase.failedOn": "Failed to purchase on {{serviceProvider}}",
- "transaction.status.purchase.pendingOn": "Purchasing on {{serviceProvider}}",
- "transaction.status.purchase.successOn": "Purchased on {{serviceProvider}}",
- "transaction.status.receive.canceled": "Canceled receive",
- "transaction.status.receive.canceling": "Canceling receive",
- "transaction.status.receive.failedFrom": "Failed to receive from {{serviceProvider}}",
- "transaction.status.receive.pendingFrom": "Receiving from {{serviceProvider}}",
- "transaction.status.receive.success": "Received",
- "transaction.status.receive.successDapp": "Received on {{externalDappName}}",
- "transaction.status.receive.successFrom": "Received from {{serviceProvider}}",
- "transaction.status.revoke.canceled": "Canceled revoke",
- "transaction.status.revoke.canceling": "Canceling revoke",
- "transaction.status.revoke.failed": "Failed to revoke",
- "transaction.status.revoke.pending": "Revoking",
- "transaction.status.revoke.success": "Revoked",
- "transaction.status.revoke.successDapp": "Revoked on {{externalDappName}}",
- "transaction.status.sell.canceled": "Canceled sell",
- "transaction.status.sell.canceling": "Canceling sell",
- "transaction.status.sell.failed": "Failed to sell",
- "transaction.status.sell.pending": "Selling",
- "transaction.status.sell.success": "Sold",
- "transaction.status.sell.successDapp": "Sold on {{externalDappName}}",
- "transaction.status.send.canceled": "Canceled send",
- "transaction.status.send.canceling": "Canceling send",
- "transaction.status.send.failed": "Failed to send",
- "transaction.status.send.pending": "Sending",
- "transaction.status.send.success": "Sent",
- "transaction.status.send.successDapp": "Sent on {{externalDappName}}",
- "transaction.status.swap.canceled": "Canceled swap",
- "transaction.status.swap.canceling": "Canceling swap",
- "transaction.status.swap.expired": "Swap expired",
- "transaction.status.swap.failed": "Failed to swap",
- "transaction.status.swap.insufficientFunds": "Insufficient funds",
- "transaction.status.swap.pending": "Swapping",
- "transaction.status.swap.success": "Swapped",
- "transaction.status.swap.successDapp": "Swapped on {{externalDappName}}",
- "transaction.status.unwrap.canceled": "Canceled unwrap",
- "transaction.status.unwrap.canceling": "Canceling unwrap",
- "transaction.status.unwrap.failed": "Failed to unwrap",
- "transaction.status.unwrap.pending": "Unwrapping",
- "transaction.status.unwrap.success": "Unwrapped",
- "transaction.status.unwrap.successDapp": "Unwrapped on {{externalDappName}}",
- "transaction.status.wrap.canceled": "Canceled wrap",
- "transaction.status.wrap.canceling": "Canceling wrap",
- "transaction.status.wrap.failed": "Failed to wrap",
- "transaction.status.wrap.pending": "Wrapping",
- "transaction.status.wrap.success": "Wrapped",
- "transaction.status.wrap.successDapp": "Wrapped on {{externalDappName}}",
- "transaction.summary.received": "{{tokenAmountWithSymbol}} to {{recipientAddress}}",
- "transaction.summary.sent": "{{tokenAmountWithSymbol}} from {{senderAddress}}",
- "transaction.warning.insufficientGas.modal.message": "You need ~{{tokenAmount}} {{tokenSymbol}} () on {{networkName}} to cover this transaction’s network cost.",
- "transaction.warning.insufficientGas.modal.title.withNetwork": "Not enough {{tokenSymbol}} on {{networkName}}",
- "transaction.warning.insufficientGas.modal.title.withoutNetwork": "Not enough {{tokenSymbol}}",
- "transaction.watcher.error.cancel": "Unable to cancel transaction",
- "transaction.watcher.error.status": "Error while checking transaction status",
- "uniswapX.aggregatesLiquidity": " aggregates liquidity sources for better prices and gas free swaps.",
- "uniswapx.description": "UniswapX aggregates liquidity sources for better prices and gas free swaps.",
- "uniswapx.included": "Includes UniswapX ",
- "uniswapx.label": "UniswapX",
- "uniswapX.learnMore": "Learn more about swapping with UniswapX",
- "uniswapx.v2QuoteFailed": "UniswapX v2 hard quote failed. Retry with classic swap.",
- "unitags.banner.button.claim": "Claim now",
- "unitags.banner.subtitle": "Build a personalized web3 profile and easily share your address with friends.",
- "unitags.banner.title.compact": "Claim your {{unitagDomain}} username and build out your customizable profile.",
- "unitags.banner.title.full": "Claim your {{unitagDomain}} username",
- "unitags.choosePhoto.option.cameraRoll": "Choose from camera roll",
- "unitags.choosePhoto.option.nft": "Choose an NFT",
- "unitags.choosePhoto.option.remove": "Remove profile picture",
- "unitags.claim.confirmation.customize": "Customize profile",
- "unitags.claim.confirmation.description": "{{unitagAddress}} is ready to send and receive crypto. Continue to build out your wallet by customizing your web3 profile.",
- "unitags.claim.confirmation.success.long": "You got it!",
- "unitags.claim.confirmation.success.short": "got it!",
- "unitags.claim.error.addressLimit": "You already have made the maximum number of changes to your username for this address",
- "unitags.claim.error.appCheck": "Could not claim username. Please try again tomorrow.",
- "unitags.claim.error.avatar": "Could not set avatar. Try again later.",
- "unitags.claim.error.default": "Could not claim username. Try again later.",
- "unitags.claim.error.deviceLimit": "You have hit the maximum number of usernames that can be active for this device",
- "unitags.claim.error.general": "Unable to claim username",
- "unitags.claim.error.unavailable": "This username is not available",
- "unitags.claim.error.unknown": "Unknown error",
- "unitags.claim.username.default": "yourname",
- "unitags.delete.confirm.subtitle": "You’re about to delete your username and customizable profile details. You will not be able to reclaim it.",
- "unitags.delete.confirm.title": "Are you sure?",
- "unitags.editProfile.placeholder": "username",
- "unitags.editUsername.button.confirm": "Save changes",
- "unitags.editUsername.confirm.subtitle": "You’re about to change your username. Once you change it, you can never claim it again.",
- "unitags.editUsername.confirm.title": "Are you sure?",
- "unitags.editUsername.title": "Edit username",
- "unitags.editUsername.warning.default": "Once you change your username, you can never claim it again. You can only change it 2 times.",
- "unitags.editUsername.warning.max": "You’ve reached the maximum number of 2 usernames changes.",
- "unitags.intro.features.ens": "Powered by ENS subdomains",
- "unitags.intro.features.free": "Free to claim",
- "unitags.intro.features.profile": "Customizable profiles",
- "unitags.intro.subtitle": "Say goodbye to 0x addresses. Usernames are readable names that make it easier to send and receive crypto.",
- "unitags.intro.title": "Introducing usernames",
- "unitags.notification.delete.error": "Could not delete username. Try again later.",
- "unitags.notification.delete.title": "Username deleted",
- "unitags.notification.profile.error": "Could not update profile. Try again later.",
- "unitags.notification.profile.title": "Profile updated",
- "unitags.notification.username.error": "Could not change username. Try again later.",
- "unitags.notification.username.title": "Username changed",
- "unitags.onboarding.claim.subtitle": "This is your personalized address that people can send crypto to.",
- "unitags.onboarding.claim.title.choose": "Create your username",
- "unitags.onboarding.claim.title.claim": "Claim your username",
- "unitags.onboarding.info.description": "Usernames transform complex 0x addresses into readable names. By claiming a {{unitagDomain}} username, you can easily send and receive crypto and build out a public web3 profile.",
- "unitags.onboarding.info.title": "A simplified address",
- "unitags.onboarding.profile.subtitle": "Upload your own or stick with your unique Unicon. You can always change this later.",
- "unitags.onboarding.profile.title": "Choose a profile photo",
- "unitags.profile.action.delete": "Delete username",
- "unitags.profile.action.edit": "Edit username",
- "unitags.profile.bio.label": "Bio",
- "unitags.profile.bio.placeholder": "Type a bio for your profile",
- "unitags.profile.links.twitter": "Twitter",
- "unitags.username.error.chars": "Usernames can only contain letters and numbers",
- "unitags.username.error.max": "Usernames cannot be more than {{number}} characters",
- "unitags.username.error.min": "Usernames must be at least {{number}} characters",
- "unitags.username.error.uppercase": "Usernames can only contain lowercase letters and numbers",
- "uwulink.error.insufficientTokens": "Not enough {{tokenSymbol}} on {{chain}}",
- "v2.notAvailable": "Uniswap V2 is not available on this network.",
- "v2.switchTo": "Switch to v2",
- "v3.blast.yield.usdbAndWeth": "On Blast, USDB and WETH are rebasing tokens that automatically earn yield. Due to incompatibility with Uniswap v3, LP positions with USDB or WETH won’t earn rebasing yield, but will in Uniswap v2.",
- "v3.continue": "Continue on v3",
- "v3.rebase.unavailable": "Rebasing is unavailable on v3",
- "wallet.appSignIn": "Sign in with the app",
- "wallet.connectingAgreement": "By connecting a wallet, you agree to Uniswap Labs’ Terms of Service and consent to its Privacy Policy.",
- "wallet.connectionFailed.message": "The connection attempt failed. Please click try again and follow the steps to connect in your wallet.",
- "wallet.other": "Other wallets",
- "wallet.scanToConnect": "Scan QR code to connect",
- "wallet.wrongNet": "Your wallet is connected to the wrong network.",
- "walletConnect.dapps.connection": "Connected to {{dappNameOrUrl}}",
- "walletConnect.dapps.empty.description": "Connect to an app by scanning a code via WalletConnect",
- "walletConnect.dapps.manage.empty.title": "No apps connected",
- "walletConnect.dapps.manage.title": "Manage connections",
- "walletConnect.error.connection.message": "Uniswap Wallet currently supports {{chainNames}}. Please only use \"{{dappName}}\" on these chains",
- "walletConnect.error.connection.title": "Connection Error",
- "walletConnect.error.general.message": "There was an issue with WalletConnect. Please try again",
- "walletConnect.error.general.title": "WalletConnect Error",
- "walletConnect.error.scantastic.message": "There was an issue with your QR code. Please try again",
- "walletConnect.error.scantastic.title": "Invalid QR Code",
- "walletConnect.error.unsupported.message": "Make sure that you’re scanning a valid WalletConnect, Ethereum address, or Uniswap Extension QR code before trying again.",
- "walletConnect.error.unsupported.title": "Invalid QR Code",
- "walletConnect.error.unsupportedV1.message": "WalletConnect v1 is no longer supported. The application you’re trying to connect to needs to upgrade to WalletConnect v2.",
- "walletConnect.error.unsupportedV1.title": "Invalid QR Code",
- "walletConnect.error.uwu.scan": "There was an issue scanning this QR code.",
- "walletConnect.error.uwu.title": "UwU Link error",
- "walletConnect.error.uwu.unsupported": "This QR code is not supported.",
- "walletConnect.pending.button.connect": "Connect",
- "walletConnect.pending.button.scrollDown": "Scroll down to connect",
- "walletConnect.pending.switchAccount": "Switch Account",
- "walletConnect.pending.switchNetwork": "Switch Network",
- "walletConnect.pending.title": "Connect to {{dappName}}",
- "walletConnect.permissions.networks": "Networks",
- "walletConnect.permissions.option.transferAssets": "Transfer your assets without consent",
- "walletConnect.permissions.option.viewTokenBalances": "View your token balances",
- "walletConnect.permissions.option.viewWalletAddress": "View your wallet address",
- "walletConnect.permissions.title": "Site permissions",
- "walletConnect.request.button.scrollDown": "Scroll down to sign",
- "walletConnect.request.button.sign": "Sign",
- "walletConnect.request.details.label.function": "Function",
- "walletConnect.request.details.label.sending": "Sending",
- "walletConnect.request.details.label.token": "Token",
- "walletConnect.request.details.label.tokens": "Tokens",
- "walletConnect.request.error.insufficientFunds": "You don’t have enough {{currencySymbol}} to complete this transaction.",
- "walletConnect.request.error.network": "Internet or network connection error",
- "walletConnect.request.warning.general.message": "Be careful: this message may transfer assets",
- "walletConnect.request.warning.message": "In order to sign messages or transactions, you’ll need to import the wallet’s recovery phrase.",
- "walletConnect.request.warning.title": "This wallet is in view-only mode",
- "web.explore.description": "Discover and research tokens on {{network}}. Explore top pools. View real-time prices, trading volume, TVL, charts, and transaction data.",
- "web.explore.title.pools": "Explore top pools on {{network}} on Uniswap",
- "web.explore.title.tokens": "Explore top tokens on {{network}} on Uniswap",
- "web.explore.title.transactions": "Explore top transactions on {{network}} on Uniswap"
-}
diff --git a/packages/uniswap/src/i18n/locales/translations/es-ES.json b/packages/uniswap/src/i18n/locales/translations/es-ES.json
index 30402fdc83c..d2fc5eba8c6 100644
--- a/packages/uniswap/src/i18n/locales/translations/es-ES.json
+++ b/packages/uniswap/src/i18n/locales/translations/es-ES.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Destinatario",
"analytics.allow": "Permitir análisis",
"analytics.allow.message": "Utilizamos datos anonimizados para mejorar tu experiencia con los productos de Uniswap Labs.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}mín. {{seconds}}s",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}mínimo",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "Introduce un porcentaje",
"chart.candlestick": "Candelabro",
"chart.error.pools": "No se pueden mostrar datos históricos del pool actual.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Aprobar en tu wallet",
"swap.balance.amount": "Saldo: {{amount}}",
"swap.bestRoute.cost": "La mejor ruta de precio cuesta ~{{gasPrice}} en gas. ",
- "swap.bridging.estimatedTime": "Hora estimada",
"swap.bridging.title": "Intercambio entre redes",
"swap.bridging.warning.description": "Estás cambiando de {{fromNetwork}} a {{toNetwork}}.",
"swap.button.max": "Máx.",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Tarifa de token",
"swap.details.newQuote.input": "Nueva entrada",
"swap.details.newQuote.output": "Nueva salida",
- "swap.details.orderRouting": "Direccionamiento de orden",
- "swap.details.orderRoutingInfo": "Su precio ya incluye los costos de red en la red de destino y una tarifa Across del 0,05%.",
"swap.details.rate": "Tasa",
"swap.details.slippage": "Deslizamiento máx.",
"swap.details.uniswapFee": "Tarifa",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Buscar tokens",
"tokens.selector.section.bridging": "Intercambio entre redes",
"tokens.selector.section.favorite": "Favoritos",
- "tokens.selector.section.otherSearchResults": "Otros tokens en {{network}}",
"tokens.selector.section.recent": "Búsquedas recientes",
"tokens.selector.section.search": "Resultados de la búsqueda",
"tokens.selector.section.yours": "Tus tokens",
diff --git a/packages/uniswap/src/i18n/locales/translations/fi-FI.json b/packages/uniswap/src/i18n/locales/translations/fi-FI.json
index 7d936544a59..d578e61bb88 100644
--- a/packages/uniswap/src/i18n/locales/translations/fi-FI.json
+++ b/packages/uniswap/src/i18n/locales/translations/fi-FI.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Vastaanottaja",
"analytics.allow": "Salli analytiikka",
"analytics.allow.message": "Käytämme anonymisoituja tietoja parantaaksemme Uniswap Labs -tuotteiden käyttökokemustasi.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}min",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "Anna prosentti",
"chart.candlestick": "Kynttilänjalka",
"chart.error.pools": "Nykyisen poolin historiallisia tietoja ei voida näyttää.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Hyväksy lompakossasi",
"swap.balance.amount": "Saldo: {{amount}}",
"swap.bestRoute.cost": "Paras hinta reitti maksaa ~{{gasPrice}} kaasussa. ",
- "swap.bridging.estimatedTime": "Arvioitu aika",
"swap.bridging.title": "Vaihda verkkojen välillä",
"swap.bridging.warning.description": "Olet vaihtamassa arvosta {{fromNetwork}} arvoon {{toNetwork}}.",
"swap.button.max": "Max",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Token maksu",
"swap.details.newQuote.input": "Uusi tulo",
"swap.details.newQuote.output": "Uusi lähtö",
- "swap.details.orderRouting": "Tilauksen reititys",
- "swap.details.orderRoutingInfo": "Hintasi sisältää jo verkkokulut kohdeverkossa ja 0,05 % Across-maksun.",
"swap.details.rate": "Rate",
"swap.details.slippage": "Max liukuminen",
"swap.details.uniswapFee": "Maksu",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Etsi tokeneja",
"tokens.selector.section.bridging": "Vaihda verkkojen välillä",
"tokens.selector.section.favorite": "Suosikit",
- "tokens.selector.section.otherSearchResults": "Muut merkit paikassa {{network}}",
"tokens.selector.section.recent": "Viimeaikaiset haut",
"tokens.selector.section.search": "Hakutulokset",
"tokens.selector.section.yours": "Sinun tokenisi",
diff --git a/packages/uniswap/src/i18n/locales/translations/fil-PH.json b/packages/uniswap/src/i18n/locales/translations/fil-PH.json
deleted file mode 100644
index 88c0ef0c214..00000000000
--- a/packages/uniswap/src/i18n/locales/translations/fil-PH.json
+++ /dev/null
@@ -1,2222 +0,0 @@
-{
- "account.authHeader.claimReward": "I-claim ang {{amount}} reward",
- "account.cloud.backup.subtitle": "Mayroong maraming mga parirala sa pagbawi na naka-back up sa iyong {{cloudProviderName}}.",
- "account.cloud.backup.title": "Pumili ng backup na ire-restore",
- "account.cloud.button.restore.android": "I-restore mula sa Google Drive",
- "account.cloud.button.restore.ios": "Ibalik mula sa iCloud",
- "account.cloud.empty.description": "Mukhang hindi mo pa naba-back up ang alinman sa iyong mga parirala sa pagbawi sa {{cloudProviderName}}.",
- "account.cloud.empty.title": "0 backup na natagpuan",
- "account.cloud.error.backup.message": "Nabigong mag-import ng mga backup dahil sa kakulangan ng mga pahintulot, pagkaantala ng awtorisasyon, o dahil sa isang error sa cloud",
- "account.cloud.error.backup.title": "Error habang nag-i-import ng mga backup",
- "account.cloud.error.password.title": "Di-wastong password. Pakisubukang muli.",
- "account.cloud.error.unavailable.button.cancel": "Hindi ngayon",
- "account.cloud.error.unavailable.button.settings": "Pumunta sa mga setting",
- "account.cloud.error.unavailable.message.android": "Paki-verify na naka-log in ka sa isang Google account na naka-enable ang Google Drive sa device na ito at subukang muli.",
- "account.cloud.error.unavailable.message.ios": "Paki-verify na naka-log in ka sa isang Apple ID na pinagana ang iCloud Drive sa device na ito at subukang muli.",
- "account.cloud.error.unavailable.title.android": "Hindi available ang Google Drive",
- "account.cloud.error.unavailable.title.ios": "Hindi available ang iCloud Drive",
- "account.cloud.loading.title": "Naghahanap ng mga backup...",
- "account.cloud.lockout.time.hours_one": "Masyadong maraming pagtatangka. Subukang muli sa loob ng 1 oras.",
- "account.cloud.lockout.time.hours_other": "Masyadong maraming pagtatangka. Subukan muli sa {{count}} oras.",
- "account.cloud.lockout.time.minutes_one": "Masyadong maraming pagtatangka. Subukang muli sa loob ng 1 minuto.",
- "account.cloud.lockout.time.minutes_other": "Masyadong maraming pagtatangka. Subukan muli sa {{count}} minuto.",
- "account.cloud.password.input": "Ipasok ang password",
- "account.cloud.password.recoveryPhrase": "Ilagay na lang ang iyong parirala sa pagbawi",
- "account.cloud.password.subtitle": "Ang password na ito ay kinakailangan upang mabawi ang iyong backup na parirala sa pagbawi mula sa {{cloudProviderName}}.",
- "account.cloud.password.title": "Ipasok ang backup na password",
- "account.drawer.gitVersion": "Bersyon: ",
- "account.drawer.modal.body": "Ligtas na mag-imbak at magpalit ng mga token gamit ang Uniswap app. Available sa iOS at Android.",
- "account.drawer.modal.dont": "Walang Uniswap wallet?",
- "account.drawer.modal.scan": "Mag-scan gamit ang Uniswap Wallet",
- "account.drawer.spamToggle": "Itago ang mga hindi kilalang token at NFT",
- "account.porfolio.activity.cancelledBelow": "Kinansela ang order na ito dahil mas mababa ang iyong balanse sa halaga ng input.",
- "account.portfolio.activity.signLimit": "Hindi mapupuno ang order na ito dahil mas mababa ang iyong balanse sa halaga ng input. Dagdagan ang iyong balanse upang ayusin.",
- "account.recoveryPhrase.education.part1": "Ang parirala sa pagbawi (o parirala ng binhi) ay isang hanay ng mga salita kinakailangan upang ma-access ang iyong wallet, tulad ng isang password.",
- "account.recoveryPhrase.education.part2": "Maaari mong ilagay ang iyong parirala sa pagbawi sa isang bagong device upang i-restore ang iyong wallet at ang mga nilalaman nito.",
- "account.recoveryPhrase.education.part3": "Ngunit, kung mawala ang iyong parirala sa pagbawi, mawawalan ka ng access sa iyong wallet.",
- "account.recoveryPhrase.education.part4": "Sa halip na isaulo ang iyong parirala sa pagbawi, maaari mong i-back up ito sa {{cloudProviderName}} at protektahan ito gamit ang isang password.",
- "account.recoveryPhrase.education.part5": "Maaari mo ring manual na i-back up ang iyong parirala sa pagbawi sa pamamagitan ng pagsulat nito at pag-iimbak nito sa isang ligtas na lugar.",
- "account.recoveryPhrase.education.part6": "Inirerekomenda namin ang paggamit ng parehong uri ng pag-backup, dahil kung mawala mo ang iyong parirala sa pagbawi, hindi mo na maibabalik ang iyong wallet.",
- "account.recoveryPhrase.error.invalid": "Di-wastong parirala",
- "account.recoveryPhrase.error.invalidWord": "Di-wastong salita: {{word}}",
- "account.recoveryPhrase.error.phraseLength": "Ang parirala sa pagbawi ay dapat na 12-24 na salita",
- "account.recoveryPhrase.error.wrong": "Maling parirala sa pagbawi",
- "account.recoveryPhrase.helpText.import": "Paano ko mahahanap ang aking parirala sa pagbawi?",
- "account.recoveryPhrase.helpText.restoring": "Subukang maghanap muli",
- "account.recoveryPhrase.input": "I-type ang iyong parirala sa pagbawi",
- "account.recoveryPhrase.remove.final.description": "Tiyaking naisulat mo ang iyong parirala sa pagbawi o na-back up ito sa {{cloudProviderName}}. Hindi mo maa-access ang iyong mga pondo kung hindi man.",
- "account.recoveryPhrase.remove.final.title": "Inaalis mo ang iyong parirala sa pagbawi",
- "account.recoveryPhrase.remove.import.description": "Maaari ka lamang mag-imbak ng isang parirala sa pagbawi sa bawat pagkakataon. Upang magpatuloy sa pag-import ng bago, kakailanganin mong alisin ang iyong kasalukuyang parirala sa pagbawi at anumang nauugnay na mga wallet mula sa device na ito.",
- "account.recoveryPhrase.remove.initial.description": "Aalisin nito ang iyong wallet sa device na ito kasama ng iyong parirala sa pagbawi.",
- "account.recoveryPhrase.remove.initial.title": "Tinatanggal mo ang {{walletName}}",
- "account.recoveryPhrase.remove.mnemonic.description": "Ibinabahagi nito ang parehong parirala sa pagbawi bilang {{walletNames, list}}. Ang iyong parirala sa pagbawi ay mananatiling nakaimbak hanggang sa tanggalin mo ang lahat ng natitirang mga wallet.",
- "account.recoveryPhrase.subtitle.import": "Ang iyong parirala sa pagbawi ay maiimbak lamang nang lokal sa iyong device.",
- "account.recoveryPhrase.subtitle.restoring": "Ilagay ang iyong parirala sa pagbawi sa ibaba, o subukang maghanap muli ng mga backup.",
- "account.recoveryPhrase.title.import": "Ilagay ang iyong parirala sa pagbawi",
- "account.recoveryPhrase.title.restoring": "Walang nakitang backup",
- "account.transactionSummary.addLiquidity": "Magdagdag ng {{baseSymbol}}/{{quoteSymbol}} V3 liquidity",
- "account.transactionSummary.addLiquidityv2": "Idagdag ang at sa Uniswap V2",
- "account.transactionSummary.approve": "Aprubahan ang {{tokenSymbol}}",
- "account.transactionSummary.claimFor": "I-claim ang para sa {{username}}",
- "account.transactionSummary.claimReward": "I-claim ang UNI reward para sa {{username}}",
- "account.transactionSummary.collectFees": "Mangolekta ng {{symbol0}}/{{symbol1}} bayad",
- "account.transactionSummary.createAddLiquidity": "Gumawa ng pool at magdagdag ng {{baseSymbol}}/{{quoteSymbol}} V3 liquidity",
- "account.transactionSummary.createPool": "Gumawa ng {{baseSymbol}}/{{quoteSymbol}} V3 pool",
- "account.transactionSummary.decision.abstain": "Bumoto upang umiwas sa panukala {{proposalKey}} na may dahilan "{{reason}}"",
- "account.transactionSummary.decision.against": "Bumoto laban sa panukala {{proposalKey}} na may dahilan "{{reason}}"",
- "account.transactionSummary.decision.for": "Bumoto para sa panukala {{proposalKey}} na may dahilan "{{reason: info.reason}}"",
- "account.transactionSummary.delegateSummary": "Italaga ang kapangyarihan sa pagboto sa {{username}}",
- "account.transactionSummary.depositLiquidity": "Pagkatubig ng deposito",
- "account.transactionSummary.executeProposal": "Isagawa ang panukala {{proposalKey}}.",
- "account.transactionSummary.migrateLiquidity": "I-migrate ang {{baseSymbol}}/{{quoteSymbol}} liquidity sa V3",
- "account.transactionSummary.queueProposal": "Panukala sa pila {{proposalKey}}.",
- "account.transactionSummary.removeLiquiditySummary": "Alisin ang at
",
- "account.transactionSummary.revoke": "Bawiin ang {{tokenSymbol}}",
- "account.transactionSummary.sendSummary": "Ipinadala ang sa {{recipient}}",
- "account.transactionSummary.submitProposal": "Magsumite ng bagong panukala",
- "account.transactionSummary.swapExactIn": "Eksaktong palitan ang para sa ",
- "account.transactionSummary.swapExactOut": "Palitan ang para sa eksaktong ",
- "account.transactionSummary.unwrapTo": "Alisin ang sa {{symbol}}",
- "account.transactionSummary.vote.abstain": "Bumoto upang umiwas sa panukala {{proposalKey}}",
- "account.transactionSummary.vote.against": "Bumoto laban sa panukala {{proposalKey}}",
- "account.transactionSummary.vote.for": "Bumoto para sa panukala {{proposalKey}}",
- "account.transactionSummary.withdrawLiquidity": "I-withdraw ang nadeposito na pagkatubig",
- "account.transactionSummary.wrapTo": "I-wrap ang sa {{symbol}}",
- "account.wallet.action.copy": "Kopyahin ang address ng wallet",
- "account.wallet.action.report": "Iulat ang profile",
- "account.wallet.action.settings": "Mga setting ng pitaka",
- "account.wallet.action.viewExplorer": "Tingnan sa {{blockExplorerName}}",
- "account.wallet.button.add": "Magdagdag ng wallet",
- "account.wallet.button.addViewOnly": "Magdagdag ng view-only na wallet",
- "account.wallet.button.create": "Gumawa ng bagong wallet",
- "account.wallet.button.import": "Mag-import ng bagong wallet",
- "account.wallet.button.manage": "Pamahalaan ang wallet",
- "account.wallet.button.remove": "Alisin ang wallet",
- "account.wallet.button.restore": "Ibalik ang wallet",
- "account.wallet.button.watch": "Manood ng wallet",
- "account.wallet.create.placeholder": "Wallet {{index}}",
- "account.wallet.edit.label.input.placeholder": "Label ng pitaka",
- "account.wallet.header.button.disabled.title": "I-edit ang profile",
- "account.wallet.header.button.title": "I-edit ang label",
- "account.wallet.header.other": "Iyong ibang mga wallet",
- "account.wallet.header.viewOnly": "Mga view-only na wallet",
- "account.wallet.menu.copy.title": "Kopyahin ang address ng wallet",
- "account.wallet.menu.edit.title": "I-edit ang label",
- "account.wallet.menu.remove.title": "Alisin ang wallet",
- "account.wallet.remove.check": "Na-back up ko ang aking parirala sa pagbawi at nauunawaan ko na hindi ako matutulungan ng Uniswap Labs na mabawi ang aking mga wallet kung nabigo akong gawin ito.",
- "account.wallet.remove.title": "Alisin ang {{name}}",
- "account.wallet.remove.viewOnly": "Maaari kang palaging magdagdag ng back view-only na mga wallet sa pamamagitan ng paglalagay ng address ng wallet.",
- "account.wallet.restore.description": "Dahil nasa bagong device ka, kakailanganin mong i-restore ang iyong parirala sa pagbawi. Papayagan ka nitong magpalit at magpadala ng mga token.",
- "account.wallet.select.error": "Hindi ma-load ang mga address",
- "account.wallet.select.loading.subtitle": "Lalabas sa ibaba ang iyong mga wallet.",
- "account.wallet.select.loading.title": "Naghahanap ng mga wallet",
- "account.wallet.select.title_one_one": "Isang wallet ang nakita",
- "account.wallet.select.title_one_other": "Pumili ng mga wallet na ii-import",
- "account.wallet.viewOnly.button": "Mag-import ng wallet",
- "account.wallet.viewOnly.description": "Upang magpalit, bumili, magpadala, at tumanggap ng mga token, kailangan mong i-import ang parirala sa pagbawi ng wallet na ito.",
- "account.wallet.viewOnly.title": "Ang wallet na ito ay view-only",
- "account.wallet.watch.error.alreadyImported": "Ang address na ito ay na-import na",
- "account.wallet.watch.error.notFound": "Hindi nakita ang address",
- "account.wallet.watch.error.smartContract": "Ang address ay isang matalinong kontrata",
- "account.wallet.watch.message": "Ang pagdaragdag ng view-only na wallet ay nagbibigay-daan sa iyong subukan ang app o subaybayan ang isang wallet. Hindi ka makakapagpalit o makakapagpadala ng mga pondo.",
- "account.wallet.watch.placeholder": "ENS o address",
- "account.wallet.watch.title": "Maglagay ng wallet address",
- "activity.pending": "{{pendingActivityCount}} Nakabinbin",
- "activity.transaction.receive.descriptor": "{{amountWithSymbol}} mula sa {{walletAddress}}",
- "activity.transaction.send.descriptor": "{{amountWithSymbol}} hanggang {{walletAddress}}",
- "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} para sa {{amountWithSymbolB}}",
- "activity.transaction.swap.descriptor.formatted": " para sa ",
- "activity.transaction.tokens.descriptor": "{{amountWithSymbolA}} at {{amountWithSymbolB}}",
- "activity.transaction.tokens.descriptor.formatted": " at ",
- "addLiquidity.shareOfPool": "Bahagi ng pool",
- "addressInput.recipient": "tatanggap",
- "analytics.allow": "Payagan ang analytics",
- "analytics.allow.message": "Gumagamit kami ng hindi nakikilalang data upang mapahusay ang iyong karanasan sa mga produkto ng Uniswap Labs.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}min",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
- "burn.input.enterAPercent.error": "Maglagay ng porsyento",
- "chart.candlestick": "Kandelero",
- "chart.error.pools": "Hindi maipakita ang makasaysayang data para sa kasalukuyang pool.",
- "chart.error.tokens": "Hindi maipakita ang makasaysayang data para sa kasalukuyang token.",
- "chart.line": "Line chart",
- "chart.missingData": "Nawawalang data ng chart",
- "chart.price.label.close": "Isara",
- "chart.price.label.high": "Mataas",
- "chart.price.label.low": "Mababa",
- "chart.price.label.open": "Bukas",
- "chart.settings.unavailable.label": "Hindi available ang setting na ito para sa kasalukuyang chart",
- "claim.thanks": "Salamat sa pagiging bahagi ng komunidad ng Uniswap ",
- "claim.uni.arrived": "Dumating na ang UNI",
- "common.accept": "Tanggapin",
- "common.activity": "Aktibidad",
- "common.add.label": "Idagdag",
- "common.add.liquidity.cancelled": "Nakansela ang pagdaragdag ng pagkatubig",
- "common.add.liquidity.failed": "Nabigo ang magdagdag ng pagkatubig",
- "common.add.v2.liquidity.cancelled": "Magdagdag ng V2 liquidity na nakansela",
- "common.add.v2.liquidity.failed": "Nabigo ang pagdagdag ng V2 liquidity",
- "common.added.liquidity": "Nagdagdag ng pagkatubig",
- "common.added.v2.liquidity": "Idinagdag ang pagkatubig ng V2",
- "common.addedLiquidity": "Nagdagdag ng Liquidity",
- "common.adding.liquidity": "Pagdaragdag ng pagkatubig",
- "common.adding.v2.liquidity": "Pagdaragdag ng V2 liquidity",
- "common.addLiquidity": "Magdagdag ng pagkatubig",
- "common.addressOrENS": "Wallet address o pangalan ng ENS",
- "common.advanced": "Advanced",
- "common.allTime": "Sa lahat ng oras",
- "common.amount.label": "Halaga",
- "common.amountDeposited.label": "{{amount}} Nadeposito",
- "common.amountInput.placeholder": "halaga ng input",
- "common.amountPerBase": "{{amount}} {{symbolA}} bawat {{symbolB}}",
- "common.app": "App",
- "common.approval.cancelled": "Kinansela ang pag-apruba",
- "common.approval.failed": "Nabigo ang pag-apruba",
- "common.approve": "Aprubahan",
- "common.approved": "Naaprubahan",
- "common.approvePending": "Nakabinbin ang pag-apruba...",
- "common.approveSpend": "Aprubahan ang {{symbol}} paggastos",
- "common.approving": "Pag-apruba",
- "common.automatic": "Auto",
- "common.availableIn": "Available ang Uniswap sa: ",
- "common.availableOnIOSAndroid": "Available sa iOS at Android",
- "common.availableOnIOSAndroidChrome": "Available sa iOS, Android, at Chrome",
- "common.blocked.ifError": "Kung naniniwala kang isa itong error, mangyaring magpadala ng email kasama ang iyong address sa ",
- "common.blocked.reason": "Naka-block ang address na ito sa interface ng Uniswap Labs dahil nauugnay ito sa isa o higit pang naka-block na aktibidad.",
- "common.blockedAddress": "Naka-block na address",
- "common.blog": "Blog",
- "common.borrow.cancelled": "Kinansela ang paghiram",
- "common.borrow.failed": "Nabigo ang paghiram",
- "common.borrowed": "Hiniram",
- "common.borrowing": "Nanghihiram",
- "common.bought": "Binili",
- "common.brandAssets": "Mga asset ng brand",
- "common.burn.cancelled": "Kinansela ang paso",
- "common.burn.failed": "Nabigo ang paso",
- "common.burned": "Nasunog",
- "common.burning": "Nasusunog",
- "common.button.accept": "Tanggapin",
- "common.button.back": "Bumalik",
- "common.button.buy": "Bumili",
- "common.button.cancel": "Kanselahin",
- "common.button.checkin": "Mag-check in",
- "common.button.close": "Isara",
- "common.button.confirm": "Kumpirmahin",
- "common.button.connect": "Kumonekta",
- "common.button.continue": "Magpatuloy",
- "common.button.copied": "Kinopya",
- "common.button.copy": "Kopyahin",
- "common.button.create": "Lumikha",
- "common.button.delete": "Tanggalin",
- "common.button.disconnect": "Idiskonekta",
- "common.button.dismiss": "I-dismiss",
- "common.button.done": "Tapos na",
- "common.button.enable": "Paganahin",
- "common.button.finish": "Tapusin",
- "common.button.goBack": "Bumalik ka",
- "common.button.later": "Baka mamaya",
- "common.button.learn": "Matuto pa",
- "common.button.next": "Susunod",
- "common.button.notNow": "Hindi ngayon",
- "common.button.ok": "OK",
- "common.button.paste": "Idikit",
- "common.button.pay": "Magbayad",
- "common.button.receive": "Tumanggap",
- "common.button.remove": "Alisin",
- "common.button.reset": "I-reset",
- "common.button.restore": "Ibalik",
- "common.button.retry": "Subukan muli",
- "common.button.reveal": "Ibunyag",
- "common.button.review": "Balik-aral",
- "common.button.save": "I-save",
- "common.button.scrollDown": "Mag-scroll pababa",
- "common.button.sell": "Ibenta",
- "common.button.send": "Ipadala",
- "common.button.setup": "I-set up",
- "common.button.share": "Ibahagi",
- "common.button.showLess": "Magpakita ng mas kaunti",
- "common.button.showMore": "Magpakita ng higit pa",
- "common.button.sign": "Lagda",
- "common.button.skip": "Laktawan",
- "common.button.swap": "Magpalit",
- "common.button.tryAgain": "Subukan muli",
- "common.button.understand": "naiintindihan ko",
- "common.button.view": "Tingnan",
- "common.button.yes": "Oo",
- "common.buy.cancelled": "Kinansela ang pagbili",
- "common.buy.failed": "Nabigo ang pagbili",
- "common.buy.label": "Bumili",
- "common.buyAndSell": "Bumili at magbenta sa Uniswap",
- "common.buying": "Pagbili",
- "common.by": "Sa pamamagitan ng",
- "common.cancel.failed": "Nabigo ang pagkansela",
- "common.cancellation.cancelled": "Kinansela ang pagkansela",
- "common.cancellationSubmitted": "Naisumite ang pagkansela",
- "common.cancellationSuccessful": "Matagumpay ang pagkansela",
- "common.cancelled": "Kinansela",
- "common.cancelling": "Kinakansela",
- "common.cancelOrder": "Kanselahin ang order",
- "common.card.error.description": "Nagkaproblema",
- "common.card.error.title": "Oops! Nagkaproblema.",
- "common.careers": "Mga karera",
- "common.chartType": "Uri ng tsart",
- "common.checkNetwork": "Tingnan ang katayuan ng network dito.",
- "common.chromeExtension": "Extension",
- "common.claim.cancelled": "Kinansela ang claim",
- "common.claim.failed": "Nabigo ang pag-claim",
- "common.claimed": "Inangkin",
- "common.claiming": "Pag-aangkin",
- "common.claimUnis": "I-claim ang iyong mga UNI token",
- "common.close": "Isara",
- "common.closed": "sarado",
- "common.collect.button": "Mangolekta",
- "common.collect.fees.cancelled": "Kinansela ang mga bayarin sa pagkolekta",
- "common.collect.fees.failed": "Nabigo ang pagkolekta ng mga bayarin",
- "common.collected.fees": "Mga nakolektang bayad",
- "common.collecting.fees": "Pagkolekta ng mga bayarin",
- "common.company": "kumpanya",
- "common.confirm": "Kumpirmahin",
- "common.confirmCancellation": "Kumpirmahin ang pagkansela",
- "common.confirmSend.button": "Kumpirmahin ang pagpapadala",
- "common.confirmSwap": "Kumpirmahin ang swap sa wallet",
- "common.confirmTimedOut": "Nag-time out ang kumpirmasyon. Pakisubukang muli.",
- "common.confirmTransaction.button": "Kumpirmahin ang transaksyong ito sa iyong wallet",
- "common.confirmWallet": "Kumpirmahin sa wallet",
- "common.connect.button": "Kumonekta",
- "common.connectAWallet.button": "Ikonekta ang isang wallet",
- "common.connectingToChain": "Kumokonekta sa {{chainName}}",
- "common.connectingWallet": "Kinokonekta ang wallet...",
- "common.connectToChain.button": "Kumonekta sa {{chainName}}",
- "common.connectWallet.button": "Ikonekta ang wallet",
- "common.contactUs.button": "Makipag-ugnayan sa amin",
- "common.contractInteraction": "Pakikipag-ugnayan sa Kontrata",
- "common.copied": "Kinopya",
- "common.copyLink.button": "Kopyahin ang link",
- "common.create.pool.cancelled": "Kinansela ang paggawa ng pool",
- "common.create.pool.failed": "Nabigo ang paglikha ng pool",
- "common.created.pool": "Nilikha ang pool",
- "common.creating.pool": "Paglikha ng pool",
- "common.currency": "Pera",
- "common.currentPrice": "Kasalukuyang presyo",
- "common.currentPrice.label": "Kasalukuyang presyo:",
- "common.custom": "Custom",
- "common.customRange": "Custom na hanay",
- "common.dataOutdated": "Maaaring luma na ang data",
- "common.defaultTradeOptions": "Default na mga pagpipilian sa kalakalan",
- "common.delegate.cancelled": "Kinansela ang delegado",
- "common.delegate.failed": "Nabigo ang delegado",
- "common.delegated": "Delegated",
- "common.delegating": "Nagde-delegate",
- "common.deploy.cancelled": "Kinansela ang pag-deploy",
- "common.deploy.failed": "Nabigo ang pag-deploy",
- "common.deployed": "Na-deploy",
- "common.deploying": "Nagde-deploy",
- "common.deposit.cancelled": "Kinansela ang deposito",
- "common.deposit.failed": "Nabigo ang deposito",
- "common.deposit.toNetwork": "Magdeposito ng mga token sa {{label}} network.",
- "common.deposited": "Nakadeposito",
- "common.depositing": "Pagdedeposito",
- "common.detailed.label": "Detalyadong",
- "common.detected": "Natukoy",
- "common.developers": "Mga developer",
- "common.dismiss": "I-dismiss",
- "common.displaySettings": "Mga setting ng display",
- "common.dnsRegistrar": "DNS Registrar",
- "common.dontShowAgain": "Huwag mo na itong ipakitang muli",
- "common.download": "I-download",
- "common.downloadAppStore": "I-download sa App Store",
- "common.downloadPlayStore": "I-download sa Play Store",
- "common.downloadUniswap": "I-download ang Uniswap",
- "common.downloadUniswapApp": "I-download ang Uniswap app",
- "common.edit.button": "I-edit",
- "common.error.general": "Nagkaproblema",
- "common.error.label": "Error",
- "common.error.request": "Paumanhin, may naganap na error habang pinoproseso ang iyong kahilingan. Kung humiling ka ng suporta, tiyaking kopyahin ang mga detalye ng error na ito.",
- "common.error.somethingWrong": "Nagkaproblema!",
- "common.error.wrong.tryAgain": "Nagkaproblema. Pakisubukang muli.",
- "common.errorConnecting.error": "Error sa pagkonekta",
- "common.errorLoadingData.error": "Error sa paglo-load ng data",
- "common.ethereumNameService": "Serbisyo ng Pangalan ng Ethereum",
- "common.etherscan": "Etherscan",
- "common.etherscan.link": "Tingnan sa Etherscan",
- "common.ethRegistrarController": "ETH Registrar Controller",
- "common.execute.cancelled": "Kinansela ang execute",
- "common.execute.failed": "Nabigo ang execute",
- "common.executed": "Pinaandar",
- "common.executing": "Isinasagawa",
- "common.expired": "Nag-expire na",
- "common.expiry": "Expiry",
- "common.explore": "Galugarin",
- "common.explorer": "Explorer",
- "common.exploreTokens": "I-explore ang mga token",
- "common.extension": "Uniswap Extension",
- "common.failed.error": "Nabigo",
- "common.failedSwitchNetwork": "Nabigong lumipat ng network",
- "common.fee": "Bayad",
- "common.fees": "Mga bayarin",
- "common.feesEarned.label": "{{symbol}} Mga Bayad na Nakuha:",
- "common.feesEarnedPerBase": "{{symbolA}} bawat {{symbolB}}",
- "common.fetchingRoute": "Pagkuha ng ruta",
- "common.floor": "Sahig",
- "common.floorPrice": "Presyo sa sahig",
- "common.for": "Para sa",
- "common.fullRange": "Buong saklaw",
- "common.getApp": "Kunin ang app",
- "common.getHelp.button": "Humingi ng tulong",
- "common.getStarted": "Magsimula",
- "common.getSupport.button": "Kumuha ng suporta",
- "common.getTheApp": "Kunin ang app",
- "common.getUniswapWallet": "Kumuha ng Uniswap Wallet",
- "common.governance": "Pamamahala",
- "common.happyHolidays": "Happy Holidays mula sa Uniswap team!",
- "common.helpCenter": "Help center",
- "common.hidden": "Nakatago",
- "common.hide.button": "Magtago",
- "common.highPrice": "Mataas na presyo",
- "common.includes": "Kasama ang",
- "common.info.label": "Impormasyon",
- "common.input.noRecipient.error": "Pumili ng tatanggap",
- "common.input.password.confirm": "Kumpirmahin ang password",
- "common.input.password.error.mismatch": "Hindi tugma ang mga password",
- "common.input.password.error.weak": "Masyadong mahina ang password na ito",
- "common.input.password.new": "Bagong password",
- "common.input.password.placeholder": "Password",
- "common.input.password.strength.medium": "Katamtaman",
- "common.input.password.strength.strong": "Malakas",
- "common.input.password.strength.weak": "Mahina",
- "common.input.search": "Maghanap",
- "common.insufficient.funds": "Hindi sapat na pondo",
- "common.insufficientBalance.error": "Hindi sapat na balanse",
- "common.insufficientFundsForNetworkFee.error": "Hindi sapat na pondo upang masakop ang gastos sa network",
- "common.insufficientLiquidity": "Hindi sapat na pagkatubig",
- "common.insufficientTokenBalance.error": "Hindi sapat na {{tokenSymbol}} balanse",
- "common.insufficientTokenBalance.error.simple": "Hindi sapat {{tokenSymbol}}",
- "common.invalidPair": "Di-wastong pares",
- "common.invalidRecipient.error": "Di-wastong tatanggap",
- "common.iOSAndroid": "iOS at Android",
- "common.language": "Wika",
- "common.lastPrice": "Huling presyo",
- "common.learnMoreSwap": "Matuto pa tungkol sa swap",
- "common.legalAndPrivacy": "Legal at Privacy",
- "common.less": "Mas kaunti",
- "common.limit.cancel_one": "Kanselahin ang limitasyon",
- "common.limit.cancel_other": "Kanselahin ang {{count}} mga limitasyon",
- "common.limit.cancelled": "Kinansela ang limitasyon",
- "common.limit.executed": "Naisasakatuparan ang limitasyon",
- "common.limit.expired": "Nag-expire ang limitasyon",
- "common.limit.failed": "Nabigo ang limitasyon",
- "common.limit.opened": "Binuksan ang limitasyon",
- "common.limit.pending": "Nakabinbin ang limitasyon",
- "common.limits": "Mga limitasyon",
- "common.limits.approachMax": "Lumalapit sa 100 na limitasyon sa maximum",
- "common.limits.cancelProceed": "Kanselahin ang mga limitasyon upang magpatuloy",
- "common.limits.expires": "Mag-e-expire {{timestamp}}",
- "common.limits.open": "Buksan ang mga limitasyon",
- "common.limits.when": "kapag {{price}} {{outSymbol}}/{{inSymbol}}",
- "common.links": "Mga link",
- "common.liquidity": "Pagkatubig",
- "common.loading": "Naglo-load",
- "common.loadingAllowance": "Naglo-load ng allowance",
- "common.longText.button.less": "Magbasa nang mas kaunti",
- "common.longText.button.more": "Magbasa pa",
- "common.lowPrice": "Mababang presyo",
- "common.manage": "Pamahalaan",
- "common.market.label": "palengke",
- "common.max": "Max",
- "common.migrate": "Mag-migrate",
- "common.migrate.liquidity.cancelled": "Kinansela ang liquidity ng paglipat",
- "common.migrate.liquidity.failed": "Nabigo ang paglipat ng pagkatubig",
- "common.migrate.position": "Lumipat ng posisyon",
- "common.migrated.liquidity": "Lumipat na pagkatubig",
- "common.migrating.liquidity": "Ang paglipat ng pagkatubig",
- "common.mint.cancelled": "Kinansela ang Mint",
- "common.mint.failed": "Nabigo ang Mint",
- "common.minted": "Minted",
- "common.minting": "Minting",
- "common.mobileWallet": "Mobile wallet",
- "common.more": "Higit pa",
- "common.navigation.settings": "Mga setting",
- "common.navigation.systemSettings": "Mga setting",
- "common.navigationButton": "Button ng nabigasyon",
- "common.needHelp": "Kailangan ng tulong?",
- "common.networkCost": "Gastos sa network",
- "common.neverMind": "Di bale",
- "common.new": "Bago",
- "common.nfts": "Mga NFT",
- "common.noActivity": "Wala pang aktibidad",
- "common.noAmount.error": "Maglagay ng halaga",
- "common.noData": "Walang data",
- "common.noResults": "Walang nakitang resulta.",
- "common.notAvailableInRegion.error": "Hindi available sa iyong rehiyon",
- "common.notCreated.label": "Hindi nilikha",
- "common.oneDay": "1 araw",
- "common.oneHour": "1 oras",
- "common.oneMonth": "1 buwan",
- "common.oneWeek": "1 linggo",
- "common.oneYear": "1 taon",
- "common.orderCancelled": "Kinansela ang order",
- "common.orderExecuted": "Naisasagawa ang order",
- "common.orderExpired": "Nag-expire ang order",
- "common.orderPending": "Nakabinbin ang order",
- "common.outOfRange": "Wala sa saklaw",
- "common.pageNotFound": "Hindi nahanap ang page!",
- "common.pastDay": "Nakaraang araw",
- "common.pastFiveMinutes": "Nakalipas na limang minuto",
- "common.pastHour": "Nakaraang oras",
- "common.pastMonth": "Nakaraang buwan",
- "common.pastWeek": "Nakaraang linggo",
- "common.pastYear": "Nakaraang taon",
- "common.pay.button": "Magbayad",
- "common.pending": "Nakabinbin",
- "common.pending.cancellation": "Nakabinbing pagkansela",
- "common.pendingEllipsis": "Nakabinbin...",
- "common.permit2": "Pahintulot2",
- "common.pool": "Pool",
- "common.pools": "Mga pool",
- "common.positionUnavailable": "Hindi available ang posisyon",
- "common.poweredBy": "Pinapatakbo ng ",
- "common.preview": "Silipin",
- "common.price": "Presyo",
- "common.priceImpact": "Babala sa epekto ng presyo",
- "common.priceUpdated": "Na-update ang presyo",
- "common.privacyPolicy": "Patakaran sa Privacy",
- "common.proceed": "Magpatuloy",
- "common.proceedInWallet": "Magpatuloy sa iyong wallet",
- "common.proceedInWallet.short": "Magpatuloy sa wallet",
- "common.protocol": "Protocol",
- "common.publicResolver": "Public Resolver",
- "common.purchased": "Binili",
- "common.queue.cancelled": "Kinansela ang pila",
- "common.queue.failed": "Nabigo ang pila",
- "common.queued": "Nakapila",
- "common.queuing": "Nakapila",
- "common.range": "Saklaw",
- "common.rate": "Rate",
- "common.readMore": "Magbasa pa",
- "common.receive": "Tumanggap",
- "common.receive.cancelled": "Nakansela ang pagtanggap",
- "common.receive.failed": "Nabigo ang pagtanggap",
- "common.received": "Natanggap",
- "common.receiving": "Pagtanggap",
- "common.recent": "Kamakailan",
- "common.rejected": "Tinanggihan",
- "common.reload.label": "I-reload ang app",
- "common.remove.label": "Alisin",
- "common.remove.liquidity.cancelled": "Nakansela ang pag-alis ng pagkatubig",
- "common.remove.liquidity.failed": "Nabigo ang pag-alis ng pagkatubig",
- "common.removeAmount": "Alisin ang halaga",
- "common.removed.liquidity": "Inalis ang pagkatubig",
- "common.removedLiquidity": "Inalis ang Liquidity",
- "common.removeItem": "Alisin ang item",
- "common.removing.liquidity": "Pag-alis ng pagkatubig",
- "common.repaid": "Nabayaran",
- "common.repay.cancelled": "Kinansela ang pagbabayad",
- "common.repay.failed": "Nabigo ang pagbabayad",
- "common.repaying": "Nagbabayad",
- "common.resetLimit": "I-reset ang {{symbol}} limitasyon",
- "common.resetLimitWallet": "I-reset ang {{symbol}} limitasyon sa wallet",
- "common.resettingLimit": "Nire-reset ang {{symbol}} limitasyon...",
- "common.resolveIssue": "Resolbahin ang isyu",
- "common.resolveIssues": "Lutasin ang {{issues}} isyu",
- "common.restricted.region": "Pinaghihigpitang rehiyon",
- "common.return.label": "Bumalik",
- "common.returnToTop": "Bumalik sa itaas",
- "common.reverseRegistrar": "Reverse Registrar",
- "common.revoke.approval.failed": "Nabigo ang pagbawi ng pag-apruba",
- "common.revoked.approval": "Binawi ang pag-apruba",
- "common.revokedApproval": "Binawi ang Pag-apruba",
- "common.revoking.approval": "Pagbawi ng pag-apruba",
- "common.samePrice": "Parehong presyo",
- "common.scanQRDownload": "I-scan ang QR code gamit ang iyong telepono para i-download",
- "common.searchTokensNFT": "Maghanap ng mga token at mga koleksyon ng NFT",
- "common.selectRegion.label": "Piliin ang iyong rehiyon",
- "common.selectToken.label": "Pumili ng token",
- "common.sell.label": "Ibenta",
- "common.send.button": "Ipadala",
- "common.send.cancelled": "Nakansela ang pagpapadala",
- "common.send.failed": "Nabigo ang pagpapadala",
- "common.sending": "Nagpapadala",
- "common.sent": "Ipinadala",
- "common.settings": "Mga setting",
- "common.share": "Ibahagi",
- "common.share.shareToTwitter": "Ibahagi sa Twitter",
- "common.share.twitter": "Ibahagi sa Twitter",
- "common.show.button": "Ipakita",
- "common.showLess.button": "Magpakita ng mas kaunti",
- "common.showMore.button": "Magpakita ng higit pa",
- "common.signatureExpired": "Nag-expire na ang iyong lagda.",
- "common.signMessage": "Mag-sign ng mensahe",
- "common.signMessageWallet": "Mag-sign ng mensahe sa wallet",
- "common.simple.label": "Simple",
- "common.sold": "Nabenta",
- "common.stats": "Stats",
- "common.status": "Katayuan",
- "common.stayConnected": "Manatiling konektado",
- "common.step.number": "Hakbang {{number}}",
- "common.submit.proposal.cancelled": "Nakansela ang pagsusumite ng panukala",
- "common.submit.proposal.failed": "Nabigo ang pagsumite ng panukala",
- "common.submitted.proposal": "Nagsumite ng panukala",
- "common.submitting.proposal": "Pagsusumite ng panukala",
- "common.success": "Tagumpay",
- "common.swap": "Magpalit",
- "common.swap.cancelled": "Kinansela ang pagpapalit",
- "common.swap.expired": "Nag-expire na ang pagpapalit",
- "common.swap.failed": "Nabigo ang pagpapalit",
- "common.swapped": "Pinagpalit",
- "common.swapPending": "Nakabinbin ang pagpapalit...",
- "common.swapping": "Pagpapalit",
- "common.switchNetworks": "Lumipat ng mga network",
- "common.termsOfService": "Mga Tuntunin ng Serbisyo",
- "common.text.connected": "Nakakonekta",
- "common.text.contract": "Kontrata",
- "common.text.disconnected": "Nadiskonekta",
- "common.text.error": "Error",
- "common.text.notAvailable": "N/A",
- "common.text.recipient": "Upang",
- "common.text.sender": "Mula sa",
- "common.text.unknown": "Hindi alam",
- "common.thisMonth": "Ngayong buwan",
- "common.thisWeek": "Ngayong linggo",
- "common.thisYear": "Ngayong taon",
- "common.time": "Oras",
- "common.time.day": "araw",
- "common.time.days": "araw",
- "common.time.hour": "oras",
- "common.time.hours": "oras",
- "common.time.minute.amt": "{{time}}m",
- "common.time.minutes": "minuto",
- "common.time.month": "buwan",
- "common.time.months": "buwan",
- "common.time.past.days": "{{days}}d ang nakalipas",
- "common.time.past.hours": "{{hours}}h ang nakalipas",
- "common.time.past.minutes": "{{minutes}}m ang nakalipas",
- "common.time.past.months": "{{months}}mo ago",
- "common.time.past.seconds": "{{seconds}}s ang nakalipas",
- "common.time.week": "linggo",
- "common.time.weeks": "linggo",
- "common.tip.label": "Tip:",
- "common.to": "sa",
- "common.today": "Ngayong araw",
- "common.tokenA": "Token A",
- "common.tokenAmount": "Ang halaga ng token",
- "common.tokenB": "Token B",
- "common.tokenName": "Pangalan ng token",
- "common.tokens": "Mga token",
- "common.totalValueLocked": "TVL",
- "common.trade": "Trade",
- "common.trademarkPolicy": "Patakaran sa Trademark",
- "common.transactionDetails": "Mga detalye ng transaksyon",
- "common.transactionId": "ID ng Transaksyon",
- "common.transactionPending": "Nakabinbin ang transaksyon",
- "common.transactions": "Mga transaksyon",
- "common.transactionSettings": "Mga Setting ng Transaksyon",
- "common.transactionSubmitted": "Naisumite ang transaksyon",
- "common.transfer": "paglipat",
- "common.transfers": "mga paglilipat",
- "common.tryAgain.error": "Subukan muli",
- "common.twitter": "Twitter",
- "common.type.label": "Uri",
- "common.unavailable": "Hindi magagamit",
- "common.uniGovernance": "Pamamahala ng UNI",
- "common.uniswapMobile": "Uniswap Mobile",
- "common.uniswapProtocol": "Uniswap Protocol",
- "common.uniswapTVL": "Uniswap TVL",
- "common.uniswapWallet": "Uniswap wallet",
- "common.uniswapX": "UniswapX",
- "common.unknown": "Hindi alam",
- "common.unknownApproval": "Hindi Alam na Pag-apruba",
- "common.unknownError.error": "Hindi Kilalang Error",
- "common.unknownLend": "Hindi kilalang Lend",
- "common.unknownMint": "Hindi kilalang Mint",
- "common.unknownSend": "Hindi Kilalang Ipadala",
- "common.unknownSwap": "Hindi kilalang Swap",
- "common.unsupportedAsset_one": "Hindi sinusuportahang asset",
- "common.unsupportedAsset_other": "Mga hindi sinusuportahang asset",
- "common.unwrap.button": "I-unwrap",
- "common.unwrap.failed": "Nabigo ang pag-unwrap",
- "common.unwrapped": "Hindi nakabalot",
- "common.unwrapping": "Binubuksan",
- "common.version": "Bersyon",
- "common.viewOnBlockExplorer": "Tingnan sa Block Explorer",
- "common.viewOnExplorer": "Tingnan sa Explorer",
- "common.volume": "Dami",
- "common.vote": "Bumoto",
- "common.vote.cancelled": "Kinansela ang boto",
- "common.vote.failed": "Nabigo ang boto",
- "common.voted": "Bumoto",
- "common.voting": "Pagboto",
- "common.wallet.approve": "Approve sa wallet",
- "common.wallet.label": "Wallet",
- "common.wallet.unsupported": "Hindi sinusuportahan ng iyong wallet",
- "common.walletForSwapping": "Ang wallet na ginawa para sa pagpapalit. Available sa iOS at Android.",
- "common.webApp": "Web app",
- "common.website": "Website",
- "common.whyApprove": "Bakit kailangan kong aprubahan ang isang token?",
- "common.whySign": "Bakit kailangan ng mga pirma?",
- "common.whyWrap": "Bakit kailangan kong balutin ang aking {{symbol}}?",
- "common.withdraw.failed": "Nabigo ang pag-withdraw",
- "common.withdrawal.amount": "halaga ng withdrawal",
- "common.withdrawal.cancelled": "Kinansela ang withdrawal",
- "common.withdrawing": "Pag-withdraw",
- "common.withdrew": "Nag-withdraw",
- "common.withinRange": "Nasa hanay",
- "common.wrap": "I-wrap {{symbol}}",
- "common.wrap.button": "balutin",
- "common.wrap.cancelled": "Kinansela ang pag-wrap",
- "common.wrap.failed": "Nabigo ang pag-wrap",
- "common.wrapIn": "I-wrap ang {{symbol}} sa wallet",
- "common.wrapped": "Nakabalot",
- "common.wrapping": "Pagbabalot",
- "common.wrappingToken": "Binabalot {{symbol}}...",
- "common.wrongNetwork": "Maling network",
- "common.your.account.had.insufficient.funds": "Walang sapat na pondo ang iyong account upang makumpleto ang swap na ito.",
- "common.your.account.has.insufficient.funds": "Ang iyong account ay walang sapat na pondo upang makumpleto ang swap na ito.",
- "common.your.limit.could.not.be.fulfilled": "Hindi matupad ang iyong limitasyon sa ngayon. Pakisubukang muli.",
- "common.your.swap.could.not.be.fulfilled": "Hindi matupad ang iyong pagpapalit sa ngayon. Pakisubukang muli.",
- "common.youreBuying": "Bumili ka",
- "common.youRecieve": "Matatanggap mo",
- "common.youreSending": "Nagpapadala ka",
- "common.youWillReceive": "Matatanggap mo",
- "currency.aud": "Dolyar ng Australia",
- "currency.brl": "Brazilian Real",
- "currency.cad": "Dolyar ng Canada",
- "currency.cny": "Chinese Yuan",
- "currency.eur": "Euro",
- "currency.gbp": "British Pound",
- "currency.hkd": "Dolyar ng Hong Kong",
- "currency.idr": "Indonesian Rupiah",
- "currency.inr": "Indian Rupee",
- "currency.jpy": "Japanese Yen",
- "currency.krw": "Won ng South Korean",
- "currency.ngn": "Nigerian Naira",
- "currency.pkr": "Pakistani Rupee",
- "currency.rub": "Ruble ng Russia",
- "currency.sgd": "Dolyar ng Singapore",
- "currency.thb": "Thai Baht",
- "currency.try": "Turkish Lira",
- "currency.uah": "Ukrainian Hryvnia",
- "currency.usd": "Dolyar ng Estados Unidos",
- "currency.vnd": "Vietnamese Dong",
- "dapp.request.approve.action": "Aprubahan",
- "dapp.request.approve.fallbackTitle": "Aprubahan ang site na ito upang ma-access ang mga token",
- "dapp.request.approve.helptext": "Payagan ang site na ito na i-access at gastusin ang token na ito para sa mga transaksyon. Tiyaking pinagkakatiwalaan mo ang site na ito.",
- "dapp.request.approve.label": "Wallet",
- "dapp.request.approve.title": "Aprubahan ang access sa {{tokenSymbol}}",
- "dapp.request.base.title": "Kahilingan sa transaksyon",
- "dapp.request.connect.helptext": "Payagan ang site na ito na tingnan ang iyong wallet address, balanse, at humiling ng mga pag-apruba para sa mga transaksyon.",
- "dapp.request.connect.title": "Kumonekta sa site",
- "dapp.request.fallback.calldata.label": "Raw data",
- "dapp.request.fallback.function.label": "Function",
- "dapp.request.permit2.description": "Pinamamahalaan ng Permit2 ang mga pag-apruba ng token sa maraming dapps.",
- "dapp.request.permit2.header": "Pumirma ng Permit2",
- "dapp.request.reject.action": "Tanggihan lahat",
- "dapp.request.reject.info": "Mayroon kang {{totalRequestCount}} mga kahilingan sa transaksyon",
- "dapp.request.revoke.action": "Bawiin",
- "dapp.request.revoke.helptext": "Pahintulutan ang site na ito na bawiin ang access na gastusin ang token na ito para sa mga transaksyon. Tiyaking pinagkakatiwalaan mo ang site na ito.",
- "dapp.request.revoke.title": "Bawiin ang access sa {{tokenSymbol}}",
- "dapp.request.signature.containsUnrenderableCharacters": "Ang mensaheng ito ay naglalaman ng mga hindi mai-render na character. Tiyaking pinagkakatiwalaan mo ang site na ito.",
- "dapp.request.signature.error.712-spec-compliance": "Nakatanggap ang SignTypedDataRequestContent ng data para sa pagpirma na hindi sumusunod sa spec ng EIP-712.",
- "dapp.request.signature.header": "Paghiling ng lagda",
- "dapp.request.signature.toggleDataView.raw": "Tingnan ang raw data",
- "dapp.request.signature.toggleDataView.readable": "Tingnan ang orihinal na data",
- "dapp.request.warning.notActive.message": "Tiyaking ito ang tama",
- "dapp.request.warning.notActive.title": "Hindi ito ang iyong aktibong wallet",
- "downloadApp.modal.alreadyHaveWallet": "Mayroon ka nang wallet? ",
- "downloadApp.modal.alreadyHaveWallet.signInLink": "Mag-sign in dito",
- "downloadApp.modal.getStarted.description": "Magsimula sa pamamagitan ng pag-download ng Uniswap Wallet, na available sa iyong telepono o browser.",
- "downloadApp.modal.getStarted.title": "Magsimula sa Uniswap",
- "downloadApp.modal.signUp.description": "Magsimula sa pamamagitan ng pag-download ng Uniswap Wallet, na available sa iyong telepono o browser.",
- "downloadApp.modal.signUp.title": "Mag-sign up sa Uniswap",
- "downloadApp.modal.uniswapProducts.subtitle": "Ang mga produkto ng Uniswap ay gumagana nang walang putol upang lumikha ng pinakamahusay na karanasan sa onchain.",
- "error.access.expiry": "Nagbibigay ito ng access sa Uniswap protocol sa iyong token para sa pangangalakal. Para sa seguridad, mag-e-expire ito pagkatapos ng 30 araw.",
- "error.dataUnavailable": "Ang data ay hindi magagamit sa ngayon; gumagawa kami ng pag-aayos",
- "error.id": "Error ID: {{eventId}}",
- "error.noData": "Walang nakitang data",
- "error.request.provideId": "Paumanhin, may naganap na error habang pinoproseso ang iyong kahilingan. Kung humiling ka ng suporta, tiyaking ibigay ang iyong error ID.",
- "error.tokenApproval": "Nabigo ang pag-apruba ng token",
- "errors.crash.message": "May bumagsak.",
- "errors.crash.restart": "I-restart ang app",
- "errors.crash.title": "Uh oh!",
- "explore.search.action.clear": "I-clear lahat",
- "explore.search.action.viewEtherscan": "Tingnan sa {{blockExplorerName}}",
- "explore.search.empty.full": "Walang nahanap na mga resulta para sa \"{{searchQuery}}\"",
- "explore.search.error": "Hindi ma-load ang mga resulta ng paghahanap",
- "explore.search.label.ownedBy": "Pagmamay-ari ni {{ownerAddress}}",
- "explore.search.placeholder": "Maghanap ng mga token at wallet",
- "explore.search.section.nft": "Mga Koleksyon ng NFT",
- "explore.search.section.popularNFT": "Mga sikat na koleksyon ng NFT",
- "explore.search.section.popularTokenInfo": "Natutukoy ang mga sikat na token batay sa dami ng kanilang pangangalakal sa Uniswap sa nakalipas na 24 na oras.",
- "explore.search.section.popularTokens": "Mga sikat na token",
- "explore.search.section.recent": "Mga kamakailang paghahanap",
- "explore.search.section.suggestedWallets": "Mga iminungkahing wallet",
- "explore.search.section.tokens": "Mga token",
- "explore.search.section.wallets": "Mga pitaka",
- "explore.tokens.error": "Hindi ma-load ang mga token",
- "explore.tokens.favorite.action.add": "Paboritong token",
- "explore.tokens.favorite.action.edit": "I-edit ang mga paborito",
- "explore.tokens.favorite.action.remove": "Alisin ang paborito",
- "explore.tokens.favorite.title.default": "Mga paboritong token",
- "explore.tokens.favorite.title.edit": "I-edit ang mga paboritong token",
- "explore.tokens.metadata.marketCap": "{{number}} MCap",
- "explore.tokens.metadata.totalValueLocked": "{{number}} TVL",
- "explore.tokens.metadata.volume": "{{number}} Vol",
- "explore.tokens.sort.label.marketCap": "market cap",
- "explore.tokens.sort.label.priceDecrease": "Pagbaba ng presyo",
- "explore.tokens.sort.label.priceIncrease": "Pagtaas ng presyo",
- "explore.tokens.sort.label.totalValueLocked": "TVL",
- "explore.tokens.sort.label.volume": "Dami",
- "explore.tokens.sort.option.marketCap": "market cap",
- "explore.tokens.sort.option.priceDecrease": "Pagbaba ng presyo (24H)",
- "explore.tokens.sort.option.priceIncrease": "Pagtaas ng presyo (24H)",
- "explore.tokens.sort.option.totalValueLocked": "Uniswap TVL",
- "explore.tokens.sort.option.volume": "Uniswap volume (24H)",
- "explore.tokens.top.title": "Mga nangungunang token",
- "explore.transactions.disabled": "Pumili ng network para tingnan ang mga kamakailang transaksyon",
- "explore.unableToDisplayHistorical": "Hindi maipakita ang makasaysayang data ng dami para sa kasalukuyang chain.",
- "explore.unableToDisplayHistoricalTVL": "Hindi maipakita ang makasaysayang data ng TVL para sa kasalukuyang chain.",
- "explore.uniVolume": "Uniswap volume",
- "explore.wallets.favorite.action.add": "Paboritong wallet",
- "explore.wallets.favorite.action.edit": "I-edit ang mga paborito",
- "explore.wallets.favorite.action.remove": "Alisin ang paborito",
- "explore.wallets.favorite.title.default": "Mga paboritong wallet",
- "explore.wallets.favorite.title.edit": "I-edit ang mga paboritong wallet",
- "extension.announcement": "Narito na ang Uniswap Extension. Magpalit, lagdaan ang mga transaksyon, at magpadala ng mga token mula mismo sa iyong browser.",
- "extension.connection.networks": "Mga network",
- "extension.connection.popup": "Hindi nakakonekta ang iyong wallet sa site na ito. Maghanap ng \"Connect Wallet\" o \"Log in\" na button.",
- "extension.connection.popup.trouble": "Problema sa pagkonekta?",
- "extension.connection.popupWithButton": "Hindi nakakonekta ang iyong wallet sa site na ito.",
- "extension.connection.titleConnected": "Nakakonekta",
- "extension.connection.titleNotConnected": "Hindi konektado",
- "extension.introduction": "Ipinapakilala ang Uniswap Extension.",
- "extension.lock.button.forgot": "Nakalimutan ang password?",
- "extension.lock.button.reset": "I-reset ang wallet",
- "extension.lock.button.submit": "I-unlock",
- "extension.lock.password.error": "Maling password. Subukan muli",
- "extension.lock.password.reset.initial.description": "Hindi makakatulong ang Uniswap na mabawi ang iyong password. Kailangan mong i-reset ang iyong wallet sa pamamagitan ng muling pagpasok ng iyong 12-salitang parirala sa pagbawi.",
- "extension.lock.password.reset.initial.help": "Saan ko mahahanap ang aking parirala sa pagbawi?",
- "extension.lock.password.reset.initial.title": "Nakalimutan ang password",
- "extension.lock.password.reset.speedbump.description": "Tiyaking mayroon ka ng iyong 12-salitang parirala sa pagbawi bago mo i-reset ang iyong wallet. Kung hindi, hindi mo mababawi ang iyong mga pondo.",
- "extension.lock.password.reset.speedbump.help": "Nawala ang aking parirala sa pagbawi",
- "extension.lock.password.reset.speedbump.title": "Bago ka magpatuloy",
- "extension.lock.subtitle": "Ilagay ang iyong password para i-unlock",
- "extension.lock.title": "Maligayang pagbabalik",
- "extension.network.notSupported": "Hindi suportadong network",
- "extension.open": "Buksan ang Uniswap Extension",
- "extension.popup.chrome.button": "Buksan ang extension",
- "extension.popup.chrome.description": "Kumpletuhin ang pagkilos na ito sa pamamagitan ng pagbubukas ng Uniswap extension.",
- "extension.popup.chrome.title": "Magpatuloy sa Uniswap",
- "extension.settings.password.enter.title": "Ilagay ang iyong kasalukuyang password",
- "extension.settings.password.error.wrong": "Maling password",
- "extension.settings.password.placeholder": "Kasalukuyang password",
- "extension.warning.storage.button": "I-back up",
- "extension.warning.storage.message": "Tiyaking i-back up ang iyong parirala sa pagbawi upang maiwasan ang pagkawala ng access sa iyong wallet at mga pondo.",
- "extension.warning.storage.title": "Nauubusan na ng storage ang iyong browser",
- "fee.bestForExotic": "Pinakamahusay para sa mga kakaibang pares.",
- "fee.bestForMost": "Pinakamahusay para sa karamihan ng mga pares.",
- "fee.bestForStablePairs": "Pinakamahusay para sa mga matatag na pares.",
- "fee.bestForVeryStable": "Pinakamahusay para sa napakatatag na mga pares.",
- "fee.percentEarned": "Ang % na kikitain mo sa mga bayarin.",
- "fee.selectPercent": "{{pct}}% piliin",
- "fee.tier": "Tier ng bayad",
- "fee.tier.create": "Lumikha ng antas ng bayad",
- "fee.tier.create.button": "Lumikha ng bagong antas ng bayad",
- "fee.tier.create.description": "Ang paggawa ng bagong tier ay magsisimula sa isang bagong pool at magreresulta sa mas mataas kaysa sa karaniwang mga gastos sa network.",
- "fee.tier.description": "Ang halagang kinita sa pagpapadali ng mga pangangalakal. Pumili ng halaga na nababagay sa iyong pagpapaubaya at diskarte sa panganib.",
- "fee.tier.description.v2": "Ang halagang kinita sa pagpapadali ng mga pangangalakal. Lahat ng v2 pool ay may naayos na 0.3% na bayad. Para sa higit pang mga opsyon, magbigay ng liquidity sa v4.",
- "fee.tier.label": "Ang % na kikitain mo sa mga bayarin",
- "fee.tier.missing.description": "Hindi mahanap ang tier na hinahanap mo?",
- "fee.tier.new": "Bagong baitang",
- "fee.tier.percent.select": "{{percentage}}% piliin",
- "fee.tier.recommended": "Inirerekomenda",
- "fee.tier.search": "Lumikha o maghanap para sa iba pang mga antas ng bayad",
- "fee.tier.search.short": "Mga tier ng paghahanap",
- "fee.tier.select": "Pumili ng tier ng bayad",
- "fee.tierExact": "{{fee}} tier ng bayad",
- "fiatOffRamp.checkout.title": "Ibenta gamit ang",
- "fiatOffRamp.connection.quote": "Nagbebenta ng {{amount}} halaga ng {{currencySymbol}}",
- "fiatOffRamp.unsupportedToken.back": "Bumalik ka",
- "fiatOffRamp.unsupportedToken.divider": "Mga hindi sinusuportahang token",
- "fiatOffRamp.unsupportedToken.message": "Ang token na ito ay hindi sinusuportahang ibenta. Ipalit ang asset na ito sa isa sa mga sinusuportahang token.",
- "fiatOffRamp.unsupportedToken.swap": "Magpalit sa isang sinusuportahang token",
- "fiatOffRamp.unsupportedToken.title": "Hindi sinusuportahang token",
- "fiatOffRamp.welcome.tooltip": "Ibenta ang iyong crypto sa iyong bank account o debit card.",
- "fiatOnRamp.button.chooseToken": "Pumili ng token",
- "fiatOnRamp.cexTransferModal.description": "Ang pagbili ng crypto gamit ang isang card ay hindi suportado sa iyong rehiyon. Maglipat ng mga asset mula sa isang sentralisadong exchange account upang pondohan ang iyong wallet.",
- "fiatOnRamp.cexTransferModal.title": "Maglipat para makapagsimula",
- "fiatOnRamp.checkout.title": "Checkout gamit ang",
- "fiatOnRamp.checkoutWith": "Checkout gamit ang",
- "fiatOnRamp.chooseProvider.description": "Magpapatuloy ka sa portal ng provider upang makita ang mga bayarin na nauugnay sa iyong transaksyon.",
- "fiatOnRamp.completeTransactionHeader": "Kumpletuhin ang transaksyon sa {{serviceProvider}}",
- "fiatOnRamp.connection.error": "Nabigo ang koneksyon",
- "fiatOnRamp.connection.errorDescription": "Nagkaproblema sa pagkonekta sa {{serviceProvider}}.",
- "fiatOnRamp.connection.message": "Ikinokonekta ka sa {{serviceProvider}}",
- "fiatOnRamp.connection.quote": "Bumibili ng {{amount}} nagkakahalaga ng {{currencySymbol}}",
- "fiatOnRamp.connection.terms": "Sa pagpapatuloy, tinatanggap mo na sasailalim ka sa Mga Tuntunin ng Serbisyo at Patakaran sa Privacy sa {{serviceProvider}}, kung naaangkop.",
- "fiatOnRamp.continueInTab": "Pumunta sa tab na {{serviceProvider}} para magpatuloy. Ligtas na isara ang modal na ito ngayon.",
- "fiatOnRamp.disclaimer": "Sa pagpapatuloy, tinatanggap mo na sasailalim ka sa Mga Tuntunin ng Serbisyo at Patakaran sa Privacy sa {{serviceProvider}}, kung naaangkop.",
- "fiatOnRamp.error.default": "Nagkaproblema.",
- "fiatOnRamp.error.load": "Hindi ma-load ang mga token na bibilhin",
- "fiatOnRamp.error.max": "Maximum {{amount}}",
- "fiatOnRamp.error.min": "Pinakamababa {{amount}}",
- "fiatOnRamp.error.unavailable": "Hindi available ang serbisyong ito sa iyong rehiyon",
- "fiatOnRamp.error.unsupported": "Hindi suportado sa rehiyon",
- "fiatOnRamp.error.usd": "Available lang mabili sa USD",
- "fiatOnRamp.exchangeRate": "{{outputAmount}} {{outputSymbol}} para sa {{inputAmount}} {{inputSymbol}}",
- "fiatOnRamp.notAvailable.error": "Hindi available ang serbisyong ito sa iyong rehiyon",
- "fiatOnRamp.purchasedOn": "Binili noong {{serviceProvider}}",
- "fiatOnRamp.quote.advice": "Magpapatuloy ka sa portal ng provider upang makita ang mga bayarin na nauugnay sa iyong transaksyon.",
- "fiatOnRamp.quote.type.list": "{{optionsList}}, at iba pang mga opsyon",
- "fiatOnRamp.quote.type.other": "Iba pang mga pagpipilian",
- "fiatOnRamp.quote.type.recent": "Ginamit kamakailan",
- "fiatOnRamp.receiveCrypto.modal.addressQr.supportedNetworks": "Maaari kang makatanggap ng mga token at NFT sa Ethereum, Polygon, Arbitrum, Optimism, Base, BNB, Blast, Avalanche, Zora, at ZKsync.",
- "fiatOnRamp.receiveCrypto.modal.sectionTitle.fromAccount": "Mula sa isang account",
- "fiatOnRamp.receiveCrypto.title": "Tumanggap ng crypto",
- "fiatOnRamp.receiveCrypto.transferFunds": "Pondohan ang iyong wallet sa pamamagitan ng paglilipat ng crypto mula sa ibang wallet o account",
- "fiatOnRamp.region.placeholder": "Maghanap ayon sa bansa o rehiyon",
- "fiatOnRamp.region.title": "Piliin ang iyong rehiyon",
- "fiatOnRamp.summary.total": "{{cryptoAmount}} para sa {{fiatAmount}}",
- "forceUpgrade.action.confirm": "I-update ang app",
- "forceUpgrade.action.recoveryPhrase": "Tingnan ang parirala sa pagbawi",
- "forceUpgrade.description": "Ang bersyon ng Uniswap Wallet na iyong ginagamit ay luma na at walang mga kritikal na pag-upgrade. Kung hindi mo ia-update ang app o hindi mo naisulat ang iyong parirala sa pagbawi, hindi mo maa-access ang iyong mga asset.",
- "forceUpgrade.label.recoveryPhrase": "Parirala sa pagbawi",
- "forceUpgrade.title": "I-update ang app para magpatuloy",
- "globalPreferences.title": "Mga pandaigdigang kagustuhan",
- "hero.scroll": "Mag-scroll para matuto pa",
- "hero.subtitle": "Ang pinakamalaking onchain marketplace. Bumili at magbenta ng crypto sa Ethereum at 11+ pang chain.",
- "hero.swap.title": "Magpalit anumang oras,
kahit saan.",
- "hidden.nfts.info.banner.text": "Matuto pa tungkol sa mga nakatagong NFT",
- "hidden.nfts.info.text.button": "Mga Nakatagong NFT ({{numHidden}})",
- "hidden.nfts.info.text.extension": "Ito ay mga potensyal na scam at NFT na itinago mo. Maaari kang mag-right click sa isang NFT upang i-unhide ito.",
- "hidden.nfts.info.text.mobile": "Ito ay mga potensyal na scam at NFT na itinago mo. Maaari mong pindutin nang matagal ang isang NFT upang i-unhide ito.",
- "hidden.nfts.info.text.title": "Mga nakatagong NFT",
- "hidden.tokens.info.banner.text": "Matuto pa tungkol sa mga nakatagong token",
- "hidden.tokens.info.text.button": "Mga nakatagong token ({{numHidden}})",
- "hidden.tokens.info.text.info": "Ito ay mga potensyal na scam, maliliit na balanse, at mga token na itinago mo. Ang mga nakatagong token ay hindi kasama sa iyong kabuuang balanse sa wallet.",
- "hidden.tokens.info.text.title": "Mga nakatagong token",
- "home.activity.empty.button": "Tumanggap ng mga token o NFT",
- "home.activity.empty.description.default": "Kapag nag-apruba ka, nakipagkalakalan, o naglipat ng mga token o NFT, lalabas dito ang iyong mga transaksyon.",
- "home.activity.empty.description.external": "Kapag gumawa ng mga transaksyon ang wallet na ito, lalabas ang mga ito dito.",
- "home.activity.empty.title": "Wala pang aktibidad",
- "home.activity.error.load": "Hindi ma-load ang aktibidad",
- "home.activity.title": "Aktibidad",
- "home.banner.offline": "Nasa offline mode ka",
- "home.explore.footer": "I-tap ang “search” para mag-explore pa",
- "home.explore.title": "I-explore ang mga token",
- "home.extension.error": "Error sa paglo-load ng mga account",
- "home.feed.empty.description": "Kapag gumawa ng mga transaksyon ang iyong mga paboritong wallet, lalabas ang mga ito dito.",
- "home.feed.empty.title": "Wala pang aktibidad",
- "home.feed.error": "Hindi ma-load ang aktibidad",
- "home.feed.title": "Pakainin",
- "home.label.buy": "Bumili",
- "home.label.receive": "Tumanggap",
- "home.label.scan": "I-scan",
- "home.label.send": "Ipadala",
- "home.label.swap": "Magpalit",
- "home.nfts.title": "Mga NFT",
- "home.tokens.empty.action.buy.description": "Bumili ng crypto gamit ang debit card o bank account.",
- "home.tokens.empty.action.buy.title": "Bumili ng crypto gamit ang card",
- "home.tokens.empty.action.import.description": "Ilagay ang parirala sa pagbawi ng wallet na ito upang simulan ang pagpapalit at pagpapadala.",
- "home.tokens.empty.action.import.title": "Mag-import ng wallet",
- "home.tokens.empty.action.receive.description": "Pondohan ang iyong wallet sa pamamagitan ng paglilipat ng crypto mula sa ibang wallet o account.",
- "home.tokens.empty.action.receive.title": "Tumanggap ng crypto",
- "home.tokens.empty.description": "Kapag bumili o tumanggap ng mga token ang wallet na ito, lalabas ang mga ito dito.",
- "home.tokens.empty.title": "Wala pang token",
- "home.tokens.empty.welcome": "Maligayang pagdating sa iyong wallet!",
- "home.tokens.empty.welcome.description": "Mukhang may bago kang wallet. Kunin natin itong pondohan bago mo gawin ang iyong unang pagpapalit.",
- "home.tokens.error.fetch": "Nabigong makuha ang mga balanse ng token",
- "home.tokens.error.load": "Hindi ma-load ang mga balanse ng token",
- "home.tokens.title": "Mga token",
- "home.upsell.receive.cta": "Mula sa isang account",
- "home.upsell.receive.description": "Pondohan ang iyong wallet sa pamamagitan ng paglilipat ng crypto mula sa ibang wallet o account",
- "home.upsell.receive.title": "Tumanggap ng crypto",
- "home.warning.viewOnly": "Ito ay isang view-only na wallet",
- "interface.metatags.description": "Magpalit o magbigay ng pagkatubig sa Uniswap Protocol",
- "interface.metatags.title": "Uniswap Interface",
- "landing.buildNextGen": "Buuin ang susunod na henerasyon ng mga bukas na application at tool.",
- "landing.connectWithUs": "Kumonekta sa amin",
- "landing.devDocs": "Mga doc ng developer",
- "landing.directToDeFi": "Diretso sa DeFi",
- "landing.followOnX": "Sundin ang @Uniswap sa X para sa mga pinakabagong update",
- "landing.protocolDescription": "Ang mga produkto ng Uniswap ay pinapagana ng Uniswap Protocol. Ang protocol ay ang pinakamalaking onchain marketplace, na may bilyun-bilyong dolyar sa lingguhang dami sa libu-libong token sa Ethereum at 7+ karagdagang chain.",
- "landing.provideLiquidity.message": "Magbigay ng pagkatubig sa mga pool sa Uniswap Protocol at makakuha ng mga bayarin sa mga swap.",
- "landing.swapSimple": "Ang pagpapalit ay ginawang simple. I-access ang libu-libong token sa 11+ chain.",
- "landing.teamInsights": "Mga insight at balita mula sa team",
- "landing.trusted": "Pinagkakatiwalaan ng milyun-milyon",
- "language.afrikaans": "Afrikaans",
- "language.arabic": "Arabic",
- "language.catalan": "Catalan",
- "language.chineseSimplified": "Chinese, Pinasimple",
- "language.chineseTraditional": "Intsik, Tradisyonal",
- "language.czech": "Czech",
- "language.danish": "Danish",
- "language.dutch": "Dutch",
- "language.english": "Ingles",
- "language.finnish": "Finnish",
- "language.french": "Pranses",
- "language.greek": "Griyego",
- "language.hebrew": "Hebrew",
- "language.hindi": "Hindi",
- "language.hungarian": "Hungarian",
- "language.indonesian": "Indonesian",
- "language.italian": "Italyano",
- "language.japanese": "Hapon",
- "language.korean": "Koreano",
- "language.malay": "Malay",
- "language.norwegian": "Norwegian",
- "language.polish": "Polish",
- "language.portuguese": "Portuges",
- "language.romanian": "Romanian",
- "language.russian": "Ruso",
- "language.serbian": "Serbian",
- "language.spanishLatam": "Espanyol (Latin America)",
- "language.spanishSpain": "Espanyol (Espanya)",
- "language.spanishUs": "Espanyol (US)",
- "language.swahili": "Swahili",
- "language.swedish": "Swedish",
- "language.thai": "Thai",
- "language.turkish": "Turkish",
- "language.ukrainian": "Ukrainian",
- "language.urdu": "Urdu",
- "language.vietnamese": "Vietnamese",
- "limit.open.count_one": "1 bukas na limitasyon",
- "limit.open.count_other": "{{count}} bukas na mga limitasyon",
- "limitPrice.buyingAboveMarketPrice.error.description": "Ang iyong limitasyon sa presyo ay {{percentage}}% na mas mataas kaysa sa market. Ayusin ang iyong limitasyon sa presyo upang magpatuloy.",
- "limitPrice.buyingAboveMarketPrice.error.title": "Ang pagbili ng {{tokenSymbol}} sa itaas ng presyo ng merkado.error",
- "limitPrice.marketPriceNotAvailable.error.description": "Hindi namin makalkula ang kasalukuyang presyo sa merkado. Upang maiwasan ang pagsusumite ng isang order na mas mababa sa presyo ng merkado, mangyaring suriin ang iyong koneksyon sa network at subukang muli.",
- "limitPrice.marketPriceNotAvailable.error.title": "Hindi available ang presyo sa merkado",
- "limitPrice.sellingBelowMarketPrice.error.description": "Ang iyong limitasyong presyo ay {{percentage}}% na mas mababa kaysa sa market. Ayusin ang iyong limitasyon sa presyo upang magpatuloy.",
- "limitPrice.sellingBelowMarketPrice.error.title": "Nagbebenta ng {{tokenSymbol}} mas mababa sa presyo ng merkado",
- "limits.form.disclaimer.mainnet": "Tanging mga Ethereum mainnet token ang available para sa mga limitasyon. ",
- "limits.form.disclaimer.mainnet.short": "Tanging ang mga token ng Mainnet ang magagamit para sa mga limitasyon.",
- "limits.form.disclaimer.uniswapx": "Maaaring hindi maisagawa ang mga limitasyon nang eksakto kapag naabot ng mga token ang tinukoy na presyo. ",
- "limits.learnMore": "Matuto pa tungkol sa mga limitasyon",
- "limits.price.input.label": "Kapag ang 1 ay nagkakahalaga",
- "limits.price.label": "Limitahan ang presyo",
- "limits.selectSupportedTokens": "Pumili ng mga sinusuportahang token",
- "liquidity.notEnough.label": "Hindi sapat na pagkatubig upang ipakita ang tumpak na halaga ng USD.",
- "liquidityPool.chart.tooltip.amount": "{{token}} pagkatubig: {{amount}}",
- "liquidityPool.page.title": "Magdagdag ng pagkatubig sa mga pool{{version}} sa Uniswap",
- "liquidityPool.positions.closed.title": "Mga Saradong Posisyon",
- "liquidityPool.positions.page.title": "Pamahalaan ang {{quoteSymbol}}/{{baseSymbol}} pool liquidity sa Uniswap",
- "liquidityPool.positions.page.version.description": "Tingnan ang iyong aktibong {{version}} mga posisyon sa pagkatubig. Magdagdag ng mga bagong posisyon.",
- "liquidityPool.positions.page.version.title": "Pamahalaan ang pool liquidity{{version}} sa Uniswap",
- "liquidityPool.positions.price": "{{amountWithSymbol}} bawat {{outputToken}}",
- "liquidityPool.positions.price.formatted": " bawat ",
- "migrate.allowed": "Pinayagan",
- "migrate.allowLpMigration": "Payagan ang paglipat ng token ng LP",
- "migrate.connectAccount": "Dapat kang magkonekta ng isang account.",
- "migrate.connectWallet": "Kumonekta sa isang wallet para tingnan ang iyong V2 liquidity.",
- "migrate.contract": "Uniswap migration contract",
- "migrate.firstLP": "Ikaw ang unang tagapagbigay ng liquidity para sa Uniswap V3 pool na ito. Ang iyong liquidity ay lilipat sa kasalukuyang {{source}} presyo.",
- "migrate.highGasCost": "Ang iyong gastos sa transaksyon ay magiging mas mataas dahil kasama nito ang gas para gawin ang pool.",
- "migrate.invalidRange": "Di-wastong hanay ang napili. Ang min na presyo ay dapat na mas mababa kaysa sa pinakamataas na presyo.",
- "migrate.lpNFT": "{{symA}}/{{symB}} LP NFT",
- "migrate.lpTokens": "{{symA}}/{{symB}} LP token",
- "migrate.migrating": "Nagmigrate",
- "migrate.missingV2Position": "Hindi mo ba nakikita ang isa sa iyong v2 na posisyon? I-import ito.",
- "migrate.noV2Liquidity": "Walang nakitang liquidity ng V2.",
- "migrate.positionNoFees": "Ang iyong posisyon ay hindi makakakuha ng mga bayarin o gagamitin sa mga pangangalakal hanggang ang presyo ng merkado ay lumipat sa iyong hanay.",
- "migrate.priceDifference": "Pagkakaiba sa presyo: ",
- "migrate.priceWarning": "Dapat ka lang magdeposito ng liquidity sa Uniswap V3 sa presyong pinaniniwalaan mong tama.
Kung mukhang mali ang presyo, maaari kang gumawa ng swap para ilipat ang presyo o maghintay ng ibang tao na gumawa nito.",
- "migrate.refund": "Hindi bababa sa {{amtA}} {{symA}} at {{amtB}} {{symB}} ang ire-refund sa iyong wallet dahil sa napiling hanay ng presyo.",
- "migrate.selectFeeTier": "Pumili ng tier ng bayad",
- "migrate.setRange": "Itakda ang hanay ng presyo",
- "migrate.symbolPrice": "{{protocolName}} {{tokenSymbol}} Presyo:",
- "migrate.v2Description": "Ligtas na ililipat ng tool na ito ang iyong {{source}} liquidity sa V3. Ang proseso ay ganap na walang tiwala dahil sa <0>Uniswap migration contract0> ↗",
- "migrate.v2Instruction": "Para sa bawat pool na ipinapakita sa ibaba, i-click ang mag-migrate para alisin ang iyong liquidity sa Uniswap V2 at ideposito ito sa Uniswap V3.",
- "migrate.v2Subtitle": "I-migrate ang iyong mga liquidity token mula sa Uniswap V2 patungo sa Uniswap V3.",
- "migrate.v2Title": "I-migrate ang V2 liquidity",
- "migrate.v3Price": "V3 {{sym}} Presyo:",
- "mint.v3.input.invalidPrice.error": "Di-wastong pag-input ng presyo",
- "mobile.appRating.button.decline": "Hindi naman",
- "mobile.appRating.description": "Ipaalam sa amin kung nagkakaroon ka ng magandang karanasan sa app na ito",
- "mobile.appRating.feedback.button.cancel": "Baka mamaya",
- "mobile.appRating.feedback.button.send": "Magpadala ng feedback",
- "mobile.appRating.feedback.description": "Ipaalam sa amin kung paano namin mapapahusay ang iyong karanasan",
- "mobile.appRating.feedback.title": "Ikinalulungkot naming marinig iyon.",
- "mobile.appRating.title": "Nasisiyahan sa Uniswap Wallet?",
- "mobileAppPromo.banner.getTheApp.link": "Kunin ang Uniswap Wallet app",
- "mobileAppPromo.banner.title": "Uniswap: Crypto at NFT Wallet",
- "moonpay.poweredBy": "Fiat onramp na pinapagana ng MoonPay USA LLC",
- "moonpay.rampIframe": "MoonPay fiat on-ramp iframe",
- "moonpay.restricted.region": "Hindi available ang Moonpay sa ilang rehiyon. I-click para matuto pa.",
- "nav.createAccount.button": "Gumawa ng account",
- "nav.logIn.button": "Mag-log in",
- "nav.signIn.button": "Mag-sign in",
- "nav.signUp.button": "Mag-sign up",
- "nav.tabs.createPosition": "Lumikha ng posisyon",
- "nav.tabs.createV2Position": "Lumikha ng V2 na posisyon",
- "nav.tabs.createV3Position": "Lumikha ng V3 na posisyon",
- "nav.tabs.viewPosition": "Tingnan ang posisyon",
- "network.lostConnection": "Maaaring nawala ang iyong koneksyon sa network.",
- "network.mightBeDown": "{{network}} maaaring down ngayon, o maaaring nawala ang iyong koneksyon sa network.",
- "network.warning": "Babala sa network",
- "nft.addToBag": "Idagdag sa bag",
- "nft.authorsCollectionOnUni": "Ang koleksyon ng NFT ni {{name}}sa Uniswap",
- "nft.bag": "Bag",
- "nft.blockedCollection": "Naka-block ang koleksyon na ito",
- "nft.blockedOpenSea": "Naka-block sa OpenSea",
- "nft.buyTransferNFTToStart": "Bumili o maglipat ng mga NFT sa wallet na ito para makapagsimula.",
- "nft.buyTransferTokensToStart": "Bumili o maglipat ng mga token sa wallet na ito para makapagsimula.",
- "nft.card.notAvailable": "Hindi pa
available ang content",
- "nft.chainSupportComingSoon": "{{chainName}} paparating na ang suporta",
- "nft.collection.title": "Mag-explore at bumili sa Uniswap",
- "nft.collectionOnUni": "Koleksyon ng NFT sa Uniswap",
- "nft.collections": "Mga koleksyon ng NFT",
- "nft.collectonOnAddress": "Koleksyon ng NFT sa Uniswap - {{address}}",
- "nft.complete": "Kumpleto na!",
- "nft.editListings": "I-edit ang mga listahan",
- "nft.event": "Kaganapan",
- "nft.explore": "Galugarin ang mga NFT",
- "nft.learnWhy": "Alamin kung bakit",
- "nft.list.header.lastPrice": "Huli",
- "nft.list.title": "Maglista ng mga NFT",
- "nft.listedSignificantly_one": "Isang NFT ang nakalista {{percentage}} sa ibaba ng floor price ng koleksyon. Sigurado ka bang gusto mong magpatuloy?",
- "nft.listedSignificantly_other": "{{count}} Ang mga NFT ay nakalista nang mas mababa sa floor price ng koleksyon. Sigurado ka bang gusto mong magpatuloy?",
- "nft.listForSale": "Listahan para sa pagbebenta",
- "nft.lowPrice": "Mababang presyo ng listahan",
- "nft.marketplace.royalty.header": "{{marketName}} bayad",
- "nft.maxFees": "Max na bayad",
- "nft.maxRoyalties": "Pinakamataas na royalty ng creator",
- "nft.noItems": "Walang mga item na ipapakita",
- "nft.noneAtAddress": "Walang mga asset ng koleksyon ang umiiral sa address na ito",
- "nft.noneFound": "Walang nakitang mga koleksyon ng NFT.",
- "nft.noPools": "Wala pang pool",
- "nft.notListed": "Hindi nakalista",
- "nft.popularCollections": "Mga sikat na koleksyon ng NFT",
- "nft.popularCollectionsInfo": "Natutukoy ang mga sikat na koleksyon ng NFT batay sa dami ng kanilang pangangalakal sa Uniswap sa nakalipas na 24 na oras.",
- "nft.proceedsIfSold": "Mga nalikom kung naibenta",
- "nft.profile.priceInput.warning.alreadyListed": "Nakalista na sa {{tokenAmountWithSymbol}}",
- "nft.profile.priceInput.warning.belowFloor": "{{percentage}} mas mababa sa floor price.",
- "nft.refundsInEth": "Ang mga refund para sa mga hindi available na item ay ibibigay sa ETH",
- "nft.removeFromBag": "Alisin sa bag",
- "nft.reportSpam": "Iulat bilang spam",
- "nft.returnToExplore": "Bumalik sa NFT Explore",
- "nft.returnToMy": "Bumalik sa Aking mga NFT",
- "nft.setPrices": "Magtakda ng mga presyo upang magpatuloy",
- "nft.startListing": "Simulan ang paglilista",
- "nft.successListed": "Matagumpay na nakalista",
- "nft.sweep": "Magwalis",
- "nft.unavailableToList": "Hindi available para sa paglilista",
- "nft.view": "Tingnan ang mga NFT",
- "nft.whyTransaction": "Bakit kailangan ang isang transaksyon?",
- "nft.whyTransaction.reason": "Ang paglilista ng isang NFT ay nangangailangan ng isang beses na pag-apruba sa marketplace para sa bawat koleksyon ng NFT.",
- "nft.willAppearHere": "Lalabas dito ang iyong mga transaksyon sa onchain at mga pagbili ng crypto.",
- "nft.wishGranted": "Pinagbigyan ng Uniswap ang iyong hiling!",
- "nfts.collection.action.approve_one": "Aprubahan ang koleksyon",
- "nfts.collection.action.approve_other": "Aprubahan ang mga koleksyon",
- "nfts.collection.action.sign_one": "Listahan ng lagda",
- "nfts.collection.action.sign_other": "Mga listahan ng lagda",
- "nfts.marketplace.fees.deltaMax": "{{percentChanged}} max",
- "nfts.my": "Aking mga NFT",
- "nfts.noneYet": "Wala pang NFT",
- "nfts.sell": "Magbenta ng mga NFT",
- "nfts.viewAndSell": "Tingnan at ibenta ang mga NFT",
- "notFound.oops": "Oops, ibalik mo ako sa Swap",
- "notice.uk": "Ang web application na ito ay ibinigay bilang isang tool para sa mga user na makipag-ugnayan sa Uniswap Protocol sa kanilang sariling inisyatiba, nang walang pag-eendorso o rekomendasyon ng mga aktibidad sa pangangalakal ng cryptocurrency. Sa paggawa nito, hindi inirerekomenda ng Uniswap na ang mga user o potensyal na user ay makisali sa aktibidad ng kalakalan ng cryptoasset, at hindi dapat ituring ng mga user o potensyal na user ng web application ang webpage na ito o ang mga nilalaman nito bilang may kinalaman sa anumang anyo ng rekomendasyon, imbitasyon o panghihikayat na makipag-deal sa mga cryptoasset. .",
- "notice.uk.label": "disclaimer sa UK:",
- "notification.assetVisibility.hidden": "{{assetName}} nakatago",
- "notification.assetVisibility.unhidden": "{{assetName}} hindi nakatago",
- "notification.copied.address": "Nakopya ang address",
- "notification.copied.calldata": "Nakopya ang data ng tawag",
- "notification.copied.contractAddress": "Nakopya ang address ng kontrata",
- "notification.copied.failed": "Nabigong kopyahin sa clipboard",
- "notification.copied.image": "Nakopya ang larawan",
- "notification.copied.nftUrl": "Nakopya ang NFT URL",
- "notification.copied.tokenUrl": "Nakopya ang Token URL",
- "notification.copied.transactionId": "Nakopya ang Transaction ID",
- "notification.copied.unitag": "Nakopya ang username",
- "notification.countryChange": "Lumipat sa {{countryName}}",
- "notification.network.changed": "Lumipat sa {{network}}",
- "notification.passwordChanged": "Nabago ang password",
- "notification.restore.success": "Na-restore ang wallet!",
- "notification.send.network": "Ipinapadala sa {{network}}",
- "notification.spam.NFT.successful": "Iniulat",
- "notification.swap.network": "Nagpapalit sa {{network}}",
- "notification.swap.pending.swap": "Nakabinbin ang pagpapalit",
- "notification.swap.pending.unwrap": "Nakabinbin ang pag-unwrap",
- "notification.swap.pending.wrap": "Nakabinbin ang balutin",
- "notification.transaction.approve.canceled": "Kinansela {{currencySymbol}} aprubahan.",
- "notification.transaction.approve.fail": "Nabigong aprubahan ang {{currencySymbol}} para gamitin sa {{address}}.",
- "notification.transaction.approve.success": "Inaprubahan ang {{currencySymbol}} para gamitin sa {{address}}.",
- "notification.transaction.pending": "Nakabinbin ang transaksyon",
- "notification.transaction.swap.canceled": "Kinansela {{inputCurrencySymbol}}-{{outputCurrencySymbol}} palitan.",
- "notification.transaction.swap.expired": "{{inputCurrencyAmountWithSymbol}} para sa {{outputCurrencyAmountWithSymbol}} nag-expire na ang pagpapalit.",
- "notification.transaction.swap.fail": "Nabigong palitan ang {{inputCurrencyAmountWithSymbol}} para sa {{outputCurrencyAmountWithSymbol}}.",
- "notification.transaction.swap.success": "Pinalitan {{inputCurrencyAmountWithSymbol}} ng {{outputCurrencyAmountWithSymbol}}.",
- "notification.transaction.transfer.canceled": "Kinansela ang {{tokenNameOrAddress}} ipadala",
- "notification.transaction.transfer.fail": "Nabigong ipadala ang {{tokenNameOrAddress}} sa {{walletNameOrAddress}}",
- "notification.transaction.transfer.received": "Nakatanggap ng {{tokenNameOrAddress}} mula sa {{walletNameOrAddress}}",
- "notification.transaction.transfer.success": "Ipinadala ang {{tokenNameOrAddress}} sa {{walletNameOrAddress}}",
- "notification.transaction.unknown.fail.full": "Nabigong makipagtransaksyon sa {{addressOrEnsName}}",
- "notification.transaction.unknown.fail.short": "Nabigo ang transaksyon",
- "notification.transaction.unknown.success.full": "Nakipagtransaksyon sa {{addressOrEnsName}}",
- "notification.transaction.unknown.success.short": "Nakumpirma ang transaksyon",
- "notification.transaction.unwrap.canceled": "Kinansela ang {{inputCurrencySymbol}} i-unwrap.",
- "notification.transaction.unwrap.fail": "Nabigong i-unwrap {{inputCurrencyAmountWithSymbol}}.",
- "notification.transaction.unwrap.success": "Binuksan ang {{inputCurrencyAmountWithSymbol}} at natanggap {{outputCurrencyAmountWithSymbol}}.",
- "notification.transaction.wrap.canceled": "Kinansela ang {{inputCurrencySymbol}} wrap.",
- "notification.transaction.wrap.fail": "Nabigong i-wrap ang {{inputCurrencyAmountWithSymbol}}.",
- "notification.transaction.wrap.success": "Nakabalot {{inputCurrencyAmountWithSymbol}} at natanggap {{outputCurrencyAmountWithSymbol}}.",
- "notification.transfer.pending": "Nakabinbin ang ipadala",
- "notification.walletConnect.confirmed": "Nakumpirma ang transaksyon sa {{dappName}}",
- "notification.walletConnect.connected": "Nakakonekta",
- "notification.walletConnect.disconnected": "Nadiskonekta",
- "notification.walletConnect.failed": "Nabigo ang transaksyon sa {{dappName}}",
- "notification.walletConnect.networkChanged.full": "Lumipat sa {{networkName}}",
- "notification.walletConnect.networkChanged.short": "Lumipat ng mga network",
- "notifications.scantastic.subtitle": "Magpatuloy sa Uniswap Extension",
- "notifications.scantastic.title": "Tagumpay!",
- "onboarding.backup.manual.banner": "Iminumungkahi namin na isulat ito sa isang piraso ng papel at itago ito sa isang ligtas na lugar, tulad ng isang ligtas.",
- "onboarding.backup.manual.displayWarning.description": "Basahing mabuti ang sumusunod bago magpatuloy.",
- "onboarding.backup.manual.displayWarning.note.access": "Ang parirala sa pagbawi na ito ay nagbibigay sa iyo ng ganap na access sa iyong wallet at mga pondo",
- "onboarding.backup.manual.displayWarning.note.secure": "Tingnan ito nang pribado at huwag ibahagi ito sa sinuman",
- "onboarding.backup.manual.displayWarning.note.storage": "Isulat ito at itago sa isang ligtas na lugar",
- "onboarding.backup.manual.displayWarning.title": "Ilang mahahalagang bagay na dapat malaman",
- "onboarding.backup.manual.error": "Di-wasto o maling spelling ng salita",
- "onboarding.backup.manual.placeholder": "Lihim na salita",
- "onboarding.backup.manual.progress": "{{completedStepsCount}}/{{totalStepsCount}} natapos na",
- "onboarding.backup.manual.selectedWordPlaceholder": "Pumili ng salita",
- "onboarding.backup.manual.subtitle_one": "Ano ang {{count}}st word sa iyong recovery phrase?",
- "onboarding.backup.manual.subtitle_two": "Ano ang {{count}}nd na salita sa iyong parirala sa pagbawi?",
- "onboarding.backup.manual.subtitle_few": "Ano ang {{count}}rd word sa iyong recovery phrase?",
- "onboarding.backup.manual.subtitle_other": "Ano ang {{count}}th salita sa iyong recovery phrase?",
- "onboarding.backup.manual.title": "Siguraduhin natin na naitala mo ito nang tama",
- "onboarding.backup.option.badge.quick": "Mabilis",
- "onboarding.backup.option.cloud.description": "I-back up ang iyong wallet sa pamamagitan ng {{cloudProviderName}}, protektado ng password sa pagbawi.",
- "onboarding.backup.option.cloud.title": "Magtakda ng password sa pagbawi",
- "onboarding.backup.option.manual.description": "Itala ang iyong 12 lihim na salita sa isang piraso ng papel at itago ito sa isang ligtas na lugar.",
- "onboarding.backup.option.manual.title": "Isulat ang parirala sa pagbawi",
- "onboarding.backup.reminder.description": "Tinitiyak ng pag-back up ng iyong wallet na maaari mong mabawi anumang oras ang iyong mga asset kung sakaling mawala mo ang iyong telepono o makakuha ng bagong device.",
- "onboarding.backup.reminder.title": "Oras na para i-back up ang iyong wallet",
- "onboarding.backup.reminder.warning.description": "Kung hindi ka magse-set up ng paraan ng pag-backup, wala kang paraan para mabawi ang iyong wallet kung mawala mo ang iyong telepono, tanggalin ang app, o kumuha ng bagong device.",
- "onboarding.backup.reminder.warning.title": "Maaari mong mawala ang iyong mga pondo",
- "onboarding.backup.speedBump.cloud.description": "Kung sakaling makalimutan mo ito, hindi namin ito mai-reset para sa iyo. Isulat ito sa isang ligtas na lugar o iimbak ito nang ligtas sa isang tagapamahala ng password.",
- "onboarding.backup.speedBump.cloud.disclaimer": "Naiintindihan ko na hindi ma-reset ng Uniswap Labs ang aking password sa pagbawi.",
- "onboarding.backup.speedBump.cloud.title": "Mahalagang i-save ang password na ito",
- "onboarding.backup.speedBump.manual.description": "Tiyaking isinulat mo nang tama ang iyong parirala sa pagbawi at may ligtas na lugar para iimbak ito.",
- "onboarding.backup.speedBump.manual.disclaimer": "Naiintindihan ko na hindi mababawi ng Uniswap Labs ang aking wallet kung mawala ko ito.",
- "onboarding.backup.speedBump.manual.title": "Bago ka matapos...",
- "onboarding.backup.subtitle": "Ito ay kung paano mo mababawi ang iyong wallet kung tatanggalin mo ang app o mawala ang iyong device.",
- "onboarding.backup.title.existing": "I-back up ang iyong wallet",
- "onboarding.backup.title.new": "Piliin ang iyong paraan ng pag-backup",
- "onboarding.backup.view.disclaimer": "Naiintindihan ko na kung mawala ko ang aking parirala sa pagbawi, hindi ako matutulungan ng Uniswap Labs na ibalik ito.",
- "onboarding.backup.view.subtitle.message1": "Basahing mabuti ang sumusunod bago magpatuloy",
- "onboarding.backup.view.subtitle.message2": "Kakailanganin mong ilagay ang lahat ng 12 sa mga lihim na salitang ito upang mabawi ang iyong wallet.",
- "onboarding.backup.view.title": "Isulat ang iyong parirala sa pagbawi",
- "onboarding.backup.view.warning.message1": "Ang parirala sa pagbawi na ito ay nagbibigay sa iyo ng ganap na access sa iyong wallet at mga pondo",
- "onboarding.backup.view.warning.message2": "Isulat ito at itago sa isang ligtas na lugar",
- "onboarding.backup.view.warning.message3": "Panoorin ito nang pribado at huwag itong ibahagi kanino man",
- "onboarding.cloud.confirm.description": "Kakailanganin mong ilagay ito para mabawi ang iyong mga pondo. Kung sakaling makalimutan mo ito, hindi namin ito mababawi para sa iyo.",
- "onboarding.cloud.confirm.title": "Kumpirmahin ang iyong backup na password",
- "onboarding.cloud.createPassword.description": "Kakailanganin mong ilagay ito para mabawi ang iyong mga pondo. Kung sakaling makalimutan mo ito, hindi namin ito mababawi para sa iyo.",
- "onboarding.cloud.createPassword.title": "Lumikha ng iyong password sa pagbawi",
- "onboarding.complete.button": "Buksan ang Uniswap Extension",
- "onboarding.complete.description": "Ang iyong wallet ay handa nang magpadala at tumanggap ng crypto. Buksan ang Uniswap Extension gamit ang shortcut sa ibaba.",
- "onboarding.complete.go_to_uniswap": "Pumunta sa Uniswap Web App",
- "onboarding.complete.pin.description": "I-click ang icon ng pin upang magdagdag ng Uniswap Extension sa iyong toolbar.",
- "onboarding.complete.pin.title": "I-pin ang Uniswap Extension",
- "onboarding.complete.title": "Handa ka na",
- "onboarding.extension.password.subtitle": "Kakailanganin mo ito upang i-unlock ang iyong wallet at ma-access ang iyong parirala sa pagbawi",
- "onboarding.extension.password.title.default": "Lumikha ng password",
- "onboarding.extension.password.title.reset": "I-reset ang iyong password",
- "onboarding.extension.unsupported.android.description": "Ang Uniswap Extension ay katugma lamang sa Chrome sa desktop.",
- "onboarding.extension.unsupported.android.title": "Ang Chrome sa mobile ay hindi suportado (pa)",
- "onboarding.extension.unsupported.description": "Ang Uniswap Extension ay katugma lamang sa Chrome sa ngayon.",
- "onboarding.extension.unsupported.title": "Ang browser na ito ay hindi suportado (pa)",
- "onboarding.home.intro.backup.description": "Mag-set up ng plano sa pagbawi kung sakaling mawala ang iyong telepono o makakuha ng bago.",
- "onboarding.home.intro.backup.title": "I-back up ang iyong wallet",
- "onboarding.home.intro.fund.description": "Pondohan ang iyong wallet sa pamamagitan ng pagbili ng crypto o paglilipat mula sa ibang account.",
- "onboarding.home.intro.fund.title": "Kunin ang iyong unang token",
- "onboarding.home.intro.label.required": "Kinakailangan",
- "onboarding.home.intro.label.swipe": "Mag-swipe",
- "onboarding.home.intro.unitag.description": "Bumuo ng personalized na profile sa web3 at madaling ibahagi ang iyong address sa mga kaibigan.",
- "onboarding.home.intro.unitag.title": "I-claim ang iyong {{unitagDomain}} username",
- "onboarding.home.intro.welcome.description": "Tapusin ang pag-set up ng iyong wallet upang magsimulang magpalit sa ilang segundo.",
- "onboarding.home.intro.welcome.title": "Maligayang pagdating sa Uniswap",
- "onboarding.import.error.invalidWords_one": "1 salita ay hindi wasto o maling spelling",
- "onboarding.import.error.invalidWords_other": "{{count}} ang mga salita ay hindi wasto o maling spelling",
- "onboarding.import.method.import.message": "Ilagay ang iyong parirala sa pagbawi mula sa isa pang crypto wallet",
- "onboarding.import.method.import.title": "Mag-import ng wallet",
- "onboarding.import.method.restore.message.android": "Magdagdag ng mga wallet na na-back up mo sa iyong Google Drive account",
- "onboarding.import.method.restore.message.ios": "Magdagdag ng mga wallet na na-back up mo sa iyong iCloud account",
- "onboarding.import.method.restore.title": "Ibalik ang isang pitaka",
- "onboarding.import.onDeviceRecovery.other_options": "Gumawa o mag-import ng ibang wallet",
- "onboarding.import.onDeviceRecovery.other_options.label": "Hindi gusto ang alinman sa itaas?",
- "onboarding.import.onDeviceRecovery.subtitle": "Piliin kung aling wallet ang gusto mong mag-log in muli.",
- "onboarding.import.onDeviceRecovery.title": "Maligayang pagdating sa Uniswap",
- "onboarding.import.onDeviceRecovery.wallet.button": "Tingnan ang parirala sa pagbawi",
- "onboarding.import.onDeviceRecovery.wallet.count_one": "+1 pang wallet",
- "onboarding.import.onDeviceRecovery.wallet.count_other": "+{{count}} iba pang mga wallet",
- "onboarding.import.onDeviceRecovery.warning.caption": "Pakitiyak na na-back up mo ang lahat ng iba pang mga wallet. Kung sakaling gusto mong ibalik ang mga ito, kakailanganin mo ang kanilang mga parirala sa pagbawi o kaukulang mga backup ng iCloud.",
- "onboarding.import.onDeviceRecovery.warning.title": "Sigurado ka ba?",
- "onboarding.import.title": "Piliin kung paano mo gustong idagdag ang iyong wallet",
- "onboarding.importMnemonic.button.default": "Ang aking parirala sa pagbawi ay 12 salita",
- "onboarding.importMnemonic.button.importing": "Ini-import...",
- "onboarding.importMnemonic.button.longPhrase": "Ang aking parirala sa pagbawi ay mas mahaba",
- "onboarding.importMnemonic.error.invalidPhrase": "Ang pariralang iyong inilagay ay hindi wasto",
- "onboarding.importMnemonic.subtitle": "I-type o i-paste ang iyong 12-salitang parirala sa pagbawi",
- "onboarding.importMnemonic.title": "Ilagay ang iyong parirala sa pagbawi",
- "onboarding.intro.button.alreadyHave": "May wallet na ako",
- "onboarding.intro.mobileScan.button": "I-scan ang QR code para mag-import",
- "onboarding.intro.mobileScan.title": "Mayroon bang Uniswap app?",
- "onboarding.landing.button.add": "Magdagdag ng kasalukuyang wallet",
- "onboarding.landing.button.create": "Gumawa ng wallet",
- "onboarding.name.wallet.button.text": "Tapusin",
- "onboarding.name.wallet.subtitle": "Ikaw lang ang makakakita sa palayaw na ito",
- "onboarding.name.wallet.title": "Bigyan ng pangalan ang iyong wallet",
- "onboarding.notification.permission.message": "Para makatanggap ng mga notification, i-on ang mga notification para sa Uniswap Wallet sa mga setting ng iyong device.",
- "onboarding.notification.permission.title": "Pahintulot sa mga notification",
- "onboarding.notification.subtitle": "Maabisuhan kapag natapos na ang iyong mga paglilipat, pagpapalit, at pag-apruba.",
- "onboarding.notification.title": "I-on ang mga push notification",
- "onboarding.recoveryPhrase.confirm.subtitle.combined": "Kumpirmahin natin na nakuha mo ito nang tama. Kung nawala o naisulat mo ito nang hindi tama, hindi mo na mababawi ang iyong mga pondo.",
- "onboarding.recoveryPhrase.confirm.subtitle.default": "Kung nawala o naisulat mo ito nang hindi tama, hindi mo na mababawi ang iyong mga pondo.",
- "onboarding.recoveryPhrase.confirm.title": "Kumpirmahin natin na nakuha mo ito nang tama",
- "onboarding.recoveryPhrase.view.subtitle": "Kakailanganin mong ilagay ang lahat ng 12 sa mga lihim na salitang ito upang mabawi ang iyong wallet.",
- "onboarding.recoveryPhrase.view.title": "Isulat ang iyong parirala sa pagbawi",
- "onboarding.recoveryPhrase.view.title.hasPassword": "Kung sakaling makalimutan mo ang iyong password...",
- "onboarding.recoveryPhrase.warning.final.button": "handa na ako",
- "onboarding.recoveryPhrase.warning.final.message": "Ang iyong parirala sa pagbawi ang nagbibigay sa iyo (at sinumang mayroon nito) ng access sa iyong mga pondo. Siguraduhing itago ito sa iyong sarili.",
- "onboarding.recoveryPhrase.warning.final.title": "Gawin ang hakbang na ito sa isang pribadong lugar",
- "onboarding.recoveryPhrase.warning.screenshot.message": "Maaaring ma-access ng sinumang makakakuha ng access sa iyong mga larawan ang iyong wallet. Inirerekomenda namin na isulat mo ang iyong mga salita sa halip.",
- "onboarding.recoveryPhrase.warning.screenshot.title": "Hindi secure ang mga screenshot",
- "onboarding.resetPassword.complete.safety": "Matuto pa tungkol sa kaligtasan ng wallet",
- "onboarding.resetPassword.complete.subtitle": "Gamitin ang iyong bagong password para i-unlock ang iyong wallet.",
- "onboarding.resetPassword.complete.title": "Pag-reset ng password",
- "onboarding.scan.button": "Mag-scan gamit ang Uniswap app",
- "onboarding.scan.error": "Paumanhin, hindi namin ma-load ang QR code sa ngayon. Pakisubukan ang isa pang paraan ng onboarding.",
- "onboarding.scan.otp.error": "Ang code na iyong isinumite ay hindi tama, o nagkaroon ng error sa pagsusumite. Pakisubukang muli.",
- "onboarding.scan.otp.failed": "Mga nabigong pagtatangka: {{number}}",
- "onboarding.scan.otp.subtitle": "Tingnan ang iyong Uniswap mobile app para sa 6 na character na code",
- "onboarding.scan.otp.title": "Maglagay ng isang beses na code",
- "onboarding.scan.subtitle": "I-scan ang QR code gamit ang Uniswap mobile app upang simulan ang pag-import ng iyong wallet.",
- "onboarding.scan.title": "Mag-import ng wallet mula sa app",
- "onboarding.scan.wifi": "Ikonekta ang iyong telepono sa parehong WiFi network gaya ng iyong computer.",
- "onboarding.security.alert.biometrics.message.android": "Para gumamit ng biometrics, i-set up muna ito sa mga setting",
- "onboarding.security.alert.biometrics.message.ios": "Upang gamitin ang {{biometricsMethod}}, payagan ang pag-access sa mga setting ng system",
- "onboarding.security.alert.biometrics.title.android": "Naka-disable ang biometrics",
- "onboarding.security.alert.biometrics.title.ios": "{{biometricsMethod}} ay hindi pinagana",
- "onboarding.security.button.confirm.android": "Paganahin ang biometrics",
- "onboarding.security.button.confirm.ios": "Paganahin ang {{biometricsMethod}}",
- "onboarding.security.button.setup": "I-set up",
- "onboarding.security.subtitle.android": "Magdagdag ng karagdagang layer ng seguridad sa pamamagitan ng pag-aatas sa biometrics upang magpadala ng mga transaksyon.",
- "onboarding.security.subtitle.ios": "Magdagdag ng karagdagang layer ng seguridad sa pamamagitan ng pag-aatas sa {{biometricsMethod}} na magpadala ng mga transaksyon.",
- "onboarding.security.title": "Protektahan ang iyong pitaka",
- "onboarding.selectWallets.error": "Hindi ma-load ang mga address",
- "onboarding.selectWallets.title.default": "Pumili ng mga wallet na ii-import",
- "onboarding.selectWallets.title.error": "Error sa pag-import ng mga wallet",
- "onboarding.termsOfService": "Sa pagpapatuloy, sumasang-ayon ako sa Mga Tuntunin ng Serbisyo at pumayag sa Patakaran sa Privacy",
- "onboarding.tooltip.recoveryPhrase.trigger": "Ano ang parirala sa pagbawi?",
- "onboarding.wallet.continue": "Panatilihin natin itong ligtas",
- "onboarding.wallet.defaultName": "Wallet {{number}}",
- "onboarding.wallet.description.full": "Ito ang iyong personal na espasyo para sa mga token, NFT, at lahat ng iyong mga trade. Tapusin ang pag-set up nito para mapanatiling ligtas ang iyong mga pondo.",
- "onboarding.wallet.title": "Maligayang pagdating sa iyong bagong wallet",
- "outageBanner.message": "{{chainName}} {{versionDescription}} ang data ay hindi available sa ngayon, ngunit inaasahan naming maresolba ang isyu sa ilang sandali.",
- "outageBanner.message.sub": "Maaari ka pa ring magpalit at magbigay ng pagkatubig sa chain na ito nang walang isyu.",
- "outageBanner.title": "{{versionName}} ay babalik sa lalong madaling panahon",
- "permit.approval.fail": "Nabigo ang pag-apruba ng permit",
- "permit.approval.fail.message": "Pinapayagan ng Permit2 ang mga pag-apruba ng token na ibahagi at pamahalaan sa iba't ibang mga application.",
- "pool.accruedFees": "Tingnan ang mga naipon na bayarin at analytics",
- "pool.activePositions.appear": "Lalabas dito ang iyong mga aktibong posisyon sa pagkatubig ng V3.",
- "pool.activeRange": "Aktibong hanay ng tik",
- "pool.addLiquidity.seoTitle": "Magdagdag ng pagkatubig sa {{tokenPair}} ({{chain}}) sa Uniswap",
- "pool.addMoreLiquidity": "Magdagdag ng higit pang pagkatubig",
- "pool.apr": "APR",
- "pool.apr.description": "Annualized batay sa 1 araw na bayarin",
- "pool.areCreating": "Gumagawa ka ng pool",
- "pool.areFirst": "Ikaw ang unang tagapagbigay ng pagkatubig.",
- "pool.back": "Bumalik sa Pool",
- "pool.balances": "Mga balanse ng pool",
- "pool.claimFees": "Mga bayarin sa pag-claim",
- "pool.collectAs": "Kolektahin bilang {{nativeWrappedSymbol}}",
- "pool.collected": " Nakolekta",
- "pool.collecting": "Nangongolekta",
- "pool.collectingFees": "Mangolekta ng mga bayarin",
- "pool.collectingFeesWithdraw": "Ang pagkolekta ng mga bayarin ay mag-aalis ng kasalukuyang magagamit na mga bayarin para sa iyo.",
- "pool.confirmSupply": "Kumpirmahin ang supply",
- "pool.connection.networkUnsupported": "Ang iyong konektadong network ay hindi suportado.",
- "pool.create.pair": "Lumikha ng isang pares",
- "pool.createAndSupply": "Gumawa ng pool at supply",
- "pool.depositAmounts": "Mga halaga ng deposito",
- "pool.earnFees": "Sa pamamagitan ng pagdaragdag ng pagkatubig makakakuha ka ng 0.3% ng lahat ng mga trade sa pares na ito na proporsyonal sa iyong bahagi sa pool. Ang mga bayarin ay idinaragdag sa pool, maiipon sa real time at maaaring i-claim sa pamamagitan ng pag-withdraw ng iyong liquidity.",
- "pool.estimatePercentToRevert": "Tinatantya ang output. Kung magbago ang presyo ng higit sa {{allowed}}% ang iyong transaksyon ay babalik.",
- "pool.explorers": "Mga explorer",
- "pool.exporeAnalytics": "Galugarin ang Uniswap Analytics.",
- "pool.hideClosed": "Itago ang mga saradong posisyon",
- "pool.import": "Mag-import ng pool",
- "pool.import.v2": "Mag-import ng V2 pool",
- "pool.increaseLiquidity": "Dagdagan ang pagkatubig",
- "pool.initialShare": "Mga paunang presyo at bahagi ng pool",
- "pool.learn": "Matuto",
- "pool.learnAbout": "Magbasa pa tungkol sa pagbibigay ng pagkatubig",
- "pool.learnLiquidity": "Matuto tungkol sa pagbibigay ng pagkatubig",
- "pool.learnv3LP": "Tingnan ang aming v3 LP walkthrough at mga gabay sa paglilipat.",
- "pool.limitFluctuation.warning": "Mangyaring magkaroon ng kamalayan na ang pagpapatupad para sa mga limitasyon ay maaaring mag-iba batay sa real-time na mga pagbabago sa merkado at pagsisikip ng Ethereum network. Maaaring hindi maisagawa ang mga limitasyon nang eksakto kapag naabot ng mga token ang tinukoy na presyo.",
- "pool.liquidity.connectToAdd": "Kumonekta sa isang wallet upang tingnan ang iyong pagkatubig.",
- "pool.liquidity.earn.fee": "Ang mga provider ng liquidity ay nakakakuha ng 0.3% na bayad sa lahat ng mga trade na proporsyonal sa kanilang bahagi sa pool. Ang mga bayarin ay idinaragdag sa pool, maiipon sa real time at maaaring i-claim sa pamamagitan ng pag-withdraw ng iyong liquidity.",
- "pool.liquidity.outOfSync": "Hindi naka-sync ang pool",
- "pool.liquidity.outOfSync.message": "Ang pool na ito ay wala sa sync sa mga presyo sa merkado. Ang pagdaragdag ng pagkatubig sa mga iminungkahing ratio ay maaaring magresulta sa pagkawala ng mga pondo.",
- "pool.liquidity.ownershipWarning.message": "Hindi ikaw ang may-ari nitong posisyon sa LP. Hindi mo maaalis ang pagkatubig mula sa posisyong ito maliban kung pagmamay-ari mo ang sumusunod na address: {{ownerAddress}}",
- "pool.liquidity.rewards": "Mga reward sa provider ng liquidity",
- "pool.liquidity.taxWarning": "Mga buwis sa token",
- "pool.liquidity.taxWarning.message": "Ang isa o higit pa sa mga token na ito ay may mga buwis sa mga paglilipat. Ang pagdaragdag ng pagkatubig sa V3 ay maaaring magresulta sa pagkawala ng mga pondo. Subukang gamitin ang V2 sa halip.",
- "pool.liquidityPoolFeesNotice": "Kapag nagdagdag ka ng pagkatubig, makakatanggap ka ng mga token ng pool na kumakatawan sa iyong posisyon. Ang mga token na ito ay awtomatikong kumikita ng mga bayarin na proporsyonal sa iyong bahagi sa pool, at maaaring ma-redeem anumang oras.",
- "pool.manageRewardsLiquidity": "Pamahalaan ang pagkatubig sa pool ng mga reward",
- "pool.max.label": "Max:",
- "pool.maxPrice": "Pinakamataas na presyo",
- "pool.min.label": "Min:",
- "pool.minPrice": "Min na presyo",
- "pool.mustBeInitialized": "Dapat masimulan ang pool na ito bago ka makapagdagdag ng liquidity. Upang magsimula, pumili ng panimulang presyo para sa pool. Pagkatapos, ilagay ang iyong hanay ng presyo ng pagkatubig at halaga ng deposito. Ang mga bayarin sa gas ay mas mataas kaysa karaniwan dahil sa transaksyon sa pagsisimula.",
- "pool.newPosition.plus": "+ Bagong posisyon",
- "pool.noLiquidity": "Walang nakitang pagkatubig.",
- "pool.onceHappyReview": "Kapag nasiyahan ka na sa supply ng rate click upang suriin.",
- "pool.openToStart": "Magbukas ng bagong posisyon o lumikha ng pool para makapagsimula.",
- "pool.owner": "May-ari",
- "pool.percent": "{{pct}}% pool",
- "pool.pooled": "Pinagsama-sama {{sym}}:",
- "pool.position.100": "Ang iyong posisyon ay magiging 100% sa presyong ito.",
- "pool.position.100.at": "Ang iyong posisyon ay magiging 100% {{symbol}} sa presyong ito.",
- "pool.position.networkConnect": "Upang tingnan ang isang posisyon, dapat ay konektado ka sa network na kinabibilangan nito.",
- "pool.position.willBe100": "Ang iyong posisyon ay magiging 100% na binubuo ng {{sym}} sa presyong ito",
- "pool.positions": "Mga posisyon",
- "pool.positions.title": "Ang iyong mga posisyon",
- "pool.priceRange": "Saklaw ng presyo",
- "pool.rangeBadge.tooltip.outsideRange": "Ang presyo ng pool na ito ay wala sa iyong napiling hanay. Ang iyong posisyon ay kasalukuyang hindi kumikita ng mga bayarin.",
- "pool.rangeBadge.tooltip.text": "Ang iyong posisyon ay may 0 pagkatubig, at hindi kumikita ng mga bayarin.",
- "pool.rangeBadge.tooltip.withinRange": "Ang presyo ng pool na ito ay nasa loob ng iyong napiling hanay. Ang iyong posisyon ay kasalukuyang kumikita ng mga bayarin.",
- "pool.rates": "Mga rate",
- "pool.ratioTokenToPrice": "Ang ratio ng mga token na iyong idaragdag ay magtatakda ng presyo ng pool na ito.",
- "pool.removeLiquidity": "Alisin ang pagkatubig",
- "pool.rewardsPool.label": "Mga pool token sa rewards pool:",
- "pool.selectedRange": "Napiling hanay",
- "pool.selectPair": "Pumili ng pares",
- "pool.share": "Mga presyo at bahagi ng pool",
- "pool.share.label": "Ang iyong bahagi sa pool:",
- "pool.shareOf": "Bahagi ng Pool:",
- "pool.showClosed": "Ipakita ang mga saradong posisyon",
- "pool.specificPosition": "{{symbol}} posisyon",
- "pool.startingPrice": "Simula {{sym}} Presyo:",
- "pool.supply": "Supply",
- "pool.supplyingMaths": "Nagbibigay ng {{amtA}} {{symA}} at {{amtB}} {{symB}}",
- "pool.tokenPair": "Pares ng token",
- "pool.top": "Mga nangungunang pool",
- "pool.totalTokens": "Ang iyong kabuuang pool token:",
- "pool.unclaimedFees": "Mga hindi na-claim na bayad",
- "pool.v2": "v2 pool",
- "pool.v2.add": "Magdagdag ng V2 liquidity",
- "pool.v2.migratev3": "I-migrate ang liquidity sa V3",
- "pool.v2liquidity": "V2 pagkatubig",
- "pool.v3": "v3 pool",
- "pool.v4": "v4 na pool",
- "pool.volOverTvl": "1D vol/TVL",
- "pool.volume.sevenDay": "7 araw na dami",
- "pool.volume.sevenDay.short": "7D vol",
- "pool.yourBalances": "Ang iyong mga balanse",
- "pool.yourv2": "Ang iyong V2 liquidity",
- "poolFinder.connect": "Kumonekta sa isang wallet para maghanap ng mga pool.",
- "poolFinder.create": "Lumikha ng pool",
- "poolFinder.found": "Natagpuan ang pool!",
- "poolFinder.managePool": "Pamahalaan ang pool na ito",
- "poolFinder.noLiquidity": "Wala ka pang liquidity sa pool na ito.",
- "poolFinder.noPoolFound": "Walang nakitang pool.",
- "poolFinder.selectToken": "Pumili ng token para mahanap ang iyong v2 liquidity.",
- "poolFinder.tip": "Tip: Gamitin ang tool na ito upang maghanap ng mga v2 pool na hindi awtomatikong lumalabas sa interface.",
- "pools.approving.amount": "Inaprubahan ang {{amount}}",
- "position.addHook": "Magdagdag ng Hook",
- "position.appearHere": "Ang iyong posisyon ay lilitaw dito.",
- "position.currentValue": "Kasalukuyang halaga ng posisyon",
- "position.depositedCurrency": "Na-deposito {{currencySymbol}}",
- "position.migrate.liquidity": "Kapag naglilipat ng mga posisyon, hindi mo mababago ang iyong pares ng token, ngunit maaari kang magdagdag ng hook upang mapahusay ang pagpapagana.",
- "position.new": "Bagong Posisyon",
- "position.new.protocol": "Bago {{protocol}} Posisyon",
- "position.noLiquidity": "Hindi available ang data ng liquidity.",
- "position.noLiquidityData": "Walang data ng pagkatubig.",
- "position.protocol": "{{protocol}} posisyon",
- "position.provide.liquidity": "Piliin ang mga token na gusto mong bigyan ng pagkatubig. Maaari kang pumili ng mga token sa lahat ng sinusuportahang network.",
- "position.provide.liquidityDescription": "Ang pagbibigay ng buong saklaw na pagkatubig ay nagsisiguro ng tuluy-tuloy na partisipasyon sa merkado sa lahat ng posibleng presyo, na nag-aalok ng pagiging simple ngunit may potensyal para sa mas mataas na hindi permanenteng pagkawala.",
- "position.selectRange": "Pumili ng hanay ng presyo",
- "position.stats.feeApr": "Bayad sa APR",
- "position.stats.totalApr": "Kabuuang APR",
- "position.step.deposit": "Ipasok ang mga halaga ng deposito",
- "position.step.range": "Itakda ang hanay ng presyo",
- "position.step.select": "Pumili ng pares ng token at mga bayarin",
- "position.your": "Ang iyong posisyon",
- "privacy.anonymizedLogs": "Ang app ay nag-log ng hindi kilalang mga istatistika ng paggamit upang mapabuti sa paglipas ng panahon.",
- "privacy.autoRouter": "Kinukuha ng app ang pinakamainam na ruta ng kalakalan mula sa isang server ng Uniswap Labs.",
- "privacy.infura": "Kinukuha ng app ang on-chain na data at gumagawa ng mga contract call gamit ang Infura API.",
- "privacy.thirdPartyApis": "Ginagamit ng app na ito ang mga sumusunod na third-party na API:",
- "privacy.trm": "Ligtas na kinokolekta ng app ang iyong wallet address at ibinabahagi ito sa TRM Labs Inc. para sa panganib at mga dahilan ng pagsunod.",
- "privacy.uniswaptos": "Mga Tuntunin ng Serbisyo ng Uniswap Labs",
- "qrScanner.button.connections_one": "Nakakonekta ang 1 app",
- "qrScanner.button.connections_other": "{{count}} nakakonekta ang mga app",
- "qrScanner.error.camera.message": "Para mag-scan ng code, payagan ang Camera access sa mga setting ng system",
- "qrScanner.error.camera.title": "Naka-disable ang camera",
- "qrScanner.error.none": "Walang nakitang QR code",
- "qrScanner.recipient.action.scan": "Mag-scan ng QR code",
- "qrScanner.recipient.action.show": "Ipakita ang aking QR code",
- "qrScanner.recipient.error.message": "Tiyaking nag-i-scan ka ng wastong Ethereum address na QR code bago subukang muli.",
- "qrScanner.recipient.error.title": "Di-wastong QR Code",
- "qrScanner.request.message.unavailable": "Walang nakitang mensahe.",
- "qrScanner.request.method.default": "Kahilingan mula sa {{dappNameOrUrl}}",
- "qrScanner.request.method.signature": "Hiling ng lagda mula sa {{dappNameOrUrl}}",
- "qrScanner.request.method.transaction": "Kahilingan sa transaksyon mula sa {{dappNameOrUrl}}",
- "qrScanner.request.withAmount": "Payagan ang {{dappName}} na gumamit ng hanggang {{amount}} {{currencySymbol}}?",
- "qrScanner.request.withoutAmount": "Payagan ang {{dappName}} na gamitin ang iyong {{currencySymbol}}?",
- "qrScanner.status.connecting": "Kumokonekta...",
- "qrScanner.status.loading": "Naglo-load...",
- "qrScanner.title": "Mag-scan ng QR code",
- "qrScanner.wallet.title": "Maaari kang makatanggap ng mga token at NFT sa Ethereum, Polygon, Arbitrum, Optimism, Base, ZKsync, Zora, Avalanche, Celo, Blast, at BNB Chain.",
- "removeLiquidity.collectFees": "Mangongolekta ka rin ng mga bayad na nakuha mula sa posisyong ito.",
- "removeLiquidity.outputEstimated": "Tinatantya ang output. Kung magbago ang presyo ng higit sa {{allowed}}% ang iyong transaksyon ay babalik.",
- "removeLiquidity.pendingText": "Tinatanggal ang {{amtA}} {{symA}} at {{amtB}} {{symB}}",
- "removeLiquidity.pooled": "Pinagsama-sama {{symbol}}:",
- "removeLiquidity.removing": "Tinatanggal ang {{amt1}} {{symbol1}} at {{amt2}} {{symbol2}}",
- "removeLiquidity.removingTokensTip": "Tip: Ang pag-alis ng mga token ng pool ay nagko-convert sa iyong posisyon pabalik sa pinagbabatayan na mga token sa kasalukuyang rate, proporsyonal sa iyong bahagi sa pool. Ang mga naipon na bayarin ay kasama sa mga halagang natatanggap mo.",
- "removeLiquidity.uniBurned": "UNI {{a}}/{{b}} Nasunog",
- "routing.aggregateLiquidity": "Kapag available, pinagsasama-sama ang mga mapagkukunan ng pagkatubig para sa mas magandang presyo at mga palitan ng libreng gas.",
- "routing.cheapest": "Pinipili ng Uniswap client ang pinakamurang trade option factoring price at mga gastos sa network.",
- "scantastic.code.expired": "Nag-expire na",
- "scantastic.code.subtitle": "Ilagay ang code na ito sa Uniswap Extension. Ang iyong parirala sa pagbawi ay ligtas na mai-encrypt at ililipat.",
- "scantastic.code.timeRemaining.shorthand.hours": "Bagong code sa {{hours}}h {{minutes}}m {{seconds}}s",
- "scantastic.code.timeRemaining.shorthand.minutes": "Bagong code sa {{minutes}}m {{seconds}}s",
- "scantastic.code.timeRemaining.shorthand.seconds": "Bagong code sa {{seconds}}s",
- "scantastic.code.title": "Uniswap isang beses na code",
- "scantastic.confirmation.button.continue": "Oo, magpatuloy",
- "scantastic.confirmation.label.browser": "Browser",
- "scantastic.confirmation.label.device": "Device",
- "scantastic.confirmation.subtitle": "Magpatuloy lang kung nag-scan ka ng QR code mula sa Uniswap Extension sa isang pinagkakatiwalaang device.",
- "scantastic.confirmation.title": "Sinusubukan mo bang i-import ang iyong wallet?",
- "scantastic.confirmation.warning": "Mag-ingat sa mga site at app na nagpapanggap bilang Uniswap. Kung hindi, maaaring makompromiso ang iyong wallet.",
- "scantastic.error.encryption": "Nabigong maghanda ng seed phrase.",
- "scantastic.error.noCode": "Walang natanggap na OTP. Pakisubukang muli.",
- "scantastic.error.timeout.message": "I-scan muli ang QR code sa Uniswap Extension para ipagpatuloy ang pag-sync ng iyong wallet.",
- "scantastic.error.timeout.title": "Nag-time out ang iyong koneksyon",
- "scantastic.modal.ipMismatch.description": "Upang i-scan ang QR code na ito, dapat na nakakonekta ang iyong telepono sa parehong WiFi network gaya ng iyong computer at dapat na pansamantalang i-off ang anumang VPN.",
- "scantastic.modal.ipMismatch.title": "Ilipat ang iyong WiFi network",
- "search.chainComing": "Paparating na: maghanap at mag-explore ng mga token sa {{chainName}} Chain",
- "search.results.count_one": "1 aytem",
- "search.results.count_other": "{{count}} item",
- "search.ukDisclaimer": "Disclaimer para sa mga residente ng UK",
- "send.button.review": "Suriin ang paglipat",
- "send.gas.error.title": "N/A",
- "send.gas.networkCost.title": "Gastos sa network",
- "send.input.token.balance.title": "Balanse: {{balance}} {{symbol}}",
- "send.recipient.header": "Pumili ng tatanggap",
- "send.recipient.input.placeholder": "Maghanap sa ENS o address",
- "send.recipient.previous_one": "1 nakaraang paglipat",
- "send.recipient.previous_other": "{{count}} mga nakaraang paglilipat",
- "send.recipient.results.empty": "Walang nakitang resulta",
- "send.recipient.results.error": "Ang address na iyong na-type ay maaaring wala o mali ang spelling.",
- "send.recipient.section.favorite": "Mga paboritong wallet",
- "send.recipient.section.recent": "Kamakailan",
- "send.recipient.section.search": "Mga resulta ng paghahanap",
- "send.recipient.section.viewOnly": "Mga view-only na wallet",
- "send.recipient.section.yours": "Iyong mga wallet",
- "send.recipient.warning.viewOnly.message": "Magpadala lamang ng mga pondo sa wallet na ito kung mayroon kang recovery phrase o kilala mo ang may-ari ng wallet.",
- "send.recipient.warning.viewOnly.title": "Mayroon ka nito bilang isang view-only na wallet",
- "send.recipientSelect.search.empty.message": "Kapag nagpadala ka ng mga token sa isang wallet address, lalabas ang mga ito dito",
- "send.recipientSelect.search.empty.title": "Walang na-save na wallet",
- "send.review.modal.title": "Nagpapadala ka",
- "send.review.summary.button.title": "Kumpirmahin ang pagpapadala",
- "send.search.empty.subtitle": "Ang address na iyong na-type ay maaaring wala o mali ang spelling.",
- "send.search.empty.title": "Walang nakitang resulta",
- "send.search.placeholder": "Maghanap sa ENS o address",
- "send.title": "Ipadala",
- "send.warning.blocked.default": "Naka-block ang wallet na ito",
- "send.warning.blocked.modal.message": "Naka-block ang address na ito sa Uniswap Wallet dahil nauugnay ito sa isa o higit pang mga naka-block na aktibidad. Kung naniniwala kang isa itong error, mangyaring mag-email sa compliance@uniswap.org.",
- "send.warning.blocked.modal.title": "Naka-block na address",
- "send.warning.blocked.recipient": "Naka-block ang wallet ng tatanggap",
- "send.warning.erc20.message": "Sinusubukan mong magpadala ng mga pondo sa isang token address. Ang pagpapadala ng crypto sa ganitong uri ng address ay maaaring magresulta sa isang permanenteng pagkawala ng mga pondo.",
- "send.warning.erc20.title": "Ito ay isang token address",
- "send.warning.insufficientFunds.message": "Bumaba ang iyong {{currencySymbol}} balanse mula nang ilagay mo ang halagang gusto mong ipadala",
- "send.warning.insufficientFunds.title": "Hindi sapat {{currencySymbol}}",
- "send.warning.insufficientGas.message.withNetwork": "Hindi sapat {{currencySymbol}} sa {{networkName}} para ipadala",
- "send.warning.insufficientGas.message.withoutNetwork": "Hindi sapat {{currencySymbol}} para ipadala",
- "send.warning.modal.button.cta.blocking": "OK",
- "send.warning.modal.button.cta.cancel": "Kanselahin",
- "send.warning.modal.button.cta.confirm": "Kumpirmahin",
- "send.warning.newAddress.details.ENS": "ENS",
- "send.warning.newAddress.details.username": "Username",
- "send.warning.newAddress.details.walletAddress": "Address ng Wallet",
- "send.warning.newAddress.message": "Hindi ka pa nakakatransact sa address na ito dati. Pakikumpirma na ang address ay tama bago magpatuloy.",
- "send.warning.newAddress.title": "Bagong address",
- "send.warning.restore": "Ibalik ang iyong wallet para ipadala",
- "send.warning.self.message": "Sinusubukan mong magpadala ng mga pondo sa iyong kasalukuyang wallet. Ang pagpapadala ng crypto sa address na ito ay magkakaroon ng mga hindi kinakailangang gastos sa network.",
- "send.warning.self.title": "Ito ang iyong kasalukuyang wallet",
- "send.warning.smartContract.message": "Magpapadala ka na ng mga token sa isang espesyal na uri ng address—isang matalinong kontrata. I-double check kung ito ang address na balak mong ipadala. Kung mali, maaaring mawala nang tuluyan ang iyong mga token.",
- "send.warning.smartContract.title": "Ito ba ay isang wallet address?",
- "send.warning.viewOnly.message": "Kailangan mong i-import ang wallet na ito sa pamamagitan ng recovery phrase para magpadala ng mga asset.",
- "send.warning.viewOnly.title": "Ang wallet na ito ay view-only",
- "sendRecipientForm.recentAddresses.label": "Recents",
- "sendReviewModal.title": "Pagpapadala ng pagsusuri",
- "setting.recoveryPhrase.account.show": "Ipakita ang parirala sa pagbawi",
- "setting.recoveryPhrase.action.hide": "Itago ang parirala sa pagbawi",
- "setting.recoveryPhrase.remove": "Alisin ang parirala sa pagbawi",
- "setting.recoveryPhrase.remove.confirm.subtitle": "Naiintindihan ko na hindi ako matutulungan ng Uniswap Labs na mabawi ang aking wallet kung nabigo akong gawin ito.",
- "setting.recoveryPhrase.remove.confirm.title": "Nai-save ko ang aking parirala sa pagbawi",
- "setting.recoveryPhrase.remove.initial.subtitle": "Tiyaking na-save mo ang iyong parirala sa pagbawi. Mawawalan ka ng access sa iyong mga wallet kung hindi man",
- "setting.recoveryPhrase.remove.initial.title": "Bago ka magpatuloy",
- "setting.recoveryPhrase.remove.password.error": "Maling password. Subukan muli",
- "setting.recoveryPhrase.remove.subtitle": "Ilagay ang iyong password para kumpirmahin",
- "setting.recoveryPhrase.remove.title": "Inaalis mo ang iyong parirala sa pagbawi",
- "setting.recoveryPhrase.view.warning.message1": "Maaaring ma-access ng sinumang nakakaalam ng iyong parirala sa pagbawi ang iyong wallet at mga pondo",
- "setting.recoveryPhrase.view.warning.message2": "Tingnan ito nang pribado",
- "setting.recoveryPhrase.view.warning.message3": "Huwag ibahagi sa sinuman",
- "setting.recoveryPhrase.view.warning.message4": "Huwag kailanman ipasok ito sa anumang mga website o application",
- "setting.recoveryPhrase.view.warning.title": "Bago ka magpatuloy",
- "setting.recoveryPhrase.warning.screenshot.message": "Maaaring ma-access ng sinumang makakakuha ng access sa iyong mga larawan ang iyong wallet. Inirerekomenda namin na isulat mo ang iyong mga salita sa halip.",
- "setting.recoveryPhrase.warning.screenshot.title": "Hindi secure ang mga screenshot",
- "setting.recoveryPhrase.warning.view.message": "Maaaring ma-access ng sinumang nakakaalam ng iyong parirala sa pagbawi ang iyong wallet at mga pondo.",
- "setting.recoveryPhrase.warning.view.title": "Tingnan ito sa isang pribadong lugar",
- "settings.action.feedback": "Magbahagi ng feedback",
- "settings.action.help": "Humingi ng tulong",
- "settings.action.lock": "I-lock ang wallet",
- "settings.action.privacy": "Patakaran sa privacy",
- "settings.action.terms": "Mga tuntunin ng serbisyo",
- "settings.footer": "Ginawa nang may pagmamahal, \nUniswap Team 🦄",
- "settings.hideSmallBalances": "Itago ang maliliit na balanse",
- "settings.maxSlippage": "Max. pagkadulas",
- "settings.screen.appearance.title": "Hitsura",
- "settings.section.about": "Tungkol sa",
- "settings.section.preferences": "Mga Kagustuhan",
- "settings.section.security": "Seguridad",
- "settings.section.support": "Suporta",
- "settings.section.wallet.button.viewAll": "Tingnan lahat",
- "settings.section.wallet.button.viewLess": "Tingnan ang mas kaunti",
- "settings.section.wallet.label.viewOnly": "View-only",
- "settings.section.wallet.title": "Mga setting ng pitaka",
- "settings.setting.appearance.option.auto": "Auto",
- "settings.setting.appearance.option.dark.subtitle": "Laging gumamit ng dark mode",
- "settings.setting.appearance.option.dark.title": "Dark mode",
- "settings.setting.appearance.option.device.subtitle": "Default sa hitsura ng iyong device",
- "settings.setting.appearance.option.device.title": "Mga setting ng device",
- "settings.setting.appearance.option.light.subtitle": "Laging gumamit ng light mode",
- "settings.setting.appearance.option.light.title": "Light mode",
- "settings.setting.appearance.title": "Hitsura",
- "settings.setting.backup.create.description": "Ie-encrypt ng pagtatakda ng password ang iyong backup na parirala sa pagbawi, na magdaragdag ng karagdagang antas ng proteksyon kung ang iyong {{cloudProviderName}} account ay makompromiso.",
- "settings.setting.backup.create.title": "I-back up sa {{cloudProviderName}}",
- "settings.setting.backup.delete.confirm.message": "Dahil nagbabahagi ang mga wallet na ito ng parirala sa pagbawi, tatanggalin din nito ang mga backup para sa mga wallet na ito sa ibaba",
- "settings.setting.backup.delete.confirm.title": "Sigurado ka ba?",
- "settings.setting.backup.delete.warning": "Kung ide-delete mo ang iyong {{cloudProviderName}} backup, mare-recover mo lang ang iyong wallet gamit ang manual backup ng iyong recovery phrase. Hindi mababawi ng Uniswap Labs ang iyong mga asset kung mawala mo ang iyong parirala sa pagbawi.",
- "settings.setting.backup.error.message.full": "Hindi ma-backup ang parirala sa pagbawi sa {{cloudProviderName}}. Pakitiyak na pinagana mo ang {{cloudProviderName}} na may available na espasyo sa imbakan at subukang muli.",
- "settings.setting.backup.error.message.short": "Hindi matanggal ang backup",
- "settings.setting.backup.error.title": "{{cloudProviderName}} error",
- "settings.setting.backup.modal.description": "Hindi mo pa naba-back up ang iyong parirala sa pagbawi sa {{cloudProviderName}} . Sa paggawa nito, mababawi mo ang iyong wallet sa pamamagitan lamang ng pag-log in sa {{cloudProviderName}} sa anumang device.",
- "settings.setting.backup.modal.title": "I-back up ang parirala sa pagbawi sa {{cloudProviderName}}?",
- "settings.setting.backup.password.error.mismatch": "Hindi tugma ang mga password",
- "settings.setting.backup.password.medium": "Ito ay isang katamtamang password",
- "settings.setting.backup.password.placeholder.confirm": "Kumpirmahin ang password",
- "settings.setting.backup.password.placeholder.create": "Lumikha ng password",
- "settings.setting.backup.password.strong": "Ito ay isang malakas na password",
- "settings.setting.backup.password.weak": "Ito ay isang mahinang password",
- "settings.setting.backup.recoveryPhrase.label": "Parirala sa pagbawi",
- "settings.setting.backup.selected": "{{cloudProviderName}} backup",
- "settings.setting.backup.status.action.delete": "Tanggalin ang backup",
- "settings.setting.backup.status.complete": "Na-back up sa {{cloudProviderName}}",
- "settings.setting.backup.status.description": "Sa pamamagitan ng pag-back up sa iyong parirala sa pagbawi sa {{cloudProviderName}}, maaari mong mabawi ang iyong wallet sa pamamagitan lamang ng pag-log in sa iyong {{cloudProviderName}} account sa anumang device.",
- "settings.setting.backup.status.inProgress": "Bina-back up sa {{cloudProviderName}}...",
- "settings.setting.backup.status.recoveryPhrase.backed": "Naka-back up",
- "settings.setting.backup.status.title": "{{cloudProviderName}} backup",
- "settings.setting.beta.tooltip": "Malapit na",
- "settings.setting.biometrics.appAccess.subtitle.android": "Mangangailangan ng biometrics para buksan ang app",
- "settings.setting.biometrics.appAccess.subtitle.ios": "Kinakailangan {{biometricsMethod}} upang buksan ang app",
- "settings.setting.biometrics.appAccess.title": "Access sa app",
- "settings.setting.biometrics.auth": "Paki-authenticate",
- "settings.setting.biometrics.off.message.android": "Kasalukuyang naka-off ang Biometrics para sa Uniswap Wallet—maaari mo itong i-on sa mga setting ng iyong system.",
- "settings.setting.biometrics.off.message.ios": "Ang {{biometricsMethod}} ay kasalukuyang naka-off para sa Uniswap Wallet—maaari mo itong i-on sa mga setting ng iyong system.",
- "settings.setting.biometrics.off.title.android": "Naka-off ang biometrics",
- "settings.setting.biometrics.off.title.ios": "Naka-off ang {{biometricsMethod}}",
- "settings.setting.biometrics.title": "Biometrics",
- "settings.setting.biometrics.transactions.subtitle.android": "Mangangailangan ng biometrics para makapagtransaksyon",
- "settings.setting.biometrics.transactions.subtitle.ios": "Atasan ang {{biometricsMethod}} para makipagtransaksyon",
- "settings.setting.biometrics.transactions.title": "Mga transaksyon",
- "settings.setting.biometrics.unavailable.message.android": "Hindi naka-setup ang biometrics sa iyong device. Para gumamit ng biometrics, i-set up muna ito sa Mga Setting.",
- "settings.setting.biometrics.unavailable.message.ios": "Hindi naka-setup ang {{biometricsMethod}} sa iyong device. Upang gamitin ang {{biometricsMethod}}, i-set up muna ito sa Mga Setting.",
- "settings.setting.biometrics.unavailable.title.android": "Hindi naka-setup ang biometrics",
- "settings.setting.biometrics.unavailable.title.ios": "{{biometricsMethod}} ay hindi naka-setup",
- "settings.setting.biometrics.warning.message.android": "Kung hindi mo io-on ang biometrics, maaaring magbukas ng Uniswap Wallet ang sinumang magkakaroon ng access sa iyong device at gumawa ng mga transaksyon.",
- "settings.setting.biometrics.warning.message.ios": "Kung hindi mo i-on ang {{biometricsMethod}}, sinumang magkakaroon ng access sa iyong device ay maaaring magbukas ng Uniswap Wallet at gumawa ng mga transaksyon.",
- "settings.setting.biometrics.warning.title": "Sigurado ka ba?",
- "settings.setting.connections.disconnectAll": "Idiskonekta ang lahat",
- "settings.setting.connections.noConnectionsDescription": "Kumonekta sa isang app sa pamamagitan ng paghahanap ng \"Connect Wallet\" o \"Log in\" na button.",
- "settings.setting.currency.title": "Lokal na pera",
- "settings.setting.hapticTouch.title": "Haptic touch",
- "settings.setting.helpCenter.title": "Help center",
- "settings.setting.language.button.navigate": "Pumunta sa mga setting",
- "settings.setting.language.description.extension": "Nagde-default ang Uniswap sa mga setting ng wika ng iyong system. Upang baguhin ang iyong gustong wika, pumunta sa mga setting ng iyong system.",
- "settings.setting.language.description.mobile": "Nagde-default ang Uniswap sa mga setting ng wika ng iyong device. Para baguhin ang gusto mong wika, pumunta sa “Uniswap” sa mga setting ng iyong device at mag-tap sa “Wika”.",
- "settings.setting.language.title": "Wika",
- "settings.setting.password.title": "Baguhin ang password",
- "settings.setting.privacy.analytics.description": "Gumagamit kami ng hindi kilalang data ng paggamit upang mapahusay ang iyong karanasan sa mga produkto ng Uniswap Labs. Kapag hindi pinagana, sinusubaybayan lang namin ang mga error at mahahalagang paggamit.",
- "settings.setting.privacy.analytics.title": "Payagan ang analytics",
- "settings.setting.privacy.title": "Pagkapribado",
- "settings.setting.recoveryPhrase.password.title": "Ipasok ang iyong password",
- "settings.setting.recoveryPhrase.title": "Parirala sa pagbawi",
- "settings.setting.smallBalances.title": "Itago ang maliliit na balanse",
- "settings.setting.unknownTokens.title": "Itago ang mga hindi kilalang token",
- "settings.setting.wallet.action.editLabel": "I-edit ang label",
- "settings.setting.wallet.action.editProfile": "I-edit ang profile",
- "settings.setting.wallet.action.remove": "Alisin ang wallet",
- "settings.setting.wallet.connections.title": "Pamahalaan ang mga koneksyon",
- "settings.setting.wallet.editLabel.description": "Ang mga label ay hindi pampubliko. Lokal na nakaimbak ang mga ito at ikaw lang ang makakakita.",
- "settings.setting.wallet.editLabel.save": "I-save ang mga pagbabago",
- "settings.setting.wallet.label": "palayaw",
- "settings.setting.wallet.notifications.title": "Mga abiso",
- "settings.setting.wallet.preferences.title": "Mga kagustuhan sa pitaka",
- "settings.showTestNets": "Ipakita ang mga testnet",
- "settings.switchNetwork.warning": "Upang gamitin ang Uniswap sa {{label}}, ilipat ang network sa mga setting ng iyong wallet.",
- "settings.title": "Mga setting",
- "settings.version": "Bersyon {{appVersion}}",
- "speedBump.newAddress.warning.description": "Hindi ka pa nakikipagtransaksyon sa address na ito dati. Tiyaking ito ang tamang address bago magpatuloy.",
- "speedBump.newAddress.warning.title": "Bagong address",
- "speedBump.smartContractAddress.warning.description": "Magpapadala ka na ng mga token sa isang espesyal na uri ng address - isang matalinong kontrata. I-double check kung ito ang address na balak mong ipadala. Kung mali ito, maaaring tuluyang mawala ang iyong mga token.",
- "speedBump.smartContractAddress.warning.title": "Ito ba ay isang wallet address?",
- "stats.24fees": "24H na bayad",
- "stats.24volume": "24H volume",
- "stats.allTimeFees": "All time LP fees",
- "stats.allTimeSwappers": "All time swappers",
- "stats.allTimeVolume": "Lahat ng oras dami",
- "stats.fdv": "FDV",
- "stats.fdv.description": "Kinakalkula ng ganap na diluted valuation (FDV) ang kabuuang halaga ng merkado kung ipagpalagay na ang lahat ng mga token ay nasa sirkulasyon.",
- "stats.marketCap": "market cap",
- "stats.marketCap.description": "Ang market capitalization ay ang kabuuang market value ng circulating supply ng isang asset.",
- "stats.tvl": "Kabuuang volume",
- "stats.tvl.description": "Ang kabuuang value locked (TVL) ay ang pinagsama-samang halaga ng asset na available sa lahat ng Uniswap v3 liquidity pool.",
- "stats.volume.1d": "1 araw na dami",
- "stats.volume.1d.description": "Ang 1 araw na volume ay ang halaga ng asset na na-trade sa Uniswap v3 sa nakalipas na 24 na oras.",
- "stats.volume.1d.short": "1D vol",
- "stats.volume.description": "Ang volume ay ang halaga ng asset na na-trade sa Uniswap v3 sa napiling time frame.",
- "swap.allow.oneTime": "Payagan ang {{sym}} (isang beses)",
- "swap.approvalNeeded": "Kailangan ng pag-apruba para magamit ang token na ito. ",
- "swap.approvalPending": "Nakabinbin ang pag-apruba",
- "swap.approveAndSubmit": "Aprubahan at isumite",
- "swap.approveAndSwap": "Aprubahan at palitan",
- "swap.approveInWallet": "Approve sa wallet mo",
- "swap.balance.amount": "Balanse: {{amount}}",
- "swap.bestRoute.cost": "Pinakamahusay na presyo ng ruta ay nagkakahalaga ng ~{{gasPrice}} sa gas. ",
- "swap.bridging.estimatedTime": "Est. oras",
- "swap.bridging.title": "Magpalit sa mga network",
- "swap.bridging.warning.description": "Nagpapalit ka mula {{fromNetwork}} hanggang {{toNetwork}}.",
- "swap.button.max": "Max",
- "swap.button.review": "Balik-aral",
- "swap.button.submitting": "Nagsusumite ng swap...",
- "swap.button.submitting.keep.open": "Panatilihing bukas ang iyong wallet...",
- "swap.button.swap": "Magpalit",
- "swap.button.unwrap": "I-unwrap",
- "swap.button.wrap": "balutin",
- "swap.buy.countryModal.placeholder": "Maghanap ayon sa bansa o rehiyon",
- "swap.cancel.cannotExecute": "Maaaring maisagawa ang iyong swap bago maproseso ang pagkansela. Hindi maibabalik ang iyong mga gastos sa network. Gusto mo bang magpatuloy?",
- "swap.cancel.cannotExecute.plural": "Maaaring maisagawa ang iyong mga swap bago maproseso ang pagkansela. Hindi maibabalik ang iyong mga gastos sa network. Gusto mo bang magpatuloy?",
- "swap.confirmLimit": "Kumpirmahin ang limitasyon",
- "swap.confirmSwap": "Kumpirmahin ang pagpapalit",
- "swap.deadline.settings.title": "Deadline ng transaksyon",
- "swap.details.feeOnTransfer": "{{tokenSymbol}} bayad",
- "swap.details.feeOnTransfer.default": "Token fee",
- "swap.details.newQuote.input": "Bagong input",
- "swap.details.newQuote.output": "Bagong output",
- "swap.details.orderRouting": "Pagruruta ng order",
- "swap.details.orderRoutingInfo": "Kasama na sa iyong presyo ang mga gastos sa network sa patutunguhang network at isang 0.05% Across fee.",
- "swap.details.rate": "Rate",
- "swap.details.slippage": "Max slippage",
- "swap.details.uniswapFee": "Bayad",
- "swap.enterAmount": "Ilagay ang {{sym}} halaga",
- "swap.error.default": "Maaaring kailanganin mong taasan ang iyong slippage tolerance. Tandaan: ang mga fee-on-transfer at rebase token ay hindi tugma sa Uniswap V3.",
- "swap.error.expectedToFail": "Ang iyong pagpapalit ay inaasahang mabibigo.",
- "swap.error.modifiedByWallet": "Ang iyong swap ay binago sa pamamagitan ng iyong wallet. Kung ito ay isang pagkakamali, mangyaring kanselahin kaagad o panganib na mawala ang iyong mga pondo.",
- "swap.error.rejected": "Tinanggihan ang transaksyon",
- "swap.error.undefinedObject": "Nagkaroon ng error noong sinusubukang isagawa ang swap na ito. Maaaring kailanganin mong taasan ang iyong slippage tolerance. Kung hindi iyon gagana, maaaring mayroong hindi pagkakatugma sa token na iyong kinakalakal. Tandaan: ang mga fee-on-transfer at rebase token ay hindi tugma sa Uniswap V3.",
- "swap.error.unknown": "Hindi kilalang error.",
- "swap.error.v2.expired": "Hindi maipadala ang transaksyong ito dahil lumipas na ang deadline. Pakitiyak na hindi masyadong mababa ang deadline ng iyong transaksyon.",
- "swap.error.v2.k": "Ang Uniswap invariant x*y=k ay hindi nasiyahan sa swap. Karaniwan itong nangangahulugan na ang isa sa mga token na iyong pinapalitan ay nagsasama ng custom na gawi sa paglilipat.",
- "swap.error.v2.slippage": "Hindi magtatagumpay ang transaksyong ito dahil sa paggalaw ng presyo o bayad sa paglilipat. Subukang taasan ang iyong slippage tolerance",
- "swap.error.v2.transferInput": "Hindi mailipat ang input token. Maaaring may isyu sa input token.",
- "swap.error.v2.transferOutput": "Ang output token ay hindi maaaring ilipat. Maaaring may isyu sa output token.",
- "swap.error.v3.slippage": "Hindi magtatagumpay ang transaksyong ito dahil sa paggalaw ng presyo. Subukang taasan ang iyong slippage tolerance. Tandaan: ang bayad sa paglipat at mga token ng rebase ay hindi tugma sa Uniswap V3.",
- "swap.error.v3.transferOutput": "Ang output token ay hindi maaaring ilipat. Maaaring may isyu sa output token. Tandaan: ang bayad sa paglipat at mga token ng rebase ay hindi tugma sa Uniswap V3.",
- "swap.estimatedDifference.label": "Magkakaroon ng malaking pagkakaiba sa pagitan ng iyong mga halaga ng input at output dahil sa kasalukuyang pagkatubig.",
- "swap.fail.message": "Subukang isaayos ang slippage sa mas mataas na halaga.",
- "swap.fail.uniswapX": "Hindi makumpleto ang swap gamit ang UniswapX. Subukang muli ang iyong swap para iruta ito sa classic na Uniswap API.",
- "swap.fees.experience": "Ang bayad na ito ay inilalapat sa mga piling pares ng token upang matiyak ang pinakamahusay na karanasan sa Uniswap. Ito ay binabayaran sa output token at naisama na sa quote.",
- "swap.fees.noFee": "Ang mga bayarin ay inilalapat sa mga piling pares ng token upang matiyak ang pinakamahusay na karanasan sa Uniswap. Walang bayad na nauugnay sa swap na ito.",
- "swap.fetchingBestPrice": "Kinukuha ang pinakamagandang presyo...",
- "swap.fetchingPrice": "Kinukuha ang presyo...",
- "swap.finalizingQuote": "Tinatapos ang quote...",
- "swap.form.header": "Magpalit",
- "swap.form.insufficientLiquidity": "Hindi sapat na pagkatubig para sa kalakalang ito.",
- "swap.form.pocketUniverseExtension.warning": "Ang extension ng Pocket Universe ay lumalabag sa aming sa pamamagitan ng pagbabago sa aming produkto sa paraang nakakapanlinlang at maaaring makapinsala sa mga user. Mangyaring huwag paganahin ang extension at i-reload ang pahina.",
- "swap.form.warning.output.fotFees": "Dahil sa token fee na {{fotCurrencySymbol}}, ang mga halaga ng swap ay maaari lamang ipasok gamit ang input field",
- "swap.form.warning.output.fotFees.fallback": "Dahil sa mga bayarin sa token, ang mga halaga ng swap ay maaari lamang ilagay gamit ang input field",
- "swap.form.warning.restore": "Ibalik ang iyong wallet upang makipagpalitan",
- "swap.frontrun.warning": "Ang iyong transaksyon ay maaaring maging frontrun at magresulta sa isang hindi kanais-nais na kalakalan.",
- "swap.header.viewOnly": "View-only",
- "swap.impactOfTrade": "Ang epekto ng iyong kalakalan sa presyo sa merkado ng pool na ito.",
- "swap.inputEstimated.atMost": "Tinatantya ang input. Magbebenta ka ng hanggang o babalik ang transaksyon.",
- "swap.limit": "Limitahan",
- "swap.limitedAssets.warning": "Hindi available ang ilang asset sa pamamagitan ng interface na ito dahil maaaring hindi gumana nang maayos ang mga ito sa mga smart na kontrata o hindi namin pinapayagan ang pag-trade para sa mga legal na dahilan.",
- "swap.limitFilled": "Napunan ang limitasyon!",
- "swap.limitSubmitted": "Naisumite ang limitasyon",
- "swap.marketPrice.outsideRange.label": "Ang presyo sa merkado ay nasa labas ng iyong tinukoy na hanay ng presyo. Single-asset deposit lang.",
- "swap.maxPriceSlip.revert": "Ang maximum na halagang ginagarantiyahan mong gagastusin. Kung bababa pa ang presyo, babalik ang iyong transaksyon.",
- "swap.minPriceSlip.revert": "Kung gumagalaw ang presyo upang makatanggap ka ng mas mababa sa {{amount}}, babalik ang iyong transaksyon.",
- "swap.networkCost.paidIn": "Ang halaga ng network ay binabayaran sa {{sym}} sa {{chainName}} network upang makapagtransaksyon.",
- "swap.orderRouting": "Pagruruta ng order",
- "swap.outputEstimated.atLeast": "Tinatantya ang output. Makakatanggap ka ng hindi bababa sa o babalik ang transaksyon.",
- "swap.payAnyway": "Magbayad pa rin",
- "swap.payAtMost": "Magbayad ng pinakamarami",
- "swap.payWith": "Magbayad gamit ang",
- "swap.placeOrder": "Maglagay ng order",
- "swap.priceImpact": "Epekto sa presyo",
- "swap.receive.atLeast": "Makatanggap ng hindi bababa sa",
- "swap.request.title.full": "Magpalit {{inputCurrencySymbol}} → {{outputCurrencySymbol}}",
- "swap.request.title.short": "Magpalit ng Token",
- "swap.review": "Suriin ang pagpapalit",
- "swap.review.summary": "Nagpapalit ka",
- "swap.reviewLimit": "Limitasyon sa pagsusuri",
- "swap.route.optimizedGasCost": "Ino-optimize ng rutang ito ang iyong kabuuang output sa pamamagitan ng pagsasaalang-alang sa mga split route, maraming hops, at gas cost ng bawat hakbang.",
- "swap.settings.protection.description": "Kapag naka-on ang proteksyon sa swap, mapoprotektahan ang iyong mga transaksyon sa Ethereum mula sa mga pag-atake ng sandwich, na may mas mababang pagkakataong mabigo.",
- "swap.settings.protection.subtitle.supported": "{{chainName}} Network",
- "swap.settings.protection.subtitle.unavailable": "Hindi available sa {{chainName}}",
- "swap.settings.protection.title": "Proteksyon sa pagpapalit",
- "swap.settings.routingPreference.option.default.description": "Pinipili ng Uniswap client ang pinakamurang trade option factoring price at mga gastos sa network.",
- "swap.settings.routingPreference.option.default.title": "Default",
- "swap.settings.routingPreference.option.v2.title": "v2 pool",
- "swap.settings.routingPreference.option.v3.title": "v3 pool",
- "swap.settings.routingPreference.title": "Mga pagpipilian sa kalakalan",
- "swap.settings.slippage.control.auto": "Auto",
- "swap.settings.slippage.description": "Babalik ang iyong transaksyon kung magbago ang presyo nang higit sa porsyento ng slippage.",
- "swap.settings.slippage.input.message": "Kung bababa pa ang presyo, babalik ang iyong transaksyon. Nasa ibaba ang pinakamababang halaga na ginagarantiyahan mong matatanggap.",
- "swap.settings.slippage.input.receive.title": "Makatanggap ng hindi bababa sa",
- "swap.settings.slippage.output.message": "Kung bababa pa ang presyo, babalik ang iyong transaksyon. Nasa ibaba ang maximum na halaga na kakailanganin mong gastusin.",
- "swap.settings.slippage.output.spend.title": "Gumastos ng pinakamaraming",
- "swap.settings.slippage.warning.max": "Maglagay ng value na mas mababa sa {{maxSlippageTolerance}}",
- "swap.settings.slippage.warning.message": "Maaaring mas mataas ang slippage kaysa kinakailangan",
- "swap.settings.slippage.warning.min": "Maglagay ng value na mas malaki sa 0",
- "swap.settings.title": "Pagpalitin ang mga setting",
- "swap.settings.transactionRevertPrice": "Ang iyong transaksyon ay babalik kung ang presyo ay nagbago nang hindi maganda ng higit sa porsyentong ito.",
- "swap.signAndSwap": "Pumirma at magpalit",
- "swap.slippage.amt": "{{amt}} pagkadulas",
- "swap.slippage.settings.title": "Max slippage",
- "swap.slippage.tooltip": "Ang pinakamataas na paggalaw ng presyo bago ang iyong transaksyon ay babalik.",
- "swap.slippageBelow.warning": "Ang slippage sa ibaba {{amt}} ay maaaring magresulta sa isang nabigong transaksyon",
- "swap.submitted": "Naisumite ang swap",
- "swap.success": "Pagpalitin ang tagumpay!",
- "swap.taxTooltip.label": "Eksaktong input lamang",
- "swap.taxTooltip.noTokenSelected": "Ang mga bayarin sa napiling output token ay hindi nagbibigay-daan para sa tumpak na eksaktong mga output. Gamitin ang field na `Sell` sa halip.",
- "swap.taxTooltip.tokenSelected": "{{tokenSymbol}} hindi pinapayagan ng mga bayarin ang tumpak na eksaktong mga output. Gamitin ang field na `Sell` sa halip.",
- "swap.tokenOwnFees": "May bayad ang ilang token kapag binili o ibinenta ang mga ito, na itinakda ng nagbigay ng token. Ang Uniswap ay hindi tumatanggap ng anuman sa mga bayarin na ito.",
- "swap.total": "Kabuuan",
- "swap.transaction.deadline": "Deadline ng transaksyon",
- "swap.transaction.revertAfter": "Ang iyong transaksyon ay babalik kung ito ay nakabinbin nang higit sa panahong ito.",
- "swap.unsupportedAssets.readMore": "Magbasa pa tungkol sa mga hindi sinusuportahang asset",
- "swap.warning.expectedFailure": "Inaasahang mabibigo ang transaksyong ito",
- "swap.warning.feeOnTransfer.message": "May bayad ang ilang token kapag binili o ibinenta ang mga ito, na itinakda ng nagbigay ng token. Ang Uniswap ay hindi tumatanggap ng anumang bahagi ng mga bayarin na ito.",
- "swap.warning.feeOnTransfer.title": "Bakit may karagdagang bayad?",
- "swap.warning.insufficientBalance.button": "Hindi sapat {{currencySymbol}}",
- "swap.warning.insufficientBalance.title": "Wala kang sapat na {{currencySymbol}}",
- "swap.warning.insufficientGas.button": "Hindi sapat {{currencySymbol}}",
- "swap.warning.insufficientGas.button.buy": "Bumili ng {{ tokenSymbol }}",
- "swap.warning.insufficientGas.message.withNetwork": "Hindi sapat {{currencySymbol}} sa {{networkName}} para magpalit",
- "swap.warning.insufficientGas.message.withoutNetwork": "Hindi sapat {{currencySymbol}} para magpalit",
- "swap.warning.insufficientGas.title": "Wala kang sapat na {{currencySymbol}} para mabayaran ang halaga ng network",
- "swap.warning.lowLiquidity.message": "Kasalukuyang walang sapat na liquidity na available sa pagitan ng mga token na ito para magsagawa ng swap. Pakisubukang muli sa ibang pagkakataon o pumili ng isa pang token.",
- "swap.warning.lowLiquidity.title": "Hindi sapat na pagkatubig",
- "swap.warning.networkFee.allow": "Payagan ang {{ inputTokenSymbol }} (isang beses)",
- "swap.warning.networkFee.highRelativeToValue": "Ang halaga ng network ay lumampas sa 10% ng iyong kabuuang halaga ng transaksyon.",
- "swap.warning.networkFee.message": "Ito ang gastos para maproseso ang iyong transaksyon sa blockchain. Ang Uniswap ay hindi tumatanggap ng anumang bahagi ng mga bayarin na ito.",
- "swap.warning.networkFee.message.uniswapX": "Ito ang gastos para maproseso ang iyong transaksyon sa blockchain. Ang Uniswap ay hindi tumatanggap ng anumang bahagi ng mga bayarin na ito. Pinagsasama-sama ng UniswapX ang mga mapagkukunan ng pagkatubig para sa mas magagandang presyo at walang gas na pagpapalit.",
- "swap.warning.networkFee.wrap": "I-wrap ang ETH",
- "swap.warning.offline.message": "Maaaring nawalan ka ng koneksyon sa internet o maaaring sira ang network. Pakisuri ang iyong koneksyon sa internet at subukang muli.",
- "swap.warning.offline.title": "Offline ka",
- "swap.warning.priceImpact": "Ang transaksyong ito ay magreresulta sa isang epekto sa presyo sa presyo sa merkado ng pool na ito. Gusto mo bang magpatuloy?",
- "swap.warning.priceImpact.message": "Dahil sa dami ng {{outputCurrencySymbol}} liquidity na kasalukuyang magagamit, mas {{inputCurrencySymbol}} sinusubukan mong magpalit, mas mababa {{outputCurrencySymbol}} ang matatanggap mo.",
- "swap.warning.priceImpact.title": "Mataas na epekto sa presyo ({{priceImpactValue}})",
- "swap.warning.queuedOrder.appClosed": "Hindi naisumite ang iyong transaksyon dahil isinara mo ang app.",
- "swap.warning.queuedOrder.approvalFailed": "Hindi naisumite ang iyong transaksyon dahil nabigo ang pag-apruba ng token.",
- "swap.warning.queuedOrder.stale": "Hindi naisumite ang iyong transaksyon dahil isinara mo ang app o masyadong matagal ang pag-apruba.",
- "swap.warning.queuedOrder.submissionFailed": "Nagkaroon ng problema sa pagsusumite ng iyong transaksyon.",
- "swap.warning.queuedOrder.title": "Kinansela ang pagpapalit",
- "swap.warning.queuedOrder.wrap.message": "Ang iyong ETH ay mananatiling nakabalot bilang WETH.",
- "swap.warning.queuedOrder.wrapFailed": "Hindi naisumite ang iyong transaksyon dahil nabigo ang transaksyon sa pag-wrap.",
- "swap.warning.rateLimit.message": "Pakisubukang muli sa loob ng ilang minuto.",
- "swap.warning.rateLimit.title": "Lumampas sa limitasyon sa rate",
- "swap.warning.router.message": "Maaaring nawalan ka ng koneksyon o maaaring sira ang network. Kung magpapatuloy ang problema, pakisubukang muli sa ibang pagkakataon.",
- "swap.warning.router.title": "Ang kalakalan na ito ay hindi makumpleto sa ngayon",
- "swap.warning.uniswapFee.message.default": "Ang mga bayarin ay inilalapat upang matiyak ang pinakamahusay na karanasan sa Uniswap. Walang bayad na nauugnay sa swap na ito.",
- "swap.warning.uniswapFee.message.included": "Ang mga bayarin ay inilalapat upang matiyak ang pinakamahusay na karanasan sa Uniswap, at naisama na sa quote na ito.",
- "swap.warning.uniswapFee.title": "Swap fee",
- "swap.warning.viewOnly.message": "Kailangan mong i-import ang wallet na ito sa pamamagitan ng recovery phrase para magpalit ng mga token.",
- "swap.wrap.token": "I-wrap ang {{sym}}",
- "tdp.balanceSummary.otherNetworks": "Sa ibang network",
- "tdp.balanceSummary.otherNetworksBalance": "Balanse sa ibang network",
- "tdp.balanceSummary.title": "Ang iyong balanse",
- "tdp.invalidTokenPage.switchChainPrompt": "Lumipat sa {{network}}",
- "tdp.invalidTokenPage.title": "Ang token na ito ay wala",
- "tdp.invalidTokenPage.titleWithChain": "Ang token na ito ay hindi umiiral sa {{network}}",
- "tdp.loading.title.default": "data ng token para sa ",
- "tdp.loading.title.withChain": "data ng token para sa sa {{chainName}}",
- "tdp.nameNotFound": "Hindi nahanap ang pangalan",
- "tdp.noInfoAvailable": "Walang magagamit na impormasyon ng token",
- "tdp.stats.unsupportedChainDescription": "Ang mga istatistika at chart ng token para sa {{chain}} ay available sa {{infoLink}}",
- "tdp.symbolNotFound": "Hindi natagpuan ang simbolo",
- "themeToggle.theme": "Tema",
- "title.betterPricesMoreListings": "Mas magandang presyo. Higit pang mga listahan. Bumili, magbenta, at mag-trade ng mga NFT sa mga nangungunang marketplace tulad ng OpenSea. I-explore ang mga trending na koleksyon.",
- "title.buySellTradeEthereum": "Bumili, magbenta at mag-trade ng Ethereum at iba pang nangungunang token sa Uniswap",
- "title.createGovernanceOn": "Gumawa ng bagong panukala sa pamamahala sa Uniswap",
- "title.createGovernanceTo": "Gumawa ng bagong panukala sa pamamahala na iboboto ng mga may hawak ng UNI. Ang mga token ng UNI ay kumakatawan sa mga bahagi ng pagboto sa pamamahala ng Uniswap.",
- "title.earnFees": "Makakuha ng mga bayarin kapag nagpalitan ang iba sa Uniswap sa pamamagitan ng pagdaragdag ng mga token sa mga liquidity pool.",
- "title.easilyRemove": "Madaling alisin ang iyong pagkatubig mula sa Uniswap v2 at magdeposito sa Uniswap v3.",
- "title.easilyRemoveV4": "Madaling alisin ang iyong pagkatubig mula sa Uniswap v2 at v3 upang magdeposito sa Uniswap v4.",
- "title.explore": "I-explore ang mga NFT sa Uniswap",
- "title.exploreNFTs": "Mag-explore at bumili ng mga NFT sa mga nangungunang marketplace sa Uniswap",
- "title.importLiquidityv2": "Mag-import ng mga nangungunang liquidity pool (v2) sa Uniswap",
- "title.manageNFT": "Pamahalaan ang iyong koleksyon ng NFT. Tingnan ang mga katangian, aktibidad sa pangangalakal, paglalarawan, at iba pang mga detalye sa iyong mga NFT.",
- "title.migratev2": "I-migrate ang v2 pool liquidity sa Uniswap v3",
- "title.migratev3": "I-migrate ang pool liquidity sa Uniswap v4",
- "title.placeLimit": "Maglagay ng mga limit na order sa Uniswap",
- "title.realTime": "Mga real-time na presyo, chart, data ng transaksyon, at higit pa.",
- "title.removeLiquidityv2": "Alisin ang pool liquidity (v2) sa Uniswap",
- "title.removePoolLiquidity": "Alisin ang pagkatubig ng pool sa Uniswap",
- "title.removeTokensv2": "Alisin ang iyong mga token mula sa v2 liquidity pool.",
- "title.removev3Liquidity": "Alisin ang iyong mga token sa v3 liquidity pool.",
- "title.sendTokens": "Magpadala ng mga token sa Uniswap",
- "title.swappingMadeSimple": "Ang pagpapalit ay ginawang simple. Bumili at magbenta ng crypto sa Ethereum, Base, Arbitrum, Polygon, at higit pa. Pinagkakatiwalaan ng milyun-milyon.",
- "title.tradeTokens": "Trade token at magbigay ng pagkatubig. Mga real-time na presyo, chart, data ng transaksyon, at higit pa.",
- "title.uniswapTradeCrypto": "Uniswap | Ligtas na i-trade ang crypto at NFTs sa nangungunang DeFi platform",
- "title.uniToken": "Ang mga token ng UNI ay kumakatawan sa mga bahagi ng pagboto sa pamamahala ng Uniswap. Maaari kang bumoto sa bawat panukala sa iyong sarili o italaga ang iyong mga boto sa isang ikatlong partido.",
- "title.useImportTool": "Gamitin ang tool sa pag-import na ito upang maghanap ng mga v2 pool na hindi awtomatikong lumalabas sa interface.",
- "title.voteOnGov": "Bumoto sa mga panukala sa pamamahala sa Uniswap",
- "token.balances.main": "Ang iyong balanse",
- "token.balances.other": "Mga balanse sa ibang network",
- "token.balances.viewOnly": "Balanse ni {{ownerAddress}}",
- "token.bridge": "{{label}} token bridge",
- "token.chart.tooltip": "Mga Bayarin: {{amount}}",
- "token.error.unknown": "Hindi kilalang token",
- "token.fee.buy.label": "bayad sa pagbili",
- "token.fee.label": "bayad",
- "token.fee.sell.label": "bayad sa pagbebenta",
- "token.links.title": "Mga link",
- "token.links.twitter": "Twitter",
- "token.links.website": "Website",
- "token.priceExplorer.error.description": "Nagkaproblema.",
- "token.priceExplorer.error.title": "Hindi ma-load ang chart ng presyo",
- "token.priceExplorer.timeRangeLabel.day": "1D",
- "token.priceExplorer.timeRangeLabel.hour": "1H",
- "token.priceExplorer.timeRangeLabel.month": "1M",
- "token.priceExplorer.timeRangeLabel.week": "1W",
- "token.priceExplorer.timeRangeLabel.year": "1Y",
- "token.safety.blocked.title.tokenNotAvailable": "{{tokenSymbol}} ay hindi available",
- "token.safety.blocked.title.tokensNotAvailable": "{{tokenSymbol0}} at {{tokenSymbol1}} ay hindi available",
- "token.safety.fees.uniswapLabsDoesNotReceive": "Ang Uniswap Labs ay hindi tumatanggap ng anuman sa mga bayarin na ito.",
- "token.safety.warning.alwaysDoYourResearch": "Laging gawin ang iyong pananaliksik",
- "token.safety.warning.blocked.description.default_one": "Hindi mo maaaring ipagpalit ang token na ito gamit ang Uniswap App.",
- "token.safety.warning.blocked.description.default_other": "Hindi mo maaaring ipagpalit ang mga token na ito gamit ang Uniswap App.",
- "token.safety.warning.blocked.description.named": "Hindi mo maaaring i-trade ang {{tokenSymbol}} gamit ang Uniswap App.",
- "token.safety.warning.dontShowWarningAgain": "Huwag mo nang ipakita sa akin ang babalang ito",
- "token.safety.warning.doYourOwnResearch": "Laging gawin ang iyong sariling pananaliksik bago magpatuloy.",
- "token.safety.warning.feeDetected.title": "May nakitang bayad",
- "token.safety.warning.highFeeDetected.title": "Nakita ang mataas na bayad",
- "token.safety.warning.honeypot.message": "Ang {{tokenSymbol}} ay na-flag bilang hindi mabebenta. Ang pagpapalit ng token na ito ay maaaring magresulta sa pagkawala ng iyong mga pondo.",
- "token.safety.warning.honeypot.title": "Nakita ang honeypot",
- "token.safety.warning.malicious.general.message": "{{tokenSymbol}} ay na-flag bilang nakakahamak.",
- "token.safety.warning.malicious.impersonator.message": "{{tokenSymbol}} ay na-flag para sa pagtatangkang kopyahin ang ibang token. Maaaring hindi ito ang token na hinahanap mong palitan.",
- "token.safety.warning.malicious.impersonator.message.short": "Ang {{tokenSymbol}} ay na-flag bilang nakakahamak at maaaring hindi ito ang token na gusto mong ipagpalit.",
- "token.safety.warning.malicious.title": "May nakitang malisyosong token",
- "token.safety.warning.medium.heading.default_one": "Ang token na ito ay hindi kinakalakal sa nangungunang mga sentralisadong palitan ng US.",
- "token.safety.warning.medium.heading.default_other": "Ang mga token na ito ay hindi kinakalakal sa nangungunang mga sentralisadong palitan ng US.",
- "token.safety.warning.medium.heading.named": "Ang {{tokenSymbol}} ay hindi kinakalakal sa nangungunang mga sentralisadong palitan ng US.",
- "token.safety.warning.notAvailableToTrade": "Hindi magagamit sa pangangalakal",
- "token.safety.warning.spam.message": "Ang {{tokenSymbol}} ay na-flag bilang isang potensyal na token ng spam.",
- "token.safety.warning.spam.title": "May nakitang spam token",
- "token.safety.warning.strong.heading.default_one": "Ang token na ito ay hindi kinakalakal sa nangungunang mga sentralisadong palitan ng US o madalas na ipinagpapalit sa Uniswap.",
- "token.safety.warning.strong.heading.default_other": "Ang mga token na ito ay hindi kinakalakal sa nangungunang mga sentralisadong palitan ng US o madalas na ipinagpapalit sa Uniswap.",
- "token.safety.warning.strong.heading.named": "Ang {{tokenSymbol}} ay hindi kinakalakal sa nangungunang mga sentralisadong palitan ng US o madalas na ipinagpapalit sa Uniswap.",
- "token.safety.warning.tokenChargesFee.message": "{{tokenSymbol}} naniningil ng bayad kapag binili o ibinenta. Ang pagpapalit nito ay maaaring magresulta sa pagkawala ng mga pondo.",
- "token.safety.warning.tokenChargesFee.percent.message": "{{tokenSymbol}} naniningil ng {{feePercent}} bayad kapag binili o ibinenta. Ang pagpapalit nito ay maaaring magresulta sa pagkawala ng mga pondo.",
- "token.safety.warning.tokenChargesFee.title": "{{tokenSymbol}} naniningil ng bayad",
- "token.safety.warning.tokenChargesHighFee.title": "{{tokenSymbol}} naniningil ng mataas na bayad",
- "token.safetyLevel.blocked.header": "Hindi available",
- "token.safetyLevel.blocked.message": "Hindi mo maaaring ipagpalit ang token na ito gamit ang Uniswap Wallet.",
- "token.safetyLevel.medium.header": "Pag-iingat",
- "token.safetyLevel.medium.message": "Ang token na ito ay hindi kinakalakal sa nangungunang mga sentralisadong palitan ng US. Laging gawin ang iyong sariling pananaliksik bago magpatuloy.",
- "token.safetyLevel.medium.message.plural": "Ang mga token na ito ay hindi kinakalakal sa nangungunang mga sentralisadong palitan ng US. Laging gawin ang iyong sariling pananaliksik bago magpatuloy.",
- "token.safetyLevel.strong.header": "Babala",
- "token.safetyLevel.strong.message": "Ang token na ito ay hindi kinakalakal sa nangungunang mga sentralisadong palitan ng US o madalas na ipinagpapalit sa Uniswap. Laging gawin ang iyong sariling pananaliksik bago magpatuloy.",
- "token.selector.search.error": "Hindi ma-load ang mga resulta ng paghahanap",
- "token.stats.fullyDilutedValuation": "Ganap na Diluted na Pagpapahalaga",
- "token.stats.marketCap": "Market Cap",
- "token.stats.priceHighYear": "52W Mataas",
- "token.stats.priceLowYear": "52W Mababa",
- "token.stats.section.about": "Tungkol sa {{token}}",
- "token.stats.title": "Stats",
- "token.stats.translation.original": "Ipakita ang orihinal",
- "token.stats.translation.translate": "Isalin sa {{language}}",
- "token.stats.volume": "24h Volume",
- "token.wrap.fail.message": "Ang mga palitan sa Uniswap Protocol ay maaaring magsimula at magtapos sa ETH. Gayunpaman, sa panahon ng swap, ang ETH ay nakabalot sa WETH.",
- "token.zeroNativeBalance.description": "Upang makakuha ng {{ tokenSymbol }}, kailangan mo munang {{ nativeTokenSymbol }} upang bayaran ang halaga ng network. Magsimula sa pamamagitan ng pagpopondo sa iyong wallet ng {{ nativeTokenSymbol }}.",
- "token.zeroNativeBalance.title": "Kailangan mo {{ nativeTokenName }} ",
- "tokens.action.hide": "Itago ang Token",
- "tokens.action.unhide": "I-unhide ang Token",
- "tokens.nfts.action.viewOnExplorer": "Tingnan sa {{blockExplorerName}}",
- "tokens.nfts.collection.error.load.title": "Hindi ma-load ang koleksyon ng NFT",
- "tokens.nfts.collection.label.items": "Mga bagay",
- "tokens.nfts.collection.label.owners": "Mga may-ari",
- "tokens.nfts.collection.label.priceFloor": "Sahig",
- "tokens.nfts.collection.label.swapVolume": "Dami",
- "tokens.nfts.details.error.load.title": "Hindi ma-load ang mga detalye ng NFT",
- "tokens.nfts.details.network": "Network",
- "tokens.nfts.details.owner": "Pagmamay-ari ni",
- "tokens.nfts.details.price": "Kasalukuyang presyo",
- "tokens.nfts.details.recentPrice": "Huling presyo ng pagbebenta",
- "tokens.nfts.details.traits": "Mga katangian",
- "tokens.nfts.empty.description": "Walang nakitang NFT",
- "tokens.nfts.error.unavailable": "Hindi available ang content",
- "tokens.nfts.hidden.action.hide": "Itago ang NFT",
- "tokens.nfts.hidden.action.unhide": "I-unhide ang NFT",
- "tokens.nfts.link.collection": "Website ng koleksyon",
- "tokens.nfts.list.error.load.title": "Hindi ma-load ang mga NFT",
- "tokens.nfts.list.none.button": "Tumanggap ng mga NFT",
- "tokens.nfts.list.none.description.default": "Maglipat ng mga NFT mula sa isa pang wallet upang makapagsimula.",
- "tokens.nfts.list.none.description.external": "Kapag bumili o tumanggap ang wallet na ito ng mga NFT, lalabas ang mga ito dito.",
- "tokens.nfts.list.none.title": "Wala pang NFT",
- "tokens.noneFound": "Walang nakitang mga token.",
- "tokens.selector.button.choose": "Pumili ng token",
- "tokens.selector.button.clear": "I-clear lahat",
- "tokens.selector.empty.buy.message": "Bumili ng crypto gamit ang isang card o bangko para magpadala ng mga token.",
- "tokens.selector.empty.buy.title": "Bumili ng crypto",
- "tokens.selector.empty.receive.message": "Maglipat ng mga token mula sa isang sentralisadong palitan o ibang wallet upang magpadala ng mga token.",
- "tokens.selector.empty.receive.title": "Tumanggap ng mga token",
- "tokens.selector.empty.title": "Wala pang token",
- "tokens.selector.error.load": "Hindi ma-load ang mga token",
- "tokens.selector.search.empty": "Walang nakitang mga resulta para sa {{searchText}}",
- "tokens.selector.search.placeholder": "Maghanap ng mga token",
- "tokens.selector.section.bridging": "Magpalit sa mga network",
- "tokens.selector.section.favorite": "Mga paborito",
- "tokens.selector.section.otherSearchResults": "Iba pang mga token sa {{network}}",
- "tokens.selector.section.recent": "Mga kamakailang paghahanap",
- "tokens.selector.section.search": "Mga resulta ng paghahanap",
- "tokens.selector.section.yours": "Ang iyong mga token",
- "tokens.table.search.placeholder.pools": "Maghanap ng mga pool",
- "tokens.table.search.placeholder.tokens": "Maghanap ng mga token",
- "transaction.action.cancel.button": "Kanselahin ang transaksyon",
- "transaction.action.cancel.description": "Kung kakanselahin mo ang transaksyong ito bago ito maproseso ng network, magbabayad ka ng bagong halaga ng network sa halip na ang orihinal.",
- "transaction.action.cancel.title": "Kanselahin ang transaksyong ito?",
- "transaction.action.copy": "Kopyahin ang transaction ID",
- "transaction.action.copyProvider": "Kopyahin ang {{providerName}} transaction ID",
- "transaction.action.viewEtherscan": "Tingnan sa {{blockExplorerName}}",
- "transaction.amount.unlimited": "Walang limitasyon",
- "transaction.confirmation.completionTime_one": "Nakumpleto ang transaksyon sa {{count}} segundo 🎉",
- "transaction.confirmation.completionTime_other": "Nakumpleto ang transaksyon sa loob ng {{count}} segundo 🎉",
- "transaction.confirmation.pending.wallet": "Kumpirmahin ang transaksyon sa wallet",
- "transaction.confirmation.submitted.currency.add": "Magdagdag ng {{currency}}",
- "transaction.confirmation.submitted.currency.added": "Idinagdag {{currency}}",
- "transaction.confirmation.waiting": "Naghihintay ng kumpirmasyon",
- "transaction.date": "Naisumite noong {{date}}",
- "transaction.details.dappName": "App",
- "transaction.details.from": "Mula sa",
- "transaction.details.networkFee": "Gastos sa network",
- "transaction.details.swapRate": "Rate",
- "transaction.details.transactionId": "ID ng Transaksyon",
- "transaction.details.uniswapFee": "Bayad ({{ feePercent }}%)",
- "transaction.insufficientLiquidity": "Hindi sapat na pool liquidity para makumpleto ang transaksyon",
- "transaction.network.all": "Lahat ng network",
- "transaction.networkCost.label": "Gastos sa network",
- "transaction.notification.error.cancel": "Hindi makansela ang transaksyon",
- "transaction.notification.error.replace": "Hindi mapalitan ang transaksyon",
- "transaction.priceImpact.label": "Epekto sa presyo",
- "transaction.status.approve.canceled": "Kinansela ang pag-apruba",
- "transaction.status.approve.canceling": "Pagkansela aprubahan",
- "transaction.status.approve.failed": "Nabigong aprubahan",
- "transaction.status.approve.pending": "Pag-apruba",
- "transaction.status.approve.success": "Naaprubahan",
- "transaction.status.approve.successDapp": "Naaprubahan noong {{externalDappName}}",
- "transaction.status.buy.canceled": "Kinansela ang pagbili",
- "transaction.status.buy.canceling": "Kinakansela ang pagbili",
- "transaction.status.buy.failed": "Nabigong bumili",
- "transaction.status.buy.pending": "Pagbili",
- "transaction.status.buy.success": "Binili",
- "transaction.status.buy.successDapp": "Binili noong {{externalDappName}}",
- "transaction.status.confirm.canceled": "Kinansela ang pagkumpirma",
- "transaction.status.confirm.canceling": "Nakabinbing pagkansela",
- "transaction.status.confirm.failed": "Nabigong kumpirmahin",
- "transaction.status.confirm.pending": "Kasalukuyang nagaganap ang transaksyon",
- "transaction.status.confirm.success": "Nakumpirma ang transaksyon",
- "transaction.status.confirm.successDapp": "Nakumpirma ang transaksyon noong {{externalDappName}}",
- "transaction.status.mint.canceled": "Kinansela ang mint",
- "transaction.status.mint.canceling": "Kinakansela ang mint",
- "transaction.status.mint.failed": "Nabigong mag-mint",
- "transaction.status.mint.pending": "Minting",
- "transaction.status.mint.success": "Minted",
- "transaction.status.mint.successDapp": "Na-minted sa {{externalDappName}}",
- "transaction.status.purchase.canceled": "Kinansela ang pagbili",
- "transaction.status.purchase.canceling": "Kinakansela ang pagbili",
- "transaction.status.purchase.failedOn": "Nabigong bumili sa {{serviceProvider}}",
- "transaction.status.purchase.pendingOn": "Bumili sa {{serviceProvider}}",
- "transaction.status.purchase.successOn": "Binili noong {{serviceProvider}}",
- "transaction.status.receive.canceled": "Kinansela ang pagtanggap",
- "transaction.status.receive.canceling": "Kinakansela ang pagtanggap",
- "transaction.status.receive.failedFrom": "Nabigong makatanggap mula sa {{serviceProvider}}",
- "transaction.status.receive.pendingFrom": "Tumatanggap mula sa {{serviceProvider}}",
- "transaction.status.receive.success": "Natanggap",
- "transaction.status.receive.successDapp": "Natanggap noong {{externalDappName}}",
- "transaction.status.receive.successFrom": "Natanggap mula sa {{serviceProvider}}",
- "transaction.status.revoke.canceled": "Kinansela ang pagbawi",
- "transaction.status.revoke.canceling": "Kinakansela ang pagbawi",
- "transaction.status.revoke.failed": "Nabigong bawiin",
- "transaction.status.revoke.pending": "Pagpapawalang-bisa",
- "transaction.status.revoke.success": "Binawi",
- "transaction.status.revoke.successDapp": "Binawi noong {{externalDappName}}",
- "transaction.status.sell.canceled": "Kinansela ang pagbebenta",
- "transaction.status.sell.canceling": "Kinakansela ang pagbebenta",
- "transaction.status.sell.failed": "Nabigong ibenta",
- "transaction.status.sell.pending": "Nagbebenta",
- "transaction.status.sell.success": "Nabenta",
- "transaction.status.sell.successDapp": "Nabenta noong {{externalDappName}}",
- "transaction.status.send.canceled": "Kinansela ang pagpapadala",
- "transaction.status.send.canceling": "Kinakansela ang pagpapadala",
- "transaction.status.send.failed": "Nabigong ipadala",
- "transaction.status.send.pending": "Nagpapadala",
- "transaction.status.send.success": "Ipinadala",
- "transaction.status.send.successDapp": "Ipinadala sa {{externalDappName}}",
- "transaction.status.swap.canceled": "Kinansela ang swap",
- "transaction.status.swap.canceling": "Kinakansela ang swap",
- "transaction.status.swap.expired": "Nag-expire na ang pagpapalit",
- "transaction.status.swap.failed": "Nabigong magpalit",
- "transaction.status.swap.insufficientFunds": "Hindi sapat na pondo",
- "transaction.status.swap.pending": "Pagpapalit",
- "transaction.status.swap.success": "Pinagpalit",
- "transaction.status.swap.successDapp": "Ipinagpalit sa {{externalDappName}}",
- "transaction.status.unwrap.canceled": "Kinansela ang pag-unwrap",
- "transaction.status.unwrap.canceling": "Kinakansela ang pag-unwrap",
- "transaction.status.unwrap.failed": "Nabigong i-unwrap",
- "transaction.status.unwrap.pending": "Binubuksan",
- "transaction.status.unwrap.success": "Hindi nakabalot",
- "transaction.status.unwrap.successDapp": "Naka-unwrap sa {{externalDappName}}",
- "transaction.status.wrap.canceled": "Kinansela ang pambalot",
- "transaction.status.wrap.canceling": "Kinakansela ang pambalot",
- "transaction.status.wrap.failed": "Nabigong i-wrap",
- "transaction.status.wrap.pending": "Pagbabalot",
- "transaction.status.wrap.success": "Nakabalot",
- "transaction.status.wrap.successDapp": "Nakabalot sa {{externalDappName}}",
- "transaction.summary.received": "{{tokenAmountWithSymbol}} hanggang {{recipientAddress}}",
- "transaction.summary.sent": "{{tokenAmountWithSymbol}} mula sa {{senderAddress}}",
- "transaction.warning.insufficientGas.modal.message": "Kailangan mo ng ~{{tokenAmount}} {{tokenSymbol}} () sa {{networkName}} upang mabayaran ang halaga ng network ng transaksyong ito.",
- "transaction.warning.insufficientGas.modal.title.withNetwork": "Hindi sapat {{tokenSymbol}} sa {{networkName}}",
- "transaction.warning.insufficientGas.modal.title.withoutNetwork": "Hindi sapat {{tokenSymbol}}",
- "transaction.watcher.error.cancel": "Hindi makansela ang transaksyon",
- "transaction.watcher.error.status": "Error habang sinusuri ang status ng transaksyon",
- "uniswapX.aggregatesLiquidity": "Pinagsasama-sama ng ang mga mapagkukunan ng pagkatubig para sa mas magandang presyo at mga palitan ng libreng gas.",
- "uniswapx.description": "Pinagsasama-sama ng UniswapX ang mga mapagkukunan ng pagkatubig para sa mas mahusay na mga presyo at mga libreng pagpapalit ng gas.",
- "uniswapx.included": "May kasamang UniswapX ",
- "uniswapx.label": "UniswapX",
- "uniswapX.learnMore": "Matuto pa tungkol sa pagpapalit sa UniswapX",
- "uniswapx.v2QuoteFailed": "Nabigo ang UniswapX v2 hard quote. Subukang muli gamit ang classic swap.",
- "unitags.banner.button.claim": "I-claim ngayon",
- "unitags.banner.subtitle": "Bumuo ng personalized na profile sa web3 at madaling ibahagi ang iyong address sa mga kaibigan.",
- "unitags.banner.title.compact": "I-claim ang iyong {{unitagDomain}} username at buuin ang iyong nako-customize na profile.",
- "unitags.banner.title.full": "I-claim ang iyong {{unitagDomain}} username",
- "unitags.choosePhoto.option.cameraRoll": "Pumili mula sa camera roll",
- "unitags.choosePhoto.option.nft": "Pumili ng isang NFT",
- "unitags.choosePhoto.option.remove": "Alisin ang larawan sa profile",
- "unitags.claim.confirmation.customize": "I-customize ang profile",
- "unitags.claim.confirmation.description": "Ang {{unitagAddress}} ay handa nang magpadala at tumanggap ng crypto. Magpatuloy sa pagbuo ng iyong wallet sa pamamagitan ng pag-customize sa iyong profile sa web3.",
- "unitags.claim.confirmation.success.long": "nakuha mo na!",
- "unitags.claim.confirmation.success.short": "nakuha ko na!",
- "unitags.claim.error.addressLimit": "Nagawa mo na ang maximum na bilang ng mga pagbabago sa iyong username para sa address na ito",
- "unitags.claim.error.appCheck": "Hindi ma-claim ang username. Pakisubukang muli bukas.",
- "unitags.claim.error.avatar": "Hindi maitakda ang avatar. Subukan ulit mamaya.",
- "unitags.claim.error.default": "Hindi ma-claim ang username. Subukan ulit mamaya.",
- "unitags.claim.error.deviceLimit": "Naabot mo na ang maximum na bilang ng mga username na maaaring maging aktibo para sa device na ito",
- "unitags.claim.error.general": "Hindi ma-claim ang username",
- "unitags.claim.error.unavailable": "Hindi available ang username na ito",
- "unitags.claim.error.unknown": "Hindi kilalang error",
- "unitags.claim.username.default": "pangalan mo",
- "unitags.delete.confirm.subtitle": "Ide-delete mo na ang iyong username at nako-customize na mga detalye ng profile. Hindi mo na ito mababawi.",
- "unitags.delete.confirm.title": "Sigurado ka ba?",
- "unitags.editProfile.placeholder": "username",
- "unitags.editUsername.button.confirm": "I-save ang mga pagbabago",
- "unitags.editUsername.confirm.subtitle": "Papalitan mo na ang iyong username. Kapag napalitan mo na ito, hindi mo na ito maaangkin muli.",
- "unitags.editUsername.confirm.title": "Sigurado ka ba?",
- "unitags.editUsername.title": "I-edit ang username",
- "unitags.editUsername.warning.default": "Kapag napalitan mo na ang iyong username, hindi mo na ito maaangkin muli. Maaari mo lamang itong palitan ng 2 beses.",
- "unitags.editUsername.warning.max": "Naabot mo na ang maximum na bilang ng 2 mga pagbabago sa username.",
- "unitags.intro.features.ens": "Pinapatakbo ng mga subdomain ng ENS",
- "unitags.intro.features.free": "Libreng mag-claim",
- "unitags.intro.features.profile": "Nako-customize na mga profile",
- "unitags.intro.subtitle": "Magpaalam sa 0x address. Ang mga username ay mga nababasang pangalan na nagpapadali sa pagpapadala at pagtanggap ng crypto.",
- "unitags.intro.title": "Ipinapakilala ang mga username",
- "unitags.notification.delete.error": "Hindi matanggal ang username. Subukan ulit mamaya.",
- "unitags.notification.delete.title": "Na-delete ang username",
- "unitags.notification.profile.error": "Hindi ma-update ang profile. Subukan ulit mamaya.",
- "unitags.notification.profile.title": "Na-update ang profile",
- "unitags.notification.username.error": "Hindi mapalitan ang username. Subukan ulit mamaya.",
- "unitags.notification.username.title": "Nabago ang username",
- "unitags.onboarding.claim.subtitle": "Ito ang iyong personalized na address kung saan maaaring ipadala ng mga tao ang crypto.",
- "unitags.onboarding.claim.title.choose": "Lumikha ng iyong username",
- "unitags.onboarding.claim.title.claim": "I-claim ang iyong username",
- "unitags.onboarding.info.description": "Binabago ng mga username ang mga kumplikadong 0x na address sa mga nababasang pangalan. Sa pamamagitan ng pag-claim ng {{unitagDomain}} username, madali kang makakapagpadala at makakatanggap ng crypto at makabuo ng pampublikong profile sa web3.",
- "unitags.onboarding.info.title": "Isang pinasimpleng address",
- "unitags.onboarding.profile.subtitle": "Mag-upload ng sarili mo o manatili gamit ang iyong natatanging Unicon. Maaari mong baguhin ito palagi sa ibang pagkakataon.",
- "unitags.onboarding.profile.title": "Pumili ng larawan sa profile",
- "unitags.profile.action.delete": "Tanggalin ang username",
- "unitags.profile.action.edit": "I-edit ang username",
- "unitags.profile.bio.label": "Bio",
- "unitags.profile.bio.placeholder": "Mag-type ng bio para sa iyong profile",
- "unitags.profile.links.twitter": "Twitter",
- "unitags.username.error.chars": "Ang mga username ay maaari lamang maglaman ng mga titik at numero",
- "unitags.username.error.max": "Ang mga username ay hindi maaaring higit sa {{number}} character",
- "unitags.username.error.min": "Ang mga username ay dapat hindi bababa sa {{number}} character",
- "unitags.username.error.uppercase": "Ang mga username ay maaari lamang maglaman ng mga maliliit na titik at numero",
- "uwulink.error.insufficientTokens": "Hindi sapat {{tokenSymbol}} sa {{chain}}",
- "v2.notAvailable": "Ang Uniswap V2 ay hindi available sa network na ito.",
- "v2.switchTo": "Lumipat sa v2",
- "v3.blast.yield.usdbAndWeth": "Sa Blast, bina-rebasing ng USDB at WETH ang mga token na awtomatikong kumikita ng yield. Dahil sa hindi pagkakatugma sa Uniswap v3, ang mga posisyon ng LP na may USDB o WETH ay hindi makakakuha ng rebasing yield, ngunit sa Uniswap v2.",
- "v3.continue": "Magpatuloy sa v3",
- "v3.rebase.unavailable": "Hindi available ang rebasing sa v3",
- "wallet.appSignIn": "Mag-sign in gamit ang app",
- "wallet.connectingAgreement": "Sa pamamagitan ng pagkonekta ng wallet, sumasang-ayon ka sa Mga Tuntunin ng Serbisyo ng Uniswap Labs at pumayag sa Patakaran sa Privacy nito.",
- "wallet.connectionFailed.message": "Nabigo ang pagtatangkang koneksyon. Paki-click ang subukang muli at sundin ang mga hakbang upang kumonekta sa iyong wallet.",
- "wallet.other": "Iba pang mga wallet",
- "wallet.scanToConnect": "I-scan ang QR code para kumonekta",
- "wallet.wrongNet": "Nakakonekta ang iyong wallet sa maling network.",
- "walletConnect.dapps.connection": "Nakakonekta sa {{dappNameOrUrl}}",
- "walletConnect.dapps.empty.description": "Kumonekta sa isang app sa pamamagitan ng pag-scan ng code sa pamamagitan ng WalletConnect",
- "walletConnect.dapps.manage.empty.title": "Walang nakakonektang apps",
- "walletConnect.dapps.manage.title": "Pamahalaan ang mga koneksyon",
- "walletConnect.error.connection.message": "Kasalukuyang sinusuportahan ng Uniswap Wallet ang {{chainNames}}. Mangyaring gamitin lamang ang \"{{dappName}}\" sa mga chain na ito",
- "walletConnect.error.connection.title": "Error sa Koneksyon",
- "walletConnect.error.general.message": "Nagkaroon ng isyu sa WalletConnect. Pakisubukang muli",
- "walletConnect.error.general.title": "Error sa WalletConnect",
- "walletConnect.error.scantastic.message": "Nagkaroon ng isyu sa iyong QR code. Pakisubukang muli",
- "walletConnect.error.scantastic.title": "Di-wastong QR Code",
- "walletConnect.error.unsupported.message": "Tiyaking nag-i-scan ka ng wastong WalletConnect, Ethereum address, o Uniswap Extension QR code bago subukang muli.",
- "walletConnect.error.unsupported.title": "Di-wastong QR Code",
- "walletConnect.error.unsupportedV1.message": "Hindi na sinusuportahan ang WalletConnect v1. Ang application na sinusubukan mong kumonekta ay kailangang mag-upgrade sa WalletConnect v2.",
- "walletConnect.error.unsupportedV1.title": "Di-wastong QR Code",
- "walletConnect.error.uwu.scan": "Nagkaroon ng isyu sa pag-scan sa QR code na ito.",
- "walletConnect.error.uwu.title": "Error sa UwU Link",
- "walletConnect.error.uwu.unsupported": "Ang QR code na ito ay hindi suportado.",
- "walletConnect.pending.button.connect": "Kumonekta",
- "walletConnect.pending.button.scrollDown": "Mag-scroll pababa para kumonekta",
- "walletConnect.pending.switchAccount": "Lumipat ng Account",
- "walletConnect.pending.switchNetwork": "Lumipat ng Network",
- "walletConnect.pending.title": "Kumonekta sa {{dappName}}",
- "walletConnect.permissions.networks": "Mga network",
- "walletConnect.permissions.option.transferAssets": "Ilipat ang iyong mga asset nang walang pahintulot",
- "walletConnect.permissions.option.viewTokenBalances": "Tingnan ang iyong mga balanse ng token",
- "walletConnect.permissions.option.viewWalletAddress": "Tingnan ang iyong wallet address",
- "walletConnect.permissions.title": "Mga pahintulot sa site",
- "walletConnect.request.button.scrollDown": "Mag-scroll pababa para pumirma",
- "walletConnect.request.button.sign": "Lagda",
- "walletConnect.request.details.label.function": "Function",
- "walletConnect.request.details.label.sending": "Nagpapadala",
- "walletConnect.request.details.label.token": "Token",
- "walletConnect.request.details.label.tokens": "Mga token",
- "walletConnect.request.error.insufficientFunds": "Wala kang sapat na {{currencySymbol}} upang makumpleto ang transaksyong ito.",
- "walletConnect.request.error.network": "Error sa koneksyon sa internet o network",
- "walletConnect.request.warning.general.message": "Mag-ingat: maaaring maglipat ng mga asset ang mensaheng ito",
- "walletConnect.request.warning.message": "Upang makapag-sign ng mga mensahe o transaksyon, kakailanganin mong i-import ang parirala sa pagbawi ng wallet.",
- "walletConnect.request.warning.title": "Ang wallet na ito ay nasa view-only mode",
- "web.explore.description": "Tumuklas at magsaliksik ng mga token sa {{network}}. I-explore ang mga nangungunang pool. Tingnan ang mga real-time na presyo, dami ng kalakalan, TVL, mga chart, at data ng transaksyon.",
- "web.explore.title.pools": "I-explore ang mga nangungunang pool sa {{network}} sa Uniswap",
- "web.explore.title.tokens": "I-explore ang mga nangungunang token sa {{network}} sa Uniswap",
- "web.explore.title.transactions": "I-explore ang mga nangungunang transaksyon sa {{network}} sa Uniswap"
-}
diff --git a/packages/uniswap/src/i18n/locales/translations/fr-FR.json b/packages/uniswap/src/i18n/locales/translations/fr-FR.json
index d2527eb031c..9d1b4fa7650 100644
--- a/packages/uniswap/src/i18n/locales/translations/fr-FR.json
+++ b/packages/uniswap/src/i18n/locales/translations/fr-FR.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Destinataire",
"analytics.allow": "Autoriser les analyses",
"analytics.allow.message": "Nous utilisons des données anonymisées pour améliorer votre expérience avec les produits Uniswap Labs.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}min",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "Saisir un pourcentage",
"chart.candlestick": "Chandelier japonais",
"chart.error.pools": "Impossible d’afficher les données historiques du pool actuel.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Approuver dans votre wallet",
"swap.balance.amount": "Solde : {{amount}}",
"swap.bestRoute.cost": "Le trajet au meilleur prix coûte environ {{gasPrice}} en gaz. ",
- "swap.bridging.estimatedTime": "Heure estimée",
"swap.bridging.title": "Échange entre réseaux",
"swap.bridging.warning.description": "Vous passez de {{fromNetwork}} à {{toNetwork}}.",
"swap.button.max": "Max.",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Frais de token",
"swap.details.newQuote.input": "Nouvelle entrée",
"swap.details.newQuote.output": "Nouvelle sortie",
- "swap.details.orderRouting": "Routage des commandes",
- "swap.details.orderRoutingInfo": "Votre prix inclut déjà les coûts de réseau sur le réseau de destination et des frais Across de 0,05 %.",
"swap.details.rate": "Taux",
"swap.details.slippage": "Slippage max",
"swap.details.uniswapFee": "Frais",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Rechercher des tokens",
"tokens.selector.section.bridging": "Swap entre réseaux",
"tokens.selector.section.favorite": "Favoris",
- "tokens.selector.section.otherSearchResults": "Autres jetons sur {{network}}",
"tokens.selector.section.recent": "Recherches récentes",
"tokens.selector.section.search": "Résultats de recherche",
"tokens.selector.section.yours": "Vos tokens",
diff --git a/packages/uniswap/src/i18n/locales/translations/he-IL.json b/packages/uniswap/src/i18n/locales/translations/he-IL.json
index 1b6b724f859..4575fa61db3 100644
--- a/packages/uniswap/src/i18n/locales/translations/he-IL.json
+++ b/packages/uniswap/src/i18n/locales/translations/he-IL.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "מקבל",
"analytics.allow": "אפשר ניתוח",
"analytics.allow.message": "אנו משתמשים בנתונים אנונימיים כדי לשפר את החוויה שלך עם מוצרי Uniswap Labs.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}דקות {{seconds}}שניות",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}דקות",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "הזן אחוז",
"chart.candlestick": "פָּמוֹט",
"chart.error.pools": "לא ניתן להציג נתונים היסטוריים עבור המאגר הנוכחי.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "אשר בארנק שלך",
"swap.balance.amount": "יתרה: {{amount}}",
"swap.bestRoute.cost": "מסלול המחיר הטוב ביותר עולה ~{{gasPrice}} בדלק. ",
- "swap.bridging.estimatedTime": "הערכה זְמַן",
"swap.bridging.title": "החלפה בין רשתות",
"swap.bridging.warning.description": "אתה מחליף מ- {{fromNetwork}} ל- {{toNetwork}}.",
"swap.button.max": "מקסימום",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "עמלת סמלי",
"swap.details.newQuote.input": "קלט חדש",
"swap.details.newQuote.output": "פלט חדש",
- "swap.details.orderRouting": "ניתוב הזמנה",
- "swap.details.orderRoutingInfo": "המחיר שלך כבר כולל עלויות רשת ברשת היעד ועמלה של 0.05%.",
"swap.details.rate": "ציון",
"swap.details.slippage": "החלקה מקסימלית",
"swap.details.uniswapFee": "תַשְׁלוּם",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "חפש אסימונים",
"tokens.selector.section.bridging": "החלפה בין רשתות",
"tokens.selector.section.favorite": "מועדפים",
- "tokens.selector.section.otherSearchResults": "אסימונים אחרים ב- {{network}}",
"tokens.selector.section.recent": "חיפושים אחרונים",
"tokens.selector.section.search": "תוצאות חיפוש",
"tokens.selector.section.yours": "האסימונים שלך",
diff --git a/packages/uniswap/src/i18n/locales/translations/hi-IN.json b/packages/uniswap/src/i18n/locales/translations/hi-IN.json
index c62f3718473..4910da48836 100644
--- a/packages/uniswap/src/i18n/locales/translations/hi-IN.json
+++ b/packages/uniswap/src/i18n/locales/translations/hi-IN.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "प्राप्तकर्ता",
"analytics.allow": "विश्लेषण की अनुमति दें",
"analytics.allow.message": "हम यूनिस्वैप लैब्स उत्पादों के साथ आपके अनुभव को बढ़ाने के लिए अनाम डेटा का उपयोग करते हैं।",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}min",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "प्रतिशत दर्ज करें",
"chart.candlestick": "मोमबत्ती",
"chart.error.pools": "वर्तमान पूल के लिए ऐतिहासिक डेटा प्रदर्शित करने में असमर्थ.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "अपने वॉलेट में स्वीकृति दें",
"swap.balance.amount": "शेष: {{amount}}",
"swap.bestRoute.cost": "सर्वोत्तम मूल्य मार्ग की लागत ~{{gasPrice}} गैस में है। ",
- "swap.bridging.estimatedTime": "अनुमानित समय",
"swap.bridging.title": "नेटवर्कों के बीच अदला-बदली",
"swap.bridging.warning.description": "आप {{fromNetwork}} से {{toNetwork}}में स्वैप कर रहे हैं।",
"swap.button.max": "अधिकतम",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "टोकन शुल्क",
"swap.details.newQuote.input": "नया इनपुट",
"swap.details.newQuote.output": "नया आउटपुट",
- "swap.details.orderRouting": "ऑर्डर रूटिंग",
- "swap.details.orderRoutingInfo": "आपके मूल्य में पहले से ही गंतव्य नेटवर्क पर नेटवर्क लागत और 0.05% एक्रॉस शुल्क शामिल है।",
"swap.details.rate": "दर",
"swap.details.slippage": "अधिकतम फिसलन",
"swap.details.uniswapFee": "शुल्क",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "टोकन खोजें",
"tokens.selector.section.bridging": "नेटवर्कों के बीच अदला-बदली",
"tokens.selector.section.favorite": "पसंदीदा",
- "tokens.selector.section.otherSearchResults": "{{network}}पर अन्य टोकन",
"tokens.selector.section.recent": "हाल की खोजें",
"tokens.selector.section.search": "खोज के परिणाम",
"tokens.selector.section.yours": "आपके टोकन",
diff --git a/packages/uniswap/src/i18n/locales/translations/hu-HU.json b/packages/uniswap/src/i18n/locales/translations/hu-HU.json
index 7ddeff6817e..080c1202414 100644
--- a/packages/uniswap/src/i18n/locales/translations/hu-HU.json
+++ b/packages/uniswap/src/i18n/locales/translations/hu-HU.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Befogadó",
"analytics.allow": "Engedélyezze az elemzést",
"analytics.allow.message": "Anonimizált adatokat használunk, hogy javítsuk az Uniswap Labs termékeivel kapcsolatos élményt.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}min",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "Adjon meg egy százalékot",
"chart.candlestick": "Gyertyatartó",
"chart.error.pools": "Nem lehet megjeleníteni az aktuális készlet előzményadatait.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Jóváhagyja a pénztárcájában",
"swap.balance.amount": "Egyenleg: {{amount}}",
"swap.bestRoute.cost": "A legjobb árú útvonal ~{{gasPrice}} benzinben. ",
- "swap.bridging.estimatedTime": "Becs. idő",
"swap.bridging.title": "Csere a hálózatok között",
"swap.bridging.warning.description": "{{fromNetwork}} -ről {{toNetwork}}-ra vált.",
"swap.button.max": "Max",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Jelképes díj",
"swap.details.newQuote.input": "Új bemenet",
"swap.details.newQuote.output": "Új kimenet",
- "swap.details.orderRouting": "Rendelési útválasztás",
- "swap.details.orderRoutingInfo": "Az Ön ára már tartalmazza a célhálózat hálózati költségeit és a 0,05% Across díjat.",
"swap.details.rate": "Mérték",
"swap.details.slippage": "Max csúszás",
"swap.details.uniswapFee": "Díj",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Tokenek keresése",
"tokens.selector.section.bridging": "Csere a hálózatok között",
"tokens.selector.section.favorite": "Kedvencek",
- "tokens.selector.section.otherSearchResults": "Egyéb tokenek a {{network}}oldalon",
"tokens.selector.section.recent": "Legutóbbi keresések",
"tokens.selector.section.search": "Keresési eredmények",
"tokens.selector.section.yours": "A tokenek",
diff --git a/packages/uniswap/src/i18n/locales/translations/id-ID.json b/packages/uniswap/src/i18n/locales/translations/id-ID.json
index 8d6508cbfdc..2d4e54443e5 100644
--- a/packages/uniswap/src/i18n/locales/translations/id-ID.json
+++ b/packages/uniswap/src/i18n/locales/translations/id-ID.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Penerima",
"analytics.allow": "Izinkan analitik",
"analytics.allow.message": "Kami menggunakan data anonim untuk meningkatkan pengalaman Anda dengan produk Uniswap Labs.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}menit {{seconds}}detik",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}menit",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}dtk",
"burn.input.enterAPercent.error": "Masukkan persen",
"chart.candlestick": "Kandil",
"chart.error.pools": "Tidak dapat menampilkan data historis untuk kumpulan saat ini.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Setujui di dompet Anda",
"swap.balance.amount": "Saldo: {{amount}}",
"swap.bestRoute.cost": "Biaya rute harga terbaik ~{{gasPrice}} dalam bahan bakar. ",
- "swap.bridging.estimatedTime": "Perkiraan waktu",
"swap.bridging.title": "Tukar antar jaringan",
"swap.bridging.warning.description": "Anda menukar dari {{fromNetwork}} ke {{toNetwork}}.",
"swap.button.max": "Maks",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Biaya token",
"swap.details.newQuote.input": "Masukan baru",
"swap.details.newQuote.output": "Keluaran baru",
- "swap.details.orderRouting": "Perutean pesanan",
- "swap.details.orderRoutingInfo": "Harga Anda sudah termasuk biaya jaringan pada jaringan tujuan dan biaya Across sebesar 0,05%.",
"swap.details.rate": "Kecepatan",
"swap.details.slippage": "Slip maksimum",
"swap.details.uniswapFee": "Biaya",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Token pencarian",
"tokens.selector.section.bridging": "Tukar antar jaringan",
"tokens.selector.section.favorite": "Favorit",
- "tokens.selector.section.otherSearchResults": "Token lain di {{network}}",
"tokens.selector.section.recent": "Pencarian terkini",
"tokens.selector.section.search": "Hasil Pencarian",
"tokens.selector.section.yours": "Token Anda",
diff --git a/packages/uniswap/src/i18n/locales/translations/it-IT.json b/packages/uniswap/src/i18n/locales/translations/it-IT.json
index 095e579ab23..8b01f8daa54 100644
--- a/packages/uniswap/src/i18n/locales/translations/it-IT.json
+++ b/packages/uniswap/src/i18n/locales/translations/it-IT.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Destinatario",
"analytics.allow": "Consenti analisi",
"analytics.allow.message": "Utilizziamo dati anonimi per migliorare la tua esperienza con i prodotti Uniswap Labs.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}minimo {{seconds}}s",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}minimo",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "Inserisci una percentuale",
"chart.candlestick": "Candeliere",
"chart.error.pools": "Impossibile visualizzare i dati storici per il pool corrente.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Approva nel tuo portafoglio",
"swap.balance.amount": "Saldo: {{amount}}",
"swap.bestRoute.cost": "Il percorso al miglior prezzo costa ~{{gasPrice}} in gas. ",
- "swap.bridging.estimatedTime": "Tempo stimato",
"swap.bridging.title": "Scambio tra reti",
"swap.bridging.warning.description": "Stai passando da {{fromNetwork}} a {{toNetwork}}.",
"swap.button.max": "Massimo",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Tariffa simbolica",
"swap.details.newQuote.input": "Nuovo ingresso",
"swap.details.newQuote.output": "Nuova uscita",
- "swap.details.orderRouting": "Instradamento degli ordini",
- "swap.details.orderRoutingInfo": "Il prezzo include già i costi di rete sulla rete di destinazione e una commissione Across dello 0,05%.",
"swap.details.rate": "Valutare",
"swap.details.slippage": "Slittamento massimo",
"swap.details.uniswapFee": "Tassa",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Cerca token",
"tokens.selector.section.bridging": "Scambio tra reti",
"tokens.selector.section.favorite": "Preferiti",
- "tokens.selector.section.otherSearchResults": "Altri token su {{network}}",
"tokens.selector.section.recent": "Ricerche recenti",
"tokens.selector.section.search": "Risultati di ricerca",
"tokens.selector.section.yours": "I tuoi gettoni",
diff --git a/packages/uniswap/src/i18n/locales/translations/ja-JP.json b/packages/uniswap/src/i18n/locales/translations/ja-JP.json
index d9630ac07f9..1bcb7fdac65 100644
--- a/packages/uniswap/src/i18n/locales/translations/ja-JP.json
+++ b/packages/uniswap/src/i18n/locales/translations/ja-JP.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "受取人",
"analytics.allow": "分析を許可する",
"analytics.allow.message": "Uniswap Labs 製品でのエクスペリエンスを向上させるために、匿名化されたデータを使用します。",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}分 {{seconds}}秒",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}分",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}秒",
"burn.input.enterAPercent.error": "パーセントを入力する",
"chart.candlestick": "ローソク足",
"chart.error.pools": "現在のプールの履歴データを表示できません。",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "ウォレットで承認する",
"swap.balance.amount": "残高: {{amount}}",
"swap.bestRoute.cost": "最安ルートのガス代は ~{{gasPrice}} です。",
- "swap.bridging.estimatedTime": "推定時間",
"swap.bridging.title": "ネットワーク間でのスワップ",
"swap.bridging.warning.description": "{{fromNetwork}} から {{toNetwork}}に交換しています。",
"swap.button.max": "最大",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "トークン手数料",
"swap.details.newQuote.input": "新規の入金",
"swap.details.newQuote.output": "新規の出金",
- "swap.details.orderRouting": "注文ルーティング",
- "swap.details.orderRoutingInfo": "料金には、宛先ネットワークのネットワーク コストと 0.05% の Across 料金がすでに含まれています。",
"swap.details.rate": "レート",
"swap.details.slippage": "最大スリッページ",
"swap.details.uniswapFee": "手数料",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "トークンを検索する",
"tokens.selector.section.bridging": "ネットワーク間でのスワップ",
"tokens.selector.section.favorite": "お気に入り",
- "tokens.selector.section.otherSearchResults": "{{network}}の他のトークン",
"tokens.selector.section.recent": "最近の検索履歴",
"tokens.selector.section.search": "検索結果",
"tokens.selector.section.yours": "お客様のトークン",
diff --git a/packages/uniswap/src/i18n/locales/translations/ko-KR.json b/packages/uniswap/src/i18n/locales/translations/ko-KR.json
index be6a123bcba..dcf698b8e8a 100644
--- a/packages/uniswap/src/i18n/locales/translations/ko-KR.json
+++ b/packages/uniswap/src/i18n/locales/translations/ko-KR.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "받는 사람",
"analytics.allow": "분석 허용",
"analytics.allow.message": "당사는 Uniswap Labs 제품에 대한 당신의 경험을 향상시키기 위해 익명화된 데이터를 사용합니다.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}분 {{seconds}}초",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}분",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}초",
"burn.input.enterAPercent.error": "백분율(%) 을 입력하세요.",
"chart.candlestick": "촛대",
"chart.error.pools": "현재 풀에 대한 기록 데이터를 표시할 수 없습니다.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "지갑에서 승인하세요",
"swap.balance.amount": "잔액: {{amount}}",
"swap.bestRoute.cost": "최적의 가격 경로는 가스비 ~{{gasPrice}} 입니다. ",
- "swap.bridging.estimatedTime": "예상 시간",
"swap.bridging.title": "네트워크 간 교환",
"swap.bridging.warning.description": "당신은 {{fromNetwork}}에서 {{toNetwork}}로 전환 중입니다.",
"swap.button.max": "최대",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "토큰 수수료",
"swap.details.newQuote.input": "새로운 입력",
"swap.details.newQuote.output": "새로운 출력",
- "swap.details.orderRouting": "주문 라우팅",
- "swap.details.orderRoutingInfo": "귀하의 가격에는 대상 네트워크의 네트워크 비용과 0.05%의 수수료가 이미 포함되어 있습니다.",
"swap.details.rate": "비율",
"swap.details.slippage": "최대 슬리피지",
"swap.details.uniswapFee": "수수료",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "토큰 검색",
"tokens.selector.section.bridging": "네트워크 간 스왑",
"tokens.selector.section.favorite": "즐겨찾기",
- "tokens.selector.section.otherSearchResults": "{{network}}의 다른 토큰",
"tokens.selector.section.recent": "최근 검색어",
"tokens.selector.section.search": "검색 결과",
"tokens.selector.section.yours": "당신의 토큰",
diff --git a/packages/uniswap/src/i18n/locales/translations/ms-MY.json b/packages/uniswap/src/i18n/locales/translations/ms-MY.json
index cd8cb225275..f3fc92f14b2 100644
--- a/packages/uniswap/src/i18n/locales/translations/ms-MY.json
+++ b/packages/uniswap/src/i18n/locales/translations/ms-MY.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Penerima",
"analytics.allow": "Benarkan analisis",
"analytics.allow.message": "Kami menggunakan data tanpa nama untuk meningkatkan pengalaman anda dengan produk Uniswap Labs.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}min",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "Masukkan peratus",
"chart.candlestick": "Candlestick",
"chart.error.pools": "Tidak dapat memaparkan data sejarah untuk kumpulan semasa.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Luluskan dalam dompet anda",
"swap.balance.amount": "Baki: {{amount}}",
"swap.bestRoute.cost": "Kos laluan harga terbaik ~{{gasPrice}} dalam gas. ",
- "swap.bridging.estimatedTime": "Anggaran masa",
"swap.bridging.title": "Bertukar merentasi rangkaian",
"swap.bridging.warning.description": "Anda bertukar daripada {{fromNetwork}} kepada {{toNetwork}}.",
"swap.button.max": "Maks",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Bayaran token",
"swap.details.newQuote.input": "Input baharu",
"swap.details.newQuote.output": "Keluaran baharu",
- "swap.details.orderRouting": "Penghalaan pesanan",
- "swap.details.orderRoutingInfo": "Harga anda sudah termasuk kos rangkaian pada rangkaian destinasi dan yuran Sepanjang 0.05%.",
"swap.details.rate": "Kadar",
"swap.details.slippage": "Kegelinciran maksimum",
"swap.details.uniswapFee": "Bayaran",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Cari token",
"tokens.selector.section.bridging": "Bertukar merentasi rangkaian",
"tokens.selector.section.favorite": "Kegemaran",
- "tokens.selector.section.otherSearchResults": "Token lain pada {{network}}",
"tokens.selector.section.recent": "Carian terkini",
"tokens.selector.section.search": "Keputusan Carian",
"tokens.selector.section.yours": "Token anda",
diff --git a/packages/uniswap/src/i18n/locales/translations/nl-NL.json b/packages/uniswap/src/i18n/locales/translations/nl-NL.json
index 6fb9679c15e..66792ab4a2f 100644
--- a/packages/uniswap/src/i18n/locales/translations/nl-NL.json
+++ b/packages/uniswap/src/i18n/locales/translations/nl-NL.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Ontvanger",
"analytics.allow": "Analyses toestaan",
"analytics.allow.message": "We gebruiken geanonimiseerde gegevens om uw ervaring met Uniswap Labs-producten te verbeteren.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}minuten",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "Voer een percentage in",
"chart.candlestick": "Kandelaar",
"chart.error.pools": "Kan historische gegevens voor de huidige pool niet weergeven.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Goedkeuren in uw portemonnee",
"swap.balance.amount": "Saldo: {{amount}}",
"swap.bestRoute.cost": "Beste prijs routekosten ~{{gasPrice}} in gas. ",
- "swap.bridging.estimatedTime": "Geschatte tijd",
"swap.bridging.title": "Wisselen tussen netwerken",
"swap.bridging.warning.description": "Je wisselt van {{fromNetwork}} naar {{toNetwork}}.",
"swap.button.max": "Maximaal",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Tokenkosten",
"swap.details.newQuote.input": "Nieuwe invoer",
"swap.details.newQuote.output": "Nieuwe uitvoer",
- "swap.details.orderRouting": "Orderroutering",
- "swap.details.orderRoutingInfo": "In uw prijs zijn de netwerkkosten voor het bestemmingsnetwerk en een toeslag van 0,05% inbegrepen.",
"swap.details.rate": "Tarief",
"swap.details.slippage": "Maximale slip",
"swap.details.uniswapFee": "Tarief",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Zoek tokens",
"tokens.selector.section.bridging": "Wisselen tussen netwerken",
"tokens.selector.section.favorite": "Favorieten",
- "tokens.selector.section.otherSearchResults": "Andere tokens op {{network}}",
"tokens.selector.section.recent": "Recente zoekopdrachten",
"tokens.selector.section.search": "Zoekresultaten",
"tokens.selector.section.yours": "Jouw tokens",
diff --git a/packages/uniswap/src/i18n/locales/translations/no-NO.json b/packages/uniswap/src/i18n/locales/translations/no-NO.json
index c89fbe95d7a..a805cf353da 100644
--- a/packages/uniswap/src/i18n/locales/translations/no-NO.json
+++ b/packages/uniswap/src/i18n/locales/translations/no-NO.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Mottaker",
"analytics.allow": "Tillat analyser",
"analytics.allow.message": "Vi bruker anonymiserte data for å forbedre opplevelsen din med Uniswap Labs-produkter.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}min",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "Skriv inn en prosent",
"chart.candlestick": "Lysestake",
"chart.error.pools": "Kan ikke vise historiske data for gjeldende basseng.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Godkjenne i lommeboken",
"swap.balance.amount": "Saldo: {{amount}}",
"swap.bestRoute.cost": "Beste pris rute koster ~{{gasPrice}} i gass. ",
- "swap.bridging.estimatedTime": "Est. tid",
"swap.bridging.title": "Bytt på tvers av nettverk",
"swap.bridging.warning.description": "Du bytter fra {{fromNetwork}} til {{toNetwork}}.",
"swap.button.max": "Maks",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Tokenavgift",
"swap.details.newQuote.input": "Nytt innspill",
"swap.details.newQuote.output": "Ny utgang",
- "swap.details.orderRouting": "Bestillingsruting",
- "swap.details.orderRoutingInfo": "Prisen din inkluderer allerede nettverkskostnader på destinasjonsnettverket og en 0,05 % Across-avgift.",
"swap.details.rate": "Vurdere",
"swap.details.slippage": "Maks glidning",
"swap.details.uniswapFee": "Avgift",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Søk tokens",
"tokens.selector.section.bridging": "Bytt på tvers av nettverk",
"tokens.selector.section.favorite": "Favoritter",
- "tokens.selector.section.otherSearchResults": "Andre tokens på {{network}}",
"tokens.selector.section.recent": "Nylige søk",
"tokens.selector.section.search": "Søkeresultater",
"tokens.selector.section.yours": "Dine tokens",
diff --git a/packages/uniswap/src/i18n/locales/translations/pl-PL.json b/packages/uniswap/src/i18n/locales/translations/pl-PL.json
index a200551bc9f..9a1710ef467 100644
--- a/packages/uniswap/src/i18n/locales/translations/pl-PL.json
+++ b/packages/uniswap/src/i18n/locales/translations/pl-PL.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Odbiorca",
"analytics.allow": "Zezwól na analizę",
"analytics.allow.message": "Używamy anonimowych danych, aby poprawić Twoje doświadczenia z produktami Uniswap Labs.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}minuta {{seconds}}sekunda",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}minuta",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "Wpisz procent",
"chart.candlestick": "Świecznik",
"chart.error.pools": "Nie można wyświetlić danych historycznych dla bieżącej puli.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Zatwierdź w swoim portfelu",
"swap.balance.amount": "Saldo: {{amount}}",
"swap.bestRoute.cost": "Najlepsza cena za trasę ~{{gasPrice}} na benzynie. ",
- "swap.bridging.estimatedTime": "Szacowany czas",
"swap.bridging.title": "Wymiana między sieciami",
"swap.bridging.warning.description": "Zamieniasz {{fromNetwork}} na {{toNetwork}}.",
"swap.button.max": "Maks",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Opłata za token",
"swap.details.newQuote.input": "Nowe wejście",
"swap.details.newQuote.output": "Nowe wyjście",
- "swap.details.orderRouting": "Kierowanie zamówień",
- "swap.details.orderRoutingInfo": "Cena obejmuje już koszty sieci docelowej i opłatę za połączenie w wysokości 0,05%.",
"swap.details.rate": "Wskaźnik",
"swap.details.slippage": "Maksymalny poślizg",
"swap.details.uniswapFee": "Opłata",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Szukaj tokenów",
"tokens.selector.section.bridging": "Wymiana między sieciami",
"tokens.selector.section.favorite": "Ulubione",
- "tokens.selector.section.otherSearchResults": "Inne tokeny na {{network}}",
"tokens.selector.section.recent": "Ostatnie wyszukiwania",
"tokens.selector.section.search": "Wyniki wyszukiwania",
"tokens.selector.section.yours": "Twoje tokeny",
diff --git a/packages/uniswap/src/i18n/locales/translations/pt-BR.json b/packages/uniswap/src/i18n/locales/translations/pt-BR.json
index 527f9b08f9d..96619b570ce 100644
--- a/packages/uniswap/src/i18n/locales/translations/pt-BR.json
+++ b/packages/uniswap/src/i18n/locales/translations/pt-BR.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Destinatário",
"analytics.allow": "Permitir análises",
"analytics.allow.message": "Usamos dados anonimizados para aprimorar sua experiência com os produtos Uniswap Labs.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}minutos {{seconds}}segundos",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}minutos",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "Insira uma porcentagem",
"chart.candlestick": "Castiçal",
"chart.error.pools": "Não é possível exibir dados históricos do pool atual.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Aprove na sua carteira",
"swap.balance.amount": "Saldo: {{amount}}",
"swap.bestRoute.cost": "A rota de melhor preço custa ~{{gasPrice}} em gás. ",
- "swap.bridging.estimatedTime": "Tempo estimado",
"swap.bridging.title": "Trocar entre redes",
"swap.bridging.warning.description": "Você está trocando de {{fromNetwork}} para {{toNetwork}}.",
"swap.button.max": "Máx.",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Taxa simbólica",
"swap.details.newQuote.input": "Nova entrada",
"swap.details.newQuote.output": "Nova saída",
- "swap.details.orderRouting": "Roteamento de pedidos",
- "swap.details.orderRoutingInfo": "Seu preço já inclui custos de rede na rede de destino e uma taxa transversal de 0,05%.",
"swap.details.rate": "Avaliar",
"swap.details.slippage": "Deslizamento máximo",
"swap.details.uniswapFee": "Taxa",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Tokens de pesquisa",
"tokens.selector.section.bridging": "Trocar entre redes",
"tokens.selector.section.favorite": "Favoritos",
- "tokens.selector.section.otherSearchResults": "Outros tokens em {{network}}",
"tokens.selector.section.recent": "Pesquisas recentes",
"tokens.selector.section.search": "Procurar Resultados",
"tokens.selector.section.yours": "Seus tokens",
diff --git a/packages/uniswap/src/i18n/locales/translations/pt-PT.json b/packages/uniswap/src/i18n/locales/translations/pt-PT.json
index 2305581662d..2d3d0f48f3a 100644
--- a/packages/uniswap/src/i18n/locales/translations/pt-PT.json
+++ b/packages/uniswap/src/i18n/locales/translations/pt-PT.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Beneficiário",
"analytics.allow": "Permitir análises",
"analytics.allow.message": "Utilizamos dados anónimos para melhorar a tua experiência com produtos Uniswap Labs.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}minutos {{seconds}}segundos",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}minutos",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "Introduzir uma percentagem",
"chart.candlestick": "Gráfico de velas",
"chart.error.pools": "Não é possível apresentar dados históricos para o pool atual.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Aprovar na tua carteira",
"swap.balance.amount": "Saldo: {{amount}}",
"swap.bestRoute.cost": "A rota com melhor preço custa ~{{gasPrice}} em Gas. ",
- "swap.bridging.estimatedTime": "Tempo estimado",
"swap.bridging.title": "Trocar entre redes",
"swap.bridging.warning.description": "Você está trocando de {{fromNetwork}} para {{toNetwork}}.",
"swap.button.max": "Máx.",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Tarifa do token",
"swap.details.newQuote.input": "Nova entrada",
"swap.details.newQuote.output": "Nova saída",
- "swap.details.orderRouting": "Encaminhamento de ordens",
- "swap.details.orderRoutingInfo": "Seu preço já inclui custos de rede na rede de destino e uma taxa transversal de 0,05%.",
"swap.details.rate": "Taxa",
"swap.details.slippage": "Deslizamento máximo",
"swap.details.uniswapFee": "Tarifa",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Pesquisar tokens",
"tokens.selector.section.bridging": "Trocar entre redes",
"tokens.selector.section.favorite": "Favoritos",
- "tokens.selector.section.otherSearchResults": "Outros tokens em {{network}}",
"tokens.selector.section.recent": "Pesquisas recentes",
"tokens.selector.section.search": "Resultados da pesquisa",
"tokens.selector.section.yours": "Os teus tokens",
diff --git a/packages/uniswap/src/i18n/locales/translations/ro-RO.json b/packages/uniswap/src/i18n/locales/translations/ro-RO.json
index 711ddc1414b..d723b70c652 100644
--- a/packages/uniswap/src/i18n/locales/translations/ro-RO.json
+++ b/packages/uniswap/src/i18n/locales/translations/ro-RO.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Destinatar",
"analytics.allow": "Permite analize",
"analytics.allow.message": "Folosim date anonimizate pentru a vă îmbunătăți experiența cu produsele Uniswap Labs.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}min",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "Introduceți un procent",
"chart.candlestick": "Sfeşnic",
"chart.error.pools": "Nu se pot afișa datele istorice pentru grupul curent.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Aprobați în portofel",
"swap.balance.amount": "Sold: {{amount}}",
"swap.bestRoute.cost": "Ruta cu cel mai bun preț costă ~{{gasPrice}} în benzină. ",
- "swap.bridging.estimatedTime": "EST. timp",
"swap.bridging.title": "Schimbați între rețele",
"swap.bridging.warning.description": "Schimbați de la {{fromNetwork}} la {{toNetwork}}.",
"swap.button.max": "Max",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Taxa de simbol",
"swap.details.newQuote.input": "Intrare nouă",
"swap.details.newQuote.output": "Ieșire nouă",
- "swap.details.orderRouting": "Dirijarea comenzilor",
- "swap.details.orderRoutingInfo": "Prețul dvs. include deja costurile de rețea în rețeaua de destinație și o taxă de 0,05%.",
"swap.details.rate": "Rată",
"swap.details.slippage": "Alunecare maximă",
"swap.details.uniswapFee": "Taxa",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Jetoane de căutare",
"tokens.selector.section.bridging": "Schimbați între rețele",
"tokens.selector.section.favorite": "Favorite",
- "tokens.selector.section.otherSearchResults": "Alte jetoane pe {{network}}",
"tokens.selector.section.recent": "Căutări recente",
"tokens.selector.section.search": "Rezultatele cautarii",
"tokens.selector.section.yours": "Jetoanele tale",
diff --git a/packages/uniswap/src/i18n/locales/translations/ru-RU.json b/packages/uniswap/src/i18n/locales/translations/ru-RU.json
index 0f70e22ffab..658997d9130 100644
--- a/packages/uniswap/src/i18n/locales/translations/ru-RU.json
+++ b/packages/uniswap/src/i18n/locales/translations/ru-RU.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Получатель",
"analytics.allow": "Разрешить аналитику",
"analytics.allow.message": "Мы используем анонимные данные, чтобы улучшить ваше взаимодействие с продуктами Uniswap Labs.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}мин {{seconds}}с",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}мин",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}с",
"burn.input.enterAPercent.error": "Введите процент",
"chart.candlestick": "Подсвечник",
"chart.error.pools": "Невозможно отобразить исторические данные для текущего пула.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Одобрить в своем кошельке",
"swap.balance.amount": "Баланс: {{amount}}",
"swap.bestRoute.cost": "Маршрут по лучшей цене стоит ~{{gasPrice}} бензина. ",
- "swap.bridging.estimatedTime": "Расчетное время",
"swap.bridging.title": "Обмен между сетями",
"swap.bridging.warning.description": "Вы меняете {{fromNetwork}} на {{toNetwork}}.",
"swap.button.max": "Макс",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Плата за токен",
"swap.details.newQuote.input": "Новый ввод",
"swap.details.newQuote.output": "Новый результат",
- "swap.details.orderRouting": "Маршрут заказа",
- "swap.details.orderRoutingInfo": "В вашу цену уже включены сетевые расходы в сети назначения и комиссия Across в размере 0,05%.",
"swap.details.rate": "Ставка",
"swap.details.slippage": "Макс. проскальзывание",
"swap.details.uniswapFee": "Платеж",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Поиск токенов",
"tokens.selector.section.bridging": "Обмен между сетями",
"tokens.selector.section.favorite": "Избранное",
- "tokens.selector.section.otherSearchResults": "Другие токены на {{network}}",
"tokens.selector.section.recent": "Недавние поиски",
"tokens.selector.section.search": "Результаты поиска",
"tokens.selector.section.yours": "Ваши токены",
diff --git a/packages/uniswap/src/i18n/locales/translations/sl-SI.json b/packages/uniswap/src/i18n/locales/translations/sl-SI.json
index 936d780866b..5c4bc5a3dfd 100644
--- a/packages/uniswap/src/i18n/locales/translations/sl-SI.json
+++ b/packages/uniswap/src/i18n/locales/translations/sl-SI.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Prejemnik",
"analytics.allow": "Dovoli analitiko",
"analytics.allow.message": "Anonimizirane podatke uporabljamo za izboljšanje vaše izkušnje z izdelki Uniswap Labs.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}min",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "Vnesite odstotek",
"chart.candlestick": "Svečnik",
"chart.error.pools": "Ni mogoče prikazati zgodovinskih podatkov za trenutno skupino.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Odobri v svoji denarnici",
"swap.balance.amount": "Stanje: {{amount}}",
"swap.bestRoute.cost": "Pot po najboljši ceni stane ~{{gasPrice}} goriva. ",
- "swap.bridging.estimatedTime": "Ocena čas",
"swap.bridging.title": "Zamenjava med omrežji",
"swap.bridging.warning.description": "Zamenjavate iz {{fromNetwork}} v {{toNetwork}}.",
"swap.button.max": "maks",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Žetonska pristojbina",
"swap.details.newQuote.input": "Nov vnos",
"swap.details.newQuote.output": "Nov rezultat",
- "swap.details.orderRouting": "Usmerjanje naročil",
- "swap.details.orderRoutingInfo": "Vaša cena že vključuje omrežne stroške v ciljnem omrežju in 0,05-odstotno provizijo Across.",
"swap.details.rate": "Oceniti",
"swap.details.slippage": "Največji zdrs",
"swap.details.uniswapFee": "Pristojbina",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Iskanje žetonov",
"tokens.selector.section.bridging": "Zamenjava med omrežji",
"tokens.selector.section.favorite": "Priljubljene",
- "tokens.selector.section.otherSearchResults": "Drugi žetoni na {{network}}",
"tokens.selector.section.recent": "Nedavna iskanja",
"tokens.selector.section.search": "Rezultati iskanja",
"tokens.selector.section.yours": "Vaši žetoni",
diff --git a/packages/uniswap/src/i18n/locales/translations/sr-SP.json b/packages/uniswap/src/i18n/locales/translations/sr-SP.json
index da9385fcd30..6921c32b755 100644
--- a/packages/uniswap/src/i18n/locales/translations/sr-SP.json
+++ b/packages/uniswap/src/i18n/locales/translations/sr-SP.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Прималац",
"analytics.allow": "Дозволи аналитику",
"analytics.allow.message": "Користимо анонимне податке да побољшамо ваше искуство са Унисвап Лабс производима.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}min",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "Унесите проценат",
"chart.candlestick": "Свећњак",
"chart.error.pools": "Није могуће приказати историјске податке за тренутни скуп.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Одобрите у свом новчанику",
"swap.balance.amount": "Стање: {{amount}}",
"swap.bestRoute.cost": "Најбоља цена руте кошта ~{{gasPrice}} у гасу. ",
- "swap.bridging.estimatedTime": "Est. time",
"swap.bridging.title": "Swap across networks",
"swap.bridging.warning.description": "You’re swapping from {{fromNetwork}} to {{toNetwork}}.",
"swap.button.max": "Макс",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Токен накнада",
"swap.details.newQuote.input": "Нови унос",
"swap.details.newQuote.output": "Нови излаз",
- "swap.details.orderRouting": "Рутирање налога",
- "swap.details.orderRoutingInfo": "Your price already includes network costs on the destination network and a 0.05% Across fee.",
"swap.details.rate": "Рате",
"swap.details.slippage": "Максимално клизање",
"swap.details.uniswapFee": "Надокнада",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Претражи токене",
"tokens.selector.section.bridging": "Swap across networks",
"tokens.selector.section.favorite": "Фаворитес",
- "tokens.selector.section.otherSearchResults": "Other tokens on {{network}}",
"tokens.selector.section.recent": "Недавне претраге",
"tokens.selector.section.search": "Резултати претраге",
"tokens.selector.section.yours": "Ваши жетони",
diff --git a/packages/uniswap/src/i18n/locales/translations/sv-SE.json b/packages/uniswap/src/i18n/locales/translations/sv-SE.json
index 64317d5364a..c9352be0607 100644
--- a/packages/uniswap/src/i18n/locales/translations/sv-SE.json
+++ b/packages/uniswap/src/i18n/locales/translations/sv-SE.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Mottagare",
"analytics.allow": "Tillåt analys",
"analytics.allow.message": "Vi använder anonymiserad data för att förbättra din upplevelse av Uniswap Labs produkter.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}min",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "Ange en procent",
"chart.candlestick": "Ljusstake",
"chart.error.pools": "Det går inte att visa historisk data för den aktuella poolen.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Godkänn i din plånbok",
"swap.balance.amount": "Saldo: {{amount}}",
"swap.bestRoute.cost": "Bästa prisväg kostar ~{{gasPrice}} i gas. ",
- "swap.bridging.estimatedTime": "Uppskattad tid",
"swap.bridging.title": "Byt mellan nätverk",
"swap.bridging.warning.description": "Du byter från {{fromNetwork}} till {{toNetwork}}.",
"swap.button.max": "Max",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Token avgift",
"swap.details.newQuote.input": "Ny ingång",
"swap.details.newQuote.output": "Ny utgång",
- "swap.details.orderRouting": "Beställningsdirigering",
- "swap.details.orderRoutingInfo": "Ditt pris inkluderar redan nätverkskostnader på destinationsnätverket och en avgift på 0,05 %.",
"swap.details.rate": "Betygsätta",
"swap.details.slippage": "Max glidning",
"swap.details.uniswapFee": "Avgift",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Sök tokens",
"tokens.selector.section.bridging": "Byt mellan nätverk",
"tokens.selector.section.favorite": "Favoriter",
- "tokens.selector.section.otherSearchResults": "Andra tokens på {{network}}",
"tokens.selector.section.recent": "Senaste sökningar",
"tokens.selector.section.search": "Sökresultat",
"tokens.selector.section.yours": "Dina tokens",
diff --git a/packages/uniswap/src/i18n/locales/translations/sw-TZ.json b/packages/uniswap/src/i18n/locales/translations/sw-TZ.json
index 3c9937c2dd2..eb85131a7a7 100644
--- a/packages/uniswap/src/i18n/locales/translations/sw-TZ.json
+++ b/packages/uniswap/src/i18n/locales/translations/sw-TZ.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Mpokeaji",
"analytics.allow": "Ruhusu uchanganuzi",
"analytics.allow.message": "Tunatumia data isiyojulikana ili kuboresha matumizi yako na bidhaa za Uniswap Labs.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}min",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "Weka asilimia",
"chart.candlestick": "Kinara",
"chart.error.pools": "Haiwezi kuonyesha data ya kihistoria ya bwawa la sasa.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Idhinisha kwenye mkoba wako",
"swap.balance.amount": "Mizani: {{amount}}",
"swap.bestRoute.cost": "Gharama bora za njia ya bei{{gasPrice}} katika gesi. ",
- "swap.bridging.estimatedTime": "Est. time",
"swap.bridging.title": "Swap across networks",
"swap.bridging.warning.description": "You’re swapping from {{fromNetwork}} to {{toNetwork}}.",
"swap.button.max": "Upeo",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Ada ya ishara",
"swap.details.newQuote.input": "Ingizo mpya",
"swap.details.newQuote.output": "Toleo jipya",
- "swap.details.orderRouting": "Uelekezaji wa agizo",
- "swap.details.orderRoutingInfo": "Your price already includes network costs on the destination network and a 0.05% Across fee.",
"swap.details.rate": "Kiwango",
"swap.details.slippage": "Utelezi mkubwa zaidi",
"swap.details.uniswapFee": "Ada",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Tafuta ishara",
"tokens.selector.section.bridging": "Swap across networks",
"tokens.selector.section.favorite": "Vipendwa",
- "tokens.selector.section.otherSearchResults": "Other tokens on {{network}}",
"tokens.selector.section.recent": "Utafutaji wa hivi majuzi",
"tokens.selector.section.search": "Matokeo ya utafutaji",
"tokens.selector.section.yours": "Ishara zako",
diff --git a/packages/uniswap/src/i18n/locales/translations/th-TH.json b/packages/uniswap/src/i18n/locales/translations/th-TH.json
index a9f0e8fd12b..9253a5c8d96 100644
--- a/packages/uniswap/src/i18n/locales/translations/th-TH.json
+++ b/packages/uniswap/src/i18n/locales/translations/th-TH.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "ผู้รับ",
"analytics.allow": "อนุญาตการวิเคราะห์",
"analytics.allow.message": "เราใช้ข้อมูลที่ไม่เปิดเผยตัวตนเพื่อปรับปรุงประสบการณ์ของคุณกับผลิตภัณฑ์ Uniswap Labs",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}นาที {{seconds}}วินาที",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}นาที",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}ส",
"burn.input.enterAPercent.error": "ป้อนเปอร์เซ็นต์",
"chart.candlestick": "เชิงเทียน",
"chart.error.pools": "ไม่สามารถแสดงข้อมูลประวัติสำหรับพูลปัจจุบันได้",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "อนุมัติในกระเป๋าเงินของคุณ",
"swap.balance.amount": "ยอดคงเหลือ: {{amount}}",
"swap.bestRoute.cost": "เส้นทางราคาที่ดีที่สุดต้นทุน ~{{gasPrice}} ในก๊าซ ",
- "swap.bridging.estimatedTime": "เวลาโดยประมาณ",
"swap.bridging.title": "สลับข้ามเครือข่าย",
"swap.bridging.warning.description": "คุณกำลังสลับจาก {{fromNetwork}} เป็น {{toNetwork}}",
"swap.button.max": "สูงสุด",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "ค่าธรรมเนียมโทเค็น",
"swap.details.newQuote.input": "อินพุตใหม่",
"swap.details.newQuote.output": "เอาท์พุทใหม่",
- "swap.details.orderRouting": "เส้นทางการสั่งซื้อ",
- "swap.details.orderRoutingInfo": "ราคาของคุณรวมค่าใช้จ่ายเครือข่ายในเครือข่ายปลายทางและค่าธรรมเนียม 0.05% ข้ามเครือข่ายแล้ว",
"swap.details.rate": "ประเมิน",
"swap.details.slippage": "การเลื่อนหลุดสูงสุด",
"swap.details.uniswapFee": "ค่าธรรมเนียม",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "โทเค็นการค้นหา",
"tokens.selector.section.bridging": "สลับข้ามเครือข่าย",
"tokens.selector.section.favorite": "รายการโปรด",
- "tokens.selector.section.otherSearchResults": "โทเค็นอื่นๆ บน {{network}}",
"tokens.selector.section.recent": "การค้นหาล่าสุด",
"tokens.selector.section.search": "ผลการค้นหา",
"tokens.selector.section.yours": "โทเค็นของคุณ",
diff --git a/packages/uniswap/src/i18n/locales/translations/tr-TR.json b/packages/uniswap/src/i18n/locales/translations/tr-TR.json
index 73bfa084855..16959d6f9b7 100644
--- a/packages/uniswap/src/i18n/locales/translations/tr-TR.json
+++ b/packages/uniswap/src/i18n/locales/translations/tr-TR.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Alıcı",
"analytics.allow": "Analitiklere izin ver",
"analytics.allow.message": "Uniswap Labs ürünleriyle deneyiminizi geliştirmek için anonimleştirilmiş veriler kullanıyoruz.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}dak {{seconds}}sn",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}dakika",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}saniyeler",
"burn.input.enterAPercent.error": "Yüzde girin",
"chart.candlestick": "Şamdan",
"chart.error.pools": "Geçerli havuza ilişkin geçmiş veriler görüntülenemiyor.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Cüzdanınızda onaylayın",
"swap.balance.amount": "Bakiye: {{amount}}",
"swap.bestRoute.cost": "En iyi fiyat rota maliyeti benzinde ~{{gasPrice}} . ",
- "swap.bridging.estimatedTime": "Tahmini zaman",
"swap.bridging.title": "Ağlar arasında geçiş yapın",
"swap.bridging.warning.description": "{{fromNetwork}} değerinden {{toNetwork}}değerine geçiş yapıyorsunuz.",
"swap.button.max": "Maksimum",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Jeton ücreti",
"swap.details.newQuote.input": "Yeni giriş",
"swap.details.newQuote.output": "Yeni çıktı",
- "swap.details.orderRouting": "Sipariş yönlendirme",
- "swap.details.orderRoutingInfo": "Fiyatınıza hedef ağdaki ağ maliyetleri ve %0,05 Across ücreti dahildir.",
"swap.details.rate": "Oran",
"swap.details.slippage": "Maksimum kayma",
"swap.details.uniswapFee": "Ücret",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Jeton ara",
"tokens.selector.section.bridging": "Ağlar arasında geçiş yapın",
"tokens.selector.section.favorite": "Favoriler",
- "tokens.selector.section.otherSearchResults": "{{network}}üzerindeki diğer tokenlar",
"tokens.selector.section.recent": "Son aramalar",
"tokens.selector.section.search": "Arama Sonuçları",
"tokens.selector.section.yours": "Jetonlarınız",
diff --git a/packages/uniswap/src/i18n/locales/translations/uk-UA.json b/packages/uniswap/src/i18n/locales/translations/uk-UA.json
index 0d9bacf27d9..44d516c4256 100644
--- a/packages/uniswap/src/i18n/locales/translations/uk-UA.json
+++ b/packages/uniswap/src/i18n/locales/translations/uk-UA.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "одержувач",
"analytics.allow": "Дозволити аналітику",
"analytics.allow.message": "Ми використовуємо анонімні дані, щоб покращити ваш досвід роботи з продуктами Uniswap Labs.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}хв {{seconds}}с",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}хв",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}с",
"burn.input.enterAPercent.error": "Введіть відсоток",
"chart.candlestick": "Свічник",
"chart.error.pools": "Не вдалося відобразити історичні дані для поточного пулу.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Підтвердити в гаманці",
"swap.balance.amount": "Баланс: {{amount}}",
"swap.bestRoute.cost": "Найкращий маршрут коштує ~{{gasPrice}} газу. ",
- "swap.bridging.estimatedTime": "Приблизно час",
"swap.bridging.title": "Перемикатися між мережами",
"swap.bridging.warning.description": "Ви міняєтеся з {{fromNetwork}} на {{toNetwork}}.",
"swap.button.max": "Макс",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Символічна плата",
"swap.details.newQuote.input": "Новий вхід",
"swap.details.newQuote.output": "Новий вихід",
- "swap.details.orderRouting": "Маршрутизація замовлень",
- "swap.details.orderRoutingInfo": "Ваша ціна вже включає мережеві витрати в мережі призначення та 0,05% комісії за передачу.",
"swap.details.rate": "Оцінка",
"swap.details.slippage": "Максимальне ковзання",
"swap.details.uniswapFee": "Комісія",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Пошук токенів",
"tokens.selector.section.bridging": "Перемикатися між мережами",
"tokens.selector.section.favorite": "Вибране",
- "tokens.selector.section.otherSearchResults": "Інші токени на {{network}}",
"tokens.selector.section.recent": "Останні пошуки",
"tokens.selector.section.search": "Результати пошуку",
"tokens.selector.section.yours": "Ваші жетони",
diff --git a/packages/uniswap/src/i18n/locales/translations/ur-PK.json b/packages/uniswap/src/i18n/locales/translations/ur-PK.json
index 3bcd4a454a9..3d641436f13 100644
--- a/packages/uniswap/src/i18n/locales/translations/ur-PK.json
+++ b/packages/uniswap/src/i18n/locales/translations/ur-PK.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "وصول کنندہ",
"analytics.allow": "تجزیات کی اجازت دیں۔",
"analytics.allow.message": "ہم Unswap Labs مصنوعات کے ساتھ آپ کے تجربے کو بڑھانے کے لیے گمنام ڈیٹا استعمال کرتے ہیں۔",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}منٹ {{seconds}}s",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}منٹ",
- "bridging.estimatedTime.secondsOnly": "{{seconds}}s",
"burn.input.enterAPercent.error": "ایک فیصد درج کریں۔",
"chart.candlestick": "موم بتی",
"chart.error.pools": "موجودہ پول کے لیے تاریخی ڈیٹا ڈسپلے کرنے سے قاصر ہے۔",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "اپنے بٹوے میں منظور کریں۔",
"swap.balance.amount": "بیلنس: {{amount}}",
"swap.bestRoute.cost": "بہترین قیمت کے راستے کی قیمت گیس میں{{gasPrice}} ۔ ",
- "swap.bridging.estimatedTime": "تخمینہ وقت",
"swap.bridging.title": "نیٹ ورکس میں تبادلہ کریں۔",
"swap.bridging.warning.description": "آپ {{fromNetwork}} سے {{toNetwork}}میں تبدیل ہو رہے ہیں۔",
"swap.button.max": "زیادہ سے زیادہ",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "ٹوکن فیس",
"swap.details.newQuote.input": "نیا ان پٹ",
"swap.details.newQuote.output": "نیا آؤٹ پٹ",
- "swap.details.orderRouting": "آرڈر روٹنگ",
- "swap.details.orderRoutingInfo": "آپ کی قیمت میں پہلے سے ہی منزل کے نیٹ ورک پر نیٹ ورک کی لاگت اور 0.05% فیس شامل ہے۔",
"swap.details.rate": "شرح",
"swap.details.slippage": "زیادہ سے زیادہ پھسلنا",
"swap.details.uniswapFee": "فیس",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "ٹوکن تلاش کریں۔",
"tokens.selector.section.bridging": "نیٹ ورکس میں تبادلہ کریں۔",
"tokens.selector.section.favorite": "پسندیدہ",
- "tokens.selector.section.otherSearchResults": "{{network}}پر دیگر ٹوکن",
"tokens.selector.section.recent": "حالیہ تلاشیں۔",
"tokens.selector.section.search": "تلاش کے نتائج",
"tokens.selector.section.yours": "آپ کے ٹوکنز",
diff --git a/packages/uniswap/src/i18n/locales/translations/vi-VN.json b/packages/uniswap/src/i18n/locales/translations/vi-VN.json
index bfda791f210..8b3132defb9 100644
--- a/packages/uniswap/src/i18n/locales/translations/vi-VN.json
+++ b/packages/uniswap/src/i18n/locales/translations/vi-VN.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "Người nhận",
"analytics.allow": "Cho phép phân tích",
"analytics.allow.message": "Chúng tôi sử dụng dữ liệu ẩn danh để nâng cao trải nghiệm của bạn với các sản phẩm Uniswap Labs.",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}phút {{seconds}}giây",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}phút",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}giây",
"burn.input.enterAPercent.error": "Nhập phần trăm",
"chart.candlestick": "Chân nến",
"chart.error.pools": "Không thể hiển thị dữ liệu lịch sử cho nhóm hiện tại.",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "Phê duyệt trong ví của bạn",
"swap.balance.amount": "Số dư: {{amount}}",
"swap.bestRoute.cost": "Tuyến đường có giá tốt nhất tốn ~{{gasPrice}} tiền xăng. ",
- "swap.bridging.estimatedTime": "Thời gian ước tính",
"swap.bridging.title": "Hoán đổi qua mạng",
"swap.bridging.warning.description": "Bạn đang hoán đổi từ {{fromNetwork}} sang {{toNetwork}}.",
"swap.button.max": "Tối đa",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "Phí mã thông báo",
"swap.details.newQuote.input": "Đầu vào mới",
"swap.details.newQuote.output": "Đầu ra mới",
- "swap.details.orderRouting": "Định tuyến đơn hàng",
- "swap.details.orderRoutingInfo": "Giá của bạn đã bao gồm chi phí mạng lưới trên mạng đích và phí Across 0,05%.",
"swap.details.rate": "Tỷ lệ",
"swap.details.slippage": "Độ trượt tối đa",
"swap.details.uniswapFee": "Phí",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "Tìm kiếm mã thông báo",
"tokens.selector.section.bridging": "Hoán đổi qua mạng",
"tokens.selector.section.favorite": "Yêu thích",
- "tokens.selector.section.otherSearchResults": "Các mã thông báo khác trên {{network}}",
"tokens.selector.section.recent": "Tìm kiếm gần đây",
"tokens.selector.section.search": "Kết quả tìm kiếm",
"tokens.selector.section.yours": "Mã thông báo của bạn",
diff --git a/packages/uniswap/src/i18n/locales/translations/zh-CN.json b/packages/uniswap/src/i18n/locales/translations/zh-CN.json
index 0abf5ac0cde..2e961167229 100644
--- a/packages/uniswap/src/i18n/locales/translations/zh-CN.json
+++ b/packages/uniswap/src/i18n/locales/translations/zh-CN.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "接受者",
"analytics.allow": "允许分析",
"analytics.allow.message": "我们使用匿名数据来增强您使用 Uniswap Labs 产品的体验。",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}分钟 {{seconds}}秒",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}分钟",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "输入百分比",
"chart.candlestick": "蜡烛图",
"chart.error.pools": "无法显示当前池的历史数据。",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "在钱包中批准",
"swap.balance.amount": "余额:{{amount}}",
"swap.bestRoute.cost": "最优价格路线的 gas 费用约为 {{gasPrice}}。",
- "swap.bridging.estimatedTime": "预计时间",
"swap.bridging.title": "跨网络交换",
"swap.bridging.warning.description": "您正在从 {{fromNetwork}} 交换到 {{toNetwork}}。",
"swap.button.max": "最高",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "代币费用",
"swap.details.newQuote.input": "新输入",
"swap.details.newQuote.output": "新输出",
- "swap.details.orderRouting": "订单路由",
- "swap.details.orderRoutingInfo": "您的价格已经包含目标网络的网络费用和 0.05% 的跨网费。",
"swap.details.rate": "费率",
"swap.details.slippage": "滑点上限",
"swap.details.uniswapFee": "费用",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "搜索代币",
"tokens.selector.section.bridging": "跨网络兑换",
"tokens.selector.section.favorite": "收藏夹",
- "tokens.selector.section.otherSearchResults": "{{network}}上的其他代币",
"tokens.selector.section.recent": "最近搜索",
"tokens.selector.section.search": "搜索结果",
"tokens.selector.section.yours": "您的代币",
diff --git a/packages/uniswap/src/i18n/locales/translations/zh-TW.json b/packages/uniswap/src/i18n/locales/translations/zh-TW.json
index b7d651eb5a9..b20d966a4ad 100644
--- a/packages/uniswap/src/i18n/locales/translations/zh-TW.json
+++ b/packages/uniswap/src/i18n/locales/translations/zh-TW.json
@@ -132,9 +132,6 @@
"addressInput.recipient": "接受者",
"analytics.allow": "允許分析",
"analytics.allow.message": "我們使用匿名資料來增強您使用 Uniswap Labs 產品的體驗。",
- "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s",
- "bridging.estimatedTime.minutesOnly": "~{{minutes}}分鐘",
- "bridging.estimatedTime.secondsOnly": "~{{seconds}}s",
"burn.input.enterAPercent.error": "輸入百分比",
"chart.candlestick": "K 線",
"chart.error.pools": "無法顯示目前集區的過往記錄資料。",
@@ -1693,7 +1690,6 @@
"swap.approveInWallet": "在您的錢包中核准",
"swap.balance.amount": "餘額:{{amount}}",
"swap.bestRoute.cost": "最佳價格路線的 Gas 費用約為 {{gasPrice}}。",
- "swap.bridging.estimatedTime": "預計。時間",
"swap.bridging.title": "跨網路交換",
"swap.bridging.warning.description": "您將從 {{fromNetwork}} 交換到 {{toNetwork}}。",
"swap.button.max": "最大",
@@ -1713,8 +1709,6 @@
"swap.details.feeOnTransfer.default": "代幣費用",
"swap.details.newQuote.input": "新輸入",
"swap.details.newQuote.output": "新輸出",
- "swap.details.orderRouting": "訂單路由",
- "swap.details.orderRoutingInfo": "您的價格已包含目標網路的網路費用和 0.05% 的跨站費用。",
"swap.details.rate": "費率",
"swap.details.slippage": "滑點上限",
"swap.details.uniswapFee": "費用",
@@ -1990,7 +1984,6 @@
"tokens.selector.search.placeholder": "搜尋代幣",
"tokens.selector.section.bridging": "跨網路交換",
"tokens.selector.section.favorite": "常用項目",
- "tokens.selector.section.otherSearchResults": "其他代幣 {{network}}",
"tokens.selector.section.recent": "最近的搜尋",
"tokens.selector.section.search": "搜尋結果",
"tokens.selector.section.yours": "您的代幣",
diff --git a/packages/uniswap/src/test/fixtures/permit.ts b/packages/uniswap/src/test/fixtures/permit.ts
deleted file mode 100644
index 02fe6500e80..00000000000
--- a/packages/uniswap/src/test/fixtures/permit.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { ValidatedPermit } from 'uniswap/src/features/transactions/swap/utils/trade'
-
-export const mockPermit = {
- domain: {
- name: 'Uniswap',
- version: '1.0',
- chainId: 1,
- verifyingContract: '0x123',
- },
- types: {
- real: 'data',
- },
- values: {
- such: 'permit',
- },
-} satisfies ValidatedPermit
diff --git a/packages/uniswap/src/test/fixtures/tradingApi.ts b/packages/uniswap/src/test/fixtures/tradingApi.ts
index 89059362d3f..8a3dfe009b5 100644
--- a/packages/uniswap/src/test/fixtures/tradingApi.ts
+++ b/packages/uniswap/src/test/fixtures/tradingApi.ts
@@ -1,4 +1,4 @@
-import { FeeType, GasEstimateEip1559, GasEstimateLegacy } from 'uniswap/src/data/tradingApi/types'
+import { FeeType, GasEstimateEip1559, GasEstimateLegacy } from 'uniswap/src/data/tradingApi/__generated__'
import { GasFeeEstimates } from 'uniswap/src/features/transactions/types/transactionDetails'
export const createGasFeeEstimates = (): GasFeeEstimates => {
diff --git a/packages/uniswap/src/test/fixtures/transactions/swap.ts b/packages/uniswap/src/test/fixtures/transactions/swap.ts
index 525b0e6d859..ede34e97fff 100644
--- a/packages/uniswap/src/test/fixtures/transactions/swap.ts
+++ b/packages/uniswap/src/test/fixtures/transactions/swap.ts
@@ -9,13 +9,7 @@ import {
Routing,
} from 'uniswap/src/data/tradingApi/__generated__'
import { DerivedSwapInfo } from 'uniswap/src/features/transactions/swap/types/derivedSwapInfo'
-import {
- ApprovalAction,
- ClassicTrade,
- TokenApprovalInfo,
- TradeWithStatus,
- UniswapXTrade,
-} from 'uniswap/src/features/transactions/swap/types/trade'
+import { ClassicTrade, TradeWithStatus, UniswapXTrade } from 'uniswap/src/features/transactions/swap/types/trade'
import { WrapType } from 'uniswap/src/features/transactions/types/wrap'
import { createGasFeeEstimates } from 'uniswap/src/test/fixtures/tradingApi'
import { UniverseChainId } from 'uniswap/src/types/chains'
@@ -69,7 +63,6 @@ export const createMockDerivedSwapInfo = (
outputCurrency: Token,
inputAmount: string,
outputAmount: string,
- overrides: Partial = {},
): DerivedSwapInfo => ({
chainId: UniverseChainId.Mainnet,
currencies: {
@@ -106,7 +99,6 @@ export const createMockDerivedSwapInfo = (
wrapType: WrapType.NotApplicable,
exactAmountToken: CurrencyField.INPUT,
exactCurrencyField: CurrencyField.INPUT,
- ...overrides,
})
const createMockUniswapXOrder = (token: string): DutchOrderInfoV2 => ({
@@ -233,10 +225,3 @@ export const createMockUniswapXTrade = (inputCurrency: Token, outputCurrency: To
},
})
}
-
-export const createMockTokenApprovalInfo = (overrides = {}): TokenApprovalInfo => ({
- action: ApprovalAction.None,
- txRequest: null,
- cancelTxRequest: null,
- ...overrides,
-})
diff --git a/packages/uniswap/src/test/fixtures/wallet/balances.ts b/packages/uniswap/src/test/fixtures/wallet/balances.ts
index a51dc4648b5..0e6e146c998 100644
--- a/packages/uniswap/src/test/fixtures/wallet/balances.ts
+++ b/packages/uniswap/src/test/fixtures/wallet/balances.ts
@@ -35,7 +35,7 @@ export const portfolioBalance = createFixture,
})
}
- return undefined
})
.filter(Boolean) as PortfolioBalance[]) ?? [],
)
diff --git a/packages/uniswap/src/test/mocks/locale.ts b/packages/uniswap/src/test/mocks/locale.ts
index 8fed352f267..fb40cc34e81 100644
--- a/packages/uniswap/src/test/mocks/locale.ts
+++ b/packages/uniswap/src/test/mocks/locale.ts
@@ -2,7 +2,6 @@ import { Currency, CurrencyAmount } from '@uniswap/sdk-core'
import { PropsWithChildren, ReactNode } from 'react'
import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants'
import { LocalizationContextState } from 'uniswap/src/features/language/LocalizationContext'
-import { Locale } from 'uniswap/src/features/language/constants'
// eslint-disable-next-line no-restricted-imports
import {
addFiatSymbolToNumber,
@@ -12,103 +11,77 @@ import {
} from 'utilities/src/format/localeBased'
import { NumberType } from 'utilities/src/format/types'
-export function mockLocalizedFormatter(locale: Locale): LocalizationContextState {
- return {
- conversionRate: 1,
- formatCurrencyAmount(input): string {
- return formatCurrencyAmount({ ...input, amount: input.value, locale })
- },
- formatNumberOrString(input): string {
- return formatNumberOrString({
- ...input,
- price: input.value,
- locale,
- type: input.type || NumberType.TokenNonTx,
- })
- },
- formatPercent(value): string {
- return formatPercent(value, locale)
- },
- addFiatSymbolToNumber(input): string {
- return addFiatSymbolToNumber({
- ...input,
- locale,
- })
- },
- convertFiatAmount(_?: number | undefined): { amount: number; currency: FiatCurrency } {
- throw new Error('Function not implemented.')
- },
- convertFiatAmountFormatted(): string {
- throw new Error('Function not implemented.')
- },
- }
+export const mockLocalizedFormatter: LocalizationContextState = {
+ formatCurrencyAmount(input): string {
+ return formatCurrencyAmount({ ...input, amount: input.value, locale: 'en-US' })
+ },
+ formatNumberOrString(input): string {
+ return formatNumberOrString({
+ ...input,
+ price: input.value,
+ locale: 'en-US',
+ type: input.type || NumberType.TokenNonTx,
+ })
+ },
+ formatPercent(value) {
+ return formatPercent(value, 'en-US')
+ },
+ addFiatSymbolToNumber(input): string {
+ return addFiatSymbolToNumber({
+ ...input,
+ locale: 'en-US',
+ })
+ },
+ convertFiatAmount(_?: number | undefined): { amount: number; currency: FiatCurrency } {
+ throw new Error('Function not implemented.')
+ },
+ convertFiatAmountFormatted(): string {
+ throw new Error('Function not implemented.')
+ },
}
-export function mockFiatConverter({
- locale,
- currency,
-}: {
- locale: Locale
- currency: FiatCurrency
-}): LocalizationContextState {
- return {
- conversionRate: 1,
- convertFiatAmount(amount): { amount: number; currency: FiatCurrency } {
- return { amount: amount ?? 1, currency }
- },
- convertFiatAmountFormatted(fromAmount, numberType, placeholder): string {
- return mockLocalizedFormatter(locale).formatNumberOrString({
- value: fromAmount,
- type: numberType,
- placeholder,
- })
- },
- formatNumberOrString(_: {
- value: Maybe
- type?: NumberType | undefined
- currencyCode?: string | undefined
- placeholder?: string | undefined
- }): string {
- throw new Error('Function not implemented.')
- },
- formatCurrencyAmount(_: {
- value: CurrencyAmount | null | undefined
- type?: NumberType | undefined
- placeholder?: string | undefined
- }): string {
- throw new Error('Function not implemented.')
- },
- formatPercent(_: Maybe): string {
- throw new Error('Function not implemented.')
- },
- addFiatSymbolToNumber(_: { value: Maybe; currencyCode: string; currencySymbol: string }): string {
- throw new Error('Function not implemented.')
- },
- }
+export const mockFiatConverter: LocalizationContextState = {
+ convertFiatAmount(amount): { amount: number; currency: FiatCurrency } {
+ return { amount: amount ?? 1, currency: FiatCurrency.UnitedStatesDollar }
+ },
+ convertFiatAmountFormatted(fromAmount, numberType, placeholder) {
+ return mockLocalizedFormatter.formatNumberOrString({
+ value: fromAmount,
+ type: numberType,
+ placeholder,
+ })
+ },
+ formatNumberOrString(_: {
+ value: Maybe
+ type?: NumberType | undefined
+ currencyCode?: string | undefined
+ placeholder?: string | undefined
+ }): string {
+ throw new Error('Function not implemented.')
+ },
+ formatCurrencyAmount(_: {
+ value: CurrencyAmount | null | undefined
+ type?: NumberType | undefined
+ placeholder?: string | undefined
+ }): string {
+ throw new Error('Function not implemented.')
+ },
+ formatPercent(_: Maybe): string {
+ throw new Error('Function not implemented.')
+ },
+ addFiatSymbolToNumber(_: { value: Maybe; currencyCode: string; currencySymbol: string }): string {
+ throw new Error('Function not implemented.')
+ },
}
-export function mockLocalizationContext({
- locale = Locale.EnglishUnitedStates,
- currency = FiatCurrency.UnitedStatesDollar,
-}: {
- locale?: Locale
- currency?: FiatCurrency
-}): {
- LocalizationContextProvider: ({ children }: PropsWithChildren) => ReactNode
- useLocalizationContext: () => LocalizationContextState
-} {
- const fiatMock = mockFiatConverter({ currency, locale })
- const formatterMock = mockLocalizedFormatter(locale)
- return {
- LocalizationContextProvider: ({ children }: PropsWithChildren): ReactNode => children,
- useLocalizationContext: (): LocalizationContextState => ({
- conversionRate: 1,
- convertFiatAmount: fiatMock.convertFiatAmount,
- convertFiatAmountFormatted: fiatMock.convertFiatAmountFormatted,
- formatNumberOrString: formatterMock.formatNumberOrString,
- formatCurrencyAmount: formatterMock.formatCurrencyAmount,
- formatPercent: formatterMock.formatPercent,
- addFiatSymbolToNumber: formatterMock.addFiatSymbolToNumber,
- }),
- }
+export const mockLocalizationContext = {
+ LocalizationContextProvider: ({ children }: PropsWithChildren): ReactNode => children,
+ useLocalizationContext: (): LocalizationContextState => ({
+ convertFiatAmount: mockFiatConverter.convertFiatAmount,
+ convertFiatAmountFormatted: mockFiatConverter.convertFiatAmountFormatted,
+ formatNumberOrString: mockLocalizedFormatter.formatNumberOrString,
+ formatCurrencyAmount: mockLocalizedFormatter.formatCurrencyAmount,
+ formatPercent: mockLocalizedFormatter.formatPercent,
+ addFiatSymbolToNumber: mockLocalizedFormatter.addFiatSymbolToNumber,
+ }),
}
diff --git a/packages/uniswap/src/theme/heights.ts b/packages/uniswap/src/theme/heights.ts
deleted file mode 100644
index 05448e46564..00000000000
--- a/packages/uniswap/src/theme/heights.ts
+++ /dev/null
@@ -1 +0,0 @@
-export const INTERFACE_NAV_HEIGHT = 72
diff --git a/packages/uniswap/src/types/screens/extension.ts b/packages/uniswap/src/types/screens/extension.ts
index 6e74297613c..b98acb5fe78 100644
--- a/packages/uniswap/src/types/screens/extension.ts
+++ b/packages/uniswap/src/types/screens/extension.ts
@@ -25,7 +25,6 @@ export enum ExtensionOnboardingScreens {
SetPassword = 'SetPassword',
// New Wallet Flow
- ClaimUnitag = 'ClaimUnitag',
NameWallet = 'NameWallet',
ViewSeedPhrase = 'ViewSeedPhrase',
ConfirmSeedPhrase = 'ConfirmSeedPhrase',
diff --git a/packages/uniswap/src/types/screens/mobile.ts b/packages/uniswap/src/types/screens/mobile.ts
index cb62b340650..b9705cc2c66 100644
--- a/packages/uniswap/src/types/screens/mobile.ts
+++ b/packages/uniswap/src/types/screens/mobile.ts
@@ -1,5 +1,3 @@
-import { ExtensionOnboardingFlow } from "uniswap/src/types/screens/extension";
-
export enum MobileScreens {
Dev = 'Dev',
Education = 'Education',
@@ -62,7 +60,7 @@ export enum UnitagScreens {
EditProfile = 'EditProfile',
}
-export type UnitagEntryPoint = OnboardingScreens.Landing | MobileScreens.Home | MobileScreens.Settings | ExtensionOnboardingFlow.New
+export type UnitagEntryPoint = OnboardingScreens.Landing | MobileScreens.Home | MobileScreens.Settings
export type UnitagStackParamList = SharedUnitagScreenParams & {
[UnitagScreens.UnitagConfirmation]: {
diff --git a/packages/uniswap/src/utils/clipboard.native.ts b/packages/uniswap/src/utils/clipboard.native.ts
index af02da48926..12c7fde9765 100644
--- a/packages/uniswap/src/utils/clipboard.native.ts
+++ b/packages/uniswap/src/utils/clipboard.native.ts
@@ -16,7 +16,6 @@ const Clipboard: IClipboard = {
return value
} catch (error) {
logger.error(error, { tags: { file: 'clipboard', function: 'getClipboard' } })
- return undefined
}
},
setClipboardImage: async (imageUrl: string | undefined) => {
diff --git a/packages/uniswap/src/utils/currency.test.ts b/packages/uniswap/src/utils/currency.test.ts
index 3d8155b26fa..2c66f6ec4ed 100644
--- a/packages/uniswap/src/utils/currency.test.ts
+++ b/packages/uniswap/src/utils/currency.test.ts
@@ -1,25 +1,22 @@
import { DAI, USDC } from 'uniswap/src/constants/tokens'
-import { Locale } from 'uniswap/src/features/language/constants'
import { mockLocalizedFormatter } from 'uniswap/src/test/mocks'
import { getCurrencyDisplayText, getFormattedCurrencyAmount } from 'uniswap/src/utils/currency'
import { noOpFunction } from 'utilities/src/test/utils'
-const mockFormatter = mockLocalizedFormatter(Locale.EnglishUnitedStates)
-
describe(getFormattedCurrencyAmount, () => {
it('formats valid amount', () => {
- expect(getFormattedCurrencyAmount(DAI, '1000000000000000000', mockFormatter)).toEqual('1.00 ')
+ expect(getFormattedCurrencyAmount(DAI, '1000000000000000000', mockLocalizedFormatter)).toEqual('1.00 ')
})
it('handles invalid Currency', () => {
- expect(getFormattedCurrencyAmount(undefined, '1', mockFormatter)).toEqual('')
- expect(getFormattedCurrencyAmount(null, '1', mockFormatter)).toEqual('')
+ expect(getFormattedCurrencyAmount(undefined, '1', mockLocalizedFormatter)).toEqual('')
+ expect(getFormattedCurrencyAmount(null, '1', mockLocalizedFormatter)).toEqual('')
})
it('handles error', () => {
// invalid raw amount will throw error
jest.spyOn(console, 'error').mockImplementation(noOpFunction)
- expect(getFormattedCurrencyAmount(USDC, '0.1', mockFormatter)).toEqual('')
+ expect(getFormattedCurrencyAmount(USDC, '0.1', mockLocalizedFormatter)).toEqual('')
})
})
diff --git a/packages/uniswap/tsconfig.json b/packages/uniswap/tsconfig.json
index 59598bed72c..ecbe3a3ea23 100644
--- a/packages/uniswap/tsconfig.json
+++ b/packages/uniswap/tsconfig.json
@@ -4,8 +4,7 @@
"src/**/*.ts",
"src/**/*.d.ts",
"src/**/*.tsx",
- "src/**/*.json",
- "src/**/*.mts"
+ "src/**/*.json"
],
"references": [
{
diff --git a/packages/utilities/package.json b/packages/utilities/package.json
index 8b68309a1ba..eb511752a31 100644
--- a/packages/utilities/package.json
+++ b/packages/utilities/package.json
@@ -21,7 +21,7 @@
"@sentry/react": "7.80.0",
"@sentry/react-native": "5.5.0",
"@uniswap/analytics": "1.7.0",
- "@uniswap/analytics-events": "2.37.0",
+ "@uniswap/analytics-events": "2.36.0",
"@uniswap/sdk-core": "5.3.0",
"aws-appsync-auth-link": "3.0.7",
"aws-appsync-subscription-link": "3.1.3",
diff --git a/packages/utilities/src/environment/env.web.ts b/packages/utilities/src/environment/env.web.ts
index efe797df518..3665642181d 100644
--- a/packages/utilities/src/environment/env.web.ts
+++ b/packages/utilities/src/environment/env.web.ts
@@ -15,8 +15,6 @@ export function isDevEnv(): boolean {
return process.env.NODE_ENV === 'development'
} else if (isExtension) {
return __DEV__ || chrome.runtime.id === EXTENSION_ID_DEV || chrome.runtime.id === EXTENSION_ID_LOCAL
- } else if (isTestEnv()) {
- return false
} else {
throw createAndLogError('isProdEnv')
}
@@ -28,8 +26,6 @@ export function isBetaEnv(): boolean {
return Boolean(process.env.REACT_APP_STAGING)
} else if (isExtension) {
return chrome.runtime.id === EXTENSION_ID_BETA
- } else if (isTestEnv()) {
- return false
} else {
throw createAndLogError('isBetaEnv')
}
@@ -40,8 +36,6 @@ export function isProdEnv(): boolean {
return process.env.NODE_ENV === 'production' && !isBetaEnv()
} else if (isExtension) {
return chrome.runtime.id === EXTENSION_ID_PROD
- } else if (isTestEnv()) {
- return false
} else {
throw createAndLogError('isProdEnv')
}
diff --git a/packages/wallet/jest-setup.js b/packages/wallet/jest-setup.js
index c7d8e91648b..9597adbc8ca 100644
--- a/packages/wallet/jest-setup.js
+++ b/packages/wallet/jest-setup.js
@@ -8,7 +8,7 @@ import { mockSharedPersistQueryClientProvider } from 'uniswap/src/test/mocks/moc
import { mockUIAssets } from 'ui/src/test/mocks/mockUIAssets'
jest.mock('react-native-localize', () => mockRNLocalize)
-jest.mock('uniswap/src/features/language/LocalizationContext', () => mockLocalizationContext({}))
+jest.mock('uniswap/src/features/language/LocalizationContext', () => mockLocalizationContext)
// Mock the appearance hook for all tests
const mockAppearanceSetting = AppearanceSettingType.System
diff --git a/packages/wallet/package.json b/packages/wallet/package.json
index caec50d5dfb..273cf8a188f 100644
--- a/packages/wallet/package.json
+++ b/packages/wallet/package.json
@@ -23,11 +23,11 @@
"@scure/bip32": "1.3.2",
"@sentry/types": "7.80.0",
"@shopify/flash-list": "1.6.3",
- "@uniswap/analytics-events": "2.37.0",
+ "@uniswap/analytics-events": "2.36.0",
"@uniswap/permit2-sdk": "1.3.0",
"@uniswap/router-sdk": "1.9.2",
"@uniswap/sdk-core": "5.3.0",
- "@uniswap/uniswapx-sdk": "^2.1.0-beta.14",
+ "@uniswap/uniswapx-sdk": "^2.1.0-beta.8",
"@uniswap/universal-router-sdk": "2.2.0",
"@uniswap/v3-sdk": "3.14.0",
"apollo3-cache-persist": "0.14.1",
diff --git a/packages/wallet/src/components/CurrencyLogo/LogoWithTxStatus.test.tsx b/packages/wallet/src/components/CurrencyLogo/LogoWithTxStatus.test.tsx
index fe8feb7c189..8e1f9000ecc 100644
--- a/packages/wallet/src/components/CurrencyLogo/LogoWithTxStatus.test.tsx
+++ b/packages/wallet/src/components/CurrencyLogo/LogoWithTxStatus.test.tsx
@@ -12,10 +12,6 @@ import {
} from 'wallet/src/components/CurrencyLogo/LogoWithTxStatus'
import { render } from 'wallet/src/test/test-utils'
-jest.mock('ui/src/components/UniversalImage/internal/PlainImage', () => ({
- ...jest.requireActual('ui/src/components/UniversalImage/internal/PlainImage.web'),
-}))
-
const currencyLogoProps = createFixture()(() => ({
assetType: AssetType.Currency,
txType: TransactionType.Send,
diff --git a/packages/wallet/src/components/CurrencyLogo/LogoWithTxStatus.tsx b/packages/wallet/src/components/CurrencyLogo/LogoWithTxStatus.tsx
index 16e5b922808..7cebfc60183 100644
--- a/packages/wallet/src/components/CurrencyLogo/LogoWithTxStatus.tsx
+++ b/packages/wallet/src/components/CurrencyLogo/LogoWithTxStatus.tsx
@@ -176,8 +176,6 @@ export function DappLogoWithTxStatus({
return
case WalletConnectEvent.TransactionFailed:
return
- default:
- return undefined
}
}
diff --git a/packages/wallet/src/components/CurrencyLogo/__snapshots__/LogoWithTxStatus.test.tsx.snap b/packages/wallet/src/components/CurrencyLogo/__snapshots__/LogoWithTxStatus.test.tsx.snap
index 49b08b466f6..8ace71aa158 100644
--- a/packages/wallet/src/components/CurrencyLogo/__snapshots__/LogoWithTxStatus.test.tsx.snap
+++ b/packages/wallet/src/components/CurrencyLogo/__snapshots__/LogoWithTxStatus.test.tsx.snap
@@ -187,31 +187,11 @@ exports[`LogoWithTxStatus renders without error 1`] = `
"flexDirection": "column",
"height": 40,
"justifyContent": "center",
- "position": "relative",
"width": 40,
}
}
testID="token-logo"
>
-
}
modalName={ModalName.RecipientSelectViewOnlyWarning}
severity={WarningSeverity.High}
@@ -78,8 +78,8 @@ export function RecipientSelectSpeedBumps({
void
+ onConfirm: () => void
onClose: () => void
}
-export function NewAddressWarningModal({ address, onAcknowledge, onClose }: NewAddressWarningModalProps): JSX.Element {
+export function NewAddressWarningModal({ address, onConfirm, onClose }: NewAddressWarningModalProps): JSX.Element {
const { t } = useTranslation()
const validated = getValidAddress(address)
@@ -86,7 +86,7 @@ export function NewAddressWarningModal({ address, onAcknowledge, onClose }: NewA
-
diff --git a/packages/wallet/src/components/WalletPreviewCard/WalletPreviewCard.tsx b/packages/wallet/src/components/WalletPreviewCard/WalletPreviewCard.tsx
index 51dcf85b24b..56c37dc4689 100644
--- a/packages/wallet/src/components/WalletPreviewCard/WalletPreviewCard.tsx
+++ b/packages/wallet/src/components/WalletPreviewCard/WalletPreviewCard.tsx
@@ -53,7 +53,7 @@ export default function WalletPreviewCard({
{balanceFormatted}
)}
- {!hideSelectionCircle && selected && }
+ {!hideSelectionCircle && selected && }
diff --git a/packages/wallet/src/components/WalletPreviewCard/__snapshots__/WalletPreviewCard.test.tsx.snap b/packages/wallet/src/components/WalletPreviewCard/__snapshots__/WalletPreviewCard.test.tsx.snap
index 0a08db473f1..cbc3e640b17 100644
--- a/packages/wallet/src/components/WalletPreviewCard/__snapshots__/WalletPreviewCard.test.tsx.snap
+++ b/packages/wallet/src/components/WalletPreviewCard/__snapshots__/WalletPreviewCard.test.tsx.snap
@@ -205,14 +205,11 @@ exports[`renders wallet preview card 1`] = `
align="xMidYMid"
bbHeight={20}
bbWidth={20}
- fill="none"
focusable={false}
meetOrSlice={0}
minX={0}
minY={0}
- stroke="currentColor"
- strokeLinecap="round"
- strokeWidth={6}
+ strokeWidth={8}
style={
[
{
@@ -232,37 +229,32 @@ exports[`renders wallet preview card 1`] = `
]
}
tintColor="#FC72FF"
- vbHeight={48}
- vbWidth={48}
+ vbHeight={16}
+ vbWidth={16}
>
-
-
+
+ propList={
+ [
+ "fill",
+ "fillRule",
+ ]
+ }
+ >
+
+
+
diff --git a/packages/wallet/src/components/introCards/useSharedIntroCards.ts b/packages/wallet/src/components/introCards/useSharedIntroCards.ts
deleted file mode 100644
index 50d7c74054c..00000000000
--- a/packages/wallet/src/components/introCards/useSharedIntroCards.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-import { useMemo } from 'react'
-import { useTranslation } from 'react-i18next'
-import { useSelector } from 'react-redux'
-import { Person } from 'ui/src/components/icons'
-import { AccountType } from 'uniswap/src/features/accounts/types'
-import { FeatureFlags } from 'uniswap/src/features/gating/flags'
-import { useFeatureFlag } from 'uniswap/src/features/gating/hooks'
-import { OnboardingCardLoggingName } from 'uniswap/src/features/telemetry/types'
-import { CardType } from 'wallet/src/components/introCards/IntroCard'
-import { IntroCardWrapper } from 'wallet/src/components/introCards/IntroCardStack'
-import { selectHasSkippedUnitagPrompt } from 'wallet/src/features/behaviorHistory/selectors'
-import { UNITAG_SUFFIX_NO_LEADING_DOT } from 'wallet/src/features/unitags/constants'
-import { useCanActiveAddressClaimUnitag } from 'wallet/src/features/unitags/hooks'
-import { useUnitagClaimHandler } from 'wallet/src/features/unitags/useUnitagClaimHandler'
-import { useActiveAccountWithThrow } from 'wallet/src/features/wallet/hooks'
-
-export type IntroCardWithLogging = IntroCardWrapper & {
- loggingName: OnboardingCardLoggingName
-}
-
-type useSharedIntroCardsProps = {
- navigateToUnitagClaim: () => void
- navigateToUnitagIntro: () => void
-}
-
-export function useSharedIntroCards({
- navigateToUnitagClaim,
- navigateToUnitagIntro,
-}: useSharedIntroCardsProps): IntroCardWithLogging[] {
- const { t } = useTranslation()
- const activeAccount = useActiveAccountWithThrow()
- const claimUnitagEnabled = useFeatureFlag(FeatureFlags.ExtensionClaimUnitag)
-
- const hasSkippedUnitagPrompt = useSelector(selectHasSkippedUnitagPrompt)
- const { canClaimUnitag } = useCanActiveAddressClaimUnitag()
- const { handleClaim: handleUnitagClaim, handleDismiss: handleUnitagDismiss } = useUnitagClaimHandler({
- analyticsEntryPoint: 'home',
- navigateToClaim: navigateToUnitagClaim,
- navigateToIntro: navigateToUnitagIntro,
- })
-
- const shouldPromptUnitag =
- activeAccount.type === AccountType.SignerMnemonic && !hasSkippedUnitagPrompt && canClaimUnitag
-
- return useMemo(() => {
- const output: IntroCardWithLogging[] = []
-
- if (shouldPromptUnitag && claimUnitagEnabled) {
- output.push({
- loggingName: OnboardingCardLoggingName.ClaimUnitag,
- Icon: Person,
- title: t('onboarding.home.intro.unitag.title', {
- unitagDomain: UNITAG_SUFFIX_NO_LEADING_DOT,
- }),
- description: t('onboarding.home.intro.unitag.description'),
- cardType: CardType.Dismissible,
- onPress: () => handleUnitagClaim(),
- onClose: () => handleUnitagDismiss(),
- })
- }
-
- return output
- }, [claimUnitagEnabled, shouldPromptUnitag, handleUnitagClaim, handleUnitagDismiss, t])
-}
diff --git a/packages/wallet/src/components/modals/InfoLinkModal.tsx b/packages/wallet/src/components/modals/InfoLinkModal.tsx
index 447e0cd5257..6bf93f92d54 100644
--- a/packages/wallet/src/components/modals/InfoLinkModal.tsx
+++ b/packages/wallet/src/components/modals/InfoLinkModal.tsx
@@ -86,9 +86,6 @@ export function InfoLinkModal({
backgroundColor="transparent"
borderRadius="$rounded12"
color="$neutral2"
- hoverStyle={{
- backgroundColor: 'transparent',
- }}
px="$spacing40"
theme="secondary"
onPress={openUniswapURL}
diff --git a/packages/wallet/src/components/nfts/NFTHiddenRow.tsx b/packages/wallet/src/components/nfts/NFTHiddenRow.tsx
index f9fc5068604..b6fc2fee137 100644
--- a/packages/wallet/src/components/nfts/NFTHiddenRow.tsx
+++ b/packages/wallet/src/components/nfts/NFTHiddenRow.tsx
@@ -14,14 +14,8 @@ export function HiddenNftsRow({
const { t } = useTranslation()
return (
-
-
+
+
diff --git a/packages/wallet/src/components/nfts/ShowNFTModal.tsx b/packages/wallet/src/components/nfts/ShowNFTModal.tsx
index 04d91b4301b..c35bf170ae5 100644
--- a/packages/wallet/src/components/nfts/ShowNFTModal.tsx
+++ b/packages/wallet/src/components/nfts/ShowNFTModal.tsx
@@ -28,7 +28,7 @@ export function ShowNFTModal(): JSX.Element {
return (
<>
-
+
diff --git a/packages/wallet/src/components/text/RelativeChange.test.tsx b/packages/wallet/src/components/text/RelativeChange.test.tsx
index 28541bd44dd..3f7f1477022 100644
--- a/packages/wallet/src/components/text/RelativeChange.test.tsx
+++ b/packages/wallet/src/components/text/RelativeChange.test.tsx
@@ -1,6 +1,7 @@
import renderer from 'react-test-renderer'
import { FiatCurrencyInfo } from 'uniswap/src/features/fiatOnRamp/types'
import { Locale } from 'uniswap/src/features/language/constants'
+import { mockLocalizationContext } from 'uniswap/src/test/mocks'
import { TamaguiProvider } from 'wallet/src/providers/tamagui-provider'
// Needs to be imported after the mock localization context
@@ -31,6 +32,8 @@ jest.mock('uniswap/src/features/fiatCurrency/hooks', () => {
}
})
+jest.mock('uniswap/src/features/language/LocalizationContext', () => mockLocalizationContext)
+
it('renders a relative change', () => {
const tree = renderer.create(
diff --git a/packages/wallet/src/contexts/WalletNavigationContext.tsx b/packages/wallet/src/contexts/WalletNavigationContext.tsx
index 10f68accb84..58e43300fc1 100644
--- a/packages/wallet/src/contexts/WalletNavigationContext.tsx
+++ b/packages/wallet/src/contexts/WalletNavigationContext.tsx
@@ -1,11 +1,11 @@
import { createContext, ReactNode, useContext } from 'react'
import { FiatOnRampCurrency } from 'uniswap/src/features/fiatOnRamp/types'
-import { getSwapPrefilledState } from 'uniswap/src/features/transactions/swap/hooks/useSwapPrefilledState'
import { TransactionState } from 'uniswap/src/features/transactions/types/transactionState'
import { WalletChainId } from 'uniswap/src/types/chains'
import { CurrencyField } from 'uniswap/src/types/currency'
import { NFTItem } from 'wallet/src/features/nfts/types'
import { getSendPrefilledState } from 'wallet/src/features/transactions/send/getSendPrefilledState'
+import { getSwapPrefilledState } from 'wallet/src/features/transactions/swap/hooks/useSwapPrefilledState'
type NavigateToTransactionFlowTransactionState = {
initialState: TransactionState
diff --git a/packages/wallet/src/features/activity/hooks.ts b/packages/wallet/src/features/activity/hooks.ts
index 28de10f7218..6b2f1069299 100644
--- a/packages/wallet/src/features/activity/hooks.ts
+++ b/packages/wallet/src/features/activity/hooks.ts
@@ -62,7 +62,7 @@ export function useFormattedTransactionDataForFeed(
const transactions = useMemo(() => {
if (!data) {
- return undefined
+ return
}
return parseDataResponseToFeedTransactionDetails(data, hideSpamTokens)
@@ -90,7 +90,7 @@ export function useFormattedTransactionDataForFeed(
}
if (!hasTransactions) {
- return undefined
+ return
}
return [
@@ -169,7 +169,7 @@ export function useFormattedTransactionDataForActivity(
const formattedTransactions = useMemo(() => {
if (!data) {
- return undefined
+ return
}
return parseDataResponseToTransactionDetails(data, hideSpamTokens, nftVisibility, tokenVisibilityOverrides)
@@ -199,7 +199,7 @@ export function useFormattedTransactionDataForActivity(
}
if (!hasTransactions) {
- return undefined
+ return
}
return [
diff --git a/packages/wallet/src/features/auth/saga.ts b/packages/wallet/src/features/auth/saga.ts
index 312fb4e3b7b..6d6eccea411 100644
--- a/packages/wallet/src/features/auth/saga.ts
+++ b/packages/wallet/src/features/auth/saga.ts
@@ -14,8 +14,6 @@ function* auth(params: UnlockParams | LockParams) {
} else if (params.type === AuthActionType.Lock) {
return yield* call(lock)
}
-
- return undefined
}
function* unlock({ password }: UnlockParams) {
diff --git a/packages/wallet/src/features/behaviorHistory/slice.ts b/packages/wallet/src/features/behaviorHistory/slice.ts
index d49f309ac7f..75ea2cda288 100644
--- a/packages/wallet/src/features/behaviorHistory/slice.ts
+++ b/packages/wallet/src/features/behaviorHistory/slice.ts
@@ -12,7 +12,6 @@ export interface BehaviorHistoryState {
hasUsedExplore: boolean
backupReminderLastSeenTs?: number
hasViewedOffRampTooltip: boolean
- hasDismissedBridgingWarning?: boolean
}
export const initialBehaviorHistoryState: BehaviorHistoryState = {
@@ -23,7 +22,6 @@ export const initialBehaviorHistoryState: BehaviorHistoryState = {
hasUsedExplore: false,
backupReminderLastSeenTs: undefined,
hasViewedOffRampTooltip: false,
- hasDismissedBridgingWarning: false,
}
const slice = createSlice({
@@ -51,9 +49,6 @@ const slice = createSlice({
setHasViewedOffRampTooltip: (state, action: PayloadAction) => {
state.hasViewedOffRampTooltip = action.payload
},
- setHasDismissedBridgingWarning: (state, action: PayloadAction) => {
- state.hasDismissedBridgingWarning = action.payload
- },
// Should only be used for testing
resetBehaviorHistory: (state, _action: PayloadAction) => {
@@ -75,7 +70,6 @@ export const {
setHasUsedExplore,
setBackupReminderLastSeenTs,
setHasViewedOffRampTooltip,
- setHasDismissedBridgingWarning,
resetBehaviorHistory,
} = slice.actions
diff --git a/packages/wallet/src/features/gas/adjustGasFee.ts b/packages/wallet/src/features/gas/adjustGasFee.ts
index ff98d870d0a..0731aedea81 100644
--- a/packages/wallet/src/features/gas/adjustGasFee.ts
+++ b/packages/wallet/src/features/gas/adjustGasFee.ts
@@ -1,5 +1,5 @@
import { BigNumber, BigNumberish, providers } from 'ethers'
-import { FeeType } from 'uniswap/src/data/tradingApi/types'
+import { FeeType } from 'uniswap/src/data/tradingApi/__generated__'
import { GasFeeResult } from 'uniswap/src/features/gas/types'
import { BigNumberMax } from 'wallet/src/utils/number'
diff --git a/packages/wallet/src/features/gas/hooks.ts b/packages/wallet/src/features/gas/hooks.ts
index e0c08f77d08..c7e741d9801 100644
--- a/packages/wallet/src/features/gas/hooks.ts
+++ b/packages/wallet/src/features/gas/hooks.ts
@@ -1,7 +1,7 @@
import { BigNumber, providers } from 'ethers'
import { useCallback, useMemo } from 'react'
import { TRANSACTION_CANCELLATION_GAS_FACTOR } from 'uniswap/src/constants/transactions'
-import { FeeType } from 'uniswap/src/data/tradingApi/types'
+import { FeeType } from 'uniswap/src/data/tradingApi/__generated__'
import { useTransactionGasFee } from 'uniswap/src/features/gas/hooks'
import { isUniswapX } from 'uniswap/src/features/transactions/swap/utils/routing'
import { TransactionDetails } from 'uniswap/src/features/transactions/types/transactionDetails'
@@ -38,13 +38,13 @@ export function useCancelationGasFeeInfo(transaction: TransactionDetails): Cance
return useMemo(() => {
if (isUniswapXTx) {
if (!uniswapXCancelRequest.data || !uniswapXGasFee.value) {
- return undefined
+ return
}
return { cancelRequest: uniswapXCancelRequest.data, cancelationGasFee: uniswapXGasFee.value }
}
if (!baseTxGasFee.params) {
- return undefined
+ return
}
let adjustedFeeDetails: FeeDetails | undefined
@@ -59,7 +59,7 @@ export function useCancelationGasFeeInfo(transaction: TransactionDetails): Cance
tags: { file: 'features/gas/hooks.ts', function: 'getAdjustedGasFeeDetails' },
extra: { request: transaction.options.request, currentGasFeeParams: baseTxGasFee.params },
})
- return undefined
+ return
}
const cancelRequest = {
diff --git a/packages/wallet/src/features/images/ElementAfterText.tsx b/packages/wallet/src/features/images/ElementAfterText.tsx
deleted file mode 100644
index afcedbdc9e2..00000000000
--- a/packages/wallet/src/features/images/ElementAfterText.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-import type { FlexProps, TextProps } from 'ui/src'
-import { Flex, Text, isWeb } from 'ui/src'
-import { usePostTextElementPositionProps } from 'wallet/src/utils/layout'
-
-type ElementAfterTextProps = {
- image?: JSX.Element
- caption: string
- wrapperProps?: FlexProps
- textProps?: TextProps
-}
-
-const DEFAULT_TEXT_PROPS: TextProps = {
- color: '$neutral1',
- variant: 'body2',
-}
-
-export function ElementAfterText({ image, caption, wrapperProps, textProps }: ElementAfterTextProps): JSX.Element {
- const { postTextElementPositionProps, onTextLayout } = usePostTextElementPositionProps()
-
- if (isWeb) {
- return (
-
-
- {caption}
- {image}
-
-
- )
- } else {
- return (
-
-
- {caption}
-
- {image}
-
- )
- }
-}
diff --git a/packages/wallet/src/features/images/RemoteSvg.tsx b/packages/wallet/src/features/images/RemoteSvg.tsx
index 5dfd0ae60eb..3c3bd8eb6b9 100644
--- a/packages/wallet/src/features/images/RemoteSvg.tsx
+++ b/packages/wallet/src/features/images/RemoteSvg.tsx
@@ -26,7 +26,7 @@ export const RemoteSvg = ({
}: Props): JSX.Element | null => {
const fetchSvg = useCallback(async () => {
if (!imageHttpUrl) {
- return undefined
+ return
}
try {
const res = await fetch(imageHttpUrl)
@@ -38,7 +38,6 @@ export const RemoteSvg = ({
tags: { file: 'RemoteSvg', function: 'fetchSvg' },
extra: { imageHttpUrl },
})
- return undefined
}
}, [imageHttpUrl])
diff --git a/packages/wallet/src/features/nfts/utils.ts b/packages/wallet/src/features/nfts/utils.ts
index 24fed51b3ad..04c7910b74f 100644
--- a/packages/wallet/src/features/nfts/utils.ts
+++ b/packages/wallet/src/features/nfts/utils.ts
@@ -5,7 +5,7 @@ import { NFTItem } from 'wallet/src/features/nfts/types'
export function formatNftItems(data: NftsTabQuery | undefined): NFTItem[] | undefined {
const items = data?.nftBalances?.edges?.flatMap((item) => item.node)
if (!items) {
- return undefined
+ return
}
const nfts = items
diff --git a/packages/wallet/src/features/notifications/components/NotificationToast.tsx b/packages/wallet/src/features/notifications/components/NotificationToast.tsx
index 49e34d67387..4211486d67a 100644
--- a/packages/wallet/src/features/notifications/components/NotificationToast.tsx
+++ b/packages/wallet/src/features/notifications/components/NotificationToast.tsx
@@ -11,9 +11,9 @@ import { AnimatedFlex } from 'ui/src/components/layout/AnimatedFlex'
import { borderRadii, spacing } from 'ui/src/theme'
import { TestID } from 'uniswap/src/test/fixtures/testIDs'
import { useTimeout } from 'utilities/src/time/timing'
-import { ElementAfterText } from 'wallet/src/features/images/ElementAfterText'
import { selectActiveAccountNotifications } from 'wallet/src/features/notifications/selectors'
import { popNotification, setNotificationViewed } from 'wallet/src/features/notifications/slice'
+import { usePostTextElementPositionProps } from 'wallet/src/utils/layout'
const NOTIFICATION_HEIGHT = 64
@@ -205,6 +205,7 @@ function NotificationContent({
onPress,
onPressIn,
}: NotificationContentProps): JSX.Element {
+ const { postTextElementPositionProps, onTextLayout } = usePostTextElementPositionProps()
return (
{icon}
-
+
+
+ {title}
+
+ {postCaptionElement}
+
+ {subtitle && (
+
+ {subtitle}
+
+ )}
- {subtitle && (
-
- {subtitle}
-
- )}
{actionButton && (
diff --git a/packages/wallet/src/features/notifications/components/SwapPendingNotification.tsx b/packages/wallet/src/features/notifications/components/SwapPendingNotification.tsx
index 29144832548..a3e835404fe 100644
--- a/packages/wallet/src/features/notifications/components/SwapPendingNotification.tsx
+++ b/packages/wallet/src/features/notifications/components/SwapPendingNotification.tsx
@@ -25,7 +25,6 @@ export function SwapPendingNotification({ notification }: { notification: SwapPe
)
}
-// eslint-disable-next-line consistent-return
function getNotificationText(wrapType: WrapType, t: TFunction): string {
switch (wrapType) {
case WrapType.NotApplicable:
diff --git a/packages/wallet/src/features/notifications/selectors.ts b/packages/wallet/src/features/notifications/selectors.ts
index a03c6c911e2..491fb7fc28f 100644
--- a/packages/wallet/src/features/notifications/selectors.ts
+++ b/packages/wallet/src/features/notifications/selectors.ts
@@ -10,7 +10,7 @@ export const selectActiveAccountNotifications = createSelector(
selectActiveAccountAddress,
(notificationQueue, address) => {
if (!address) {
- return undefined
+ return
}
// If a notification doesn't have an address param assume it belongs to the active account
return notificationQueue.filter((notif) => !notif.address || notif.address === address)
diff --git a/packages/wallet/src/features/notifications/utils.test.ts b/packages/wallet/src/features/notifications/utils.test.ts
index 16b71fce1d2..fb564b52ef6 100644
--- a/packages/wallet/src/features/notifications/utils.test.ts
+++ b/packages/wallet/src/features/notifications/utils.test.ts
@@ -1,17 +1,14 @@
import { TradeType } from '@uniswap/sdk-core'
import { DAI, USDC } from 'uniswap/src/constants/tokens'
-import { Locale } from 'uniswap/src/features/language/constants'
import { TransactionStatus } from 'uniswap/src/features/transactions/types/transactionDetails'
import { mockLocalizedFormatter } from 'uniswap/src/test/mocks'
import { formSwapNotificationTitle } from 'wallet/src/features/notifications/utils'
-const mockFormatter = mockLocalizedFormatter(Locale.EnglishUnitedStates)
-
describe(formSwapNotificationTitle, () => {
it('formats successful local swap title', () => {
expect(
formSwapNotificationTitle(
- mockFormatter,
+ mockLocalizedFormatter,
TransactionStatus.Success,
DAI,
USDC,
@@ -27,7 +24,7 @@ describe(formSwapNotificationTitle, () => {
it('formats successful remote swap title', () => {
expect(
formSwapNotificationTitle(
- mockFormatter,
+ mockLocalizedFormatter,
TransactionStatus.Success,
DAI,
USDC,
@@ -42,7 +39,7 @@ describe(formSwapNotificationTitle, () => {
it('formats canceled swap title', () => {
expect(
formSwapNotificationTitle(
- mockFormatter,
+ mockLocalizedFormatter,
TransactionStatus.Canceled,
DAI,
USDC,
@@ -58,7 +55,7 @@ describe(formSwapNotificationTitle, () => {
it('formats failed swap title', () => {
expect(
formSwapNotificationTitle(
- mockFormatter,
+ mockLocalizedFormatter,
TransactionStatus.Failed,
DAI,
USDC,
diff --git a/packages/wallet/src/features/notifications/utils.ts b/packages/wallet/src/features/notifications/utils.ts
index 98cdd4ec63a..5921beb3799 100644
--- a/packages/wallet/src/features/notifications/utils.ts
+++ b/packages/wallet/src/features/notifications/utils.ts
@@ -11,7 +11,6 @@ import { getCurrencyDisplayText, getFormattedCurrencyAmount, getSymbolDisplayTex
import { currencyIdToAddress } from 'uniswap/src/utils/currencyId'
import { WalletConnectNotification } from 'wallet/src/features/notifications/types'
-// eslint-disable-next-line consistent-return
export const formWCNotificationTitle = (appNotification: WalletConnectNotification): string => {
const { event, dappName, chainId } = appNotification
diff --git a/packages/wallet/src/features/portfolio/AnimatedNumber.tsx b/packages/wallet/src/features/portfolio/AnimatedNumber.tsx
index 68c1f276682..3f7b07a37ed 100644
--- a/packages/wallet/src/features/portfolio/AnimatedNumber.tsx
+++ b/packages/wallet/src/features/portfolio/AnimatedNumber.tsx
@@ -101,7 +101,7 @@ const RollNumber = ({
key={idx}
allowFontScaling={false}
fontFamily="$heading"
- style={[AnimatedFontStyles.fontStyle, { height: DIGIT_HEIGHT, color: nextColor ?? currentColor }]}
+ style={[AnimatedFontStyles.fontStyle, { height: DIGIT_HEIGHT, color: currentColor }]}
>
{char}
diff --git a/packages/wallet/src/features/portfolio/HiddenTokensRow.tsx b/packages/wallet/src/features/portfolio/HiddenTokensRow.tsx
index 958ee23cd30..97805e93282 100644
--- a/packages/wallet/src/features/portfolio/HiddenTokensRow.tsx
+++ b/packages/wallet/src/features/portfolio/HiddenTokensRow.tsx
@@ -1,9 +1,10 @@
import { useTranslation } from 'react-i18next'
import { Flex, ImpactFeedbackStyle, Separator, Text, TouchableArea } from 'ui/src'
import { AnglesDownUp, SortVertical } from 'ui/src/components/icons'
-import { isMobileApp } from 'utilities/src/platform'
+import { TestID } from 'uniswap/src/test/fixtures/testIDs'
export function HiddenTokensRow({
+ padded = false,
numHidden,
isExpanded,
onPress,
@@ -20,29 +21,30 @@ export function HiddenTokensRow({
hapticFeedback
activeOpacity={1}
hapticStyle={ImpactFeedbackStyle.Light}
- mx={isMobileApp && '$spacing16'}
+ mx="$spacing12"
onPress={onPress}
>
-
-
-
-
-
-
+
+
+ {/* just used for opacity styling, the parent TouchableArea handles event */}
+
+
+
{t('hidden.tokens.info.text.button', { numHidden })}
-
-
- {isExpanded ? (
-
- ) : (
-
- )}
-
+ {isExpanded ? (
+
+ ) : (
+
+ )}
-
-
-
+
+
)
diff --git a/packages/wallet/src/features/portfolio/PortfolioBalance.tsx b/packages/wallet/src/features/portfolio/PortfolioBalance.tsx
index 8233bca2c08..2656248b964 100644
--- a/packages/wallet/src/features/portfolio/PortfolioBalance.tsx
+++ b/packages/wallet/src/features/portfolio/PortfolioBalance.tsx
@@ -6,8 +6,6 @@ import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants'
import { useAppFiatCurrency, useAppFiatCurrencyInfo } from 'uniswap/src/features/fiatCurrency/hooks'
import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext'
import { NumberType } from 'utilities/src/format/types'
-import { isWeb } from 'utilities/src/platform'
-import { ONE_SECOND_MS } from 'utilities/src/time/time'
import { RelativeChange } from 'wallet/src/components/text/RelativeChange'
import { isWarmLoadingStatus } from 'wallet/src/data/utils'
import AnimatedNumber from 'wallet/src/features/portfolio/AnimatedNumber'
@@ -16,10 +14,6 @@ interface PortfolioBalanceProps {
owner: Address
}
-// This ensures the color changes quicker after animating on web platforms. This could be
-// safe for mobile to be the same but was kept the same as this animation is fragile
-const BALANCE_CHANGE_INDICATION_DURATION = isWeb ? ONE_SECOND_MS / 2 : ONE_SECOND_MS * 2
-
export const PortfolioBalance = memo(function _PortfolioBalance({ owner }: PortfolioBalanceProps): JSX.Element {
const { data, loading, networkStatus } = usePortfolioTotalValue({
address: owner,
@@ -47,7 +41,7 @@ export const PortfolioBalance = memo(function _PortfolioBalance({ owner }: Portf
} else if (isSwapTransactionInfo(typeInfo)) {
return
- } else if (isBridgeTransactionInfo(typeInfo)) {
- return null // TODO: Update when bridge logo is added
} else if (isWCConfirmTransactionInfo(typeInfo)) {
return
} else if (isWrapTransactionInfo(typeInfo)) {
diff --git a/packages/wallet/src/features/transactions/SummaryCards/DetailsModal/TransactionDetailsModal.tsx b/packages/wallet/src/features/transactions/SummaryCards/DetailsModal/TransactionDetailsModal.tsx
index fe152cc31aa..d95eafc9e1f 100644
--- a/packages/wallet/src/features/transactions/SummaryCards/DetailsModal/TransactionDetailsModal.tsx
+++ b/packages/wallet/src/features/transactions/SummaryCards/DetailsModal/TransactionDetailsModal.tsx
@@ -2,7 +2,7 @@ import dayjs from 'dayjs'
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import { Button, ContextMenu, Flex, Separator, Text, TouchableArea, isWeb } from 'ui/src'
-import { AnglesDownUp, Ellipsis, SortVertical, UniswapX } from 'ui/src/components/icons'
+import { AnglesDownUp, SortVertical, TripleDots, UniswapX } from 'ui/src/components/icons'
import { Modal } from 'uniswap/src/components/modals/Modal'
import { Routing } from 'uniswap/src/data/tradingApi/__generated__/index'
import { AssetType } from 'uniswap/src/entities/assets'
@@ -80,12 +80,12 @@ export function TransactionDetailsHeader({
{isWeb ? (
-
+
) : (
-
+
)}
diff --git a/packages/wallet/src/features/transactions/SummaryCards/DetailsModal/__snapshots__/SwapTransactionDetails.test.tsx.snap b/packages/wallet/src/features/transactions/SummaryCards/DetailsModal/__snapshots__/SwapTransactionDetails.test.tsx.snap
index 24757ec94a3..c0e2db1cefa 100644
--- a/packages/wallet/src/features/transactions/SummaryCards/DetailsModal/__snapshots__/SwapTransactionDetails.test.tsx.snap
+++ b/packages/wallet/src/features/transactions/SummaryCards/DetailsModal/__snapshots__/SwapTransactionDetails.test.tsx.snap
@@ -98,7 +98,7 @@ exports[`SwapTransactionDetails Component renders SwapTransactionDetails without
"borderWidth": 0,
},
{
- "color": "#BFBFBF",
+ "color": "#CECECE",
"height": 20,
"transform": [
{
@@ -114,7 +114,7 @@ exports[`SwapTransactionDetails Component renders SwapTransactionDetails without
},
]
}
- tintColor="#BFBFBF"
+ tintColor="#CECECE"
vbHeight={24}
vbWidth={24}
>
diff --git a/packages/wallet/src/features/transactions/SummaryCards/DetailsModal/__snapshots__/TransactionDetailsModal.test.tsx.snap b/packages/wallet/src/features/transactions/SummaryCards/DetailsModal/__snapshots__/TransactionDetailsModal.test.tsx.snap
index 89471cb2b37..677cb4fa07c 100644
--- a/packages/wallet/src/features/transactions/SummaryCards/DetailsModal/__snapshots__/TransactionDetailsModal.test.tsx.snap
+++ b/packages/wallet/src/features/transactions/SummaryCards/DetailsModal/__snapshots__/TransactionDetailsModal.test.tsx.snap
@@ -271,11 +271,12 @@ exports[`TransactionDetails Components renders TransactionDetailsHeader without
align="xMidYMid"
bbHeight={20}
bbWidth={20}
- fill="none"
+ fill="currentColor"
focusable={false}
meetOrSlice={0}
minX={0}
minY={0}
+ stroke="currentColor"
strokeWidth={8}
style={
[
@@ -300,17 +301,27 @@ exports[`TransactionDetails Components renders TransactionDetailsHeader without
vbWidth={18}
>
@@ -826,7 +837,7 @@ exports[`TransactionDetails Components renders TransactionDetailsInfoRows withou
"borderWidth": 0,
},
{
- "color": "#BFBFBF",
+ "color": "#CECECE",
"height": 16,
"width": 16,
},
@@ -837,7 +848,7 @@ exports[`TransactionDetails Components renders TransactionDetailsInfoRows withou
},
]
}
- tintColor="#BFBFBF"
+ tintColor="#CECECE"
vbHeight={16}
vbWidth={16}
>
diff --git a/packages/wallet/src/features/transactions/SummaryCards/DetailsModal/types.ts b/packages/wallet/src/features/transactions/SummaryCards/DetailsModal/types.ts
index 97dc0e73873..9b7bbcad45f 100644
--- a/packages/wallet/src/features/transactions/SummaryCards/DetailsModal/types.ts
+++ b/packages/wallet/src/features/transactions/SummaryCards/DetailsModal/types.ts
@@ -1,5 +1,4 @@
import {
- BridgeTransactionInfo,
ConfirmedSwapTransactionInfo,
ExactInputSwapTransactionInfo,
ExactOutputSwapTransactionInfo,
@@ -67,10 +66,6 @@ export function isSwapTransactionInfo(typeInfo: TransactionTypeInfo): typeInfo i
return typeInfo.type === TransactionType.Swap
}
-export function isBridgeTransactionInfo(typeInfo: TransactionTypeInfo): typeInfo is BridgeTransactionInfo {
- return typeInfo.type === TransactionType.Bridge
-}
-
export function isWCConfirmTransactionInfo(typeInfo: TransactionTypeInfo): typeInfo is WCConfirmInfo {
return typeInfo.type === TransactionType.WCConfirm
}
diff --git a/packages/wallet/src/features/transactions/SummaryCards/SummaryItems/TransactionSummaryLayout.tsx b/packages/wallet/src/features/transactions/SummaryCards/SummaryItems/TransactionSummaryLayout.tsx
index 2afcda78fa2..513eb1b496e 100644
--- a/packages/wallet/src/features/transactions/SummaryCards/SummaryItems/TransactionSummaryLayout.tsx
+++ b/packages/wallet/src/features/transactions/SummaryCards/SummaryItems/TransactionSummaryLayout.tsx
@@ -9,7 +9,6 @@ import { FeatureFlags } from 'uniswap/src/features/gating/flags'
import { useFeatureFlag } from 'uniswap/src/features/gating/hooks'
import { TransactionStatus } from 'uniswap/src/features/transactions/types/transactionDetails'
import { DisplayNameText } from 'wallet/src/components/accounts/DisplayNameText'
-import { ElementAfterText } from 'wallet/src/features/images/ElementAfterText'
import { TransactionDetailsModal } from 'wallet/src/features/transactions/SummaryCards/DetailsModal/TransactionDetailsModal'
import { useTransactionActions } from 'wallet/src/features/transactions/SummaryCards/DetailsModal/useTransactionActions'
import { TransactionSummaryTitle } from 'wallet/src/features/transactions/SummaryCards/SummaryItems/TransactionSummaryTitle'
@@ -22,6 +21,7 @@ import {
} from 'wallet/src/features/transactions/SummaryCards/utils'
import { useIsQueuedTransaction } from 'wallet/src/features/transactions/hooks'
import { useActiveAccountWithThrow, useDisplayName } from 'wallet/src/features/wallet/hooks'
+import { usePostTextElementPositionProps } from 'wallet/src/utils/layout'
import { openTransactionLink } from 'wallet/src/utils/linking'
const LOADING_SPINNER_SIZE = 20
@@ -74,6 +74,8 @@ function TransactionSummaryLayout({
}
}
+ const { postTextElementPositionProps, onTextLayout } = usePostTextElementPositionProps()
+
const formattedAddedTime = useFormattedTime(transaction.addedTime)
const statusIconFill = colors.surface1.get()
@@ -136,14 +138,12 @@ function TransactionSummaryLayout({
{!inProgress && rightBlock}
-
+
+
+ {caption}
+
+ {postCaptionElement}
+
{status === TransactionStatus.Failed && onRetry && (
diff --git a/packages/wallet/src/features/transactions/SummaryCards/utils.ts b/packages/wallet/src/features/transactions/SummaryCards/utils.ts
index 3dab9574bc4..51849869350 100644
--- a/packages/wallet/src/features/transactions/SummaryCards/utils.ts
+++ b/packages/wallet/src/features/transactions/SummaryCards/utils.ts
@@ -76,7 +76,6 @@ export function generateActivityItemRenderer(
case TransactionType.Send:
SummaryItem = SendSummaryItem
break
- case TransactionType.Bridge: // TODO: Add bridge summary item in next PR
case TransactionType.Swap:
SummaryItem = SwapSummaryItem
break
diff --git a/packages/wallet/src/features/transactions/TransactionHistoryUpdater.tsx b/packages/wallet/src/features/transactions/TransactionHistoryUpdater.tsx
index cdb85ff2484..8f36b1244e1 100644
--- a/packages/wallet/src/features/transactions/TransactionHistoryUpdater.tsx
+++ b/packages/wallet/src/features/transactions/TransactionHistoryUpdater.tsx
@@ -214,12 +214,12 @@ export function getReceiveNotificationFromData(
hideSpamTokens = false,
): ReceiveCurrencyTxNotification | ReceiveNFTNotification | undefined {
if (!data || !lastTxNotificationUpdateTimestamp) {
- return undefined
+ return
}
const parsedTxHistory = parseDataResponseToTransactionDetails(data, hideSpamTokens)
if (!parsedTxHistory) {
- return undefined
+ return
}
const latestReceivedTx = parsedTxHistory
@@ -232,9 +232,13 @@ export function getReceiveNotificationFromData(
tx.status === TransactionStatus.Success,
)
+ if (!latestReceivedTx) {
+ return
+ }
+
// Suppress notification if rules apply
- if (!latestReceivedTx || shouldSuppressNotification(latestReceivedTx)) {
- return undefined
+ if (shouldSuppressNotification(latestReceivedTx)) {
+ return
}
return buildReceiveNotification(latestReceivedTx, address)
diff --git a/packages/wallet/src/features/transactions/cancelTransactionSaga.ts b/packages/wallet/src/features/transactions/cancelTransactionSaga.ts
index 679a06ab783..568be67b278 100644
--- a/packages/wallet/src/features/transactions/cancelTransactionSaga.ts
+++ b/packages/wallet/src/features/transactions/cancelTransactionSaga.ts
@@ -4,7 +4,7 @@ import { Contract, providers } from 'ethers'
import { call, select } from 'typed-redux-saga'
import PERMIT2_ABI from 'uniswap/src/abis/permit2.json'
import { Permit2 } from 'uniswap/src/abis/types'
-import { isBridge, isClassic, isUniswapX } from 'uniswap/src/features/transactions/swap/utils/routing'
+import { isClassic } from 'uniswap/src/features/transactions/swap/utils/routing'
import { TransactionDetails, UniswapXOrderDetails } from 'uniswap/src/features/transactions/types/transactionDetails'
import { getValidAddress } from 'uniswap/src/utils/addresses'
import { logger } from 'utilities/src/logger/logger'
@@ -21,9 +21,9 @@ export function* attemptCancelTransaction(
transaction: TransactionDetails,
cancelRequest: providers.TransactionRequest,
) {
- if (isClassic(transaction) || isBridge(transaction)) {
+ if (isClassic(transaction)) {
yield* call(attemptReplaceTransaction, transaction, cancelRequest, true)
- } else if (isUniswapX(transaction)) {
+ } else {
yield* call(cancelOrder, transaction, cancelRequest)
}
}
@@ -41,7 +41,7 @@ export async function getCancelOrderTxRequest(
} else {
const { encodedOrder } = (await getOrders([orderHash])).orders[0] ?? {}
if (!encodedOrder) {
- return undefined
+ return
}
const nonce = CosignedV2DutchOrder.parse(encodedOrder, chainId).info.nonce
diff --git a/packages/wallet/src/features/transactions/getAmountsFromTrade.ts b/packages/wallet/src/features/transactions/getAmountsFromTrade.ts
index 5ac744bbb31..b0f7382d7fc 100644
--- a/packages/wallet/src/features/transactions/getAmountsFromTrade.ts
+++ b/packages/wallet/src/features/transactions/getAmountsFromTrade.ts
@@ -1,21 +1,15 @@
import { TradeType } from '@uniswap/sdk-core'
import {
- BridgeTransactionInfo,
ConfirmedSwapTransactionInfo,
ExactInputSwapTransactionInfo,
ExactOutputSwapTransactionInfo,
- isBridgeTypeInfo,
isConfirmedSwapTypeInfo,
} from 'uniswap/src/features/transactions/types/transactionDetails'
export function getAmountsFromTrade(
- typeInfo:
- | ExactInputSwapTransactionInfo
- | ExactOutputSwapTransactionInfo
- | ConfirmedSwapTransactionInfo
- | BridgeTransactionInfo,
+ typeInfo: ExactInputSwapTransactionInfo | ExactOutputSwapTransactionInfo | ConfirmedSwapTransactionInfo,
): { inputCurrencyAmountRaw: string; outputCurrencyAmountRaw: string } {
- if (isConfirmedSwapTypeInfo(typeInfo) || isBridgeTypeInfo(typeInfo)) {
+ if (isConfirmedSwapTypeInfo(typeInfo)) {
const { inputCurrencyAmountRaw, outputCurrencyAmountRaw } = typeInfo
return { inputCurrencyAmountRaw, outputCurrencyAmountRaw }
}
diff --git a/packages/wallet/src/features/transactions/history/conversion/extractFiatOnRampTransactionDetails.ts b/packages/wallet/src/features/transactions/history/conversion/extractFiatOnRampTransactionDetails.ts
index 41bfd8c3479..4b8c1a6ba59 100644
--- a/packages/wallet/src/features/transactions/history/conversion/extractFiatOnRampTransactionDetails.ts
+++ b/packages/wallet/src/features/transactions/history/conversion/extractFiatOnRampTransactionDetails.ts
@@ -96,7 +96,7 @@ export function extractFiatOnRampTransactionDetails(
function: 'extractFiatOnRampTransactionDetails',
},
})
- return undefined
+ return
}
}
diff --git a/packages/wallet/src/features/transactions/history/conversion/extractUniswapXOrderDetails.ts b/packages/wallet/src/features/transactions/history/conversion/extractUniswapXOrderDetails.ts
index a6c336be458..6f19b2e1abe 100644
--- a/packages/wallet/src/features/transactions/history/conversion/extractUniswapXOrderDetails.ts
+++ b/packages/wallet/src/features/transactions/history/conversion/extractUniswapXOrderDetails.ts
@@ -24,7 +24,6 @@ export function extractUniswapXOrderDetails(transaction: TransactionListQueryRes
}
const typeInfo = parseUniswapXOrderTransaction(transaction)
- // TODO: does not support parsing priority orders yet since priority orders are not supported in the trading API
const routing = transaction.details.swapOrderType === SwapOrderType.Limit ? Routing.DUTCH_LIMIT : Routing.DUTCH_V2
// TODO (MOB-3609): Parse and show pending limit orders in Activity feed
@@ -45,7 +44,6 @@ export function extractUniswapXOrderDetails(transaction: TransactionListQueryRes
}
}
-// eslint-disable-next-line consistent-return
function remoteOrderStatusToLocalTxStatus(orderStatus: SwapOrderStatus): TransactionStatus {
switch (orderStatus) {
case SwapOrderStatus.Open:
diff --git a/packages/wallet/src/features/transactions/history/conversion/parseTradeTransaction.ts b/packages/wallet/src/features/transactions/history/conversion/parseTradeTransaction.ts
index 9af9db0f6ee..f0ff2dd909a 100644
--- a/packages/wallet/src/features/transactions/history/conversion/parseTradeTransaction.ts
+++ b/packages/wallet/src/features/transactions/history/conversion/parseTradeTransaction.ts
@@ -41,7 +41,7 @@ export default function parseTradeTransaction(
const chainId = fromGraphQLChain(transaction.chain)
if (!chainId) {
- return undefined
+ return
}
const txAssetChanges =
@@ -83,14 +83,14 @@ export default function parseTradeTransaction(
// Invalid input/output info
if (!sent || !received) {
- return undefined
+ return
}
const onlyERC20Tokens = sent.__typename === 'TokenTransfer' && received.__typename === 'TokenTransfer'
const containsNFT = sent.__typename === 'NftTransfer' || received.__typename === 'NftTransfer'
if (!(onlyERC20Tokens || containsNFT)) {
- return undefined
+ return
}
// Token swap
@@ -152,7 +152,7 @@ export default function parseTradeTransaction(
}
if (!inputCurrencyId || !outputCurrencyId) {
- return undefined
+ return
}
return {
@@ -222,6 +222,4 @@ export default function parseTradeTransaction(
transactedUSDValue,
}
}
-
- return undefined
}
diff --git a/packages/wallet/src/features/transactions/history/utils.ts b/packages/wallet/src/features/transactions/history/utils.ts
index 155ac2966c6..d139ea5c033 100644
--- a/packages/wallet/src/features/transactions/history/utils.ts
+++ b/packages/wallet/src/features/transactions/history/utils.ts
@@ -282,11 +282,8 @@ function extractCurrencyIdFromTx(transaction: TransactionDetails | null): Curren
// We only care about output currency because that's the net new asset
return transaction.typeInfo.outputCurrencyId
}
-
- return undefined
}
-// eslint-disable-next-line consistent-return
export function remoteTxStatusToLocalTxStatus(
type: RemoteTransactionType,
status: RemoteTransactionStatus,
diff --git a/packages/wallet/src/features/transactions/hooks.ts b/packages/wallet/src/features/transactions/hooks.ts
index e6ed9253a0a..eaa4926bc91 100644
--- a/packages/wallet/src/features/transactions/hooks.ts
+++ b/packages/wallet/src/features/transactions/hooks.ts
@@ -34,7 +34,7 @@ export function usePendingTransactions(
const transactions = useSelectAddressTransactions(address)
return useMemo(() => {
if (!transactions) {
- return undefined
+ return
}
return transactions.filter(
(tx: { status: TransactionStatus; typeInfo: { type: TransactionType } }) =>
@@ -69,7 +69,7 @@ export function useErroredQueuedOrders(address: Address | null): ErroredQueuedOr
const transactions = useSelectAddressTransactions(address)
return useMemo(() => {
if (!transactions) {
- return undefined
+ return
}
const erroredQueuedOrders: ErroredQueuedOrder[] = []
for (const tx of transactions) {
@@ -86,7 +86,7 @@ export function useSortedPendingTransactions(address: Address | null): Transacti
const transactions = usePendingTransactions(address)
return useMemo(() => {
if (!transactions) {
- return undefined
+ return
}
return transactions.sort((a: TransactionDetails, b: TransactionDetails) => a.addedTime - b.addedTime)
}, [transactions])
@@ -109,14 +109,10 @@ export function useCreateSwapFormState(
const transaction = useSelectTransaction(address, chainId, txId)
const inputCurrencyId =
- transaction?.typeInfo.type === TransactionType.Swap || transaction?.typeInfo.type === TransactionType.Bridge
- ? transaction.typeInfo.inputCurrencyId
- : undefined
+ transaction?.typeInfo.type === TransactionType.Swap ? transaction.typeInfo.inputCurrencyId : undefined
const outputCurrencyId =
- transaction?.typeInfo.type === TransactionType.Swap || transaction?.typeInfo.type === TransactionType.Bridge
- ? transaction.typeInfo.outputCurrencyId
- : undefined
+ transaction?.typeInfo.type === TransactionType.Swap ? transaction.typeInfo.outputCurrencyId : undefined
const inputCurrencyInfo = useCurrencyInfo(inputCurrencyId)
const outputCurrencyInfo = useCurrencyInfo(outputCurrencyId)
@@ -196,7 +192,6 @@ export function useMergeLocalAndRemoteTransactions(
const orderHash = ensureLeading0x(tx.orderHash.toLowerCase())
return orderHashToTxHashMap.get(orderHash) ?? orderHash
}
- return undefined
}
const hashes = new Set()
@@ -297,7 +292,7 @@ function useLowestPendingNonce(): BigNumberish | undefined {
return useMemo(() => {
let min: BigNumberish | undefined
if (!pending) {
- return undefined
+ return
}
pending.map((txn: TransactionDetails) => {
if (isClassic(txn)) {
diff --git a/packages/wallet/src/features/transactions/hooks/useAllTransactionsBetweenAddresses.ts b/packages/wallet/src/features/transactions/hooks/useAllTransactionsBetweenAddresses.ts
index fa9dba5aab9..b8275a0c1f2 100644
--- a/packages/wallet/src/features/transactions/hooks/useAllTransactionsBetweenAddresses.ts
+++ b/packages/wallet/src/features/transactions/hooks/useAllTransactionsBetweenAddresses.ts
@@ -14,7 +14,7 @@ export function useAllTransactionsBetweenAddresses(
const txnsToSearch = useSelectAddressTransactions(sender)
return useMemo(() => {
if (!sender || !recipient || !txnsToSearch) {
- return undefined
+ return
}
return txnsToSearch.filter(
(tx: TransactionDetails) => tx.typeInfo.type === TransactionType.Send && tx.typeInfo.recipient === recipient,
diff --git a/packages/wallet/src/features/transactions/replaceTransactionSaga.ts b/packages/wallet/src/features/transactions/replaceTransactionSaga.ts
index 1ea7bada9c2..1e99ec3e1b8 100644
--- a/packages/wallet/src/features/transactions/replaceTransactionSaga.ts
+++ b/packages/wallet/src/features/transactions/replaceTransactionSaga.ts
@@ -2,7 +2,6 @@ import { BigNumber, providers } from 'ethers'
import { call, put, select } from 'typed-redux-saga'
import { addTransaction, deleteTransaction } from 'uniswap/src/features/transactions/slice'
import {
- BridgeTransactionDetails,
ClassicTransactionDetails,
TransactionDetails,
TransactionStatus,
@@ -19,7 +18,7 @@ import { getProvider, getSignerManager } from 'wallet/src/features/wallet/contex
import { selectAccounts } from 'wallet/src/features/wallet/selectors'
export function* attemptReplaceTransaction(
- transaction: ClassicTransactionDetails | BridgeTransactionDetails,
+ transaction: ClassicTransactionDetails,
newTxRequest: providers.TransactionRequest,
isCancellation = false,
) {
diff --git a/packages/wallet/src/features/transactions/send/SendReviewDetails.tsx b/packages/wallet/src/features/transactions/send/SendReviewDetails.tsx
index cafda2c9dc5..d61a12d80d6 100644
--- a/packages/wallet/src/features/transactions/send/SendReviewDetails.tsx
+++ b/packages/wallet/src/features/transactions/send/SendReviewDetails.tsx
@@ -23,7 +23,6 @@ import {
useTransactionModalContext,
} from 'uniswap/src/features/transactions/TransactionModal/TransactionModalContext'
import { useUSDCValue } from 'uniswap/src/features/transactions/swap/hooks/useUSDCPrice'
-import { WalletChainId } from 'uniswap/src/types/chains'
import { CurrencyField } from 'uniswap/src/types/currency'
import { currencyAddress } from 'uniswap/src/utils/currencyId'
import { NumberType } from 'utilities/src/format/types'
@@ -91,7 +90,7 @@ export function SendReviewDetails({
const transferERC20Callback = useSendERC20Callback(
txId,
- chainId as WalletChainId,
+ chainId,
recipient,
currencyInInfo ? currencyAddress(currencyInInfo.currency) : undefined,
currencyAmounts[CurrencyField.INPUT]?.quotient.toString(),
@@ -103,7 +102,7 @@ export function SendReviewDetails({
const transferNFTCallback = useSendNFTCallback(
txId,
- chainId as WalletChainId,
+ chainId,
recipient,
nftIn?.nftContract?.address,
nftIn?.tokenId,
@@ -186,17 +185,17 @@ export function SendReviewDetails({
{transferWarning?.title && (
)}
@@ -272,7 +271,7 @@ export function SendReviewDetails({
/>
}
- chainId={chainId as WalletChainId}
+ chainId={chainId}
gasFee={gasFee}
showWarning={Boolean(transferWarning)}
warning={transferWarning}
diff --git a/packages/wallet/src/features/transactions/send/hooks/useSendTransactionRequest.ts b/packages/wallet/src/features/transactions/send/hooks/useSendTransactionRequest.ts
index 4bd0ff961a0..499dcb4c310 100644
--- a/packages/wallet/src/features/transactions/send/hooks/useSendTransactionRequest.ts
+++ b/packages/wallet/src/features/transactions/send/hooks/useSendTransactionRequest.ts
@@ -7,7 +7,7 @@ import { Erc1155, Erc20, Erc721 } from 'uniswap/src/abis/types'
import { AssetType } from 'uniswap/src/entities/assets'
import { toSupportedChainId } from 'uniswap/src/features/chains/utils'
import { DerivedSendInfo } from 'uniswap/src/features/transactions/send/types'
-import { UniverseChainId, WalletChainId } from 'uniswap/src/types/chains'
+import { UniverseChainId } from 'uniswap/src/types/chains'
import { CurrencyField } from 'uniswap/src/types/currency'
import { currencyAddress, isNativeCurrencyAddress } from 'uniswap/src/utils/currencyId'
import { useAsyncData } from 'utilities/src/react/hooks'
@@ -25,7 +25,7 @@ export function useSendTransactionRequest(derivedSendInfo: DerivedSendInfo): pro
const transactionFetcher = useCallback(() => {
if (!provider) {
- return undefined
+ return
}
return getSendTransaction(provider, contractManager, account, derivedSendInfo)
@@ -34,7 +34,6 @@ export function useSendTransactionRequest(derivedSendInfo: DerivedSendInfo): pro
return useAsyncData(transactionFetcher).data
}
-// eslint-disable-next-line consistent-return
async function getSendTransaction(
provider: providers.Provider,
contractManager: ContractManager,
@@ -43,7 +42,7 @@ async function getSendTransaction(
): Promise {
const params = getSendParams(account, derivedSendInfo)
if (!params) {
- return undefined
+ return
}
const { type, tokenAddress, chainId } = params
@@ -59,7 +58,6 @@ async function getSendTransaction(
}
}
-// eslint-disable-next-line consistent-return
function getSendParams(account: Account, derivedSendInfo: DerivedSendInfo): SendTokenParams | undefined {
const { currencyAmounts, currencyTypes, chainId, recipient, currencyInInfo, nftIn } = derivedSendInfo
const tokenAddress = currencyInInfo ? currencyAddress(currencyInInfo.currency) : nftIn?.nftContract?.address
@@ -67,19 +65,19 @@ function getSendParams(account: Account, derivedSendInfo: DerivedSendInfo): Send
const assetType = currencyTypes[CurrencyField.INPUT]
if (!chainId || !tokenAddress || !recipient || !assetType) {
- return undefined
+ return
}
switch (assetType) {
case AssetType.ERC1155:
case AssetType.ERC721: {
if (!nftIn) {
- return undefined
+ return
}
return {
account,
- chainId: chainId as WalletChainId,
+ chainId,
toAddress: recipient,
tokenAddress,
type: assetType,
@@ -89,12 +87,12 @@ function getSendParams(account: Account, derivedSendInfo: DerivedSendInfo): Send
case AssetType.Currency: {
if (!currencyInInfo || amount === undefined) {
- return undefined
+ return
}
return {
account,
- chainId: chainId as WalletChainId,
+ chainId,
toAddress: recipient,
tokenAddress,
type: AssetType.Currency,
diff --git a/packages/wallet/src/features/transactions/send/hooks/useSendWarnings.ts b/packages/wallet/src/features/transactions/send/hooks/useSendWarnings.ts
index 6b0ceb9860d..e1131041423 100644
--- a/packages/wallet/src/features/transactions/send/hooks/useSendWarnings.ts
+++ b/packages/wallet/src/features/transactions/send/hooks/useSendWarnings.ts
@@ -25,7 +25,7 @@ export function getSendWarnings(t: TFunction, derivedSendInfo: DerivedSendInfo,
const isMissingRequiredParams = checkIsMissingRequiredParams(
currencyInInfo,
nftIn,
- chainId as WalletChainId,
+ chainId,
recipient,
!!currencyAmountIn,
!!currencyBalanceIn,
diff --git a/packages/wallet/src/features/transactions/sendTransactionSaga.test.ts b/packages/wallet/src/features/transactions/sendTransactionSaga.test.ts
index effffeeb073..0bca10f78f4 100644
--- a/packages/wallet/src/features/transactions/sendTransactionSaga.test.ts
+++ b/packages/wallet/src/features/transactions/sendTransactionSaga.test.ts
@@ -106,7 +106,6 @@ describe(sendTransaction, () => {
maxPriorityFeePerGas: undefined,
maxFeePerGas: undefined,
},
- timeoutTimestampMs: undefined,
},
}),
)
diff --git a/packages/wallet/src/features/transactions/sendTransactionSaga.ts b/packages/wallet/src/features/transactions/sendTransactionSaga.ts
index ea082a206c6..8a7254d4664 100644
--- a/packages/wallet/src/features/transactions/sendTransactionSaga.ts
+++ b/packages/wallet/src/features/transactions/sendTransactionSaga.ts
@@ -7,7 +7,6 @@ import { FeatureFlags, getFeatureFlagName } from 'uniswap/src/features/gating/fl
import { Statsig } from 'uniswap/src/features/gating/sdk/statsig'
import { WalletEventName } from 'uniswap/src/features/telemetry/constants'
import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send'
-import { UniverseEventProperties } from 'uniswap/src/features/telemetry/types'
import { makeSelectAddressTransactions } from 'uniswap/src/features/transactions/selectors'
import { transactionActions } from 'uniswap/src/features/transactions/slice'
import { getBaseTradeAnalyticsProperties } from 'uniswap/src/features/transactions/swap/analytics'
@@ -19,26 +18,16 @@ import {
TransactionStatus,
TransactionType,
TransactionTypeInfo,
- isBridgeTypeInfo,
} from 'uniswap/src/features/transactions/types/transactionDetails'
import { UniverseChainId, WalletChainId } from 'uniswap/src/types/chains'
import { createTransactionId } from 'uniswap/src/utils/createTransactionId'
import { logger } from 'utilities/src/logger/logger'
-import { ONE_MINUTE_MS } from 'utilities/src/time/time'
import { isPrivateRpcSupportedOnChain } from 'wallet/src/features/providers/utils'
import { getSerializableTransactionRequest } from 'wallet/src/features/transactions/utils'
import { getPrivateProvider, getProvider, getSignerManager } from 'wallet/src/features/wallet/context'
import { SignerManager } from 'wallet/src/features/wallet/signing/SignerManager'
import { hexlifyTransaction } from 'wallet/src/utils/transaction'
-// This timeout is used to trigger a log event if the transaction is pending for too long
-const getTransactionTimeoutMs = (chainId: WalletChainId) => {
- if (chainId === UniverseChainId.Mainnet) {
- return 10 * ONE_MINUTE_MS
- }
- return ONE_MINUTE_MS
-}
-
export interface SendTransactionParams {
// internal id used for tracking transactions before they're submitted
// this is optional as an override in txDetail.id calculation
@@ -123,10 +112,9 @@ function* addTransaction(
) {
const id = txId ?? createTransactionId()
const request = getSerializableTransactionRequest(populatedRequest, chainId)
- const timeoutTimestampMs = typeInfo.gasEstimates ? Date.now() + getTransactionTimeoutMs(chainId) : undefined
const transaction: TransactionDetails = {
- routing: isBridgeTypeInfo(typeInfo) ? Routing.BRIDGE : Routing.CLASSIC,
+ routing: Routing.CLASSIC,
id,
chainId,
hash,
@@ -137,12 +125,11 @@ function* addTransaction(
options: {
...options,
request,
- timeoutTimestampMs,
},
transactionOriginType,
}
- if (transaction.typeInfo.type === TransactionType.Swap || transaction.typeInfo.type === TransactionType.Bridge) {
+ if (transaction.typeInfo.type === TransactionType.Swap) {
if (!analytics) {
// Don't expect swaps from WC or Dapps to always provide analytics object
if (transactionOriginType === TransactionOriginType.Internal) {
@@ -152,12 +139,11 @@ function* addTransaction(
})
}
} else {
- const event: UniverseEventProperties[WalletEventName.SwapSubmitted] = {
- routing: transaction.routing === Routing.BRIDGE ? 'BRIDGE' : 'CLASSIC',
+ yield* call(sendAnalyticsEvent, WalletEventName.SwapSubmitted, {
+ routing: transaction.routing,
transaction_hash: hash,
...analytics,
- }
- yield* call(sendAnalyticsEvent, WalletEventName.SwapSubmitted, event)
+ })
}
}
yield* put(transactionActions.addTransaction(transaction))
diff --git a/packages/wallet/src/features/transactions/swap/BridgingModal.tsx b/packages/wallet/src/features/transactions/swap/BridgingModal.tsx
deleted file mode 100644
index dbbd66d5ad1..00000000000
--- a/packages/wallet/src/features/transactions/swap/BridgingModal.tsx
+++ /dev/null
@@ -1,74 +0,0 @@
-import { useCallback, useState } from 'react'
-import { useTranslation } from 'react-i18next'
-import { useDispatch } from 'react-redux'
-import { Checkbox, Flex, Text, TouchableArea } from 'ui/src'
-import { Shuffle } from 'ui/src/components/icons'
-import { iconSizes } from 'ui/src/theme'
-import { NetworkLogo } from 'uniswap/src/components/CurrencyLogo/NetworkLogo'
-import { WarningModal } from 'uniswap/src/components/modals/WarningModal/WarningModal'
-import { WarningSeverity } from 'uniswap/src/components/modals/WarningModal/types'
-import { UNIVERSE_CHAIN_INFO } from 'uniswap/src/constants/chains'
-import { ModalName } from 'uniswap/src/features/telemetry/constants'
-import { UniverseChainId } from 'uniswap/src/types/chains'
-import { setHasDismissedBridgingWarning } from 'wallet/src/features/behaviorHistory/slice'
-
-export function BridgingModal({
- isOpen,
- onContinue,
- onClose,
- fromNetwork,
- toNetwork,
-}: {
- isOpen: boolean
- onClose: () => void
- onContinue: () => void
- fromNetwork: UniverseChainId
- toNetwork: UniverseChainId
-}): JSX.Element {
- const { t } = useTranslation()
- const dispatch = useDispatch()
-
- const [doNotShowAgainPressed, setDoNotShowAgainPressed] = useState(false)
- const onPressDoNotShowAgain = useCallback(() => {
- const toggled = !doNotShowAgainPressed
- dispatch(setHasDismissedBridgingWarning(toggled))
- setDoNotShowAgainPressed(toggled)
- }, [doNotShowAgainPressed, dispatch])
-
- const icon = (
-
-
-
-
-
- )
-
- return (
-
-
-
-
-
- {t('common.dontShowAgain')}
-
-
-
-
- )
-}
diff --git a/packages/wallet/src/features/transactions/swap/createSwapFormFromTxDetails.ts b/packages/wallet/src/features/transactions/swap/createSwapFormFromTxDetails.ts
index ca2d46cc604..811d2c1bc28 100644
--- a/packages/wallet/src/features/transactions/swap/createSwapFormFromTxDetails.ts
+++ b/packages/wallet/src/features/transactions/swap/createSwapFormFromTxDetails.ts
@@ -1,11 +1,7 @@
import { Currency, TradeType } from '@uniswap/sdk-core'
import { AssetType, CurrencyAsset } from 'uniswap/src/entities/assets'
import { ValueType, getCurrencyAmount } from 'uniswap/src/features/tokens/getCurrencyAmount'
-import {
- TransactionDetails,
- TransactionType,
- isBridgeTypeInfo,
-} from 'uniswap/src/features/transactions/types/transactionDetails'
+import { TransactionDetails, TransactionType } from 'uniswap/src/features/transactions/types/transactionDetails'
import { TransactionState } from 'uniswap/src/features/transactions/types/transactionState'
import { CurrencyField } from 'uniswap/src/types/currency'
import { currencyAddress, currencyIdToAddress } from 'uniswap/src/utils/currencyId'
@@ -35,9 +31,8 @@ export function createSwapFormFromTxDetails({
try {
const { typeInfo } = transactionDetails
- const isBridging = isBridgeTypeInfo(typeInfo)
- if (typeInfo.type !== TransactionType.Swap && !isBridging) {
+ if (typeInfo.type !== TransactionType.Swap) {
throw new Error(`Tx hash ${txHash} does not correspond to a swap tx. It is of type ${typeInfo.type}`)
}
@@ -57,11 +52,8 @@ export function createSwapFormFromTxDetails({
type: AssetType.Currency,
}
- const exactCurrencyField = isBridging
- ? CurrencyField.INPUT
- : typeInfo.tradeType === TradeType.EXACT_OUTPUT
- ? CurrencyField.OUTPUT
- : CurrencyField.INPUT
+ const exactCurrencyField =
+ typeInfo.tradeType === TradeType.EXACT_OUTPUT ? CurrencyField.OUTPUT : CurrencyField.INPUT
const { value, currency } =
exactCurrencyField === CurrencyField.INPUT
@@ -82,7 +74,6 @@ export function createSwapFormFromTxDetails({
logger.error(error, {
tags: { file: 'createSwapFormFromTxDetails', function: 'createSwapFormFromTxDetails' },
})
- return undefined
}
}
@@ -143,6 +134,5 @@ export function createWrapFormFromTxDetails({
logger.error(error, {
tags: { file: 'createSwapFormFromTxDetails', function: 'createWrapFormFromTxDetails' },
})
- return undefined
}
}
diff --git a/packages/wallet/src/features/transactions/swap/hooks/useMostRecentSwapTx.ts b/packages/wallet/src/features/transactions/swap/hooks/useMostRecentSwapTx.ts
index 413db93a332..94e7f156993 100644
--- a/packages/wallet/src/features/transactions/swap/hooks/useMostRecentSwapTx.ts
+++ b/packages/wallet/src/features/transactions/swap/hooks/useMostRecentSwapTx.ts
@@ -6,10 +6,9 @@ import { flattenObjectOfObjects } from 'utilities/src/primitives/objects'
export function useMostRecentSwapTx(address: Address): TransactionDetails | undefined {
const transactions = useSelector(selectTransactions)
const addressTransactions = transactions[address]
- if (!addressTransactions) {
- return undefined
+ if (addressTransactions) {
+ return flattenObjectOfObjects(addressTransactions)
+ .filter((tx) => tx.typeInfo.type === TransactionType.Swap)
+ .sort((a, b) => b.addedTime - a.addedTime)[0]
}
- return flattenObjectOfObjects(addressTransactions)
- .filter((tx) => tx.typeInfo.type === TransactionType.Swap)
- .sort((a, b) => b.addedTime - a.addedTime)[0]
}
diff --git a/packages/wallet/src/features/transactions/swap/hooks/useSwapCallback.ts b/packages/wallet/src/features/transactions/swap/hooks/useSwapCallback.ts
index 64cfbed7953..9a12242a47c 100644
--- a/packages/wallet/src/features/transactions/swap/hooks/useSwapCallback.ts
+++ b/packages/wallet/src/features/transactions/swap/hooks/useSwapCallback.ts
@@ -1,7 +1,6 @@
import { SwapEventName } from '@uniswap/analytics-events'
import { useCallback } from 'react'
import { useDispatch, useSelector } from 'react-redux'
-import { Routing } from 'uniswap/src/data/tradingApi/__generated__'
import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext'
import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send'
import { selectSwapStartTimestamp } from 'uniswap/src/features/timing/selectors'
@@ -25,8 +24,9 @@ export function useSwapCallback(): SwapCallback {
account,
swapTxContext,
txId,
- onSuccess,
+ onSubmit,
onFailure,
+ steps,
currencyInAmountUSD,
currencyOutAmountUSD,
isAutoSlippage,
@@ -34,13 +34,8 @@ export function useSwapCallback(): SwapCallback {
} = args
const { trade, gasFee } = swapTxContext
- // unsigned (missing permit signature) swaps are only supported on interface; this is an unreachable state and the following check is included for type safety.
- if (swapTxContext.routing === Routing.CLASSIC && swapTxContext.unsigned) {
- throw new Error('Swaps with async signatures are not implemented for wallet')
- }
-
const analytics = getBaseTradeAnalyticsProperties({ formatter, trade, currencyInAmountUSD, currencyOutAmountUSD })
- appDispatch(swapActions.trigger({ swapTxContext, txId, account, analytics, onSuccess, onFailure }))
+ appDispatch(swapActions.trigger({ swapTxContext, txId, account, analytics, steps, onSubmit, onFailure }))
const blockNumber = getClassicQuoteFromResponse(trade?.quote)?.blockNumber?.toString()
diff --git a/packages/uniswap/src/features/transactions/swap/hooks/useSwapPrefilledState.ts b/packages/wallet/src/features/transactions/swap/hooks/useSwapPrefilledState.ts
similarity index 98%
rename from packages/uniswap/src/features/transactions/swap/hooks/useSwapPrefilledState.ts
rename to packages/wallet/src/features/transactions/swap/hooks/useSwapPrefilledState.ts
index b90cbd3368d..6680444bf87 100644
--- a/packages/uniswap/src/features/transactions/swap/hooks/useSwapPrefilledState.ts
+++ b/packages/wallet/src/features/transactions/swap/hooks/useSwapPrefilledState.ts
@@ -16,7 +16,6 @@ export function useSwapPrefilledState(initialState: TransactionState | undefined
exactAmountFiat: initialState.exactAmountFiat,
exactAmountToken: initialState.exactAmountToken,
exactCurrencyField: initialState.exactCurrencyField,
- filteredChainIds: {},
focusOnCurrencyField: getFocusOnCurrencyFieldFromInitialState(initialState),
input: initialState.input ?? undefined,
output: initialState.output ?? undefined,
diff --git a/packages/wallet/src/features/transactions/swap/modals/QueuedOrderModal.tsx b/packages/wallet/src/features/transactions/swap/modals/QueuedOrderModal.tsx
index 2d95247e1d4..660a92ceb51 100644
--- a/packages/wallet/src/features/transactions/swap/modals/QueuedOrderModal.tsx
+++ b/packages/wallet/src/features/transactions/swap/modals/QueuedOrderModal.tsx
@@ -142,7 +142,7 @@ function useTransactionState(transaction: TransactionDetails | undefined): Trans
return useMemo(() => {
if (!isSwap || !inputCurrency || !outputCurrency) {
- return undefined
+ return
}
const input: TradeableAsset = {
diff --git a/packages/wallet/src/features/transactions/swap/modals/SwapProtectionModal.tsx b/packages/wallet/src/features/transactions/swap/modals/SwapProtectionModal.tsx
index 0d5775a9107..a7db1c078bb 100644
--- a/packages/wallet/src/features/transactions/swap/modals/SwapProtectionModal.tsx
+++ b/packages/wallet/src/features/transactions/swap/modals/SwapProtectionModal.tsx
@@ -14,7 +14,7 @@ export function SwapProtectionInfoModal({ isOpen, onClose }: { isOpen: boolean;
}
isOpen={isOpen}
modalName={ModalName.SwapProtection}
diff --git a/packages/wallet/src/features/transactions/swap/submitOrderSaga.test.ts b/packages/wallet/src/features/transactions/swap/submitOrderSaga.test.ts
index b685bb51c9a..64ff4d20785 100644
--- a/packages/wallet/src/features/transactions/swap/submitOrderSaga.test.ts
+++ b/packages/wallet/src/features/transactions/swap/submitOrderSaga.test.ts
@@ -2,11 +2,10 @@ import { Protocol } from '@uniswap/router-sdk'
import { TradeType } from '@uniswap/sdk-core'
import { testSaga } from 'redux-saga-test-plan'
import { submitOrder } from 'uniswap/src/data/apiClients/tradingApi/TradingApiClient'
-import { DutchOrderInfo, DutchQuoteV2, OrderRequest, Routing } from 'uniswap/src/data/tradingApi/__generated__/index'
+import { OrderRequest, Routing } from 'uniswap/src/data/tradingApi/__generated__/index'
import { WalletEventName } from 'uniswap/src/features/telemetry/constants'
import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send'
import { NativeCurrency } from 'uniswap/src/features/tokens/NativeCurrency'
-import { signTypedData } from 'uniswap/src/features/transactions/signing'
import { addTransaction, finalizeTransaction, updateTransaction } from 'uniswap/src/features/transactions/slice'
import {
QueuedOrderStatus,
@@ -16,7 +15,6 @@ import {
UniswapXOrderDetails,
} from 'uniswap/src/features/transactions/types/transactionDetails'
import { WrapType } from 'uniswap/src/features/transactions/types/wrap'
-import { mockPermit } from 'uniswap/src/test/fixtures/permit'
import { UniverseChainId } from 'uniswap/src/types/chains'
import { currencyId } from 'uniswap/src/utils/currencyId'
import { pushNotification } from 'wallet/src/features/notifications/slice'
@@ -26,15 +24,8 @@ import {
SubmitUniswapXOrderParams,
submitUniswapXOrder,
} from 'wallet/src/features/transactions/swap/submitOrderSaga'
-import { getSignerManager } from 'wallet/src/features/wallet/context'
import { signerMnemonicAccount } from 'wallet/src/test/fixtures'
-const mockSignature = '0xMockSignature'
-const mockSigner = {}
-const mockSignerManager = {
- getSignerForAccount: jest.fn(),
-}
-
const baseSubmitOrderParams = {
chainId: UniverseChainId.Mainnet,
account: signerMnemonicAccount(),
@@ -52,19 +43,14 @@ const baseSubmitOrderParams = {
transactionOriginType: TransactionOriginType.Internal,
},
txId: '1',
- onSuccess: jest.fn(),
+ orderParams: { quote: { orderId: '0xMockOrderHash' } } as unknown as OrderRequest,
+ onSubmit: jest.fn(),
onFailure: jest.fn(),
- quote: {
- orderId: '0xMockOrderHash',
- encodedOrder: '0xMockEncodedOrder',
- orderInfo: {} as DutchOrderInfo,
- } as unknown as DutchQuoteV2,
- permit: mockPermit,
} satisfies SubmitUniswapXOrderParams
const baseExpectedInitialOrderDetails: UniswapXOrderDetails = {
routing: Routing.DUTCH_V2,
- orderHash: '0xMockOrderHash',
+ orderHash: baseSubmitOrderParams.orderParams.quote.orderId,
id: baseSubmitOrderParams.txId,
chainId: baseSubmitOrderParams.chainId,
typeInfo: baseSubmitOrderParams.typeInfo,
@@ -75,12 +61,6 @@ const baseExpectedInitialOrderDetails: UniswapXOrderDetails = {
transactionOriginType: TransactionOriginType.Internal,
}
-const expectedOrderRequest: OrderRequest = {
- signature: mockSignature,
- quote: baseSubmitOrderParams.quote,
- routing: Routing.DUTCH_V2,
-}
-
describe(submitUniswapXOrder, () => {
beforeEach(() => {
let mockTimestamp = 1
@@ -100,13 +80,7 @@ describe(submitUniswapXOrder, () => {
.next()
.put({ type: updateTransaction.type, payload: expectedSubmittedOrderDetails })
.next()
- .call(getSignerManager)
- .next(mockSignerManager)
- .call([mockSignerManager, 'getSignerForAccount'], baseSubmitOrderParams.account)
- .next(mockSigner)
- .call(signTypedData, mockPermit.domain, mockPermit.types, mockPermit.values, mockSigner)
- .next(mockSignature)
- .call(submitOrder, expectedOrderRequest)
+ .call(submitOrder, baseSubmitOrderParams.orderParams)
.next()
.call(sendAnalyticsEvent, WalletEventName.SwapSubmitted, {
routing: Routing.DUTCH_V2,
@@ -116,7 +90,7 @@ describe(submitUniswapXOrder, () => {
.next()
.put(pushNotification({ type: AppNotificationType.SwapPending, wrapType: WrapType.NotApplicable }))
.next()
- .call(baseSubmitOrderParams.onSuccess)
+ .call(baseSubmitOrderParams.onSubmit)
.next()
.isDone()
})
@@ -134,13 +108,7 @@ describe(submitUniswapXOrder, () => {
.next()
.put({ type: updateTransaction.type, payload: expectedSubmittedOrderDetails })
.next()
- .call(getSignerManager)
- .next(mockSignerManager)
- .call([mockSignerManager, 'getSignerForAccount'], baseSubmitOrderParams.account)
- .next(mockSigner)
- .call(signTypedData, mockPermit.domain, mockPermit.types, mockPermit.values, mockSigner)
- .next(mockSignature)
- .call(submitOrder, expectedOrderRequest)
+ .call(submitOrder, baseSubmitOrderParams.orderParams)
.throw(new Error('pretend the order endpoint failed'))
.put({
type: updateTransaction.type,
@@ -176,13 +144,7 @@ describe(submitUniswapXOrder, () => {
.next({ payload: { hash: approveTxHash, status: TransactionStatus.Success } })
.put({ type: updateTransaction.type, payload: expectedSubmittedOrderDetails })
.next()
- .call(getSignerManager)
- .next(mockSignerManager)
- .call([mockSignerManager, 'getSignerForAccount'], baseSubmitOrderParams.account)
- .next(mockSigner)
- .call(signTypedData, mockPermit.domain, mockPermit.types, mockPermit.values, mockSigner)
- .next(mockSignature)
- .call(submitOrder, expectedOrderRequest)
+ .call(submitOrder, baseSubmitOrderParams.orderParams)
.next()
.call(sendAnalyticsEvent, WalletEventName.SwapSubmitted, {
routing: Routing.DUTCH_V2,
@@ -192,7 +154,7 @@ describe(submitUniswapXOrder, () => {
.next()
.put(pushNotification({ type: AppNotificationType.SwapPending, wrapType: WrapType.NotApplicable }))
.next()
- .call(baseSubmitOrderParams.onSuccess)
+ .call(baseSubmitOrderParams.onSubmit)
.next()
.isDone()
})
@@ -214,13 +176,7 @@ describe(submitUniswapXOrder, () => {
.next({ payload: { hash: wrapTxHash, status: TransactionStatus.Success } })
.put({ type: updateTransaction.type, payload: expectedSubmittedOrderDetails })
.next()
- .call(getSignerManager)
- .next(mockSignerManager)
- .call([mockSignerManager, 'getSignerForAccount'], baseSubmitOrderParams.account)
- .next(mockSigner)
- .call(signTypedData, mockPermit.domain, mockPermit.types, mockPermit.values, mockSigner)
- .next(mockSignature)
- .call(submitOrder, expectedOrderRequest)
+ .call(submitOrder, baseSubmitOrderParams.orderParams)
.next()
.call(sendAnalyticsEvent, WalletEventName.SwapSubmitted, {
routing: Routing.DUTCH_V2,
@@ -230,7 +186,7 @@ describe(submitUniswapXOrder, () => {
.next()
.put(pushNotification({ type: AppNotificationType.SwapPending, wrapType: WrapType.NotApplicable }))
.next()
- .call(baseSubmitOrderParams.onSuccess)
+ .call(baseSubmitOrderParams.onSubmit)
.next()
.isDone()
})
@@ -252,13 +208,7 @@ describe(submitUniswapXOrder, () => {
.next({ payload: { hash: approveTxHash, status: TransactionStatus.Success } })
.put({ type: updateTransaction.type, payload: expectedSubmittedOrderDetails })
.next()
- .call(getSignerManager)
- .next(mockSignerManager)
- .call([mockSignerManager, 'getSignerForAccount'], baseSubmitOrderParams.account)
- .next(mockSigner)
- .call(signTypedData, mockPermit.domain, mockPermit.types, mockPermit.values, mockSigner)
- .next(mockSignature)
- .call(submitOrder, expectedOrderRequest)
+ .call(submitOrder, baseSubmitOrderParams.orderParams)
.next()
.call(sendAnalyticsEvent, WalletEventName.SwapSubmitted, {
routing: Routing.DUTCH_V2,
@@ -268,7 +218,7 @@ describe(submitUniswapXOrder, () => {
.next()
.put(pushNotification({ type: AppNotificationType.SwapPending, wrapType: WrapType.NotApplicable }))
.next()
- .call(baseSubmitOrderParams.onSuccess)
+ .call(baseSubmitOrderParams.onSubmit)
.next()
.isDone()
})
diff --git a/packages/wallet/src/features/transactions/swap/submitOrderSaga.ts b/packages/wallet/src/features/transactions/swap/submitOrderSaga.ts
index 6354f0d4cba..bac57ab5bcd 100644
--- a/packages/wallet/src/features/transactions/swap/submitOrderSaga.ts
+++ b/packages/wallet/src/features/transactions/swap/submitOrderSaga.ts
@@ -1,13 +1,11 @@
import { call, put, take } from 'typed-redux-saga'
import { submitOrder } from 'uniswap/src/data/apiClients/tradingApi/TradingApiClient'
-import { DutchQuoteV2, Routing } from 'uniswap/src/data/tradingApi/__generated__/index'
+import { OrderRequest, Routing } from 'uniswap/src/data/tradingApi/__generated__/index'
import { AccountMeta } from 'uniswap/src/features/accounts/types'
import { WalletEventName } from 'uniswap/src/features/telemetry/constants'
import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send'
-import { signTypedData } from 'uniswap/src/features/transactions/signing'
import { finalizeTransaction, transactionActions } from 'uniswap/src/features/transactions/slice'
import { getBaseTradeAnalyticsProperties } from 'uniswap/src/features/transactions/swap/analytics'
-import { ValidatedPermit } from 'uniswap/src/features/transactions/swap/utils/trade'
import {
QueuedOrderStatus,
TransactionOriginType,
@@ -22,7 +20,6 @@ import { logger } from 'utilities/src/logger/logger'
import { ONE_SECOND_MS } from 'utilities/src/time/time'
import { pushNotification } from 'wallet/src/features/notifications/slice'
import { AppNotificationType } from 'wallet/src/features/notifications/types'
-import { getSignerManager } from 'wallet/src/features/wallet/context'
// If the app is closed during the waiting period and then reopened, the saga will resume;
// the order should not be submitted if too much time has passed as it may be stale.
@@ -31,39 +28,26 @@ export const ORDER_STALENESS_THRESHOLD = 45 * ONE_SECOND_MS
export interface SubmitUniswapXOrderParams {
// internal id used for tracking transactions before they're submitted
txId?: string
- quote: DutchQuoteV2
- permit: ValidatedPermit
chainId: WalletChainId
+ orderParams: OrderRequest
account: AccountMeta
typeInfo: TransactionTypeInfo
analytics: ReturnType
approveTxHash?: string
wrapTxHash?: string
- onSuccess: () => void
+ onSubmit: () => void
onFailure: () => void
}
export function* submitUniswapXOrder(params: SubmitUniswapXOrderParams) {
- const {
- quote,
- permit,
- approveTxHash,
- wrapTxHash,
- txId,
- chainId,
- typeInfo,
- account,
- analytics,
- onSuccess,
- onFailure,
- } = params
-
- const orderHash = quote.orderId
+ const { orderParams, approveTxHash, wrapTxHash, txId, chainId, typeInfo, account, analytics, onSubmit, onFailure } =
+ params
// Wait for approval and/or wrap transactions to confirm, otherwise order submission will fail.
let waitingForApproval = Boolean(approveTxHash)
let waitingForWrap = Boolean(wrapTxHash)
+ const orderHash = orderParams.quote.orderId
const order = {
routing: Routing.DUTCH_V2,
orderHash,
@@ -113,13 +97,7 @@ export function* submitUniswapXOrder(params: SubmitUniswapXOrderParams) {
try {
const addedTime = Date.now() // refresh the addedTime to match the actual submission time
yield* put(transactionActions.updateTransaction({ ...order, queueStatus: QueuedOrderStatus.Submitted, addedTime }))
-
- const signerManager = yield* call(getSignerManager)
- const signer = yield* call([signerManager, 'getSignerForAccount'], account)
-
- const signature = yield* call(signTypedData, permit.domain, permit.types, permit.values, signer)
-
- yield* call(submitOrder, { signature, quote, routing: Routing.DUTCH_V2 })
+ yield* call(submitOrder, orderParams)
} catch {
// In the rare event that submission fails, we update the order status to prompt the user.
// If the app is closed before this catch block is reached, orderWatcherSaga will handle the failure upon reopening.
@@ -132,6 +110,6 @@ export function* submitUniswapXOrder(params: SubmitUniswapXOrderParams) {
yield* call(sendAnalyticsEvent, WalletEventName.SwapSubmitted, properties)
yield* put(pushNotification({ type: AppNotificationType.SwapPending, wrapType: WrapType.NotApplicable }))
- // onSuccess does not need to be wrapped in yield* call() here, but doing so makes it easier to test call ordering in submitOrder.test.ts
- yield* call(onSuccess)
+ // onSubmit does not need to be wrapped in yield* call() here, but doing so makes it easier to test call ordering in submitOrder.test.ts
+ yield* call(onSubmit)
}
diff --git a/packages/wallet/src/features/transactions/swap/swapSaga.test.ts b/packages/wallet/src/features/transactions/swap/swapSaga.test.ts
index ef26255ea1d..665df77afb7 100644
--- a/packages/wallet/src/features/transactions/swap/swapSaga.test.ts
+++ b/packages/wallet/src/features/transactions/swap/swapSaga.test.ts
@@ -8,7 +8,7 @@ import JSBI from 'jsbi'
import { expectSaga, testSaga } from 'redux-saga-test-plan'
import { EffectProviders, StaticProvider } from 'redux-saga-test-plan/providers'
import { DAI, USDC } from 'uniswap/src/constants/tokens'
-import { Routing } from 'uniswap/src/data/tradingApi/__generated__/index'
+import { OrderRequest, Routing } from 'uniswap/src/data/tradingApi/__generated__/index'
import { NativeCurrency } from 'uniswap/src/features/tokens/NativeCurrency'
import { getBaseTradeAnalyticsProperties } from 'uniswap/src/features/transactions/swap/analytics'
import { ClassicTrade, UniswapXTrade } from 'uniswap/src/features/transactions/swap/types/trade'
@@ -20,7 +20,6 @@ import {
} from 'uniswap/src/features/transactions/types/transactionDetails'
import { WrapType } from 'uniswap/src/features/transactions/types/wrap'
import { WETH } from 'uniswap/src/test/fixtures'
-import { mockPermit } from 'uniswap/src/test/fixtures/permit'
import { UniverseChainId } from 'uniswap/src/types/chains'
import { currencyId } from 'uniswap/src/utils/currencyId'
import { pushNotification } from 'wallet/src/features/notifications/slice'
@@ -126,11 +125,13 @@ const classicSwapParams = {
gasFee: { value: '5', isLoading: false, error: null },
gasFeeEstimation: {},
approvalError: false,
- permit: undefined,
+ permitData: undefined,
+ permitDataLoading: false,
+ permitSignature: undefined,
swapRequestArgs: undefined,
- unsigned: false,
},
- onSuccess: jest.fn(),
+ steps: [],
+ onSubmit: jest.fn(),
onFailure: jest.fn(),
} satisfies SwapParams
@@ -146,14 +147,16 @@ const uniswapXSwapParams = {
revocationTxRequest: mockRevocationTxRequest,
trade: mockUniswapXTrade,
indicativeTrade: undefined,
- permit: mockPermit,
+ orderParams: { quote: { orderId: '0xMockOrderHash' } } as unknown as OrderRequest,
wrapTxRequest: undefined,
gasFee: { value: '5', isLoading: false, error: null },
- gasFeeEstimation: {},
gasFeeBreakdown: { classicGasUseEstimateUSD: '5', approvalCost: '5', wrapCost: '0' },
approvalError: false,
+ permitData: undefined,
+ permitDataLoading: false,
},
- onSuccess: jest.fn(),
+ steps: [],
+ onSubmit: jest.fn(),
onFailure: jest.fn(),
} satisfies SwapParams
@@ -220,7 +223,7 @@ describe(approveAndSwap, () => {
// Requires manually providing return values for each effect in `.next()`.
testSaga(approveAndSwap, classicSwapParamsWithoutApprove)
.next()
- .call(classicSwapParams.onSuccess)
+ .call(classicSwapParams.onSubmit)
.next()
.call(shouldSubmitViaPrivateRpc, classicSwapParams.swapTxContext.txRequest.chainId)
.next(false)
@@ -259,7 +262,7 @@ describe(approveAndSwap, () => {
.silentRun()
testSaga(approveAndSwap, classicSwapParams)
.next()
- .call(classicSwapParams.onSuccess)
+ .call(classicSwapParams.onSubmit)
.next()
.call(shouldSubmitViaPrivateRpc, classicSwapParams.swapTxContext.txRequest.chainId)
.next(false)
@@ -283,9 +286,8 @@ describe(approveAndSwap, () => {
approveTxHash: '0xMockApprovalTxHash',
wrapTxHash: undefined,
txId: uniswapXSwapParams.txId,
- permit: mockPermit,
- quote: uniswapXSwapParams.swapTxContext.trade.quote.quote,
- onSuccess: uniswapXSwapParams.onSuccess,
+ orderParams: uniswapXSwapParams.swapTxContext.orderParams,
+ onSubmit: uniswapXSwapParams.onSubmit,
onFailure: uniswapXSwapParams.onFailure,
}
@@ -318,8 +320,7 @@ describe(approveAndSwap, () => {
swapTxContext: {
...uniswapXSwapParams.swapTxContext,
wrapTxRequest: mockWrapTxRequest,
- permit: mockPermit,
- gasFeeEstimation: {},
+ permitDataLoading: false,
},
} satisfies SwapParams
@@ -332,7 +333,6 @@ describe(approveAndSwap, () => {
unwrapped: false,
currencyAmountRaw: '1000',
swapTxId: '1',
- gasEstimates: undefined,
},
txId: undefined,
transactionOriginType: TransactionOriginType.Internal,
@@ -346,10 +346,9 @@ describe(approveAndSwap, () => {
approveTxHash: '0xMockApprovalTxHash',
wrapTxHash: '0xMockWrapTxHash',
txId: uniswapXSwapParams.txId,
- permit: mockPermit,
- onSuccess: uniswapXSwapParams.onSuccess,
+ orderParams: uniswapXSwapParams.swapTxContext.orderParams,
+ onSubmit: uniswapXSwapParams.onSubmit,
onFailure: uniswapXSwapParams.onFailure,
- quote: uniswapXSwapParams.swapTxContext.trade.quote.quote,
}
await expectSaga(approveAndSwap, uniswapXSwapEthInputParams)
diff --git a/packages/wallet/src/features/transactions/swap/swapSaga.ts b/packages/wallet/src/features/transactions/swap/swapSaga.ts
index 15538f19348..4f35de5452e 100644
--- a/packages/wallet/src/features/transactions/swap/swapSaga.ts
+++ b/packages/wallet/src/features/transactions/swap/swapSaga.ts
@@ -6,6 +6,7 @@ import { FeatureFlags, getFeatureFlagName } from 'uniswap/src/features/gating/fl
import { Statsig } from 'uniswap/src/features/gating/sdk/statsig'
import { getBaseTradeAnalyticsProperties } from 'uniswap/src/features/transactions/swap/analytics'
import { ValidatedSwapTxContext } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo'
+import { TransactionStep } from 'uniswap/src/features/transactions/swap/utils/generateSwapSteps'
import { tradeToTransactionInfo } from 'uniswap/src/features/transactions/swap/utils/trade'
import {
ApproveTransactionInfo,
@@ -18,7 +19,7 @@ import { pushNotification } from 'wallet/src/features/notifications/slice'
import { AppNotificationType } from 'wallet/src/features/notifications/types'
import { isPrivateRpcSupportedOnChain } from 'wallet/src/features/providers/utils'
import { sendTransaction, tryGetNonce } from 'wallet/src/features/transactions/sendTransactionSaga'
-import { SubmitUniswapXOrderParams, submitUniswapXOrder } from 'wallet/src/features/transactions/swap/submitOrderSaga'
+import { submitUniswapXOrder } from 'wallet/src/features/transactions/swap/submitOrderSaga'
import { wrap } from 'wallet/src/features/transactions/swap/wrapSaga'
import { selectWalletSwapProtectionSetting } from 'wallet/src/features/wallet/selectors'
import { SwapProtectionSetting } from 'wallet/src/features/wallet/slice'
@@ -29,23 +30,23 @@ export type SwapParams = {
account: SignerMnemonicAccountMeta
analytics: ReturnType
swapTxContext: ValidatedSwapTxContext
- onSuccess: () => void
+ steps: TransactionStep[]
+ onSubmit: () => void
onFailure: () => void
}
export function* approveAndSwap(params: SwapParams) {
try {
- const { swapTxContext, account, txId, analytics, onSuccess, onFailure } = params
- const { routing, approveTxRequest } = swapTxContext
+ const { swapTxContext, account, txId, analytics, onSubmit, onFailure } = params
+ const { trade, routing, approveTxRequest } = swapTxContext
const isUniswapX = routing === Routing.DUTCH_V2
- const isBridge = routing === Routing.BRIDGE
const chainId = swapTxContext.trade.inputAmount.currency.chainId
// For classic swaps, trigger UI changes immediately after click
if (!isUniswapX) {
- // onSuccess does not need to be wrapped in yield* call() here, but doing so makes it easier to test call ordering in swapSaga.test.ts
- yield* call(onSuccess)
+ // onSubmit does not need to be wrapped in yield* call() here, but doing so makes it easier to test call ordering in swapSaga.test.ts
+ yield* call(onSubmit)
}
// MEV protection is not needed for UniswapX approval and/or wrap transactions.
@@ -54,7 +55,7 @@ export function* approveAndSwap(params: SwapParams) {
// otherwise for some L2s the Provider might fetch the same nonce for both transactions.
let nonce = yield* call(tryGetNonce, account, chainId)
- const gasFeeEstimation = swapTxContext.gasFeeEstimation
+ const gasFeeEstimation = swapTxContext.routing === Routing.CLASSIC ? swapTxContext.gasFeeEstimation : undefined
let approveTxHash: string | undefined
// Approval Logic
@@ -89,8 +90,7 @@ export function* approveAndSwap(params: SwapParams) {
const typeInfo = tradeToTransactionInfo(swapTxContext.trade, transactedUSDValue, gasFeeEstimation?.swapEstimates)
// Swap Logic - UniswapX
if (isUniswapX) {
- const { trade, wrapTxRequest, permit } = swapTxContext
- const quote = trade.quote.quote
+ const { orderParams, wrapTxRequest } = swapTxContext
let wrapTxHash: string | undefined
// Wrap Logic - UniswapX Eth-input
@@ -102,39 +102,26 @@ export function* approveAndSwap(params: SwapParams) {
inputCurrencyAmount,
swapTxId: txId,
skipPushNotification: true, // wrap is abstracted away in UX; we avoid showing a wrap notification
- gasEstimates: gasFeeEstimation?.wrapEstimates,
})
wrapTxHash = wrapResponse?.transactionResponse.hash
}
- const submitOrderParams: SubmitUniswapXOrderParams = {
- account,
- analytics,
- approveTxHash,
- wrapTxHash,
- permit,
- quote,
- typeInfo,
- chainId,
- txId,
- onSuccess,
- onFailure,
- }
- yield* call(submitUniswapXOrder, submitOrderParams)
- } else if (isBridge) {
- const options = { request: { ...swapTxContext.txRequest, nonce }, submitViaPrivateRpc }
- const sendTransactionParams = {
+ const submitOrderParams = {
txId,
chainId,
+ orderParams,
+ approveTxHash,
+ wrapTxHash,
account,
- options,
typeInfo,
analytics,
- transactionOriginType: TransactionOriginType.Internal,
+ onSubmit,
+ onFailure,
}
- yield* call(sendTransaction, sendTransactionParams)
- yield* put(pushNotification({ type: AppNotificationType.SwapPending, wrapType: WrapType.NotApplicable }))
- } else {
+ yield* call(submitUniswapXOrder, submitOrderParams)
+ }
+ // Swap Logic - Classic
+ else {
const options = { request: { ...swapTxContext.txRequest, nonce }, submitViaPrivateRpc }
const sendTransactionParams = {
txId,
diff --git a/packages/wallet/src/features/transactions/swap/wrapSaga.test.ts b/packages/wallet/src/features/transactions/swap/wrapSaga.test.ts
index b777bf4b671..ba181365fd6 100644
--- a/packages/wallet/src/features/transactions/swap/wrapSaga.test.ts
+++ b/packages/wallet/src/features/transactions/swap/wrapSaga.test.ts
@@ -22,7 +22,6 @@ const wrapTxInfo: WrapTransactionInfo = {
unwrapped: false,
currencyAmountRaw: '200000',
swapTxId: undefined,
- gasEstimates: undefined,
}
const unwrapTxInfo: WrapTransactionInfo = {
diff --git a/packages/wallet/src/features/transactions/swap/wrapSaga.ts b/packages/wallet/src/features/transactions/swap/wrapSaga.ts
index e41bb8a8b1b..d821102e605 100644
--- a/packages/wallet/src/features/transactions/swap/wrapSaga.ts
+++ b/packages/wallet/src/features/transactions/swap/wrapSaga.ts
@@ -3,7 +3,6 @@ import { providers } from 'ethers'
import { call, put } from 'typed-redux-saga'
import { AccountMeta } from 'uniswap/src/features/accounts/types'
import {
- GasFeeEstimates,
TransactionOptions,
TransactionOriginType,
TransactionType,
@@ -24,12 +23,11 @@ export type WrapParams = {
account: AccountMeta
inputCurrencyAmount: CurrencyAmount
skipPushNotification?: boolean
- gasEstimates?: GasFeeEstimates
}
export function* wrap(params: WrapParams) {
try {
- const { account, inputCurrencyAmount, txRequest, txId, skipPushNotification, swapTxId, gasEstimates } = params
+ const { account, inputCurrencyAmount, txRequest, txId, skipPushNotification, swapTxId } = params
let typeInfo: TransactionTypeInfo
if (inputCurrencyAmount.currency.isNative) {
@@ -38,7 +36,6 @@ export function* wrap(params: WrapParams) {
unwrapped: false,
currencyAmountRaw: inputCurrencyAmount.quotient.toString(),
swapTxId,
- gasEstimates,
}
} else {
typeInfo = {
@@ -46,7 +43,6 @@ export function* wrap(params: WrapParams) {
unwrapped: true,
currencyAmountRaw: inputCurrencyAmount.quotient.toString(),
swapTxId,
- gasEstimates,
}
}
@@ -71,7 +67,6 @@ export function* wrap(params: WrapParams) {
return result
} catch (error) {
logger.error(error, { tags: { file: 'wrapSaga', function: 'wrap' } })
- return undefined
}
}
diff --git a/packages/wallet/src/features/transactions/transactionWatcherSaga.test.ts b/packages/wallet/src/features/transactions/transactionWatcherSaga.test.ts
index ea3e9cdda56..de7aaac81da 100644
--- a/packages/wallet/src/features/transactions/transactionWatcherSaga.test.ts
+++ b/packages/wallet/src/features/transactions/transactionWatcherSaga.test.ts
@@ -206,7 +206,6 @@ describe(watchFiatOnRampTransaction, () => {
return confirmedTx
}
}
- return undefined
},
},
[delay(PollingInterval.Fast), Promise.resolve(() => undefined)],
@@ -239,7 +238,6 @@ describe(watchFiatOnRampTransaction, () => {
return confirmedTx
}
}
- return undefined
},
},
])
diff --git a/packages/wallet/src/features/transactions/transactionWatcherSaga.ts b/packages/wallet/src/features/transactions/transactionWatcherSaga.ts
index 7bd1e1d174e..ddeef0bffe4 100644
--- a/packages/wallet/src/features/transactions/transactionWatcherSaga.ts
+++ b/packages/wallet/src/features/transactions/transactionWatcherSaga.ts
@@ -2,11 +2,9 @@
import { ApolloClient, NormalizedCacheObject } from '@apollo/client'
import { SwapEventName } from '@uniswap/analytics-events'
import { TradeType } from '@uniswap/sdk-core'
-import { BigNumber, BigNumberish, providers } from 'ethers'
+import { BigNumberish, providers } from 'ethers'
import { call, delay, fork, put, race, select, take, takeEvery } from 'typed-redux-saga'
import { PollingInterval } from 'uniswap/src/constants/misc'
-import { fetchSwaps } from 'uniswap/src/data/apiClients/tradingApi/TradingApiClient'
-import { SwapStatus } from 'uniswap/src/data/tradingApi/__generated__'
import { FiatOnRampTransactionDetails } from 'uniswap/src/features/fiatOnRamp/types'
import { findGasStrategyName } from 'uniswap/src/features/gas/hooks'
import { getGasPrice } from 'uniswap/src/features/gas/types'
@@ -22,8 +20,7 @@ import {
updateTransaction,
upsertFiatOnRampTransaction,
} from 'uniswap/src/features/transactions/slice'
-import { isBridge, isClassic, isUniswapX } from 'uniswap/src/features/transactions/swap/utils/routing'
-import { toTradingApiSupportedChainId } from 'uniswap/src/features/transactions/swap/utils/tradingApi'
+import { isClassic, isUniswapX } from 'uniswap/src/features/transactions/swap/utils/routing'
import {
BaseSwapTransactionInfo,
FinalizedTransactionDetails,
@@ -53,16 +50,6 @@ import {
} from 'wallet/src/features/transactions/utils'
import { getProvider } from 'wallet/src/features/wallet/context'
-export const SWAP_STATUS_TO_TX_STATUS: { [key in SwapStatus]: TransactionStatus } = {
- [SwapStatus.PENDING]: TransactionStatus.Pending,
- [SwapStatus.SUCCESS]: TransactionStatus.Success,
- [SwapStatus.NOT_FOUND]: TransactionStatus.Unknown,
- [SwapStatus.FAILED]: TransactionStatus.Failed,
- [SwapStatus.EXPIRED]: TransactionStatus.Expired,
-}
-
-const FINALIZED_BRIDGE_SWAP_STATUS = [SwapStatus.SUCCESS, SwapStatus.FAILED, SwapStatus.EXPIRED]
-
export function* transactionWatcher({ apolloClient }: { apolloClient: ApolloClient }) {
logger.debug('transactionWatcherSaga', 'transactionWatcher', 'Starting tx watcher')
@@ -198,13 +185,12 @@ export function* watchTransaction({
logger.debug('transactionWatcherSaga', 'watchTransaction', 'Watching for updates for tx:', hash)
const provider = yield* call(getProvider, chainId)
- const options = isUniswapX(transaction) ? undefined : transaction.options
- const { updatedTransaction, cancel, replace, invalidated, timeout } = yield* race({
+ const nonce = isUniswapX(transaction) ? undefined : transaction.options.request.nonce
+ const { updatedTransaction, cancel, replace, invalidated } = yield* race({
updatedTransaction: call(waitForRemoteUpdate, transaction, provider),
cancel: call(waitForCancellation, chainId, id),
replace: call(waitForReplacement, chainId, id),
- invalidated: call(waitForTxnInvalidated, chainId, id, options?.request.nonce),
- ...(options?.timeoutTimestampMs ? { timeout: call(waitForTimeout, options.timeoutTimestampMs) } : {}),
+ invalidated: call(waitForTxnInvalidated, chainId, id, nonce),
})
// `cancel` and `updatedTransaction` conditions apply to both Classic and UniswapX transactions
@@ -254,16 +240,6 @@ export function* watchTransaction({
}
return
}
-
- if (timeout && transaction.status === TransactionStatus.Pending) {
- logger.warn('transactionWatcherSaga', 'watchTransaction', 'Timeout for pending tx', {
- hash,
- chainId,
- id,
- })
- yield* call(maybeLogGasEstimateAccuracy, transaction)
- return
- }
}
export async function waitForReceipt(
@@ -277,16 +253,6 @@ export async function waitForReceipt(
return txReceipt
}
-function* waitForTimeout(timeoutTimestampMs: number) {
- const currentTime = Date.now()
- const delayTime = timeoutTimestampMs - currentTime
- if (delayTime <= 0) {
- return true
- }
- yield* delay(delayTime)
- return true
-}
-
function* waitForRemoteUpdate(transaction: TransactionDetails, provider: providers.Provider) {
let hash = transaction.hash
let status = transaction.status
@@ -303,7 +269,7 @@ function* waitForRemoteUpdate(transaction: TransactionDetails, provider: provide
}
}
- // At this point, the tx should either be a classic / bridge tx or a filled order, both of which have hashes
+ // At this point, the tx should either be a classic tx or a filled order, both of which have hashes
if (!hash) {
logger.error(new Error('Watching for tx with no hash'), {
tags: {
@@ -312,22 +278,12 @@ function* waitForRemoteUpdate(transaction: TransactionDetails, provider: provide
},
extra: { transaction },
})
- return undefined
+ return
}
const ethersReceipt = yield* call(waitForReceipt, hash, provider)
const receipt = receiptFromEthersReceipt(ethersReceipt)
- if (isBridge(transaction)) {
- // Bridge swaps become non-cancellable after the transaction is submitted to chain.
- // Update should happen without watching to avoid an infinite re-watch loop.
- const updatedTransaction = { ...transaction, cancellable: false }
- yield* put(transactionActions.updateTransactionWithoutWatch(updatedTransaction))
-
- // Poll for bridging status from BE
- status = yield* call(waitForBridgingStatus, transaction)
- }
-
// Classic transaction status is based on receipt, while UniswapX status is based backend response.
if (isClassic(transaction)) {
status = getFinalizedTransactionStatus(transaction.status, ethersReceipt?.status)
@@ -335,41 +291,6 @@ function* waitForRemoteUpdate(transaction: TransactionDetails, provider: provide
return { ...transaction, status, receipt, hash }
}
-function* waitForBridgingStatus(transaction: TransactionDetails) {
- const txHash = transaction.hash
- const chainId = toTradingApiSupportedChainId(transaction.chainId)
-
- if (!txHash || !chainId) {
- return TransactionStatus.Unknown
- }
-
- let swapStatus: SwapStatus | undefined
- const initialPollIntervalMs = 500
- const maxRetries = 5
- const backoffFactor = 2 // Each retry will double the wait time
-
- let pollIndex = 0
- while (pollIndex < maxRetries) {
- const currentPollInterval = initialPollIntervalMs * Math.pow(backoffFactor, pollIndex)
- yield* delay(currentPollInterval)
-
- const data = yield* call(fetchSwaps, {
- txHashes: [txHash],
- chainId,
- })
-
- const currentSwapStatus = data.swaps?.[0]?.status
- if (currentSwapStatus && FINALIZED_BRIDGE_SWAP_STATUS.includes(currentSwapStatus)) {
- swapStatus = currentSwapStatus
- break
- }
-
- pollIndex++
- }
- // If we didn't get a status after polling, assume it's failed
- return swapStatus ? SWAP_STATUS_TO_TX_STATUS[swapStatus] : TransactionStatus.Failed
-}
-
function* waitForCancellation(chainId: WalletChainId, id: string) {
while (true) {
const { payload } = yield* take>(cancelTransaction.type)
@@ -511,24 +432,11 @@ export function logTransactionEvent(actionData: ReturnType transaction.options.timeoutTimestampMs
-
for (const estimate of [gasEstimates.activeEstimate, ...(gasEstimates.shadowEstimates || [])]) {
const gasUseDiff = getDiff(estimate.gasLimit, transaction.receipt?.gasUsed)
const gasPriceDiff = getDiff(getGasPrice(estimate), transaction.receipt?.effectiveGasPrice)
@@ -547,11 +455,9 @@ function maybeLogGasEstimateAccuracy(transaction: TransactionDetails) {
gas_price_diff_percentage: getPercentageError(gasPriceDiff, getGasPrice(estimate)),
gas_price: transaction.receipt?.effectiveGasPrice,
max_priority_fee_per_gas: 'maxPriorityFeePerGas' in estimate ? estimate.maxPriorityFeePerGas : undefined,
- out_of_gas,
- private_rpc: isClassic(transaction) ? transaction.options.submitViaPrivateRpc ?? false : false,
+ private_rpc: isClassic(transaction) ? transaction.options.submitViaPrivateRpc : false,
is_shadow: estimate !== gasEstimates.activeEstimate,
name: findGasStrategyName(estimate),
- timed_out,
})
}
}
@@ -570,7 +476,7 @@ export function* finalizeTransaction({
// Refetch data when a local tx has confirmed
yield* refetchGQLQueries({ transaction, apolloClient })
- if (transaction.typeInfo.type === TransactionType.Swap || transaction.typeInfo.type === TransactionType.Bridge) {
+ if (transaction.typeInfo.type === TransactionType.Swap) {
const hasDoneOneSwap = (yield* select(selectSwapTransactionsCount)) === 1
if (hasDoneOneSwap) {
// Only log event if it's a user's first ever swap
diff --git a/packages/wallet/src/features/unitags/ClaimUnitagContent.tsx b/packages/wallet/src/features/unitags/ClaimUnitagContent.tsx
index e1dfb039fc3..e8bddc88500 100644
--- a/packages/wallet/src/features/unitags/ClaimUnitagContent.tsx
+++ b/packages/wallet/src/features/unitags/ClaimUnitagContent.tsx
@@ -4,7 +4,7 @@ import { useCallback, useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { ActivityIndicator } from 'react-native'
import { useAnimatedStyle, useSharedValue, withDelay, withTiming } from 'react-native-reanimated'
-import { AnimatePresence, Button, Flex, FlexProps, Text, TouchableArea, useSporeColors } from 'ui/src'
+import { AnimatePresence, Button, Flex, Text, TouchableArea, useSporeColors } from 'ui/src'
import { InfoCircleFilled } from 'ui/src/components/icons'
import { AnimatedFlex } from 'ui/src/components/layout/AnimatedFlex'
import { useDynamicFontSizing } from 'ui/src/hooks/useDynamicFontSizing'
@@ -22,7 +22,6 @@ import {
import { shortenAddress } from 'uniswap/src/utils/addresses'
import { dismissNativeKeyboard } from 'utilities/src/device/keyboard'
import { logger } from 'utilities/src/logger/logger'
-import { isExtension } from 'utilities/src/platform'
import { ONE_SECOND_MS } from 'utilities/src/time/time'
import { UnitagInfoModal } from 'wallet/src/features/unitags/UnitagInfoModal'
import { UnitagName } from 'wallet/src/features/unitags/UnitagName'
@@ -45,17 +44,13 @@ const UNITAG_NAME_ANIMATE_DISTANCE_Y = imageSizes.image100 + spacing.spacing48 +
export function ClaimUnitagContent({
unitagAddress,
entryPoint,
- animateY = true,
navigationEventConsumer,
onNavigateContinue,
- onComplete,
}: {
unitagAddress?: string
entryPoint: UnitagEntryPoint
- animateY?: boolean
navigationEventConsumer?: EventConsumer
- onNavigateContinue?: (params: SharedUnitagScreenParams[UnitagScreens.ChooseProfilePicture]) => void
- onComplete?: () => void
+ onNavigateContinue: (params: SharedUnitagScreenParams[UnitagScreens.ChooseProfilePicture]) => void // fix this any
}): JSX.Element {
const { t } = useTranslation()
const colors = useSporeColors()
@@ -76,7 +71,7 @@ export function ClaimUnitagContent({
return {
opacity: addressViewOpacity.value,
}
- }, [addressViewOpacity])
+ })
const { error: canClaimUnitagNameError, loading: loadingUnitagErrorCheck } = useCanClaimUnitagName(unitagToCheck)
@@ -143,7 +138,7 @@ export function ClaimUnitagContent({
const navigateWithAnimation = useCallback(
(unitag: string) => {
- if (entryPoint === OnboardingScreens.Landing && !unitagAddress) {
+ if (!unitagAddress) {
const err = new Error('unitagAddress should always be defined')
logger.error(err, {
tags: { file: 'ClaimUnitagScreen', function: 'navigateWithAnimation' },
@@ -173,21 +168,10 @@ export function ClaimUnitagContent({
)
// Navigate to ChooseProfilePicture screen after initial delay + translation to allow animations to finish
setTimeout(() => {
- onComplete?.()
- if (unitagAddress && onNavigateContinue) {
- onNavigateContinue({ unitag, entryPoint, address: unitagAddress, unitagFontSize: fontSize })
- }
+ onNavigateContinue({ unitag, entryPoint, address: unitagAddress, unitagFontSize: fontSize })
}, initialDelay + translateYDuration)
},
- [
- onComplete,
- onNavigateContinue,
- addressViewOpacity,
- entryPoint,
- unitagAddress,
- unitagInputContainerTranslateY,
- fontSize,
- ],
+ [onNavigateContinue, addressViewOpacity, entryPoint, unitagAddress, unitagInputContainerTranslateY, fontSize],
)
// Handle when useUnitagError completes loading and returns a result after onPressContinue is called
@@ -213,20 +197,6 @@ export function ClaimUnitagContent({
}
}
- const extensionStyling: FlexProps = isExtension
- ? {
- backgroundColor: '$surface1',
- borderRadius: '$rounded20',
- borderWidth: 1,
- borderColor: '$surface3',
- py: '$spacing12',
- px: '$spacing20',
- mb: '$spacing20',
- width: '100%',
- justifyContent: 'space-between',
- }
- : {}
-
return (
<>
{!showTextInputView && (
@@ -259,7 +228,6 @@ export function ClaimUnitagContent({
enterStyle={{ opacity: 0, x: 40 }}
exitStyle={{ opacity: 0, x: 40 }}
gap="$none"
- {...extensionStyling}
>
@@ -316,13 +284,15 @@ export function ClaimUnitagContent({
-
-
- {canClaimUnitagNameError}
-
-
+ {canClaimUnitagNameError && unitagToCheck === unitagInputValue && (
+
+
+ {canClaimUnitagNameError}
+
+
+ )}
-
+
, options?: DisplayNameOpti
const localName = maybeLocalName ?? onboardingAccount?.name
if (!address) {
- return undefined
+ return
}
if (overrideDisplayName) {
diff --git a/packages/wallet/src/utils/linking.ts b/packages/wallet/src/utils/linking.ts
index 5a7d3fdb113..5a9552886ba 100644
--- a/packages/wallet/src/utils/linking.ts
+++ b/packages/wallet/src/utils/linking.ts
@@ -15,7 +15,7 @@ export function dismissInAppBrowser(): void {
export async function openTransactionLink(hash: string | undefined, chainId: WalletChainId): Promise {
if (!hash) {
- return undefined
+ return
}
const explorerUrl = getExplorerLink(chainId, hash, ExplorerDataType.TRANSACTION)
return openUri(explorerUrl)
@@ -61,7 +61,7 @@ const UTM_TAGS_MOBILE = 'utm_medium=mobile&utm_source=share-tdp'
export function getTokenUrl(currencyId: string, addMobileUTMTags: boolean = false): string | undefined {
const chainId = currencyIdToChain(currencyId) as WalletChainId
if (!chainId) {
- return undefined
+ return
}
const network = toUniswapWebAppLink(chainId)
try {
@@ -74,7 +74,7 @@ export function getTokenUrl(currencyId: string, addMobileUTMTags: boolean = fals
const tokenUrl = `${uniswapUrls.webInterfaceTokensUrl}/${network}/${tokenAddress}`
return addMobileUTMTags ? tokenUrl + `?${UTM_TAGS_MOBILE}` : tokenUrl
} catch (_) {
- return undefined
+ return
}
}
diff --git a/packages/wallet/src/utils/useNoYoloParser.ts b/packages/wallet/src/utils/useNoYoloParser.ts
index b014b8731a1..cbab19fa28a 100644
--- a/packages/wallet/src/utils/useNoYoloParser.ts
+++ b/packages/wallet/src/utils/useNoYoloParser.ts
@@ -38,7 +38,7 @@ export function useNoYoloParser(
const parseResult = async (): Promise => {
// no-yolo-parser library expects these fields to be defined
if (!from || !to || !data) {
- return undefined
+ return
}
return parser.parseAsResult(transaction as Transaction).then((result) => {
if (!result.transactionDescription.ok) {
diff --git a/yarn.lock b/yarn.lock
index 77c8e7d136f..b1b2ea7b2c8 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -13246,18 +13246,6 @@ __metadata:
languageName: node
linkType: hard
-"@ts-morph/common@npm:~0.24.0":
- version: 0.24.0
- resolution: "@ts-morph/common@npm:0.24.0"
- dependencies:
- fast-glob: ^3.3.2
- minimatch: ^9.0.4
- mkdirp: ^3.0.1
- path-browserify: ^1.0.1
- checksum: 793bc8a47c93ab55c6c036f94480d3b0e948661aef4bb7dbc29279b1dda2fc4fce809a88e221537867a313541842e12d1ecbd32b4769688abe1303807ec09db6
- languageName: node
- linkType: hard
-
"@tsconfig/node10@npm:^1.0.7":
version: 1.0.9
resolution: "@tsconfig/node10@npm:1.0.9"
@@ -15144,10 +15132,10 @@ __metadata:
languageName: node
linkType: hard
-"@uniswap/analytics-events@npm:2.37.0":
- version: 2.37.0
- resolution: "@uniswap/analytics-events@npm:2.37.0"
- checksum: 5cdf2ba599c31e15588effcf0f311a82afc674545f770f4fe7761a08baae0c7433830d855cb64cb9c6e36ff5e9c5ef063bea40c7bee0e5a497ed6582fd4cb933
+"@uniswap/analytics-events@npm:2.36.0":
+ version: 2.36.0
+ resolution: "@uniswap/analytics-events@npm:2.36.0"
+ checksum: 26cbec530092a5660eec633ef9381d321f089e644b9954ecb635345433483f1a6ab5883a1561edf158159c9137e7308e4069d29d73ecd36643ca2a7f80f8be46
languageName: node
linkType: hard
@@ -15169,10 +15157,10 @@ __metadata:
languageName: node
linkType: hard
-"@uniswap/client-pools@npm:0.0.3":
- version: 0.0.3
- resolution: "@uniswap/client-pools@npm:0.0.3"
- checksum: 0ac91616e266484b200d3148127d5850a75e723b448c4db5a1087d509b9348a8d4b5c30b8b68a0b62e4431f7664406b7b801df4a705213ffcb849cc45cb80312
+"@uniswap/client-pools@npm:0.0.0":
+ version: 0.0.0
+ resolution: "@uniswap/client-pools@npm:0.0.0"
+ checksum: e4e26e3f472fcd8ea88124c6e59b8adfe3ca7e8daf59b53bd40438820761f074106e455d4072bde6d8fa2f68132bdab6c3d4e94fddba511847f00972edd24c84
languageName: node
linkType: hard
@@ -15254,9 +15242,9 @@ __metadata:
"@types/redux-persist-webextension-storage": 1.0.3
"@types/ua-parser-js": 0.7.31
"@types/uuid": 9.0.1
- "@uniswap/analytics-events": 2.37.0
+ "@uniswap/analytics-events": 2.36.0
"@uniswap/eslint-config": "workspace:^"
- "@uniswap/uniswapx-sdk": ^2.1.0-beta.14
+ "@uniswap/uniswapx-sdk": ^2.1.0-beta.8
"@uniswap/universal-router-sdk": 2.2.0
"@uniswap/v3-sdk": 3.14.0
"@welldone-software/why-did-you-render": 8.0.1
@@ -15380,9 +15368,9 @@ __metadata:
"@types/wcag-contrast": 3.0.0
"@types/xml2js": 0.4.14
"@uniswap/analytics": 1.7.0
- "@uniswap/analytics-events": 2.37.0
+ "@uniswap/analytics-events": 2.36.0
"@uniswap/client-explore": 0.0.9
- "@uniswap/client-pools": 0.0.3
+ "@uniswap/client-pools": 0.0.0
"@uniswap/default-token-list": 11.19.0
"@uniswap/eslint-config": "workspace:^"
"@uniswap/liquidity-staker": 1.0.2
@@ -15393,7 +15381,7 @@ __metadata:
"@uniswap/sdk-core": 5.3.0
"@uniswap/smart-order-router": 3.17.3
"@uniswap/token-lists": 1.0.0-beta.33
- "@uniswap/uniswapx-sdk": ^2.1.0-beta.14
+ "@uniswap/uniswapx-sdk": ^2.1.0-beta.8
"@uniswap/universal-router-sdk": 2.2.0
"@uniswap/v2-core": 1.0.1
"@uniswap/v2-periphery": 1.1.0-beta.0
@@ -15507,7 +15495,6 @@ __metadata:
tiny-invariant: 1.3.1
ts-jest: ^29.1.1
tsafe: 1.6.4
- typed-redux-saga: 1.5.0
typescript: 5.3.3
ui: "workspace:^"
uniswap: "workspace:^"
@@ -15608,7 +15595,7 @@ __metadata:
"@testing-library/react-native": 11.5.0
"@types/redux-mock-store": 1.0.6
"@uniswap/analytics": 1.7.0
- "@uniswap/analytics-events": 2.37.0
+ "@uniswap/analytics-events": 2.36.0
"@uniswap/eslint-config": "workspace:^"
"@uniswap/ethers-rs-mobile": 0.0.5
"@uniswap/sdk-core": 5.3.0
@@ -15816,16 +15803,16 @@ __metadata:
languageName: node
linkType: hard
-"@uniswap/uniswapx-sdk@npm:^2.1.0-beta.14":
- version: 2.1.0-beta.14
- resolution: "@uniswap/uniswapx-sdk@npm:2.1.0-beta.14"
+"@uniswap/uniswapx-sdk@npm:^2.1.0-beta.8":
+ version: 2.1.0-beta.13
+ resolution: "@uniswap/uniswapx-sdk@npm:2.1.0-beta.13"
dependencies:
"@ethersproject/bytes": ^5.7.0
"@ethersproject/providers": ^5.7.0
"@uniswap/permit2-sdk": ^1.2.1
"@uniswap/sdk-core": ^5.0.0
ethers: ^5.7.0
- checksum: 1e608a9958c4e95cde3a507e4808e76750fe4161ccae1a9d449bb7647ec613290b27fa09365913e44463337d22f374602391597c75aa4a9d6ec3a4ccab07f94d
+ checksum: c5254a72dad61d1377249e16c4af36687105257add6436ac5974e3e5e3c987b8f5ea8ee9a9cc6f20a7fbb663019594e227cdf366e1ec72eccd6dd7ce0014d52c
languageName: node
linkType: hard
@@ -20584,13 +20571,6 @@ __metadata:
languageName: node
linkType: hard
-"code-block-writer@npm:^13.0.1":
- version: 13.0.2
- resolution: "code-block-writer@npm:13.0.2"
- checksum: 8052ae6f27ef73366bd5df04b6f9beced493261fcaef5cbd0f3853644b5e0aa5af18d099b96448be88ea3d000c7b180207d371044edd9fcf98fea22c9f8ba3a1
- languageName: node
- linkType: hard
-
"code-point-at@npm:^1.0.0":
version: 1.1.0
resolution: "code-point-at@npm:1.1.0"
@@ -26185,7 +26165,7 @@ __metadata:
languageName: node
linkType: hard
-"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.5, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.2":
+"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.5, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0":
version: 3.3.2
resolution: "fast-glob@npm:3.3.2"
dependencies:
@@ -34235,15 +34215,6 @@ __metadata:
languageName: node
linkType: hard
-"minimatch@npm:^9.0.4":
- version: 9.0.5
- resolution: "minimatch@npm:9.0.5"
- dependencies:
- brace-expansion: ^2.0.1
- checksum: 2c035575eda1e50623c731ec6c14f65a85296268f749b9337005210bb2b34e2705f8ef1a358b188f69892286ab99dc42c8fb98a57bde55c8d81b3023c19cea28
- languageName: node
- linkType: hard
-
"minimist-options@npm:4.1.0":
version: 4.1.0
resolution: "minimist-options@npm:4.1.0"
@@ -34416,15 +34387,6 @@ __metadata:
languageName: node
linkType: hard
-"mkdirp@npm:^3.0.1":
- version: 3.0.1
- resolution: "mkdirp@npm:3.0.1"
- bin:
- mkdirp: dist/cjs/src/bin.js
- checksum: 972deb188e8fb55547f1e58d66bd6b4a3623bf0c7137802582602d73e6480c1c2268dcbafbfb1be466e00cc7e56ac514d7fd9334b7cf33e3e2ab547c16f83a8d
- languageName: node
- linkType: hard
-
"mktemp@npm:~0.4.0":
version: 0.4.0
resolution: "mktemp@npm:0.4.0"
@@ -44132,19 +44094,9 @@ __metadata:
languageName: node
linkType: hard
-"ts-morph@npm:23.0.0":
- version: 23.0.0
- resolution: "ts-morph@npm:23.0.0"
- dependencies:
- "@ts-morph/common": ~0.24.0
- code-block-writer: ^13.0.1
- checksum: 3282eb0f8bd4577770874736c3259b97501da9a86137160b5d68f106b7848ea7b1fbccf9e198a3d930ec40c993e9951d4bfae31e2562dac8f3de0d7bb0e23615
- languageName: node
- linkType: hard
-
"ts-node@npm:^10.7.0, ts-node@npm:^10.8.1":
- version: 10.9.2
- resolution: "ts-node@npm:10.9.2"
+ version: 10.9.1
+ resolution: "ts-node@npm:10.9.1"
dependencies:
"@cspotcode/source-map-support": ^0.8.0
"@tsconfig/node10": ^1.0.7
@@ -44176,7 +44128,7 @@ __metadata:
ts-node-script: dist/bin-script.js
ts-node-transpile-only: dist/bin-transpile.js
ts-script: dist/bin-script-deprecated.js
- checksum: fde256c9073969e234526e2cfead42591b9a2aec5222bac154b0de2fa9e4ceb30efcd717ee8bc785a56f3a119bdd5aa27b333d9dbec94ed254bd26f8944c67ac
+ checksum: 090adff1302ab20bd3486e6b4799e90f97726ed39e02b39e566f8ab674fd5bd5f727f43615debbfc580d33c6d9d1c6b1b3ce7d8e3cca3e20530a145ffa232c35
languageName: node
linkType: hard
@@ -45125,14 +45077,14 @@ __metadata:
"@typechain/ethers-v5": 7.2.0
"@types/chrome": 0.0.254
"@types/react-window": 1.8.2
- "@uniswap/analytics-events": 2.37.0
+ "@uniswap/analytics-events": 2.36.0
"@uniswap/client-explore": 0.0.9
- "@uniswap/client-pools": 0.0.3
+ "@uniswap/client-pools": 0.0.0
"@uniswap/eslint-config": "workspace:^"
"@uniswap/permit2-sdk": 1.3.0
"@uniswap/router-sdk": 1.9.2
"@uniswap/sdk-core": 5.3.0
- "@uniswap/uniswapx-sdk": ^2.1.0-beta.14
+ "@uniswap/uniswapx-sdk": ^2.1.0-beta.8
"@uniswap/v2-sdk": 4.3.2
"@uniswap/v3-sdk": 3.14.0
apollo-link-rest: 0.9.0
@@ -45179,7 +45131,6 @@ __metadata:
statsig-react: 1.32.0
statsig-react-native: 4.11.0
tiny-invariant: 1.3.1
- ts-morph: 23.0.0
tsafe: 1.6.4
typechain: 5.2.0
typed-redux-saga: 1.5.0
@@ -45675,7 +45626,7 @@ __metadata:
"@types/react": ^18.0.15
"@types/uuid": 9.0.1
"@uniswap/analytics": 1.7.0
- "@uniswap/analytics-events": 2.37.0
+ "@uniswap/analytics-events": 2.36.0
"@uniswap/eslint-config": "workspace:^"
"@uniswap/sdk-core": 5.3.0
aws-appsync-auth-link: 3.0.7
@@ -46221,12 +46172,12 @@ __metadata:
"@testing-library/react-native": 11.5.0
"@types/react": ^18.0.15
"@types/zxcvbn": 4.4.2
- "@uniswap/analytics-events": 2.37.0
+ "@uniswap/analytics-events": 2.36.0
"@uniswap/eslint-config": "workspace:^"
"@uniswap/permit2-sdk": 1.3.0
"@uniswap/router-sdk": 1.9.2
"@uniswap/sdk-core": 5.3.0
- "@uniswap/uniswapx-sdk": ^2.1.0-beta.14
+ "@uniswap/uniswapx-sdk": ^2.1.0-beta.8
"@uniswap/universal-router-sdk": 2.2.0
"@uniswap/v3-sdk": 3.14.0
apollo3-cache-persist: 0.14.1