diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json
index c0a0f82cf..b9b2497be 100644
--- a/app/_locales/en/messages.json
+++ b/app/_locales/en/messages.json
@@ -1605,6 +1605,9 @@
"message": "You need $1 more $2 to complete this swap",
"description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol."
},
+ "swapBetterQuoteAvailable": {
+ "message": "A better quote is available"
+ },
"swapBuildQuotePlaceHolderText": {
"message": "No tokens available matching $1",
"description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text"
@@ -1701,8 +1704,8 @@
"message": "We find the best price from the top liquidity sources, every time. A fee of $1% is automatically factored into each quote, which supports ongoing development to make MetaMask even better.",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
- "swapNQuotesAvailable": {
- "message": "$1 quotes available",
+ "swapNQuotes": {
+ "message": "$1 quotes",
"description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen"
},
"swapNetworkFeeSummary": {
@@ -1830,6 +1833,9 @@
"swapUnknown": {
"message": "Unknown"
},
+ "swapUsingBestQuote": {
+ "message": "Using the best quote"
+ },
"swapVerifyTokenExplanation": {
"message": "Multiple tokens can use the same name and symbol. Check Etherscan to verify this is the token you're looking for."
},
@@ -1846,13 +1852,6 @@
"swapsAdvancedOptions": {
"message": "Advanced Options"
},
- "swapsBestQuote": {
- "message": "Best quote"
- },
- "swapsConvertToAbout": {
- "message": "Convert $1 to about",
- "description": "This message is part of a quote for a swap. The $1 is the amount being converted, and the amount it is being swapped for is below this message"
- },
"swapsExcessiveSlippageWarning": {
"message": "Slippage amount is too high and will result in a bad rate. Please reduce your slippage tolerance to a value below 15%."
},
diff --git a/app/images/down-arrow-grey.svg b/app/images/down-arrow-grey.svg
new file mode 100644
index 000000000..fcdb33eec
--- /dev/null
+++ b/app/images/down-arrow-grey.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/ui/app/components/ui/url-icon/index.scss b/ui/app/components/ui/url-icon/index.scss
index 482f327d3..14d5524cb 100644
--- a/ui/app/components/ui/url-icon/index.scss
+++ b/ui/app/components/ui/url-icon/index.scss
@@ -20,9 +20,9 @@
border-radius: 50%;
background: #bbc0c5;
flex: 0 1 auto;
+ display: flex;
justify-content: center;
align-items: center;
- text-align: center;
padding-top: 2px;
}
}
diff --git a/ui/app/components/ui/url-icon/url-icon.js b/ui/app/components/ui/url-icon/url-icon.js
index 6dcfcc06f..115eb5fe1 100644
--- a/ui/app/components/ui/url-icon/url-icon.js
+++ b/ui/app/components/ui/url-icon/url-icon.js
@@ -3,13 +3,13 @@ import PropTypes from 'prop-types'
import classnames from 'classnames'
import IconWithFallback from '../icon-with-fallback'
-export default function UrlIcon({ url, className, name }) {
+export default function UrlIcon({ url, className, name, fallbackClassName }) {
return (
)
}
@@ -18,4 +18,5 @@ UrlIcon.propTypes = {
url: PropTypes.string,
className: PropTypes.string,
name: PropTypes.string,
+ fallbackClassName: PropTypes.string,
}
diff --git a/ui/app/pages/swaps/build-quote/build-quote.js b/ui/app/pages/swaps/build-quote/build-quote.js
index 13d873b30..4714f79ad 100644
--- a/ui/app/pages/swaps/build-quote/build-quote.js
+++ b/ui/app/pages/swaps/build-quote/build-quote.js
@@ -418,6 +418,7 @@ export default function BuildQuote({
Number(maxSlippage) > MAX_ALLOWED_SLIPPAGE
}
hideCancel
+ showTermsOfService
/>
)
diff --git a/ui/app/pages/swaps/exchange-rate-display/exchange-rate-display.js b/ui/app/pages/swaps/exchange-rate-display/exchange-rate-display.js
index fbb268d65..e70ffd8e7 100644
--- a/ui/app/pages/swaps/exchange-rate-display/exchange-rate-display.js
+++ b/ui/app/pages/swaps/exchange-rate-display/exchange-rate-display.js
@@ -3,7 +3,7 @@ import PropTypes from 'prop-types'
import BigNumber from 'bignumber.js'
import classnames from 'classnames'
import { calcTokenAmount } from '../../../helpers/utils/token-util'
-import { toPrecisionWithoutTrailingZeros } from '../../../helpers/utils/util'
+import { formatSwapsValueForDisplay } from '../swaps.util'
export default function ExchangeRateDisplay({
primaryTokenValue,
@@ -13,6 +13,7 @@ export default function ExchangeRateDisplay({
secondaryTokenDecimals = 18,
secondaryTokenSymbol,
arrowColor = 'black',
+ boldSymbols = true,
className,
}) {
const [showPrimaryToSecondary, setShowPrimaryToSecondary] = useState(true)
@@ -57,16 +58,24 @@ export default function ExchangeRateDisplay({
} else if (new BigNumber(rate, 10).lt('0.000001', 10)) {
rateToDisplay = rate
} else {
- rateToDisplay = toPrecisionWithoutTrailingZeros(rate, 9)
+ rateToDisplay = formatSwapsValueForDisplay(rate)
}
return (
1
-
{baseSymbol}
+
+ {baseSymbol}
+
{comparisonSymbol}
{rateToDisplay}
-
{ratiodSymbol}
+
+ {ratiodSymbol}
+
+
+
+ {bestQuoteText && (
+
{bestQuoteText}
+ )}
+
+
+ {t('swapNQuotes', [numberOfQuotes])}
+
+
+
+
+
+
+
@@ -83,26 +113,39 @@ export default function FeeCard({
{!hideTokenApprovalRow && (
-
+
{t('swapThisWillAllowApprove', [tokenApprovalTextComponent])}
-
onTokenApprovalClick()}
- >
- {t('swapEditLimit')}
-
+
onTokenApprovalClick()}
+ >
+ {t('swapEditLimit')}
+
)}
+
+
+
+ {t('swapQuoteIncludesRate', [metaMaskFee])}
+
+
+
+
)
@@ -122,4 +165,9 @@ FeeCard.propTypes = {
tokenApprovalTextComponent: PropTypes.node,
tokenApprovalSourceTokenSymbol: PropTypes.string,
onTokenApprovalClick: PropTypes.func,
+ metaMaskFee: PropTypes.string.isRequired,
+ isBestQuote: PropTypes.bool,
+ onQuotesClick: PropTypes.func.isRequired,
+ numberOfQuotes: PropTypes.number.isRequired,
+ tokenConversionRate: PropTypes.number,
}
diff --git a/ui/app/pages/swaps/fee-card/fee-card.stories.js b/ui/app/pages/swaps/fee-card/fee-card.stories.js
index af57849f3..aaaf43d0f 100644
--- a/ui/app/pages/swaps/fee-card/fee-card.stories.js
+++ b/ui/app/pages/swaps/fee-card/fee-card.stories.js
@@ -1,6 +1,6 @@
import React from 'react'
import { action } from '@storybook/addon-actions'
-import { text } from '@storybook/addon-knobs'
+import { text, boolean, number, object } from '@storybook/addon-knobs'
import FeeCard from './fee-card'
const tokenApprovalTextComponent = (
@@ -35,6 +35,13 @@ export const WithAllProps = () => {
tokenApprovalSourceTokenSymbol="ABC"
onTokenApprovalClick={action('Clicked third row link')}
hideTokenApprovalRow={false}
+ metaMaskFee="0.875"
+ savings={object('savings 1', { total: '8.55' })}
+ onQuotesClick={action('Clicked quotes link')}
+ numberOfQuotes={number('numberOfQuotes', 6)}
+ isBestQuote={boolean('isBestQuote', true)}
+ conversionRate={300}
+ currentCurrency="usd"
/>
)
@@ -55,6 +62,11 @@ export const WithoutThirdRow = () => {
}}
onFeeCardMaxRowClick={action('Clicked max fee row link')}
hideTokenApprovalRow
+ onQuotesClick={action('Clicked quotes link')}
+ numberOfQuotes={number('numberOfQuotes', 1)}
+ isBestQuote={boolean('isBestQuote', true)}
+ savings={object('savings 1', { total: '8.55' })}
+ metaMaskFee="0.875"
/>
)
@@ -70,6 +82,9 @@ export const WithOnlyRequiredProps = () => {
}}
onFeeCardMaxRowClick={action('Clicked max fee row link')}
hideTokenApprovalRow
+ metaMaskFee="0.875"
+ onQuotesClick={action('Clicked quotes link')}
+ numberOfQuotes={2}
/>
)
diff --git a/ui/app/pages/swaps/fee-card/index.scss b/ui/app/pages/swaps/fee-card/index.scss
index 0a86f6ab7..d1807fc0d 100644
--- a/ui/app/pages/swaps/fee-card/index.scss
+++ b/ui/app/pages/swaps/fee-card/index.scss
@@ -1,11 +1,69 @@
.fee-card {
- border-radius: 8px;
- border: 1px solid $Grey-100;
width: 100%;
@include H7;
+ &__savings-and-quotes-header {
+ display: flex;
+ position: relative;
+ align-items: center;
+ }
+
+ &__savings-and-quotes-row {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ width: 100%;
+ left: 58px;
+ height: 39px;
+ background: $Blue-000;
+ border: 1px solid $Blue-500;
+ border-top-right-radius: 8px;
+ border-top-left-radius: 8px;
+ border-bottom: 0;
+ padding-left: 8px;
+ padding-right: 8px;
+ }
+
+ &__savings-text {
+ @include H6;
+
+ font-weight: bold;
+ color: $Blue-500;
+ }
+
+ &__quote-link-container {
+ display: flex;
+ align-items: center;
+ cursor: pointer;
+ }
+
+ &__quote-link-text {
+ @include H7;
+
+ color: $Blue-500;
+ }
+
+ &__caret-right {
+ color: $Blue-500;
+ width: 6px;
+ height: 6px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ margin-left: 6px;
+
+ i {
+ transform: rotate(90deg);
+ }
+ }
+
&__main {
+ border: 1px solid $Blue-500;
+ border-bottom-left-radius: 8px;
+ border-bottom-right-radius: 8px;
+ width: 100%;
+ max-width: 311px;
padding: 16px 16px 12px 16px;
}
@@ -31,6 +89,10 @@
cursor: pointer;
}
+ &__row-header-text--bold {
+ color: $Black-100;
+ }
+
&__row,
&__top-bordered-row {
display: flex;
@@ -51,7 +113,6 @@
img {
height: 10px;
width: 10px;
- margin-left: 4px;
cursor: pointer;
}
}
@@ -60,7 +121,12 @@
height: 10px;
width: 10px;
justify-content: center;
- margin-top: 2px;
+
+ div {
+ // Needed to override the style property added by the react-tippy library
+ display: flex !important;
+ height: 10px;
+ }
}
&__info-tooltip-paragraph {
@@ -111,11 +177,14 @@
margin-right: 12px;
}
- &__row-header-primary,
- &__row-header-primary--bold {
+ &__row-header-primary {
color: $Grey-500;
}
+ &__row-header-primary--bold {
+ color: $Black-100;
+ }
+
&__row-header-text--bold,
&__row-header-secondary--bold,
&__row-header-primary--bold {
@@ -125,6 +194,11 @@
&__bold {
font-weight: bold;
}
+
+ &__tilde {
+ font-family: Roboto, Helvetica, Arial, sans-serif;
+ margin-right: -3.5px;
+ }
}
.info-tooltip {
diff --git a/ui/app/pages/swaps/fee-card/pig-icon.js b/ui/app/pages/swaps/fee-card/pig-icon.js
new file mode 100644
index 000000000..ef7677ae4
--- /dev/null
+++ b/ui/app/pages/swaps/fee-card/pig-icon.js
@@ -0,0 +1,54 @@
+import React from 'react'
+
+export default function PigIcon() {
+ return (
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/ui/app/pages/swaps/index.scss b/ui/app/pages/swaps/index.scss
index 1346eb364..cb08d457b 100644
--- a/ui/app/pages/swaps/index.scss
+++ b/ui/app/pages/swaps/index.scss
@@ -71,7 +71,7 @@
font-weight: bold;
color: $Black-100;
- margin-top: 3px;
+ margin-top: -5px;
}
&__header {
diff --git a/ui/app/pages/swaps/main-quote-summary/index.scss b/ui/app/pages/swaps/main-quote-summary/index.scss
index 7993ea724..dfdc882f1 100644
--- a/ui/app/pages/swaps/main-quote-summary/index.scss
+++ b/ui/app/pages/swaps/main-quote-summary/index.scss
@@ -1,28 +1,75 @@
.main-quote-summary {
display: flex;
flex-flow: column;
+ justify-content: center;
align-items: center;
position: relative;
- height: 196px;
+ max-height: 196px;
+ min-height: 196px;
width: 100%;
- color: $white;
+ color: $Black-100;
- &__quote-backdrop-with-top-tab,
- &__quote-backdrop {
- position: absolute;
- box-shadow: 0 10px 39px rgba(3, 125, 214, 0.15);
- border-radius: 8px;
- background: #fafcff;
+ &__source-row,
+ &__destination-row {
+ width: 100%;
+ display: flex;
+ align-items: flex-start;
+ justify-content: center;
+
+ @include H6;
+
+ color: $Grey-500;
}
- &__quote-backdrop-with-top-tab {
- width: 348px;
- height: 215px;
+ &__source-row {
+ align-items: center;
}
- &__quote-backdrop {
- width: 310px;
- height: 164px;
+ &__source-row-value,
+ &__source-row-symbol {
+ // Each of these spans can be half their container width minus the space
+ // needed for the token icon and the span margins
+ max-width: calc(50% - 13px);
+ }
+
+
+ &__source-row-value {
+ margin-right: 5px;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+
+ &__source-row-symbol {
+ margin-left: 5px;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+
+ &__destination-row {
+ margin-top: 6px;
+ }
+
+ &__destination-row-symbol {
+ margin-left: 5px;
+ color: $Black-100;
+ }
+
+ &__icon,
+ &__icon-fallback {
+ height: 16px;
+ width: 16px;
+ }
+
+ &__icon-fallback {
+ padding-top: 0;
+ font-size: 12px;
+ line-height: 16px;
+ }
+
+ &__down-arrow {
+ margin-top: 5px;
}
&__details {
@@ -33,62 +80,24 @@
position: relative;
}
- &__best-quote {
- @include H7;
-
- font-weight: bold;
- position: relative;
- display: flex;
- padding-top: 6px;
- letter-spacing: 0.12px;
- min-height: 16px;
-
- > span {
- margin-left: 4px;
- }
- }
-
&__quote-details-top {
- height: 94px;
display: flex;
flex-flow: column;
justify-content: center;
align-items: center;
width: 100%;
- padding: 12px;
- padding-top: 2px;
- margin-top: 4px;
- }
-
- &__bold {
- font-weight: 900;
- }
-
- &__quote-small-white {
- white-space: nowrap;
- width: 100%;
- text-align: center;
- font-size: 14px;
- margin-bottom: 8px;
- margin-top: 6px;
}
&__quote-large {
display: flex;
- align-items: flex-end;
+ align-items: flex-start;
+ margin-top: 8px;
+ height: 50px;
}
&__quote-large-number {
- font-size: 40px;
- line-height: 32px;
- margin-right: 6px;
- }
-
- &__quote-large-symbol {
- display: flex;
- align-items: flex-end;
- font-size: 32px;
- line-height: 32px;
+ font-size: 60px;
+ line-height: 48px;
}
&__quote-large-white {
@@ -104,7 +113,10 @@
justify-content: center;
align-items: center;
width: 287px;
- border-top: 1px solid rgba(255, 255, 255, 0.2);
- height: 42px;
+ margin-top: 14px;
+ }
+
+ &__exchange-rate-display {
+ color: $Grey-500;
}
}
diff --git a/ui/app/pages/swaps/main-quote-summary/main-quote-summary.js b/ui/app/pages/swaps/main-quote-summary/main-quote-summary.js
index 1ae2e7d51..20aadf6fc 100644
--- a/ui/app/pages/swaps/main-quote-summary/main-quote-summary.js
+++ b/ui/app/pages/swaps/main-quote-summary/main-quote-summary.js
@@ -1,62 +1,33 @@
-import React, { useContext } from 'react'
+import React from 'react'
import PropTypes from 'prop-types'
import BigNumber from 'bignumber.js'
-import classnames from 'classnames'
-import { I18nContext } from '../../../contexts/i18n'
import { calcTokenAmount } from '../../../helpers/utils/token-util'
import { toPrecisionWithoutTrailingZeros } from '../../../helpers/utils/util'
import Tooltip from '../../../components/ui/tooltip'
-import SunCheckIcon from '../../../components/ui/icon/sun-check-icon.component'
+import UrlIcon from '../../../components/ui/url-icon'
import ExchangeRateDisplay from '../exchange-rate-display'
import { formatSwapsValueForDisplay } from '../swaps.util'
-import QuoteBackdrop from './quote-backdrop'
-function getFontSizes(fontSizeScore) {
- if (fontSizeScore <= 11) {
+function getFontSizesAndLineHeights(fontSizeScore) {
+ if (fontSizeScore <= 9) {
+ return [60, 48]
+ }
+ if (fontSizeScore <= 13) {
return [40, 32]
}
- if (fontSizeScore <= 16) {
- return [30, 24]
- }
- return [24, 14]
-}
-
-function getLineHeight(fontSizeScore) {
- if (fontSizeScore <= 11) {
- return 32
- }
- if (fontSizeScore <= 16) {
- return 26
- }
- return 18
-}
-
-// Returns a numerical value based on the length of the two passed strings: amount and symbol.
-// The returned value equals the number of digits in the amount string plus a value calculated
-// from the length of the symbol string. The returned number will be passed to the getFontSizes function
-// to determine the font size to apply to the amount and symbol strings when rendered. The
-// desired maximum digits and letters to show in the ultimately rendered string is 20, and in
-// such cases there can also be ellipsis shown and a decimal, combinding for a rendered "string"
-// length of ~22. As the symbol will always have a smaller font size than the amount, the
-// additive value of the symbol length to the font size score is corrected based on the total
-// number of alphanumeric characters in both strings and the desired rendered length of 22.
-function getFontSizeScore(amount, symbol) {
- const amountLength = amount.match(/\d+/gu).join('').length
- const symbolModifier = Math.min((amountLength + symbol.length) / 22, 1)
- return amountLength + symbol.length * symbolModifier
+ return [26, 15]
}
export default function MainQuoteSummary({
- isBestQuote,
sourceValue,
sourceSymbol,
sourceDecimals,
+ sourceIconUrl,
destinationValue,
destinationSymbol,
destinationDecimals,
+ destinationIconUrl,
}) {
- const t = useContext(I18nContext)
-
const sourceAmount = toPrecisionWithoutTrailingZeros(
calcTokenAmount(sourceValue, sourceDecimals).toString(10),
12,
@@ -67,43 +38,55 @@ export default function MainQuoteSummary({
)
const amountToDisplay = formatSwapsValueForDisplay(destinationAmount)
- const fontSizeScore = getFontSizeScore(amountToDisplay, destinationSymbol)
- const [numberFontSize, symbolFontSize] = getFontSizes(fontSizeScore)
- const lineHeight = getLineHeight(fontSizeScore)
-
+ const amountDigitLength = amountToDisplay.match(/\d+/gu).join('').length
+ const [numberFontSize, lineHeight] = getFontSizesAndLineHeights(
+ amountDigitLength,
+ )
let ellipsedAmountToDisplay = amountToDisplay
- if (fontSizeScore > 20) {
- ellipsedAmountToDisplay = `${amountToDisplay.slice(
- 0,
- amountToDisplay.length - (fontSizeScore - 20),
- )}...`
+
+ if (amountDigitLength > 20) {
+ ellipsedAmountToDisplay = `${amountToDisplay.slice(0, 20)}...`
}
return (
-
-
-
-
- {isBestQuote && }
- {isBestQuote && t('swapsBestQuote')}
-
-
- {t('swapsConvertToAbout', [
-
- {`${sourceAmount} ${sourceSymbol}`}
- ,
- ])}
-
+
+
+ {formatSwapsValueForDisplay(sourceAmount)}
+
+
+
+ {sourceSymbol}
+
+
+
+
+
+
+ {destinationSymbol}
+
+
-
- {`${destinationSymbol}`}
-
@@ -141,8 +115,9 @@ export default function MainQuoteSummary({
secondaryTokenValue={destinationValue}
secondaryTokenDecimals={destinationDecimals}
secondaryTokenSymbol={destinationSymbol}
- className="exchange-rate-display--white"
- arrowColor="white"
+ arrowColor="#037DD6"
+ boldSymbols={false}
+ className="main-quote-summary__exchange-rate-display"
/>
@@ -151,7 +126,6 @@ export default function MainQuoteSummary({
}
MainQuoteSummary.propTypes = {
- isBestQuote: PropTypes.bool,
sourceValue: PropTypes.oneOfType([
PropTypes.string,
PropTypes.instanceOf(BigNumber),
@@ -167,4 +141,6 @@ MainQuoteSummary.propTypes = {
PropTypes.number,
]),
destinationSymbol: PropTypes.string.isRequired,
+ sourceIconUrl: PropTypes.string,
+ destinationIconUrl: PropTypes.string,
}
diff --git a/ui/app/pages/swaps/main-quote-summary/main-quote-summary.stories.js b/ui/app/pages/swaps/main-quote-summary/main-quote-summary.stories.js
index ea267eb17..0f5ca998d 100644
--- a/ui/app/pages/swaps/main-quote-summary/main-quote-summary.stories.js
+++ b/ui/app/pages/swaps/main-quote-summary/main-quote-summary.stories.js
@@ -1,5 +1,5 @@
import React from 'react'
-import { text, number, boolean } from '@storybook/addon-knobs'
+import { text, number } from '@storybook/addon-knobs'
import MainQuoteSummary from './main-quote-summary'
export default {
@@ -8,28 +8,24 @@ export default {
export const BestQuote = () => {
return (
-
- )
-}
-
-export const NotBestQuote = () => {
- return (
-
+
+
+
)
}
diff --git a/ui/app/pages/swaps/swaps-footer/swaps-footer.js b/ui/app/pages/swaps/swaps-footer/swaps-footer.js
index 870ce028b..62a3e2a70 100644
--- a/ui/app/pages/swaps/swaps-footer/swaps-footer.js
+++ b/ui/app/pages/swaps/swaps-footer/swaps-footer.js
@@ -31,7 +31,10 @@ export default function SwapsFooter({
onSubmit={onSubmit}
submitText={submitText}
submitButtonType="confirm"
- footerClassName="swaps-footer__custom-page-container-footer-class"
+ footerClassName={classnames(
+ 'swaps-footer__custom-page-container-footer-class',
+ className,
+ )}
footerButtonClassName={classnames(
'swaps-footer__custom-page-container-footer-button-class',
{
diff --git a/ui/app/pages/swaps/swaps.util.js b/ui/app/pages/swaps/swaps.util.js
index d3189e5b7..189ff877b 100644
--- a/ui/app/pages/swaps/swaps.util.js
+++ b/ui/app/pages/swaps/swaps.util.js
@@ -507,6 +507,7 @@ export function quotesToRenderableData(
destinationTokenDecimals: destinationTokenInfo.decimals,
destinationTokenSymbol: destinationTokenInfo.symbol,
destinationTokenValue: formatSwapsValueForDisplay(destinationValue),
+ destinationIconUrl: destinationTokenInfo.iconUrl,
isBestQuote: quote.isBestQuote,
liquiditySourceKey,
feeInEth,
@@ -518,6 +519,7 @@ export function quotesToRenderableData(
sourceTokenDecimals: sourceTokenInfo.decimals,
sourceTokenSymbol: sourceTokenInfo.symbol,
sourceTokenValue: sourceValue,
+ sourceTokenIconUrl: sourceTokenInfo.iconUrl,
ethValueOfTrade,
minimumAmountReceived,
metaMaskFee: fee,
diff --git a/ui/app/pages/swaps/view-quote/index.scss b/ui/app/pages/swaps/view-quote/index.scss
index 474eced60..3382befff 100644
--- a/ui/app/pages/swaps/view-quote/index.scss
+++ b/ui/app/pages/swaps/view-quote/index.scss
@@ -44,13 +44,13 @@
display: flex;
align-items: center;
justify-content: center;
+ min-height: 46px;
}
&__view-other-button,
&__view-other-button-fade {
display: flex;
align-items: center;
- margin-bottom: 16px;
position: absolute;
@include H7;
@@ -133,6 +133,9 @@
width: 100%;
align-items: center;
justify-content: center;
+ width: intrinsic; /* Safari/WebKit uses a non-standard name */
+ width: max-content;
+ max-width: 340px;
margin-top: 8px;
@media screen and (min-width: 576px) {
@@ -149,57 +152,29 @@
}
&__countdown-timer-container {
- @media screen and (max-width: 576px) {
- margin-top: 12px;
- margin-bottom: 16px;
-
- &--thin {
- margin-top: 8px;
- margin-bottom: 8px;
-
- > div {
- margin-top: 0;
- margin-bottom: 0;
- }
- }
- }
-
- @media screen and (min-width: 576px) {
- &--thin {
- margin-top: 6px;
- }
- }
+ width: 152px;
+ min-height: 32px;
+ display: flex;
+ justify-content: center;
+ border-radius: 42px;
+ background: #f2f3f4;
+ margin-top: 8px;
}
&__fee-card-container {
+ display: flex;
+ align-items: center;
width: 100%;
- margin-top: 8px;
+ max-width: 311px;
margin-bottom: 8px;
@media screen and (min-width: 576px) {
margin-bottom: 0;
-
- &--three-rows {
- margin-bottom: -16px;
- }
- }
- }
-
- &__main-quote-summary-container {
- margin-top: 24px;
-
- @media screen and (max-width: 576px) {
- margin-top: 0;
- }
-
- &--thin {
- margin-top: 8px;
}
}
&__metamask-rate {
display: flex;
- margin-top: 8%;
}
&__metamask-rate-text {
@@ -214,5 +189,9 @@
&__thin-swaps-footer {
max-height: 82px;
+
+ @media screen and (min-width: 576px) {
+ height: 72px;
+ }
}
}
diff --git a/ui/app/pages/swaps/view-quote/view-quote.js b/ui/app/pages/swaps/view-quote/view-quote.js
index 4db97824f..1f5769f0c 100644
--- a/ui/app/pages/swaps/view-quote/view-quote.js
+++ b/ui/app/pages/swaps/view-quote/view-quote.js
@@ -73,7 +73,6 @@ import { useTokenTracker } from '../../../hooks/useTokenTracker'
import { QUOTES_EXPIRED_ERROR } from '../../../helpers/constants/swaps'
import CountdownTimer from '../countdown-timer'
import SwapsFooter from '../swaps-footer'
-import InfoTooltip from '../../../components/ui/info-tooltip'
import ViewQuotePriceDifference from './view-quote-price-difference'
export default function ViewQuote() {
@@ -117,6 +116,7 @@ export default function ViewQuote() {
const tradeValue = usedQuote?.trade?.value ?? '0x0'
const { isBestQuote } = usedQuote
+
const fetchParamsSourceToken = fetchParams?.sourceToken
const usedGasLimit =
@@ -191,9 +191,11 @@ export default function ViewQuote() {
destinationTokenDecimals,
destinationTokenSymbol,
destinationTokenValue,
+ destinationIconUrl,
sourceTokenDecimals,
sourceTokenSymbol,
sourceTokenValue,
+ sourceTokenIconUrl,
} = renderableDataForUsedQuote
const { feeInFiat, feeInEth } = getRenderableNetworkFeesForQuote(
@@ -499,11 +501,7 @@ export default function ViewQuote() {
/>
)}
-
+
-
-
-
-
-
- {t('swapNQuotesAvailable', [Object.values(quotes).length])}
-
-
-
{
- allAvailableQuotesOpened()
- setSelectQuotePopoverShown(true)
- }}
- >
- {t('swapNQuotesAvailable', [Object.values(quotes).length])}
-
-
-
-
-
- {t('swapQuoteIncludesRate', [metaMaskFee])}
-
-
-
+
{
+ allAvailableQuotesOpened()
+ setSelectQuotePopoverShown(true)
+ }}
+ tokenConversionRate={
+ destinationTokenSymbol === 'ETH'
+ ? 1
+ : memoizedTokenConversionRates[destinationToken.address]
+ }
/>
@@ -595,7 +573,6 @@ export default function ViewQuote() {
onCancel={async () => await dispatch(navigateBackToBuildQuote(history))}
disabled={balanceError || gasPrice === null || gasPrice === undefined}
className={isShowingWarning && 'view-quote__thin-swaps-footer'}
- showTermsOfService
showTopBorder
/>