@lifi/widget 2.0.0-beta.0 → 2.0.0-beta.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 (54) hide show
  1. package/cjs/components/ChainSelect/ChainSelect.d.ts +1 -0
  2. package/cjs/components/GasMessage/FundsSufficiencyMessage.d.ts +1 -0
  3. package/cjs/components/Step/CircularProgress.d.ts +1 -0
  4. package/cjs/components/Step/StepList.d.ts +1 -0
  5. package/cjs/components/SwapInput/SwapInputEndAdornment.d.ts +1 -0
  6. package/cjs/components/SwapRoutes/SwapRoutesExpanded.d.ts +1 -0
  7. package/cjs/components/SwapRoutes/SwapRoutesExpanded.style.js +1 -0
  8. package/cjs/config/version.d.ts +1 -1
  9. package/cjs/config/version.js +1 -1
  10. package/cjs/i18n/pt.json +8 -5
  11. package/cjs/i18n/uk.json +3 -3
  12. package/cjs/i18n/zh.json +15 -8
  13. package/cjs/pages/ActiveSwapsPage/ActiveSwapsPage.d.ts +1 -0
  14. package/cjs/pages/SelectTokenPage/SearchTokenInput.d.ts +1 -0
  15. package/cjs/pages/SelectWalletPage/SelectWalletPage.d.ts +1 -0
  16. package/cjs/pages/SelectWalletPage/SelectWalletPage.js +5 -5
  17. package/cjs/pages/SettingsPage/GasPriceSelect.d.ts +1 -0
  18. package/cjs/pages/SettingsPage/SettingsPage.d.ts +1 -0
  19. package/cjs/pages/SettingsPage/ShowDestinationWallet.d.ts +1 -0
  20. package/cjs/pages/SettingsPage/SlippageInput.d.ts +1 -0
  21. package/cjs/providers/I18nProvider/I18nProvider.js +3 -3
  22. package/cjs/providers/WalletProvider/WalletProvider.js +72 -28
  23. package/cjs/providers/WalletProvider/index.d.ts +1 -1
  24. package/cjs/providers/WalletProvider/index.js +1 -1
  25. package/cjs/providers/WalletProvider/types.d.ts +1 -1
  26. package/cjs/types/widget.d.ts +1 -2
  27. package/components/ChainSelect/ChainSelect.d.ts +1 -0
  28. package/components/GasMessage/FundsSufficiencyMessage.d.ts +1 -0
  29. package/components/Step/CircularProgress.d.ts +1 -0
  30. package/components/Step/StepList.d.ts +1 -0
  31. package/components/SwapInput/SwapInputEndAdornment.d.ts +1 -0
  32. package/components/SwapRoutes/SwapRoutesExpanded.d.ts +1 -0
  33. package/components/SwapRoutes/SwapRoutesExpanded.style.js +1 -0
  34. package/config/version.d.ts +1 -1
  35. package/config/version.js +1 -1
  36. package/i18n/pt.json +8 -5
  37. package/i18n/uk.json +3 -3
  38. package/i18n/zh.json +15 -8
  39. package/package.json +3 -3
  40. package/pages/ActiveSwapsPage/ActiveSwapsPage.d.ts +1 -0
  41. package/pages/SelectTokenPage/SearchTokenInput.d.ts +1 -0
  42. package/pages/SelectWalletPage/SelectWalletPage.d.ts +1 -0
  43. package/pages/SelectWalletPage/SelectWalletPage.js +5 -5
  44. package/pages/SettingsPage/GasPriceSelect.d.ts +1 -0
  45. package/pages/SettingsPage/SettingsPage.d.ts +1 -0
  46. package/pages/SettingsPage/ShowDestinationWallet.d.ts +1 -0
  47. package/pages/SettingsPage/SlippageInput.d.ts +1 -0
  48. package/providers/I18nProvider/I18nProvider.js +3 -3
  49. package/providers/WalletProvider/WalletProvider.js +73 -29
  50. package/providers/WalletProvider/index.d.ts +1 -1
  51. package/providers/WalletProvider/index.js +1 -1
  52. package/providers/WalletProvider/types.d.ts +1 -1
  53. package/tsconfig.cjs.tsbuildinfo +1 -1
  54. package/types/widget.d.ts +1 -2
package/i18n/zh.json CHANGED
@@ -106,12 +106,14 @@
106
106
  "inProgress": "进行中",
