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

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.
@@ -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';
@@ -118,6 +118,195 @@ const decimalNumber = function (number, toFixed) {
118
118
  return parseFloat(number).toFixed(toFixed);
119
119
  };
120
120
 
121
+ function searchParamsToToken(tokens, searchParams, chain) {
122
+ if (!chain) return null;
123
+ return tokens.find(token => {
124
+ const symbolAndAddress = searchParams?.split('--');
125
+ if (symbolAndAddress?.length === 1) return token.symbol === symbolAndAddress[0] && token.address === null && token.blockchain === chain.name;
126
+ return token.symbol === symbolAndAddress?.[0] && token.address === symbolAndAddress?.[1] && token.blockchain === chain.name;
127
+ }) || null;
128
+ }
129
+ function getBestRouteToTokenUsdPrice(bestRoute) {
130
+ return bestRoute?.result?.swaps[bestRoute?.result?.swaps.length - 1].to.usdPrice;
131
+ }
132
+ function isNumberOfSwapsChanged(route1, route2) {
133
+ const route1Swaps = route1.result?.swaps || [];
134
+ const route2Swaps = route2.result?.swaps || [];
135
+ return route1Swaps.length !== route2Swaps.length;
136
+ }
137
+ function isRouteSwappersUpdated(route1, route2) {
138
+ const route1Swappers = route1.result?.swaps.map(swap => swap.swapperId) || [];
139
+ const route2Swappers = route2.result?.swaps.map(swap => swap.swapperId) || [];
140
+ return !areEqual(route1Swappers, route2Swappers);
141
+ }
142
+ function isRouteInternalCoinsUpdated(route1, route2) {
143
+ const route1InternalCoins = route1.result?.swaps.map(swap => swap.to.symbol) || [];
144
+ const route2InternalCoins = route2.result?.swaps.map(swap => swap.to.symbol) || [];
145
+ return !areEqual(route1InternalCoins, route2InternalCoins);
146
+ }
147
+ function isRouteChanged(route1, route2) {
148
+ return isNumberOfSwapsChanged(route1, route2) || isRouteSwappersUpdated(route1, route2) || isRouteInternalCoinsUpdated(route1, route2);
149
+ }
150
+ function getRequiredBalanceOfWallet(selectedWallet, fee) {
151
+ if (fee === null) return null;
152
+ const relatedFeeStatus = fee?.find(item => item.blockchain === selectedWallet.chain)?.wallets.find(wallet => wallet.address?.toLowerCase() === selectedWallet.address.toLowerCase());
153
+ if (!relatedFeeStatus) return null;
154
+ return relatedFeeStatus.requiredAssets;
155
+ }
156
+ function isRouteParametersChanged(params) {
157
+ if (params.store === 'bestRoute') {
158
+ const {
159
+ prevState,
160
+ currentState
161
+ } = params;
162
+ 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);
163
+ } else if (params.store === 'settings') {
164
+ const {
165
+ prevState,
166
+ currentState
167
+ } = params;
168
+ return prevState.slippage !== currentState.slippage || prevState.customSlippage !== currentState.customSlippage || prevState.disabledLiquiditySources?.length !== currentState.disabledLiquiditySources?.length || prevState.infiniteApprove || currentState.infiniteApprove;
169
+ }
170
+ return false;
171
+ }
172
+ function getFormatedBestRoute(bestRoute) {
173
+ if (!bestRoute) return null;
174
+ const formatedSwaps = (bestRoute.result?.swaps || []).map(swap => ({
175
+ ...swap,
176
+ fromAmount: numberToString(swap.fromAmount, 6, 6),
177
+ toAmount: numberToString(swap.toAmount, 6, 6)
178
+ }));
179
+ return {
180
+ ...bestRoute,
181
+ ...(bestRoute.result && {
182
+ result: {
183
+ ...bestRoute.result,
184
+ swaps: formatedSwaps
185
+ }
186
+ })
187
+ };
188
+ }
189
+ function getFormatedPendingSwap(pendingSwap) {
190
+ const formatedSteps = pendingSwap.steps.map(step => ({
191
+ ...step,
192
+ feeInUsd: numberToString(step.feeInUsd, 4, 4),
193
+ outputAmount: numberToString(step.outputAmount, 6, 6),
194
+ expectedOutputAmountHumanReadable: numberToString(step.expectedOutputAmountHumanReadable, 6, 6)
195
+ }));
196
+ return {
197
+ ...pendingSwap,
198
+ inputAmount: numberToString(pendingSwap.inputAmount, 6, 6),
199
+ steps: formatedSteps
200
+ };
201
+ }
202
+ //todo: refactor bestRoute store and add loadingStatus
203
+ const getBestRouteStatus = (loading, error) => {
204
+ if (loading) return 'loading';
205
+ if (error) return 'failed';else return 'success';
206
+ };
207
+
208
+ const createSelectors = _store => {
209
+ let store = _store;
210
+ store.use = {};
211
+ for (let k of Object.keys(store.getState())) {
212
+ store.use[k] = () => store(s => s[k]);
213
+ }
214
+ return store;
215
+ };
216
+
217
+ const RANGO_PUBLIC_API_KEY = 'c6381a79-2817-4602-83bf-6a641a409e32';
218
+ let configs = {
219
+ API_KEY: RANGO_PUBLIC_API_KEY
220
+ };
221
+ function getConfig(name) {
222
+ return configs[name];
223
+ }
224
+
225
+ let rango = undefined;
226
+ const httpService = () => {
227
+ if (rango) return rango;
228
+ rango = new RangoClient(getConfig('API_KEY'));
229
+ return rango;
230
+ };
231
+
232
+ const SLIPPAGES = [0.5, 1, 3, 5, 8, 13, 20];
233
+ const DEFAULT_SLIPPAGE = 1;
234
+ const HIGH_SLIPPAGE = 5;
235
+ const MAX_SLIPPAGE = 100;
236
+ const MIN_SLIPPGAE = 0;
237
+
238
+ const useMetaStore = /*#__PURE__*/createSelectors( /*#__PURE__*/create()(set => ({
239
+ meta: {
240
+ blockchains: [],
241
+ popularTokens: [],
242
+ swappers: [],
243
+ tokens: []
244
+ },
245
+ loadingStatus: 'loading',
246
+ fetchMeta: async () => {
247
+ try {
248
+ const response = await httpService().getAllMetadata();
249
+ const chainThatHasTokenInMetaResponse = removeDuplicateFrom(response.tokens.map(t => t.blockchain));
250
+ const enabledChains = response.blockchains.filter(chain => chain.enabled && chainThatHasTokenInMetaResponse.includes(chain.name));
251
+ response.blockchains = enabledChains.sort((a, b) => a.sort - b.sort);
252
+ set({
253
+ meta: response,
254
+ loadingStatus: 'success'
255
+ });
256
+ } catch (error) {
257
+ set({
258
+ loadingStatus: 'failed'
259
+ });
260
+ }
261
+ }
262
+ })));
263
+
264
+ const useSettingsStore = /*#__PURE__*/createSelectors( /*#__PURE__*/create()( /*#__PURE__*/persist( /*#__PURE__*/subscribeWithSelector(set => ({
265
+ slippage: DEFAULT_SLIPPAGE,
266
+ customSlippage: null,
267
+ infiniteApprove: false,
268
+ affiliateRef: null,
269
+ disabledLiquiditySources: [],
270
+ theme: 'auto',
271
+ setSlippage: slippage => set(() => ({
272
+ slippage: slippage
273
+ })),
274
+ setCustomSlippage: customSlippage => set(() => ({
275
+ customSlippage: customSlippage
276
+ })),
277
+ setAffiliateRef: affiliateRef => set(() => ({
278
+ affiliateRef
279
+ })),
280
+ toggleAllLiquiditySources: () => set(state => {
281
+ const {
282
+ swappers
283
+ } = useMetaStore.getState().meta;
284
+ const swappersGroup = removeDuplicateFrom(swappers.map(swapper => swapper.swapperGroup));
285
+ if (swappersGroup.length === state.disabledLiquiditySources.length) return {
286
+ disabledLiquiditySources: []
287
+ };else {
288
+ return {
289
+ disabledLiquiditySources: swappersGroup
290
+ };
291
+ }
292
+ }),
293
+ toggleInfiniteApprove: () => set(state => ({
294
+ infiniteApprove: !state.infiniteApprove
295
+ })),
296
+ toggleLiquiditySource: name => set(state => {
297
+ if (state.disabledLiquiditySources.includes(name)) return {
298
+ disabledLiquiditySources: state.disabledLiquiditySources.filter(liquiditySource => liquiditySource != name)
299
+ };else return {
300
+ disabledLiquiditySources: state.disabledLiquiditySources.concat(name)
301
+ };
302
+ }),
303
+ setTheme: theme => set(() => ({
304
+ theme
305
+ }))
306
+ })), {
307
+ name: 'user-settings'
308
+ })));
309
+
121
310
  function getStateWallet(state) {
122
311
  switch (true) {
123
312
  case state.connected:
@@ -637,165 +826,6 @@ function shouldRetrySwap(pendingSwap) {
637
826
  return pendingSwap.status === 'failed' && !!pendingSwap.finishTime && new Date().getTime() - parseInt(pendingSwap.finishTime) < 4 * 3600 * 1000;
638
827
  }
639
828
 
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
829
  const useWalletsStore = /*#__PURE__*/createSelectors( /*#__PURE__*/create()( /*#__PURE__*/subscribeWithSelector(set => ({
800
830
  accounts: [],
801
831
  balances: [],
@@ -1730,7 +1760,7 @@ function Home() {
1730
1760
  }), showBestRoute && React.createElement(BestRouteContainer, null, React.createElement(BestRoute, {
1731
1761
  error: bestRouteError,
1732
1762
  loading: fetchingBestRoute,
1733
- data: bestRoute,
1763
+ data: getFormatedBestRoute(bestRoute),
1734
1764
  totalFee: numberToString(totalFeeInUsd, 0, 2),
1735
1765
  feeWarning: highFee,
1736
1766
  totalTime: secondsToString(totalArrivalTime(bestRoute))
@@ -2345,7 +2375,9 @@ function ConfirmSwapPage() {
2345
2375
  navigate(navigationRoutes.swaps + `/${swap.requestId}`, {
2346
2376
  replace: true
2347
2377
  });
2348
- setInputAmount('');
2378
+ setTimeout(() => {
2379
+ setInputAmount('');
2380
+ }, 0);
2349
2381
  }
2350
2382
  });
2351
2383
  },
@@ -2823,10 +2855,6 @@ function SwapDetailsPage() {
2823
2855
  loading: loading,
2824
2856
  onBack: navigateBackFrom.bind(null, navigationRoutes.swapDetails)
2825
2857
  });
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
2858
  const currentStep = getCurrentStep(swap);
2831
2859
  const currentStepBlockchain = currentStep ? getCurrentBlockchainOfOrNull(swap, currentStep) : null;
2832
2860
  const currentStepWallet = currentStep ? getRelatedWalletOrNull(swap, currentStep) : null;
@@ -2839,38 +2867,41 @@ function SwapDetailsPage() {
2839
2867
  const lastConvertedTokenInFailedSwap = getLastConvertedTokenInFailedSwap(swap);
2840
2868
  return React.createElement(SwapHistory, Object.assign({
2841
2869
  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,
2870
+ /* TODO: It was temporarily removed to find a better solution*/
2871
+ /*
2872
+ previewInputs={
2873
+ <>
2874
+ <TokenPreview
2875
+ chain={{
2876
+ displayName: firstStep?.fromBlockchain || '',
2877
+ logo: firstStep?.fromBlockchainLogo || '',
2878
+ }}
2879
+ token={{
2880
+ symbol: firstStep?.fromSymbol || '',
2881
+ image: firstStep?.fromLogo || '',
2882
+ }}
2883
+ amount={fromAmount}
2884
+ label={t('From')}
2885
+ loadingStatus={'success'}
2886
+ />
2887
+ <Spacer size={12} direction="vertical" />
2888
+ <TokenPreview
2889
+ chain={{
2890
+ displayName: lastStep?.toBlockchain || '',
2891
+ logo: lastStep?.toBlockchainLogo || '',
2892
+ }}
2893
+ token={{
2894
+ symbol: lastStep?.toSymbol || '',
2895
+ image: lastStep?.toLogo || '',
2896
+ }}
2897
+ amount={toAmount}
2898
+ label={t('To')}
2899
+ loadingStatus={'success'}
2900
+ />
2901
+ </>
2902
+ }
2903
+ */
2904
+ pendingSwap: getFormatedPendingSwap(swap),
2874
2905
  onCopy: handleCopy,
2875
2906
  isCopied: isCopied,
2876
2907
  onCancel: onCancel,