Commit 932c4482 authored by cartcrom's avatar cartcrom Committed by GitHub

feat: updated rate/routing tooltips (#7412)

* feat: updated routing tooltips

* refactor: gas price formatting

* fit: boolean rendering
parent 2d8dac5c
...@@ -14,7 +14,7 @@ import { Z_INDEX } from 'theme/zIndex' ...@@ -14,7 +14,7 @@ import { Z_INDEX } from 'theme/zIndex'
import { RoutingDiagramEntry } from 'utils/getRoutingDiagramEntries' import { RoutingDiagramEntry } from 'utils/getRoutingDiagramEntries'
import { ReactComponent as DotLine } from '../../assets/svg/dot_line.svg' import { ReactComponent as DotLine } from '../../assets/svg/dot_line.svg'
import { MouseoverTooltip } from '../Tooltip' import { MouseoverTooltip, TooltipSize } from '../Tooltip'
const Wrapper = styled(Box)` const Wrapper = styled(Box)`
align-items: center; align-items: center;
...@@ -142,6 +142,7 @@ function Pool({ currency0, currency1, feeAmount }: { currency0: Currency; curren ...@@ -142,6 +142,7 @@ function Pool({ currency0, currency1, feeAmount }: { currency0: Currency; curren
return ( return (
<MouseoverTooltip <MouseoverTooltip
text={<Trans>{tokenInfo0?.symbol + '/' + tokenInfo1?.symbol + ' ' + feeAmount / 10000}% pool</Trans>} text={<Trans>{tokenInfo0?.symbol + '/' + tokenInfo1?.symbol + ' ' + feeAmount / 10000}% pool</Trans>}
size={TooltipSize.ExtraSmall}
> >
<PoolBadge> <PoolBadge>
<Box margin="0 4px 0 12px"> <Box margin="0 4px 0 12px">
......
...@@ -20,7 +20,8 @@ import { getPriceImpactColor } from 'utils/prices' ...@@ -20,7 +20,8 @@ import { getPriceImpactColor } from 'utils/prices'
import { GasBreakdownTooltip, UniswapXDescription } from './GasBreakdownTooltip' import { GasBreakdownTooltip, UniswapXDescription } from './GasBreakdownTooltip'
import { MaxSlippageTooltip } from './MaxSlippageTooltip' import { MaxSlippageTooltip } from './MaxSlippageTooltip'
import SwapRoute from './SwapRoute' import { RoutingTooltip, SwapRoute } from './SwapRoute'
import TradePrice from './TradePrice'
export enum SwapLineItemType { export enum SwapLineItemType {
EXCHANGE_RATE, EXCHANGE_RATE,
...@@ -76,15 +77,6 @@ function Loading({ width = 50 }: { width?: number }) { ...@@ -76,15 +77,6 @@ function Loading({ width = 50 }: { width?: number }) {
return <LoadingRow data-testid="loading-row" height={15} width={width} /> return <LoadingRow data-testid="loading-row" height={15} width={width} />
} }
function ExchangeRateRow({ trade }: { trade: InterfaceTrade }) {
const { formatNumber } = useFormatter()
const rate = `1 ${trade.executionPrice.quoteCurrency.symbol} = ${formatNumber({
input: parseFloat(trade.executionPrice.toFixed(9)),
type: NumberType.TokenTx,
})} ${trade.executionPrice.baseCurrency.symbol}`
return <>{rate}</>
}
function ColoredPercentRow({ percent }: { percent: Percent }) { function ColoredPercentRow({ percent }: { percent: Percent }) {
const { formatSlippage } = useFormatter() const { formatSlippage } = useFormatter()
return <ColorWrapper textColor={getPriceImpactColor(percent)}>{formatSlippage(percent)}</ColorWrapper> return <ColorWrapper textColor={getPriceImpactColor(percent)}>{formatSlippage(percent)}</ColorWrapper>
...@@ -122,8 +114,10 @@ function useLineItem(props: SwapLineItemProps): LineItemData | undefined { ...@@ -122,8 +114,10 @@ function useLineItem(props: SwapLineItemProps): LineItemData | undefined {
switch (type) { switch (type) {
case SwapLineItemType.EXCHANGE_RATE: case SwapLineItemType.EXCHANGE_RATE:
return { return {
Label: () => <Trans>Exchange rate</Trans>, Label: () => <Trans>Rate</Trans>,
Value: () => <ExchangeRateRow trade={trade} />, Value: () => <TradePrice price={trade.executionPrice} />,
TooltipBody: !isPreview ? () => <RoutingTooltip trade={trade} /> : undefined,
tooltipSize: isUniswapX ? TooltipSize.Small : TooltipSize.Large,
} }
case SwapLineItemType.NETWORK_COST: case SwapLineItemType.NETWORK_COST:
if (!SUPPORTED_GAS_ESTIMATE_CHAIN_IDS.includes(chainId)) return if (!SUPPORTED_GAS_ESTIMATE_CHAIN_IDS.includes(chainId)) return
...@@ -185,12 +179,12 @@ function useLineItem(props: SwapLineItemProps): LineItemData | undefined { ...@@ -185,12 +179,12 @@ function useLineItem(props: SwapLineItemProps): LineItemData | undefined {
loaderWidth: 70, loaderWidth: 70,
} }
case SwapLineItemType.ROUTING_INFO: case SwapLineItemType.ROUTING_INFO:
if (isPreview) return { Label: () => <Trans>Order routing</Trans>, Value: () => <Loading /> } if (isPreview || syncing) return { Label: () => <Trans>Order routing</Trans>, Value: () => <Loading /> }
return { return {
Label: () => <Trans>Order routing</Trans>, Label: () => <Trans>Order routing</Trans>,
TooltipBody: () => { TooltipBody: () => {
if (isUniswapX) return <UniswapXDescription /> if (isUniswapX) return <UniswapXDescription />
return <SwapRoute data-testid="swap-route-info" trade={trade} syncing={syncing} /> return <SwapRoute data-testid="swap-route-info" trade={trade} />
}, },
tooltipSize: isUniswapX ? TooltipSize.Small : TooltipSize.Large, tooltipSize: isUniswapX ? TooltipSize.Small : TooltipSize.Large,
Value: () => <RouterLabel trade={trade} />, Value: () => <RouterLabel trade={trade} />,
......
import { Trans } from '@lingui/macro' import { Trans } from '@lingui/macro'
import { useWeb3React } from '@web3-react/core'
import Column from 'components/Column' import Column from 'components/Column'
import { LoadingRows } from 'components/Loader/styled'
import RoutingDiagram from 'components/RoutingDiagram/RoutingDiagram' import RoutingDiagram from 'components/RoutingDiagram/RoutingDiagram'
import { RowBetween } from 'components/Row'
import { SUPPORTED_GAS_ESTIMATE_CHAIN_IDS } from 'constants/chains' import { SUPPORTED_GAS_ESTIMATE_CHAIN_IDS } from 'constants/chains'
import useAutoRouterSupported from 'hooks/useAutoRouterSupported' import useAutoRouterSupported from 'hooks/useAutoRouterSupported'
import { ClassicTrade } from 'state/routing/types' import { ClassicTrade, SubmittableTrade } from 'state/routing/types'
import { isClassicTrade } from 'state/routing/utils'
import { Separator, ThemedText } from 'theme/components' import { Separator, ThemedText } from 'theme/components'
import { NumberType, useFormatter } from 'utils/formatNumbers'
import getRoutingDiagramEntries from 'utils/getRoutingDiagramEntries' import getRoutingDiagramEntries from 'utils/getRoutingDiagramEntries'
import RouterLabel from '../RouterLabel' import RouterLabel from '../RouterLabel'
import { UniswapXDescription } from './GasBreakdownTooltip'
export default function SwapRoute({ trade, syncing }: { trade: ClassicTrade; syncing: boolean }) { // TODO(WEB-2022)
const { chainId } = useWeb3React() // Can `trade.gasUseEstimateUSD` be defined when `chainId` is not in `SUPPORTED_GAS_ESTIMATE_CHAIN_IDS`?
const autoRouterSupported = useAutoRouterSupported() function useGasPrice({ gasUseEstimateUSD, inputAmount }: ClassicTrade) {
const { formatNumber } = useFormatter()
if (!gasUseEstimateUSD || !SUPPORTED_GAS_ESTIMATE_CHAIN_IDS.includes(inputAmount.currency.chainId)) return undefined
const routes = getRoutingDiagramEntries(trade) return gasUseEstimateUSD === 0 ? '<$0.01' : formatNumber({ input: gasUseEstimateUSD, type: NumberType.FiatGasPrice })
}
const gasPrice = function RouteLabel({ trade }: { trade: SubmittableTrade }) {
// TODO(WEB-2022) return (
// Can `trade.gasUseEstimateUSD` be defined when `chainId` is not in `SUPPORTED_GAS_ESTIMATE_CHAIN_IDS`? <RowBetween>
trade.gasUseEstimateUSD && chainId && SUPPORTED_GAS_ESTIMATE_CHAIN_IDS.includes(chainId) <ThemedText.BodySmall color="neutral2">Order Routing</ThemedText.BodySmall>
? trade.gasUseEstimateUSD === 0 <RouterLabel trade={trade} color="neutral1" />
? '<$0.01' </RowBetween>
: '$' + trade.gasUseEstimateUSD.toFixed(2) )
: undefined }
function PriceImpactRow({ trade }: { trade: ClassicTrade }) {
const { formatPriceImpact } = useFormatter()
return ( return (
<ThemedText.BodySmall color="neutral2">
<RowBetween>
<Trans>Price Impact</Trans>
<div>{formatPriceImpact(trade.priceImpact)}</div>
</RowBetween>
</ThemedText.BodySmall>
)
}
export function RoutingTooltip({ trade }: { trade: SubmittableTrade }) {
return isClassicTrade(trade) ? (
<Column gap="md"> <Column gap="md">
<RouterLabel trade={trade} color="neutral2" /> <PriceImpactRow trade={trade} />
<Separator /> <Separator />
{syncing ? ( <RouteLabel trade={trade} />
<LoadingRows> <SwapRoute trade={trade} />
<div style={{ width: '100%', height: '30px' }} /> </Column>
</LoadingRows>
) : ( ) : (
<RoutingDiagram <Column gap="md">
currencyIn={trade.inputAmount.currency} <RouteLabel trade={trade} />
currencyOut={trade.outputAmount.currency}
routes={routes}
/>
)}
{autoRouterSupported && (
<>
<Separator /> <Separator />
{syncing ? ( <UniswapXDescription />
<LoadingRows> </Column>
<div style={{ width: '100%', height: '15px' }} /> )
</LoadingRows> }
) : (
export function SwapRoute({ trade }: { trade: ClassicTrade }) {
const { inputAmount, outputAmount } = trade
const routes = getRoutingDiagramEntries(trade)
const gasPrice = useGasPrice(trade)
return useAutoRouterSupported() ? (
<Column gap="md">
<RoutingDiagram routes={routes} currencyIn={inputAmount.currency} currencyOut={outputAmount.currency} />
<ThemedText.Caption color="neutral2"> <ThemedText.Caption color="neutral2">
{gasPrice ? <Trans>Best price route costs ~{gasPrice} in gas.</Trans> : null}{' '} {Boolean(gasPrice) && <Trans>Best price route costs ~{gasPrice} in gas. </Trans>}
{Boolean(gasPrice) && ' '}
<Trans> <Trans>
This route optimizes your total output by considering split routes, multiple hops, and the gas cost of This route optimizes your total output by considering split routes, multiple hops, and the gas cost of each
each step. step.
</Trans> </Trans>
</ThemedText.Caption> </ThemedText.Caption>
)}
</>
)}
</Column> </Column>
) : (
<RoutingDiagram routes={routes} currencyIn={inputAmount.currency} currencyOut={outputAmount.currency} />
) )
} }
...@@ -146,28 +146,6 @@ exports[`SwapDetailsDropdown.tsx renders a trade 1`] = ` ...@@ -146,28 +146,6 @@ exports[`SwapDetailsDropdown.tsx renders a trade 1`] = `
fill: #7D7D7D; fill: #7D7D7D;
} }
.c20 {
text-align: right;
overflow-wrap: break-word;
}
.c19 {
cursor: help;
color: #7D7D7D;
}
.c22 {
background: #22222212;
border-radius: 8px;
color: #7D7D7D;
height: 20px;
padding: 0 6px;
}
.c22::after {
content: 'Auto';
}
.c8 { .c8 {
background-color: transparent; background-color: transparent;
border: none; border: none;
...@@ -200,6 +178,28 @@ exports[`SwapDetailsDropdown.tsx renders a trade 1`] = ` ...@@ -200,6 +178,28 @@ exports[`SwapDetailsDropdown.tsx renders a trade 1`] = `
user-select: text; user-select: text;
} }
.c20 {
text-align: right;
overflow-wrap: break-word;
}
.c19 {
cursor: help;
color: #7D7D7D;
}
.c22 {
background: #22222212;
border-radius: 8px;
color: #7D7D7D;
height: 20px;
padding: 0 6px;
}
.c22::after {
content: 'Auto';
}
.c5 { .c5 {
padding: 0; padding: 0;
-webkit-align-items: center; -webkit-align-items: center;
......
...@@ -91,22 +91,49 @@ exports[`SwapModalFooter.tsx matches base snapshot, test trade exact input 1`] = ...@@ -91,22 +91,49 @@ exports[`SwapModalFooter.tsx matches base snapshot, test trade exact input 1`] =
gap: 12px; gap: 12px;
} }
.c9 { .c7 {
display: inline-block; display: inline-block;
height: inherit; height: inherit;
} }
.c7 { .c9 {
background-color: transparent;
border: none;
cursor: pointer;
-webkit-align-items: center;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-box-pack: start;
-webkit-justify-content: flex-start;
-ms-flex-pack: start;
justify-content: flex-start;
padding: 0;
grid-template-columns: 1fr auto;
grid-gap: 0.25rem;
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-direction: row;
-ms-flex-direction: row;
flex-direction: row;
text-align: left;
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
-webkit-user-select: text;
-moz-user-select: text;
-ms-user-select: text;
user-select: text;
}
.c8 {
text-align: right; text-align: right;
overflow-wrap: break-word; overflow-wrap: break-word;
} }
.c6 { .c6 {
cursor: auto;
color: #7D7D7D;
}
.c8 {
cursor: help; cursor: help;
color: #7D7D7D; color: #7D7D7D;
} }
...@@ -137,29 +164,45 @@ exports[`SwapModalFooter.tsx matches base snapshot, test trade exact input 1`] = ...@@ -137,29 +164,45 @@ exports[`SwapModalFooter.tsx matches base snapshot, test trade exact input 1`] =
class="c5 c6 css-142zc9n" class="c5 c6 css-142zc9n"
data-testid="swap-li-label" data-testid="swap-li-label"
> >
Exchange rate Rate
</div> </div>
<div <div
class="c5 c7 css-142zc9n" class="c7"
>
<div>
<div
class="c5 c8 css-142zc9n"
>
<button
class="c9"
title="1 DEF = 1.00 ABC "
>
<div
class="c5 css-142zc9n"
> >
1 DEF = 1.00 ABC 1 DEF = 1.00 ABC
</div> </div>
</button>
</div>
</div>
</div>
</div> </div>
<div <div
class="c2 c3 c4" class="c2 c3 c4"
> >
<div <div
class="c5 c8 css-142zc9n" class="c5 c6 css-142zc9n"
data-testid="swap-li-label" data-testid="swap-li-label"
> >
Price impact Price impact
</div> </div>
<div <div
class="c9" class="c7"
> >
<div> <div>
<div <div
class="c5 c7 css-142zc9n" class="c5 c8 css-142zc9n"
> >
<span <span
class="" class=""
...@@ -174,17 +217,17 @@ exports[`SwapModalFooter.tsx matches base snapshot, test trade exact input 1`] = ...@@ -174,17 +217,17 @@ exports[`SwapModalFooter.tsx matches base snapshot, test trade exact input 1`] =
class="c2 c3 c4" class="c2 c3 c4"
> >
<div <div
class="c5 c8 css-142zc9n" class="c5 c6 css-142zc9n"
data-testid="swap-li-label" data-testid="swap-li-label"
> >
Max. slippage Max. slippage
</div> </div>
<div <div
class="c9" class="c7"
> >
<div> <div>
<div <div
class="c5 c7 css-142zc9n" class="c5 c8 css-142zc9n"
> >
<div <div
class="c2 c10" class="c2 c10"
...@@ -202,17 +245,17 @@ exports[`SwapModalFooter.tsx matches base snapshot, test trade exact input 1`] = ...@@ -202,17 +245,17 @@ exports[`SwapModalFooter.tsx matches base snapshot, test trade exact input 1`] =
class="c2 c3 c4" class="c2 c3 c4"
> >
<div <div
class="c5 c8 css-142zc9n" class="c5 c6 css-142zc9n"
data-testid="swap-li-label" data-testid="swap-li-label"
> >
Receive at least Receive at least
</div> </div>
<div <div
class="c9" class="c7"
> >
<div> <div>
<div <div
class="c5 c7 css-142zc9n" class="c5 c8 css-142zc9n"
> >
0.00000000000000098 DEF 0.00000000000000098 DEF
</div> </div>
...@@ -223,17 +266,17 @@ exports[`SwapModalFooter.tsx matches base snapshot, test trade exact input 1`] = ...@@ -223,17 +266,17 @@ exports[`SwapModalFooter.tsx matches base snapshot, test trade exact input 1`] =
class="c2 c3 c4" class="c2 c3 c4"
> >
<div <div
class="c5 c8 css-142zc9n" class="c5 c6 css-142zc9n"
data-testid="swap-li-label" data-testid="swap-li-label"
> >
Network cost Network cost
</div> </div>
<div <div
class="c9" class="c7"
> >
<div> <div>
<div <div
class="c5 c7 css-142zc9n" class="c5 c8 css-142zc9n"
> >
<div <div
class="c2 c13" class="c2 c13"
...@@ -447,7 +490,7 @@ exports[`SwapModalFooter.tsx renders a preview trade while disabling submission ...@@ -447,7 +490,7 @@ exports[`SwapModalFooter.tsx renders a preview trade while disabling submission
justify-content: flex-start; justify-content: flex-start;
} }
.c11 { .c12 {
width: 100%; width: 100%;
display: -webkit-box; display: -webkit-box;
display: -webkit-flex; display: -webkit-flex;
...@@ -476,7 +519,7 @@ exports[`SwapModalFooter.tsx renders a preview trade while disabling submission ...@@ -476,7 +519,7 @@ exports[`SwapModalFooter.tsx renders a preview trade while disabling submission
color: #222222; color: #222222;
} }
.c12 { .c13 {
color: #7D7D7D; color: #7D7D7D;
} }
...@@ -495,7 +538,7 @@ exports[`SwapModalFooter.tsx renders a preview trade while disabling submission ...@@ -495,7 +538,7 @@ exports[`SwapModalFooter.tsx renders a preview trade while disabling submission
gap: 12px; gap: 12px;
} }
.c10 { .c11 {
-webkit-animation: fAQEyV 1.5s infinite; -webkit-animation: fAQEyV 1.5s infinite;
animation: fAQEyV 1.5s infinite; animation: fAQEyV 1.5s infinite;
-webkit-animation-fill-mode: both; -webkit-animation-fill-mode: both;
...@@ -508,11 +551,43 @@ exports[`SwapModalFooter.tsx renders a preview trade while disabling submission ...@@ -508,11 +551,43 @@ exports[`SwapModalFooter.tsx renders a preview trade while disabling submission
width: 50px; width: 50px;
} }
.c9 { .c10 {
display: inline-block; display: inline-block;
height: inherit; height: inherit;
} }
.c8 {
background-color: transparent;
border: none;
cursor: pointer;
-webkit-align-items: center;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-box-pack: start;
-webkit-justify-content: flex-start;
-ms-flex-pack: start;
justify-content: flex-start;
padding: 0;
grid-template-columns: 1fr auto;
grid-gap: 0.25rem;
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-direction: row;
-ms-flex-direction: row;
flex-direction: row;
text-align: left;
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
-webkit-user-select: text;
-moz-user-select: text;
-ms-user-select: text;
user-select: text;
}
.c7 { .c7 {
text-align: right; text-align: right;
overflow-wrap: break-word; overflow-wrap: break-word;
...@@ -523,12 +598,12 @@ exports[`SwapModalFooter.tsx renders a preview trade while disabling submission ...@@ -523,12 +598,12 @@ exports[`SwapModalFooter.tsx renders a preview trade while disabling submission
color: #7D7D7D; color: #7D7D7D;
} }
.c8 { .c9 {
cursor: help; cursor: help;
color: #7D7D7D; color: #7D7D7D;
} }
.c13 { .c14 {
background: #22222212; background: #22222212;
border-radius: 8px; border-radius: 8px;
color: #7D7D7D; color: #7D7D7D;
...@@ -536,7 +611,7 @@ exports[`SwapModalFooter.tsx renders a preview trade while disabling submission ...@@ -536,7 +611,7 @@ exports[`SwapModalFooter.tsx renders a preview trade while disabling submission
padding: 0 6px; padding: 0 6px;
} }
.c13::after { .c14::after {
content: 'Auto'; content: 'Auto';
} }
...@@ -558,32 +633,42 @@ exports[`SwapModalFooter.tsx renders a preview trade while disabling submission ...@@ -558,32 +633,42 @@ exports[`SwapModalFooter.tsx renders a preview trade while disabling submission
class="c5 c6 css-142zc9n" class="c5 c6 css-142zc9n"
data-testid="swap-li-label" data-testid="swap-li-label"
> >
Exchange rate Rate
</div> </div>
<div <div
class="c5 c7 css-142zc9n" class="c5 c7 css-142zc9n"
>
<button
class="c8"
title="1 DEF = 1.00 ABC "
>
<div
class="c5 css-142zc9n"
> >
1 DEF = 1.00 ABC 1 DEF = 1.00 ABC
</div> </div>
</button>
</div>
</div> </div>
<div <div
class="c2 c3 c4" class="c2 c3 c4"
> >
<div <div
class="c5 c8 css-142zc9n" class="c5 c9 css-142zc9n"
data-testid="swap-li-label" data-testid="swap-li-label"
> >
Price impact Price impact
</div> </div>
<div <div
class="c9" class="c10"
> >
<div> <div>
<div <div
class="c5 c7 css-142zc9n" class="c5 c7 css-142zc9n"
> >
<div <div
class="c10" class="c11"
data-testid="loading-row" data-testid="loading-row"
height="15" height="15"
width="50" width="50"
...@@ -596,23 +681,23 @@ exports[`SwapModalFooter.tsx renders a preview trade while disabling submission ...@@ -596,23 +681,23 @@ exports[`SwapModalFooter.tsx renders a preview trade while disabling submission
class="c2 c3 c4" class="c2 c3 c4"
> >
<div <div
class="c5 c8 css-142zc9n" class="c5 c9 css-142zc9n"
data-testid="swap-li-label" data-testid="swap-li-label"
> >
Max. slippage Max. slippage
</div> </div>
<div <div
class="c9" class="c10"
> >
<div> <div>
<div <div
class="c5 c7 css-142zc9n" class="c5 c7 css-142zc9n"
> >
<div <div
class="c2 c11" class="c2 c12"
> >
<div <div
class="c12 c13 css-1lgneq0" class="c13 c14 css-1lgneq0"
/> />
2% 2%
</div> </div>
...@@ -624,13 +709,13 @@ exports[`SwapModalFooter.tsx renders a preview trade while disabling submission ...@@ -624,13 +709,13 @@ exports[`SwapModalFooter.tsx renders a preview trade while disabling submission
class="c2 c3 c4" class="c2 c3 c4"
> >
<div <div
class="c5 c8 css-142zc9n" class="c5 c9 css-142zc9n"
data-testid="swap-li-label" data-testid="swap-li-label"
> >
Receive at least Receive at least
</div> </div>
<div <div
class="c9" class="c10"
> >
<div> <div>
<div <div
...@@ -645,20 +730,20 @@ exports[`SwapModalFooter.tsx renders a preview trade while disabling submission ...@@ -645,20 +730,20 @@ exports[`SwapModalFooter.tsx renders a preview trade while disabling submission
class="c2 c3 c4" class="c2 c3 c4"
> >
<div <div
class="c5 c8 css-142zc9n" class="c5 c9 css-142zc9n"
data-testid="swap-li-label" data-testid="swap-li-label"
> >
Network cost Network cost
</div> </div>
<div <div
class="c9" class="c10"
> >
<div> <div>
<div <div
class="c5 c7 css-142zc9n" class="c5 c7 css-142zc9n"
> >
<div <div
class="c10" class="c11"
data-testid="loading-row" data-testid="loading-row"
height="15" height="15"
width="50" width="50"
......
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