@lifi/widget 1.17.0 → 1.17.2

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 (77) hide show
  1. package/AppDrawer.d.ts +3 -3
  2. package/cjs/AppDrawer.d.ts +3 -3
  3. package/cjs/components/ChainSelect/ChainSelect.d.ts +0 -1
  4. package/cjs/components/Header/useHeaderActionStore.js +1 -4
  5. package/cjs/components/Step/CircularProgress.d.ts +0 -1
  6. package/cjs/components/SwapButton/ButtonTooltip.d.ts +0 -1
  7. package/cjs/components/SwapInput/SwapInputAdornment.d.ts +0 -1
  8. package/cjs/components/TokenList/TokenList.js +4 -1
  9. package/cjs/config/sentry.js +3 -26
  10. package/cjs/config/version.d.ts +1 -1
  11. package/cjs/config/version.js +1 -1
  12. package/cjs/hooks/useGasSufficiency.js +18 -38
  13. package/cjs/hooks/useRouteExecution.js +22 -9
  14. package/cjs/hooks/useSwapRoutes.js +1 -4
  15. package/cjs/hooks/useTelemetry.js +3 -2
  16. package/cjs/hooks/useTokenBalances.d.ts +1 -1
  17. package/cjs/hooks/useTokenBalances.js +3 -1
  18. package/cjs/hooks/useWidgetEvents.d.ts +3 -3
  19. package/cjs/hooks/useWidgetEvents.js +3 -6
  20. package/cjs/i18n/index.js +2 -5
  21. package/cjs/index.d.ts +2 -1
  22. package/cjs/pages/ActiveSwapsPage/ActiveSwapsPage.d.ts +0 -1
  23. package/cjs/pages/SelectTokenPage/SearchTokenInput.d.ts +0 -1
  24. package/cjs/pages/SelectWalletPage/SelectWalletPage.d.ts +0 -1
  25. package/cjs/pages/SettingsPage/AdvancedPreferences.d.ts +0 -1
  26. package/cjs/pages/SettingsPage/EnabledBridgesSelect.js +1 -4
  27. package/cjs/pages/SettingsPage/EnabledExchangesSelect.js +1 -4
  28. package/cjs/pages/SettingsPage/GasPriceSelect.d.ts +0 -1
  29. package/cjs/pages/SettingsPage/SettingsPage.d.ts +0 -1
  30. package/cjs/pages/SettingsPage/ShowDestinationWallet.d.ts +0 -1
  31. package/cjs/pages/SettingsPage/SlippageInput.d.ts +0 -1
  32. package/cjs/pages/SwapDetailsPage/SwapDetailsPage.js +1 -4
  33. package/cjs/pages/SwapRoutesPage/SwapRoutesPage.js +2 -4
  34. package/cjs/providers/SDKProvider/SDKProvider.js +1 -4
  35. package/cjs/stores/chains/useChainOrder.js +1 -4
  36. package/cjs/stores/chains/useChainOrderStore.js +1 -4
  37. package/cjs/stores/route/useExecutingRoutesIds.js +1 -4
  38. package/cjs/stores/route/useRouteStore.js +1 -4
  39. package/cjs/stores/route/useSwapHistory.js +1 -4
  40. package/cjs/stores/route/utils.d.ts +2 -1
  41. package/cjs/stores/route/utils.js +14 -1
  42. package/cjs/stores/settings/useAppearance.js +1 -4
  43. package/cjs/stores/settings/useSettings.js +1 -4
  44. package/cjs/stores/settings/useSettingsStore.js +1 -4
  45. package/cjs/types/events.d.ts +15 -3
  46. package/cjs/types/events.js +4 -3
  47. package/cjs/utils/format.js +1 -4
  48. package/components/ChainSelect/ChainSelect.d.ts +0 -1
  49. package/components/Step/CircularProgress.d.ts +0 -1
  50. package/components/SwapButton/ButtonTooltip.d.ts +0 -1
  51. package/components/SwapInput/SwapInputAdornment.d.ts +0 -1
  52. package/components/TokenList/TokenList.js +4 -1
  53. package/config/version.d.ts +1 -1
  54. package/config/version.js +1 -1
  55. package/hooks/useGasSufficiency.js +19 -36
  56. package/hooks/useRouteExecution.js +22 -6
  57. package/hooks/useTelemetry.js +3 -2
  58. package/hooks/useTokenBalances.d.ts +1 -1
  59. package/hooks/useTokenBalances.js +3 -1
  60. package/hooks/useWidgetEvents.d.ts +3 -3
  61. package/hooks/useWidgetEvents.js +2 -2
  62. package/index.d.ts +2 -1
  63. package/package.json +10 -9
  64. package/pages/ActiveSwapsPage/ActiveSwapsPage.d.ts +0 -1
  65. package/pages/SelectTokenPage/SearchTokenInput.d.ts +0 -1
  66. package/pages/SelectWalletPage/SelectWalletPage.d.ts +0 -1
  67. package/pages/SettingsPage/AdvancedPreferences.d.ts +0 -1
  68. package/pages/SettingsPage/GasPriceSelect.d.ts +0 -1
  69. package/pages/SettingsPage/SettingsPage.d.ts +0 -1
  70. package/pages/SettingsPage/ShowDestinationWallet.d.ts +0 -1
  71. package/pages/SettingsPage/SlippageInput.d.ts +0 -1
  72. package/pages/SwapRoutesPage/SwapRoutesPage.js +3 -5
  73. package/stores/route/utils.d.ts +2 -1
  74. package/stores/route/utils.js +12 -0
  75. package/tsconfig.cjs.tsbuildinfo +1 -1
  76. package/types/events.d.ts +15 -3
  77. package/types/events.js +4 -3
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SwapRoutesPage = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
- const react_router_dom_1 = require("react-router-dom");
7
6
  const Header_1 = require("../../components/Header");
