@rango-dev/widget-embedded 0.17.1-next.2 → 0.17.1-next.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ConfirmWalletsModal/ConfirmWallets.helpers.d.ts +1 -3
- package/dist/components/ConfirmWalletsModal/ConfirmWallets.helpers.d.ts.map +1 -1
- package/dist/components/ConfirmWalletsModal/ConfirmWalletsModal.d.ts.map +1 -1
- package/dist/components/ConfirmWalletsModal/ConfirmWalletsModal.types.d.ts +1 -1
- package/dist/components/ConfirmWalletsModal/ConfirmWalletsModal.types.d.ts.map +1 -1
- package/dist/components/NoResult/NoResult.d.ts +4 -0
- package/dist/components/NoResult/NoResult.d.ts.map +1 -0
- package/dist/components/NoResult/NoResult.helpers.d.ts +4 -0
- package/dist/components/NoResult/NoResult.helpers.d.ts.map +1 -0
- package/dist/components/{NoRoutes/NoRoutes.styles.d.ts → NoResult/NoResult.styles.d.ts} +1 -1
- package/dist/components/{NoRoutes/NoRoutes.styles.d.ts.map → NoResult/NoResult.styles.d.ts.map} +1 -1
- package/dist/components/{NoRoutes/NoRoutes.types.d.ts → NoResult/NoResult.types.d.ts} +3 -3
- package/dist/components/NoResult/NoResult.types.d.ts.map +1 -0
- package/dist/components/NoResult/index.d.ts +2 -0
- package/dist/components/NoResult/index.d.ts.map +1 -0
- package/dist/components/Quote/Quote.d.ts +4 -0
- package/dist/components/Quote/Quote.d.ts.map +1 -0
- package/dist/components/Quote/Quote.styles.d.ts +1429 -0
- package/dist/components/Quote/Quote.styles.d.ts.map +1 -0
- package/dist/components/Quote/Quote.types.d.ts +22 -0
- package/dist/components/Quote/Quote.types.d.ts.map +1 -0
- package/dist/components/Quote/QuoteSkeleton.d.ts +4 -0
- package/dist/components/Quote/QuoteSkeleton.d.ts.map +1 -0
- package/dist/components/Quote/QuoteSkeleton.styles.d.ts +319 -0
- package/dist/components/Quote/QuoteSkeleton.styles.d.ts.map +1 -0
- package/dist/components/Quote/QuoteSkeleton.types.d.ts +6 -0
- package/dist/components/Quote/QuoteSkeleton.types.d.ts.map +1 -0
- package/dist/components/Quote/QuoteSummary.d.ts +11 -0
- package/dist/components/Quote/QuoteSummary.d.ts.map +1 -0
- package/dist/components/Quote/QuoteSummary.styles.d.ts +158 -0
- package/dist/components/Quote/QuoteSummary.styles.d.ts.map +1 -0
- package/dist/components/Quote/index.d.ts +4 -0
- package/dist/components/Quote/index.d.ts.map +1 -0
- package/dist/components/QuoteWarningsAndErrors/HighValueLossWarningModal.d.ts +11 -0
- package/dist/components/QuoteWarningsAndErrors/HighValueLossWarningModal.d.ts.map +1 -0
- package/dist/components/QuoteWarningsAndErrors/QuoteErrorsModalItem.d.ts +4 -0
- package/dist/components/QuoteWarningsAndErrors/QuoteErrorsModalItem.d.ts.map +1 -0
- package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.d.ts +4 -0
- package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.d.ts.map +1 -0
- package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.helpers.d.ts +9 -0
- package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.helpers.d.ts.map +1 -0
- package/dist/components/{RouteErrors/RouteErrors.styles.d.ts → QuoteWarningsAndErrors/QuoteWarningsAndErrors.styles.d.ts} +1 -1
- package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.styles.d.ts.map +1 -0
- package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.types.d.ts +22 -0
- package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.types.d.ts.map +1 -0
- package/dist/components/QuoteWarningsAndErrors/SlippageWariningModal.d.ts +11 -0
- package/dist/components/QuoteWarningsAndErrors/SlippageWariningModal.d.ts.map +1 -0
- package/dist/components/QuoteWarningsAndErrors/UnknownPriceWarningModal.d.ts +11 -0
- package/dist/components/QuoteWarningsAndErrors/UnknownPriceWarningModal.d.ts.map +1 -0
- package/dist/components/QuoteWarningsAndErrors/index.d.ts +2 -0
- package/dist/components/QuoteWarningsAndErrors/index.d.ts.map +1 -0
- package/dist/components/SwapDetails/SwapDetails.d.ts.map +1 -1
- package/dist/constants/errors.d.ts +4 -4
- package/dist/constants/errors.d.ts.map +1 -1
- package/dist/constants/messages.d.ts +1 -1
- package/dist/constants/warnings.d.ts +2 -2
- package/dist/constants/warnings.d.ts.map +1 -1
- package/dist/containers/QuoteInfo/QuoteInfo.d.ts +4 -0
- package/dist/containers/QuoteInfo/QuoteInfo.d.ts.map +1 -0
- package/dist/containers/QuoteInfo/QuoteInfo.styles.d.ts +472 -0
- package/dist/containers/QuoteInfo/QuoteInfo.styles.d.ts.map +1 -0
- package/dist/containers/QuoteInfo/QuoteInfo.types.d.ts +17 -0
- package/dist/containers/QuoteInfo/QuoteInfo.types.d.ts.map +1 -0
- package/dist/containers/QuoteInfo/index.d.ts +2 -0
- package/dist/containers/QuoteInfo/index.d.ts.map +1 -0
- package/dist/hooks/useConfirmSwap/index.d.ts +2 -0
- package/dist/hooks/useConfirmSwap/index.d.ts.map +1 -0
- package/dist/hooks/useConfirmSwap/useConfirmSwap.d.ts +3 -0
- package/dist/hooks/useConfirmSwap/useConfirmSwap.d.ts.map +1 -0
- package/dist/hooks/useConfirmSwap/useConfirmSwap.helpers.d.ts +16 -0
- package/dist/hooks/useConfirmSwap/useConfirmSwap.helpers.d.ts.map +1 -0
- package/dist/hooks/{useConfirmSwap.d.ts → useConfirmSwap/useConfirmSwap.types.d.ts} +5 -7
- package/dist/hooks/useConfirmSwap/useConfirmSwap.types.d.ts.map +1 -0
- package/dist/hooks/{useFetchBestRoute.d.ts → useFetchQuote.d.ts} +3 -3
- package/dist/hooks/useFetchQuote.d.ts.map +1 -0
- package/dist/hooks/usePrepareBlockchainList/usePrepareBlockchainList.helpers.d.ts +2 -2
- package/dist/hooks/useSwapInput.d.ts +4 -2
- package/dist/hooks/useSwapInput.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +4 -4
- package/dist/pages/ConfirmSwapPage.d.ts.map +1 -1
- package/dist/pages/Home.d.ts.map +1 -1
- package/dist/store/app.d.ts +2 -2
- package/dist/store/{bestRoute.d.ts → quote.d.ts} +25 -20
- package/dist/store/quote.d.ts.map +1 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/quote.d.ts +82 -0
- package/dist/types/quote.d.ts.map +1 -0
- package/dist/utils/numbers.d.ts +1 -1
- package/dist/utils/numbers.d.ts.map +1 -1
- package/dist/utils/{routing.d.ts → quote.d.ts} +16 -12
- package/dist/utils/quote.d.ts.map +1 -0
- package/dist/utils/settings.d.ts +1 -1
- package/dist/utils/swap.d.ts +22 -20
- package/dist/utils/swap.d.ts.map +1 -1
- package/dist/utils/wallets.d.ts +1 -1
- package/package.json +2 -2
- package/src/components/BlockchainsSection/BlockchainsSection.tsx +3 -3
- package/src/components/ConfirmWalletsModal/ConfirmWallets.helpers.ts +2 -64
- package/src/components/ConfirmWalletsModal/ConfirmWalletsModal.tsx +23 -26
- package/src/components/ConfirmWalletsModal/ConfirmWalletsModal.types.ts +1 -1
- package/src/components/LoadingSwapDetails/LoadingSwapDetails.styles.ts +3 -3
- package/src/components/LoadingSwapDetails/LoadingSwapDetails.tsx +6 -6
- package/src/components/{NoRoutes/NoRoutes.helper.ts → NoResult/NoResult.helpers.ts} +16 -9
- package/src/components/{NoRoutes/NoRoutes.styles.ts → NoResult/NoResult.styles.ts} +2 -0
- package/src/components/{NoRoutes/NoRoutes.tsx → NoResult/NoResult.tsx} +7 -12
- package/src/components/{NoRoutes/NoRoutes.types.ts → NoResult/NoResult.types.ts} +3 -2
- package/src/components/NoResult/index.ts +1 -0
- package/src/components/Quote/Quote.styles.ts +212 -0
- package/src/components/Quote/Quote.tsx +347 -0
- package/src/components/Quote/Quote.types.ts +16 -0
- package/src/components/Quote/QuoteSkeleton.styles.ts +110 -0
- package/src/components/Quote/QuoteSkeleton.tsx +108 -0
- package/src/components/Quote/QuoteSkeleton.types.ts +5 -0
- package/src/components/Quote/QuoteSummary.styles.ts +15 -0
- package/src/components/Quote/QuoteSummary.tsx +46 -0
- package/src/components/Quote/index.ts +3 -0
- package/src/components/QuoteWarningsAndErrors/HighValueLossWarningModal.tsx +107 -0
- package/src/components/{RouteErrors/RouteErrorsModalItem.tsx → QuoteWarningsAndErrors/QuoteErrorsModalItem.tsx} +3 -3
- package/src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.helpers.ts +67 -0
- package/src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.tsx +103 -0
- package/src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.types.ts +24 -0
- package/src/components/QuoteWarningsAndErrors/SlippageWariningModal.tsx +77 -0
- package/src/components/QuoteWarningsAndErrors/UnknownPriceWarningModal.tsx +38 -0
- package/src/components/QuoteWarningsAndErrors/index.ts +1 -0
- package/src/components/SwapDetails/SwapDetails.Placeholder.tsx +1 -1
- package/src/components/SwapDetails/SwapDetails.tsx +13 -16
- package/src/components/SwitchFromAndTo.tsx +2 -2
- package/src/components/UpdateUrl.tsx +12 -12
- package/src/constants/errors.ts +8 -10
- package/src/constants/messages.ts +1 -1
- package/src/constants/warnings.ts +7 -7
- package/src/containers/QuoteInfo/QuoteInfo.styles.ts +15 -0
- package/src/containers/QuoteInfo/QuoteInfo.tsx +97 -0
- package/src/containers/QuoteInfo/QuoteInfo.types.ts +17 -0
- package/src/containers/QuoteInfo/index.ts +1 -0
- package/src/hooks/useConfirmSwap/index.ts +1 -0
- package/src/hooks/useConfirmSwap/useConfirmSwap.helpers.ts +168 -0
- package/src/hooks/useConfirmSwap/useConfirmSwap.ts +136 -0
- package/src/hooks/useConfirmSwap/useConfirmSwap.types.ts +19 -0
- package/src/hooks/{useFetchBestRoute.ts → useFetchQuote.ts} +3 -3
- package/src/hooks/useNavigateBack.ts +3 -3
- package/src/hooks/useSwapInput.ts +57 -23
- package/src/hooks/useSyncStoresWithConfig.ts +2 -2
- package/src/pages/ConfirmSwapPage.tsx +58 -227
- package/src/pages/HistoryPage.tsx +1 -1
- package/src/pages/Home.tsx +52 -241
- package/src/pages/LanguagePage.tsx +1 -1
- package/src/pages/LiquiditySourcePage.tsx +1 -1
- package/src/pages/SelectBlockchainPage.tsx +3 -3
- package/src/pages/SelectSwapItemsPage.tsx +2 -2
- package/src/pages/SettingsPage.tsx +1 -1
- package/src/pages/ThemePage.tsx +1 -1
- package/src/pages/WalletsPage.tsx +1 -1
- package/src/store/{bestRoute.ts → quote.ts} +42 -38
- package/src/types/index.ts +1 -1
- package/src/types/quote.ts +107 -0
- package/src/utils/numbers.ts +1 -1
- package/src/utils/quote.ts +338 -0
- package/src/utils/swap.ts +99 -69
- package/src/utils/wallets.ts +2 -2
- package/dist/components/NoRoutes/NoRoutes.d.ts +0 -4
- package/dist/components/NoRoutes/NoRoutes.d.ts.map +0 -1
- package/dist/components/NoRoutes/NoRoutes.helper.d.ts +0 -3
- package/dist/components/NoRoutes/NoRoutes.helper.d.ts.map +0 -1
- package/dist/components/NoRoutes/NoRoutes.types.d.ts.map +0 -1
- package/dist/components/NoRoutes/index.d.ts +0 -2
- package/dist/components/NoRoutes/index.d.ts.map +0 -1
- package/dist/components/RouteErrors/RouteErrors.d.ts +0 -4
- package/dist/components/RouteErrors/RouteErrors.d.ts.map +0 -1
- package/dist/components/RouteErrors/RouteErrors.styles.d.ts.map +0 -1
- package/dist/components/RouteErrors/RouteErrors.types.d.ts +0 -24
- package/dist/components/RouteErrors/RouteErrors.types.d.ts.map +0 -1
- package/dist/components/RouteErrors/RouteErrorsModal.d.ts +0 -4
- package/dist/components/RouteErrors/RouteErrorsModal.d.ts.map +0 -1
- package/dist/components/RouteErrors/RouteErrorsModalItem.d.ts +0 -4
- package/dist/components/RouteErrors/RouteErrorsModalItem.d.ts.map +0 -1
- package/dist/components/RouteErrors/index.d.ts +0 -2
- package/dist/components/RouteErrors/index.d.ts.map +0 -1
- package/dist/hooks/useConfirmSwap.d.ts.map +0 -1
- package/dist/hooks/useFetchBestRoute.d.ts.map +0 -1
- package/dist/store/bestRoute.d.ts.map +0 -1
- package/dist/types/routing.d.ts +0 -65
- package/dist/types/routing.d.ts.map +0 -1
- package/dist/utils/routing.d.ts.map +0 -1
- package/src/components/NoRoutes/index.ts +0 -1
- package/src/components/RouteErrors/RouteErrors.tsx +0 -79
- package/src/components/RouteErrors/RouteErrors.types.ts +0 -29
- package/src/components/RouteErrors/RouteErrorsModal.tsx +0 -129
- package/src/components/RouteErrors/index.ts +0 -1
- package/src/hooks/useConfirmSwap.ts +0 -303
- package/src/types/routing.ts +0 -77
- package/src/utils/routing.ts +0 -321
- /package/src/components/{RouteErrors/RouteErrors.styles.ts → QuoteWarningsAndErrors/QuoteWarningsAndErrors.styles.ts} +0 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import type { HighValueLossWarning } from '../../types';
|
|
2
|
+
|
|
3
|
+
import { i18n } from '@lingui/core';
|
|
4
|
+
import {
|
|
5
|
+
Button,
|
|
6
|
+
Divider,
|
|
7
|
+
MessageBox,
|
|
8
|
+
Modal,
|
|
9
|
+
Typography,
|
|
10
|
+
WarningIcon,
|
|
11
|
+
} from '@rango-dev/ui';
|
|
12
|
+
import React from 'react';
|
|
13
|
+
|
|
14
|
+
import { errorMessages } from '../../constants/errors';
|
|
15
|
+
import {
|
|
16
|
+
GAS_FEE_MAX_DECIMALS,
|
|
17
|
+
GAS_FEE_MIN_DECIMALS,
|
|
18
|
+
PERCENTAGE_CHANGE_MAX_DECIMALS,
|
|
19
|
+
PERCENTAGE_CHANGE_MIN_DECIMALS,
|
|
20
|
+
USD_VALUE_MAX_DECIMALS,
|
|
21
|
+
USD_VALUE_MIN_DECIMALS,
|
|
22
|
+
} from '../../constants/routing';
|
|
23
|
+
import { getContainer } from '../../utils/common';
|
|
24
|
+
import { numberToString } from '../../utils/numbers';
|
|
25
|
+
|
|
26
|
+
import { QuoteErrorsModalItem } from './QuoteErrorsModalItem';
|
|
27
|
+
import { Flex } from './QuoteWarningsAndErrors.styles';
|
|
28
|
+
|
|
29
|
+
type Props = {
|
|
30
|
+
open: boolean;
|
|
31
|
+
onClose: () => void;
|
|
32
|
+
onConfirm: () => void;
|
|
33
|
+
warning: HighValueLossWarning;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export function HighValueLossWarningModal(props: Props) {
|
|
37
|
+
const { open, onClose, onConfirm, warning } = props;
|
|
38
|
+
const type = warning.warningLevel === 'high' ? 'error' : 'warning';
|
|
39
|
+
const highValueLossData = [
|
|
40
|
+
{
|
|
41
|
+
title: i18n.t('Swapping'),
|
|
42
|
+
value: numberToString(
|
|
43
|
+
warning.inputUsdValue,
|
|
44
|
+
USD_VALUE_MIN_DECIMALS,
|
|
45
|
+
USD_VALUE_MAX_DECIMALS
|
|
46
|
+
),
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
title: i18n.t('Gas cost'),
|
|
50
|
+
value: numberToString(
|
|
51
|
+
warning.totalFee,
|
|
52
|
+
GAS_FEE_MIN_DECIMALS,
|
|
53
|
+
GAS_FEE_MAX_DECIMALS
|
|
54
|
+
),
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
title: i18n.t('Receiving'),
|
|
58
|
+
value: numberToString(
|
|
59
|
+
warning.outputUsdValue,
|
|
60
|
+
USD_VALUE_MIN_DECIMALS,
|
|
61
|
+
USD_VALUE_MAX_DECIMALS
|
|
62
|
+
),
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
title: i18n.t('Price impact'),
|
|
66
|
+
value: numberToString(
|
|
67
|
+
warning.priceImpact,
|
|
68
|
+
PERCENTAGE_CHANGE_MIN_DECIMALS,
|
|
69
|
+
PERCENTAGE_CHANGE_MAX_DECIMALS
|
|
70
|
+
),
|
|
71
|
+
valueColor: `${type}500`,
|
|
72
|
+
},
|
|
73
|
+
];
|
|
74
|
+
|
|
75
|
+
return (
|
|
76
|
+
<Modal open={open} onClose={onClose} container={getContainer()}>
|
|
77
|
+
<MessageBox
|
|
78
|
+
type={type}
|
|
79
|
+
title={errorMessages().highValueLossError.impactTitle}
|
|
80
|
+
description={errorMessages().highValueLossError.description}
|
|
81
|
+
/>
|
|
82
|
+
|
|
83
|
+
<Flex>
|
|
84
|
+
<Divider size={20} />
|
|
85
|
+
<Typography size="small" variant="title">
|
|
86
|
+
{i18n.t('Details')}
|
|
87
|
+
</Typography>
|
|
88
|
+
<Flex>
|
|
89
|
+
{highValueLossData.map((item, index) => {
|
|
90
|
+
const key = index;
|
|
91
|
+
return <QuoteErrorsModalItem key={key} {...item} />;
|
|
92
|
+
})}
|
|
93
|
+
</Flex>
|
|
94
|
+
</Flex>
|
|
95
|
+
|
|
96
|
+
<Divider size={32} />
|
|
97
|
+
<Button
|
|
98
|
+
type="primary"
|
|
99
|
+
size="large"
|
|
100
|
+
prefix={<WarningIcon />}
|
|
101
|
+
fullWidth
|
|
102
|
+
onClick={onConfirm}>
|
|
103
|
+
{errorMessages().highValueLossError.confirmMessage}
|
|
104
|
+
</Button>
|
|
105
|
+
</Modal>
|
|
106
|
+
);
|
|
107
|
+
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type { ModalContentData } from './
|
|
1
|
+
import type { ModalContentData } from './QuoteWarningsAndErrors.types';
|
|
2
2
|
|
|
3
3
|
import { Typography } from '@rango-dev/ui';
|
|
4
4
|
import React from 'react';
|
|
5
5
|
|
|
6
|
-
import { Item } from './
|
|
6
|
+
import { Item } from './QuoteWarningsAndErrors.styles';
|
|
7
7
|
|
|
8
|
-
export function
|
|
8
|
+
export function QuoteErrorsModalItem(props: ModalContentData) {
|
|
9
9
|
const { title, value, valueColor } = props;
|
|
10
10
|
|
|
11
11
|
return (
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
BridgeLimitError,
|
|
3
|
+
InsufficientSlippageError,
|
|
4
|
+
QuoteWarning,
|
|
5
|
+
} from '../../types';
|
|
6
|
+
|
|
7
|
+
import { i18n } from '@lingui/core';
|
|
8
|
+
|
|
9
|
+
import { errorMessages } from '../../constants/errors';
|
|
10
|
+
import { QuoteErrorType, QuoteWarningType } from '../../types';
|
|
11
|
+
import { getPriceImpactLevel } from '../../utils/quote';
|
|
12
|
+
|
|
13
|
+
type AlertInfo = {
|
|
14
|
+
alertType: 'error' | 'warning';
|
|
15
|
+
title: string;
|
|
16
|
+
action: 'show-info' | 'change-settings' | null;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export function makeAlerts(
|
|
20
|
+
warning: QuoteWarning | null,
|
|
21
|
+
error: BridgeLimitError | InsufficientSlippageError | null
|
|
22
|
+
): AlertInfo | null {
|
|
23
|
+
const alertInfo: AlertInfo = {
|
|
24
|
+
alertType: 'warning',
|
|
25
|
+
title: '',
|
|
26
|
+
action: 'show-info',
|
|
27
|
+
};
|
|
28
|
+
if (warning) {
|
|
29
|
+
if (warning.type === QuoteWarningType.HIGH_VALUE_LOSS) {
|
|
30
|
+
const warningLevel = getPriceImpactLevel(warning.priceImpact);
|
|
31
|
+
if (warningLevel === 'high') {
|
|
32
|
+
alertInfo.alertType = 'error';
|
|
33
|
+
}
|
|
34
|
+
alertInfo.title = errorMessages().highValueLossError.title;
|
|
35
|
+
}
|
|
36
|
+
if (warning.type === QuoteWarningType.UNKNOWN_PRICE) {
|
|
37
|
+
alertInfo.title = errorMessages().unknownPriceError.title;
|
|
38
|
+
}
|
|
39
|
+
if (warning.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE) {
|
|
40
|
+
alertInfo.title = i18n.t({
|
|
41
|
+
id: 'minimum required slippage for this route: {minRequiredSlippage}',
|
|
42
|
+
values: {
|
|
43
|
+
minRequiredSlippage: warning.minRequiredSlippage,
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
if (warning.type === QuoteWarningType.HIGH_SLIPPAGE) {
|
|
48
|
+
alertInfo.title = i18n.t('Caution, your slippage is high');
|
|
49
|
+
}
|
|
50
|
+
return alertInfo;
|
|
51
|
+
}
|
|
52
|
+
if (error) {
|
|
53
|
+
alertInfo.alertType = 'error';
|
|
54
|
+
if (error.type === QuoteErrorType.BRIDGE_LIMIT) {
|
|
55
|
+
alertInfo.title = error.recommendation;
|
|
56
|
+
alertInfo.action = null;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (error.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE) {
|
|
60
|
+
alertInfo.title = '';
|
|
61
|
+
alertInfo.action = 'change-settings';
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return alertInfo;
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { PropTypes } from './QuoteWarningsAndErrors.types';
|
|
2
|
+
|
|
3
|
+
import { i18n } from '@lingui/core';
|
|
4
|
+
import { Alert, Button, InfoIcon } from '@rango-dev/ui';
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import { useNavigate } from 'react-router-dom';
|
|
7
|
+
|
|
8
|
+
import { navigationRoutes } from '../../constants/navigationRoutes';
|
|
9
|
+
import { QuoteErrorType, QuoteWarningType } from '../../types';
|
|
10
|
+
import { NoResult } from '../NoResult';
|
|
11
|
+
|
|
12
|
+
import { HighValueLossWarningModal } from './HighValueLossWarningModal';
|
|
13
|
+
import { makeAlerts } from './QuoteWarningsAndErrors.helpers';
|
|
14
|
+
import { Action, Alerts } from './QuoteWarningsAndErrors.styles';
|
|
15
|
+
import { SlippageWarningModal } from './SlippageWariningModal';
|
|
16
|
+
import { UnknownPriceWarningModal } from './UnknownPriceWarningModal';
|
|
17
|
+
|
|
18
|
+
export function QuoteWarningsAndErrors(props: PropTypes) {
|
|
19
|
+
const {
|
|
20
|
+
warning,
|
|
21
|
+
error,
|
|
22
|
+
refetchQuote,
|
|
23
|
+
showWarningModal,
|
|
24
|
+
onOpenWarningModal,
|
|
25
|
+
onCloseWarningModal,
|
|
26
|
+
onConfirmWarningModal,
|
|
27
|
+
} = props;
|
|
28
|
+
|
|
29
|
+
const navigate = useNavigate();
|
|
30
|
+
|
|
31
|
+
const warningModalHandlers = {
|
|
32
|
+
open: showWarningModal,
|
|
33
|
+
onClose: onCloseWarningModal,
|
|
34
|
+
onConfirm: onConfirmWarningModal,
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const showNoResultMessage =
|
|
38
|
+
error?.type === QuoteErrorType.NO_RESULT ||
|
|
39
|
+
error?.type === QuoteErrorType.REQUEST_FAILED;
|
|
40
|
+
|
|
41
|
+
const alertInfo = makeAlerts(
|
|
42
|
+
warning,
|
|
43
|
+
error?.type === QuoteErrorType.BRIDGE_LIMIT ||
|
|
44
|
+
error?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE
|
|
45
|
+
? error
|
|
46
|
+
: null
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
const showAlerts = !!alertInfo;
|
|
50
|
+
|
|
51
|
+
return (
|
|
52
|
+
<>
|
|
53
|
+
{showNoResultMessage && <NoResult error={error} fetch={refetchQuote} />}
|
|
54
|
+
|
|
55
|
+
{showAlerts && (
|
|
56
|
+
<Alerts>
|
|
57
|
+
<Alert
|
|
58
|
+
title={alertInfo.title}
|
|
59
|
+
type={alertInfo.alertType}
|
|
60
|
+
variant="alarm"
|
|
61
|
+
action={
|
|
62
|
+
alertInfo.action === 'show-info' ? (
|
|
63
|
+
<Action onClick={onOpenWarningModal}>
|
|
64
|
+
<InfoIcon size={12} color="gray" />
|
|
65
|
+
</Action>
|
|
66
|
+
) : (
|
|
67
|
+
<Button
|
|
68
|
+
size="xsmall"
|
|
69
|
+
type={'error'}
|
|
70
|
+
onClick={() => navigate(navigationRoutes.settings)}>
|
|
71
|
+
{i18n.t('Change Settings')}
|
|
72
|
+
</Button>
|
|
73
|
+
)
|
|
74
|
+
}
|
|
75
|
+
/>
|
|
76
|
+
</Alerts>
|
|
77
|
+
)}
|
|
78
|
+
|
|
79
|
+
{warning && (
|
|
80
|
+
<>
|
|
81
|
+
{warning.type === QuoteWarningType.HIGH_VALUE_LOSS && (
|
|
82
|
+
<HighValueLossWarningModal
|
|
83
|
+
{...warningModalHandlers}
|
|
84
|
+
warning={warning}
|
|
85
|
+
/>
|
|
86
|
+
)}
|
|
87
|
+
|
|
88
|
+
{(warning.type === QuoteWarningType.HIGH_SLIPPAGE ||
|
|
89
|
+
warning.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE) && (
|
|
90
|
+
<SlippageWarningModal {...warningModalHandlers} warning={warning} />
|
|
91
|
+
)}
|
|
92
|
+
|
|
93
|
+
{warning.type === QuoteWarningType.UNKNOWN_PRICE && (
|
|
94
|
+
<UnknownPriceWarningModal
|
|
95
|
+
{...warningModalHandlers}
|
|
96
|
+
warning={warning}
|
|
97
|
+
/>
|
|
98
|
+
)}
|
|
99
|
+
</>
|
|
100
|
+
)}
|
|
101
|
+
</>
|
|
102
|
+
);
|
|
103
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { QuoteError, QuoteWarning } from '../../types';
|
|
2
|
+
|
|
3
|
+
export interface PropTypes {
|
|
4
|
+
loading: boolean;
|
|
5
|
+
error: QuoteError | null;
|
|
6
|
+
warning: QuoteWarning | null;
|
|
7
|
+
showWarningModal: boolean;
|
|
8
|
+
refetchQuote: () => void;
|
|
9
|
+
onOpenWarningModal: () => void;
|
|
10
|
+
onCloseWarningModal: () => void;
|
|
11
|
+
onConfirmWarningModal: () => void;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
type ModalPropTypesKeys = keyof Omit<PropTypes, 'extraSpace' | 'loading'>;
|
|
15
|
+
|
|
16
|
+
export type ModalPropTypes = Pick<PropTypes, ModalPropTypesKeys> & {
|
|
17
|
+
open: boolean;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export interface ModalContentData {
|
|
21
|
+
title: string;
|
|
22
|
+
value: string;
|
|
23
|
+
valueColor?: string;
|
|
24
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
HighSlippageWarning,
|
|
3
|
+
InsufficientSlippageWarning,
|
|
4
|
+
} from '../../types';
|
|
5
|
+
|
|
6
|
+
import { i18n } from '@lingui/core';
|
|
7
|
+
import { Button, Divider, MessageBox, Modal, Typography } from '@rango-dev/ui';
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import { useNavigate } from 'react-router-dom';
|
|
10
|
+
|
|
11
|
+
import { navigationRoutes } from '../../constants/navigationRoutes';
|
|
12
|
+
import { useSettingsStore } from '../../store/settings';
|
|
13
|
+
import { QuoteWarningType } from '../../types';
|
|
14
|
+
import { getContainer } from '../../utils/common';
|
|
15
|
+
|
|
16
|
+
type PropsTypes = {
|
|
17
|
+
open: boolean;
|
|
18
|
+
onClose: () => void;
|
|
19
|
+
onConfirm: () => void;
|
|
20
|
+
warning: InsufficientSlippageWarning | HighSlippageWarning;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export function SlippageWarningModal(props: PropsTypes) {
|
|
24
|
+
const { customSlippage, slippage } = useSettingsStore();
|
|
25
|
+
const { open, onClose, onConfirm, warning } = props;
|
|
26
|
+
const navigate = useNavigate();
|
|
27
|
+
const userSlippage = customSlippage ?? slippage;
|
|
28
|
+
return (
|
|
29
|
+
<Modal
|
|
30
|
+
anchor="bottom"
|
|
31
|
+
open={open}
|
|
32
|
+
prefix={
|
|
33
|
+
<Button
|
|
34
|
+
size="small"
|
|
35
|
+
variant="ghost"
|
|
36
|
+
onClick={() => navigate('/' + navigationRoutes.settings)}>
|
|
37
|
+
<Typography variant="label" size="medium" color="$neutral900">
|
|
38
|
+
{i18n.t('Change settings')}
|
|
39
|
+
</Typography>
|
|
40
|
+
</Button>
|
|
41
|
+
}
|
|
42
|
+
container={getContainer()}
|
|
43
|
+
onClose={onClose}>
|
|
44
|
+
<MessageBox
|
|
45
|
+
type="warning"
|
|
46
|
+
title={
|
|
47
|
+
warning.type === QuoteWarningType.HIGH_SLIPPAGE
|
|
48
|
+
? i18n.t('High slippage')
|
|
49
|
+
: i18n.t('Low slippage')
|
|
50
|
+
}
|
|
51
|
+
description={
|
|
52
|
+
warning.type === QuoteWarningType.HIGH_SLIPPAGE
|
|
53
|
+
? i18n.t({
|
|
54
|
+
id: ' Caution, your slippage is high (={userSlippage}). Your trade may be front run.',
|
|
55
|
+
values: { userSlippage },
|
|
56
|
+
})
|
|
57
|
+
: i18n.t({
|
|
58
|
+
id: 'We recommend you to increase slippage to at least {minRequiredSlippage} for this route.',
|
|
59
|
+
values: {
|
|
60
|
+
minRequiredSlippage: warning.minRequiredSlippage,
|
|
61
|
+
},
|
|
62
|
+
})
|
|
63
|
+
}>
|
|
64
|
+
<Divider size={18} />
|
|
65
|
+
<Divider size={32} />
|
|
66
|
+
<Button
|
|
67
|
+
size="large"
|
|
68
|
+
type="primary"
|
|
69
|
+
variant="contained"
|
|
70
|
+
fullWidth
|
|
71
|
+
onClick={onConfirm}>
|
|
72
|
+
{i18n.t('Confirm anyway')}
|
|
73
|
+
</Button>
|
|
74
|
+
</MessageBox>
|
|
75
|
+
</Modal>
|
|
76
|
+
);
|
|
77
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { UnknownPriceWarning } from '../../types';
|
|
2
|
+
|
|
3
|
+
import { Button, Divider, MessageBox, Modal, WarningIcon } from '@rango-dev/ui';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
|
|
6
|
+
import { errorMessages } from '../../constants/errors';
|
|
7
|
+
import { getContainer } from '../../utils/common';
|
|
8
|
+
|
|
9
|
+
type Props = {
|
|
10
|
+
open: boolean;
|
|
11
|
+
onClose: () => void;
|
|
12
|
+
onConfirm: () => void;
|
|
13
|
+
warning: UnknownPriceWarning;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export function UnknownPriceWarningModal(props: Props) {
|
|
17
|
+
const { open, onClose, onConfirm } = props;
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<Modal open={open} onClose={onClose} container={getContainer()}>
|
|
21
|
+
<MessageBox
|
|
22
|
+
type="warning"
|
|
23
|
+
title={errorMessages().unknownPriceError.impactTitle}
|
|
24
|
+
description={errorMessages().unknownPriceError.description}
|
|
25
|
+
/>
|
|
26
|
+
|
|
27
|
+
<Divider size={32} />
|
|
28
|
+
<Button
|
|
29
|
+
type="primary"
|
|
30
|
+
size="large"
|
|
31
|
+
prefix={<WarningIcon />}
|
|
32
|
+
fullWidth
|
|
33
|
+
onClick={onConfirm}>
|
|
34
|
+
{errorMessages().unknownPriceError.confirmMessage}
|
|
35
|
+
</Button>
|
|
36
|
+
</Modal>
|
|
37
|
+
);
|
|
38
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { QuoteWarningsAndErrors } from './QuoteWarningsAndErrors';
|
|
@@ -31,7 +31,7 @@ export function SwapDetailsPlaceholder(props: SwapDetailsPlaceholderPropTypes) {
|
|
|
31
31
|
noPadding
|
|
32
32
|
header={{
|
|
33
33
|
title: i18n.t('Swap and Bridge'),
|
|
34
|
-
onBack: navigateBackFrom
|
|
34
|
+
onBack: () => navigateBackFrom(navigationRoutes.swapDetails),
|
|
35
35
|
suffix: <SuffixContainer />,
|
|
36
36
|
}}>
|
|
37
37
|
{showSkeleton && (
|
|
@@ -13,8 +13,7 @@ import {
|
|
|
13
13
|
CopyIcon,
|
|
14
14
|
Divider,
|
|
15
15
|
IconButton,
|
|
16
|
-
|
|
17
|
-
RouteSummary,
|
|
16
|
+
QuoteCost,
|
|
18
17
|
StepDetails,
|
|
19
18
|
Typography,
|
|
20
19
|
useCopyToClipboard,
|
|
@@ -35,18 +34,17 @@ import {
|
|
|
35
34
|
USD_VALUE_MIN_DECIMALS,
|
|
36
35
|
} from '../../constants/routing';
|
|
37
36
|
import { useNavigateBack } from '../../hooks/useNavigateBack';
|
|
38
|
-
import { useBestRouteStore } from '../../store/bestRoute';
|
|
39
37
|
import { useMetaStore } from '../../store/meta';
|
|
40
38
|
import { useNotificationStore } from '../../store/notification';
|
|
39
|
+
import { useQuoteStore } from '../../store/quote';
|
|
41
40
|
import {
|
|
42
41
|
numberToString,
|
|
43
42
|
secondsToString,
|
|
44
43
|
totalArrivalTime,
|
|
45
44
|
} from '../../utils/numbers';
|
|
46
|
-
import { getPriceImpactLevel } from '../../utils/
|
|
45
|
+
import { getPriceImpact, getPriceImpactLevel } from '../../utils/quote';
|
|
47
46
|
import {
|
|
48
47
|
getLastConvertedTokenInFailedSwap,
|
|
49
|
-
getPercentageChange,
|
|
50
48
|
getSwapMessages,
|
|
51
49
|
shouldRetrySwap,
|
|
52
50
|
} from '../../utils/swap';
|
|
@@ -54,6 +52,7 @@ import { getSwapDate } from '../../utils/time';
|
|
|
54
52
|
import { getConciseAddress, getUsdPrice } from '../../utils/wallets';
|
|
55
53
|
import { SuffixContainer } from '../HeaderButtons/HeaderButtons.styles';
|
|
56
54
|
import { Layout } from '../Layout';
|
|
55
|
+
import { QuoteSummary } from '../Quote';
|
|
57
56
|
import {
|
|
58
57
|
SwapDetailsCompleteModal,
|
|
59
58
|
SwapDetailsModal,
|
|
@@ -65,7 +64,7 @@ import { Container, HeaderDetails, StepsList } from './SwapDetails.styles';
|
|
|
65
64
|
export function SwapDetails(props: SwapDetailsProps) {
|
|
66
65
|
const { swap, requestId, onDelete, onCancel: onCancelProps } = props;
|
|
67
66
|
const { canSwitchNetworkTo, connect, getWalletInfo } = useWallets();
|
|
68
|
-
const retry =
|
|
67
|
+
const retry = useQuoteStore.use.retry();
|
|
69
68
|
const navigate = useNavigate();
|
|
70
69
|
const { navigateBackFrom } = useNavigateBack();
|
|
71
70
|
const [_, handleCopy] = useCopyToClipboard(RESET_INTERVAL);
|
|
@@ -201,7 +200,7 @@ export function SwapDetails(props: SwapDetailsProps) {
|
|
|
201
200
|
USD_VALUE_MAX_DECIMALS
|
|
202
201
|
);
|
|
203
202
|
|
|
204
|
-
const percentageChange =
|
|
203
|
+
const percentageChange = getPriceImpact(inputUsdValue, outputUsdValue);
|
|
205
204
|
|
|
206
205
|
const completeModalDesc =
|
|
207
206
|
swap.status === 'success'
|
|
@@ -239,7 +238,7 @@ export function SwapDetails(props: SwapDetailsProps) {
|
|
|
239
238
|
noPadding
|
|
240
239
|
header={{
|
|
241
240
|
title: i18n.t('Swap and Bridge'),
|
|
242
|
-
onBack: navigateBackFrom
|
|
241
|
+
onBack: () => navigateBackFrom(navigationRoutes.swapDetails),
|
|
243
242
|
onCancel:
|
|
244
243
|
swap.status === 'running' ? () => setModalState('cancel') : undefined,
|
|
245
244
|
suffix: swap.status !== 'running' && (
|
|
@@ -302,7 +301,7 @@ export function SwapDetails(props: SwapDetailsProps) {
|
|
|
302
301
|
</HeaderDetails>
|
|
303
302
|
|
|
304
303
|
<div className="output">
|
|
305
|
-
<
|
|
304
|
+
<QuoteCost
|
|
306
305
|
fee={numberToString(
|
|
307
306
|
String(totalFee),
|
|
308
307
|
GAS_FEE_MIN_DECIMALS,
|
|
@@ -311,7 +310,7 @@ export function SwapDetails(props: SwapDetailsProps) {
|
|
|
311
310
|
time={secondsToString(totalArrivalTime(swap.steps))}
|
|
312
311
|
steps={numberOfSteps}
|
|
313
312
|
/>
|
|
314
|
-
<
|
|
313
|
+
<QuoteSummary
|
|
315
314
|
from={{
|
|
316
315
|
price: {
|
|
317
316
|
value: numberToString(
|
|
@@ -349,13 +348,11 @@ export function SwapDetails(props: SwapDetailsProps) {
|
|
|
349
348
|
},
|
|
350
349
|
}}
|
|
351
350
|
percentageChange={numberToString(
|
|
352
|
-
percentageChange,
|
|
351
|
+
String(percentageChange),
|
|
353
352
|
PERCENTAGE_CHANGE_MIN_DECIMALS,
|
|
354
353
|
PERCENTAGE_CHANGE_MAX_DECIMALS
|
|
355
354
|
)}
|
|
356
|
-
warningLevel={getPriceImpactLevel(
|
|
357
|
-
percentageChange?.toNumber() ?? 0
|
|
358
|
-
)}
|
|
355
|
+
warningLevel={getPriceImpactLevel(percentageChange ?? 0)}
|
|
359
356
|
/>
|
|
360
357
|
</div>
|
|
361
358
|
<div className="title-steps">
|
|
@@ -377,7 +374,7 @@ export function SwapDetails(props: SwapDetailsProps) {
|
|
|
377
374
|
<StepDetails
|
|
378
375
|
key={key}
|
|
379
376
|
step={step}
|
|
380
|
-
type="
|
|
377
|
+
type="swap-progress"
|
|
381
378
|
ref={listRef}
|
|
382
379
|
state={state}
|
|
383
380
|
hasSeparator={index !== 0}
|
|
@@ -409,7 +406,7 @@ export function SwapDetails(props: SwapDetailsProps) {
|
|
|
409
406
|
)}
|
|
410
407
|
usdValue={outputUsdValue}
|
|
411
408
|
percentageChange={numberToString(
|
|
412
|
-
percentageChange,
|
|
409
|
+
String(percentageChange),
|
|
413
410
|
PERCENTAGE_CHANGE_MIN_DECIMALS,
|
|
414
411
|
PERCENTAGE_CHANGE_MAX_DECIMALS
|
|
415
412
|
)}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ReverseIcon, styled } from '@rango-dev/ui';
|
|
2
2
|
import React from 'react';
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import { useQuoteStore } from '../store/quote';
|
|
5
5
|
|
|
6
6
|
const SwitchButtonContainer = styled('div', {
|
|
7
7
|
position: 'absolute',
|
|
@@ -27,7 +27,7 @@ const StyledButton = styled('div', {
|
|
|
27
27
|
});
|
|
28
28
|
|
|
29
29
|
export function SwitchFromAndToButton() {
|
|
30
|
-
const switchFromAndTo =
|
|
30
|
+
const switchFromAndTo = useQuoteStore.use.switchFromAndTo();
|
|
31
31
|
|
|
32
32
|
return (
|
|
33
33
|
<SwitchButtonContainer>
|
|
@@ -10,10 +10,10 @@ import {
|
|
|
10
10
|
import { navigationRoutes } from '../constants/navigationRoutes';
|
|
11
11
|
import { SearchParams } from '../constants/searchParams';
|
|
12
12
|
import { useSyncStoresWithConfig } from '../hooks/useSyncStoresWithConfig';
|
|
13
|
-
import { useBestRouteStore } from '../store/bestRoute';
|
|
14
13
|
import { useMetaStore } from '../store/meta';
|
|
14
|
+
import { useQuoteStore } from '../store/quote';
|
|
15
15
|
import { useUiStore } from '../store/ui';
|
|
16
|
-
import { searchParamsToToken } from '../utils/
|
|
16
|
+
import { searchParamsToToken } from '../utils/quote';
|
|
17
17
|
|
|
18
18
|
type Props = { config: WidgetConfig | undefined };
|
|
19
19
|
|
|
@@ -23,16 +23,16 @@ export function UpdateUrl(props: Props) {
|
|
|
23
23
|
const location = useLocation();
|
|
24
24
|
const firstRenderSearchParams = useRef(location.search);
|
|
25
25
|
const searchParamsRef = useRef<Record<string, string>>({});
|
|
26
|
-
const fromBlockchain =
|
|
27
|
-
const toBlockchain =
|
|
28
|
-
const fromToken =
|
|
29
|
-
const toToken =
|
|
30
|
-
const setFromBlockchain =
|
|
31
|
-
const setFromToken =
|
|
32
|
-
const setToBlockchain =
|
|
33
|
-
const setToToken =
|
|
34
|
-
const inputAmount =
|
|
35
|
-
const setInputAmount =
|
|
26
|
+
const fromBlockchain = useQuoteStore.use.fromBlockchain();
|
|
27
|
+
const toBlockchain = useQuoteStore.use.toBlockchain();
|
|
28
|
+
const fromToken = useQuoteStore.use.fromToken();
|
|
29
|
+
const toToken = useQuoteStore.use.toToken();
|
|
30
|
+
const setFromBlockchain = useQuoteStore.use.setFromBlockchain();
|
|
31
|
+
const setFromToken = useQuoteStore.use.setFromToken();
|
|
32
|
+
const setToBlockchain = useQuoteStore.use.setToBlockchain();
|
|
33
|
+
const setToToken = useQuoteStore.use.setToToken();
|
|
34
|
+
const inputAmount = useQuoteStore.use.inputAmount();
|
|
35
|
+
const setInputAmount = useQuoteStore.use.setInputAmount();
|
|
36
36
|
const loadingStatus = useMetaStore.use.loadingStatus();
|
|
37
37
|
const { blockchains, tokens } = useMetaStore.use.meta();
|
|
38
38
|
const setSelectedSwap = useUiStore.use.setSelectedSwap();
|
package/src/constants/errors.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { QuoteError } from '../types';
|
|
2
2
|
|
|
3
3
|
import { i18n } from '@lingui/core';
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { QuoteErrorType } from '../types';
|
|
6
6
|
|
|
7
7
|
export const errorMessages = () => {
|
|
8
8
|
return {
|
|
@@ -13,7 +13,7 @@ export const errorMessages = () => {
|
|
|
13
13
|
'You have limited the liquidity sources and this might result in Rango finding no routes. Please consider resetting your liquidity sources'
|
|
14
14
|
),
|
|
15
15
|
},
|
|
16
|
-
|
|
16
|
+
noResultError: {
|
|
17
17
|
title: i18n.t('No Routes Found'),
|
|
18
18
|
description: i18n.t(
|
|
19
19
|
"Reasons why Rango couldn't find a route: low liquidity on token, very low input amount or no routes available for the selected input/output token combination."
|
|
@@ -31,7 +31,7 @@ export const errorMessages = () => {
|
|
|
31
31
|
),
|
|
32
32
|
confirmMessage: i18n.t('Confirm High price impact'),
|
|
33
33
|
},
|
|
34
|
-
|
|
34
|
+
quoteUpdatedWithHighValueLoss: {
|
|
35
35
|
title: i18n.t(
|
|
36
36
|
'Route updated and price impact is too high, try again later!'
|
|
37
37
|
),
|
|
@@ -47,14 +47,12 @@ export const errorMessages = () => {
|
|
|
47
47
|
};
|
|
48
48
|
};
|
|
49
49
|
|
|
50
|
-
export function
|
|
50
|
+
export function getQuoteErrorMessage(error: QuoteError) {
|
|
51
51
|
switch (error.type) {
|
|
52
|
-
case
|
|
53
|
-
return error.diagnosisMessage ?? errorMessages().
|
|
54
|
-
case
|
|
52
|
+
case QuoteErrorType.NO_RESULT:
|
|
53
|
+
return error.diagnosisMessage ?? errorMessages().noResultError.title;
|
|
54
|
+
case QuoteErrorType.REQUEST_FAILED:
|
|
55
55
|
return errorMessages().genericServerError;
|
|
56
|
-
case ConfirmSwapErrorTypes.ROUTE_UPDATED_WITH_HIGH_VALUE_LOSS:
|
|
57
|
-
return errorMessages().routeUpdatedWithHighValueLoss.title;
|
|
58
56
|
default:
|
|
59
57
|
return '';
|
|
60
58
|
}
|
|
@@ -5,6 +5,6 @@ export const swapButtonTitles = () => {
|
|
|
5
5
|
connectWallet: i18n.t('Connect Wallet'),
|
|
6
6
|
swap: i18n.t('Swap'),
|
|
7
7
|
swapAnyway: i18n.t('Swap anyway'),
|
|
8
|
-
|
|
8
|
+
ethWarning: i18n.t('The route goes through Ethereum. Continue?'),
|
|
9
9
|
};
|
|
10
10
|
};
|