@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.
- package/dist/components/ConfirmSwapErrors.d.ts +1 -1
- package/dist/components/ConfirmSwapErrors.d.ts.map +1 -1
- package/dist/components/ConfirmSwapWarnings.d.ts +1 -2
- package/dist/components/ConfirmSwapWarnings.d.ts.map +1 -1
- package/dist/components/warnings/BalanceErrors.d.ts +7 -0
- package/dist/components/warnings/BalanceErrors.d.ts.map +1 -0
- package/dist/pages/ConfirmSwapPage.d.ts.map +1 -1
- package/dist/pages/Home.d.ts.map +1 -1
- package/dist/pages/SwapDetailsPage.d.ts.map +1 -1
- package/dist/store/bestRoute.d.ts.map +1 -1
- package/dist/types/routing.d.ts +8 -8
- package/dist/types/routing.d.ts.map +1 -1
- package/dist/utils/numbers.d.ts +1 -0
- package/dist/utils/numbers.d.ts.map +1 -1
- package/dist/utils/routing.d.ts +4 -4
- package/dist/utils/routing.d.ts.map +1 -1
- package/dist/utils/time.d.ts.map +1 -1
- package/dist/widget-embedded.cjs.development.js +283 -261
- package/dist/widget-embedded.cjs.development.js.map +1 -1
- package/dist/widget-embedded.cjs.production.min.js +283 -261
- package/dist/widget-embedded.cjs.production.min.js.map +1 -1
- package/dist/widget-embedded.esm.js +283 -261
- package/dist/widget-embedded.esm.js.map +1 -1
- package/package.json +2 -2
- package/src/components/ConfirmSwapErrors.tsx +8 -16
- package/src/components/ConfirmSwapWarnings.tsx +5 -15
- package/src/components/warnings/BalanceErrors.tsx +45 -0
- package/src/hooks/useConfirmSwap.ts +2 -2
- package/src/pages/ConfirmSwapPage.tsx +3 -1
- package/src/pages/Home.tsx +6 -8
- package/src/pages/SwapDetailsPage.tsx +7 -13
- package/src/pages/WalletsPage.tsx +1 -1
- package/src/store/bestRoute.ts +5 -3
- package/src/types/routing.ts +4 -4
- package/src/utils/numbers.ts +4 -0
- package/src/utils/routing.ts +31 -11
- package/src/utils/time.ts +2 -8
- package/dist/components/warnings/BalanceWarnings.d.ts +0 -7
- package/dist/components/warnings/BalanceWarnings.d.ts.map +0 -1
- 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
|
|
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
|
|
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 ||
|
|
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: "
|
|
1744
|
-
}, fromAmountRangeError
|
|
1745
|
-
variant: "
|
|
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.
|
|
2098
|
-
type:
|
|
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
|
|
2219
|
+
function BalanceErrors(_ref) {
|
|
2217
2220
|
let {
|
|
2218
2221
|
messages
|
|
2219
2222
|
} = _ref;
|
|
2220
2223
|
const showListStyle = messages.length > 1;
|
|
2221
|
-
return React.createElement(
|
|
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: "
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 ?
|
|
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
|
-
|
|
2843
|
-
|
|
2844
|
-
|
|
2845
|
-
|
|
2846
|
-
|
|
2847
|
-
|
|
2848
|
-
|
|
2849
|
-
|
|
2850
|
-
|
|
2851
|
-
|
|
2852
|
-
|
|
2853
|
-
|
|
2854
|
-
|
|
2855
|
-
|
|
2856
|
-
|
|
2857
|
-
|
|
2858
|
-
|
|
2859
|
-
|
|
2860
|
-
|
|
2861
|
-
|
|
2862
|
-
|
|
2863
|
-
|
|
2864
|
-
|
|
2865
|
-
|
|
2866
|
-
|
|
2867
|
-
|
|
2868
|
-
|
|
2869
|
-
|
|
2870
|
-
|
|
2871
|
-
|
|
2872
|
-
|
|
2873
|
-
|
|
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,
|