@rango-dev/widget-embedded 0.38.1-next.9 → 0.39.0

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 (155) hide show
  1. package/dist/QueueManager.d.ts.map +1 -1
  2. package/dist/components/ConfirmWalletsModal/ConfirmWalletsModal.d.ts.map +1 -1
  3. package/dist/components/ConfirmWalletsModal/WalletList.d.ts.map +1 -1
  4. package/dist/components/Layout/Layout.d.ts.map +1 -1
  5. package/dist/components/Quote/Quote.d.ts.map +1 -1
  6. package/dist/components/Quote/Quote.styles.d.ts +1 -1
  7. package/dist/components/Quote/Quote.types.d.ts +0 -2
  8. package/dist/components/Quote/Quote.types.d.ts.map +1 -1
  9. package/dist/components/Quote/QuoteCostDetails.d.ts.map +1 -1
  10. package/dist/components/Quote/QuoteCostDetails.styles.d.ts.map +1 -1
  11. package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.helpers.d.ts.map +1 -1
  12. package/dist/components/Quotes/Quotes.d.ts.map +1 -1
  13. package/dist/components/RefreshModal/RefreshModal.styles.d.ts +1 -1
  14. package/dist/components/StatefulConnectModal/StatefulConnectModal.d.ts +2 -1
  15. package/dist/components/StatefulConnectModal/StatefulConnectModal.d.ts.map +1 -1
  16. package/dist/components/SwapDetails/SwapDetails.d.ts.map +1 -1
  17. package/dist/components/SwapDetailsAlerts/SwapDetailsAlerts.types.d.ts +1 -1
  18. package/dist/components/SwapDetailsAlerts/SwapDetailsAlerts.types.d.ts.map +1 -1
  19. package/dist/components/SwapDetailsModal/SwapDetailsCompleteModal.d.ts.map +1 -1
  20. package/dist/components/TokenList/TokenList.d.ts.map +1 -1
  21. package/dist/components/WalletStatefulConnect/DerivationPath.helpers.d.ts +1 -2
  22. package/dist/components/WalletStatefulConnect/DerivationPath.helpers.d.ts.map +1 -1
  23. package/dist/components/WalletStatefulConnect/Namespaces.d.ts.map +1 -1
  24. package/dist/components/WalletStatefulConnect/Namespaces.types.d.ts +1 -1
  25. package/dist/components/WalletStatefulConnect/Namespaces.types.d.ts.map +1 -1
  26. package/dist/constants/quote.d.ts +0 -10
  27. package/dist/constants/quote.d.ts.map +1 -1
  28. package/dist/constants/warnings.d.ts +3 -0
  29. package/dist/constants/warnings.d.ts.map +1 -0
  30. package/dist/containers/ExpandedQuotes/ExpandedQuotes.styles.d.ts.map +1 -1
  31. package/dist/containers/Inputs/Inputs.d.ts.map +1 -1
  32. package/dist/containers/QuoteInfo/QuoteInfo.d.ts.map +1 -1
  33. package/dist/containers/Wallets/Wallets.d.ts.map +1 -1
  34. package/dist/containers/WidgetInfo/WidgetInfo.d.ts.map +1 -1
  35. package/dist/containers/WidgetInfo/WidgetInfo.helpers.d.ts +1 -1
  36. package/dist/containers/WidgetInfo/WidgetInfo.types.d.ts +3 -3
  37. package/dist/containers/WidgetInfo/WidgetInfo.types.d.ts.map +1 -1
  38. package/dist/hooks/useConfirmSwap/useConfirmSwap.d.ts.map +1 -1
  39. package/dist/hooks/useConfirmSwap/useConfirmSwap.helpers.d.ts +4 -6
  40. package/dist/hooks/useConfirmSwap/useConfirmSwap.helpers.d.ts.map +1 -1
  41. package/dist/hooks/useFetchApiConfig.d.ts.map +1 -1
  42. package/dist/hooks/useFetchCustomToken.d.ts.map +1 -1
  43. package/dist/hooks/useObserveBalanceChanges/index.d.ts +2 -0
  44. package/dist/hooks/useObserveBalanceChanges/index.d.ts.map +1 -0
  45. package/dist/hooks/useObserveBalanceChanges/useObserveBalanceChanges.d.ts +4 -0
  46. package/dist/hooks/useObserveBalanceChanges/useObserveBalanceChanges.d.ts.map +1 -0
  47. package/dist/hooks/useStatefulConnect/useStatefulConnect.d.ts +1 -2
  48. package/dist/hooks/useStatefulConnect/useStatefulConnect.d.ts.map +1 -1
  49. package/dist/hooks/useStatefulConnect/useStatefulConnect.types.d.ts +5 -3
  50. package/dist/hooks/useStatefulConnect/useStatefulConnect.types.d.ts.map +1 -1
  51. package/dist/hooks/useSubscribeToWidgetEvents/useSubscribeToWidgetEvents.d.ts.map +1 -1
  52. package/dist/hooks/useSwapInput.d.ts.map +1 -1
  53. package/dist/hooks/useWalletList.d.ts.map +1 -1
  54. package/dist/hooks/useWalletProviders/useWalletProviders.d.ts +3 -2
  55. package/dist/hooks/useWalletProviders/useWalletProviders.d.ts.map +1 -1
  56. package/dist/index.d.ts +1 -1
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +2 -2
  59. package/dist/index.js.map +4 -4
  60. package/dist/pages/ConfirmSwapPage.d.ts.map +1 -1
  61. package/dist/pages/Home.d.ts.map +1 -1
  62. package/dist/pages/SelectSwapItemsPage.d.ts.map +1 -1
  63. package/dist/store/app.d.ts +4 -2
  64. package/dist/store/app.d.ts.map +1 -1
  65. package/dist/store/quote.d.ts.map +1 -1
  66. package/dist/store/slices/config.d.ts +0 -4
  67. package/dist/store/slices/config.d.ts.map +1 -1
  68. package/dist/store/slices/data.d.ts.map +1 -1
  69. package/dist/store/ui.d.ts +0 -4
  70. package/dist/store/ui.d.ts.map +1 -1
  71. package/dist/store/wallets.d.ts +66 -0
  72. package/dist/store/wallets.d.ts.map +1 -0
  73. package/dist/types/config.d.ts +2 -2
  74. package/dist/types/config.d.ts.map +1 -1
  75. package/dist/types/quote.d.ts +17 -8
  76. package/dist/types/quote.d.ts.map +1 -1
  77. package/dist/types/wallets.d.ts +7 -3
  78. package/dist/types/wallets.d.ts.map +1 -1
  79. package/dist/utils/providers.d.ts +9 -7
  80. package/dist/utils/providers.d.ts.map +1 -1
  81. package/dist/utils/quote.d.ts +6 -5
  82. package/dist/utils/quote.d.ts.map +1 -1
  83. package/dist/utils/swap.d.ts +5 -5
  84. package/dist/utils/swap.d.ts.map +1 -1
  85. package/dist/utils/wallets.d.ts +14 -12
  86. package/dist/utils/wallets.d.ts.map +1 -1
  87. package/dist/widget-embedded.build.json +1 -1
  88. package/package.json +7 -7
  89. package/src/QueueManager.tsx +11 -17
  90. package/src/components/ConfirmWalletsModal/ConfirmWalletsModal.tsx +24 -5
  91. package/src/components/ConfirmWalletsModal/WalletList.tsx +13 -13
  92. package/src/components/Layout/Layout.tsx +3 -1
  93. package/src/components/Quote/Quote.tsx +3 -22
  94. package/src/components/Quote/Quote.types.ts +0 -2
  95. package/src/components/Quote/QuoteCostDetails.styles.ts +1 -0
  96. package/src/components/Quote/QuoteCostDetails.tsx +4 -23
  97. package/src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.helpers.ts +22 -42
  98. package/src/components/Quotes/Quotes.tsx +3 -2
  99. package/src/components/StatefulConnectModal/StatefulConnectModal.tsx +37 -40
  100. package/src/components/SwapDetails/SwapDetails.tsx +6 -14
  101. package/src/components/SwapDetailsAlerts/SwapDetailsAlerts.types.ts +1 -1
  102. package/src/components/SwapDetailsModal/SwapDetailsCompleteModal.tsx +13 -26
  103. package/src/components/TokenList/TokenList.tsx +27 -4
  104. package/src/components/WalletStatefulConnect/DerivationPath.helpers.ts +1 -2
  105. package/src/components/WalletStatefulConnect/Namespaces.tsx +38 -31
  106. package/src/components/WalletStatefulConnect/Namespaces.types.tsx +1 -1
  107. package/src/constants/quote.ts +0 -25
  108. package/src/constants/warnings.ts +26 -0
  109. package/src/containers/ExpandedQuotes/ExpandedQuotes.styles.ts +0 -1
  110. package/src/containers/ExpandedQuotes/ExpandedQuotes.tsx +1 -1
  111. package/src/containers/Inputs/Inputs.tsx +7 -20
  112. package/src/containers/QuoteInfo/QuoteInfo.tsx +9 -3
  113. package/src/containers/Wallets/Wallets.tsx +16 -76
  114. package/src/containers/WidgetInfo/WidgetInfo.helpers.ts +2 -2
  115. package/src/containers/WidgetInfo/WidgetInfo.tsx +8 -10
  116. package/src/containers/WidgetInfo/WidgetInfo.types.ts +3 -3
  117. package/src/hooks/useConfirmSwap/useConfirmSwap.helpers.ts +66 -29
  118. package/src/hooks/useConfirmSwap/useConfirmSwap.ts +15 -10
  119. package/src/hooks/useFetchApiConfig.ts +1 -5
  120. package/src/hooks/useFetchCustomToken.ts +0 -5
  121. package/src/hooks/useObserveBalanceChanges/index.ts +1 -0
  122. package/src/hooks/useObserveBalanceChanges/useObserveBalanceChanges.ts +68 -0
  123. package/src/hooks/useStatefulConnect/useStatefulConnect.ts +17 -50
  124. package/src/hooks/useStatefulConnect/useStatefulConnect.types.ts +5 -3
  125. package/src/hooks/useSubscribeToWidgetEvents/useSubscribeToWidgetEvents.ts +6 -7
  126. package/src/hooks/useSwapInput.ts +11 -3
  127. package/src/hooks/useWalletList.ts +13 -4
  128. package/src/hooks/useWalletProviders/useWalletProviders.ts +12 -8
  129. package/src/index.ts +1 -1
  130. package/src/pages/ConfirmSwapPage.tsx +15 -7
  131. package/src/pages/Home.tsx +3 -5
  132. package/src/pages/SelectSwapItemsPage.tsx +2 -1
  133. package/src/store/app.ts +4 -4
  134. package/src/store/quote.ts +13 -3
  135. package/src/store/slices/config.ts +0 -72
  136. package/src/store/slices/data.test.ts +1 -20
  137. package/src/store/slices/data.ts +2 -3
  138. package/src/store/ui.ts +0 -6
  139. package/src/store/wallets.ts +268 -0
  140. package/src/types/config.ts +2 -2
  141. package/src/types/quote.ts +24 -10
  142. package/src/types/wallets.ts +7 -3
  143. package/src/utils/providers.ts +37 -78
  144. package/src/utils/quote.ts +45 -57
  145. package/src/utils/swap.ts +37 -56
  146. package/src/utils/wallets.ts +141 -81
  147. package/dist/store/slices/types.d.ts +0 -6
  148. package/dist/store/slices/types.d.ts.map +0 -1
  149. package/dist/store/slices/wallets.d.ts +0 -80
  150. package/dist/store/slices/wallets.d.ts.map +0 -1
  151. package/dist/store/utils/wallets.d.ts +0 -17
  152. package/dist/store/utils/wallets.d.ts.map +0 -1
  153. package/src/store/slices/types.ts +0 -9
  154. package/src/store/slices/wallets.ts +0 -577
  155. package/src/store/utils/wallets.ts +0 -111
