@lifi/widget 3.15.2 → 3.16.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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ## [3.16.0](https://github.com/lifinance/widget/compare/v3.15.2...v3.16.0) (2025-02-01)
6
+
7
+
8
+ ### Features
9
+
10
+ * add low activity wallet warning ([fb69217](https://github.com/lifinance/widget/commit/fb692176b87666dd37e18a72b11ad7b43901a6bf))
11
+
5
12
  ### [3.15.2](https://github.com/lifinance/widget/compare/v3.15.1...v3.15.2) (2025-01-31)
6
13
 
7
14
 
@@ -1,2 +1,2 @@
1
1
  export declare const name = "@lifi/widget";
2
- export declare const version = "3.15.2";
2
+ export declare const version = "3.16.0";
@@ -1,3 +1,3 @@
1
1
  export const name = '@lifi/widget';
2
- export const version = '3.15.2';
2
+ export const version = '3.16.0';
3
3
  //# sourceMappingURL=version.js.map
@@ -0,0 +1,8 @@
1
+ interface AddressActivity {
2
+ hasActivity: boolean;
3
+ isLoading: boolean;
4
+ isFetched: boolean;
5
+ toAddress: string | undefined;
6
+ }
7
+ export declare const useAddressActivity: (chainId?: number) => AddressActivity;
8
+ export {};
@@ -0,0 +1,23 @@
1
+ import { isAddress } from 'viem';
2
+ import { useTransactionCount } from 'wagmi';
3
+ import { useFieldValues } from '../stores/form/useFieldValues.js';
4
+ export const useAddressActivity = (chainId) => {
5
+ const [toAddress, toChainId] = useFieldValues('toAddress', 'toChain');
6
+ const destinationChainId = chainId ?? toChainId;
7
+ const { data: transactionCount, isLoading, isFetched, error, } = useTransactionCount({
8
+ address: toAddress,
9
+ chainId: destinationChainId,
10
+ query: {
11
+ enabled: Boolean(toAddress && destinationChainId && isAddress(toAddress)),
12
+ refetchInterval: 300000,
13
+ staleTime: 300000,
14
+ },
15
+ });
16
+ return {
17
+ toAddress,
18
+ hasActivity: Boolean(transactionCount && transactionCount > 0),
19
+ isLoading,
20
+ isFetched: isFetched && !error,
21
+ };
22
+ };
23
+ //# sourceMappingURL=useAddressActivity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAddressActivity.js","sourceRoot":"","sources":["../../../src/hooks/useAddressActivity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AASjE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAAgB,EAAmB,EAAE;IACtE,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,cAAc,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;IAErE,MAAM,kBAAkB,GAAG,OAAO,IAAI,SAAS,CAAA;IAE/C,MAAM,EACJ,IAAI,EAAE,gBAAgB,EACtB,SAAS,EACT,SAAS,EACT,KAAK,GACN,GAAG,mBAAmB,CAAC;QACtB,OAAO,EAAE,SAAoB;QAC7B,OAAO,EAAE,kBAAkB;QAC3B,KAAK,EAAE;YACL,OAAO,EAAE,OAAO,CAAC,SAAS,IAAI,kBAAkB,IAAI,SAAS,CAAC,SAAS,CAAC,CAAC;YACzE,eAAe,EAAE,MAAO;YACxB,SAAS,EAAE,MAAO;SACnB;KACF,CAAC,CAAA;IAEF,OAAO;QACL,SAAS;QACT,WAAW,EAAE,OAAO,CAAC,gBAAgB,IAAI,gBAAgB,GAAG,CAAC,CAAC;QAC9D,SAAS;QACT,SAAS,EAAE,SAAS,IAAI,CAAC,KAAK;KAC/B,CAAA;AACH,CAAC,CAAA"}
@@ -118,6 +118,8 @@
118
118
  "warning": {
119
119
  "message": {
120
120
  "accountNotDeployedMessage": "Smart contract account is not deployed on the destination chain. Sending funds to a non-existent contract would result in permanent loss.",
121
+ "noAddressActivity": "This address has never been used on this network. Please verify you're sending to the correct address to prevent potential loss of funds.",
122
+ "lowAddressActivity": "This address has low activity on {{chainName}} network. Please verify you're sending to the correct address and network to prevent potential loss of funds.",
121
123
  "deleteActiveTransactions": "Active transactions are only stored locally and can't be recovered if you delete them.",
122
124
  "deleteTransactionHistory": "Transaction history is only stored locally and can't be recovered if you delete it.",
123
125
  "fundsLossPrevention": "Always ensure smart contract accounts are properly set up on the destination chain and avoid direct transfers to exchanges to prevent fund loss.",
@@ -135,7 +137,8 @@
135
137
  "highValueLoss": "High value loss",
136
138
  "insufficientGas": "Insufficient gas",
137
139
  "rateChanged": "Rate changed",
138
- "resetSettings": "Reset settings?"
140
+ "resetSettings": "Reset settings?",
141
+ "lowAddressActivity": "Low Activity Address"
139
142
  }
140
143
  },
141
144
  "error": {
@@ -6,7 +6,6 @@ import { useRoutes } from '../../hooks/useRoutes.js';
6
6
  import { useToAddressRequirements } from '../../hooks/useToAddressRequirements.js';
7
7
  import { useWidgetEvents } from '../../hooks/useWidgetEvents.js';
8
8
  import { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js';
9
- import { useFieldValues } from '../../stores/form/useFieldValues.js';
10
9
  import { useSplitSubvariantStore } from '../../stores/settings/useSplitSubvariantStore.js';
11
10
  import { WidgetEvent } from '../../types/events.js';
12
11
  import { navigationRoutes } from '../../utils/navigationRoutes.js';
@@ -16,21 +15,21 @@ export const ReviewButton = () => {
16
15
  const emitter = useWidgetEvents();
17
16
  const { subvariant, subvariantOptions } = useWidgetConfig();
18
17
  const splitState = useSplitSubvariantStore((state) => state.state);
19
- const [toAddress] = useFieldValues('toAddress');
20
- const { requiredToAddress, accountNotDeployedAtDestination } = useToAddressRequirements();
18
+ const { toAddress, requiredToAddress, accountNotDeployedAtDestination } = useToAddressRequirements();
21
19
  const { routes, setReviewableRoute } = useRoutes();
22
20
  const currentRoute = routes?.[0];
23
21
  const handleClick = async () => {
24
- if (currentRoute) {
25
- setReviewableRoute(currentRoute);
26
- navigate(navigationRoutes.transactionExecution, {
27
- state: { routeId: currentRoute.id },
28
- });
29
- emitter.emit(WidgetEvent.RouteSelected, {
30
- route: currentRoute,
31
- routes: routes,
32
- });
22
+ if (!currentRoute) {
23
+ return;
33
24
  }
25
+ setReviewableRoute(currentRoute);
26
+ navigate(navigationRoutes.transactionExecution, {
27
+ state: { routeId: currentRoute.id },
28
+ });
29
+ emitter.emit(WidgetEvent.RouteSelected, {
30
+ route: currentRoute,
31
+ routes: routes,
32
+ });
34
33
  };
35
34
  const getButtonText = () => {
36
35
  if (currentRoute) {
@@ -1 +1 @@
1
- {"version":3,"file":"ReviewButton.js","sourceRoot":"","sources":["../../../../src/pages/MainPage/ReviewButton.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ReviewButton.js","sourceRoot":"","sources":["../../../../src/pages/MainPage/ReviewButton.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { BottomSheetBase } from '../../components/BottomSheet/types.js';
2
+ interface ConfirmToAddressSheetProps {
3
+ onContinue: () => void;
4
+ toAddress: string;
5
+ toChainId: number;
6
+ }
7
+ export declare const ConfirmToAddressSheet: import("react").ForwardRefExoticComponent<ConfirmToAddressSheetProps & import("react").RefAttributes<BottomSheetBase>>;
8
+ export {};
@@ -0,0 +1,35 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Wallet, WarningRounded } from '@mui/icons-material';
3
+ import { Button, Typography } from '@mui/material';
4
+ import { forwardRef } from 'react';
5
+ import { useTranslation } from 'react-i18next';
6
+ import { BottomSheet } from '../../components/BottomSheet/BottomSheet.js';
7
+ import { AlertMessage } from '../../components/Messages/AlertMessage.js';
8
+ import { useChain } from '../../hooks/useChain.js';
9
+ import { useWidgetEvents } from '../../hooks/useWidgetEvents.js';
10
+ import { WidgetEvent } from '../../types/events.js';
11
+ import { IconContainer, SendToWalletButtonRow, SendToWalletSheetContainer, SheetAddressContainer, } from '../SendToWallet/SendToWalletPage.style.js';
12
+ export const ConfirmToAddressSheet = forwardRef((props, ref) => {
13
+ const handleClose = () => {
14
+ ;
15
+ ref.current?.close();
16
+ };
17
+ return (_jsx(BottomSheet, { ref: ref, children: _jsx(ConfirmToAddressSheetContent, { ...props, onClose: handleClose }) }));
18
+ });
19
+ const ConfirmToAddressSheetContent = ({ onContinue, onClose, toAddress, toChainId }) => {
20
+ const { t } = useTranslation();
21
+ const { chain } = useChain(toChainId);
22
+ const emitter = useWidgetEvents();
23
+ const handleContinue = () => {
24
+ emitter.emit(WidgetEvent.LowAddressActivityConfirmed, {
25
+ address: toAddress,
26
+ chainId: toChainId,
27
+ });
28
+ onClose();
29
+ onContinue();
30
+ };
31
+ return (_jsxs(SendToWalletSheetContainer, { children: [_jsx(IconContainer, { children: _jsx(Wallet, { sx: { fontSize: 40 } }) }), _jsx(Typography, { variant: "h6", sx: { textAlign: 'center', mb: 2 }, children: t('warning.title.lowAddressActivity') }), _jsx(SheetAddressContainer, { children: _jsx(Typography, { children: toAddress }) }), _jsx(AlertMessage, { severity: "warning", title: _jsx(Typography, { variant: "body2", sx: { color: 'text.primary' }, children: t('warning.message.lowAddressActivity', {
32
+ chainName: chain?.name,
33
+ }) }), icon: _jsx(WarningRounded, {}), multiline: true }), _jsxs(SendToWalletButtonRow, { children: [_jsx(Button, { variant: "text", onClick: onClose, fullWidth: true, children: t('button.cancel') }), _jsx(Button, { variant: "contained", onClick: handleContinue, fullWidth: true, children: t('button.continue') })] })] }));
34
+ };
35
+ //# sourceMappingURL=ConfirmToAddressSheet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfirmToAddressSheet.js","sourceRoot":"","sources":["../../../../src/pages/TransactionPage/ConfirmToAddressSheet.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAElD,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,6CAA6C,CAAA;AAEzE,OAAO,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAA;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,2CAA2C,CAAA;AAYlD,MAAM,CAAC,MAAM,qBAAqB,GAAG,UAAU,CAG7C,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACf,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,CAAC;QAAC,GAAyC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAA;IAC9D,CAAC,CAAA;IAED,OAAO,CACL,KAAC,WAAW,IAAC,GAAG,EAAE,GAAG,YACnB,KAAC,4BAA4B,OAAK,KAAK,EAAE,OAAO,EAAE,WAAW,GAAI,GACrD,CACf,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,MAAM,4BAA4B,GAE9B,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE;IACpD,MAAM,EAAE,CAAC,EAAE,GAAG,cAAc,EAAE,CAAA;IAC9B,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAA;IACrC,MAAM,OAAO,GAAG,eAAe,EAAE,CAAA;IAEjC,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,2BAA2B,EAAE;YACpD,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,SAAS;SACnB,CAAC,CAAA;QACF,OAAO,EAAE,CAAA;QACT,UAAU,EAAE,CAAA;IACd,CAAC,CAAA;IAED,OAAO,CACL,MAAC,0BAA0B,eACzB,KAAC,aAAa,cACZ,KAAC,MAAM,IAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAI,GAClB,EAChB,KAAC,UAAU,IAAC,OAAO,EAAC,IAAI,EAAC,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,EAAE,YACxD,CAAC,CAAC,kCAAkC,CAAC,GAC3B,EACb,KAAC,qBAAqB,cACpB,KAAC,UAAU,cAAE,SAAS,GAAc,GACd,EACxB,KAAC,YAAY,IACX,QAAQ,EAAC,SAAS,EAClB,KAAK,EACH,KAAC,UAAU,IAAC,OAAO,EAAC,OAAO,EAAC,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,YACtD,CAAC,CAAC,oCAAoC,EAAE;wBACvC,SAAS,EAAE,KAAK,EAAE,IAAI;qBACvB,CAAC,GACS,EAEf,IAAI,EAAE,KAAC,cAAc,KAAG,EACxB,SAAS,SACT,EACF,MAAC,qBAAqB,eACpB,KAAC,MAAM,IAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAE,OAAO,EAAE,SAAS,kBAC/C,CAAC,CAAC,eAAe,CAAC,GACZ,EACT,KAAC,MAAM,IAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAE,cAAc,EAAE,SAAS,kBAC3D,CAAC,CAAC,iBAAiB,CAAC,GACd,IACa,IACG,CAC9B,CAAA;AACH,CAAC,CAAA"}
@@ -9,6 +9,7 @@ import { GasMessage } from '../../components/Messages/GasMessage.js';
9
9
  import { PageContainer } from '../../components/PageContainer.js';
10
10
  import { getStepList } from '../../components/Step/StepList.js';
11
11
  import { TransactionDetails } from '../../components/TransactionDetails.js';
12
+ import { useAddressActivity } from '../../hooks/useAddressActivity.js';
12
13
  import { useHeader } from '../../hooks/useHeader.js';
13
14
  import { useNavigateBack } from '../../hooks/useNavigateBack.js';
14
15
  import { useRouteExecution } from '../../hooks/useRouteExecution.js';
@@ -18,6 +19,7 @@ import { useFieldActions } from '../../stores/form/useFieldActions.js';
18
19
  import { RouteExecutionStatus } from '../../stores/routes/types.js';
19
20
  import { WidgetEvent } from '../../types/events.js';
20
21
  import { getAccumulatedFeeCostsBreakdown } from '../../utils/fees.js';
22
+ import { ConfirmToAddressSheet } from './ConfirmToAddressSheet.js';
21
23
  import { ExchangeRateBottomSheet } from './ExchangeRateBottomSheet.js';
22
24
  import { RouteTracker } from './RouteTracker.js';
23
25
  import { StartTransactionButton } from './StartTransactionButton.js';
@@ -36,6 +38,7 @@ export const TransactionPage = () => {
36
38
  const [routeRefreshing, setRouteRefreshing] = useState(false);
37
39
  const tokenValueBottomSheetRef = useRef(null);
38
40
  const exchangeRateBottomSheetRef = useRef(null);
41
+ const confirmToAddressSheetRef = useRef(null);
39
42
  const onAcceptExchangeRateUpdate = (resolver, data) => {
40
43
  exchangeRateBottomSheetRef.current?.open(resolver, data);
41
44
  };
@@ -43,6 +46,7 @@ export const TransactionPage = () => {
43
46
  routeId: routeId,
44
47
  onAcceptExchangeRateUpdate,
45
48
  });
49
+ const { toAddress, hasActivity, isLoading: isLoadingAddressActivity, isFetched: isActivityAddressFetched, } = useAddressActivity(route?.toChainId);
46
50
  const getHeaderTitle = () => {
47
51
  if (subvariant === 'custom') {
48
52
  return t(`header.${subvariantOptions?.custom ?? 'checkout'}`);
@@ -89,6 +93,13 @@ export const TransactionPage = () => {
89
93
  };
90
94
  const handleStartClick = async () => {
91
95
  if (status === RouteExecutionStatus.Idle) {
96
+ if (toAddress &&
97
+ !hasActivity &&
98
+ !isLoadingAddressActivity &&
99
+ isActivityAddressFetched) {
100
+ confirmToAddressSheetRef.current?.open();
101
+ return;
102
+ }
92
103
  const { gasCostUSD, feeCostUSD } = getAccumulatedFeeCostsBreakdown(route);
93
104
  const fromAmountUSD = Number.parseFloat(route.fromAmountUSD);
94
105
  const toAmountUSD = Number.parseFloat(route.toAmountUSD);
@@ -133,9 +144,9 @@ export const TransactionPage = () => {
133
144
  status === RouteExecutionStatus.Failed ? (_jsxs(_Fragment, { children: [_jsx(GasMessage, { mt: 2, route: route }), _jsxs(Box, { sx: {
134
145
  mt: 2,
135
146
  display: 'flex',
136
- }, children: [_jsx(StartTransactionButton, { text: getButtonText(), onClick: handleStartClick, route: route, loading: routeRefreshing }), status === RouteExecutionStatus.Failed ? (_jsx(Tooltip, { title: t('button.removeTransaction'), placement: "bottom-end", children: _jsx(Button, { onClick: handleRemoveRoute, sx: {
147
+ }, children: [_jsx(StartTransactionButton, { text: getButtonText(), onClick: handleStartClick, route: route, loading: routeRefreshing || isLoadingAddressActivity }), status === RouteExecutionStatus.Failed ? (_jsx(Tooltip, { title: t('button.removeTransaction'), placement: "bottom-end", children: _jsx(Button, { onClick: handleRemoveRoute, sx: {
137
148
  minWidth: 48,
138
149
  marginLeft: 1,
139
- }, children: _jsx(Delete, {}) }) })) : null] })] })) : null, status ? _jsx(StatusBottomSheet, { status: status, route: route }) : null, subvariant !== 'custom' ? (_jsx(TokenValueBottomSheet, { route: route, ref: tokenValueBottomSheetRef, onContinue: handleExecuteRoute })) : null, _jsx(ExchangeRateBottomSheet, { ref: exchangeRateBottomSheetRef })] }));
150
+ }, children: _jsx(Delete, {}) }) })) : null] })] })) : null, status ? _jsx(StatusBottomSheet, { status: status, route: route }) : null, subvariant !== 'custom' ? (_jsx(TokenValueBottomSheet, { route: route, ref: tokenValueBottomSheetRef, onContinue: handleExecuteRoute })) : null, _jsx(ExchangeRateBottomSheet, { ref: exchangeRateBottomSheetRef }), _jsx(ConfirmToAddressSheet, { ref: confirmToAddressSheetRef, onContinue: handleExecuteRoute, toAddress: toAddress, toChainId: route.toChainId })] }));
140
151
  };
