@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 +7 -0
- package/dist/esm/config/version.d.ts +1 -1
- package/dist/esm/config/version.js +1 -1
- package/dist/esm/hooks/useAddressActivity.d.ts +8 -0
- package/dist/esm/hooks/useAddressActivity.js +23 -0
- package/dist/esm/hooks/useAddressActivity.js.map +1 -0
- package/dist/esm/i18n/en.json +4 -1
- package/dist/esm/pages/MainPage/ReviewButton.js +11 -12
- package/dist/esm/pages/MainPage/ReviewButton.js.map +1 -1
- package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.d.ts +8 -0
- package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.js +35 -0
- package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.js.map +1 -0
- package/dist/esm/pages/TransactionPage/TransactionPage.js +13 -2
- package/dist/esm/pages/TransactionPage/TransactionPage.js.map +1 -1
- package/dist/esm/types/events.d.ts +6 -1
- package/dist/esm/types/events.js +1 -0
- package/dist/esm/types/events.js.map +1 -1
- package/package.json +1 -1
- package/src/config/version.ts +1 -1
- package/src/hooks/useAddressActivity.ts +39 -0
- package/src/i18n/en.json +4 -1
- package/src/pages/MainPage/ReviewButton.tsx +12 -12
- package/src/pages/TransactionPage/ConfirmToAddressSheet.tsx +93 -0
- package/src/pages/TransactionPage/TransactionPage.tsx +27 -1
- package/src/types/events.ts +5 -0
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.
|
|
2
|
+
export declare const version = "3.16.0";
|
|
@@ -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"}
|
package/dist/esm/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": {
|
|
@@ -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
|
|
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
|
-
|
|
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":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,iEAAiE,CAAA;AACvG,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAA;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,kDAAkD,CAAA;AAClF,OAAO,EAAE,
|
|
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":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yDAAyD,CAAA;AAC3F,OAAO,EAAE,UAAU,EAAE,MAAM,yCAAyC,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAA;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAA;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,kDAAkD,CAAA;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAA;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,+BAA+B,EAAE,MAAM,qBAAqB,CAAA;
|
|
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;
|
package/dist/esm/types/events.js
CHANGED
|
@@ -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,
|
|
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.
|
|
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",
|
package/src/config/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export const name = '@lifi/widget'
|
|
2
|
-
export const version = '3.
|
|
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
|
|
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
|
-
|
|
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
|
}
|
package/src/types/events.ts
CHANGED
|
@@ -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 = {
|