@@ -13,6 +13,7 @@ import { navigationRoutes } from '../constants/navigationRoutes';
13
13
  import { useNavigateBack } from '../hooks/useNavigateBack';
14
14
  import { useAppStore } from '../store/AppStore';
15
15
  import { useQuoteStore } from '../store/quote';
16
+ import { useWalletsStore } from '../store/wallets';
16
17
 
17
18
  interface PropTypes {
18
19
  type: 'source' | 'destination';
@@ -30,7 +31,7 @@ export function SelectSwapItemsPage(props: PropTypes) {
30
31
  setFromBlockchain,
31
32
  setToBlockchain,
32
33
  } = useQuoteStore();
33
- const { getBalanceFor } = useAppStore();
34
+ const getBalanceFor = useWalletsStore.use.getBalanceFor();
34
35
  const [searchedFor, setSearchedFor] = useState<string>('');
35
36
 
36
37
  const selectedBlockchain = type === 'source' ? fromBlockchain : toBlockchain;
package/src/store/app.ts CHANGED
@@ -1,4 +1,6 @@
1
- import type { AppStoreState } from './slices/types';
1
+ import type { ConfigSlice } from './slices/config';
2
+ import type { DataSlice } from './slices/data';
3
+ import type { SettingsSlice } from './slices/settings';
2
4
  import type { WidgetConfig } from '../types';
3
5
  import type { StateCreator } from 'zustand';
4
6
 
@@ -8,7 +10,6 @@ import { persist } from 'zustand/middleware';
8
10
  import { createConfigSlice } from './slices/config';
9
11
  import { createDataSlice } from './slices/data';
10
12
  import { createSettingsSlice } from './slices/settings';
11
- import { createWalletsSlice } from './slices/wallets';
12
13
 
13
14
  export type StateCreatorWithInitialData<
14
15
  T extends Partial<WidgetConfig>,
@@ -19,13 +20,12 @@ export type StateCreatorWithInitialData<
19
20
  ...rest: Parameters<StateCreator<R, [], [], V>>
20
21
  ) => ReturnType<StateCreator<R, [], [], V>>;