141
152
  //# sourceMappingURL=TransactionPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TransactionPage.js","sourceRoot":"","sources":["../../../../src/pages/TransactionPage/TransactionPage.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TransactionPage.js","sourceRoot":"","sources":["../../../../src/pages/TransactionPage/TransactionPage.tsx"],"names":[],"mappings":"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"}
@@ -27,7 +27,8 @@ export declare enum WidgetEvent {
27
27
  PageEntered = "pageEntered",
28
28
  FormFieldChanged = "formFieldChanged",
29
29
  SettingUpdated = "settingUpdated",
30
- TokenSearch = "tokenSearch"
30
+ TokenSearch = "tokenSearch",
31
+ LowAddressActivityConfirmed = "lowAddressActivityConfirmed"
31
32
  }
32
33
  export type WidgetEvents = {
33
34
  routeExecutionStarted: Route;
@@ -48,6 +49,10 @@ export type WidgetEvents = {
48
49
  pageEntered: NavigationRouteType;
49
50
  settingUpdated: SettingUpdated;
50
51
  tokenSearch: TokenSearch;
52
+ [WidgetEvent.LowAddressActivityConfirmed]: {
53
+ address: string;
54
+ chainId: number;
55
+ };
51
56
  };
52
57
  export type ContactSupport = {
53
58
  supportId?: string;
@@ -24,5 +24,6 @@ export var WidgetEvent;
24
24
  WidgetEvent["FormFieldChanged"] = "formFieldChanged";
25
25
  WidgetEvent["SettingUpdated"] = "settingUpdated";
26
26
  WidgetEvent["TokenSearch"] = "tokenSearch";
27
+ WidgetEvent["LowAddressActivityConfirmed"] = "lowAddressActivityConfirmed";
27
28
  })(WidgetEvent || (WidgetEvent = {}));
