@rango-dev/widget-embedded 0.1.11-next.11 → 0.1.11-next.14

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.
Files changed (40) hide show
  1. package/dist/components/ConfirmSwapErrors.d.ts +1 -1
  2. package/dist/components/ConfirmSwapErrors.d.ts.map +1 -1
  3. package/dist/components/ConfirmSwapWarnings.d.ts +1 -2
  4. package/dist/components/ConfirmSwapWarnings.d.ts.map +1 -1
  5. package/dist/components/warnings/BalanceErrors.d.ts +7 -0
  6. package/dist/components/warnings/BalanceErrors.d.ts.map +1 -0
  7. package/dist/pages/ConfirmSwapPage.d.ts.map +1 -1
  8. package/dist/pages/Home.d.ts.map +1 -1
  9. package/dist/pages/SwapDetailsPage.d.ts.map +1 -1
  10. package/dist/store/bestRoute.d.ts.map +1 -1
  11. package/dist/types/routing.d.ts +8 -8
  12. package/dist/types/routing.d.ts.map +1 -1
  13. package/dist/utils/numbers.d.ts +1 -0
  14. package/dist/utils/numbers.d.ts.map +1 -1
  15. package/dist/utils/routing.d.ts +4 -4
  16. package/dist/utils/routing.d.ts.map +1 -1
  17. package/dist/utils/time.d.ts.map +1 -1
  18. package/dist/widget-embedded.cjs.development.js +283 -261
  19. package/dist/widget-embedded.cjs.development.js.map +1 -1
  20. package/dist/widget-embedded.cjs.production.min.js +283 -261
  21. package/dist/widget-embedded.cjs.production.min.js.map +1 -1
  22. package/dist/widget-embedded.esm.js +283 -261
  23. package/dist/widget-embedded.esm.js.map +1 -1
  24. package/package.json +2 -2
  25. package/src/components/ConfirmSwapErrors.tsx +8 -16
  26. package/src/components/ConfirmSwapWarnings.tsx +5 -15
  27. package/src/components/warnings/BalanceErrors.tsx +45 -0
  28. package/src/hooks/useConfirmSwap.ts +2 -2
  29. package/src/pages/ConfirmSwapPage.tsx +3 -1
  30. package/src/pages/Home.tsx +6 -8
  31. package/src/pages/SwapDetailsPage.tsx +7 -13
  32. package/src/pages/WalletsPage.tsx +1 -1
  33. package/src/store/bestRoute.ts +5 -3
  34. package/src/types/routing.ts +4 -4
  35. package/src/utils/numbers.ts +4 -0
  36. package/src/utils/routing.ts +31 -11
  37. package/src/utils/time.ts +2 -8
  38. package/dist/components/warnings/BalanceWarnings.d.ts +0 -7
  39. package/dist/components/warnings/BalanceWarnings.d.ts.map +0 -1
  40. package/src/components/warnings/BalanceWarnings.tsx +0 -40
@@ -6,10 +6,10 @@ import { isCosmosBlockchain, isEvmBlockchain } from 'rango-types';
6
6
  import { useSearchParams, useLocation, createSearchParams, useNavigate, useInRouterContext, useRoutes } from 'react-router-dom';
7
7
  import { create } from 'zustand';
8
8
  import BigNumber, { BigNumber as BigNumber$1 } from 'bignumber.js';
9
- import { Network, isEvmAddress, KEPLR_COMPATIBLE_WALLETS, detectInstallLink, WalletType, getCosmosExperimentalChainInfo, detectMobileScreens, convertEvmBlockchainMetaToEvmChainInfo } from '@rango-dev/wallets-shared';
10
- import { readAccountAddress, useWallets, Provider as Provider$1, Events } from '@rango-dev/wallets-core';
11
9
  import { persist, subscribeWithSelector } from 'zustand/middleware';
12
10
  import { RangoClient, isEvmBlockchain as isEvmBlockchain$1 } from 'rango-sdk';
11
+ import { Network, isEvmAddress, KEPLR_COMPATIBLE_WALLETS, detectInstallLink, WalletType, getCosmosExperimentalChainInfo, detectMobileScreens, convertEvmBlockchainMetaToEvmChainInfo } from '@rango-dev/wallets-shared';
12
+ import { readAccountAddress, useWallets, Provider as Provider$1, Events } from '@rango-dev/wallets-core';
13
13
  import { shallow } from 'zustand/shallow';
14
14
  import { useTranslation, initReactI18next } from 'react-i18next';
15
15
  import { styled as styled$1 } from '@rango-dev/ui/src/theme';
@@ -117,6 +117,196 @@ const decimalNumber = function (number, toFixed) {
117
117
  }
118
118
  return parseFloat(number).toFixed(toFixed);
119
119
  };