21
22
 
22
- export type { AppStoreState };
23
+ export type AppStoreState = DataSlice & ConfigSlice & SettingsSlice;
23
24
 
24
25
  export function createAppStore(initialData?: WidgetConfig) {
25
26
  return create<AppStoreState>()(
26
27
  persist(
27
28
  (...a) => ({
28
- ...createWalletsSlice(...a),
29
29
  ...createDataSlice(...a),
30
30
  ...createSettingsSlice(...a),
31
31
  ...createConfigSlice(initialData, ...a),
@@ -21,7 +21,11 @@ import {
21
21
  WidgetEvents,
22
22
  } from '../types';
23
23
  import { isPositiveNumber } from '../utils/numbers';
24
- import { getUsdInputFrom, getUsdOutputFrom } from '../utils/swap';
24
+ import {
25
+ getQuoteFromTokenUsdPrice,
26
+ getQuoteToTokenUsdPrice,
27
+ } from '../utils/quote';
28
+ import { calcOutputUsdValue } from '../utils/swap';
25
29
 
26
30
  import createSelectors from './selectors';
27
31
 
@@ -133,8 +137,14 @@ export const useQuoteStore = createSelectors(
133
137
  outputAmount = !!quote?.outputAmount
134
138
  ? new BigNumber(quote?.outputAmount)
135
139
  : null;
136
- inputUsdValue = getUsdInputFrom(quote) ?? ZERO;
137
- outputUsdValue = getUsdOutputFrom(quote) ?? ZERO;
140
+ inputUsdValue = calcOutputUsdValue(
141
+ state.inputAmount,
142
+ getQuoteFromTokenUsdPrice(quote) || state.fromToken?.usdPrice
143
+ );
144
+ outputUsdValue = calcOutputUsdValue(
145
+ quote.outputAmount,
146
+ getQuoteToTokenUsdPrice(quote) || state.toToken?.usdPrice
147
+ );
138
148
  }
139
149
  return {
140
150
  selectedQuote: quote,
@@ -3,30 +3,9 @@ import type { SettingsSlice } from './settings';
3
3
  import type { WidgetConfig } from '../../types';
4
4
  import type { StateCreatorWithInitialData } from '../app';
5
5
 
6
- import { allProviders as getAllProviders } from '@rango-dev/provider-all';
7
- import { type VersionedProviders } from '@rango-dev/wallets-core';
8
-
9
6
  import { cacheService } from '../../services/cacheService';
10
- import {
11
- matchAndGenerateProviders,
12
- type ProvidersOptions,
13
- } from '../../utils/providers';
14
7
  import { matchTokensFromConfigWithMeta } from '../utils';
15
8
 
16
- function makeProvidersOptionsFromConfig(
17
- config: WidgetConfig
18
- ): ProvidersOptions {
19
- const options: ProvidersOptions = {
20
- walletConnectProjectId: config?.walletConnectProjectId,
21
- trezorManifest: config?.trezorManifest,
22
- tonConnect: config?.tonConnect,
23
- walletConnectListedDesktopWalletLink:
24
- config.__UNSTABLE_OR_INTERNAL__?.walletConnectListedDesktopWalletLink,
25
- };
26
-
27
- return options;
28
- }
29
-
30
9
  export const DEFAULT_CONFIG: WidgetConfig = {
31
10
  apiKey: '',
32
11
  title: undefined,
@@ -79,31 +58,6 @@ export interface ConfigSlice {
79
58
  name: K,
80
59
  value: IframeConfigs[K]
81
60
  ) => void;
82
- allProviders: VersionedProviders[];
83
- buildAndSetProviders: () => void;
84
- getAvailableProviders: () => VersionedProviders[];
85
- }
86
-
87
- function generateProviders(config: WidgetConfig) {
88
- const options = makeProvidersOptionsFromConfig(config);
89
- const envs = {
90
- walletconnect2: {
91
- WC_PROJECT_ID: options?.walletConnectProjectId || '',
92
- DISABLE_MODAL_AND_OPEN_LINK:
93
- options?.walletConnectListedDesktopWalletLink,
94
- },
95
- selectedProviders: config.wallets,
96
- trezor: options?.trezorManifest
97
- ? { manifest: options.trezorManifest }
98
- : undefined,
99
- tonConnect: options?.tonConnect?.manifestUrl
100
- ? { manifestUrl: options?.tonConnect.manifestUrl }
101
- : undefined,
102
- };
103
- const allProviders = getAllProviders(envs);
104
- const allBuiltProviders = allProviders.map((build) => build());
105
-
106
- return allBuiltProviders;
107
61
  }
108
62
 
109
63
  export const createConfigSlice: StateCreatorWithInitialData<
@@ -111,15 +65,10 @@ export const createConfigSlice: StateCreatorWithInitialData<
111
65
  ConfigSlice & SettingsSlice & DataSlice,
112
66
  ConfigSlice
113
67
  > = (initialData, set, get) => {
114
- const allBuiltProviders = generateProviders({
115
- ...DEFAULT_CONFIG,
116
- ...initialData,
117
- });
118
68
  return {
119
69
  config: { ...DEFAULT_CONFIG, ...initialData },
120
70
  iframe: DEFAULT_IFRAME_CONFIGS,
121
71
  campaignMode: DEFAULT_CAMPAIGN_MODE,
122
- allProviders: allBuiltProviders,
123
72
  getLiquiditySources: () => {
124
73
  const { config, campaignMode } = get();
125
74
  return campaignMode.liquiditySources?.length
@@ -210,26 +159,5 @@ export const createConfigSlice: StateCreatorWithInitialData<
210
159
  },
211
160
  });
212
161
  },
213
-
214
- buildAndSetProviders: () => {
215
- const { config } = get();
216
- const allBuiltProviders = generateProviders(config);
217
-
218
- set({
219
- allProviders: allBuiltProviders,
220
- });
221
- },
222
-
223
- getAvailableProviders: () => {
224
- const { allProviders, config } = get();
225
- const options = makeProvidersOptionsFromConfig(config);
226
-
227
- const availableProviders = matchAndGenerateProviders({
228
- allProviders,
229
- configWallets: config.wallets,
230
- options,
231
- });
232
- return availableProviders;
233
- },
234
162
  };
235
163
  };
@@ -1,4 +1,3 @@
1
- import type { WidgetConfig } from '../../types';
2
1
  import type { AppStoreState } from '../app';
3
2
  import type { EvmBlockchainMeta, Token } from 'rango-sdk';
4
3
 
@@ -18,24 +17,6 @@ let appStoreState: AppStoreState;
18
17
  let customTokens: [Token, Token, Token];
19
18
  let rangoBlockchain: EvmBlockchainMeta;
20
19
 
21
- const DEFAULT_CONFIG: WidgetConfig = {
22
- apiKey: '',
23
- walletConnectProjectId: 'e24844c5deb5193c1c14840a7af6a40b',
24
- title: undefined,
25
- multiWallets: true,
26
- excludeLiquiditySources: true,
27
- customDestination: true,
28
- variant: 'default',
29
- trezorManifest: {
30
- appUrl: 'https://widget.rango.exchange/',
31
- email: 'hi+trezorwidget@rango.exchange',
32
- },
33
- tonConnect: {
34
- manifestUrl:
35
- 'https://raw.githubusercontent.com/rango-exchange/rango-types/main/assets/manifests/tonconnect-manifest.json',
36
- },
37
- };
38
-
39
20
  beforeEach(() => {
40
21
  cacheService.clear();
41
22
  rangoBlockchain = createEvmBlockchain();
@@ -79,7 +60,7 @@ beforeEach(() => {
79
60
  initData._tokensMapByBlockchainName[token.blockchain].push(tokenHash);
80
61
  });
81
62
 
82
- const appStore = createAppStore(DEFAULT_CONFIG);
63
+ const appStore = createAppStore();
83
64
  appStore.setState(initData);
84
65
  appStoreState = appStore.getState();
85
66
  });
@@ -348,9 +348,8 @@ export const createDataSlice: StateCreator<
348
348
  {};
349
349
  const tokens: Token[] = [];
350
350
  const popularTokens: Token[] = response.popularTokens;
351
- const swappers: SwapperMeta[] = response.swappers.filter(
352
- (swapper) => swapper.enabled
353
- );
351
+ const swappers: SwapperMeta[] = response.swappers;
352
+
354
353
  const blockchainsWithAtLeastOneToken = new Set();
355
354
 
356
355
  response.tokens.forEach((token) => {
package/src/store/ui.ts CHANGED
@@ -12,14 +12,12 @@ interface UiState {
12
12
  tabManagerInitiated: boolean;
13
13
  showActivateTabModal: boolean;
14
14
  watermark: Watermark;
15
- showProfileBanner: boolean;
16
15
  activateCurrentTab: (
17
16
  setCurrentTabAsActive: () => void,
18
17
  hasRunningSwaps: boolean
19
18
  ) => void;
20
19
  setShowActivateTabModal: (flag: boolean) => void;
21
20
  setWatermark: (watermark: Watermark) => void;
22
- setShowProfileBanner: (showProfileBanner: boolean) => void;
23
21
  }
24
22
 
25
23
  export const useUiStore = createSelectors(
@@ -28,7 +26,6 @@ export const useUiStore = createSelectors(
28
26
  tabManagerInitiated: false,
29
27
  showActivateTabModal: false,
30
28
  watermark: 'NONE',
31
- showProfileBanner: false,
32
29
  fetchingApiConfig: false,
33
30
  activateCurrentTab: (setCurrentTabAsActive, hasRunningSwaps) => {
34
31
  const { showActivateTabModal } = get();
@@ -45,9 +42,6 @@ export const useUiStore = createSelectors(
45
42
  setWatermark: (watermark) => {
46
43
  set({ watermark });
47
44
  },
48
- setShowProfileBanner: (showProfileBanner) => {
49
- set({ showProfileBanner });
50
- },
51
45
  }))
52
46
  );
53
47
 
@@ -0,0 +1,268 @@
1
+ import type { FindToken } from './slices/data';
2
+ import type { Balance, TokensBalance, Wallet } from '../types';
3
+ import type { WalletType } from '@rango-dev/wallets-shared';
4
+ import type { Token } from 'rango-sdk';
5
+
6
+ import { create } from 'zustand';
7
+ import { subscribeWithSelector } from 'zustand/middleware';
8
+
9
+ import { eventEmitter } from '../services/eventEmitter';
10
+ import { httpService } from '../services/httpService';
11
+ import { WalletEventTypes, WidgetEvents } from '../types';
12
+ import { createTokenHash } from '../utils/meta';
13
+ import {
14
+ isAccountAndWalletMatched,
15
+ makeBalanceFor,
16
+ makeTokensBalance,
17
+ resetConnectedWalletState,
18
+ } from '../utils/wallets';
19
+
20
+ import createSelectors from './selectors';
21
+
22
+ export type TokenBalance = {
23
+ chain: string;
24
+ symbol: string;
25
+ ticker: string;
26
+ address: string | null;
27
+ rawAmount: string;
28
+ decimal: number | null;
29
+ amount: string;
30
+ logo: string | null;
31
+ usdPrice: number | null;
32
+ };
33
+
34
+ export interface ConnectedWallet extends Wallet {
35
+ balances: TokenBalance[] | null;
36
+ explorerUrl: string | null;
37
+ selected: boolean;
38
+ loading: boolean;
39
+ error: boolean;
40
+ }
41
+ interface WalletsStore {
42
+ connectedWallets: ConnectedWallet[];
43
+ balances: TokensBalance;
44
+ loading: boolean;
45
+ connectWallet: (accounts: Wallet[], findToken: FindToken) => void;
46
+ disconnectWallet: (walletType: WalletType) => void;
47
+ selectWallets: (wallets: { walletType: string; chain: string }[]) => void;
48
+ clearConnectedWallet: () => void;
49
+ getWalletsDetails: (
50
+ accounts: Wallet[],
51
+ findToken: FindToken,
52
+ shouldRetry?: boolean
53
+ ) => void;
54
+ getBalanceFor: (token: Token) => Balance | null;
55
+ }
56
+
57
+ export const useWalletsStore = createSelectors(
58
+ create<WalletsStore>()(
59
+ subscribeWithSelector((set, get) => {
60
+ return {
61
+ connectedWallets: [],
62
+ balances: {},
63
+ loading: false,
64
+ connectWallet: (accounts, findToken) => {
65
+ eventEmitter.emit(WidgetEvents.WalletEvent, {
66
+ type: WalletEventTypes.CONNECT,
67
+ payload: { walletType: accounts[0].walletType, accounts },
68
+ });
69
+
70
+ const getWalletsDetails = get().getWalletsDetails;
71
+ set((state) => ({
72
+ loading: true,
73
+ connectedWallets: state.connectedWallets
74
+ .filter((wallet) => wallet.walletType !== accounts[0].walletType)
75
+ .concat(
76
+ accounts.map((account) => {
77
+ const shouldMarkWalletAsSelected =
78
+ !state.connectedWallets.some(
79
+ (connectedWallet) =>
80
+ connectedWallet.chain === account.chain &&
81
+ connectedWallet.selected &&
82
+ /**
83
+ * Sometimes, the connect function can be called multiple times for a particular wallet type when using the auto-connect feature.
84
+ * This check is there to make sure the chosen wallet doesn't end up unselected.
85
+ */
86
+ connectedWallet.walletType !== account.walletType
87
+ );
88
+ return {
89
+ balances: [],
90
+ address: account.address,
91
+ chain: account.chain,
92
+ explorerUrl: null,
93
+ walletType: account.walletType,
94
+ selected: shouldMarkWalletAsSelected,
95
+ loading: true,
96
+ error: false,
97
+ };
98
+ })
99
+ ),
100
+ }));
101
+ getWalletsDetails(accounts, findToken);
102
+ },
103
+ disconnectWallet: (walletType) => {
104
+ set((state) => {
105
+ if (
106
+ state.connectedWallets.find(
107
+ (wallet) => wallet.walletType === walletType
108
+ )
109
+ ) {
110
+ eventEmitter.emit(WidgetEvents.WalletEvent, {
111
+ type: WalletEventTypes.DISCONNECT,
112
+ payload: { walletType },
113
+ });
114
+ }
115
+
116
+ const selectedWallets = state.connectedWallets
117
+ .filter(
118
+ (connectedWallet) =>
119
+ connectedWallet.selected &&
120
+ connectedWallet.walletType !== walletType
121
+ )
122
+ .map((selectedWallet) => selectedWallet.chain);
123
+
124
+ const connectedWallets = state.connectedWallets
125
+ .filter(
126
+ (connectedWallet) => connectedWallet.walletType !== walletType
127
+ )
128
+ .map((connectedWallet) => {
129
+ const anyWalletSelectedForBlockchain = selectedWallets.includes(
130
+ connectedWallet.chain
131
+ );
132
+ if (anyWalletSelectedForBlockchain) {
133
+ return connectedWallet;
134
+ }
135
+ selectedWallets.push(connectedWallet.chain);
136
+ return { ...connectedWallet, selected: true };
137
+ });
138
+
139
+ const balances = makeTokensBalance(connectedWallets);
140
+
141
+ return {
142
+ balances,
143
+ connectedWallets,
144
+ };
145
+ });
146
+ },
147
+ selectWallets: (wallets) =>
148
+ set((state) => ({
149
+ connectedWallets: state.connectedWallets.map((connectedWallet) => {
150
+ const walletSelected = !!wallets.find(
151
+ (wallet) =>
152
+ wallet.chain === connectedWallet.chain &&
153
+ wallet.walletType !== connectedWallet.walletType &&
154
+ connectedWallet.selected
155
+ );
156
+ const walletNotSelected = !!wallets.find(
157
+ (wallet) =>
158
+ wallet.chain === connectedWallet.chain &&
159
+ wallet.walletType === connectedWallet.walletType &&
160
+ !connectedWallet.selected
161
+ );
162
+ if (walletSelected) {
163
+ return { ...connectedWallet, selected: false };
164
+ } else if (walletNotSelected) {
165
+ return { ...connectedWallet, selected: true };
166
+ }
167
+
168
+ return connectedWallet;
169
+ }),
170
+ })),
171
+ clearConnectedWallet: () =>
172
+ set(() => ({
173
+ connectedWallets: [],
174
+ selectedWallets: [],
175
+ })),
176
+ getWalletsDetails: async (accounts, findToken, shouldRetry = true) => {
177
+ const getWalletsDetails = get().getWalletsDetails;
178
+ set((state) => ({
179
+ loading: true,
180
+ connectedWallets: state.connectedWallets.map((wallet) => {
181
+ return accounts.find((account) =>
182
+ isAccountAndWalletMatched(account, wallet)
183
+ )
184
+ ? { ...wallet, loading: true }
185
+ : wallet;
186
+ }),
187
+ }));
188
+ try {
189
+ const data = accounts.map(({ address, chain }) => ({
190
+ address,
191
+ blockchain: chain,
192
+ }));
193
+ const response = await httpService().getWalletsDetails(data);
194
+ const retrievedBalance = response.wallets;
195
+ if (retrievedBalance) {
196
+ set((state) => {
197
+ const connectedWallets = state.connectedWallets.map(
198
+ (connectedWallet) => {
199
+ const matchedAccount = accounts.find((account) =>
200
+ isAccountAndWalletMatched(account, connectedWallet)
201
+ );
202
+ const retrievedBalanceAccount = retrievedBalance.find(
203
+ (balance) =>
204
+ balance.address === connectedWallet.address &&
205
+ balance.blockChain === connectedWallet.chain
206
+ );
207
+ if (
208
+ retrievedBalanceAccount?.failed &&
209
+ matchedAccount &&
210
+ shouldRetry
211
+ ) {
212
+ getWalletsDetails([matchedAccount], findToken, false);
213
+ }
214
+ return matchedAccount && retrievedBalanceAccount
215
+ ? {
216
+ ...connectedWallet,
217
+ explorerUrl: retrievedBalanceAccount.explorerUrl,
218
+ balances: makeBalanceFor(
219
+ retrievedBalanceAccount,
220
+ findToken
221
+ ),
222
+ loading: false,
223
+ error: false,
224
+ }
225
+ : connectedWallet;
226
+ }
227
+ );
228
+
229
+ const balances = makeTokensBalance(connectedWallets);
230
+ return {
231
+ loading: false,
232
+ balances,
233
+ connectedWallets,
234
+ };
235
+ });
236
+ } else {
237
+ throw new Error('Wallet not found');
238
+ }
239
+ } catch (error) {
240
+ set((state) => {
241
+ const connectedWallets = state.connectedWallets.map((balance) => {
242
+ return accounts.find((account) =>
243
+ isAccountAndWalletMatched(account, balance)
244
+ )
245
+ ? resetConnectedWalletState(balance)
246
+ : balance;
247
+ });
248
+
249
+ const balances = makeTokensBalance(connectedWallets);
250
+
251
+ return {
252
+ loading: false,
253
+ balances,
254
+ connectedWallets,
255
+ };
256
+ });
257
+ }
258
+ },
259
+ getBalanceFor: (token) => {
260
+ const { balances } = get();
261
+ const tokenHash = createTokenHash(token);
262
+ const balance = balances[tokenHash];
263
+ return balance ?? null;
264
+ },
265
+ };
266
+ })
267
+ )
268
+ );
@@ -1,5 +1,5 @@
1
1
  import type { Language, theme } from '@rango-dev/ui';
2
- import type { LegacyProviderInterface } from '@rango-dev/wallets-core/dist/legacy/mod';
2
+ import type { ProviderInterface } from '@rango-dev/wallets-react';
3
3
  import type { WalletType } from '@rango-dev/wallets-shared';
4
4
  import type { Asset } from 'rango-sdk';
5
5
 
@@ -258,7 +258,7 @@ export type WidgetConfig = {
258
258
  from?: BlockchainAndTokenConfig;
259
259
  to?: BlockchainAndTokenConfig;
260
260
  liquiditySources?: string[];
261
- wallets?: (WalletType | LegacyProviderInterface)[];
261
+ wallets?: (WalletType | ProviderInterface)[];
262
262
  multiWallets?: boolean;
263
263
  customDestination?: boolean;
264
264
  defaultCustomDestinations?: { [blockchain: string]: string };
@@ -51,9 +51,29 @@ export enum QuoteWarningType {
51
51
  UNKNOWN_PRICE,
52
52
  INSUFFICIENT_SLIPPAGE,
53
53
  HIGH_SLIPPAGE,
54
- EXCESSIVE_OUTPUT_AMOUNT_CHANGE,
55
54
  }
56
55
 
56
+ export enum QuoteUpdateType {
57
+ QUOTE_UPDATED,
58
+ QUOTE_SWAPPERS_UPDATED,
59
+ QUOTE_COINS_UPDATED,
60
+ QUOTE_AND_OUTPUT_AMOUNT_UPDATED,
61
+ QUOTE_UPDATED_WITH_HIGH_VALUE_LOSS,
62
+ }
63
+
64
+ export type QuoteUpdateWarning =
65
+ | {
66
+ type: QuoteUpdateType.QUOTE_AND_OUTPUT_AMOUNT_UPDATED;
67
+ newOutputAmount: string;
68
+ percentageChange: string;
69
+ }
70
+ | {
71
+ type: Exclude<
72
+ QuoteUpdateType,
73
+ QuoteUpdateType.QUOTE_AND_OUTPUT_AMOUNT_UPDATED
74
+ >;
75
+ };
76
+
57
77
  export type RecommendedSlippages = Map<number, string>;
58
78
 
59
79
  export type InsufficientSlippageWarning = {
@@ -80,21 +100,15 @@ export type UnknownPriceWarning = {
80
100
  type: QuoteWarningType.UNKNOWN_PRICE;
81
101
  };
82
102
 
83
- export type ExcessiveOutputAmountChange = {
84
- type: QuoteWarningType.EXCESSIVE_OUTPUT_AMOUNT_CHANGE;
85
- usdValueChange: string;
86
- percentageChange: string;
87
- };
88
-
89
103
  export type QuoteWarning =
90
104
  | HighValueLossWarning
91
- | ExcessiveOutputAmountChange
92
- | UnknownPriceWarning
93
105
  | InsufficientSlippageWarning
94
- | HighSlippageWarning;
106
+ | HighSlippageWarning
107
+ | UnknownPriceWarning;
95
108
 
96
109
  export type ConfirmSwapWarnings = {
97
110
  quote: QuoteWarning | null;
111
+ quoteUpdate: QuoteUpdateWarning | null;
98
112
  balance: { messages: string[] } | null;
99
113
  };
100
114
 
@@ -1,5 +1,5 @@
1
1
  import type { WalletInfo } from '@rango-dev/ui';
2
- import type { WalletType } from '@rango-dev/wallets-shared';
2
+ import type { Namespace, WalletType } from '@rango-dev/wallets-shared';
3
3
 
4
4
  export interface Wallet {
5
5
  chain: string;
@@ -10,7 +10,7 @@ export interface Wallet {
10
10
  export type Balance = {
11
11
  amount: string;
12
12
  decimals: number;
13
- usdValue: string | null;
13
+ usdValue: string;
14
14
  };
15
15
 
16
16
  export type Blockchain = string;
@@ -24,4 +24,8 @@ export type TokensBalance = {
24
24
  [key: TokenHash]: Balance;
25
25
  };
26
26
 
27
- export type WalletInfoWithExtra = WalletInfo;
27
+ export type WalletInfoWithExtra = WalletInfo & {
28
+ namespaces?: Namespace[];
29
+ singleNamespace?: boolean;
30
+ needsDerivationPath?: boolean;
31
+ };