28
29
  //# sourceMappingURL=events.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/types/events.ts"],"names":[],"mappings":"AAMA,MAAM,CAAN,IAAY,WAyBX;AAzBD,WAAY,WAAW;IACrB,8DAA+C,CAAA;IAC/C,8DAA+C,CAAA;IAC/C,kEAAmD,CAAA;IACnD,4DAA6C,CAAA;IAC7C,wDAAyC,CAAA;IACzC,8CAA+B,CAAA;IAC/B,kDAAmC,CAAA;IACnC,gDAAiC,CAAA;IACjC,oEAAqD,CAAA;IACrD,8EAA+D,CAAA;IAC/D,0DAA2C,CAAA;IAC3C;;OAEG;IACH,4EAA6D,CAAA;IAC7D;;OAEG;IACH,kDAAmC,CAAA;IACnC,gDAAiC,CAAA;IACjC,0CAA2B,CAAA;IAC3B,oDAAqC,CAAA;IACrC,gDAAiC,CAAA;IACjC,0CAA2B,CAAA;AAC7B,CAAC,EAzBW,WAAW,KAAX,WAAW,QAyBtB"}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/types/events.ts"],"names":[],"mappings":"AAMA,MAAM,CAAN,IAAY,WA0BX;AA1BD,WAAY,WAAW;IACrB,8DAA+C,CAAA;IAC/C,8DAA+C,CAAA;IAC/C,kEAAmD,CAAA;IACnD,4DAA6C,CAAA;IAC7C,wDAAyC,CAAA;IACzC,8CAA+B,CAAA;IAC/B,kDAAmC,CAAA;IACnC,gDAAiC,CAAA;IACjC,oEAAqD,CAAA;IACrD,8EAA+D,CAAA;IAC/D,0DAA2C,CAAA;IAC3C;;OAEG;IACH,4EAA6D,CAAA;IAC7D;;OAEG;IACH,kDAAmC,CAAA;IACnC,gDAAiC,CAAA;IACjC,0CAA2B,CAAA;IAC3B,oDAAqC,CAAA;IACrC,gDAAiC,CAAA;IACjC,0CAA2B,CAAA;IAC3B,0EAA2D,CAAA;AAC7D,CAAC,EA1BW,WAAW,KAAX,WAAW,QA0BtB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lifi/widget",