120
+ const isPositiveNumber = text => !!text && parseFloat(text) > 0;
121
+
122
+ function searchParamsToToken(tokens, searchParams, chain) {
123
+ if (!chain) return null;
124
+ return tokens.find(token => {
125
+ const symbolAndAddress = searchParams?.split('--');
126
+ if (symbolAndAddress?.length === 1) return token.symbol === symbolAndAddress[0] && token.address === null && token.blockchain === chain.name;
127
+ return token.symbol === symbolAndAddress?.[0] && token.address === symbolAndAddress?.[1] && token.blockchain === chain.name;
128
+ }) || null;
129
+ }
130
+ function getBestRouteToTokenUsdPrice(bestRoute) {
131
+ return bestRoute?.result?.swaps[bestRoute?.result?.swaps.length - 1].to.usdPrice;
132
+ }
133
+ function isNumberOfSwapsChanged(route1, route2) {
134
+ const route1Swaps = route1.result?.swaps || [];
135
+ const route2Swaps = route2.result?.swaps || [];
136
+ return route1Swaps.length !== route2Swaps.length;
137
+ }
138
+ function isRouteSwappersUpdated(route1, route2) {
139
+ const route1Swappers = route1.result?.swaps.map(swap => swap.swapperId) || [];
140
+ const route2Swappers = route2.result?.swaps.map(swap => swap.swapperId) || [];
141
+ return !areEqual(route1Swappers, route2Swappers);
142
+ }
143
+ function isRouteInternalCoinsUpdated(route1, route2) {
144
+ const route1InternalCoins = route1.result?.swaps.map(swap => swap.to.symbol) || [];
145
+ const route2InternalCoins = route2.result?.swaps.map(swap => swap.to.symbol) || [];
146
+ return !areEqual(route1InternalCoins, route2InternalCoins);
147
+ }
148
+ function isRouteChanged(route1, route2) {
149
+ return isNumberOfSwapsChanged(route1, route2) || isRouteSwappersUpdated(route1, route2) || isRouteInternalCoinsUpdated(route1, route2);
150
+ }
151
+ function getRequiredBalanceOfWallet(selectedWallet, fee) {
152
+ if (fee === null) return null;
153
+ const relatedFeeStatus = fee?.find(item => item.blockchain === selectedWallet.chain)?.wallets.find(wallet => wallet.address?.toLowerCase() === selectedWallet.address.toLowerCase());
154
+ if (!relatedFeeStatus) return null;
155
+ return relatedFeeStatus.requiredAssets;
156
+ }
157
+ function isRouteParametersChanged(params) {
158
+ if (params.store === 'bestRoute') {
159
+ const {
160
+ prevState,
161
+ currentState
162
+ } = params;
163
+ return !!currentState.fromToken && !!currentState.toToken && (prevState.fromChain?.name !== currentState.fromChain?.name || prevState.toChain?.name !== currentState.toChain?.name || prevState.fromToken?.symbol !== currentState.fromToken?.symbol || prevState.toToken?.symbol !== currentState.toToken?.symbol || prevState.fromToken?.blockchain !== prevState.fromToken?.blockchain || prevState.toToken?.blockchain !== currentState.toToken?.blockchain || prevState.fromToken?.address !== currentState.fromToken?.address || prevState.toToken?.address !== currentState.toToken?.address || prevState.inputAmount !== currentState.inputAmount);
164
+ } else if (params.store === 'settings') {
165
+ const {
166
+ prevState,
167
+ currentState
168
+ } = params;
169
+ return prevState.slippage !== currentState.slippage || prevState.customSlippage !== currentState.customSlippage || prevState.disabledLiquiditySources?.length !== currentState.disabledLiquiditySources?.length || prevState.infiniteApprove || currentState.infiniteApprove;
170
+ }
171
+ return false;
172
+ }
173
+ function getFormatedBestRoute(bestRoute) {
174
+ if (!bestRoute) return null;
175
+ const formatedSwaps = (bestRoute.result?.swaps || []).map(swap => ({
176
+ ...swap,
177
+ fromAmount: numberToString(swap.fromAmount, 6, 6),
178
+ toAmount: numberToString(swap.toAmount, 6, 6)
179
+ }));
180
+ return {
181
+ ...bestRoute,
182
+ ...(bestRoute.result && {
183
+ result: {
184
+ ...bestRoute.result,
185
+ swaps: formatedSwaps
186
+ }
187
+ })
188
+ };
189
+ }
190
+ function getFormatedPendingSwap(pendingSwap) {
191
+ const formatedSteps = pendingSwap.steps.map(step => ({
192
+ ...step,
193
+ feeInUsd: numberToString(step.feeInUsd, 4, 4),
194
+ outputAmount: numberToString(step.outputAmount, 6, 6),
195
+ expectedOutputAmountHumanReadable: numberToString(step.expectedOutputAmountHumanReadable, 6, 6)
196
+ }));
197
+ return {
198
+ ...pendingSwap,
199
+ inputAmount: numberToString(pendingSwap.inputAmount, 6, 6),
200
+ steps: formatedSteps
201
+ };
202
+ }
203
+ //todo: refactor bestRoute store and add loadingStatus
204
+ const getBestRouteStatus = (loading, error) => {
205
+ if (loading) return 'loading';
206
+ if (error) return 'failed';else return 'success';
207
+ };
208
+
209
+ const createSelectors = _store => {
210
+ let store = _store;
211
+ store.use = {};
212
+ for (let k of Object.keys(store.getState())) {
213
+ store.use[k] = () => store(s => s[k]);
214
+ }
215
+ return store;
216
+ };
217
+
218
+ const RANGO_PUBLIC_API_KEY = 'c6381a79-2817-4602-83bf-6a641a409e32';
219
+ let configs = {
220
+ API_KEY: RANGO_PUBLIC_API_KEY
221
+ };
222
+ function getConfig(name) {
223
+ return configs[name];
224
+ }
225
+
226
+ let rango = undefined;
227
+ const httpService = () => {
228
+ if (rango) return rango;
229
+ rango = new RangoClient(getConfig('API_KEY'));
230
+ return rango;
231
+ };
232
+
233
+ const SLIPPAGES = [0.5, 1, 3, 5, 8, 13, 20];
234
+ const DEFAULT_SLIPPAGE = 1;
235
+ const HIGH_SLIPPAGE = 5;
236
+ const MAX_SLIPPAGE = 100;
237
+ const MIN_SLIPPGAE = 0;
238
+
239
+ const useMetaStore = /*#__PURE__*/createSelectors( /*#__PURE__*/create()(set => ({
240
+ meta: {
241
+ blockchains: [],
242
+ popularTokens: [],
243
+ swappers: [],
244
+ tokens: []
245
+ },
246
+ loadingStatus: 'loading',
247
+ fetchMeta: async () => {
248
+ try {
249
+ const response = await httpService().getAllMetadata();
250
+ const chainThatHasTokenInMetaResponse = removeDuplicateFrom(response.tokens.map(t => t.blockchain));
251
+ const enabledChains = response.blockchains.filter(chain => chain.enabled && chainThatHasTokenInMetaResponse.includes(chain.name));
252
+ response.blockchains = enabledChains.sort((a, b) => a.sort - b.sort);
253
+ set({
254
+ meta: response,
255
+ loadingStatus: 'success'
256
+ });
257
+ } catch (error) {
258
+ set({
259
+ loadingStatus: 'failed'
260
+ });
261
+ }
262
+ }
263
+ })));
264
+
265
+ const useSettingsStore = /*#__PURE__*/createSelectors( /*#__PURE__*/create()( /*#__PURE__*/persist( /*#__PURE__*/subscribeWithSelector(set => ({
266
+ slippage: DEFAULT_SLIPPAGE,
267
+ customSlippage: null,
268
+ infiniteApprove: false,
269
+ affiliateRef: null,
270
+ disabledLiquiditySources: [],
271
+ theme: 'auto',
272
+ setSlippage: slippage => set(() => ({
273
+ slippage: slippage
274
+ })),
275
+ setCustomSlippage: customSlippage => set(() => ({
276
+ customSlippage: customSlippage
277
+ })),
278
+ setAffiliateRef: affiliateRef => set(() => ({
279
+ affiliateRef
280
+ })),
281
+ toggleAllLiquiditySources: () => set(state => {
282
+ const {
283
+ swappers
284
+ } = useMetaStore.getState().meta;
285
+ const swappersGroup = removeDuplicateFrom(swappers.map(swapper => swapper.swapperGroup));
286
+ if (swappersGroup.length === state.disabledLiquiditySources.length) return {
287
+ disabledLiquiditySources: []
288
+ };else {
289
+ return {
290
+ disabledLiquiditySources: swappersGroup
291
+ };
292
+ }
293
+ }),
294
+ toggleInfiniteApprove: () => set(state => ({
295
+ infiniteApprove: !state.infiniteApprove
296
+ })),
297
+ toggleLiquiditySource: name => set(state => {
298
+ if (state.disabledLiquiditySources.includes(name)) return {
299
+ disabledLiquiditySources: state.disabledLiquiditySources.filter(liquiditySource => liquiditySource != name)
300
+ };else return {
301
+ disabledLiquiditySources: state.disabledLiquiditySources.concat(name)
302
+ };
303
+ }),
304
+ setTheme: theme => set(() => ({
305
+ theme
306
+ }))
307
+ })), {
308
+ name: 'user-settings'
309
+ })));
120
310
 