107
107
  "info": {
108
108
  "message": {
109
+ "autoRefuel": "您在 {{chainName}} 链上的燃气费很低。如果启用该选项,您将获得足够的燃气费完成此次兑换。",
109
110
  "emptyActiveSwaps": "正在进行的兑换将在这里显示。一旦完成,你可在兑换记录中找到它们。",
110
111
  "emptySwapHistory": "兑换记录只存储在本地,如果你清除浏览器数据,他们将被删除。",
111
112
  "emptyTokenList": "我们无法在 {{chainName}} 链上找到这些代币,或者你的钱包内没有这些代币。请再次搜索或者选择其他链再试一次。",
112
113
  "routeNotFound": "试试另一个代币组合。"
113
114
  },
114
115
  "title": {
116
+ "autoRefuel": "获得燃气费",
115
117
  "emptyActiveSwaps": "没有正在进行的兑换",
116
118
  "emptySwapHistory": "没有兑换记录",
117
119
  "routeNotFound": "没有可用的路由"
@@ -154,6 +156,7 @@
154
156
  "quotedAmount": "报价金额",
155
157
  "rateChange": "波动率",
156
158
  "receiving": "接收",
159
+ "refuelStepDetails": "通过 {{tool}} 获取燃气费",
157
160
  "routes": "你会收到",
158
161
  "selectChain": "网络",
159
162
  "selectChainAndToken": "选择链和代币",
@@ -162,6 +165,7 @@
162
165
  "sendToWallet": "发送到另外的钱包",
163
166
  "sentToAddress": "发送到{{address}}",
164
167
  "stepBridge": "跨链",
168
+ "stepDetails": "通过 LI.FI {{tool}}",
165
169
  "stepSwap": "兑换",
166
170
  "stepSwapAndBridge": "兑换和跨链",
167
171
  "success": {
@@ -180,11 +184,13 @@
180
184
  "swapStepDetails": "通过{{tool}}在{{chain}}链上兑换代币",
181
185
  "swapping": "兑换中",
182
186
  "tags": {
183
- "ALTERNATIVE": "可用",
184
- "CHEAPEST": "便宜",
185
- "FASTEST": "快捷",
186
- "RECOMMENDED": "推荐",
187
- "SAFEST": "安全"
187
+ "cheapest": "便宜的",
188
+ "fastest": "快速的",
189
+ "insurable": "可保性",
190
+ "insurance": "保险",
191
+ "insured": "受保的",
192
+ "recommended": "建议的",
193
+ "safest": "最佳/安全"
188
194
  },
189
195
  "to": "到",
190
196
  "tokenOnChain": "{{chainName}}链上的{{tokenSymbol}}",
@@ -197,8 +203,8 @@
197
203
  "deleteActiveSwaps": "正在进行的兑换记录只存储在本地,如果删除它们,我们将无法恢复这些记录。",
198
204
  "deleteSwapHistory": "兑换记录只存储在本地,如果你删除它,我们将无法恢复这些记录。",
199
205
  "highValueLoss": "收到的代币的价值明显低于要被兑换的代币和交易成本。",
200
- "insufficientFunds": "你没有足够的资金来执行这笔兑换。",
201
- "insufficientGas": "你至少需要:",
206
+ "insufficientFunds": "你没有足够的资金来完成这笔交易。",
207
+ "insufficientGas": "您没有足够的燃气费来完成此次交易。您至少需要添加:",
202
208
  "rateChanged": "兑换比例已经改变,如果继续兑换,您将接受新的兑换比例。",
203
209
  "resetSettings": "这将重置您的路由优先级,滑点,燃气费,选中的跨链桥和链上交易所。"
204
210
  },
@@ -207,13 +213,14 @@
207
213
  "deleteSwap": "确定要删除这个兑换记录?",
208
214
  "deleteSwapHistory": "确定要清空兑换记录?",
209
215
  "highValueLoss": "大额资金损失",
210
- "insufficientGas": "燃料费不足",
216
+ "insufficientGas": "燃气费不足",
211
217
  "rateChanged": "兑换比例变动",
212
218
  "resetSettings": "确定要恢复默认设置吗?"
213
219
  }
214
220
  }
215
221
  },