3
- "version": "3.15.2",
3
+ "version": "3.16.0",
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
  "type": "module",
6
6
  "main": "./dist/esm/index.js",
@@ -1,2 +1,2 @@
1
1
  export const name = '@lifi/widget'
2
- export const version = '3.15.2'
2
+ export const version = '3.16.0'
@@ -0,0 +1,39 @@
1
+ import type { Address } from 'viem'
2
+ import { isAddress } from 'viem'
3
+ import { useTransactionCount } from 'wagmi'
4
+ import { useFieldValues } from '../stores/form/useFieldValues.js'
5
+
6
+ interface AddressActivity {
7
+ hasActivity: boolean
8
+ isLoading: boolean
9
+ isFetched: boolean
10
+ toAddress: string | undefined
11
+ }
12
+
13
+ export const useAddressActivity = (chainId?: number): AddressActivity => {
14
+ const [toAddress, toChainId] = useFieldValues('toAddress', 'toChain')
15
+
16
+ const destinationChainId = chainId ?? toChainId
17
+
18
+ const {
19
+ data: transactionCount,
20
+ isLoading,
21
+ isFetched,
22
+ error,
23
+ } = useTransactionCount({
24
+ address: toAddress as Address,
25
+ chainId: destinationChainId,
26
+ query: {
27
+ enabled: Boolean(toAddress && destinationChainId && isAddress(toAddress)),
28
+ refetchInterval: 300_000,
29
+ staleTime: 300_000,
30
+ },
31
+ })
32
+
33
+ return {
34
+ toAddress,
35
+ hasActivity: Boolean(transactionCount && transactionCount > 0),
36
+ isLoading,
37
+ isFetched: isFetched && !error,
38
+ }
39
+ }
package/src/i18n/en.json CHANGED
@@ -118,6 +118,8 @@
118
118
  "warning": {
119
119
  "message": {
120
120
  "accountNotDeployedMessage": "Smart contract account is not deployed on the destination chain. Sending funds to a non-existent contract would result in permanent loss.",
121
+ "noAddressActivity": "This address has never been used on this network. Please verify you're sending to the correct address to prevent potential loss of funds.",
122
+ "lowAddressActivity": "This address has low activity on {{chainName}} network. Please verify you're sending to the correct address and network to prevent potential loss of funds.",
121
123
  "deleteActiveTransactions": "Active transactions are only stored locally and can't be recovered if you delete them.",
122
124
  "deleteTransactionHistory": "Transaction history is only stored locally and can't be recovered if you delete it.",
123
125
  "fundsLossPrevention": "Always ensure smart contract accounts are properly set up on the destination chain and avoid direct transfers to exchanges to prevent fund loss.",
@@ -135,7 +137,8 @@
135
137
  "highValueLoss": "High value loss",
136
138
  "insufficientGas": "Insufficient gas",
137
139
  "rateChanged": "Rate changed",
138
- "resetSettings": "Reset settings?"
140
+ "resetSettings": "Reset settings?",
141
+ "lowAddressActivity": "Low Activity Address"
139
142
  }
140
143
  },
