@lifi/widget 3.36.1 → 3.38.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 +26 -0
- package/dist/esm/components/AmountInput/PriceFormHelperText.style.js +3 -0
- package/dist/esm/components/AmountInput/PriceFormHelperText.style.js.map +1 -1
- package/dist/esm/components/AppContainer.js +1 -0
- package/dist/esm/components/AppContainer.js.map +1 -1
- package/dist/esm/components/Avatar/AccountAvatar.js +3 -3
- package/dist/esm/components/Avatar/AccountAvatar.js.map +1 -1
- package/dist/esm/components/Avatar/Avatar.d.ts +2 -0
- package/dist/esm/components/Avatar/Avatar.js +4 -3
- package/dist/esm/components/Avatar/Avatar.js.map +1 -1
- package/dist/esm/components/Avatar/ChainBadgeContent.d.ts +7 -0
- package/dist/esm/components/Avatar/ChainBadgeContent.js +10 -0
- package/dist/esm/components/Avatar/ChainBadgeContent.js.map +1 -0
- package/dist/esm/components/Avatar/TokenAvatar.js +3 -3
- package/dist/esm/components/Avatar/TokenAvatar.js.map +1 -1
- package/dist/esm/components/Chains/AllChainsAvatar.js +31 -5
- package/dist/esm/components/Chains/AllChainsAvatar.js.map +1 -1
- package/dist/esm/components/Chains/ChainSearchInput.js +7 -1
- package/dist/esm/components/Chains/ChainSearchInput.js.map +1 -1
- package/dist/esm/components/Header/NavigationHeader.js +5 -1
- package/dist/esm/components/Header/NavigationHeader.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteCard.js +2 -1
- package/dist/esm/components/RouteCard/RouteCard.js.map +1 -1
- package/dist/esm/components/SelectTokenButton/SelectTokenButton.js +3 -1
- package/dist/esm/components/SelectTokenButton/SelectTokenButton.js.map +1 -1
- package/dist/esm/components/TokenList/TokenListItem.js +8 -2
- package/dist/esm/components/TokenList/TokenListItem.js.map +1 -1
- package/dist/esm/config/version.d.ts +1 -1
- package/dist/esm/config/version.js +1 -1
- package/dist/esm/hooks/useFilteredByTokenBalances.js +8 -2
- package/dist/esm/hooks/useFilteredByTokenBalances.js.map +1 -1
- package/dist/esm/hooks/useRoutes.js +10 -19
- package/dist/esm/hooks/useRoutes.js.map +1 -1
- package/dist/esm/hooks/useTokenSearch.js +15 -8
- package/dist/esm/hooks/useTokenSearch.js.map +1 -1
- package/dist/esm/hooks/useTokens.js +33 -53
- package/dist/esm/hooks/useTokens.js.map +1 -1
- package/dist/esm/i18n/en.json +1 -0
- package/dist/esm/providers/I18nProvider/I18nProvider.js +27 -3
- package/dist/esm/providers/I18nProvider/I18nProvider.js.map +1 -1
- package/dist/esm/stores/StoreProvider.js +2 -1
- package/dist/esm/stores/StoreProvider.js.map +1 -1
- package/dist/esm/stores/chains/ChainOrderStore.js +15 -2
- package/dist/esm/stores/chains/ChainOrderStore.js.map +1 -1
- package/dist/esm/stores/settings/createSettingsStore.d.ts +2 -0
- package/dist/esm/stores/settings/types.d.ts +1 -0
- package/dist/esm/stores/settings/utils/getStateValues.js +1 -0
- package/dist/esm/stores/settings/utils/getStateValues.js.map +1 -1
- package/dist/esm/types/token.d.ts +6 -1
- package/dist/esm/types/widget.d.ts +12 -2
- package/dist/esm/types/widget.js +2 -0
- package/dist/esm/types/widget.js.map +1 -1
- package/dist/esm/utils/token.d.ts +12 -1
- package/dist/esm/utils/token.js +44 -0
- package/dist/esm/utils/token.js.map +1 -1
- package/dist/esm/utils/tokenList.js +2 -0
- package/dist/esm/utils/tokenList.js.map +1 -1
- package/dist/esm/utils/variant.d.ts +2 -0
- package/dist/esm/utils/variant.js +10 -0
- package/dist/esm/utils/variant.js.map +1 -0
- package/package.json +7 -7
- package/package.json.tmp +9 -9
- package/src/components/AmountInput/PriceFormHelperText.style.tsx +3 -0
- package/src/components/AppContainer.tsx +1 -0
- package/src/components/Avatar/AccountAvatar.tsx +3 -15
- package/src/components/Avatar/Avatar.tsx +6 -7
- package/src/components/Avatar/ChainBadgeContent.tsx +22 -0
- package/src/components/Avatar/TokenAvatar.tsx +3 -11
- package/src/components/Chains/AllChainsAvatar.tsx +56 -8
- package/src/components/Chains/ChainSearchInput.tsx +9 -1
- package/src/components/Header/NavigationHeader.tsx +5 -1
- package/src/components/RouteCard/RouteCard.tsx +2 -1
- package/src/components/SelectTokenButton/SelectTokenButton.tsx +9 -1
- package/src/components/TokenList/TokenListItem.tsx +23 -1
- package/src/config/version.ts +1 -1
- package/src/hooks/useFilteredByTokenBalances.ts +8 -4
- package/src/hooks/useRoutes.ts +17 -23
- package/src/hooks/useTokenSearch.ts +17 -10
- package/src/hooks/useTokens.ts +51 -83
- package/src/i18n/en.json +1 -0
- package/src/providers/I18nProvider/I18nProvider.tsx +39 -2
- package/src/stores/StoreProvider.tsx +2 -1
- package/src/stores/chains/ChainOrderStore.tsx +18 -2
- package/src/stores/settings/types.ts +1 -0
- package/src/stores/settings/utils/getStateValues.ts +1 -0
- package/src/types/token.ts +5 -0
- package/src/types/widget.ts +11 -1
- package/src/utils/token.ts +65 -1
- package/src/utils/tokenList.ts +2 -0
- package/src/utils/variant.ts +16 -0
|
@@ -1,6 +1,17 @@
|
|
|
1
|
-
import type { TokenExtended } from '@lifi/sdk';
|
|
1
|
+
import type { Token, TokenExtended } from '@lifi/sdk';
|
|
2
2
|
import type { FormType } from '../stores/form/types.js';
|
|
3
|
+
import type { TokensByChain } from '../types/token.js';
|
|
3
4
|
import type { WidgetChains, WidgetTokens } from '../types/widget.js';
|
|
5
|
+
/**
|
|
6
|
+
* Merges verified tokens with search tokens.
|
|
7
|
+
* Verified tokens take priority - search tokens are only added if they don't already exist.
|
|
8
|
+
*/
|
|
9
|
+
export declare const mergeVerifiedWithSearchTokens: (verifiedTokens?: TokensByChain, searchTokens?: TokensByChain) => TokensByChain | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Updates a token in the cache by chainId and address.
|
|
12
|
+
* Returns a new cache object with the token updated, or the original if not found.
|
|
13
|
+
*/
|
|
14
|
+
export declare const updateTokenInCache: (data: TokensByChain | undefined, token: Token) => TokensByChain | undefined;
|
|
4
15
|
export declare const filterAllowedTokens: (dataTokens: {
|
|
5
16
|
[chainId: number]: TokenExtended[];
|
|
6
17
|
} | undefined, configTokens?: WidgetTokens, chainsConfig?: WidgetChains, formType?: FormType) => {
|
package/dist/esm/utils/token.js
CHANGED
|
@@ -1,4 +1,48 @@
|
|
|
1
1
|
import { getConfigItemSets, isFormItemAllowed } from './item.js';
|
|
2
|
+
/**
|
|
3
|
+
* Merges verified tokens with search tokens.
|
|
4
|
+
* Verified tokens take priority - search tokens are only added if they don't already exist.
|
|
5
|
+
*/
|
|
6
|
+
export const mergeVerifiedWithSearchTokens = (verifiedTokens, searchTokens) => {
|
|
7
|
+
if (!verifiedTokens) {
|
|
8
|
+
return searchTokens;
|
|
9
|
+
}
|
|
10
|
+
if (!searchTokens) {
|
|
11
|
+
return verifiedTokens;
|
|
12
|
+
}
|
|
13
|
+
const result = { ...verifiedTokens };
|
|
14
|
+
for (const [chainId, tokens] of Object.entries(searchTokens)) {
|
|
15
|
+
const chainIdNum = Number(chainId);
|
|
16
|
+
const existingTokens = result[chainIdNum] || [];
|
|
17
|
+
const existingAddresses = new Set(existingTokens.map((t) => t.address.toLowerCase()));
|
|
18
|
+
const newTokens = tokens.filter((t) => !existingAddresses.has(t.address.toLowerCase()));
|
|
19
|
+
if (newTokens.length) {
|
|
20
|
+
result[chainIdNum] = [...existingTokens, ...newTokens];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Updates a token in the cache by chainId and address.
|
|
27
|
+
* Returns a new cache object with the token updated, or the original if not found.
|
|
28
|
+
*/
|
|
29
|
+
export const updateTokenInCache = (data, token) => {
|
|
30
|
+
if (!data) {
|
|
31
|
+
return data;
|
|
32
|
+
}
|
|
33
|
+
const chainTokens = data[token.chainId];
|
|
34
|
+
if (!chainTokens) {
|
|
35
|
+
return data;
|
|
36
|
+
}
|
|
37
|
+
const index = chainTokens.findIndex((t) => t.address === token.address);
|
|
38
|
+
if (index < 0) {
|
|
39
|
+
return data;
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
...data,
|
|
43
|
+
[token.chainId]: chainTokens.map((t, i) => i === index ? { ...t, ...token } : t),
|
|
44
|
+
};
|
|
45
|
+
};
|
|
2
46
|
export const filterAllowedTokens = (dataTokens, configTokens, chainsConfig, formType) => {
|
|
3
47
|
if (!dataTokens) {
|
|
4
48
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/utils/token.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/utils/token.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,6 +45,8 @@ const processedTypedTokens = (tokens, tokensWithBalances, selectedChainId, confi
|
|
|
45
45
|
typedTokens?.forEach((token) => {
|
|
46
46
|
const tokenAmount = { ...token };
|
|
47
47
|
tokenAmount[tokenType] = true;
|
|
48
|
+
// Config tokens are explicitly set by integrator, mark as verified
|
|
49
|
+
tokenAmount.verified = true;
|
|
48
50
|
const match = filteredTokensMap.get(token.address);
|
|
49
51
|
if (match?.priceUSD) {
|
|
50
52
|
tokenAmount.priceUSD = match.priceUSD;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenList.js","sourceRoot":"","sources":["../../../src/utils/tokenList.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tokenList.js","sourceRoot":"","sources":["../../../src/utils/tokenList.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variant.js","sourceRoot":"","sources":["../../../src/utils/variant.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,KAAgD,EAC/B,EAAE;IACnB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,MAAM,CAAA;IACf,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,KAAK,CAAC,UAAU,CAAA;AACzB,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lifi/widget",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.38.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",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"@bigmi/core": "^0.6.3",
|
|
35
35
|
"@emotion/react": "^11.14.0",
|
|
36
36
|
"@emotion/styled": "^11.14.1",
|
|
37
|
-
"@lifi/sdk": "^3.
|
|
37
|
+
"@lifi/sdk": "^3.14.1",
|
|
38
38
|
"@mui/icons-material": "^7.3.6",
|
|
39
39
|
"@mui/material": "^7.3.6",
|
|
40
40
|
"@mui/system": "^7.3.6",
|
|
@@ -42,17 +42,17 @@
|
|
|
42
42
|
"@solana/wallet-adapter-base": "^0.9.27",
|
|
43
43
|
"@solana/wallet-adapter-coinbase": "^0.1.23",
|
|
44
44
|
"@solana/web3.js": "^1.98.4",
|
|
45
|
-
"@tanstack/react-virtual": "^3.13.
|
|
46
|
-
"i18next": "^25.7.
|
|
45
|
+
"@tanstack/react-virtual": "^3.13.13",
|
|
46
|
+
"i18next": "^25.7.3",
|
|
47
47
|
"microdiff": "^1.5.0",
|
|
48
48
|
"mitt": "^3.0.1",
|
|
49
|
-
"react-i18next": "^16.
|
|
49
|
+
"react-i18next": "^16.5.0",
|
|
50
50
|
"react-intersection-observer": "^9.16.0",
|
|
51
51
|
"react-router-dom": "^6.30.1",
|
|
52
52
|
"react-transition-group": "^4.4.5",
|
|
53
|
-
"viem": "^2.
|
|
53
|
+
"viem": "^2.42.1",
|
|
54
54
|
"zustand": "^5.0.9",
|
|
55
|
-
"@lifi/wallet-management": "^3.
|
|
55
|
+
"@lifi/wallet-management": "^3.21.0"
|
|
56
56
|
},
|
|
57
57
|
"peerDependencies": {
|
|
58
58
|
"@bigmi/react": ">=0.6.0",
|
package/package.json.tmp
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lifi/widget",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.38.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": "./src/index.ts",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"@bigmi/core": "^0.6.3",
|
|
54
54
|
"@emotion/react": "^11.14.0",
|
|
55
55
|
"@emotion/styled": "^11.14.1",
|
|
56
|
-
"@lifi/sdk": "^3.
|
|
56
|
+
"@lifi/sdk": "^3.14.1",
|
|
57
57
|
"@lifi/wallet-management": "workspace:^",
|
|
58
58
|
"@mui/icons-material": "^7.3.6",
|
|
59
59
|
"@mui/material": "^7.3.6",
|
|
@@ -62,25 +62,25 @@
|
|
|
62
62
|
"@solana/wallet-adapter-base": "^0.9.27",
|
|
63
63
|
"@solana/wallet-adapter-coinbase": "^0.1.23",
|
|
64
64
|
"@solana/web3.js": "^1.98.4",
|
|
65
|
-
"@tanstack/react-virtual": "^3.13.
|
|
66
|
-
"i18next": "^25.7.
|
|
65
|
+
"@tanstack/react-virtual": "^3.13.13",
|
|
66
|
+
"i18next": "^25.7.3",
|
|
67
67
|
"microdiff": "^1.5.0",
|
|
68
68
|
"mitt": "^3.0.1",
|
|
69
|
-
"react-i18next": "^16.
|
|
69
|
+
"react-i18next": "^16.5.0",
|
|
70
70
|
"react-intersection-observer": "^9.16.0",
|
|
71
71
|
"react-router-dom": "^6.30.1",
|
|
72
72
|
"react-transition-group": "^4.4.5",
|
|
73
|
-
"viem": "^2.
|
|
73
|
+
"viem": "^2.42.1",
|
|
74
74
|
"zustand": "^5.0.9"
|
|
75
75
|
},
|
|
76
76
|
"devDependencies": {
|
|
77
77
|
"@types/react-transition-group": "^4.4.12",
|
|
78
78
|
"cpy-cli": "^6.0.0",
|
|
79
79
|
"madge": "^8.0.0",
|
|
80
|
-
"react": "^19.2.
|
|
81
|
-
"react-dom": "^19.2.
|
|
80
|
+
"react": "^19.2.3",
|
|
81
|
+
"react-dom": "^19.2.3",
|
|
82
82
|
"typescript": "^5.9.3",
|
|
83
|
-
"vitest": "^4.0.
|
|
83
|
+
"vitest": "^4.0.16"
|
|
84
84
|
},
|
|
85
85
|
"peerDependencies": {
|
|
86
86
|
"@bigmi/react": ">=0.6.0",
|
|
@@ -4,12 +4,8 @@ import Wallet from '@mui/icons-material/Wallet'
|
|
|
4
4
|
import { Badge } from '@mui/material'
|
|
5
5
|
import { useChain } from '../../hooks/useChain.js'
|
|
6
6
|
import type { ToAddress } from '../../types/widget.js'
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
AvatarDefaultBadge,
|
|
10
|
-
AvatarMasked,
|
|
11
|
-
} from './Avatar.style.js'
|
|
12
|
-
import { SmallAvatar } from './SmallAvatar.js'
|
|
7
|
+
import { AvatarDefault, AvatarMasked } from './Avatar.style.js'
|
|
8
|
+
import { ChainBadgeContent } from './ChainBadgeContent.js'
|
|
13
9
|
|
|
14
10
|
interface AccountAvatarProps {
|
|
15
11
|
chainId?: number
|
|
@@ -45,15 +41,7 @@ export const AccountAvatar = ({
|
|
|
45
41
|
<Badge
|
|
46
42
|
overlap="circular"
|
|
47
43
|
anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
|
|
48
|
-
badgeContent={
|
|
49
|
-
chain ? (
|
|
50
|
-
<SmallAvatar src={chain.logoURI} alt={chain.name}>
|
|
51
|
-
{chain.name[0]}
|
|
52
|
-
</SmallAvatar>
|
|
53
|
-
) : (
|
|
54
|
-
<AvatarDefaultBadge />
|
|
55
|
-
)
|
|
56
|
-
}
|
|
44
|
+
badgeContent={<ChainBadgeContent chain={chain} />}
|
|
57
45
|
>
|
|
58
46
|
{avatar}
|
|
59
47
|
</Badge>
|
|
@@ -1,20 +1,19 @@
|
|
|
1
|
+
import type { ExtendedChain } from '@lifi/sdk'
|
|
1
2
|
import type { SxProps, Theme } from '@mui/material'
|
|
2
3
|
import { Badge, Skeleton } from '@mui/material'
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
AvatarDefaultBadge,
|
|
6
|
-
AvatarSkeletonMaskedContainer,
|
|
7
|
-
} from './Avatar.style.js'
|
|
4
|
+
import { AvatarDefault, AvatarSkeletonMaskedContainer } from './Avatar.style.js'
|
|
5
|
+
import { ChainBadgeContent } from './ChainBadgeContent.js'
|
|
8
6
|
import { SmallAvatarSkeleton } from './SmallAvatar.js'
|
|
9
7
|
|
|
10
8
|
export const AvatarBadgedDefault: React.FC<{
|
|
11
9
|
sx?: SxProps<Theme>
|
|
12
|
-
|
|
10
|
+
chain?: ExtendedChain
|
|
11
|
+
}> = ({ sx, chain }) => {
|
|
13
12
|
return (
|
|
14
13
|
<Badge
|
|
15
14
|
overlap="circular"
|
|
16
15
|
anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
|
|
17
|
-
badgeContent={<
|
|
16
|
+
badgeContent={<ChainBadgeContent chain={chain} />}
|
|
18
17
|
sx={sx}
|
|
19
18
|
>
|
|
20
19
|
<AvatarDefault />
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Chain, ExtendedChain } from '@lifi/sdk'
|
|
2
|
+
import { AvatarDefaultBadge } from './Avatar.style.js'
|
|
3
|
+
import { SmallAvatar } from './SmallAvatar.js'
|
|
4
|
+
|
|
5
|
+
interface ChainBadgeContentProps {
|
|
6
|
+
chain?: Chain | ExtendedChain
|
|
7
|
+
size?: number
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const ChainBadgeContent: React.FC<ChainBadgeContentProps> = ({
|
|
11
|
+
chain,
|
|
12
|
+
size = 16,
|
|
13
|
+
}) => {
|
|
14
|
+
if (chain?.logoURI) {
|
|
15
|
+
return (
|
|
16
|
+
<SmallAvatar src={chain.logoURI} alt={chain.name} size={size}>
|
|
17
|
+
{chain.name?.[0]}
|
|
18
|
+
</SmallAvatar>
|
|
19
|
+
)
|
|
20
|
+
}
|
|
21
|
+
return <AvatarDefaultBadge size={size} />
|
|
22
|
+
}
|
|
@@ -4,8 +4,8 @@ import { Badge } from '@mui/material'
|
|
|
4
4
|
import { useChain } from '../../hooks/useChain.js'
|
|
5
5
|
import { useToken } from '../../hooks/useToken.js'
|
|
6
6
|
import { AvatarBadgedSkeleton } from './Avatar.js'
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
7
|
+
import { AvatarMasked } from './Avatar.style.js'
|
|
8
|
+
import { ChainBadgeContent } from './ChainBadgeContent.js'
|
|
9
9
|
|
|
10
10
|
export const TokenAvatar: React.FC<{
|
|
11
11
|
token?: StaticToken
|
|
@@ -83,15 +83,7 @@ const TokenAvatarBase: React.FC<{
|
|
|
83
83
|
<Badge
|
|
84
84
|
overlap="circular"
|
|
85
85
|
anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
|
|
86
|
-
badgeContent={
|
|
87
|
-
chain ? (
|
|
88
|
-
<SmallAvatar src={chain.logoURI} alt={chain.name} size={badgeSize}>
|
|
89
|
-
{chain.name[0]}
|
|
90
|
-
</SmallAvatar>
|
|
91
|
-
) : (
|
|
92
|
-
<AvatarDefaultBadge size={badgeSize} />
|
|
93
|
-
)
|
|
94
|
-
}
|
|
86
|
+
badgeContent={<ChainBadgeContent chain={chain} size={badgeSize} />}
|
|
95
87
|
sx={sx}
|
|
96
88
|
>
|
|
97
89
|
<AvatarMasked
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
ChainId,
|
|
3
|
+
ChainType,
|
|
4
|
+
type EVMChain,
|
|
5
|
+
type ExtendedChain,
|
|
6
|
+
} from '@lifi/sdk'
|
|
2
7
|
import { Avatar, Box } from '@mui/material'
|
|
3
8
|
import { memo, useMemo } from 'react'
|
|
4
9
|
|
|
@@ -12,21 +17,25 @@ const chainTypeIcons = [
|
|
|
12
17
|
name: 'Ethereum',
|
|
13
18
|
chainType: ChainType.EVM,
|
|
14
19
|
icon: 'https://lifinance.github.io/types/src/assets/icons/chains/ethereum.svg',
|
|
20
|
+
defaultChainId: ChainId.ETH,
|
|
15
21
|
},
|
|
16
22
|
{
|
|
17
23
|
name: 'Solana',
|
|
18
24
|
chainType: ChainType.SVM,
|
|
19
25
|
icon: 'https://lifinance.github.io/types/src/assets/icons/chains/solana.svg',
|
|
26
|
+
defaultChainId: ChainId.SOL,
|
|
20
27
|
},
|
|
21
28
|
{
|
|
22
29
|
name: 'Bitcoin',
|
|
23
30
|
chainType: ChainType.UTXO,
|
|
24
31
|
icon: 'https://lifinance.github.io/types/src/assets/icons/chains/bitcoin.svg',
|
|
32
|
+
defaultChainId: ChainId.BTC,
|
|
25
33
|
},
|
|
26
34
|
{
|
|
27
35
|
name: 'Sui',
|
|
28
36
|
chainType: ChainType.MVM,
|
|
29
37
|
icon: 'https://lifinance.github.io/types/src/assets/icons/chains/sui.svg',
|
|
38
|
+
defaultChainId: ChainId.SUI,
|
|
30
39
|
},
|
|
31
40
|
]
|
|
32
41
|
|
|
@@ -35,10 +44,48 @@ const maxChainAvatarsCount = chainTypeIcons.length
|
|
|
35
44
|
export const AllChainsAvatar = memo(
|
|
36
45
|
({ chains, size }: AllChainsAvatarProps) => {
|
|
37
46
|
const icons = useMemo(() => {
|
|
47
|
+
// Create maps for efficient lookups
|
|
48
|
+
const chainsPerChainType = new Map<ChainType, number>()
|
|
49
|
+
const chainsByChainType = new Map<
|
|
50
|
+
ChainType,
|
|
51
|
+
(ExtendedChain | EVMChain)[]
|
|
52
|
+
>()
|
|
53
|
+
|
|
54
|
+
chains.forEach((chain) => {
|
|
55
|
+
chainsPerChainType.set(
|
|
56
|
+
chain.chainType,
|
|
57
|
+
(chainsPerChainType.get(chain.chainType) || 0) + 1
|
|
58
|
+
)
|
|
59
|
+
const chainsOfType = chainsByChainType.get(chain.chainType) || []
|
|
60
|
+
chainsOfType.push(chain)
|
|
61
|
+
chainsByChainType.set(chain.chainType, chainsOfType)
|
|
62
|
+
})
|
|
63
|
+
|
|
38
64
|
// Get existing ecosystem icons
|
|
39
|
-
const existingChainTypeIcons = chainTypeIcons.filter(
|
|
40
|
-
|
|
65
|
+
const existingChainTypeIcons = chainTypeIcons.filter(
|
|
66
|
+
(predefinedChain) => {
|
|
67
|
+
const numberOfChains =
|
|
68
|
+
chainsPerChainType.get(predefinedChain.chainType) ?? 0
|
|
69
|
+
|
|
70
|
+
// If there's only one chain of this type, check if it's not the default
|
|
71
|
+
if (numberOfChains === 1) {
|
|
72
|
+
const chainsOfType = chainsByChainType.get(
|
|
73
|
+
predefinedChain.chainType
|
|
74
|
+
)
|
|
75
|
+
const singleChain = chainsOfType?.[0]
|
|
76
|
+
// Exclude the predefined icon if the single chain is not the default
|
|
77
|
+
if (
|
|
78
|
+
singleChain &&
|
|
79
|
+
singleChain.id !== predefinedChain.defaultChainId
|
|
80
|
+
) {
|
|
81
|
+
return false
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return numberOfChains > 0
|
|
86
|
+
}
|
|
41
87
|
)
|
|
88
|
+
|
|
42
89
|
if (existingChainTypeIcons.length === maxChainAvatarsCount) {
|
|
43
90
|
return existingChainTypeIcons
|
|
44
91
|
}
|
|
@@ -46,13 +93,14 @@ export const AllChainsAvatar = memo(
|
|
|
46
93
|
const remainingSlots =
|
|
47
94
|
maxChainAvatarsCount - existingChainTypeIcons.length
|
|
48
95
|
|
|
96
|
+
// Create a Set for O(1) lookup of predefined icon names
|
|
97
|
+
const predefinedIconNames = new Set(
|
|
98
|
+
existingChainTypeIcons.map((icon) => icon.name)
|
|
99
|
+
)
|
|
100
|
+
|
|
49
101
|
const chainsWithLogos = chains.filter((chain) => {
|
|
50
102
|
// Filter out chain icons matching ecosystem icons
|
|
51
|
-
|
|
52
|
-
(icon) => icon.name === chain.name
|
|
53
|
-
)
|
|
54
|
-
const hasLogoURI = Boolean(chain.logoURI)
|
|
55
|
-
return !hasPredefinedIcon && hasLogoURI
|
|
103
|
+
return !predefinedIconNames.has(chain.name) && Boolean(chain.logoURI)
|
|
56
104
|
})
|
|
57
105
|
|
|
58
106
|
const additionalIcons = chainsWithLogos
|
|
@@ -29,7 +29,15 @@ export const ChainSearchInput = ({
|
|
|
29
29
|
|
|
30
30
|
if (inExpansion) {
|
|
31
31
|
return (
|
|
32
|
-
<Box
|
|
32
|
+
<Box
|
|
33
|
+
sx={{
|
|
34
|
+
pt: 3,
|
|
35
|
+
pb: 2,
|
|
36
|
+
px: 2.5,
|
|
37
|
+
height: searchHeaderHeight,
|
|
38
|
+
boxSizing: 'border-box',
|
|
39
|
+
}}
|
|
40
|
+
>
|
|
33
41
|
<SearchInput
|
|
34
42
|
inputRef={inputRef}
|
|
35
43
|
onChange={onChange}
|
|
@@ -34,8 +34,12 @@ export const NavigationHeader: React.FC = () => {
|
|
|
34
34
|
const path = cleanedPathname.substring(cleanedPathname.lastIndexOf('/') + 1)
|
|
35
35
|
const hasPath = navigationRoutesValues.includes(path)
|
|
36
36
|
|
|
37
|
+
// Show tabs when split is undefined (default tabs) or an object with defaultTab
|
|
38
|
+
// Hide tabs when split is a string ('bridge' or 'swap' - single mode)
|
|
37
39
|
const showSplitOptions =
|
|
38
|
-
subvariant === 'split' &&
|
|
40
|
+
subvariant === 'split' &&
|
|
41
|
+
!hasPath &&
|
|
42
|
+
typeof subvariantOptions?.split !== 'string'
|
|
39
43
|
|
|
40
44
|
return (
|
|
41
45
|
<HeaderAppBar elevation={0} sx={{ paddingTop: 1, paddingBottom: 0.5 }}>
|
|
@@ -44,7 +44,8 @@ export const RouteCard: React.FC<
|
|
|
44
44
|
? { ...route.fromToken, amount: BigInt(route.fromAmount) }
|
|
45
45
|
: { ...route.toToken, amount: BigInt(route.toAmount) }
|
|
46
46
|
const impactToken: TokenAmount | undefined =
|
|
47
|
-
subvariant !== 'custom'
|
|
47
|
+
subvariant !== 'custom' &&
|
|
48
|
+
!hiddenUI?.includes(HiddenUI.RouteCardPriceImpact)
|
|
48
49
|
? { ...route.fromToken, amount: BigInt(route.fromAmount) }
|
|
49
50
|
: undefined
|
|
50
51
|
|
|
@@ -5,6 +5,8 @@ import { useChain } from '../../hooks/useChain.js'
|
|
|
5
5
|
import { useSwapOnly } from '../../hooks/useSwapOnly.js'
|
|
6
6
|
import { useToken } from '../../hooks/useToken.js'
|
|
7
7
|
import { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'
|
|
8
|
+
import { useChainOrderStore } from '../../stores/chains/ChainOrderStore.js'
|
|
9
|
+
import type { ChainOrderState } from '../../stores/chains/types.js'
|
|
8
10
|
import type { FormTypeProps } from '../../stores/form/types.js'
|
|
9
11
|
import { FormKeyHelper } from '../../stores/form/types.js'
|
|
10
12
|
import { useFieldValues } from '../../stores/form/useFieldValues.js'
|
|
@@ -37,6 +39,10 @@ export const SelectTokenButton: React.FC<
|
|
|
37
39
|
const { chain, isLoading: isChainLoading } = useChain(chainId)
|
|
38
40
|
const { token, isLoading: isTokenLoading } = useToken(chainId, tokenAddress)
|
|
39
41
|
|
|
42
|
+
const isAllNetworks = useChainOrderStore(
|
|
43
|
+
(state: ChainOrderState) => state[`${formType}IsAllNetworks`]
|
|
44
|
+
)
|
|
45
|
+
|
|
40
46
|
const handleClick = () => {
|
|
41
47
|
navigate(
|
|
42
48
|
formType === 'from'
|
|
@@ -77,7 +83,9 @@ export const SelectTokenButton: React.FC<
|
|
|
77
83
|
isSelected ? (
|
|
78
84
|
<TokenAvatar token={token} chain={chain} />
|
|
79
85
|
) : (
|
|
80
|
-
<AvatarBadgedDefault
|
|
86
|
+
<AvatarBadgedDefault
|
|
87
|
+
chain={isAllNetworks ? undefined : chain}
|
|
88
|
+
/>
|
|
81
89
|
)
|
|
82
90
|
}
|
|
83
91
|
title={isSelected ? token.symbol : defaultPlaceholder}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { StaticToken } from '@lifi/sdk'
|
|
2
2
|
import { ChainType } from '@lifi/sdk'
|
|
3
3
|
import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined'
|
|
4
|
+
import WarningRounded from '@mui/icons-material/WarningRounded'
|
|
4
5
|
import {
|
|
5
6
|
Avatar,
|
|
6
7
|
Box,
|
|
@@ -9,6 +10,7 @@ import {
|
|
|
9
10
|
listItemSecondaryActionClasses,
|
|
10
11
|
Skeleton,
|
|
11
12
|
Slide,
|
|
13
|
+
Tooltip,
|
|
12
14
|
Typography,
|
|
13
15
|
} from '@mui/material'
|
|
14
16
|
import type { MouseEventHandler } from 'react'
|
|
@@ -189,7 +191,27 @@ const TokenListItemButton: React.FC<TokenListItemButtonProps> = memo(
|
|
|
189
191
|
)}
|
|
190
192
|
</ListItemAvatar>
|
|
191
193
|
<ListItemText
|
|
192
|
-
primary={
|
|
194
|
+
primary={
|
|
195
|
+
<Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>
|
|
196
|
+
{token.symbol}
|
|
197
|
+
{!token.verified && (
|
|
198
|
+
<Tooltip
|
|
199
|
+
title={t('warning.message.unverifiedToken')}
|
|
200
|
+
placement="top"
|
|
201
|
+
arrow
|
|
202
|
+
>
|
|
203
|
+
<WarningRounded
|
|
204
|
+
sx={{
|
|
205
|
+
display: 'flex',
|
|
206
|
+
fontSize: 16,
|
|
207
|
+
color: 'warning.main',
|
|
208
|
+
cursor: 'help',
|
|
209
|
+
}}
|
|
210
|
+
/>
|
|
211
|
+
</Tooltip>
|
|
212
|
+
)}
|
|
213
|
+
</Box>
|
|
214
|
+
}
|
|
193
215
|
slotProps={{
|
|
194
216
|
secondary: {
|
|
195
217
|
component: 'div',
|
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.38.0'
|
|
@@ -96,8 +96,8 @@ export const useFilteredTokensByBalance = (
|
|
|
96
96
|
formType
|
|
97
97
|
)
|
|
98
98
|
|
|
99
|
-
const additionalTokens = balances
|
|
100
|
-
(balance: WalletTokenExtended) => {
|
|
99
|
+
const additionalTokens = balances
|
|
100
|
+
.filter((balance: WalletTokenExtended) => {
|
|
101
101
|
const balanceKey = balance.address.toLowerCase()
|
|
102
102
|
return (
|
|
103
103
|
!chainTokenSet.has(balanceKey) &&
|
|
@@ -109,8 +109,12 @@ export const useFilteredTokensByBalance = (
|
|
|
109
109
|
(t) => t.address.toLowerCase()
|
|
110
110
|
)
|
|
111
111
|
)
|
|
112
|
-
}
|
|
113
|
-
|
|
112
|
+
})
|
|
113
|
+
// Mark tokens from wallet balances as unverified
|
|
114
|
+
.map((token: WalletTokenExtended) => ({
|
|
115
|
+
...token,
|
|
116
|
+
verified: false,
|
|
117
|
+
})) as TokenExtended[]
|
|
114
118
|
|
|
115
119
|
// Combine both sets of tokens - convert WalletTokenExtended to TokenAmount
|
|
116
120
|
const allTokens = [
|