121
311
  function getStateWallet(state) {
122
312
  switch (true) {
@@ -637,165 +827,6 @@ function shouldRetrySwap(pendingSwap) {
637
827
  return pendingSwap.status === 'failed' && !!pendingSwap.finishTime && new Date().getTime() - parseInt(pendingSwap.finishTime) < 4 * 3600 * 1000;
638
828
  }
639
829
 
640
- function searchParamsToToken(tokens, searchParams, chain) {
641
- if (!chain) return null;
642
- return tokens.find(token => {
643
- const symbolAndAddress = searchParams?.split('--');
644
- if (symbolAndAddress?.length === 1) return token.symbol === symbolAndAddress[0] && token.address === null && token.blockchain === chain.name;
645
- return token.symbol === symbolAndAddress?.[0] && token.address === symbolAndAddress?.[1] && token.blockchain === chain.name;
646
- }) || null;
647
- }
648
- function getBestRouteToTokenUsdPrice(bestRoute) {
649
- return bestRoute?.result?.swaps[bestRoute?.result?.swaps.length - 1].to.usdPrice;
650
- }
651
- function isNumberOfSwapsChanged(route1, route2) {
652
- const route1Swaps = route1.result?.swaps || [];
653
- const route2Swaps = route2.result?.swaps || [];
654
- return route1Swaps.length !== route2Swaps.length;
655
- }
656
- function isRouteSwappersUpdated(route1, route2) {
657
- const route1Swappers = route1.result?.swaps.map(swap => swap.swapperId) || [];
658
- const route2Swappers = route2.result?.swaps.map(swap => swap.swapperId) || [];
659
- return !areEqual(route1Swappers, route2Swappers);
660
- }
661
- function isRouteInternalCoinsUpdated(route1, route2) {
662
- const route1InternalCoins = route1.result?.swaps.map(swap => swap.to.symbol) || [];
663
- const route2InternalCoins = route2.result?.swaps.map(swap => swap.to.symbol) || [];
664
- return !areEqual(route1InternalCoins, route2InternalCoins);
665
- }
666
- function isRouteChanged(route1, route2) {
667
- return isNumberOfSwapsChanged(route1, route2) || isRouteSwappersUpdated(route1, route2) || isRouteInternalCoinsUpdated(route1, route2);
668
- }
669
- function getRequiredBalanceOfWallet(selectedWallet, fee) {
670
- if (fee === null) return null;
671
- const relatedFeeStatus = fee?.find(item => item.blockchain === selectedWallet.chain)?.wallets.find(wallet => wallet.address?.toLowerCase() === selectedWallet.address.toLowerCase());
672
- if (!relatedFeeStatus) return null;
673
- return relatedFeeStatus.requiredAssets;
674
- }
675
- function isRouteParametersChanged(params) {
676
- if (params.store === 'bestRoute') {
677
- const {
678
- prevState,
679
- currentState
680
- } = params;
681
- return !!currentState.fromToken && !!currentState.toToken && (prevState.fromChain?.name !== currentState.fromChain?.name || prevState.toChain?.name !== currentState.toChain?.name || prevState.fromToken?.symbol !== currentState.fromToken?.symbol || prevState.toToken?.symbol !== currentState.toToken?.symbol || prevState.fromToken?.blockchain !== prevState.fromToken?.blockchain || prevState.toToken?.blockchain !== currentState.toToken?.blockchain || prevState.fromToken?.address !== currentState.fromToken?.address || prevState.toToken?.address !== currentState.toToken?.address || prevState.inputAmount !== currentState.inputAmount);
682
- } else if (params.store === 'settings') {
683
- const {
684
- prevState,
685
- currentState
686
- } = params;
687
- return prevState.slippage !== currentState.slippage || prevState.customSlippage !== currentState.customSlippage || prevState.disabledLiquiditySources?.length !== currentState.disabledLiquiditySources?.length || prevState.infiniteApprove || currentState.infiniteApprove;
688
- }
689
- return false;
690
- }
691
- //todo: refactor bestRoute store and add loadingStatus
692
- const getBestRouteStatus = (loading, error) => {
693
- if (loading) return 'loading';
694
- if (error) return 'failed';else return 'success';
695
- };
696
-
697
- const createSelectors = _store => {
698
- let store = _store;
699
- store.use = {};
700
- for (let k of Object.keys(store.getState())) {
701
- store.use[k] = () => store(s => s[k]);
702
- }
703
- return store;
704
- };
705
-
706
- const RANGO_PUBLIC_API_KEY = 'c6381a79-2817-4602-83bf-6a641a409e32';
707
- let configs = {
708
- API_KEY: RANGO_PUBLIC_API_KEY
709
- };
710
- function getConfig(name) {
711
- return configs[name];
712
- }
713
-
714
- let rango = undefined;
715
- const httpService = () => {
716
- if (rango) return rango;
717
- rango = new RangoClient(getConfig('API_KEY'));
718
- return rango;
719
- };
720
-
721
- const SLIPPAGES = [0.5, 1, 3, 5, 8, 13, 20];
722
- const DEFAULT_SLIPPAGE = 1;
723
- const HIGH_SLIPPAGE = 5;
724
- const MAX_SLIPPAGE = 100;
725
- const MIN_SLIPPGAE = 0;
726
-
727
- const useMetaStore = /*#__PURE__*/createSelectors( /*#__PURE__*/create()(set => ({
728
- meta: {
729
- blockchains: [],
730
- popularTokens: [],
731
- swappers: [],
732
- tokens: []
733
- },
734
- loadingStatus: 'loading',
735
- fetchMeta: async () => {
736
- try {
737
- const response = await httpService().getAllMetadata();
738
- const chainThatHasTokenInMetaResponse = removeDuplicateFrom(response.tokens.map(t => t.blockchain));
739
- const enabledChains = response.blockchains.filter(chain => chain.enabled && chainThatHasTokenInMetaResponse.includes(chain.name));
740
- response.blockchains = enabledChains.sort((a, b) => a.sort - b.sort);
741
- set({
742
- meta: response,
743
- loadingStatus: 'success'
744
- });
745
- } catch (error) {
746
- set({
747
- loadingStatus: 'failed'
748
- });
749
- }
750
- }
751
- })));
752
-
753
- const useSettingsStore = /*#__PURE__*/createSelectors( /*#__PURE__*/create()( /*#__PURE__*/persist( /*#__PURE__*/subscribeWithSelector(set => ({
754
- slippage: DEFAULT_SLIPPAGE,
755
- customSlippage: null,
756
- infiniteApprove: false,
757
- affiliateRef: null,
758
- disabledLiquiditySources: [],
759
- theme: 'auto',
760
- setSlippage: slippage => set(() => ({
761
- slippage: slippage
762
- })),
763
- setCustomSlippage: customSlippage => set(() => ({
764
- customSlippage: customSlippage
765
- })),
766
- setAffiliateRef: affiliateRef => set(() => ({
767
- affiliateRef
768
- })),
769
- toggleAllLiquiditySources: () => set(state => {
770
- const {
771
- swappers
772
- } = useMetaStore.getState().meta;
773
- const swappersGroup = removeDuplicateFrom(swappers.map(swapper => swapper.swapperGroup));
774
- if (swappersGroup.length === state.disabledLiquiditySources.length) return {
775
- disabledLiquiditySources: []
776
- };else {
777
- return {
778
- disabledLiquiditySources: swappersGroup
779
- };
780
- }
781
- }),
782
- toggleInfiniteApprove: () => set(state => ({
783
- infiniteApprove: !state.infiniteApprove
784
- })),
785
- toggleLiquiditySource: name => set(state => {
786
- if (state.disabledLiquiditySources.includes(name)) return {
787
- disabledLiquiditySources: state.disabledLiquiditySources.filter(liquiditySource => liquiditySource != name)
788
- };else return {
789
- disabledLiquiditySources: state.disabledLiquiditySources.concat(name)
790
- };
791
- }),
792
- setTheme: theme => set(() => ({
793
- theme
794
- }))
795
- })), {
796
- name: 'user-settings'
797
- })));
798
-
799
830
  const useWalletsStore = /*#__PURE__*/createSelectors( /*#__PURE__*/create()( /*#__PURE__*/subscribeWithSelector(set => ({
800
831
  accounts: [],
801
832
  balances: [],
@@ -912,7 +943,7 @@ const useBestRouteStore = /*#__PURE__*/createSelectors( /*#__PURE__*/create()( /
912
943
  setBestRoute: bestRoute => set(state => {
913
944
  let outputAmount = null;
914
945
  let outputUsdValue = ZERO;
915
- if (!state.inputAmount || state.inputAmount === '0') return {};
946
+ if (!isPositiveNumber(state.inputAmount)) return {};
916
947
  if (!!bestRoute) {
917
948
  outputAmount = !!bestRoute.result?.outputAmount ? new BigNumber(bestRoute.result?.outputAmount) : null;
918
949
  outputUsdValue = calcOutputUsdValue(bestRoute.result?.outputAmount, getBestRouteToTokenUsdPrice(bestRoute) || state.toToken?.usdPrice);
@@ -1047,7 +1078,7 @@ const bestRoute = (bestRouteStore, settingsStore) => {
1047
1078
  disabledLiquiditySources,
1048
1079
  affiliateRef
1049
1080
  } = settingsStore.getState();
1050
- if (!fromToken || !toToken || !inputAmount || inputAmount === '0') return;
1081
+ if (!fromToken || !toToken || !isPositiveNumber(inputAmount)) return;
1051
1082
  abortController?.abort();
1052
1083
  abortController = new AbortController();
1053
1084
  const userSlippage = !!customSlippage ? customSlippage : slippage;
@@ -1085,7 +1116,7 @@ const bestRoute = (bestRouteStore, settingsStore) => {
1085
1116
  inputAmount,
1086
1117
  inputUsdValue
1087
1118
  } = useBestRouteStore.getState();
1088
- if (!inputAmount || inputAmount === '0' || inputUsdValue.eq(0)) return bestRouteStore.setState({
1119
+ if (!isPositiveNumber(inputAmount) || inputUsdValue.eq(0)) return bestRouteStore.setState({
1089
1120
  loading: false
1090
1121
  });
1091
1122
  if (tokensAreEqual(fromToken, toToken)) return bestRouteStore.setState({
@@ -1730,7 +1761,7 @@ function Home() {
1730
1761
  }), showBestRoute && React.createElement(BestRouteContainer, null, React.createElement(BestRoute, {
1731
1762
  error: bestRouteError,
1732
1763
  loading: fetchingBestRoute,
1733
- data: bestRoute,
1764
+ data: getFormatedBestRoute(bestRoute),
1734
1765
  totalFee: numberToString(totalFeeInUsd, 0, 2),
1735
1766
  feeWarning: highFee,
1736
1767
  totalTime: secondsToString(totalArrivalTime(bestRoute))
@@ -1740,11 +1771,9 @@ function Home() {
1740
1771
  type: "error",
1741
1772
  title: `${swap?.swapperId} Limit`
1742
1773
  }, React.createElement(React.Fragment, null, React.createElement(Typography, {
1743
- variant: "body2"
1744
- }, fromAmountRangeError), React.createElement("br", null), React.createElement(Typography, {
1745
- variant: "body2"
1746
- }, "Yours: ", numberToString(swap?.fromAmount || null), swap?.from.symbol), React.createElement("br", null), React.createElement(Typography, {
1747
- variant: "body2"
1774
+ variant: "body3"
1775
+ }, fromAmountRangeError, ", Yours: ", numberToString(swap?.fromAmount || null), "\u00A0", swap?.from.symbol), React.createElement(Typography, {
1776
+ variant: "body3"
1748
1777
  }, recommendation)))), React.createElement(Footer, null, React.createElement(Button, {
1749
1778
  type: "primary",
1750
1779
  align: "grow",
@@ -1998,6 +2027,7 @@ var ConfirmSwapErrorTypes;
1998
2027
  ConfirmSwapErrorTypes[ConfirmSwapErrorTypes["ROUTE_UPDATED_WITH_HIGH_VALUE_LOSS"] = 1] = "ROUTE_UPDATED_WITH_HIGH_VALUE_LOSS";
1999
2028
  ConfirmSwapErrorTypes[ConfirmSwapErrorTypes["REQUEST_FAILED"] = 2] = "REQUEST_FAILED";
2000
2029
  ConfirmSwapErrorTypes[ConfirmSwapErrorTypes["INSUFFICIENT_SLIPPAGE"] = 3] = "INSUFFICIENT_SLIPPAGE";
2030
+ ConfirmSwapErrorTypes[ConfirmSwapErrorTypes["INSUFFICIENT_BALANCE"] = 4] = "INSUFFICIENT_BALANCE";
2001
2031
  })(ConfirmSwapErrorTypes || (ConfirmSwapErrorTypes = {}));
2002
2032
  var ConfirmSwapWarningTypes;
2003
2033
  (function (ConfirmSwapWarningTypes) {
@@ -2005,7 +2035,6 @@ var ConfirmSwapWarningTypes;
2005
2035
  ConfirmSwapWarningTypes[ConfirmSwapWarningTypes["ROUTE_SWAPPERS_UPDATED"] = 1] = "ROUTE_SWAPPERS_UPDATED";
2006
2036
  ConfirmSwapWarningTypes[ConfirmSwapWarningTypes["ROUTE_COINS_UPDATED"] = 2] = "ROUTE_COINS_UPDATED";
2007
2037
  ConfirmSwapWarningTypes[ConfirmSwapWarningTypes["ROUTE_AND_OUTPUT_AMOUNT_UPDATED"] = 3] = "ROUTE_AND_OUTPUT_AMOUNT_UPDATED";
2008
- ConfirmSwapWarningTypes[ConfirmSwapWarningTypes["INSUFFICIENT_BALANCE"] = 4] = "INSUFFICIENT_BALANCE";
2009
2038
  })(ConfirmSwapWarningTypes || (ConfirmSwapWarningTypes = {}));
2010
2039
 
2011
2040
  function useConfirmSwap() {
@@ -2094,8 +2123,8 @@ function useConfirmSwap() {
2094
2123
  }
2095
2124
  const balanceWarnings = getBalanceWarnings(confiremedRoute, selectedWallets);
2096
2125
  const enoughBalance = balanceWarnings.length === 0;
2097
- if (!enoughBalance) confirmSwapState.warnings.push({
2098
- type: ConfirmSwapWarningTypes.INSUFFICIENT_BALANCE,
2126
+ if (!enoughBalance) confirmSwapState.errors.push({
2127
+ type: ConfirmSwapErrorTypes.INSUFFICIENT_BALANCE,
2099
2128
  messages: balanceWarnings
2100
2129
  });
2101
2130
  const minRequiredSlippage = getMinRequiredSlippage(initialRoute);
@@ -2165,31 +2194,6 @@ function MinRequiredSlippage(_ref) {
2165
2194
  }), React.createElement(ChangeSlippageButton, null));
2166
2195
  }
2167
2196
 
2168
- function ConfirmSwapErrors(errors) {
2169
- return errors.flatMap(error => {
2170
- switch (error.type) {
2171
- case ConfirmSwapErrorTypes.NO_ROUTE:
2172
- return React.createElement(Typography, {
2173
- variant: "body2"
2174
- }, "No routes found. Please try again later.");
2175
- case ConfirmSwapErrorTypes.REQUEST_FAILED:
2176
- return React.createElement(Typography, {
2177
- variant: "body2"
2178
- }, `Failed to confirm swap ${error.status ? `'status': ${error.status})` : ''}, please try again.`);
2179
- case ConfirmSwapErrorTypes.ROUTE_UPDATED_WITH_HIGH_VALUE_LOSS:
2180
- return React.createElement(Typography, {
2181
- variant: "body2"
2182
- }, "Route updated and price impact is too high, try again later!");
2183
- case ConfirmSwapErrorTypes.INSUFFICIENT_SLIPPAGE:
2184
- return React.createElement(MinRequiredSlippage, {
2185
- minRequiredSlippage: error.minRequiredSlippage
2186
- });
2187
- default:
2188
- return [];
2189
- }
2190
- });
2191
- }
2192
-
2193
2197
  const List = /*#__PURE__*/styled('ul', {
2194
2198
  variants: {
2195
2199
  showListStyle: {
@@ -2210,47 +2214,63 @@ const ListItem = /*#__PURE__*/styled('li', {
2210
2214
  }
2211
2215
  });
2212
2216
  const Message = /*#__PURE__*/styled(Typography, {
2213
- display: 'block',
2214
- color: '$warning500 !important'
2217
+ display: 'block'
2215
2218
  });
2216
- function BalanceWarnings(_ref) {
2219
+ function BalanceErrors(_ref) {
2217
2220
  let {
2218
2221
  messages
2219
2222
  } = _ref;
2220
2223
  const showListStyle = messages.length > 1;
2221
- return React.createElement(List, {
2224
+ return React.createElement(React.Fragment, null, React.createElement(Typography, {
2225
+ className: "title",
2226
+ variant: "title",
2227
+ color: 'error'
2228
+ }, "Insufficent Balance:"), React.createElement(Spacer, {
2229
+ size: 8,
2230
+ direction: "vertical"
2231
+ }), React.createElement(List, {
2222
2232
  showListStyle: showListStyle
2223
2233
  }, messages.map(warning => React.createElement(ListItem, {
2224
2234
  showListStyle: showListStyle
2225
2235
  }, React.createElement(Message, {
2226
- variant: "body2"
2227
- }, warning))));
2236
+ variant: "body3"
2237
+ }, "- ", warning)))));
2238
+ }
2239
+
2240
+ function ConfirmSwapErrors(errors) {
2241
+ return errors.flatMap(error => {
2242
+ switch (error.type) {
2243
+ case ConfirmSwapErrorTypes.NO_ROUTE:
2244
+ return "No routes found. Please try again later.";
2245
+ case ConfirmSwapErrorTypes.REQUEST_FAILED:
2246
+ return `Failed to confirm swap ${error.status ? `'status': ${error.status})` : ''}, please try again.`;
2247
+ case ConfirmSwapErrorTypes.ROUTE_UPDATED_WITH_HIGH_VALUE_LOSS:
2248
+ return "Route updated and price impact is too high, try again later!";
2249
+ case ConfirmSwapErrorTypes.INSUFFICIENT_SLIPPAGE:
2250
+ return React.createElement(MinRequiredSlippage, {
2251
+ minRequiredSlippage: error.minRequiredSlippage
2252
+ });
2253
+ case ConfirmSwapErrorTypes.INSUFFICIENT_BALANCE:
2254
+ return React.createElement(BalanceErrors, {
2255
+ messages: error.messages
2256
+ });
2257
+ default:
2258
+ return [];
2259
+ }
2260
+ });
2228
2261
  }
2229
2262
 
2230
2263
  function ConfirmSwapWarnings(warnings) {
2231
2264
  return warnings.flatMap(warning => {
2232
2265
  switch (warning.type) {
2233
2266
  case ConfirmSwapWarningTypes.ROUTE_UPDATED:
2234
- return React.createElement(Typography, {
2235
- variant: "body2"
2236
- }, "Route has been updated.");
2267
+ return "Route has been updated.";
2237
2268
  case ConfirmSwapWarningTypes.ROUTE_AND_OUTPUT_AMOUNT_UPDATED:
2238
- return React.createElement(Typography, {
2239
- variant: "body2"
2240
- }, `Output amount changed to ${warning.newOutputAmount}
2241
- (${warning.percentageChange}% change).`);
2269
+ return `Output amount changed to ${warning.newOutputAmount} (${warning.percentageChange}% change).`;
2242
2270
  case ConfirmSwapWarningTypes.ROUTE_SWAPPERS_UPDATED:
2243
- return React.createElement(Typography, {
2244
- variant: "body2"
2245
- }, "Route swappers has been updated.");
2271
+ return "Route swappers has been updated.";
2246
2272
  case ConfirmSwapWarningTypes.ROUTE_COINS_UPDATED:
2247
- return React.createElement(Typography, {
2248
- variant: "body2"
2249
- }, "Route internal coins has been updated.");
2250
- case ConfirmSwapWarningTypes.INSUFFICIENT_BALANCE:
2251
- return React.createElement(BalanceWarnings, {
2252
- messages: warning.messages
2253
- });
2273
+ return "Route internal coins has been updated.";
2254
2274
  default:
2255
2275
  return [];
2256
2276
  }
@@ -2345,7 +2365,9 @@ function ConfirmSwapPage() {
2345
2365
  navigate(navigationRoutes.swaps + `/${swap.requestId}`, {
2346
2366
  replace: true
2347
2367
  });
2348
- setInputAmount('');
2368
+ setTimeout(() => {
2369
+ setInputAmount('');
2370
+ }, 0);
2349
2371
  }
2350
2372
  });
2351
2373
  },
@@ -2696,8 +2718,9 @@ function WalletsPage(_ref) {
2696
2718
  textField: false,
2697
2719
  onBack: navigateBackFrom.bind(null, navigationRoutes.wallets)
2698
2720
  }, React.createElement(React.Fragment, null, walletErrorMessage && React.createElement(AlertContainer, null, React.createElement(Alert, {
2699
- type: "error"
2700
- }, walletErrorMessage)), loadingMetaStatus === 'loading' && React.createElement(LoaderContainer, {
2721
+ type: "error",
2722
+ title: walletErrorMessage
2723
+ })), loadingMetaStatus === 'loading' && React.createElement(LoaderContainer, {
2701
2724
  className: "loader"
2702
2725
  }, React.createElement(Spinner, {
2703
2726
  size: 24
@@ -2761,7 +2784,7 @@ function timeSince(timeMillis) {
2761
2784
  return interval + ' ' + intervalType;
2762
2785
  }
2763
2786
  function getSwapDate(pendingSwap) {
2764
- return pendingSwap.finishTime ? `Finished ${timeSince(parseInt(pendingSwap.finishTime))} ago @ ${new Date(parseInt(pendingSwap.finishTime)).toLocaleString()}` : `Started ${timeSince(parseInt(pendingSwap.creationTime))} ago @ ${new Date(parseInt(pendingSwap.creationTime)).toLocaleString()}`;
2787
+ return pendingSwap.finishTime ? `${timeSince(parseInt(pendingSwap.finishTime))} ago` : `${timeSince(parseInt(pendingSwap.creationTime))} ago`;
2765
2788
  }
2766
2789
 
2767
2790
  const PlaceholderContainer = /*#__PURE__*/styled('div', {
@@ -2823,10 +2846,6 @@ function SwapDetailsPage() {
2823
2846
  loading: loading,
2824
2847
  onBack: navigateBackFrom.bind(null, navigationRoutes.swapDetails)
2825
2848
  });
2826
- const firstStep = swap.steps[0];
2827
- const lastStep = swap.steps[swap.steps.length - 1];
2828
- const fromAmount = numberToString(swap.inputAmount);
2829
- const toAmount = numberToString(swap.simulationResult.outputAmount);
2830
2849
  const currentStep = getCurrentStep(swap);
2831
2850
  const currentStepBlockchain = currentStep ? getCurrentBlockchainOfOrNull(swap, currentStep) : null;
2832
2851
  const currentStepWallet = currentStep ? getRelatedWalletOrNull(swap, currentStep) : null;
@@ -2839,38 +2858,41 @@ function SwapDetailsPage() {
2839
2858
  const lastConvertedTokenInFailedSwap = getLastConvertedTokenInFailedSwap(swap);
2840
2859
  return React.createElement(SwapHistory, Object.assign({
2841
2860
  onBack: navigateBackFrom.bind(null, navigationRoutes.swapDetails),
2842
- previewInputs: React.createElement(React.Fragment, null, React.createElement(TokenPreview, {
2843
- chain: {
2844
- displayName: firstStep?.fromBlockchain || '',
2845
- // @ts-ignore
2846
- logo: firstStep?.fromBlockchainLogo || ''
2847
- },
2848
- token: {
2849
- symbol: firstStep?.fromSymbol || '',
2850
- image: firstStep?.fromLogo || ''
2851
- },
2852
- amount: fromAmount,
2853
- label: t('From'),
2854
- loadingStatus: 'success'
2855
- }), React.createElement(Spacer, {
2856
- size: 12,
2857
- direction: "vertical"
2858
- }), React.createElement(TokenPreview, {
2859
- chain: {
2860
- displayName: lastStep?.toBlockchain || '',
2861
- //@ts-ignore
2862
- logo: lastStep?.toBlockchainLogo || ''
2863
- },
2864
- token: {
2865
- symbol: lastStep?.toSymbol || '',
2866
- image: lastStep?.toLogo || ''
2867
- },
2868
- amount: toAmount,
2869
- label: t('To'),
2870
- loadingStatus: 'success'
2871
- })),
2872
- //todo: move PendingSwap type to rango-types
2873
- pendingSwap: swap,
2861
+ /* TODO: It was temporarily removed to find a better solution*/
2862
+ /*
2863
+ previewInputs={
2864
+ <>
2865
+ <TokenPreview
2866
+ chain={{
2867
+ displayName: firstStep?.fromBlockchain || '',
2868
+ logo: firstStep?.fromBlockchainLogo || '',
2869
+ }}
2870
+ token={{
2871
+ symbol: firstStep?.fromSymbol || '',
2872
+ image: firstStep?.fromLogo || '',
2873
+ }}
2874
+ amount={fromAmount}
2875
+ label={t('From')}
2876
+ loadingStatus={'success'}
2877
+ />
2878
+ <Spacer size={12} direction="vertical" />
2879
+ <TokenPreview
2880
+ chain={{
2881
+ displayName: lastStep?.toBlockchain || '',
2882
+ logo: lastStep?.toBlockchainLogo || '',
2883
+ }}
2884
+ token={{
2885
+ symbol: lastStep?.toSymbol || '',
2886
+ image: lastStep?.toLogo || '',
2887
+ }}
2888
+ amount={toAmount}
2889
+ label={t('To')}
2890
+ loadingStatus={'success'}
2891
+ />
2892
+ </>
2893
+ }
2894
+ */
2895
+ pendingSwap: getFormatedPendingSwap(swap),
2874
2896
  onCopy: handleCopy,
2875
2897
  isCopied: isCopied,
2876
2898
  onCancel: onCancel,