Commit 24d62d95 authored by eddie's avatar eddie Committed by GitHub

feat: uniswapX default feature flag (#7246)

* feat: uniswapX default feature flag

* fix: bad merge

* fix: toggle behavior and style issues

* fix: toggle behavior
parent 28ea3908
...@@ -8,6 +8,7 @@ import { useInfoPoolPageFlag } from 'featureFlags/flags/infoPoolPage' ...@@ -8,6 +8,7 @@ import { useInfoPoolPageFlag } from 'featureFlags/flags/infoPoolPage'
import { useInfoTDPFlag } from 'featureFlags/flags/infoTDP' import { useInfoTDPFlag } from 'featureFlags/flags/infoTDP'
import { useMultichainUXFlag } from 'featureFlags/flags/multichainUx' import { useMultichainUXFlag } from 'featureFlags/flags/multichainUx'
import { TraceJsonRpcVariant, useTraceJsonRpcFlag } from 'featureFlags/flags/traceJsonRpc' import { TraceJsonRpcVariant, useTraceJsonRpcFlag } from 'featureFlags/flags/traceJsonRpc'
import { useUniswapXDefaultEnabledFlag } from 'featureFlags/flags/uniswapXDefault'
import { useUniswapXEthOutputFlag } from 'featureFlags/flags/uniswapXEthOutput' import { useUniswapXEthOutputFlag } from 'featureFlags/flags/uniswapXEthOutput'
import { useUniswapXExactOutputFlag } from 'featureFlags/flags/uniswapXExactOutput' import { useUniswapXExactOutputFlag } from 'featureFlags/flags/uniswapXExactOutput'
import { useUniswapXSyntheticQuoteFlag } from 'featureFlags/flags/uniswapXUseSyntheticQuote' import { useUniswapXSyntheticQuoteFlag } from 'featureFlags/flags/uniswapXUseSyntheticQuote'
...@@ -228,24 +229,6 @@ export default function FeatureFlagModal() { ...@@ -228,24 +229,6 @@ export default function FeatureFlagModal() {
<X size={24} /> <X size={24} />
</CloseButton> </CloseButton>
</Header> </Header>
<FeatureFlagOption
variant={BaseVariant}
value={useUniswapXSyntheticQuoteFlag()}
featureFlag={FeatureFlag.uniswapXSyntheticQuote}
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={useCurrencyConversionFlag()} value={useCurrencyConversionFlag()}
...@@ -264,6 +247,32 @@ export default function FeatureFlagModal() { ...@@ -264,6 +247,32 @@ export default function FeatureFlagModal() {
featureFlag={FeatureFlag.fotAdjustedmentsEnabled} featureFlag={FeatureFlag.fotAdjustedmentsEnabled}
label="Enable fee-on-transfer UI and slippage adjustments" label="Enable fee-on-transfer UI and slippage adjustments"
/> />
<FeatureFlagGroup name="UniswapX Flags">
<FeatureFlagOption
variant={BaseVariant}
value={useUniswapXSyntheticQuoteFlag()}
featureFlag={FeatureFlag.uniswapXSyntheticQuote}
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
variant={BaseVariant}
value={useUniswapXDefaultEnabledFlag()}
featureFlag={FeatureFlag.uniswapXDefaultEnabled}
label="Enable UniswapX by default"
/>
</FeatureFlagGroup>
<FeatureFlagGroup name="Info Site Migration"> <FeatureFlagGroup name="Info Site Migration">
<FeatureFlagOption <FeatureFlagOption
variant={BaseVariant} variant={BaseVariant}
......
...@@ -5,9 +5,10 @@ import UniswapXBrandMark from 'components/Logo/UniswapXBrandMark' ...@@ -5,9 +5,10 @@ import UniswapXBrandMark from 'components/Logo/UniswapXBrandMark'
import { RowBetween, RowFixed } from 'components/Row' import { RowBetween, RowFixed } from 'components/Row'
import Toggle from 'components/Toggle' import Toggle from 'components/Toggle'
import { isUniswapXSupportedChain } from 'constants/chains' import { isUniswapXSupportedChain } from 'constants/chains'
import { useUniswapXDefaultEnabled } from 'featureFlags/flags/uniswapXDefault'
import { useAppDispatch } from 'state/hooks' import { useAppDispatch } from 'state/hooks'
import { RouterPreference } from 'state/routing/types' import { RouterPreference } from 'state/routing/types'
import { useRouterPreference } from 'state/user/hooks' import { useRouterPreference, useUserDisabledUniswapX } from 'state/user/hooks'
import { updateDisabledUniswapX } from 'state/user/reducer' import { updateDisabledUniswapX } from 'state/user/reducer'
import styled from 'styled-components' import styled from 'styled-components'
import { Divider, ExternalLink, ThemedText } from 'theme' import { Divider, ExternalLink, ThemedText } from 'theme'
...@@ -26,6 +27,13 @@ export default function RouterPreferenceSettings() { ...@@ -26,6 +27,13 @@ export default function RouterPreferenceSettings() {
const [routerPreference, setRouterPreference] = useRouterPreference() const [routerPreference, setRouterPreference] = useRouterPreference()
const uniswapXEnabled = chainId && isUniswapXSupportedChain(chainId) const uniswapXEnabled = chainId && isUniswapXSupportedChain(chainId)
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
const userDisabledUniswapX = useUserDisabledUniswapX()
const isUniswapXDefaultEnabled = useUniswapXDefaultEnabled()
const isUniswapXOverrideEnabled = isUniswapXDefaultEnabled && !userDisabledUniswapX
const uniswapXInEffect =
routerPreference === RouterPreference.X ||
(routerPreference !== RouterPreference.CLIENT && isUniswapXOverrideEnabled)
return ( return (
<> <>
...@@ -47,13 +55,16 @@ export default function RouterPreferenceSettings() { ...@@ -47,13 +55,16 @@ export default function RouterPreferenceSettings() {
</RowFixed> </RowFixed>
<Toggle <Toggle
id="toggle-uniswap-x-button" id="toggle-uniswap-x-button"
isActive={routerPreference === RouterPreference.X} // If UniswapX-by-default is enabled we need to render this as active even if routerPreference === RouterPreference.API
// because we're going to default to the UniswapX quote.
// If the user manually toggles it off, this doesn't apply.
isActive={uniswapXInEffect}
toggle={() => { toggle={() => {
if (routerPreference === RouterPreference.X) { if (uniswapXInEffect) {
// We need to remember if a user disables Uniswap X, so we don't show the opt-in flow again. // We need to remember if a user disables Uniswap X, so we don't show the opt-in flow again.
dispatch(updateDisabledUniswapX({ disabledUniswapX: true })) dispatch(updateDisabledUniswapX({ disabledUniswapX: true }))
} }
setRouterPreference(routerPreference === RouterPreference.X ? RouterPreference.API : RouterPreference.X) setRouterPreference(uniswapXInEffect ? RouterPreference.API : RouterPreference.X)
}} }}
/> />
</RowBetween> </RowBetween>
...@@ -73,7 +84,11 @@ export default function RouterPreferenceSettings() { ...@@ -73,7 +84,11 @@ export default function RouterPreferenceSettings() {
isActive={routerPreference === RouterPreference.CLIENT} isActive={routerPreference === RouterPreference.CLIENT}
toggle={() => toggle={() =>
setRouterPreference( setRouterPreference(
routerPreference === RouterPreference.CLIENT ? RouterPreference.API : RouterPreference.CLIENT routerPreference === RouterPreference.CLIENT
? isUniswapXDefaultEnabled
? RouterPreference.X
: RouterPreference.API
: RouterPreference.CLIENT
) )
} }
/> />
......
import { BaseVariant, FeatureFlag, useBaseFlag } from '../index'
export function useUniswapXDefaultEnabledFlag(): BaseVariant {
return useBaseFlag(FeatureFlag.uniswapXDefaultEnabled)
}
export function useUniswapXDefaultEnabled(): boolean {
return useUniswapXDefaultEnabledFlag() === BaseVariant.Enabled
}
...@@ -18,6 +18,7 @@ export enum FeatureFlag { ...@@ -18,6 +18,7 @@ export enum FeatureFlag {
infoTDP = 'info_tdp', infoTDP = 'info_tdp',
infoPoolPage = 'info_pool_page', infoPoolPage = 'info_pool_page',
infoLiveViews = 'info_live_views', infoLiveViews = 'info_live_views',
uniswapXDefaultEnabled = 'uniswapx_default_enabled',
} }
interface FeatureFlagsContextType { interface FeatureFlagsContextType {
......
...@@ -152,6 +152,7 @@ export function useUniversalRouterSwapCallback( ...@@ -152,6 +152,7 @@ export function useUniversalRouterSwapCallback(
}, [ }, [
account, account,
analyticsContext, analyticsContext,
blockNumber,
chainId, chainId,
fiatValues, fiatValues,
options.deadline, options.deadline,
......
import { SkipToken, skipToken } from '@reduxjs/toolkit/query/react' import { SkipToken, skipToken } from '@reduxjs/toolkit/query/react'
import { Currency, CurrencyAmount, Percent, TradeType } from '@uniswap/sdk-core' import { Currency, CurrencyAmount, Percent, TradeType } from '@uniswap/sdk-core'
import { useUniswapXDefaultEnabled } from 'featureFlags/flags/uniswapXDefault'
import { useUniswapXEthOutputEnabled } from 'featureFlags/flags/uniswapXEthOutput' import { useUniswapXEthOutputEnabled } from 'featureFlags/flags/uniswapXEthOutput'
import { useUniswapXExactOutputEnabled } from 'featureFlags/flags/uniswapXExactOutput' import { useUniswapXExactOutputEnabled } from 'featureFlags/flags/uniswapXExactOutput'
import { useUniswapXSyntheticQuoteEnabled } from 'featureFlags/flags/uniswapXUseSyntheticQuote' import { useUniswapXSyntheticQuoteEnabled } from 'featureFlags/flags/uniswapXUseSyntheticQuote'
...@@ -36,6 +37,7 @@ export function useRoutingAPIArguments({ ...@@ -36,6 +37,7 @@ export function useRoutingAPIArguments({
const userDisabledUniswapX = useUserDisabledUniswapX() const userDisabledUniswapX = useUserDisabledUniswapX()
const uniswapXEthOutputEnabled = useUniswapXEthOutputEnabled() const uniswapXEthOutputEnabled = useUniswapXEthOutputEnabled()
const uniswapXExactOutputEnabled = useUniswapXExactOutputEnabled() const uniswapXExactOutputEnabled = useUniswapXExactOutputEnabled()
const isUniswapXDefaultEnabled = useUniswapXDefaultEnabled()
return useMemo( return useMemo(
() => () =>
...@@ -59,6 +61,7 @@ export function useRoutingAPIArguments({ ...@@ -59,6 +61,7 @@ export function useRoutingAPIArguments({
userDisabledUniswapX, userDisabledUniswapX,
uniswapXEthOutputEnabled, uniswapXEthOutputEnabled,
uniswapXExactOutputEnabled, uniswapXExactOutputEnabled,
isUniswapXDefaultEnabled,
inputTax, inputTax,
outputTax, outputTax,
}, },
...@@ -73,6 +76,7 @@ export function useRoutingAPIArguments({ ...@@ -73,6 +76,7 @@ export function useRoutingAPIArguments({
uniswapXForceSyntheticQuotes, uniswapXForceSyntheticQuotes,
userDisabledUniswapX, userDisabledUniswapX,
uniswapXEthOutputEnabled, uniswapXEthOutputEnabled,
isUniswapXDefaultEnabled,
inputTax, inputTax,
outputTax, outputTax,
] ]
......
...@@ -32,6 +32,7 @@ import TokenSafetyModal from 'components/TokenSafety/TokenSafetyModal' ...@@ -32,6 +32,7 @@ import TokenSafetyModal from 'components/TokenSafety/TokenSafetyModal'
import { getChainInfo } from 'constants/chainInfo' import { getChainInfo } from 'constants/chainInfo'
import { asSupportedChain, isSupportedChain } from 'constants/chains' import { asSupportedChain, isSupportedChain } from 'constants/chains'
import { getSwapCurrencyId, TOKEN_SHORTHANDS } from 'constants/tokens' import { getSwapCurrencyId, TOKEN_SHORTHANDS } from 'constants/tokens'
import { useUniswapXDefaultEnabled } from 'featureFlags/flags/uniswapXDefault'
import { useCurrency, useDefaultActiveTokens } from 'hooks/Tokens' import { useCurrency, useDefaultActiveTokens } from 'hooks/Tokens'
import { useIsSwapUnsupported } from 'hooks/useIsSwapUnsupported' import { useIsSwapUnsupported } from 'hooks/useIsSwapUnsupported'
import { useLocalCurrencyPrice } from 'hooks/useLocalCurrencyPrice' import { useLocalCurrencyPrice } from 'hooks/useLocalCurrencyPrice'
...@@ -565,6 +566,7 @@ export function Swap({ ...@@ -565,6 +566,7 @@ export function Swap({
const switchingChain = useAppSelector((state) => state.wallets.switchingChain) const switchingChain = useAppSelector((state) => state.wallets.switchingChain)
const showOptInSmall = !useScreenSize().navSearchInputVisible const showOptInSmall = !useScreenSize().navSearchInputVisible
const isDark = useIsDarkMode() const isDark = useIsDarkMode()
const isUniswapXDefaultEnabled = useUniswapXDefaultEnabled()
const swapElement = ( const swapElement = (
<SwapWrapper isDark={isDark} className={className} id="swap-page"> <SwapWrapper isDark={isDark} className={className} id="swap-page">
...@@ -791,14 +793,14 @@ export function Swap({ ...@@ -791,14 +793,14 @@ export function Swap({
)} )}
</div> </div>
</AutoColumn> </AutoColumn>
{!showOptInSmall && <UniswapXOptIn isSmall={false} swapInfo={swapInfo} />} {!showOptInSmall && !isUniswapXDefaultEnabled && <UniswapXOptIn isSmall={false} swapInfo={swapInfo} />}
</SwapWrapper> </SwapWrapper>
) )
return ( return (
<> <>
{swapElement} {swapElement}
{showOptInSmall && <UniswapXOptIn isSmall swapInfo={swapInfo} />} {showOptInSmall && !isUniswapXDefaultEnabled && <UniswapXOptIn isSmall swapInfo={swapInfo} />}
</> </>
) )
} }
...@@ -46,6 +46,7 @@ export interface GetQuoteArgs { ...@@ -46,6 +46,7 @@ export interface GetQuoteArgs {
uniswapXEthOutputEnabled: boolean uniswapXEthOutputEnabled: boolean
uniswapXExactOutputEnabled: boolean uniswapXExactOutputEnabled: boolean
userDisabledUniswapX: boolean userDisabledUniswapX: boolean
isUniswapXDefaultEnabled: boolean
inputTax: Percent inputTax: Percent
outputTax: Percent outputTax: Percent
} }
......
...@@ -192,11 +192,20 @@ export async function transformRoutesToTrade( ...@@ -192,11 +192,20 @@ export async function transformRoutesToTrade(
data: URAQuoteResponse, data: URAQuoteResponse,
quoteMethod: QuoteMethod quoteMethod: QuoteMethod
): Promise<TradeResult> { ): Promise<TradeResult> {
const { tradeType, needsWrapIfUniswapX, routerPreference, account, amount } = args const {
tradeType,
needsWrapIfUniswapX,
routerPreference,
account,
amount,
isUniswapXDefaultEnabled,
inputTax,
outputTax,
} = args
// During the opt-in period, only return UniswapX quotes if the user has turned on the setting, const showUniswapXTrade =
// even if it is the better quote. data.routing === URAQuoteType.DUTCH_LIMIT &&
const showUniswapXTrade = data.routing === URAQuoteType.DUTCH_LIMIT && routerPreference === RouterPreference.X (routerPreference === RouterPreference.X || (isUniswapXDefaultEnabled && routerPreference === RouterPreference.API))
const [currencyIn, currencyOut] = getTradeCurrencies(args, showUniswapXTrade) const [currencyIn, currencyOut] = getTradeCurrencies(args, showUniswapXTrade)
const { gasUseEstimateUSD, blockNumber, routes, gasUseEstimate } = getClassicTradeDetails( const { gasUseEstimateUSD, blockNumber, routes, gasUseEstimate } = getClassicTradeDetails(
...@@ -247,13 +256,13 @@ export async function transformRoutesToTrade( ...@@ -247,13 +256,13 @@ export async function transformRoutesToTrade(
isUniswapXBetter, isUniswapXBetter,
requestId: data.quote.requestId, requestId: data.quote.requestId,
quoteMethod, quoteMethod,
inputTax: args.inputTax, inputTax,
outputTax: args.outputTax, outputTax,
}) })
// During the opt-in period, only return UniswapX quotes if the user has turned on the setting, // During the opt-in period, only return UniswapX quotes if the user has turned on the setting,
// even if it is the better quote. // even if it is the better quote.
if (isUniswapXBetter && args.routerPreference === RouterPreference.X) { if (isUniswapXBetter && (routerPreference === RouterPreference.X || isUniswapXDefaultEnabled)) {
const orderInfo = toDutchOrderInfo(data.quote.orderInfo) const orderInfo = toDutchOrderInfo(data.quote.orderInfo)
const wrapInfo = await getWrapInfo(needsWrapIfUniswapX, account, currencyIn.chainId, amount, usdCostPerGas) const wrapInfo = await getWrapInfo(needsWrapIfUniswapX, account, currencyIn.chainId, amount, usdCostPerGas)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment