@lifi/widget 3.8.1 → 3.9.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.
Files changed (108) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/esm/components/Avatar/Avatar.style.js +3 -3
  3. package/dist/esm/components/Avatar/Avatar.style.js.map +1 -1
  4. package/dist/esm/components/Header/WalletHeader.js +9 -3
  5. package/dist/esm/components/Header/WalletHeader.js.map +1 -1
  6. package/dist/esm/components/ReverseTokensButton/ReverseTokensButton.js +16 -1
  7. package/dist/esm/components/ReverseTokensButton/ReverseTokensButton.js.map +1 -1
  8. package/dist/esm/components/TokenList/TokenList.js +6 -4
  9. package/dist/esm/components/TokenList/TokenList.js.map +1 -1
  10. package/dist/esm/components/TokenList/TokenListItem.js +1 -1
  11. package/dist/esm/components/TokenList/TokenListItem.js.map +1 -1
  12. package/dist/esm/components/TokenList/types.d.ts +2 -2
  13. package/dist/esm/components/TokenList/useTokenSelect.d.ts +4 -0
  14. package/dist/esm/components/TokenList/useTokenSelect.js +19 -10
  15. package/dist/esm/components/TokenList/useTokenSelect.js.map +1 -1
  16. package/dist/esm/config/version.d.ts +1 -1
  17. package/dist/esm/config/version.js +1 -1
  18. package/dist/esm/hooks/useAvailableChains.d.ts +2 -1
  19. package/dist/esm/hooks/useAvailableChains.js.map +1 -1
  20. package/dist/esm/hooks/useChain.d.ts +1 -0
  21. package/dist/esm/hooks/useChain.js +1 -0
  22. package/dist/esm/hooks/useChain.js.map +1 -1
  23. package/dist/esm/hooks/useChains.d.ts +1 -1
  24. package/dist/esm/hooks/useGasSufficiency.js +5 -5
  25. package/dist/esm/hooks/useGasSufficiency.js.map +1 -1
  26. package/dist/esm/hooks/useIsContractAddress.d.ts +2 -0
  27. package/dist/esm/hooks/useIsContractAddress.js +16 -0
  28. package/dist/esm/hooks/useIsContractAddress.js.map +1 -0
  29. package/dist/esm/hooks/useToAddressAutoPopulate.d.ts +12 -0
  30. package/dist/esm/hooks/useToAddressAutoPopulate.js +68 -0
  31. package/dist/esm/hooks/useToAddressAutoPopulate.js.map +1 -0
  32. package/dist/esm/hooks/useToAddressRequirements.d.ts +1 -1
  33. package/dist/esm/hooks/useToAddressRequirements.js +9 -1
  34. package/dist/esm/hooks/useToAddressRequirements.js.map +1 -1
  35. package/dist/esm/hooks/useToAddressReset.js +15 -8
  36. package/dist/esm/hooks/useToAddressReset.js.map +1 -1
  37. package/dist/esm/i18n/bn.json +8 -2
  38. package/dist/esm/i18n/de.json +8 -2
  39. package/dist/esm/i18n/es.json +8 -2
  40. package/dist/esm/i18n/fr.json +8 -2
  41. package/dist/esm/i18n/hi.json +8 -2
  42. package/dist/esm/i18n/id.json +8 -2
  43. package/dist/esm/i18n/it.json +8 -2
  44. package/dist/esm/i18n/ja.json +8 -2
  45. package/dist/esm/i18n/ko.json +8 -2
  46. package/dist/esm/i18n/pt.json +8 -2
  47. package/dist/esm/i18n/th.json +8 -2
  48. package/dist/esm/i18n/tr.json +8 -2
  49. package/dist/esm/i18n/uk.json +8 -2
  50. package/dist/esm/i18n/vi.json +8 -2
  51. package/dist/esm/i18n/zh.json +8 -2
  52. package/dist/esm/pages/SendToWallet/BookmarksPage.js +1 -0
  53. package/dist/esm/pages/SendToWallet/BookmarksPage.js.map +1 -1
  54. package/dist/esm/pages/SendToWallet/ConfirmAddressSheet.js +1 -0
  55. package/dist/esm/pages/SendToWallet/ConfirmAddressSheet.js.map +1 -1
  56. package/dist/esm/pages/SendToWallet/ConnectedWalletsPage.js +1 -0
  57. package/dist/esm/pages/SendToWallet/ConnectedWalletsPage.js.map +1 -1
  58. package/dist/esm/pages/SendToWallet/RecentWalletsPage.js +1 -0
  59. package/dist/esm/pages/SendToWallet/RecentWalletsPage.js.map +1 -1
  60. package/dist/esm/pages/SendToWallet/SendToConfiguredWalletPage.js +4 -1
  61. package/dist/esm/pages/SendToWallet/SendToConfiguredWalletPage.js.map +1 -1
  62. package/dist/esm/stores/form/createFormStore.js +1 -0
  63. package/dist/esm/stores/form/createFormStore.js.map +1 -1
  64. package/dist/esm/stores/form/types.d.ts +1 -0
  65. package/dist/esm/stores/form/types.js.map +1 -1
  66. package/dist/esm/stores/form/useFieldActions.d.ts +1 -0
  67. package/dist/esm/stores/form/useFieldActions.js +1 -0
  68. package/dist/esm/stores/form/useFieldActions.js.map +1 -1
  69. package/package.json +11 -11
  70. package/src/components/Avatar/Avatar.style.tsx +3 -3
  71. package/src/components/Header/WalletHeader.tsx +14 -5
  72. package/src/components/ReverseTokensButton/ReverseTokensButton.tsx +25 -6
  73. package/src/components/TokenList/TokenList.tsx +7 -4
  74. package/src/components/TokenList/TokenListItem.tsx +1 -1
  75. package/src/components/TokenList/types.ts +2 -2
  76. package/src/components/TokenList/useTokenSelect.ts +39 -16
  77. package/src/config/version.ts +1 -1
  78. package/src/hooks/useAvailableChains.ts +6 -1
  79. package/src/hooks/useChain.ts +1 -0
  80. package/src/hooks/useGasSufficiency.ts +11 -8
  81. package/src/hooks/useIsContractAddress.ts +21 -0
  82. package/src/hooks/useToAddressAutoPopulate.ts +95 -0
  83. package/src/hooks/useToAddressRequirements.ts +13 -2
  84. package/src/hooks/useToAddressReset.ts +15 -8
  85. package/src/i18n/bn.json +8 -2
  86. package/src/i18n/de.json +8 -2
  87. package/src/i18n/es.json +8 -2
  88. package/src/i18n/fr.json +8 -2
  89. package/src/i18n/hi.json +8 -2
  90. package/src/i18n/id.json +8 -2
  91. package/src/i18n/it.json +8 -2
  92. package/src/i18n/ja.json +8 -2
  93. package/src/i18n/ko.json +8 -2
  94. package/src/i18n/pt.json +8 -2
  95. package/src/i18n/th.json +8 -2
  96. package/src/i18n/tr.json +8 -2
  97. package/src/i18n/uk.json +8 -2
  98. package/src/i18n/vi.json +8 -2
  99. package/src/i18n/zh.json +8 -2
  100. package/src/pages/SendToWallet/BookmarksPage.tsx +1 -0
  101. package/src/pages/SendToWallet/ConfirmAddressSheet.tsx +1 -0
  102. package/src/pages/SendToWallet/ConnectedWalletsPage.tsx +1 -0
  103. package/src/pages/SendToWallet/RecentWalletsPage.tsx +1 -0
  104. package/src/pages/SendToWallet/SendToConfiguredWalletPage.tsx +4 -1
  105. package/src/stores/form/createFormStore.ts +2 -0
  106. package/src/stores/form/types.ts +1 -0
  107. package/src/stores/form/useFieldActions.ts +1 -0
  108. package/src/stores/header/useHeaderStore.tsx +1 -1
@@ -1,8 +1,8 @@
1
1
  import type { EVMChain, RouteExtended, Token } from '@lifi/sdk'
2
2
  import { useAccount } from '@lifi/wallet-management'
3
3
  import { useQuery } from '@tanstack/react-query'
4
- import type { Connector } from 'wagmi'
5
4
  import { useAvailableChains } from './useAvailableChains.js'
5
+ import { useIsContractAddress } from './useIsContractAddress.js'
6
6
  import { getTokenBalancesWithRetry } from './useTokenBalance.js'
7
7
 
8
8
  export interface GasSufficiency {
@@ -22,12 +22,19 @@ export const useGasSufficiency = (route?: RouteExtended) => {
22
22
  chainType: getChainById(route?.fromChainId)?.chainType,
23
23
  })
24
24
 
25
+ const isContractAddress = useIsContractAddress(
26
+ account.address,
27
+ route?.fromChainId,
28
+ account.chainType
29
+ )
30
+
25
31
  const { data: insufficientGas, isLoading } = useQuery({
26
32
  queryKey: ['gas-sufficiency-check', account.address, route?.id],
27
33
  queryFn: async ({ queryKey: [, accountAddress] }) => {
28
34
  if (!route) {
29
35
  return
30
36
  }
37
+
31
38
  // We assume that LI.Fuel protocol always refuels the destination chain
32
39
  const hasRefuelStep = route.steps
33
40
  .flatMap((step) => step.includedSteps)
@@ -40,11 +47,7 @@ export const useGasSufficiency = (route?: RouteExtended) => {
40
47
  // We need to avoid destination chain step sufficiency check if we have LI.Fuel protocol sub-step
41
48
  const skipDueToRefuel =
42
49
  step.action.fromChainId === route.toChainId && hasRefuelStep
43
- if (
44
- step.estimate.gasCosts &&
45
- (account.connector as Connector)?.id !== 'safe' &&
46
- !skipDueToRefuel
47
- ) {
50
+ if (step.estimate.gasCosts && !skipDueToRefuel) {
48
51
  const { token } = step.estimate.gasCosts[0]
49
52
  const gasCostAmount = step.estimate.gasCosts.reduce(
50
53
  (amount, gasCost) =>
@@ -96,7 +99,7 @@ export const useGasSufficiency = (route?: RouteExtended) => {
96
99
  )
97
100
 
98
101
  if (!tokenBalances?.length) {
99
- return []
102
+ return
100
103
  }
101
104
  ;[route.fromChainId, route.toChainId].forEach((chainId) => {
102
105
  if (gasCosts[chainId]) {
@@ -133,7 +136,7 @@ export const useGasSufficiency = (route?: RouteExtended) => {
133
136
  return gasCostResult
134
137
  },
135
138
 
136
- enabled: Boolean(account.address && route),
139
+ enabled: Boolean(!isContractAddress && account.address && route),
137
140
  refetchInterval,
138
141
  staleTime: refetchInterval,
139
142
  })
@@ -0,0 +1,21 @@
1
+ import { ChainType } from '@lifi/sdk'
2
+ import type { Address } from 'viem'
3
+ import { useBytecode } from 'wagmi'
4
+
5
+ export const useIsContractAddress = (
6
+ address?: string,
7
+ chainId?: number,
8
+ chainType?: ChainType
9
+ ) => {
10
+ const { data: contractCode } = useBytecode({
11
+ address: address as Address,
12
+ chainId: chainId,
13
+ query: {
14
+ refetchInterval: 300_000,
15
+ staleTime: 300_000,
16
+ enabled: Boolean(chainType === ChainType.EVM && chainId),
17
+ },
18
+ })
19
+ const isContractAddress = !!contractCode
20
+ return isContractAddress
21
+ }
@@ -0,0 +1,95 @@
1
+ import { useAccount } from '@lifi/wallet-management'
2
+ import { useCallback } from 'react'
3
+ import { useBookmarkActions } from '../stores/bookmarks/useBookmarkActions.js'
4
+ import type { FormType } from '../stores/form/types.js'
5
+ import { useFieldActions } from '../stores/form/useFieldActions.js'
6
+ import { useSendToWalletActions } from '../stores/settings/useSendToWalletStore.js'
7
+ import { getChainTypeFromAddress } from '../utils/chainType.js'
8
+ import { useAvailableChains } from './useAvailableChains.js'
9
+
10
+ export type UpdateToAddressArgs = {
11
+ formType: FormType
12
+ selectedToAddress?: string
13
+ selectedChainId?: number
14
+ selectedOppositeTokenAddress?: string
15
+ selectedOppositeChainId?: number
16
+ }
17
+
18
+ /**
19
+ * Automatically populates toAddress field if bridging across ecosystems and compatible wallet is connected
20
+ */
21
+ export const useToAddressAutoPopulate = () => {
22
+ const { setFieldValue } = useFieldActions()
23
+ const { setSendToWallet } = useSendToWalletActions()
24
+ const { setSelectedBookmark } = useBookmarkActions()
25
+ const { getChainById } = useAvailableChains()
26
+ const { accounts } = useAccount()
27
+
28
+ return useCallback(
29
+ ({
30
+ formType,
31
+ selectedToAddress,
32
+ selectedChainId,
33
+ selectedOppositeTokenAddress,
34
+ selectedOppositeChainId,
35
+ }: UpdateToAddressArgs) => {
36
+ if (
37
+ !selectedOppositeTokenAddress ||
38
+ !selectedOppositeChainId ||
39
+ !selectedChainId ||
40
+ !accounts?.length
41
+ ) {
42
+ return
43
+ }
44
+ const selectedChain = getChainById?.(selectedChainId)
45
+ const selectedOppositeChain = getChainById?.(selectedOppositeChainId)
46
+ // Proceed if both chains are defined and of different ecosystem types (indicating cross-ecosystem bridging)
47
+ if (
48
+ !selectedChain ||
49
+ !selectedOppositeChain ||
50
+ selectedChain.chainType === selectedOppositeChain.chainType
51
+ ) {
52
+ return
53
+ }
54
+ // Identify the destination chain type based on the bridge direction ('from' or 'to')
55
+ const destinationChainType =
56
+ formType === 'from'
57
+ ? selectedOppositeChain.chainType
58
+ : selectedChain.chainType
59
+ // If toAddress is already selected, verify that it matches the destination chain type
60
+ if (selectedToAddress) {
61
+ const selectedToAddressChainType =
62
+ getChainTypeFromAddress(selectedToAddress)
63
+ if (destinationChainType === selectedToAddressChainType) {
64
+ return
65
+ }
66
+ }
67
+ // Find connected account compatible with the destination chain type
68
+ const destinationAccount = accounts?.find(
69
+ (account) => account.chainType === destinationChainType
70
+ )
71
+ // If a compatible destination account is found, set toAddress as if selecting it from the "Send to Wallet" connected wallets page
72
+ if (destinationAccount?.address) {
73
+ setFieldValue('toAddress', destinationAccount.address, {
74
+ isDirty: false,
75
+ isTouched: true,
76
+ })
77
+ setSelectedBookmark({
78
+ name: destinationAccount.connector?.name,
79
+ address: destinationAccount.address,
80
+ chainType: destinationAccount.chainType,
81
+ isConnectedAccount: true,
82
+ })
83
+ setSendToWallet(true)
84
+ return destinationAccount.address
85
+ }
86
+ },
87
+ [
88
+ accounts,
89
+ getChainById,
90
+ setFieldValue,
91
+ setSelectedBookmark,
92
+ setSendToWallet,
93
+ ]
94
+ )
95
+ }
@@ -1,20 +1,31 @@
1
+ import { useAccount } from '@lifi/wallet-management'
1
2
  import { useChain } from '../hooks/useChain.js'
2
3
  import { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'
3
4
  import { useFieldValues } from '../stores/form/useFieldValues.js'
4
5
  import { RequiredUI } from '../types/widget.js'
6
+ import { useIsContractAddress } from './useIsContractAddress.js'
5
7
 
6
8
  export const useToAddressRequirements = () => {
7
9
  const { requiredUI } = useWidgetConfig()
8
10
  const [fromChainId, toChainId] = useFieldValues('fromChain', 'toChain')
9
-
10
11
  const { chain: fromChain } = useChain(fromChainId)
11
12
  const { chain: toChain } = useChain(toChainId)
13
+ const { account } = useAccount({
14
+ chainType: fromChain?.chainType,
15
+ })
16
+ const isFromContractAddress = useIsContractAddress(
17
+ account.address,
18
+ fromChainId,
19
+ account.chainType
20
+ )
12
21
 
13
22
  const isDifferentChainType =
14
23
  fromChain && toChain && fromChain.chainType !== toChain.chainType
15
24
 
16
25
  const requiredToAddress =
17
- requiredUI?.includes(RequiredUI.ToAddress) || isDifferentChainType
26
+ requiredUI?.includes(RequiredUI.ToAddress) ||
27
+ isDifferentChainType ||
28
+ isFromContractAddress
18
29
 
19
30
  return {
20
31
  requiredToAddress,
@@ -3,13 +3,15 @@ import { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'
3
3
  import { useBookmarkActions } from '../stores/bookmarks/useBookmarkActions.js'
4
4
  import { useBookmarks } from '../stores/bookmarks/useBookmarks.js'
5
5
  import { useFieldActions } from '../stores/form/useFieldActions.js'
6
+ import { useSendToWalletActions } from '../stores/settings/useSendToWalletStore.js'
6
7
  import { RequiredUI } from '../types/widget.js'
7
8
 
8
9
  export const useToAddressReset = () => {
9
10
  const { requiredUI } = useWidgetConfig()
10
- const { setFieldValue } = useFieldActions()
11
+ const { setFieldValue, isDirty } = useFieldActions()
11
12
  const { selectedBookmark } = useBookmarks()
12
13
  const { setSelectedBookmark } = useBookmarkActions()
14
+ const { setSendToWallet } = useSendToWalletActions()
13
15
 
14
16
  const tryResetToAddress = (toChain: ExtendedChain) => {
15
17
  const requiredToAddress = requiredUI?.includes(RequiredUI.ToAddress)
@@ -20,15 +22,20 @@ export const useToAddressReset = () => {
20
22
  const shouldResetToAddress =
21
23
  !requiredToAddress && !bookmarkSatisfiesToChainType
22
24
 
23
- // toAddress field is required (always visible) when bridging between
24
- // two ecosystems (fromChain and toChain have different chain types).
25
- // We clean up toAddress on every chain change if toAddress is not required.
26
- // This is used when we switch between different chain ecosystems (chain types) and
27
- // prevents cases when after we switch the chain from one type to another "Send to wallet" field hides,
28
- // but it keeps toAddress value set for the previous chain pair.
25
+ // The toAddress field is required and always visible when bridging between
26
+ // different ecosystems (fromChain and toChain have different chain types).
27
+ // We reset toAddress on each chain change if it's no longer required, ensuring that
28
+ // switching chain types doesn't leave a previously set toAddress value when
29
+ // the "Send to Wallet" field is hidden.
29
30
  if (shouldResetToAddress) {
30
- setFieldValue('toAddress', '')
31
+ setFieldValue('toAddress', '', { isTouched: true })
31
32
  setSelectedBookmark()
33
+ // If toAddress was auto-filled (e.g., when making cross-ecosystem bridging and compatible destination wallet was connected)
34
+ // and not manually edited by the user, we need to hide "Send to Wallet".
35
+ const isToAddressDirty = isDirty('toAddress')
36
+ if (!isToAddressDirty) {
37
+ setSendToWallet(false)
38
+ }
32
39
  }
33
40
  }
34
41
 
package/src/i18n/bn.json CHANGED
@@ -82,6 +82,9 @@
82
82
  "autoRefuel": "আপনার {{chainName}} গ্যাস কম। চালিয়ে যাওয়ার মাধ্যমে, আপনি সোওয়াপ সম্পূর্ণ করার জন্য পর্যাপ্ত গ্যাস পাবেন।",
83
83
  "emptyActiveTransactions": "",
84
84
  "emptyTokenList": "",
85
+ "emptyChainList": "",
86
+ "emptyBridgesList": "",
87
+ "emptyExchangesList": "",
85
88
  "emptyTransactionHistory": "",
86
89
  "fundsToExchange": "",
87
90
  "toAddressIsRequired": "",
@@ -265,7 +268,7 @@
265
268
  "stepSwapAndBridge": "সোওয়াপ এবং ব্রিজ",
266
269
  "stepSwapAndBuy": "",
267
270
  "stepSwapAndDeposit": "",
268
- "supportId": "সাপোর্ট আইডি",
271
+ "transferId": "",
269
272
  "swapStepDetails": "{{tool}} এর মাধ্যমে {{chain}} এ সোওয়াপ করুন",
270
273
  "tags": {
271
274
  "cheapest": "",
@@ -275,7 +278,10 @@
275
278
  "tokenOnChain": "{{chainName}} -এ {{tokenSymbol}}",
276
279
  "tokenOnChainAmount": "{{amount, number(maximumFractionDigits: 9)}} {{tokenSymbol}} {{chainName}} -এ",
277
280
  "tokenSearch": "আপনার টোকেন অনুসন্ধান করুন",
278
- "valueLoss": "মান ক্ষতি"
281
+ "valueLoss": "মান ক্ষতি",
282
+ "searchChains": "",
283
+ "searchBridges": "",
284
+ "searchExchanges": ""
279
285
  },
280
286
  "settings": {
281
287
  "theme": "",
package/src/i18n/de.json CHANGED
@@ -82,6 +82,9 @@
82
82
  "autoRefuel": "Sie haben nicht genug Gas auf {{chainName}}. Wenn Sie fortfahren, erhalten Sie zusätzlich genug Gas um den Swap abzuschließen.",
83
83
  "emptyActiveTransactions": "Laufende Swaps werden hier angezeigt. Sobald Sie fertig sind, finden Sie sie in der Transaktionshistorie.",
84
84
  "emptyTokenList": "Es wurden keine Tokens auf der Chain {{chainName}} gefunden oder Sie haben keine. Bitte versuchen Sie die Suche erneut mit der Contract-Adresse falls Ihr Token nicht erscheint oder wechseln Sie die Chain.",
85
+ "emptyChainList": "",
86
+ "emptyBridgesList": "",
87
+ "emptyExchangesList": "",
85
88
  "emptyTransactionHistory": "Die Transaktionshistorie wird nur lokal gespeichert und gelöscht, wenn Sie Ihre Browserdaten löschen.",
86
89
  "fundsToExchange": "",
87
90
  "toAddressIsRequired": "",
@@ -265,7 +268,7 @@
265
268
  "stepSwapAndBridge": "Tauschen und überbrücken",
266
269
  "stepSwapAndBuy": "Tauschen und kaufen",
267
270
  "stepSwapAndDeposit": "",
268
- "supportId": "Support-ID",
271
+ "transferId": "",
269
272
  "swapStepDetails": "Tausche auf {{chain}} über {{tool}}",
270
273
  "tags": {
271
274
  "cheapest": "",
@@ -275,7 +278,10 @@
275
278
  "tokenOnChain": "{{tokenSymbol}} auf {{chainName}}",
276
279
  "tokenOnChainAmount": "{{amount, number(maximumFractionDigits: 4)}} {{tokenSymbol}} auf {{chainName}}",
277
280
  "tokenSearch": "Suchen Sie Ihren Token",
278
- "valueLoss": "Wertverlust"
281
+ "valueLoss": "Wertverlust",
282
+ "searchChains": "",
283
+ "searchBridges": "",
284
+ "searchExchanges": ""
279
285
  },
280
286
  "settings": {
281
287
  "theme": "",
package/src/i18n/es.json CHANGED
@@ -82,6 +82,9 @@
82
82
  "autoRefuel": "Tienes poco gas en {{chainName}}. Al continuar, obtendrás suficiente gas para completar la transacción.",
83
83
  "emptyActiveTransactions": "Las transacciones en progreso aparecerán aquí. Una vez completadas, encuéntralas en el historial de transacciones.",
84
84
  "emptyTokenList": "No pudimos encontrar tokens en la cadena {{chainName}} o no tienes ninguno. Por favor, busque por dirección de contrato si su token no aparece o elija otra cadena.",
85
+ "emptyChainList": "",
86
+ "emptyBridgesList": "",
87
+ "emptyExchangesList": "",
85
88
  "emptyTransactionHistory": "El historial de intercambio solo se almacena localmente y se eliminará si borra los datos de su navegador.",
86
89
  "fundsToExchange": "Los fondos enviados a la billetera de un exchange se pueden perder",
87
90
  "toAddressIsRequired": "Por favor, proporcione la dirección de la billetera de destino a la que se transferirán los fondos.",
@@ -265,7 +268,7 @@
265
268
  "stepSwapAndBridge": "Swap y cruzar",
266
269
  "stepSwapAndBuy": "Intercambiar y comprar",
267
270
  "stepSwapAndDeposit": "",
268
- "supportId": "ID de soporte",
271
+ "transferId": "",
269
272
  "swapStepDetails": "Intercambiar en {{chain}} a través de {{tool}}",
270
273
  "tags": {
271
274
  "cheapest": "Mejor retorno",
@@ -275,7 +278,10 @@
275
278
  "tokenOnChain": "{{tokenSymbol}} en {{chainName}}",
276
279
  "tokenOnChainAmount": "{{amount, number(maximumFractionDigits: 4)}} {{tokenSymbol}} on {{chainName}}",
277
280
  "tokenSearch": "Busque su token",
278
- "valueLoss": "Valor perdido"
281
+ "valueLoss": "Valor perdido",
282
+ "searchChains": "",
283
+ "searchBridges": "",
284
+ "searchExchanges": ""
279
285
  },
280
286
  "settings": {
281
287
  "theme": "Tema",
package/src/i18n/fr.json CHANGED
@@ -82,6 +82,9 @@
82
82
  "autoRefuel": "Vous avez peu de gaz sur {{chainName}}. En continuant, vous aurez assez de gaz pour compléter l'échange.",
83
83
  "emptyActiveTransactions": "Les transactions en cours apparaîtront ici. Une fois terminées, retrouvez-les dans l'historique des transactions.",
84
84
  "emptyTokenList": "Nous n'avons pas pu trouver de jetons sur la chaîne {{chainName}} ou vous n'en avez pas. Veuillez rechercher par adresse de contrat si votre jeton n'apparaît pas ou choisissez une autre chaîne.",
85
+ "emptyChainList": "",
86
+ "emptyBridgesList": "",
87
+ "emptyExchangesList": "",
85
88
  "emptyTransactionHistory": "L'historique de transaction est uniquement stocké au niveau local et sera supprimé si vous effacez les données de votre navigateur.",
86
89
  "fundsToExchange": "Les fonds envoyés à un échange peuvent être perdus",
87
90
  "toAddressIsRequired": "Veuillez fournir l'adresse du portefeuille de destination vers laquelle les fonds seront transférés.",
@@ -265,7 +268,7 @@
265
268
  "stepSwapAndBridge": "Échange et Bridge",
266
269
  "stepSwapAndBuy": "Échanger et acheter",
267
270
  "stepSwapAndDeposit": "",
268
- "supportId": "ID de support",
271
+ "transferId": "",
269
272
  "swapStepDetails": "Échanger sur {{chain}} via {{tool}}",
270
273
  "tags": {
271
274
  "cheapest": "Meilleur Retour",
@@ -275,7 +278,10 @@
275
278
  "tokenOnChain": "{{tokenSymbol}} sur {{chainName}}",
276
279
  "tokenOnChainAmount": "{{amount, number(maximumFractionDigits: 4)}} {{tokenSymbol}} sur {{chainName}}",
277
280
  "tokenSearch": "Recherche par nom de jeton ou adresse",
278
- "valueLoss": "Perte de valeur"
281
+ "valueLoss": "Perte de valeur",
282
+ "searchChains": "",
283
+ "searchBridges": "",
284
+ "searchExchanges": ""
279
285
  },
280
286
  "settings": {
281
287
  "theme": "Thème",
package/src/i18n/hi.json CHANGED
@@ -82,6 +82,9 @@
82
82
  "autoRefuel": "",
83
83
  "emptyActiveTransactions": "",
84
84
  "emptyTokenList": "",
85
+ "emptyChainList": "",
86
+ "emptyBridgesList": "",
87
+ "emptyExchangesList": "",
85
88
  "emptyTransactionHistory": "",
86
89
  "fundsToExchange": "",
87
90
  "toAddressIsRequired": "",
@@ -265,7 +268,7 @@
265
268
  "stepSwapAndBridge": "",
266
269
  "stepSwapAndBuy": "",
267
270
  "stepSwapAndDeposit": "",
268
- "supportId": "",
271
+ "transferId": "",
269
272
  "swapStepDetails": "",
270
273
  "tags": {
271
274
  "cheapest": "",
@@ -275,7 +278,10 @@
275
278
  "tokenOnChain": "",
276
279
  "tokenOnChainAmount": "",
277
280
  "tokenSearch": "",
278
- "valueLoss": ""
281
+ "valueLoss": "",
282
+ "searchChains": "",
283
+ "searchBridges": "",
284
+ "searchExchanges": ""
279
285
  },
280
286
  "settings": {
281
287
  "theme": "",
package/src/i18n/id.json CHANGED
@@ -82,6 +82,9 @@
82
82
  "autoRefuel": "Gas anda hampir habis {{chainName}}. Dengan melanjutkan, anda akan mendapatkan cukup gas untuk menyelesaikan penukaran.",
83
83
  "emptyActiveTransactions": "Transaksi yang sedang berlangsung akan muncul di sini. Setelah selesai, temukan di riwayat transaksi.",
84
84
  "emptyTokenList": "Kami tidak dapat menemukan token di jaringan {{chainName}} atau Anda tidak memilikinya. Silakan cari berdasarkan alamat kontrak jika token Anda tidak muncul atau pilih jaringan lain.",
85
+ "emptyChainList": "",
86
+ "emptyBridgesList": "",
87
+ "emptyExchangesList": "",
85
88
  "emptyTransactionHistory": "Riwayat transaksi hanya disimpan secara lokal dan akan dihapus jika Anda menghapus data browser.",
86
89
  "fundsToExchange": "Dana yang dikirim ke exchange mungkin akan hilang",
87
90
  "toAddressIsRequired": "Harap berikan alamat dompet tujuan ke mana dana akan ditransfer.",
@@ -265,7 +268,7 @@
265
268
  "stepSwapAndBridge": "Swap dan bridge",
266
269
  "stepSwapAndBuy": "Swap dan beli",
267
270
  "stepSwapAndDeposit": "",
268
- "supportId": "ID dukungan",
271
+ "transferId": "",
269
272
  "swapStepDetails": "Swap di {{chain}} melalui {{tool}}",
270
273
  "tags": {
271
274
  "cheapest": "Pengembalian terbaik",
@@ -275,7 +278,10 @@
275
278
  "tokenOnChain": "{{tokenSymbol}} di {{chainName}}",
276
279
  "tokenOnChainAmount": "{{amount, number(maximumFractionDigits: 9)}} {{tokenSymbol}} di {{chainName}}",
277
280
  "tokenSearch": "Cari berdasarkan nama atau alamat token",
278
- "valueLoss": "Kehilangan nilai"
281
+ "valueLoss": "Kehilangan nilai",
282
+ "searchChains": "",
283
+ "searchBridges": "",
284
+ "searchExchanges": ""
279
285
  },
280
286
  "settings": {
281
287
  "theme": "Tema",
package/src/i18n/it.json CHANGED
@@ -82,6 +82,9 @@
82
82
  "autoRefuel": "Livello basso di gas su {{chainName}}. Continuando avrai abbastanza gas per completare lo scambio.",
83
83
  "emptyActiveTransactions": "Le transazioni in corso appariranno qui. Una volta completate, potrai trovarle nella cronologia delle transazioni.",
84
84
  "emptyTokenList": "Non siamo riusciti a trovare token sulla chain {{chainName}} o non ne hai. Riprova o scegli un'altra chain.",
85
+ "emptyChainList": "",
86
+ "emptyBridgesList": "",
87
+ "emptyExchangesList": "",
85
88
  "emptyTransactionHistory": "La cronologia delle transazioni è memorizzata solo localmente e verrà eliminata se si cancellano i dati del browser.",
86
89
  "fundsToExchange": "",
87
90
  "toAddressIsRequired": "",
@@ -265,7 +268,7 @@
265
268
  "stepSwapAndBridge": "Scambia e bridge",
266
269
  "stepSwapAndBuy": "Scambia e acquista",
267
270
  "stepSwapAndDeposit": "",
268
- "supportId": "ID supporto",
271
+ "transferId": "",
269
272
  "swapStepDetails": "Scambio su {{chain}} tramite {{tool}}.",
270
273
  "tags": {
271
274
  "cheapest": "",
@@ -275,7 +278,10 @@
275
278
  "tokenOnChain": "{{tokenSymbol}} su {{chainName}}",
276
279
  "tokenOnChainAmount": "{{amount, number(maximumFractionDigits: 9)}} {{tokenSymbol}} su {{chainName}}",
277
280
  "tokenSearch": "Cerca per nome token o indirizzo",
278
- "valueLoss": "Perdita di valore"
281
+ "valueLoss": "Perdita di valore",
282
+ "searchChains": "",
283
+ "searchBridges": "",
284
+ "searchExchanges": ""
279
285
  },
280
286
  "settings": {
281
287
  "theme": "",
package/src/i18n/ja.json CHANGED
@@ -82,6 +82,9 @@
82
82
  "autoRefuel": "{{chainName}} のガスが不足していますが、続行することでトランザクションを完了するのに十分なガスが補填されます。",
83
83
  "emptyActiveTransactions": "進行中のトランザクションがここに表示されます。完了すると、トランザクション履歴に表示されます。",
84
84
  "emptyTokenList": "{{chainName}} チェーンでトークンが見つかりませんでした。使いたいトークンが表示されない場合はコントラクトアドレスで検索するか、別のチェーンを選択してください。",
85
+ "emptyChainList": "",
86
+ "emptyBridgesList": "",
87
+ "emptyExchangesList": "",
85
88
  "emptyTransactionHistory": "トランザクション履歴はローカルにのみ保存され、ユーザーがブラウザデータを消去すると削除されます。",
86
89
  "fundsToExchange": "送金される資金は失われる可能性があります",
87
90
  "toAddressIsRequired": "送金先のウォレットアドレスを入力してください。",
@@ -265,7 +268,7 @@
265
268
  "stepSwapAndBridge": "スワップとブリッジ",
266
269
  "stepSwapAndBuy": "スワップと購入",
267
270
  "stepSwapAndDeposit": "",
268
- "supportId": "サポートID",
271
+ "transferId": "",
269
272
  "swapStepDetails": "{{chain}} で {{tool}} 経由のスワップ",
270
273
  "tags": {
271
274
  "cheapest": "最良",
@@ -275,7 +278,10 @@
275
278
  "tokenOnChain": "{{chainName}} の {{tokenSymbol}}",
276
279
  "tokenOnChainAmount": "{{chainName}} の {{amount, number(maximumFractionDigits: 9)}} {{tokenSymbol}}",
277
280
  "tokenSearch": "トークン名またはアドレスで検索",
278
- "valueLoss": "損失額"
281
+ "valueLoss": "損失額",
282
+ "searchChains": "",
283
+ "searchBridges": "",
284
+ "searchExchanges": ""
279
285
  },
280
286
  "settings": {
281
287
  "theme": "テーマ",
package/src/i18n/ko.json CHANGED
@@ -82,6 +82,9 @@
82
82
  "autoRefuel": "현재 {{chainName}} 가스가 부족합니다. 이 기능을 통하여 스왑을 완료할 가스를 보충할 수 있습니다.",
83
83
  "emptyActiveTransactions": "진행 중인 스왑이 여기에 나타납니다. 완료 후에는 스왑 기록을 참조하십시오",
84
84
  "emptyTokenList": "{{chainName}} 체인에서 토큰을 찾을 수 없거나 보유 중인 토큰이 아닙니다. 다시 검색하거나 다른 체인을 선택하십시오.",
85
+ "emptyChainList": "",
86
+ "emptyBridgesList": "",
87
+ "emptyExchangesList": "",
85
88
  "emptyTransactionHistory": "스왑 기록은 로컬에만 저장되며 브라우저 데이터를 지우면 삭제됩니다.",
86
89
  "fundsToExchange": "",
87
90
  "toAddressIsRequired": "",
@@ -265,7 +268,7 @@
265
268
  "stepSwapAndBridge": "스왑 그리고 브릿지",
266
269
  "stepSwapAndBuy": "스왑 그리고 매수",
267
270
  "stepSwapAndDeposit": "",
268
- "supportId": "서포트 ID",
271
+ "transferId": "",
269
272
  "swapStepDetails": "{{tool}}로 {{chain}}에서 스왑",
270
273
  "tags": {
271
274
  "cheapest": "",
@@ -275,7 +278,10 @@
275
278
  "tokenOnChain": "{{chainName}}의 {{tokenSymbol}}",
276
279
  "tokenOnChainAmount": "{{chainName}}의 {{amount, number(maximumFractionDigits: 9)}} {{tokenSymbol}}",
277
280
  "tokenSearch": "이름 또는 컨트랙트 주소를 통해 검색",
278
- "valueLoss": "가치 손실"
281
+ "valueLoss": "가치 손실",
282
+ "searchChains": "",
283
+ "searchBridges": "",
284
+ "searchExchanges": ""
279
285
  },
280
286
  "settings": {
281
287
  "theme": "테마",
package/src/i18n/pt.json CHANGED
@@ -82,6 +82,9 @@
82
82
  "autoRefuel": "Você está com pouco gás na rede {{chainName}}. Ao continuar, você obterá gás suficiente para completar a conversão.",
83
83
  "emptyActiveTransactions": "As transações em andamento aparecerão aqui. Uma vez concluídas, encontre-as no histórico de transações.",
84
84
  "emptyTokenList": "Não conseguimos encontrar tokens na rede {{chainName}} ou você não possui nenhum. Por favor, procure pelo endereço de contrato caso o token não apareça ou escolha outra rede.",
85
+ "emptyChainList": "Não conseguimos encontrar nenhuma rede que corresponda à sua pesquisa",
86
+ "emptyBridgesList": "Não conseguimos encontrar nenhuma ponte que corresponda à sua pesquisa",
87
+ "emptyExchangesList": "Não conseguimos encontrar nenhuma corretora que corresponda à sua pesquisa",
85
88
  "emptyTransactionHistory": "O histórico de transações é armazenado apenas localmente e será excluído se você limpar os dados do seu navegador.",
86
89
  "fundsToExchange": "Os fundos enviados para uma exchange podem ser perdidos",
87
90
  "toAddressIsRequired": "Por favor, forneça o endereço da carteira de destino, para o qual os fundos serão transferidos.",
@@ -265,7 +268,7 @@
265
268
  "stepSwapAndBridge": "Converter e enviar pela ponte",
266
269
  "stepSwapAndBuy": "Converta e compre",
267
270
  "stepSwapAndDeposit": "Converter e depositar",
268
- "supportId": "ID de suporte",
271
+ "transferId": "ID de transferência",
269
272
  "swapStepDetails": "Converter na {{chain}} via {{tool}}",
270
273
  "tags": {
271
274
  "cheapest": "Melhor retorno",
@@ -275,7 +278,10 @@
275
278
  "tokenOnChain": "{{tokenSymbol}} na {{chainName}}",
276
279
  "tokenOnChainAmount": "{{amount, number(maximumFractionDigits: 9)}} {{tokenSymbol}} na {{chainName}}",
277
280
  "tokenSearch": "Pesquisar pelo nome do token ou endereço",
278
- "valueLoss": "Perda de Valor"
281
+ "valueLoss": "Perda de Valor",
282
+ "searchChains": "Pesquisar pelo nome da rede",
283
+ "searchBridges": "Pesquisar pelo nome da ponte",
284
+ "searchExchanges": "Pesquisar pelo nome da corretora"
279
285
  },
280
286
  "settings": {
281
287
  "theme": "Tema",
package/src/i18n/th.json CHANGED
@@ -82,6 +82,9 @@
82
82
  "autoRefuel": "คุณใช้แก็ส {{chainName}} เหลือน้อย เมื่อดำเนินการต่อ คุณจะได้รับแก็สเพียงพอสำหรับการแลกเปลี่ยนให้เสร็จสมบูรณ์",
83
83
  "emptyActiveTransactions": "การแลกเปลี่ยนที่กำลังดำเนินการจะปรากฏที่นี่. เมื่อเสร็จสิ้น, จะพบประวัติการแลกเปลี่ยน.",
84
84
  "emptyTokenList": "เราไม่พบโทเค็นใน {{chainName}} เชนหรือคุณไม่มีโทเค็น. โปรดลองอีกครั้งหรือเลือกเชนอื่น.",
85
+ "emptyChainList": "",
86
+ "emptyBridgesList": "",
87
+ "emptyExchangesList": "",
85
88
  "emptyTransactionHistory": "ประวัติการแลกเปลี่ยนจะถูกเก็บไว้ในเครื่องเท่านั้นและจะถูกลบหากคุณล้างข้อมูลเบราว์เซอร์ของคุณ.",
86
89
  "fundsToExchange": "เงินที่ส่งไปยัง Exchange อาจหายไป",
87
90
  "toAddressIsRequired": "กรุณาระบุที่อยู่ของวอลเล็ตปลายทางที่ต้องการโอนเงินไป",
@@ -265,7 +268,7 @@
265
268
  "stepSwapAndBridge": "แลกเปลี่ยนและบริดจ์",
266
269
  "stepSwapAndBuy": "แลกเปลี่ยน และ ซื้อ",
267
270
  "stepSwapAndDeposit": "",
268
- "supportId": "หมายเลขที่สนับสนุน",
271
+ "transferId": "",
269
272
  "swapStepDetails": "แลกเปลี่ยนบน {{chain}} ผ่าน {{tool}}",
270
273
  "tags": {
271
274
  "cheapest": "ผลตอบแทนที่ดีที่สุด",
@@ -275,7 +278,10 @@
275
278
  "tokenOnChain": "{{tokenSymbol}} บน {{chainName}}",
276
279
  "tokenOnChainAmount": "{{amount, number(maximumFractionDigits: 9)}}{{tokenSymbol}} บน {{chainName}}",
277
280
  "tokenSearch": "ค้นหาชื่อของเหรียญ หรือ ที่อยู่",
278
- "valueLoss": "มูลค่าที่สูญเสีย"
281
+ "valueLoss": "มูลค่าที่สูญเสีย",
282
+ "searchChains": "",
283
+ "searchBridges": "",
284
+ "searchExchanges": ""
279
285
  },
280
286
  "settings": {
281
287
  "theme": "ธีม",
package/src/i18n/tr.json CHANGED
@@ -82,6 +82,9 @@
82
82
  "autoRefuel": "{{chainName}} ağında gaz yetersiz. Devam ederek, işlem için gereken miktarda gaz alacaksınız.",
83
83
  "emptyActiveTransactions": "Devam eden işlemler burada görünecek. Tamamlandığında, işlem geçmişinden bulabilirsiniz.",
84
84
  "emptyTokenList": "{{chainName}} ağında token bulamadık veya sizde hiç token yok. Lütfen tekrar aramayı deneyin veya başka bir ağ seçin.",
85
+ "emptyChainList": "",
86
+ "emptyBridgesList": "",
87
+ "emptyExchangesList": "",
85
88
  "emptyTransactionHistory": "İşlem geçmişi yalnızca yerel olarak saklanır ve tarayıcı verilerinizi temizlerseniz silinir.",
86
89
  "fundsToExchange": "Borsa hesabına göndermek fonlarınızı kaybetmenize yol açabilir",
87
90
  "toAddressIsRequired": "Lütfen varlıklarınızı göndermek istediğiniz hedef adresi girin.",
@@ -265,7 +268,7 @@
265
268
  "stepSwapAndBridge": "Takas et ve Köprüle",
266
269
  "stepSwapAndBuy": "Takasla ve satın al",
267
270
  "stepSwapAndDeposit": "Takas et ve yatır",
268
- "supportId": "Destek",
271
+ "transferId": "",
269
272
  "swapStepDetails": "{{chain}} üzerinde {{tool}} aracılığıyla takas et",
270
273
  "tags": {
271
274
  "cheapest": "En iyi sonuç",
@@ -275,7 +278,10 @@
275
278
  "tokenOnChain": "{{chainName}} üzerindeki {{tokenSymbol}}",
276
279
  "tokenOnChainAmount": "{{chainName}} üzerindeki {{amount, number(maximumFractionDigits: 9)}}{{tokenSymbol}}",
277
280
  "tokenSearch": "Tokenlerinizi adres ve ya isim aracılığıyla arayın",
278
- "valueLoss": "Değer kaybı"
281
+ "valueLoss": "Değer kaybı",
282
+ "searchChains": "",
283
+ "searchBridges": "",
284
+ "searchExchanges": ""
279
285
  },
280
286
  "settings": {
281
287
  "theme": "Tema",