8
7
  const ProgressToNextUpdate_1 = require("../../components/ProgressToNextUpdate");
9
8
  const SwapRouteCard_1 = require("../../components/SwapRouteCard");
@@ -12,8 +11,7 @@ const stores_1 = require("../../stores");
12
11
  const utils_1 = require("../../utils");
13
12
  const SwapRoutesPage_style_1 = require("./SwapRoutesPage.style");
14
13
  const SwapRoutesPage = () => {
15
- const navigate = (0, react_router_dom_1.useNavigate)();
16
- const { pathname } = (0, react_router_dom_1.useLocation)();
14
+ const { navigateBack, navigate } = (0, hooks_1.useNavigateBack)();
17
15
  const { routes: swapRoutes, isLoading, isFetching, dataUpdatedAt, refetchTime, refetch, } = (0, hooks_1.useSwapRoutes)();
18
16
  const setExecutableRoute = (0, stores_1.useSetExecutableRoute)();
19
17
  const handleRouteClick = (route) => {
@@ -24,7 +22,7 @@ const SwapRoutesPage = () => {
24
22
  };
25
23
  (0, react_1.useEffect)(() => {
26
24
  if (!(swapRoutes === null || swapRoutes === void 0 ? void 0 : swapRoutes.length) && !isLoading && !isFetching) {
27
- navigate(pathname.substring(0, pathname.lastIndexOf('/')));
25
+ navigateBack();
28
26
  }
29
27
  // redirect to the home page if no routes are found on page reload
30
28
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -1,11 +1,8 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.SDKProvider = exports.useLiFi = void 0;
7
4
  const jsx_runtime_1 = require("react/jsx-runtime");
8
- const sdk_1 = __importDefault(require("@lifi/sdk"));
5
+ const sdk_1 = require("@lifi/sdk");
9
6
  const react_1 = require("react");
10
7
  const WidgetProvider_1 = require("../WidgetProvider");
11
8
  let lifi;
@@ -1,10 +1,7 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.useChainOrder = void 0;
7
- const shallow_1 = __importDefault(require("zustand/shallow"));
4
+ const shallow_1 = require("zustand/shallow");
8
5
  const useChainOrderStore_1 = require("./useChainOrderStore");
9
6
  const useChainOrder = () => {
10
7
  return (0, useChainOrderStore_1.useChainOrderStore)((state) => [state.chainOrder, state.setChain], shallow_1.default);
@@ -1,11 +1,8 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.useChainOrderStore = exports.maxChainToOrder = void 0;
7
4
  /* eslint-disable no-underscore-dangle */
8
- const zustand_1 = __importDefault(require("zustand"));
5
+ const zustand_1 = require("zustand");
9
6
  const middleware_1 = require("zustand/middleware");
10
7
  const immer_1 = require("zustand/middleware/immer");
11
8
  exports.maxChainToOrder = 9;
@@ -1,10 +1,7 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.useExecutingRoutesIds = void 0;
7
- const shallow_1 = __importDefault(require("zustand/shallow"));
4
+ const shallow_1 = require("zustand/shallow");
8
5
  const useRouteStore_1 = require("./useRouteStore");
9
6
  const useExecutingRoutesIds = (address) => {
10
7
  return (0, useRouteStore_1.useRouteStore)((state) => Object.values(state.routes)
@@ -1,10 +1,7 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.useRouteStore = void 0;
7
- const zustand_1 = __importDefault(require("zustand"));
4
+ const zustand_1 = require("zustand");
8
5
  const middleware_1 = require("zustand/middleware");
9
6
  const immer_1 = require("zustand/middleware/immer");
10
7
  const utils_1 = require("./utils");
@@ -1,10 +1,7 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.useSwapHistory = void 0;
7
- const shallow_1 = __importDefault(require("zustand/shallow"));
4
+ const shallow_1 = require("zustand/shallow");
8
5
  const useRouteStore_1 = require("./useRouteStore");
9
6
  const useSwapHistory = (address) => {
10
7
  return (0, useRouteStore_1.useRouteStore)((state) => Object.values(state.routes)
@@ -1,4 +1,5 @@
1
- import type { Route } from '@lifi/sdk';
1
+ import type { Process, Route } from '@lifi/sdk';
2
2
  export declare const isRouteCompleted: (route: Route) => boolean;
3
3
  export declare const isRouteFailed: (route: Route) => boolean;
4
4
  export declare const isRouteActive: (route?: Route) => boolean;
5
+ export declare const getUpdatedProcess: (currentRoute: Route, updatedRoute: Route) => Process | undefined;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isRouteActive = exports.isRouteFailed = exports.isRouteCompleted = void 0;
3
+ exports.getUpdatedProcess = exports.isRouteActive = exports.isRouteFailed = exports.isRouteCompleted = void 0;
4
+ const microdiff_1 = require("microdiff");
4
5
  const isRouteCompleted = (route) => {
5
6
  return route.steps.every((step) => { var _a; return ((_a = step.execution) === null || _a === void 0 ? void 0 : _a.status) === 'DONE'; });
6
7
  };
@@ -19,3 +20,15 @@ const isRouteActive = (route) => {
19
20
  return !isDone && !isFailed && alreadyStarted;
20
21
  };
21
22
  exports.isRouteActive = isRouteActive;
23
+ const getUpdatedProcess = (currentRoute, updatedRoute) => {
24
+ const processDiff = (0, microdiff_1.default)(currentRoute, updatedRoute).find((diff) => diff.path.includes('process'));
25
+ if (!processDiff) {
26
+ return undefined;
27
+ }
28
+ // e.g. ['steps', 0, 'execution', 'process', 0]
29
+ const process = processDiff.path
30
+ .slice(0, processDiff.path.findIndex((path) => path === 'process') + 2)
31
+ .reduce((obj, path) => obj[path], updatedRoute);
32
+ return process;
33
+ };
34
+ exports.getUpdatedProcess = getUpdatedProcess;
@@ -1,10 +1,7 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.useAppearance = void 0;
7
- const shallow_1 = __importDefault(require("zustand/shallow"));
4
+ const shallow_1 = require("zustand/shallow");
8
5
  const useSettingsStore_1 = require("./useSettingsStore");
9
6
  const useAppearance = () => {
10
7
  const [appearance, setValue] = (0, useSettingsStore_1.useSettingsStore)((state) => [state.appearance, state.setValue], shallow_1.default);
@@ -1,10 +1,7 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.useSettings = void 0;
7
- const shallow_1 = __importDefault(require("zustand/shallow"));
4
+ const shallow_1 = require("zustand/shallow");
8
5
  const useSettingsStore_1 = require("./useSettingsStore");
9
6
  const useSettings = (keys) => {
10
7
  return (0, useSettingsStore_1.useSettingsStore)((state) => keys.reduce((values, key) => {
@@ -10,13 +10,10 @@ var __rest = (this && this.__rest) || function (s, e) {
10
10
  }
11
11
  return t;
12
12
  };
13
- var __importDefault = (this && this.__importDefault) || function (mod) {
14
- return (mod && mod.__esModule) ? mod : { "default": mod };
15
- };
16
13
  Object.defineProperty(exports, "__esModule", { value: true });
17
14
  exports.useSettingsStore = void 0;
18
15
  /* eslint-disable no-underscore-dangle */
19
- const zustand_1 = __importDefault(require("zustand"));
16
+ const zustand_1 = require("zustand");
20
17
  const middleware_1 = require("zustand/middleware");
21
18
  const immer_1 = require("zustand/middleware/immer");
22
19
  const types_1 = require("./types");
@@ -1,5 +1,17 @@
1
+ import type { Process, Route } from '@lifi/sdk';
1
2
  export declare enum WidgetEvent {
2
- SwapStarted = "swapStarted",
3
- SwapCompleted = "swapCompleted",
4
- SwapFailed = "swapFailed"
3
+ RouteExecutionStarted = "routeExecutionStarted",
4
+ RouteExecutionUpdated = "routeExecutionUpdated",
5
+ RouteExecutionCompleted = "routeExecutionCompleted",
6
+ RouteExecutionFailed = "routeExecutionFailed"
7
+ }
8
+ export declare type WidgetEvents = {
9
+ routeExecutionStarted: Route;
10
+ routeExecutionUpdated: RouteExecutionUpdate;
11
+ routeExecutionCompleted: Route;
12
+ routeExecutionFailed: RouteExecutionUpdate;
13
+ };
14
+ export interface RouteExecutionUpdate {
15
+ route: Route;
16
+ process: Process;
5
17
  }
@@ -3,7 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.WidgetEvent = void 0;
4
4
  var WidgetEvent;
5
5
  (function (WidgetEvent) {
6
- WidgetEvent["SwapStarted"] = "swapStarted";
7
- WidgetEvent["SwapCompleted"] = "swapCompleted";
8
- WidgetEvent["SwapFailed"] = "swapFailed";
6
+ WidgetEvent["RouteExecutionStarted"] = "routeExecutionStarted";
7
+ WidgetEvent["RouteExecutionUpdated"] = "routeExecutionUpdated";
8
+ WidgetEvent["RouteExecutionCompleted"] = "routeExecutionCompleted";
9
+ WidgetEvent["RouteExecutionFailed"] = "routeExecutionFailed";
9
10
  })(WidgetEvent = exports.WidgetEvent || (exports.WidgetEvent = {}));
@@ -1,10 +1,7 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.formatTokenPrice = exports.formatAmount = exports.formatSlippage = exports.formatTokenAmount = void 0;
7
- const big_js_1 = __importDefault(require("big.js"));
4
+ const big_js_1 = require("big.js");
8
5
  // JavaScript numbers use exponential notation for positive exponents of 21 and above. We need more.
9
6
  big_js_1.default.PE = 42;
10
7
  // JavaScript numbers use exponential notation for negative exponents of -7 and below. We need more.
@@ -1,3 +1,2 @@
1
- /// <reference types="react" />
2
1
  import type { SwapFormTypeProps } from '../../providers';
3
2
  export declare const ChainSelect: ({ formType }: SwapFormTypeProps) => JSX.Element;
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  import type { Status } from '@lifi/sdk';
3
2
  export declare function CircularProgress({ status }: {
4
3
  status: Status;
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  export declare const ButtonTooltip: ({ title, children, }: {
3
2
  title?: string | undefined;
4
3
  children: JSX.Element;
@@ -1,3 +1,2 @@
1
- /// <reference types="react" />
2
1
  import type { SwapFormTypeProps } from '../../providers';
3
2
  export declare const SwapInputAdornment: ({ formType }: SwapFormTypeProps) => JSX.Element;
@@ -23,7 +23,10 @@ export const TokenList = ({ formType, height, onClick, }) => {
23
23
  token.symbol.toUpperCase().includes(searchFilter) ||
24
24
  token.address.toUpperCase().includes(searchFilter))
25
25
  : filteredTokens;
26
- const tokenSearchEnabled = !filteredTokens.length && !isTokensLoading;
26
+ const tokenSearchEnabled = !isTokensLoading &&
27
+ !!filteredTokens.length &&
28
+ !!tokenSearchFilter &&
29
+ !!selectedChainId;
27
30
  const { token: searchedToken, isLoading: isSearchedTokenLoading } = useTokenSearch(tokenSearchFilter, selectedChainId, tokenSearchEnabled);
28
31
  const isLoading = isTokensLoading || (tokenSearchEnabled && isSearchedTokenLoading);
29
32
  const tokens = filteredTokens.length
@@ -1,2 +1,2 @@
1
1
  export declare const name = "@lifi/widget";
2
- export declare const version = "1.17.0";
2
+ export declare const version = "1.17.2";
package/config/version.js CHANGED
@@ -1,2 +1,2 @@
1
1
  export const name = '@lifi/widget';
2
- export const version = '1.17.0';
2
+ export const version = '1.17.2';
@@ -9,27 +9,19 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  };
10
10
  import Big from 'big.js';
11
11
  import { useCallback, useEffect, useMemo, useState } from 'react';
12
- import { useWatch } from 'react-hook-form';
13
- import { useChains, useDebouncedWatch } from '.';
14
- import { SwapFormKey, SwapFormKeyHelper, useLiFi, useWallet, } from '../providers';
12
+ import { useChains } from '.';
13
+ import { useLiFi, useWallet } from '../providers';
15
14
  import { useTokenBalances } from './useTokenBalances';
16
15
  export const useGasSufficiency = (route) => {
17
16
  const lifi = useLiFi();
18
17
  const { account } = useWallet();
19
- const [fromChainId, toChainId, fromToken] = useWatch({
20
- name: [
21
- SwapFormKeyHelper.getChainKey('from'),
22
- SwapFormKeyHelper.getChainKey('to'),
23
- SwapFormKey.FromToken,
24
- ],
25
- });
26
- const fromAmount = useDebouncedWatch(SwapFormKey.FromAmount, 250);
27
18
  const { getChainById } = useChains();
28
- const { tokensWithBalance: fromChainTokenBalances } = useTokenBalances(fromChainId);
19
+ const { tokensWithBalance: fromChainTokenBalances } = useTokenBalances(route === null || route === void 0 ? void 0 : route.fromChainId);
29
20
  const [insufficientGas, setInsufficientGas] = useState();
30
21
  const checkInsufficientGas = useCallback(() => __awaiter(void 0, void 0, void 0, function* () {
31
- var _a;
32
- if (!account.isActive || !route || !fromAmount) {
22
+ var _a, _b;
23
+ if (!account.isActive || !route) {
24
+ setInsufficientGas(undefined);
33
25
  return;
34
26
  }
35
27
  const gasCosts = route.steps.reduce((groupedGasCosts, step) => {
@@ -52,18 +44,19 @@ export const useGasSufficiency = (route) => {
52
44
  }
53
45
  return groupedGasCosts;
54
46
  }, {});
55
- if (gasCosts[fromChainId] &&
56
- route.fromToken.address === gasCosts[fromChainId].token.address) {
57
- gasCosts[fromChainId].tokenAmount = (_a = gasCosts[fromChainId]) === null || _a === void 0 ? void 0 : _a.gasAmount.plus(Big(fromAmount));
47
+ if (route.fromToken.address === ((_a = gasCosts[route.fromChainId]) === null || _a === void 0 ? void 0 : _a.token.address)) {
48
+ gasCosts[route.fromChainId].tokenAmount = (_b = gasCosts[route.fromChainId]) === null || _b === void 0 ? void 0 : _b.gasAmount.plus(Big(route.fromAmount).div(Math.pow(10, route.fromToken.decimals)));
58
49
  }
59
50
  const tokenBalances = yield lifi.getTokenBalances(account.address, Object.values(gasCosts).map((item) => item.token));
60
51
  if (!(tokenBalances === null || tokenBalances === void 0 ? void 0 : tokenBalances.length)) {
52
+ setInsufficientGas(undefined);
61
53
  return;
62
54
  }
63
- [fromChainId, toChainId].forEach((chainId) => {
55
+ [route.fromChainId, route.toChainId].forEach((chainId) => {
64
56
  var _a, _b, _c, _d, _e, _f;
65
57
  if (gasCosts[chainId]) {
66
- const gasTokenBalance = Big((_b = (_a = tokenBalances === null || tokenBalances === void 0 ? void 0 : tokenBalances.find((t) => t.address === gasCosts[chainId].token.address)) === null || _a === void 0 ? void 0 : _a.amount) !== null && _b !== void 0 ? _b : 0);
58
+ const gasTokenBalance = Big((_b = (_a = tokenBalances === null || tokenBalances === void 0 ? void 0 : tokenBalances.find((t) => t.chainId === gasCosts[chainId].token.chainId &&
59
+ t.address === gasCosts[chainId].token.address)) === null || _a === void 0 ? void 0 : _a.amount) !== null && _b !== void 0 ? _b : 0);
67
60
  const insufficientFromChainGas = gasTokenBalance.lte(0) ||
68
61
  gasTokenBalance.lt((_c = gasCosts[chainId].gasAmount) !== null && _c !== void 0 ? _c : Big(0)) ||
69
62
  gasTokenBalance.lt((_d = gasCosts[chainId].tokenAmount) !== null && _d !== void 0 ? _d : Big(0));
@@ -75,27 +68,17 @@ export const useGasSufficiency = (route) => {
75
68
  });
76
69
  const gasCostResult = Object.values(gasCosts).filter((gasCost) => gasCost.insufficient);
77
70
  setInsufficientGas(gasCostResult);
78
- }), [
79
- account.address,
80
- account.isActive,
81
- fromAmount,
82
- fromChainId,
83
- getChainById,
84
- lifi,
85
- route,
86
- toChainId,
87
- ]);
71
+ }), [account.address, account.isActive, getChainById, lifi, route]);
88
72
  const insufficientFunds = useMemo(() => {
89
73
  var _a, _b;
90
- if (!account.isActive ||
91
- !fromToken ||
92
- !fromAmount ||
93
- !fromChainTokenBalances) {
74
+ if (!account.isActive || !fromChainTokenBalances || !route) {
94
75
  return false;
95
76
  }
96
- const balance = Big((_b = (_a = fromChainTokenBalances === null || fromChainTokenBalances === void 0 ? void 0 : fromChainTokenBalances.find((t) => t.address === fromToken)) === null || _a === void 0 ? void 0 : _a.amount) !== null && _b !== void 0 ? _b : 0);
97
- return Big(fromAmount).gt(balance);
98
- }, [account.isActive, fromAmount, fromChainTokenBalances, fromToken]);
77
+ const balance = Big((_b = (_a = fromChainTokenBalances === null || fromChainTokenBalances === void 0 ? void 0 : fromChainTokenBalances.find((t) => t.address === (route === null || route === void 0 ? void 0 : route.fromToken.address))) === null || _a === void 0 ? void 0 : _a.amount) !== null && _b !== void 0 ? _b : 0);
78
+ return Big(route.fromAmount)
79
+ .div(Math.pow(10, route.fromToken.decimals))
80
+ .gt(balance);
81
+ }, [account.isActive, fromChainTokenBalances, route]);
99
82
  useEffect(() => {
100
83
  checkInsufficientGas();
101
84
  }, [checkInsufficientGas]);
@@ -11,7 +11,7 @@ import { useMutation } from '@tanstack/react-query';
11
11
  import { useCallback, useEffect, useRef } from 'react';
12
12
  import shallow from 'zustand/shallow';
13
13
  import { useLiFi, useWallet } from '../providers';
14
- import { isRouteActive, isRouteCompleted, isRouteFailed, useRouteStore, } from '../stores';
14
+ import { getUpdatedProcess, isRouteActive, isRouteCompleted, isRouteFailed, useRouteStore, } from '../stores';
15
15
  import { WidgetEvent } from '../types/events';
16
16
  import { deepClone } from '../utils';
17
17
  import { useWidgetEvents } from './useWidgetEvents';
@@ -23,15 +23,29 @@ export const useRouteExecution = (routeId, executeInBackground) => {
23
23
  const routeExecution = useRouteStore((state) => state.routes[routeId]);
24
24
  const [updateRoute, restartRoute, deleteRoute] = useRouteStore((state) => [state.updateRoute, state.restartRoute, state.deleteRoute], shallow);
25
25
  const updateCallback = (updatedRoute) => {
26
+ const routeExecution = useRouteStore.getState().routes[updatedRoute.id];
27
+ if (!routeExecution) {
28
+ return;
29
+ }
26
30
  const clonedUpdatedRoute = deepClone(updatedRoute);
27
- console.log('Route updated.', clonedUpdatedRoute);
28
31
  updateRoute(clonedUpdatedRoute);
32
+ const process = getUpdatedProcess(routeExecution.route, clonedUpdatedRoute);
33
+ if (process) {
34
+ emitter.emit(WidgetEvent.RouteExecutionUpdated, {
35
+ route: clonedUpdatedRoute,
36
+ process,
37
+ });
38
+ }
29
39
  if (isRouteCompleted(clonedUpdatedRoute)) {
30
- emitter.emit(WidgetEvent.SwapCompleted);
40
+ emitter.emit(WidgetEvent.RouteExecutionCompleted, clonedUpdatedRoute);
31
41
  }
32
- if (isRouteFailed(clonedUpdatedRoute)) {
33
- emitter.emit(WidgetEvent.SwapFailed);
42
+ if (isRouteFailed(clonedUpdatedRoute) && process) {
43
+ emitter.emit(WidgetEvent.RouteExecutionFailed, {
44
+ route: clonedUpdatedRoute,
45
+ process,
46
+ });
34
47
  }
48
+ console.log('Route updated.', clonedUpdatedRoute);
35
49
  };
36
50
  const switchChainHook = (requiredChainId) => __awaiter(void 0, void 0, void 0, function* () {
37
51
  if (!account.isActive || !account.signer) {
@@ -62,7 +76,9 @@ export const useRouteExecution = (routeId, executeInBackground) => {
62
76
  }, {
63
77
  onMutate: () => {
64
78
  console.log('Execution started.', routeId);
65
- emitter.emit(WidgetEvent.SwapStarted);
79
+ if (routeExecution) {
80
+ emitter.emit(WidgetEvent.RouteExecutionStarted, routeExecution.route);
81
+ }
66
82
  },
67
83
  });
68
84
  const resumeRouteMutation = useMutation((resumedRoute) => {
@@ -1,11 +1,12 @@
1
1
  /* eslint-disable consistent-return */
2
2
  import { useEffect } from 'react';
3
3
  import { initSentry } from '../config/sentry';
4
+ import { name } from '../config/version';
4
5
  export const useTelemetry = (disabled) => {
5
6
  useEffect(() => {
6
7
  if (disabled) {
7
- if (process.env.NODE_ENV === 'production') {
8
- console.warn('Enable crash reports and diagnostic data to be collected. This helps us to better understand how the widget is performing and where improvements need to be made.');
8
+ if (process.env.NODE_ENV === 'development') {
9
+ console.warn(`[${name}] Enable crash reports and diagnostic data to be collected. This helps us to better understand how the widget is performing and where improvements need to be made.`);
9
10
  }
10
11
  }
11
12
  else {
@@ -1,5 +1,5 @@
1
1
  import type { Token } from '../types';
2
- export declare const useTokenBalances: (selectedChainId: number) => {
2
+ export declare const useTokenBalances: (selectedChainId?: number) => {
3
3
  tokens: Token[] | undefined;
4
4
  tokensWithBalance: Token[] | undefined;
5
5
  featuredTokens: import("@lifi/types").Token[];
@@ -22,7 +22,9 @@ export const useTokenBalances = (selectedChainId) => {
22
22
  const featuredTokens = useFeaturedTokens(selectedChainId);
23
23
  const { tokens, isLoading } = useTokens(selectedChainId);
24
24
  const [refetchInterval, setRefetchInterval] = useState(defaultRefetchInterval);
25
- const isBalanceLoadingEnabled = Boolean(account.address) && Boolean(tokens === null || tokens === void 0 ? void 0 : tokens.length);
25
+ const isBalanceLoadingEnabled = Boolean(account.address) &&
26
+ Boolean(tokens === null || tokens === void 0 ? void 0 : tokens.length) &&
27
+ Boolean(selectedChainId);
26
28
  const { data: tokensWithBalance, isLoading: isBalanceLoading, refetch, } = useQuery(['token-balances', account.address, selectedChainId, tokens === null || tokens === void 0 ? void 0 : tokens.length], ({ queryKey: [, accountAddress] }) => __awaiter(void 0, void 0, void 0, function* () {
27
29
  if (!accountAddress || !tokens) {
28
30
  return;
@@ -1,3 +1,3 @@
1
- /// <reference types="node" />
2
- import { EventEmitter } from 'events';
3
- export declare const useWidgetEvents: () => EventEmitter;
1
+ import type { Emitter } from 'mitt';
2
+ import type { WidgetEvents } from '../types';
3
+ export declare const useWidgetEvents: () => Emitter<WidgetEvents>;
@@ -1,6 +1,6 @@
1
- import { EventEmitter } from 'events';
1
+ import mitt from 'mitt';
2
2
  import create from 'zustand';
3
- const emitterStore = create()(() => new EventEmitter());
3
+ const emitterStore = create()(() => mitt());
4
4
  export const useWidgetEvents = () => {
5
5
  return emitterStore();
6
6
  };
package/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  /// <reference types="react" />
2
2
  import './fonts/inter.css';
3
+ export type { WidgetDrawer, WidgetDrawerProps } from './AppDrawer';
3
4
  export { useWidgetEvents } from './hooks';
4
5
  export * from './types';
5
6
  export declare const LiFiWidget: import("react").FC<import("./AppProvider").AppProps>;
6
- export declare const LiFiWidgetDrawer: import("react").ForwardRefExoticComponent<Pick<import("./AppDrawer").AppDrawerProps, "className" | "style" | "classes" | "slot" | "title" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "id" | "lang" | "placeholder" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "children" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "sx" | "key" | "transitionDuration" | "variant" | "open" | "anchor" | "elementRef" | "components" | "componentsProps" | "BackdropComponent" | "BackdropProps" | "closeAfterTransition" | "container" | "disableAutoFocus" | "disableEnforceFocus" | "disableEscapeKeyDown" | "disablePortal" | "disableRestoreFocus" | "disableScrollLock" | "hideBackdrop" | "keepMounted" | "onBackdropClick" | "onClose" | "config" | "elevation" | "ModalProps" | "PaperProps" | "SlideProps"> & import("react").RefAttributes<import("./AppDrawer").AppDrawerBase>>;
7
+ export declare const LiFiWidgetDrawer: import("react").ForwardRefExoticComponent<Pick<import("./AppDrawer").WidgetDrawerProps, "className" | "style" | "classes" | "slot" | "title" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "id" | "lang" | "placeholder" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "children" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "sx" | "key" | "transitionDuration" | "variant" | "open" | "anchor" | "elementRef" | "components" | "componentsProps" | "BackdropComponent" | "BackdropProps" | "closeAfterTransition" | "container" | "disableAutoFocus" | "disableEnforceFocus" | "disableEscapeKeyDown" | "disablePortal" | "disableRestoreFocus" | "disableScrollLock" | "hideBackdrop" | "keepMounted" | "onBackdropClick" | "onClose" | "config" | "elevation" | "ModalProps" | "PaperProps" | "SlideProps"> & import("react").RefAttributes<import("./AppDrawer").WidgetDrawer>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lifi/widget",
3
- "version": "1.17.0",
3
+ "version": "1.17.2",
4
4
  "description": "LI.FI Widget for cross-chain bridging and swapping. It will drive your multi-chain strategy and attract new users from everywhere.",
5
5
  "main": "./cjs/index.js",
6
6
  "module": "./index.js",
@@ -41,26 +41,27 @@
41
41
  "@emotion/styled": "^11.10.4",
42
42
  "@ethersproject/address": "^5.7.0",
43
43
  "@ethersproject/experimental": "^5.7.0",
44
- "@ethersproject/providers": "^5.7.0",
45
- "@lifi/sdk": "^1.5.0",
46
- "@lifi/wallet-management": "^1.1.9",
44
+ "@ethersproject/providers": "^5.7.1",
45
+ "@lifi/sdk": "^1.6.0",
46
+ "@lifi/wallet-management": "^1.1.10",
47
47
  "@mui/icons-material": "^5.10.3",
48
- "@mui/lab": "^5.0.0-alpha.98",
49
- "@mui/material": "^5.10.4",
48
+ "@mui/lab": "^5.0.0-alpha.99",
49
+ "@mui/material": "^5.10.5",
50
50
  "@sentry/integrations": "^7.12.1",
51
51
  "@sentry/react": "^7.12.1",
52
52
  "@sentry/tracing": "^7.12.1",
53
53
  "@tanstack/react-query": "^4.3.4",
54
- "@tanstack/react-virtual": "^3.0.0-beta.17",
54
+ "@tanstack/react-virtual": "^3.0.0-beta.18",
55
55
  "big.js": "^6.2.1",
56
- "events": "^3.3.0",
57
56
  "i18next": "^21.9.1",
58
57
  "immer": "^9.0.15",
58
+ "microdiff": "^1.3.1",
59
+ "mitt": "^3.0.0",
59
60
  "react": "^18.2.0",
60
61
  "react-dom": "^18.2.0",
61
62
  "react-hook-form": "^7.35.0",
62
63
  "react-i18next": "^11.18.6",
63
- "react-router-dom": "^6.3.0",
64
+ "react-router-dom": "^6.4.0",
64
65
  "react-timer-hook": "^3.0.5",
65
66
  "zustand": "^4.1.1"
66
67
  },
@@ -1,2 +1 @@
1
- /// <reference types="react" />
2
1
  export declare const ActiveSwapsPage: () => JSX.Element;
@@ -1,2 +1 @@
1
- /// <reference types="react" />
2
1
  export declare const SearchTokenInput: () => JSX.Element;
@@ -1,2 +1 @@
1
- /// <reference types="react" />
2
1
  export declare const SelectWalletPage: () => JSX.Element;
@@ -1,2 +1 @@
1
- /// <reference types="react" />
2
1
  export declare const AdvancedPreferences: () => JSX.Element;
@@ -1,2 +1 @@
1
- /// <reference types="react" />
2
1
  export declare const GasPriceSelect: () => JSX.Element;
@@ -1,2 +1 @@
1
- /// <reference types="react" />
2
1
  export declare const SettingsPage: () => JSX.Element;
@@ -1,2 +1 @@
1
- /// <reference types="react" />
2
1
  export declare const ShowDestinationWallet: () => JSX.Element;
@@ -1,2 +1 @@
1
- /// <reference types="react" />
2
1
  export declare const SlippageInput: () => JSX.Element;