216
222
  "tooltip": {
223
+ "additionalProviderFee": "跨链和交易所的手续费。",
217
224
  "estimatedNetworkFee": "预估网络手续费。",
218
225
  "estimatedTime": "预计兑换的执行时间(分钟)。",
219
226
  "notFound": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lifi/widget",
3
- "version": "2.0.0-beta.0",
3
+ "version": "2.0.0-beta.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",
@@ -44,14 +44,14 @@
44
44
  "@ethersproject/experimental": "^5.7.0",
45
45
  "@ethersproject/providers": "^5.7.2",
46
46
  "@lifi/sdk": "^2.0.0-beta.8",
47
- "@lifi/wallet-management": "^1.2.11",
47
+ "@lifi/wallet-management": "^2.0.0-beta.1",
48
48
  "@mui/icons-material": "^5.11.16",
49
49
  "@mui/lab": "^5.0.0-alpha.127",
50
50
  "@mui/material": "^5.12.1",
51
51
  "@tanstack/react-query": "^4.29.3",
52
52
  "@tanstack/react-virtual": "^3.0.0-beta.54",
53
53
  "big.js": "^6.2.1",
54
- "i18next": "^22.4.14",
54
+ "i18next": "^22.4.15",
55
55
  "i18next-browser-languagedetector": "^7.0.1",
56
56
  "microdiff": "^1.3.2",
57
57
  "mitt": "^3.0.0",
@@ -1 +1,2 @@
1
+ /// <reference types="react" />
1
2
  export declare const ActiveSwapsPage: () => JSX.Element;
@@ -1 +1,2 @@
1
+ /// <reference types="react" />
1
2
  export declare const SearchTokenInput: () => JSX.Element;
@@ -1 +1,2 @@
1
+ /// <reference types="react" />
1
2
  export declare const SelectWalletPage: () => JSX.Element;
@@ -13,6 +13,9 @@ export const SelectWalletPage = () => {
13
13
  const { navigateBack } = useNavigateBack();
14
14
  const { connect } = useWallet();
15
15
  const [walletIdentity, setWalletIdentity] = useState({ show: false });
16
+ // separate into installed and not installed wallets
17
+ const installedWallets = supportedWallets.filter((wallet) => wallet.installed());
18
+ const notInstalledWallets = supportedWallets.filter((wallet) => !wallet.installed() && wallet.name !== 'Default Wallet');
16
19
  const closeDialog = () => {
17
20
  setWalletIdentity((state) => ({
18
21
  ...state,
@@ -20,10 +23,7 @@ export const SelectWalletPage = () => {
20
23
  }));
21
24
  };
22
25
  const handleConnect = useCallback(async (wallet) => {
23
- const { ethereum } = window;
24
- const identityCheckPassed = wallet.checkProviderIdentity({
25
- provider: ethereum,
26
- });
26
+ const identityCheckPassed = wallet.installed();
27
27
  if (!identityCheckPassed) {
28
28
  setWalletIdentity({
29
29
  show: true,
@@ -37,7 +37,7 @@ export const SelectWalletPage = () => {
37
37
  return (_jsxs(Container, { disableGutters: true, children: [_jsx(List, { sx: {
38
38
  paddingLeft: 1.5,
39
39
  paddingRight: 1.5,
40
- }, children: supportedWallets.map((wallet) => (_jsxs(ListItemButton, { onClick: () => handleConnect(wallet), children: [_jsx(ListItemAvatar, { children: _jsx(Avatar, { src: wallet.icon.src || wallet.icon, alt: wallet.name, children: wallet.name[0] }) }), _jsx(ListItemText, { primary: wallet.name })] }, wallet.name))) }), _jsxs(Dialog, { open: walletIdentity.show, onClose: closeDialog, children: [_jsx(DialogContent, { children: _jsx(DialogContentText, { children: t('wallet.extensionNotFound', {
40
+ }, children: [...installedWallets, ...notInstalledWallets].map((wallet) => (_jsxs(ListItemButton, { onClick: () => handleConnect(wallet), children: [_jsx(ListItemAvatar, { children: _jsx(Avatar, { src: wallet.icon.src || wallet.icon, alt: wallet.name, children: wallet.name[0] }) }), _jsx(ListItemText, { primary: wallet.name })] }, wallet.name))) }), _jsxs(Dialog, { open: walletIdentity.show, onClose: closeDialog, children: [_jsx(DialogContent, { children: _jsx(DialogContentText, { children: t('wallet.extensionNotFound', {
41
41
  name: walletIdentity.wallet?.name,
42
42
  }) }) }), _jsx(DialogActions, { children: _jsx(Button, { variant: "contained", onClick: closeDialog, autoFocus: true, children: t('button.ok') }) })] })] }));
43
43
  };
@@ -1 +1,2 @@
1
+ /// <reference types="react" />
1
2
  export declare const GasPriceSelect: () => JSX.Element;
@@ -1 +1,2 @@
1
+ /// <reference types="react" />
1
2
  export declare const SettingsPage: () => JSX.Element;
@@ -1 +1,2 @@
1
+ /// <reference types="react" />
1
2
  export declare const ShowDestinationWallet: () => JSX.Element | null;
@@ -1 +1,2 @@
1
+ /// <reference types="react" />
1
2
  export declare const SlippageInput: () => JSX.Element;
@@ -8,7 +8,7 @@ import { useSettings } from '../../stores';
8
8
  import { deepMerge } from '../../utils';
9
9
  import { isItemAllowed, useWidgetConfig } from '../WidgetProvider';
10
10
  export const I18nProvider = ({ children, }) => {
11
- const { languageResources, languages, disableI18n } = useWidgetConfig();
11
+ const { languageResources, languages, disableLanguageDetector } = useWidgetConfig();
12
12
  const { language } = useSettings(['language']);
13
13
  const i18n = useMemo(() => {
14
14
  let resources = Object.keys(supportedLanguages)
@@ -47,11 +47,11 @@ export const I18nProvider = ({ children, }) => {
47
47
  caches: [],
48
48
  },
49
49
  });
50
- if (!language && !languages?.default && !disableI18n) {
50
+ if (!language && !languages?.default && !disableLanguageDetector) {
51
51
  i18n = i18n.use(LanguageDetector);
52
52
  }
53
53
  i18n.use(initReactI18next).init();
54
54
  return i18n;
55
- }, [disableI18n, language, languageResources, languages]);
55
+ }, [disableLanguageDetector, language, languageResources, languages]);
56
56
  return _jsx(I18nextProvider, { i18n: i18n, children: children });
57
57
  };
@@ -1,7 +1,8 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { addChain as walletAddChain, switchChain as walletSwitchChain, switchChainAndAddToken, useLiFiWalletManagement, } from '@lifi/wallet-management';
2
+ import { LiFiWalletManagement, readActiveWallets, supportedWallets, } from '@lifi/wallet-management';
3
3
  import { createContext, useCallback, useContext, useEffect, useMemo, useState, } from 'react';
4
4
  import { useWidgetConfig } from '../WidgetProvider';
5
+ const liFiWalletManagement = new LiFiWalletManagement();
5
6
  const stub = () => {
6
7
  throw new Error(`You forgot to wrap your component in <${WalletProvider.name}>.`);
7
8
  };
@@ -17,8 +18,26 @@ const WalletContext = createContext(initialContext);
17
18
  export const useWallet = () => useContext(WalletContext);
18
19
  export const WalletProvider = ({ children }) => {
19
20
  const { walletManagement } = useWidgetConfig();
20
- const { connect: walletManagementConnect, disconnect: walletManagementDisconnect, signer, provider, } = useLiFiWalletManagement();
21
21
  const [account, setAccount] = useState({});
22
+ const [currentWallet, setCurrentWallet] = useState();
23
+ useEffect(() => {
24
+ const autoConnect = async () => {
25
+ const persistedActiveWallets = readActiveWallets();
26
+ const activeWallets = supportedWallets.filter((wallet) => persistedActiveWallets.some((perstistedWallet) => perstistedWallet.name === wallet.name));
27
+ if (!activeWallets.length) {
28
+ return;
29
+ }
30
+ await liFiWalletManagement.autoConnect(activeWallets);
31
+ activeWallets[0].on('walletAccountChanged', handleWalletUpdate);
32
+ handleWalletUpdate(activeWallets[0]);
33
+ };
34
+ autoConnect();
35
+ }, []);
36
+ const handleWalletUpdate = async (wallet) => {
37
+ setCurrentWallet(wallet);
38
+ const account = await extractAccountFromSigner(wallet?.account?.signer);
39
+ setAccount(account);
40
+ };
22
41
  const connect = useCallback(async (wallet) => {
23
42
  if (walletManagement) {
24
43
  const signer = await walletManagement.connect();
@@ -26,17 +45,22 @@ export const WalletProvider = ({ children }) => {
26
45
  setAccount(account);
27
46
  return;
28
47
  }
29
- await walletManagementConnect(wallet);
30
- }, [walletManagement, walletManagementConnect]);
48
+ await liFiWalletManagement.connect(wallet);
49
+ wallet.on('walletAccountChanged', handleWalletUpdate);
50
+ handleWalletUpdate(wallet);
51
+ }, [walletManagement]);
31
52
  const disconnect = useCallback(async () => {
32
53
  if (walletManagement) {
33
54
  await walletManagement.disconnect();
34
55
  setAccount({});
35
56
  return;
36
57
  }
37
- await walletManagementDisconnect();
38
- }, [walletManagement, walletManagementDisconnect]);
39
- // only for injected wallets
58
+ if (currentWallet) {
59
+ await liFiWalletManagement.disconnect(currentWallet);
60
+ currentWallet.removeAllListeners();
61
+ handleWalletUpdate(undefined);
62
+ }
63
+ }, [walletManagement, currentWallet]);
40
64
  const switchChain = useCallback(async (chainId) => {
41
65
  if (walletManagement?.switchChain) {
42
66
  const signer = await walletManagement.switchChain(chainId);
@@ -44,34 +68,46 @@ export const WalletProvider = ({ children }) => {
44
68
  setAccount(account);
45
69
  return true;
46
70
  }
47
- return walletSwitchChain(chainId);
48
- }, [walletManagement]);
71
+ try {
72
+ await currentWallet?.switchChain(chainId);
73
+ handleWalletUpdate(currentWallet);
74
+ return true;
75
+ }
76
+ catch {
77
+ return false;
78
+ }
79
+ }, [walletManagement, currentWallet]);
49
80
  const addChain = useCallback(async (chainId) => {
50
81
  if (walletManagement?.addChain) {
51
82
  return walletManagement.addChain(chainId);
52
83
  }
53
- return walletAddChain(chainId);
54
- }, [walletManagement]);
84
+ try {
85
+ await currentWallet?.addChain(chainId);
86
+ handleWalletUpdate(currentWallet);
87
+ return true;
88
+ }
89
+ catch {
90
+ return false;
91
+ }
92
+ }, [walletManagement, currentWallet]);
55
93
  const addToken = useCallback(async (chainId, token) => {
56
94
  if (walletManagement?.addToken) {
57
95
  return walletManagement.addToken(token, chainId);
58
96
  }
59
- return switchChainAndAddToken(chainId, token);
60
- }, [walletManagement]);
61
- // keep account information up to date
97
+ await currentWallet?.addToken(chainId, token);
98
+ handleWalletUpdate(currentWallet);
99
+ return;
100
+ }, [walletManagement, currentWallet]);
101
+ // keep widget in sync with changing external signer object
62
102
  useEffect(() => {
63
- const updateAccount = async () => {
64
- let account;
65
- if (walletManagement) {
66
- account = await extractAccountFromSigner(walletManagement?.signer);
67
- }
68
- else {
69
- account = await extractAccountFromSigner(signer);
70
- }
71
- setAccount(account);
72
- };
73
- updateAccount();
74
- }, [signer, walletManagement]);
103
+ if (walletManagement) {
104
+ const updateAccount = async () => {
105
+ const account = await extractAccountFromSigner(walletManagement?.signer);
106
+ setAccount(account);
107
+ };
108
+ updateAccount();
109
+ }
110
+ }, [walletManagement, walletManagement?.signer]);
75
111
  const value = useMemo(() => ({
76
112
  connect,
77
113
  disconnect,
@@ -79,8 +115,16 @@ export const WalletProvider = ({ children }) => {
79
115
  addChain,
80
116
  addToken,
81
117
  account,
82
- provider,
83
- }), [account, addChain, addToken, connect, disconnect, provider, switchChain]);
118
+ provider: currentWallet?.account?.provider,
119
+ }), [
120
+ account,
121
+ addChain,
122
+ addToken,
123
+ connect,
124
+ disconnect,
125
+ currentWallet,
126
+ switchChain,
127
+ ]);
84
128
  return (_jsx(WalletContext.Provider, { value: value, children: children }));
85
129
  };
86
130
  export const extractAccountFromSigner = async (signer) => {
@@ -93,7 +137,7 @@ export const extractAccountFromSigner = async (signer) => {
93
137
  };
94
138
  }
95
139
  catch (error) {
96
- console.log(error);
140
+ console.error(error);
97
141
  return {};
98
142
  }
99
143
  };
@@ -1,2 +1,2 @@
1
- export * from './types';
2
1
  export * from './WalletProvider';
2
+ export * from './types';
@@ -1,2 +1,2 @@
1
- export * from './types';
2
1
  export * from './WalletProvider';
2
+ export * from './types';
@@ -7,7 +7,7 @@ export interface WalletContextProps {
7
7
  provider?: Provider;
8
8
  addChain(chainId: number): Promise<boolean>;
9
9
  addToken(chainId: number, token: Token): Promise<void>;
10
- disconnect(): void;
10
+ disconnect(wallet?: Wallet): void;
11
11
  switchChain(chainId: number): Promise<boolean>;
12
12
  connect(wallet?: Wallet | undefined): Promise<void>;
13
13
  }