fix: remove 3 launched feature flags (#7589)

* fix: remove 3 launched feature flags

* fix: remove unused componnent

* fix: remove another apple logo
This commit is contained in:
eddie 2023-11-15 11:17:02 -08:00 committed by GitHub
parent 0aa5727cdd
commit 2e618fb2aa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 35 additions and 263 deletions

@ -1,77 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 22.773 22.773" style="enable-background:new 0 0 22.773 22.773;" xml:space="preserve">
<g>
<g>
<path d="M15.769,0c0.053,0,0.106,0,0.162,0c0.13,1.606-0.483,2.806-1.228,3.675c-0.731,0.863-1.732,1.7-3.351,1.573
c-0.108-1.583,0.506-2.694,1.25-3.561C13.292,0.879,14.557,0.16,15.769,0z"/>
<path d="M20.67,16.716c0,0.016,0,0.03,0,0.045c-0.455,1.378-1.104,2.559-1.896,3.655c-0.723,0.995-1.609,2.334-3.191,2.334
c-1.367,0-2.275-0.879-3.676-0.903c-1.482-0.024-2.297,0.735-3.652,0.926c-0.155,0-0.31,0-0.462,0
c-0.995-0.144-1.798-0.932-2.383-1.642c-1.725-2.098-3.058-4.808-3.306-8.276c0-0.34,0-0.679,0-1.019
c0.105-2.482,1.311-4.5,2.914-5.478c0.846-0.52,2.009-0.963,3.304-0.765c0.555,0.086,1.122,0.276,1.619,0.464
c0.471,0.181,1.06,0.502,1.618,0.485c0.378-0.011,0.754-0.208,1.135-0.347c1.116-0.403,2.21-0.865,3.652-0.648
c1.733,0.262,2.963,1.032,3.723,2.22c-1.466,0.933-2.625,2.339-2.427,4.74C17.818,14.688,19.086,15.964,20.67,16.716z"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

@ -1,5 +1,4 @@
import { InterfaceElementName } from '@uniswap/analytics-events' import { InterfaceElementName } from '@uniswap/analytics-events'
import { useAndroidGALaunchFlagEnabled } from 'featureFlags/flags/androidGALaunch'
import { PropsWithChildren, useCallback } from 'react' import { PropsWithChildren, useCallback } from 'react'
import styled from 'styled-components' import styled from 'styled-components'
import { ClickableStyle } from 'theme/components' import { ClickableStyle } from 'theme/components'
@ -42,12 +41,11 @@ export function DownloadButton({
text?: string text?: string
element: InterfaceElementName element: InterfaceElementName
}) { }) {
const isAndroidGALaunched = useAndroidGALaunchFlagEnabled()
const onButtonClick = useCallback(() => { const onButtonClick = useCallback(() => {
// handles any actions required by the parent, i.e. cancelling wallet connection attempt or dismissing an ad // handles any actions required by the parent, i.e. cancelling wallet connection attempt or dismissing an ad
onClick?.() onClick?.()
openDownloadApp({ element, isAndroidGALaunched }) openDownloadApp({ element })
}, [element, isAndroidGALaunched, onClick]) }, [element, onClick])
return ( return (
<BaseButton branded onClick={onButtonClick}> <BaseButton branded onClick={onButtonClick}>

@ -9,7 +9,6 @@ import { uniwalletWCV2ConnectConnection } from 'connection'
import { ActivationStatus, useActivationState } from 'connection/activate' import { ActivationStatus, useActivationState } from 'connection/activate'
import { ConnectionType } from 'connection/types' import { ConnectionType } from 'connection/types'
import { UniwalletConnect as UniwalletConnectV2 } from 'connection/WalletConnectV2' import { UniwalletConnect as UniwalletConnectV2 } from 'connection/WalletConnectV2'
import { useAndroidGALaunchFlagEnabled } from 'featureFlags/flags/androidGALaunch'
import { QRCodeSVG } from 'qrcode.react' import { QRCodeSVG } from 'qrcode.react'
import { useEffect, useState } from 'react' import { useEffect, useState } from 'react'
import styled, { useTheme } from 'styled-components' import styled, { useTheme } from 'styled-components'
@ -43,9 +42,8 @@ export default function UniwalletModal() {
const { activationState, cancelActivation } = useActivationState() const { activationState, cancelActivation } = useActivationState()
const [uri, setUri] = useState<string>() const [uri, setUri] = useState<string>()
const isAndroidGALaunched = useAndroidGALaunchFlagEnabled()
// Displays the modal if not on iOS/Android, a Uniswap Wallet Connection is pending, & qrcode URI is available // Displays the modal if not on iOS/Android, a Uniswap Wallet Connection is pending, & qrcode URI is available
const onLaunchedMobilePlatform = isIOS || (isAndroidGALaunched && isAndroid) const onLaunchedMobilePlatform = isIOS || isAndroid
const open = const open =
!onLaunchedMobilePlatform && !onLaunchedMobilePlatform &&
activationState.status === ActivationStatus.PENDING && activationState.status === ActivationStatus.PENDING &&
@ -105,8 +103,6 @@ const InfoSectionWrapper = styled(RowBetween)`
` `
function InfoSection() { function InfoSection() {
const isAndroidGALaunched = useAndroidGALaunchFlagEnabled()
return ( return (
<InfoSectionWrapper> <InfoSectionWrapper>
<AutoColumn gap="4px"> <AutoColumn gap="4px">
@ -114,13 +110,7 @@ function InfoSection() {
<Trans>Don&apos;t have a Uniswap wallet?</Trans> <Trans>Don&apos;t have a Uniswap wallet?</Trans>
</ThemedText.SubHeaderSmall> </ThemedText.SubHeaderSmall>
<ThemedText.BodySmall color="neutral2"> <ThemedText.BodySmall color="neutral2">
{isAndroidGALaunched ? (
<Trans>Safely store and swap tokens with the Uniswap app. Available on iOS and Android.</Trans> <Trans>Safely store and swap tokens with the Uniswap app. Available on iOS and Android.</Trans>
) : (
<Trans>
Download in the App Store to safely store your tokens and NFTs, swap tokens, and connect to crypto apps.
</Trans>
)}
</ThemedText.BodySmall> </ThemedText.BodySmall>
</AutoColumn> </AutoColumn>
<Column> <Column>

@ -1,6 +1,5 @@
import { Trans } from '@lingui/macro' import { Trans } from '@lingui/macro'
import { InterfaceElementName } from '@uniswap/analytics-events' import { InterfaceElementName } from '@uniswap/analytics-events'
import { useAndroidGALaunchFlagEnabled } from 'featureFlags/flags/androidGALaunch'
import { useScreenSize } from 'hooks/useScreenSize' import { useScreenSize } from 'hooks/useScreenSize'
import { useLocation } from 'react-router-dom' import { useLocation } from 'react-router-dom'
import { useHideAndroidAnnouncementBanner } from 'state/user/hooks' import { useHideAndroidAnnouncementBanner } from 'state/user/hooks'
@ -31,14 +30,12 @@ export default function AndroidAnnouncementBanner() {
const shouldDisplay = Boolean(!hideAndroidAnnouncementBanner && !isLandingScreen) const shouldDisplay = Boolean(!hideAndroidAnnouncementBanner && !isLandingScreen)
const isDarkMode = useIsDarkMode() const isDarkMode = useIsDarkMode()
const isAndroidGALaunched = useAndroidGALaunchFlagEnabled()
const onClick = () => const onClick = () =>
openDownloadApp({ openDownloadApp({
element: InterfaceElementName.UNISWAP_WALLET_BANNER_DOWNLOAD_BUTTON, element: InterfaceElementName.UNISWAP_WALLET_BANNER_DOWNLOAD_BUTTON,
isAndroidGALaunched,
}) })
if (!isAndroidGALaunched || isMobileSafari) return null if (isMobileSafari) return null
return ( return (
<PopupContainer show={shouldDisplay}> <PopupContainer show={shouldDisplay}>

@ -3,7 +3,6 @@ import Column from 'components/Column'
import { BaseVariant, FeatureFlag, featureFlagSettings, useUpdateConfig, useUpdateFlag } from 'featureFlags' import { BaseVariant, FeatureFlag, featureFlagSettings, useUpdateConfig, useUpdateFlag } from 'featureFlags'
import { DynamicConfigName } from 'featureFlags/dynamicConfig' import { DynamicConfigName } from 'featureFlags/dynamicConfig'
import { useQuickRouteChains } from 'featureFlags/dynamicConfig/quickRouteChains' import { useQuickRouteChains } from 'featureFlags/dynamicConfig/quickRouteChains'
import { useAndroidGALaunchFlag } from 'featureFlags/flags/androidGALaunch'
import { useCurrencyConversionFlag } from 'featureFlags/flags/currencyConversion' import { useCurrencyConversionFlag } from 'featureFlags/flags/currencyConversion'
import { useFallbackProviderEnabledFlag } from 'featureFlags/flags/fallbackProvider' import { useFallbackProviderEnabledFlag } from 'featureFlags/flags/fallbackProvider'
import { useInfoExploreFlag } from 'featureFlags/flags/infoExplore' import { useInfoExploreFlag } from 'featureFlags/flags/infoExplore'
@ -16,8 +15,6 @@ import { useProgressIndicatorV2Flag } from 'featureFlags/flags/progressIndicator
import { useQuickRouteMainnetFlag } from 'featureFlags/flags/quickRouteMainnet' import { useQuickRouteMainnetFlag } from 'featureFlags/flags/quickRouteMainnet'
import { TraceJsonRpcVariant, useTraceJsonRpcFlag } from 'featureFlags/flags/traceJsonRpc' import { TraceJsonRpcVariant, useTraceJsonRpcFlag } from 'featureFlags/flags/traceJsonRpc'
import { useUniswapXDefaultEnabledFlag } from 'featureFlags/flags/uniswapXDefault' import { useUniswapXDefaultEnabledFlag } from 'featureFlags/flags/uniswapXDefault'
import { useUniswapXEthOutputFlag } from 'featureFlags/flags/uniswapXEthOutput'
import { useUniswapXExactOutputFlag } from 'featureFlags/flags/uniswapXExactOutput'
import { useUniswapXSyntheticQuoteFlag } from 'featureFlags/flags/uniswapXUseSyntheticQuote' import { useUniswapXSyntheticQuoteFlag } from 'featureFlags/flags/uniswapXUseSyntheticQuote'
import { useFeesEnabledFlag } from 'featureFlags/flags/useFees' import { useFeesEnabledFlag } from 'featureFlags/flags/useFees'
import { useUpdateAtom } from 'jotai/utils' import { useUpdateAtom } from 'jotai/utils'
@ -305,12 +302,6 @@ export default function FeatureFlagModal() {
featureFlag={FeatureFlag.progressIndicatorV2} featureFlag={FeatureFlag.progressIndicatorV2}
label="Refreshed swap progress indicator" label="Refreshed swap progress indicator"
/> />
<FeatureFlagOption
variant={BaseVariant}
value={useAndroidGALaunchFlag()}
featureFlag={FeatureFlag.androidGALaunch}
label="Android Nov 14th GA launch"
/>
<FeatureFlagGroup name="Quick routes"> <FeatureFlagGroup name="Quick routes">
<FeatureFlagOption <FeatureFlagOption
variant={BaseVariant} variant={BaseVariant}
@ -333,18 +324,6 @@ export default function FeatureFlagModal() {
featureFlag={FeatureFlag.uniswapXSyntheticQuote} featureFlag={FeatureFlag.uniswapXSyntheticQuote}
label="Force synthetic quotes for UniswapX" label="Force synthetic quotes for UniswapX"
/> />
<FeatureFlagOption
variant={BaseVariant}
value={useUniswapXEthOutputFlag()}
featureFlag={FeatureFlag.uniswapXEthOutputEnabled}
label="Enable eth output for UniswapX orders"
/>
<FeatureFlagOption
variant={BaseVariant}
value={useUniswapXExactOutputFlag()}
featureFlag={FeatureFlag.uniswapXExactOutputEnabled}
label="Enable exact output for UniswapX orders"
/>
<FeatureFlagOption <FeatureFlagOption
variant={BaseVariant} variant={BaseVariant}
value={useUniswapXDefaultEnabledFlag()} value={useUniswapXDefaultEnabledFlag()}

@ -1,8 +0,0 @@
export const AppleLogo = (props: React.SVGProps<SVGSVGElement>) => (
<svg viewBox="0 0 814 1000" {...props}>
<path
fill="currentColor"
d="M788.1 340.9c-5.8 4.5-108.2 62.2-108.2 190.5 0 148.4 130.3 200.9 134.2 202.2-.6 3.2-20.7 71.9-68.7 141.9-42.8 61.6-87.5 123.1-155.5 123.1s-85.5-39.5-164-39.5c-76.5 0-103.7 40.8-165.9 40.8s-105.6-57-155.5-127C46.7 790.7 0 663 0 541.8c0-194.4 126.4-297.5 250.8-297.5 66.1 0 121.2 43.4 162.7 43.4 39.5 0 101.1-46 176.3-46 28.5 0 130.9 2.6 198.3 99.2zm-234-181.5c31.1-36.9 53.1-88.1 53.1-139.3 0-7.1-.6-14.3-1.9-20.1-50.6 1.9-110.8 33.7-147.1 75.8-28.5 32.4-55.1 83.6-55.1 135.5 0 7.8 1.3 15.6 1.9 18.1 3.2.6 8.4 1.3 13.6 1.3 45.4 0 102.5-30.4 135.5-71.3z"
/>
</svg>
)

@ -1,9 +1,7 @@
import { t, Trans } from '@lingui/macro' import { t, Trans } from '@lingui/macro'
import { InterfaceElementName } from '@uniswap/analytics-events' import { InterfaceElementName } from '@uniswap/analytics-events'
import { ReactComponent as AppleLogo } from 'assets/svg/apple_logo.svg'
import FeatureFlagModal from 'components/FeatureFlagModal/FeatureFlagModal' import FeatureFlagModal from 'components/FeatureFlagModal/FeatureFlagModal'
import { PrivacyPolicyModal } from 'components/PrivacyPolicy' import { PrivacyPolicyModal } from 'components/PrivacyPolicy'
import { useAndroidGALaunchFlagEnabled } from 'featureFlags/flags/androidGALaunch'
import { useOnClickOutside } from 'hooks/useOnClickOutside' import { useOnClickOutside } from 'hooks/useOnClickOutside'
import { Box } from 'nft/components/Box' import { Box } from 'nft/components/Box'
import { Column, Row } from 'nft/components/Flex' import { Column, Row } from 'nft/components/Flex'
@ -132,8 +130,6 @@ export const MenuDropdown = () => {
const ref = useRef<HTMLDivElement>(null) const ref = useRef<HTMLDivElement>(null)
useOnClickOutside(ref, isOpen ? toggleOpen : undefined) useOnClickOutside(ref, isOpen ? toggleOpen : undefined)
const isAndroidGALaunched = useAndroidGALaunchFlagEnabled()
return ( return (
<> <>
<Box position="relative" ref={ref} marginRight="4"> <Box position="relative" ref={ref} marginRight="4">
@ -175,12 +171,10 @@ export const MenuDropdown = () => {
onClick={() => onClick={() =>
openDownloadApp({ openDownloadApp({
element: InterfaceElementName.UNISWAP_WALLET_NAVBAR_MENU_DOWNLOAD_BUTTON, element: InterfaceElementName.UNISWAP_WALLET_NAVBAR_MENU_DOWNLOAD_BUTTON,
isAndroidGALaunched,
}) })
} }
> >
<PrimaryMenuRow close={toggleOpen}> <PrimaryMenuRow close={toggleOpen}>
{isAndroidGALaunched ? (
<> <>
<Icon> <Icon>
<UniswapAppLogo width="24px" height="24px" /> <UniswapAppLogo width="24px" height="24px" />
@ -194,16 +188,6 @@ export const MenuDropdown = () => {
</ThemedText.LabelSmall> </ThemedText.LabelSmall>
</div> </div>
</> </>
) : (
<>
<Icon>
<AppleLogo width="24px" height="24px" fill={theme.neutral1} />
</Icon>
<PrimaryMenuRow.Text>
<Trans>Download Uniswap app</Trans>
</PrimaryMenuRow.Text>
</>
)}
</PrimaryMenuRow> </PrimaryMenuRow>
</Box> </Box>
</Column> </Column>

@ -6,7 +6,6 @@ import { AutoRow } from 'components/Row'
import { connections, deprecatedNetworkConnection, networkConnection } from 'connection' import { connections, deprecatedNetworkConnection, networkConnection } from 'connection'
import { ActivationStatus, useActivationState } from 'connection/activate' import { ActivationStatus, useActivationState } from 'connection/activate'
import { isSupportedChain } from 'constants/chains' import { isSupportedChain } from 'constants/chains'
import { useAndroidGALaunchFlagEnabled } from 'featureFlags/flags/androidGALaunch'
import { useFallbackProviderEnabled } from 'featureFlags/flags/fallbackProvider' import { useFallbackProviderEnabled } from 'featureFlags/flags/fallbackProvider'
import { useEffect } from 'react' import { useEffect } from 'react'
import styled from 'styled-components' import styled from 'styled-components'
@ -41,7 +40,6 @@ const PrivacyPolicyWrapper = styled.div`
export default function WalletModal({ openSettings }: { openSettings: () => void }) { export default function WalletModal({ openSettings }: { openSettings: () => void }) {
const { connector, chainId } = useWeb3React() const { connector, chainId } = useWeb3React()
const isAndroidGALaunched = useAndroidGALaunchFlagEnabled()
const { activationState } = useActivationState() const { activationState } = useActivationState()
const fallbackProviderEnabled = useFallbackProviderEnabled() const fallbackProviderEnabled = useFallbackProviderEnabled()
@ -68,7 +66,7 @@ export default function WalletModal({ openSettings }: { openSettings: () => void
<AutoColumn gap="16px"> <AutoColumn gap="16px">
<OptionGrid data-testid="option-grid"> <OptionGrid data-testid="option-grid">
{connections {connections
.filter((connection) => connection.shouldDisplay(isAndroidGALaunched)) .filter((connection) => connection.shouldDisplay())
.map((connection) => ( .map((connection) => (
<Option key={connection.getName()} connection={connection} /> <Option key={connection.getName()} connection={connection} />
))} ))}

@ -11,7 +11,7 @@ import COINBASE_ICON from 'assets/wallets/coinbase-icon.svg'
import UNIWALLET_ICON from 'assets/wallets/uniswap-wallet-icon.png' import UNIWALLET_ICON from 'assets/wallets/uniswap-wallet-icon.png'
import WALLET_CONNECT_ICON from 'assets/wallets/walletconnect-icon.svg' import WALLET_CONNECT_ICON from 'assets/wallets/walletconnect-icon.svg'
import { useSyncExternalStore } from 'react' import { useSyncExternalStore } from 'react'
import { isMobile, isNonIOSPhone, isNonSupportedPhone } from 'utils/userAgent' import { isMobile, isNonSupportedPhone } from 'utils/userAgent'
import { RPC_URLS } from '../constants/networks' import { RPC_URLS } from '../constants/networks'
import { DEPRECATED_RPC_PROVIDERS, RPC_PROVIDERS } from '../constants/providers' import { DEPRECATED_RPC_PROVIDERS, RPC_PROVIDERS } from '../constants/providers'
@ -149,8 +149,7 @@ export const uniwalletWCV2ConnectConnection: Connection = {
hooks: web3WCV2UniwalletConnectHooks, hooks: web3WCV2UniwalletConnectHooks,
type: ConnectionType.UNISWAP_WALLET_V2, type: ConnectionType.UNISWAP_WALLET_V2,
getIcon: () => UNIWALLET_ICON, getIcon: () => UNIWALLET_ICON,
shouldDisplay: (isAndroidGALaunched) => shouldDisplay: () => Boolean(!getIsInjectedMobileBrowser() && !isNonSupportedPhone),
Boolean(!getIsInjectedMobileBrowser() && (isAndroidGALaunched ? !isNonSupportedPhone : !isNonIOSPhone)),
} }
const [web3CoinbaseWallet, web3CoinbaseWalletHooks] = initializeConnector<CoinbaseWallet>( const [web3CoinbaseWallet, web3CoinbaseWalletHooks] = initializeConnector<CoinbaseWallet>(

@ -26,6 +26,6 @@ export interface Connection {
hooks: Web3ReactHooks hooks: Web3ReactHooks
type: ConnectionType type: ConnectionType
getIcon?(isDarkMode: boolean): string getIcon?(isDarkMode: boolean): string
shouldDisplay(isAndroidGALaunched?: boolean): boolean shouldDisplay(): boolean
overrideActivate?: (chainId?: ChainId) => boolean overrideActivate?: (chainId?: ChainId) => boolean
} }

@ -1,10 +0,0 @@
import { BaseVariant, FeatureFlag, useBaseFlag } from '../index'
export function useAndroidGALaunchFlag(): BaseVariant {
return useBaseFlag(FeatureFlag.androidGALaunch)
}
// todo(kristiehuang): add statsig flag after staging goes out
export function useAndroidGALaunchFlagEnabled(): boolean {
return useAndroidGALaunchFlag() === BaseVariant.Enabled
}

@ -1,9 +0,0 @@
import { BaseVariant, FeatureFlag, useBaseFlag } from '../index'
export function useUniswapXEthOutputFlag(): BaseVariant {
return useBaseFlag(FeatureFlag.uniswapXEthOutputEnabled)
}
export function useUniswapXEthOutputEnabled(): boolean {
return useUniswapXEthOutputFlag() === BaseVariant.Enabled
}

@ -1,9 +0,0 @@
import { BaseVariant, FeatureFlag, useBaseFlag } from '../index'
export function useUniswapXExactOutputFlag(): BaseVariant {
return useBaseFlag(FeatureFlag.uniswapXExactOutputEnabled)
}
export function useUniswapXExactOutputEnabled(): boolean {
return useUniswapXExactOutputFlag() === BaseVariant.Enabled
}

@ -10,8 +10,6 @@ export enum FeatureFlag {
debounceSwapQuote = 'debounce_swap_quote', debounceSwapQuote = 'debounce_swap_quote',
fallbackProvider = 'fallback_provider', fallbackProvider = 'fallback_provider',
uniswapXSyntheticQuote = 'uniswapx_synthetic_quote', uniswapXSyntheticQuote = 'uniswapx_synthetic_quote',
uniswapXEthOutputEnabled = 'uniswapx_eth_output_enabled',
uniswapXExactOutputEnabled = 'uniswapx_exact_output_enabled',
multichainUX = 'multichain_ux', multichainUX = 'multichain_ux',
currencyConversion = 'currency_conversion', currencyConversion = 'currency_conversion',
infoExplore = 'info_explore', infoExplore = 'info_explore',
@ -22,7 +20,6 @@ export enum FeatureFlag {
quickRouteMainnet = 'enable_quick_route_mainnet', quickRouteMainnet = 'enable_quick_route_mainnet',
progressIndicatorV2 = 'progress_indicator_v2', progressIndicatorV2 = 'progress_indicator_v2',
feesEnabled = 'fees_enabled', feesEnabled = 'fees_enabled',
androidGALaunch = 'android_ga_launch',
limitsEnabled = 'limits_enabled', limitsEnabled = 'limits_enabled',
} }

@ -1,8 +1,6 @@
import { SkipToken, skipToken } from '@reduxjs/toolkit/query/react' import { SkipToken, skipToken } from '@reduxjs/toolkit/query/react'
import { Currency, CurrencyAmount, TradeType } from '@uniswap/sdk-core' import { Currency, CurrencyAmount, TradeType } from '@uniswap/sdk-core'
import { useUniswapXDefaultEnabled } from 'featureFlags/flags/uniswapXDefault' import { useUniswapXDefaultEnabled } from 'featureFlags/flags/uniswapXDefault'
import { useUniswapXEthOutputEnabled } from 'featureFlags/flags/uniswapXEthOutput'
import { useUniswapXExactOutputEnabled } from 'featureFlags/flags/uniswapXExactOutput'
import { useUniswapXSyntheticQuoteEnabled } from 'featureFlags/flags/uniswapXUseSyntheticQuote' import { useUniswapXSyntheticQuoteEnabled } from 'featureFlags/flags/uniswapXUseSyntheticQuote'
import { useFeesEnabled } from 'featureFlags/flags/useFees' import { useFeesEnabled } from 'featureFlags/flags/useFees'
import { useMemo } from 'react' import { useMemo } from 'react'
@ -33,8 +31,6 @@ export function useRoutingAPIArguments({
const uniswapXForceSyntheticQuotes = useUniswapXSyntheticQuoteEnabled() const uniswapXForceSyntheticQuotes = useUniswapXSyntheticQuoteEnabled()
const userDisabledUniswapX = useUserDisabledUniswapX() const userDisabledUniswapX = useUserDisabledUniswapX()
const userOptedOutOfUniswapX = useUserOptedOutOfUniswapX() const userOptedOutOfUniswapX = useUserOptedOutOfUniswapX()
const uniswapXEthOutputEnabled = useUniswapXEthOutputEnabled()
const uniswapXExactOutputEnabled = useUniswapXExactOutputEnabled()
const isUniswapXDefaultEnabled = useUniswapXDefaultEnabled() const isUniswapXDefaultEnabled = useUniswapXDefaultEnabled()
const feesEnabled = useFeesEnabled() const feesEnabled = useFeesEnabled()
@ -62,8 +58,6 @@ export function useRoutingAPIArguments({
uniswapXForceSyntheticQuotes, uniswapXForceSyntheticQuotes,
userDisabledUniswapX, userDisabledUniswapX,
userOptedOutOfUniswapX, userOptedOutOfUniswapX,
uniswapXEthOutputEnabled,
uniswapXExactOutputEnabled,
isUniswapXDefaultEnabled, isUniswapXDefaultEnabled,
sendPortionEnabled, sendPortionEnabled,
}, },
@ -74,11 +68,9 @@ export function useRoutingAPIArguments({
tokenIn, tokenIn,
tokenOut, tokenOut,
tradeType, tradeType,
uniswapXExactOutputEnabled,
uniswapXForceSyntheticQuotes, uniswapXForceSyntheticQuotes,
userDisabledUniswapX, userDisabledUniswapX,
userOptedOutOfUniswapX, userOptedOutOfUniswapX,
uniswapXEthOutputEnabled,
isUniswapXDefaultEnabled, isUniswapXDefaultEnabled,
sendPortionEnabled, sendPortionEnabled,
] ]

@ -2165,15 +2165,11 @@ exports[`disable nft on landing page does not render nft information and card 1`
> >
<svg <svg
height="20" height="20"
viewBox="0 0 814 1000"
width="20" width="20"
> >
<path uniswap_app_logo.svg
d="M788.1 340.9c-5.8 4.5-108.2 62.2-108.2 190.5 0 148.4 130.3 200.9 134.2 202.2-.6 3.2-20.7 71.9-68.7 141.9-42.8 61.6-87.5 123.1-155.5 123.1s-85.5-39.5-164-39.5c-76.5 0-103.7 40.8-165.9 40.8s-105.6-57-155.5-127C46.7 790.7 0 663 0 541.8c0-194.4 126.4-297.5 250.8-297.5 66.1 0 121.2 43.4 162.7 43.4 39.5 0 101.1-46 176.3-46 28.5 0 130.9 2.6 198.3 99.2zm-234-181.5c31.1-36.9 53.1-88.1 53.1-139.3 0-7.1-.6-14.3-1.9-20.1-50.6 1.9-110.8 33.7-147.1 75.8-28.5 32.4-55.1 83.6-55.1 135.5 0 7.8 1.3 15.6 1.9 18.1 3.2.6 8.4 1.3 13.6 1.3 45.4 0 102.5-30.4 135.5-71.3z"
fill="currentColor"
/>
</svg> </svg>
Download the Uniswap app for iOS Download the Uniswap app
</a> </a>
</div> </div>
<div <div
@ -4825,15 +4821,11 @@ exports[`disable nft on landing page renders nft information and card 1`] = `
> >
<svg <svg
height="20" height="20"
viewBox="0 0 814 1000"
width="20" width="20"
> >
<path uniswap_app_logo.svg
d="M788.1 340.9c-5.8 4.5-108.2 62.2-108.2 190.5 0 148.4 130.3 200.9 134.2 202.2-.6 3.2-20.7 71.9-68.7 141.9-42.8 61.6-87.5 123.1-155.5 123.1s-85.5-39.5-164-39.5c-76.5 0-103.7 40.8-165.9 40.8s-105.6-57-155.5-127C46.7 790.7 0 663 0 541.8c0-194.4 126.4-297.5 250.8-297.5 66.1 0 121.2 43.4 162.7 43.4 39.5 0 101.1-46 176.3-46 28.5 0 130.9 2.6 198.3 99.2zm-234-181.5c31.1-36.9 53.1-88.1 53.1-139.3 0-7.1-.6-14.3-1.9-20.1-50.6 1.9-110.8 33.7-147.1 75.8-28.5 32.4-55.1 83.6-55.1 135.5 0 7.8 1.3 15.6 1.9 18.1 3.2.6 8.4 1.3 13.6 1.3 45.4 0 102.5-30.4 135.5-71.3z"
fill="currentColor"
/>
</svg> </svg>
Download the Uniswap app for iOS Download the Uniswap app
</a> </a>
</div> </div>
<div <div

@ -8,8 +8,6 @@ import { MAIN_CARDS, MORE_CARDS } from 'components/About/constants'
import ProtocolBanner from 'components/About/ProtocolBanner' import ProtocolBanner from 'components/About/ProtocolBanner'
import { useAccountDrawer } from 'components/AccountDrawer' import { useAccountDrawer } from 'components/AccountDrawer'
import { BaseButton } from 'components/Button' import { BaseButton } from 'components/Button'
import { AppleLogo } from 'components/Logo/AppleLogo'
import { useAndroidGALaunchFlagEnabled } from 'featureFlags/flags/androidGALaunch'
import { useDisableNFTRoutes } from 'hooks/useDisableNFTRoutes' import { useDisableNFTRoutes } from 'hooks/useDisableNFTRoutes'
import Swap from 'pages/Swap' import Swap from 'pages/Swap'
import { parse } from 'qs' import { parse } from 'qs'
@ -322,8 +320,6 @@ export default function Landing() {
[shouldDisableNFTRoutes] [shouldDisableNFTRoutes]
) )
const isAndroidGALaunched = useAndroidGALaunchFlagEnabled()
const [accountDrawerOpen] = useAccountDrawer() const [accountDrawerOpen] = useAccountDrawer()
const navigate = useNavigate() const navigate = useNavigate()
useEffect(() => { useEffect(() => {
@ -400,20 +396,12 @@ export default function Landing() {
<DownloadWalletLink <DownloadWalletLink
{...getDownloadAppLinkProps({ {...getDownloadAppLinkProps({
element: InterfaceElementName.UNISWAP_WALLET_LANDING_PAGE_DOWNLOAD_BUTTON, element: InterfaceElementName.UNISWAP_WALLET_LANDING_PAGE_DOWNLOAD_BUTTON,
isAndroidGALaunched,
})} })}
> >
{isAndroidGALaunched ? (
<> <>
<UniswapAppLogo width="20" height="20" /> <UniswapAppLogo width="20" height="20" />
Download the Uniswap app Download the Uniswap app
</> </>
) : (
<>
<AppleLogo width="20" height="20" />
Download the Uniswap app for iOS
</>
)}
</DownloadWalletLink> </DownloadWalletLink>
</ContentContainer> </ContentContainer>
<AboutContentContainer isDarkMode={isDarkMode}> <AboutContentContainer isDarkMode={isDarkMode}>

@ -1,6 +1,5 @@
import { createApi, fetchBaseQuery, FetchBaseQueryError } from '@reduxjs/toolkit/query/react' import { createApi, fetchBaseQuery, FetchBaseQueryError } from '@reduxjs/toolkit/query/react'
import { Protocol } from '@uniswap/router-sdk' import { Protocol } from '@uniswap/router-sdk'
import { TradeType } from '@uniswap/sdk-core'
import { sendAnalyticsEvent } from 'analytics' import { sendAnalyticsEvent } from 'analytics'
import { isUniswapXSupportedChain } from 'constants/chains' import { isUniswapXSupportedChain } from 'constants/chains'
import ms from 'ms' import ms from 'ms'
@ -14,7 +13,6 @@ import {
QuoteState, QuoteState,
RouterPreference, RouterPreference,
RoutingConfig, RoutingConfig,
SwapRouterNativeAssets,
TradeResult, TradeResult,
URAQuoteResponse, URAQuoteResponse,
URAQuoteType, URAQuoteType,
@ -45,16 +43,7 @@ function getQuoteLatencyMeasure(mark: PerformanceMark): PerformanceMeasure {
} }
function getRoutingAPIConfig(args: GetQuoteArgs): RoutingConfig { function getRoutingAPIConfig(args: GetQuoteArgs): RoutingConfig {
const { const { account, tokenInChainId, uniswapXForceSyntheticQuotes, routerPreference } = args
account,
tradeType,
tokenOutAddress,
tokenInChainId,
uniswapXForceSyntheticQuotes,
uniswapXEthOutputEnabled,
uniswapXExactOutputEnabled,
routerPreference,
} = args
const uniswapx = { const uniswapx = {
useSyntheticQuotes: uniswapXForceSyntheticQuotes, useSyntheticQuotes: uniswapXForceSyntheticQuotes,
@ -72,15 +61,9 @@ function getRoutingAPIConfig(args: GetQuoteArgs): RoutingConfig {
enableFeeOnTransferFeeFetching: true, enableFeeOnTransferFeeFetching: true,
} }
const tokenOutIsNative = Object.values(SwapRouterNativeAssets).includes(tokenOutAddress as SwapRouterNativeAssets)
// UniswapX doesn't support native out, exact-out, or non-mainnet trades (yet),
// so even if the user has selected UniswapX as their router preference, force them to receive a Classic quote.
if ( if (
// If the user has opted out of UniswapX during the opt-out transition period, we should respect that preference and only request classic quotes. // If the user has opted out of UniswapX during the opt-out transition period, we should respect that preference and only request classic quotes.
(args.userOptedOutOfUniswapX && routerPreference !== RouterPreference.X) || (args.userOptedOutOfUniswapX && routerPreference !== RouterPreference.X) ||
(tokenOutIsNative && !uniswapXEthOutputEnabled) ||
(!uniswapXExactOutputEnabled && tradeType === TradeType.EXACT_OUTPUT) ||
!isUniswapXSupportedChain(tokenInChainId) || !isUniswapXSupportedChain(tokenInChainId) ||
routerPreference === INTERNAL_ROUTER_PREFERENCE_PRICE routerPreference === INTERNAL_ROUTER_PREFERENCE_PRICE
) { ) {

@ -43,8 +43,6 @@ export interface GetQuoteArgs {
tradeType: TradeType tradeType: TradeType
needsWrapIfUniswapX: boolean needsWrapIfUniswapX: boolean
uniswapXForceSyntheticQuotes: boolean uniswapXForceSyntheticQuotes: boolean
uniswapXEthOutputEnabled: boolean
uniswapXExactOutputEnabled: boolean
// legacy field indicating the user disabled UniswapX during the opt-in period, or dismissed the UniswapX opt-in modal. // legacy field indicating the user disabled UniswapX during the opt-in period, or dismissed the UniswapX opt-in modal.
userDisabledUniswapX: boolean userDisabledUniswapX: boolean
// temporary field indicating the user disabled UniswapX during the transition to the opt-out model // temporary field indicating the user disabled UniswapX during the transition to the opt-out model

@ -4,8 +4,6 @@ import { CurrencyAmount, TradeType } from '@uniswap/sdk-core'
import { AVERAGE_L1_BLOCK_TIME } from 'constants/chainInfo' import { AVERAGE_L1_BLOCK_TIME } from 'constants/chainInfo'
import { USDC_MAINNET } from 'constants/tokens' import { USDC_MAINNET } from 'constants/tokens'
import { useUniswapXDefaultEnabled } from 'featureFlags/flags/uniswapXDefault' import { useUniswapXDefaultEnabled } from 'featureFlags/flags/uniswapXDefault'
import { useUniswapXEthOutputEnabled } from 'featureFlags/flags/uniswapXEthOutput'
import { useUniswapXExactOutputEnabled } from 'featureFlags/flags/uniswapXExactOutput'
import { useUniswapXSyntheticQuoteEnabled } from 'featureFlags/flags/uniswapXUseSyntheticQuote' import { useUniswapXSyntheticQuoteEnabled } from 'featureFlags/flags/uniswapXUseSyntheticQuote'
import { useFeesEnabled } from 'featureFlags/flags/useFees' import { useFeesEnabled } from 'featureFlags/flags/useFees'
import useIsWindowVisible from 'hooks/useIsWindowVisible' import useIsWindowVisible from 'hooks/useIsWindowVisible'
@ -31,8 +29,6 @@ jest.mock('./slice', () => {
}) })
jest.mock('state/user/hooks') jest.mock('state/user/hooks')
jest.mock('featureFlags/flags/uniswapXUseSyntheticQuote') jest.mock('featureFlags/flags/uniswapXUseSyntheticQuote')
jest.mock('featureFlags/flags/uniswapXEthOutput')
jest.mock('featureFlags/flags/uniswapXExactOutput')
jest.mock('featureFlags/flags/uniswapXDefault') jest.mock('featureFlags/flags/uniswapXDefault')
jest.mock('featureFlags/flags/useFees') jest.mock('featureFlags/flags/useFees')
@ -42,8 +38,6 @@ beforeEach(() => {
mocked(useUniswapXSyntheticQuoteEnabled).mockReturnValue(false) mocked(useUniswapXSyntheticQuoteEnabled).mockReturnValue(false)
mocked(useUserDisabledUniswapX).mockReturnValue(false) mocked(useUserDisabledUniswapX).mockReturnValue(false)
mocked(useUserOptedOutOfUniswapX).mockReturnValue(false) mocked(useUserOptedOutOfUniswapX).mockReturnValue(false)
mocked(useUniswapXEthOutputEnabled).mockReturnValue(false)
mocked(useUniswapXExactOutputEnabled).mockReturnValue(false)
mocked(useUniswapXDefaultEnabled).mockReturnValue(false) mocked(useUniswapXDefaultEnabled).mockReturnValue(false)
mocked(useFeesEnabled).mockReturnValue(true) mocked(useFeesEnabled).mockReturnValue(true)
// @ts-ignore we dont use the response from this hook in useRoutingAPITrade so fine to mock as undefined // @ts-ignore we dont use the response from this hook in useRoutingAPITrade so fine to mock as undefined
@ -74,8 +68,6 @@ const MOCK_ARGS: GetQuoteArgs = {
uniswapXForceSyntheticQuotes: false, uniswapXForceSyntheticQuotes: false,
userDisabledUniswapX: false, userDisabledUniswapX: false,
userOptedOutOfUniswapX: false, userOptedOutOfUniswapX: false,
uniswapXEthOutputEnabled: false,
uniswapXExactOutputEnabled: false,
isUniswapXDefaultEnabled: false, isUniswapXDefaultEnabled: false,
sendPortionEnabled: true, sendPortionEnabled: true,
} }

@ -14,7 +14,6 @@ export const MICROSITE_LINK = 'https://wallet.uniswap.org/'
type OpenDownloadAppOptions = { type OpenDownloadAppOptions = {
element: InterfaceElementName element: InterfaceElementName
isAndroidGALaunched: boolean
} }
/** /**
@ -28,10 +27,10 @@ type OpenDownloadAppOptions = {
* *
* I've added a helper `getDownloadAppLinkProps` that unifies this behavior into one thing. * I've added a helper `getDownloadAppLinkProps` that unifies this behavior into one thing.
*/ */
export function openDownloadApp({ element, isAndroidGALaunched }: OpenDownloadAppOptions) { export function openDownloadApp({ element }: OpenDownloadAppOptions) {
if (isIOS) { if (isIOS) {
openDownloadStore({ element, appPlatform: AppDownloadPlatform.IOS, linkTarget: 'uniswap_wallet_appstore' }) openDownloadStore({ element, appPlatform: AppDownloadPlatform.IOS, linkTarget: 'uniswap_wallet_appstore' })
} else if (isAndroidGALaunched && isAndroid) { } else if (isAndroid) {
openDownloadStore({ element, appPlatform: AppDownloadPlatform.ANDROID, linkTarget: 'uniswap_wallet_playstore' }) openDownloadStore({ element, appPlatform: AppDownloadPlatform.ANDROID, linkTarget: 'uniswap_wallet_playstore' })
} else { } else {
sendAnalyticsEvent(InterfaceEventName.UNISWAP_WALLET_MICROSITE_OPENED, { element }) sendAnalyticsEvent(InterfaceEventName.UNISWAP_WALLET_MICROSITE_OPENED, { element })
@ -39,12 +38,12 @@ export function openDownloadApp({ element, isAndroidGALaunched }: OpenDownloadAp
} }
} }
export const getDownloadAppLinkProps = ({ element, isAndroidGALaunched }: OpenDownloadAppOptions) => { export const getDownloadAppLinkProps = ({ element }: OpenDownloadAppOptions) => {
return { return {
href: APP_DOWNLOAD_LINKS[element], href: APP_DOWNLOAD_LINKS[element],
onClick(e: { preventDefault: () => void }) { onClick(e: { preventDefault: () => void }) {
e.preventDefault() e.preventDefault()
openDownloadApp({ element, isAndroidGALaunched }) openDownloadApp({ element })
}, },
} }
} }

@ -8,7 +8,6 @@ export const isMobile = type === 'mobile' || type === 'tablet'
const platform = parser.getOS().name const platform = parser.getOS().name
export const isIOS = platform === 'iOS' export const isIOS = platform === 'iOS'
export const isAndroid = platform === 'Android' export const isAndroid = platform === 'Android'
export const isNonIOSPhone = !isIOS && type === 'mobile'
export const isNonSupportedPhone = !isIOS && !isAndroid && type === 'mobile' export const isNonSupportedPhone = !isIOS && !isAndroid && type === 'mobile'
export const isMobileSafari = isMobile && isIOS && name?.toLowerCase().includes('safari') export const isMobileSafari = isMobile && isIOS && name?.toLowerCase().includes('safari')