141
144
  "error": {
@@ -5,7 +5,6 @@ import { useRoutes } from '../../hooks/useRoutes.js'
5
5
  import { useToAddressRequirements } from '../../hooks/useToAddressRequirements.js'
6
6
  import { useWidgetEvents } from '../../hooks/useWidgetEvents.js'
7
7
  import { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'
8
- import { useFieldValues } from '../../stores/form/useFieldValues.js'
9
8
  import { useSplitSubvariantStore } from '../../stores/settings/useSplitSubvariantStore.js'
10
9
  import { WidgetEvent } from '../../types/events.js'
11
10
  import { navigationRoutes } from '../../utils/navigationRoutes.js'
@@ -16,24 +15,25 @@ export const ReviewButton: React.FC = () => {
16
15
  const emitter = useWidgetEvents()
17
16
  const { subvariant, subvariantOptions } = useWidgetConfig()
18
17
  const splitState = useSplitSubvariantStore((state) => state.state)
19
- const [toAddress] = useFieldValues('toAddress')
20
- const { requiredToAddress, accountNotDeployedAtDestination } =
18
+ const { toAddress, requiredToAddress, accountNotDeployedAtDestination } =
21
19
  useToAddressRequirements()
22
20
  const { routes, setReviewableRoute } = useRoutes()
23
21
 
24
22
  const currentRoute = routes?.[0]
25
23
 
26
24
  const handleClick = async () => {
27
- if (currentRoute) {
28
- setReviewableRoute(currentRoute)
29
- navigate(navigationRoutes.transactionExecution, {
30
- state: { routeId: currentRoute.id },
31
- })
32
- emitter.emit(WidgetEvent.RouteSelected, {
33
- route: currentRoute,
34
- routes: routes!,
35
- })
25
+ if (!currentRoute) {
26
+ return
36
27
  }
28
+
29
+ setReviewableRoute(currentRoute)
30
+ navigate(navigationRoutes.transactionExecution, {
31
+ state: { routeId: currentRoute.id },
32
+ })
33
+ emitter.emit(WidgetEvent.RouteSelected, {
34
+ route: currentRoute,
35
+ routes: routes!,
36
+ })
37
37
  }
38
38
 
39
39
  const getButtonText = (): string => {
@@ -0,0 +1,93 @@
1
+ import { Wallet, WarningRounded } from '@mui/icons-material'
2
+ import { Button, Typography } from '@mui/material'
3
+ import type { MutableRefObject } from 'react'
4
+ import { forwardRef } from 'react'
5
+ import { useTranslation } from 'react-i18next'
6
+ import { BottomSheet } from '../../components/BottomSheet/BottomSheet.js'
7
+ import type { BottomSheetBase } from '../../components/BottomSheet/types.js'
8
+ import { AlertMessage } from '../../components/Messages/AlertMessage.js'
9
+ import { useChain } from '../../hooks/useChain.js'
10
+ import { useWidgetEvents } from '../../hooks/useWidgetEvents.js'
11
+ import { WidgetEvent } from '../../types/events.js'
12
+ import {
13
+ IconContainer,
14
+ SendToWalletButtonRow,
15
+ SendToWalletSheetContainer,
16
+ SheetAddressContainer,
17
+ } from '../SendToWallet/SendToWalletPage.style.js'
18
+
19
+ interface ConfirmToAddressSheetProps {
20
+ onContinue: () => void
21
+ toAddress: string
22
+ toChainId: number
23
+ }
24
+
25
+ interface ConfirmToAddressSheetContentProps extends ConfirmToAddressSheetProps {
26
+ onClose: () => void
27
+ }
28
+
29
+ export const ConfirmToAddressSheet = forwardRef<
30
+ BottomSheetBase,
31
+ ConfirmToAddressSheetProps
32
+ >((props, ref) => {
33
+ const handleClose = () => {
34
+ ;(ref as MutableRefObject<BottomSheetBase>).current?.close()
35
+ }
36
+
37
+ return (
38
+ <BottomSheet ref={ref}>
39
+ <ConfirmToAddressSheetContent {...props} onClose={handleClose} />
40
+ </BottomSheet>
41
+ )
42
+ })
43
+
44
+ const ConfirmToAddressSheetContent: React.FC<
45
+ ConfirmToAddressSheetContentProps
46
+ > = ({ onContinue, onClose, toAddress, toChainId }) => {
47
+ const { t } = useTranslation()
48
+ const { chain } = useChain(toChainId)
49
+ const emitter = useWidgetEvents()
50
+
51
+ const handleContinue = () => {
52
+ emitter.emit(WidgetEvent.LowAddressActivityConfirmed, {
53
+ address: toAddress,
54
+ chainId: toChainId,
55
+ })
56
+ onClose()
57
+ onContinue()
58
+ }
59
+
60
+ return (
61
+ <SendToWalletSheetContainer>
62
+ <IconContainer>
63
+ <Wallet sx={{ fontSize: 40 }} />
64
+ </IconContainer>
65
+ <Typography variant="h6" sx={{ textAlign: 'center', mb: 2 }}>
66
+ {t('warning.title.lowAddressActivity')}
67
+ </Typography>
68
+ <SheetAddressContainer>
69
+ <Typography>{toAddress}</Typography>
70
+ </SheetAddressContainer>
71
+ <AlertMessage
72
+ severity="warning"
73
+ title={
74
+ <Typography variant="body2" sx={{ color: 'text.primary' }}>
75
+ {t('warning.message.lowAddressActivity', {
76
+ chainName: chain?.name,
77
+ })}
78
+ </Typography>
79
+ }
80
+ icon={<WarningRounded />}
81
+ multiline
82
+ />
83
+ <SendToWalletButtonRow>
84
+ <Button variant="text" onClick={onClose} fullWidth>
85
+ {t('button.cancel')}
86
+ </Button>
87
+ <Button variant="contained" onClick={handleContinue} fullWidth>
88
+ {t('button.continue')}
89
+ </Button>
90
+ </SendToWalletButtonRow>
91
+ </SendToWalletSheetContainer>
92
+ )
93
+ }
@@ -10,6 +10,7 @@ import { GasMessage } from '../../components/Messages/GasMessage.js'
10
10
  import { PageContainer } from '../../components/PageContainer.js'
11
11
  import { getStepList } from '../../components/Step/StepList.js'
12
12
  import { TransactionDetails } from '../../components/TransactionDetails.js'
13
+ import { useAddressActivity } from '../../hooks/useAddressActivity.js'
13
14
  import { useHeader } from '../../hooks/useHeader.js'
14
15
  import { useNavigateBack } from '../../hooks/useNavigateBack.js'
15
16
  import { useRouteExecution } from '../../hooks/useRouteExecution.js'
@@ -19,6 +20,7 @@ import { useFieldActions } from '../../stores/form/useFieldActions.js'
19
20
  import { RouteExecutionStatus } from '../../stores/routes/types.js'
20
21
  import { WidgetEvent } from '../../types/events.js'
21
22
  import { getAccumulatedFeeCostsBreakdown } from '../../utils/fees.js'
23
+ import { ConfirmToAddressSheet } from './ConfirmToAddressSheet.js'
22
24
  import type { ExchangeRateBottomSheetBase } from './ExchangeRateBottomSheet.js'
23
25
  import { ExchangeRateBottomSheet } from './ExchangeRateBottomSheet.js'
24
26
  import { RouteTracker } from './RouteTracker.js'
@@ -44,6 +46,7 @@ export const TransactionPage: React.FC = () => {
44
46
 
45
47
  const tokenValueBottomSheetRef = useRef<BottomSheetBase>(null)
46
48
  const exchangeRateBottomSheetRef = useRef<ExchangeRateBottomSheetBase>(null)
49
+ const confirmToAddressSheetRef = useRef<BottomSheetBase>(null)
47
50
 
48
51
  const onAcceptExchangeRateUpdate = (
49
52
  resolver: (value: boolean) => void,
@@ -58,6 +61,13 @@ export const TransactionPage: React.FC = () => {
58
61
  onAcceptExchangeRateUpdate,
59
62
  })
60
63
 
64
+ const {
65
+ toAddress,
66
+ hasActivity,
67
+ isLoading: isLoadingAddressActivity,
68
+ isFetched: isActivityAddressFetched,
69
+ } = useAddressActivity(route?.toChainId)
70
+
61
71
  const getHeaderTitle = () => {
62
72
  if (subvariant === 'custom') {
63
73
  return t(`header.${subvariantOptions?.custom ?? 'checkout'}`)
@@ -127,6 +137,16 @@ export const TransactionPage: React.FC = () => {
127
137
 
128
138
  const handleStartClick = async () => {
129
139
  if (status === RouteExecutionStatus.Idle) {
140
+ if (
141
+ toAddress &&
142
+ !hasActivity &&
143
+ !isLoadingAddressActivity &&
144
+ isActivityAddressFetched
145
+ ) {
146
+ confirmToAddressSheetRef.current?.open()
147
+ return
148
+ }
149
+
130
150
  const { gasCostUSD, feeCostUSD } = getAccumulatedFeeCostsBreakdown(route)
131
151
  const fromAmountUSD = Number.parseFloat(route.fromAmountUSD)
132
152
  const toAmountUSD = Number.parseFloat(route.toAmountUSD)
@@ -198,7 +218,7 @@ export const TransactionPage: React.FC = () => {
198
218
  text={getButtonText()}
199
219
  onClick={handleStartClick}
200
220
  route={route}
201
- loading={routeRefreshing}
221
+ loading={routeRefreshing || isLoadingAddressActivity}
202
222
  />
203
223
  {status === RouteExecutionStatus.Failed ? (
204
224
  <Tooltip
@@ -228,6 +248,12 @@ export const TransactionPage: React.FC = () => {
228
248
  />
229
249
  ) : null}
230
250
  <ExchangeRateBottomSheet ref={exchangeRateBottomSheetRef} />
251
+ <ConfirmToAddressSheet
252
+ ref={confirmToAddressSheetRef}
253
+ onContinue={handleExecuteRoute}
254
+ toAddress={toAddress!}
255
+ toChainId={route.toChainId!}
256
+ />
231
257
  </PageContainer>
232
258
  )
233
259
  }
@@ -29,6 +29,7 @@ export enum WidgetEvent {
29
29
  FormFieldChanged = 'formFieldChanged',
30
30
  SettingUpdated = 'settingUpdated',
31
31
  TokenSearch = 'tokenSearch',
32
+ LowAddressActivityConfirmed = 'lowAddressActivityConfirmed',
32
33
  }
33
34
 
34
35
  export type WidgetEvents = {
@@ -50,6 +51,10 @@ export type WidgetEvents = {
50
51
  pageEntered: NavigationRouteType
51
52
  settingUpdated: SettingUpdated
52
53
  tokenSearch: TokenSearch
54
+ [WidgetEvent.LowAddressActivityConfirmed]: {
55
+ address: string
56
+ chainId: number
57
+ }
53
58
  }
54
59
 
55
60
  export type ContactSupport = {