@lifi/widget 4.4.0 → 4.5.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 (175) hide show
  1. package/dist/esm/App.js.map +1 -1
  2. package/dist/esm/AppDrawer.js.map +1 -1
  3. package/dist/esm/AppLayout.js.map +1 -1
  4. package/dist/esm/AppProvider.js.map +1 -1
  5. package/dist/esm/components/ActionRow/ActionRow.js.map +1 -1
  6. package/dist/esm/components/AmountInput/AmountInput.js.map +1 -1
  7. package/dist/esm/components/AmountInput/AmountInputEndAdornment.js.map +1 -1
  8. package/dist/esm/components/AmountInput/PriceFormHelperText.js.map +1 -1
  9. package/dist/esm/components/AmountInputCard/AmountInputCardPair.js.map +1 -1
  10. package/dist/esm/components/AmountInputCard/BalanceDisplay.js.map +1 -1
  11. package/dist/esm/components/AmountInputCard/FiatValueToggle.js.map +1 -1
  12. package/dist/esm/components/AmountInputCard/PercentageChips.js.map +1 -1
  13. package/dist/esm/components/AmountInputCard/ReceiveAmountCard.js.map +1 -1
  14. package/dist/esm/components/AmountInputCard/SendAmountCard.js.map +1 -1
  15. package/dist/esm/components/AppContainer.js.map +1 -1
  16. package/dist/esm/components/Avatar/AccountAvatar.js.map +1 -1
  17. package/dist/esm/components/Avatar/Avatar.js.map +1 -1
  18. package/dist/esm/components/Avatar/ChainBadgeContent.js.map +1 -1
  19. package/dist/esm/components/Avatar/TokenAvatar.js.map +1 -1
  20. package/dist/esm/components/BaseTransactionButton/BaseTransactionButton.js.map +1 -1
  21. package/dist/esm/components/Card/CardButton.js.map +1 -1
  22. package/dist/esm/components/ChainSelect/ChainSelect.js.map +1 -1
  23. package/dist/esm/components/Chains/AllChainsAvatar.js.map +1 -1
  24. package/dist/esm/components/Chains/ChainList.js.map +1 -1
  25. package/dist/esm/components/Chains/ChainListItem.js.map +1 -1
  26. package/dist/esm/components/Chains/ChainsExpanded.js.map +1 -1
  27. package/dist/esm/components/Chains/PinChainButton.js.map +1 -1
  28. package/dist/esm/components/Chains/SelectChainExpansionContent.js.map +1 -1
  29. package/dist/esm/components/Chains/SelectChainPageContent.js.map +1 -1
  30. package/dist/esm/components/Chains/VirtualizedChainList.js.map +1 -1
  31. package/dist/esm/components/ContextMenu.js.map +1 -1
  32. package/dist/esm/components/ContractComponent/NFT/NFTBase.js.map +1 -1
  33. package/dist/esm/components/ExecutionStatusCard/ExecutionChecklist.js.map +1 -1
  34. package/dist/esm/components/ExecutionStatusCard/ExecutionStatusCard.js.map +1 -1
  35. package/dist/esm/components/ExecutionStatusCard/StaggeredRevealTypography.js.map +1 -1
  36. package/dist/esm/components/ExecutionStatusCard/StatusIcon.js.map +1 -1
  37. package/dist/esm/components/Expansion/Expansion.js.map +1 -1
  38. package/dist/esm/components/Expansion/ExpansionTransition.js.map +1 -1
  39. package/dist/esm/components/FeeBreakdownTooltip.js.map +1 -1
  40. package/dist/esm/components/Header/ActivitiesButton.js.map +1 -1
  41. package/dist/esm/components/Header/BackButton.js.map +1 -1
  42. package/dist/esm/components/Header/CloseDrawerButton.js.map +1 -1
  43. package/dist/esm/components/Header/DisconnectIconButton.js.map +1 -1
  44. package/dist/esm/components/Header/HeaderTabs.js.map +1 -1
  45. package/dist/esm/components/Header/NavigationHeader.js.map +1 -1
  46. package/dist/esm/components/Header/SettingsButton.js.map +1 -1
  47. package/dist/esm/components/Header/WalletHeader.js.map +1 -1
  48. package/dist/esm/components/Header/WalletMenu.js.map +1 -1
  49. package/dist/esm/components/IconCircle/IconCircle.js.map +1 -1
  50. package/dist/esm/components/LimitOrderSettings/LimitOrderSettings.js.map +1 -1
  51. package/dist/esm/components/LimitPriceCard/LimitPriceCard.js.map +1 -1
  52. package/dist/esm/components/LimitPriceCard/LimitPricePresets.js.map +1 -1
  53. package/dist/esm/components/Messages/AccountDeployedMessage.js.map +1 -1
  54. package/dist/esm/components/Messages/AccountNotDeployedMessage.js.map +1 -1
  55. package/dist/esm/components/Messages/AlertMessage.js.map +1 -1
  56. package/dist/esm/components/Messages/FundsSufficiencyMessage.js.map +1 -1
  57. package/dist/esm/components/Messages/GasRefuelMessage.js.map +1 -1
  58. package/dist/esm/components/Messages/GasSufficiencyMessage.js.map +1 -1
  59. package/dist/esm/components/Messages/MinFromAmountUSDMessage.js.map +1 -1
  60. package/dist/esm/components/Messages/MissingRouteRequiredAccountMessage.js.map +1 -1
  61. package/dist/esm/components/Messages/WarningMessages.js.map +1 -1
  62. package/dist/esm/components/NotFound.js.map +1 -1
  63. package/dist/esm/components/PoweredBy/PoweredBy.js.map +1 -1
  64. package/dist/esm/components/ProgressToNextUpdate.js.map +1 -1
  65. package/dist/esm/components/ReverseTokensButton/ReverseTokensButton.js.map +1 -1
  66. package/dist/esm/components/RouteCard/RouteCard.js.map +1 -1
  67. package/dist/esm/components/RouteCard/RouteCardEssentials.js.map +1 -1
  68. package/dist/esm/components/RouteCard/RouteCardSkeleton.js.map +1 -1
  69. package/dist/esm/components/RouteCard/RouteDetails.js.map +1 -1
  70. package/dist/esm/components/RouteCard/RouteNotFoundCard.js.map +1 -1
  71. package/dist/esm/components/RouteCard/RouteProviderCard.js.map +1 -1
  72. package/dist/esm/components/RouteCard/RouteToken.js.map +1 -1
  73. package/dist/esm/components/RouteCard/RouteTokens.js.map +1 -1
  74. package/dist/esm/components/Routes/LimitOrderRoutes.js.map +1 -1
  75. package/dist/esm/components/Routes/Routes.js.map +1 -1
  76. package/dist/esm/components/Routes/RoutesContent.js.map +1 -1
  77. package/dist/esm/components/Routes/RoutesExpanded.js.map +1 -1
  78. package/dist/esm/components/Search/SearchInput.js.map +1 -1
  79. package/dist/esm/components/SelectChainAndToken.js.map +1 -1
  80. package/dist/esm/components/SelectTokenButton/SelectTokenButton.js.map +1 -1
  81. package/dist/esm/components/SendToWallet/SendToWalletButton.js.map +1 -1
  82. package/dist/esm/components/SendToWallet/SendToWalletExpandButton.js.map +1 -1
  83. package/dist/esm/components/SettingsPanel/SettingsPanel.js.map +1 -1
  84. package/dist/esm/components/Skeleton/WidgetSkeleton.js.map +1 -1
  85. package/dist/esm/components/Step/StepActions.js.map +1 -1
  86. package/dist/esm/components/StepActions/SentToWalletRow.js.map +1 -1
  87. package/dist/esm/components/StepActions/StepActionRow.js.map +1 -1
  88. package/dist/esm/components/StepActions/StepActionsList.js.map +1 -1
  89. package/dist/esm/components/SwapButton/SwapButton.js.map +1 -1
  90. package/dist/esm/components/TextFitter/TextFitter.js.map +1 -1
  91. package/dist/esm/components/Timer/StepStatusTimer.js.map +1 -1
  92. package/dist/esm/components/Token/Token.js.map +1 -1
  93. package/dist/esm/components/TokenList/PinTokenButton.js.map +1 -1
  94. package/dist/esm/components/TokenList/TokenDetailsSheet.js.map +1 -1
  95. package/dist/esm/components/TokenList/TokenDetailsSheetContent.js.map +1 -1
  96. package/dist/esm/components/TokenList/TokenList.js.map +1 -1
  97. package/dist/esm/components/TokenList/TokenListItem.js.map +1 -1
  98. package/dist/esm/components/TokenList/VirtualizedTokenList.js.map +1 -1
  99. package/dist/esm/components/TokenPillButton/TokenPillButton.js.map +1 -1
  100. package/dist/esm/components/TokenRate/TokenRate.js.map +1 -1
  101. package/dist/esm/components/Tools/ToolItem.js.map +1 -1
  102. package/dist/esm/components/Tools/Tools.js.map +1 -1
  103. package/dist/esm/components/TransactionCard/ActiveTransactionCard.js.map +1 -1
  104. package/dist/esm/components/TransactionCard/TransactionCard.js.map +1 -1
  105. package/dist/esm/components/TransactionCard/TransactionCardSkeleton.js.map +1 -1
  106. package/dist/esm/config/version.d.ts +1 -1
  107. package/dist/esm/config/version.js +1 -1
  108. package/dist/esm/config/version.js.map +1 -1
  109. package/dist/esm/hooks/useAccountsBalancesData.js +1 -14
  110. package/dist/esm/hooks/useAccountsBalancesData.js.map +1 -1
  111. package/dist/esm/hooks/useToAddressAutoPopulate.js.map +1 -1
  112. package/dist/esm/hooks/useTokenBalances.js.map +1 -1
  113. package/dist/esm/hooks/useTokenBalancesQueries.js +5 -3
  114. package/dist/esm/hooks/useTokenBalancesQueries.js.map +1 -1
  115. package/dist/esm/hooks/useTokens.js.map +1 -1
  116. package/dist/esm/pages/ActivitiesPage/ActivitiesPage.js.map +1 -1
  117. package/dist/esm/pages/ActivitiesPage/ActivitiesPageMenuButton.js.map +1 -1
  118. package/dist/esm/pages/LanguagesPage.js.map +1 -1
  119. package/dist/esm/pages/MainPage/LimitPageContent.js.map +1 -1
  120. package/dist/esm/pages/MainPage/MainPage.js.map +1 -1
  121. package/dist/esm/pages/MainPage/MainPageActions.js.map +1 -1
  122. package/dist/esm/pages/RoutePriorityPage.js.map +1 -1
  123. package/dist/esm/pages/RoutesPage/RoutesPage.js.map +1 -1
  124. package/dist/esm/pages/SelectEnabledToolsPage.js.map +1 -1
  125. package/dist/esm/pages/SelectTokenPage/SelectTokenPage.js.map +1 -1
  126. package/dist/esm/pages/SendToWallet/BookmarkAddressSheet.js.map +1 -1
  127. package/dist/esm/pages/SendToWallet/BookmarksPage.js.map +1 -1
  128. package/dist/esm/pages/SendToWallet/ConfirmAddressSheet.js.map +1 -1
  129. package/dist/esm/pages/SendToWallet/ConnectedWalletsPage.js.map +1 -1
  130. package/dist/esm/pages/SendToWallet/RecentWalletsPage.js.map +1 -1
  131. package/dist/esm/pages/SendToWallet/SendToConfiguredWalletPage.js.map +1 -1
  132. package/dist/esm/pages/SendToWallet/SendToWalletPage.js.map +1 -1
  133. package/dist/esm/pages/SettingsPage/BridgeAndExchangeSettings.js.map +1 -1
  134. package/dist/esm/pages/SettingsPage/GasPriceSettings.js.map +1 -1
  135. package/dist/esm/pages/SettingsPage/LanguageSetting.js.map +1 -1
  136. package/dist/esm/pages/SettingsPage/ResetSettingsButton.js.map +1 -1
  137. package/dist/esm/pages/SettingsPage/RoutePrioritySettings.js.map +1 -1
  138. package/dist/esm/pages/SettingsPage/SettingsCard/BadgedValue.js.map +1 -1
  139. package/dist/esm/pages/SettingsPage/SettingsCard/SettingCardExpandable.js.map +1 -1
  140. package/dist/esm/pages/SettingsPage/SettingsPage.js.map +1 -1
  141. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippagePage.js.map +1 -1
  142. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.js.map +1 -1
  143. package/dist/esm/pages/SettingsPage/SmallBalanceFilterSettings.js.map +1 -1
  144. package/dist/esm/pages/SettingsPage/ThemeSettings.js.map +1 -1
  145. package/dist/esm/pages/TransactionDetailsPage/ContactSupportButton.js.map +1 -1
  146. package/dist/esm/pages/TransactionDetailsPage/ReceiptsCard.js.map +1 -1
  147. package/dist/esm/pages/TransactionDetailsPage/TransactionDetailsPage.js.map +1 -1
  148. package/dist/esm/pages/TransactionDetailsPage/TransactionDetailsSkeleton.js.map +1 -1
  149. package/dist/esm/pages/TransactionDetailsPage/TransferIdCard.js.map +1 -1
  150. package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.js.map +1 -1
  151. package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.js.map +1 -1
  152. package/dist/esm/pages/TransactionPage/ExecutionDoneCard.js.map +1 -1
  153. package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.js.map +1 -1
  154. package/dist/esm/pages/TransactionPage/TransactionDoneButtons.js.map +1 -1
  155. package/dist/esm/pages/TransactionPage/TransactionExecutionContent.js.map +1 -1
  156. package/dist/esm/pages/TransactionPage/TransactionFailedButtons.js.map +1 -1
  157. package/dist/esm/pages/TransactionPage/TransactionPage.js.map +1 -1
  158. package/dist/esm/pages/TransactionPage/TransactionReview.js.map +1 -1
  159. package/dist/esm/providers/I18nProvider/I18nProvider.js.map +1 -1
  160. package/dist/esm/providers/I18nProvider/types.d.ts.map +1 -1
  161. package/dist/esm/providers/WalletProvider/WalletProvider.js.map +1 -1
  162. package/dist/esm/stores/StoreProvider.js.map +1 -1
  163. package/dist/esm/stores/form/FormStore.js.map +1 -1
  164. package/dist/esm/stores/form/FormUpdater.js.map +1 -1
  165. package/dist/esm/stores/navigationTabs/useNavigationTabsStore.js.map +1 -1
  166. package/dist/esm/utils/tokenList.js +1 -4
  167. package/dist/esm/utils/tokenList.js.map +1 -1
  168. package/package.json +4 -4
  169. package/src/config/version.ts +1 -1
  170. package/src/hooks/useAccountsBalancesData.ts +4 -31
  171. package/src/hooks/useTokenBalancesQueries.ts +12 -4
  172. package/src/utils/tokenList.ts +1 -9
  173. package/dist/esm/hooks/useFilteredByTokenBalances.js +0 -74
  174. package/dist/esm/hooks/useFilteredByTokenBalances.js.map +0 -1
  175. package/src/hooks/useFilteredByTokenBalances.ts +0 -145
@@ -1 +0,0 @@
1
- {"version":3,"file":"useFilteredByTokenBalances.js","names":[],"sources":["../../../src/hooks/useFilteredByTokenBalances.ts"],"sourcesContent":["import {\n type BaseToken,\n ChainType,\n getWalletBalances,\n type TokenExtended,\n type WalletTokenExtended,\n} from '@lifi/sdk'\nimport { useQuery } from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport type { FormType } from '../stores/form/types.js'\nimport { getConfigItemSets, isFormItemAllowed } from '../utils/item.js'\nimport { getVerifiedTokensSets } from '../utils/token.js'\nimport { isSupportedToken } from '../utils/tokenList.js'\n\nexport const useFilteredTokensByBalance = (\n accountsWithTokens?: Record<\n string,\n { chainType: ChainType; tokens: Record<number, TokenExtended[]> }\n >,\n formType?: FormType\n): {\n data: Record<string, Record<number, TokenExtended[]>> | undefined\n isLoading: boolean\n} => {\n const { tokens: configTokens } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n const evmAddress = useMemo(() => {\n const evmAccount = Object.entries(accountsWithTokens ?? {}).find(\n ([_, { chainType }]) => chainType === ChainType.EVM\n )\n return evmAccount?.[0]\n }, [accountsWithTokens])\n\n const { data: existingBalances, isLoading } = useQuery({\n queryKey: ['existing-evm-balances', evmAddress],\n queryFn: () => getWalletBalances(sdkClient, evmAddress ?? ''),\n enabled: !!evmAddress,\n refetchInterval: 30_000, // 30 seconds\n staleTime: 30_000, // 30 seconds\n retry: false,\n })\n\n const accountsWithFilteredTokens = useMemo(() => {\n if (!accountsWithTokens) {\n return undefined\n }\n\n // Early return if no existing balances - return all tokens\n const result: Record<string, Record<number, TokenExtended[]>> = {}\n if (!existingBalances) {\n for (const [address, { tokens }] of Object.entries(accountsWithTokens)) {\n result[address] = tokens\n }\n return result\n }\n\n const verifiedTokensSets = getVerifiedTokensSets(configTokens)\n\n for (const [address, { tokens }] of Object.entries(accountsWithTokens)) {\n result[address] = {}\n\n for (const [chainIdStr, chainTokens] of Object.entries(tokens)) {\n const chainId = Number(chainIdStr)\n const verifiedAddresses = verifiedTokensSets?.get(chainId)\n // Get balances for this specific chain\n const balances = existingBalances?.[chainId]\n // If no balances, RPC all tokens of the chain\n if (!balances?.length) {\n if (chainTokens.length) {\n result[address][chainId] = chainTokens\n }\n continue\n }\n\n // Optimize token matching with Set for O(1) lookup\n const balanceSet = new Set(\n balances.map((balance: WalletTokenExtended) =>\n balance.address.toLowerCase()\n )\n )\n\n // Get tokens that are in chainTokens and have balances\n const filteredTokens = chainTokens.filter((token) => {\n const tokenKey = token.address.toLowerCase()\n return balanceSet.has(tokenKey)\n })\n\n // Get tokens that are in balances but not in chainTokens\n const chainTokenSet = new Set(\n chainTokens.map((token) => token.address.toLowerCase())\n )\n\n // Get allowed addresses from config tokens\n const allowedAddressesConfig = getConfigItemSets(\n configTokens,\n (tokens: BaseToken[]) =>\n new Set(\n tokens\n .filter((t) => Number(t.chainId) === chainId)\n .map((t) => t.address.toLowerCase())\n ),\n formType\n )\n\n const additionalTokens = balances\n .filter((balance: WalletTokenExtended) => {\n const balanceKey = balance.address.toLowerCase()\n return (\n !chainTokenSet.has(balanceKey) &&\n isSupportedToken(balance) &&\n isFormItemAllowed(\n balance,\n allowedAddressesConfig,\n formType,\n (t) => t.address.toLowerCase()\n )\n )\n })\n // Mark tokens from wallet balances as unverified unless allowlisted\n .map((token: WalletTokenExtended) => ({\n ...token,\n verified:\n verifiedAddresses?.has(token.address.toLowerCase()) ?? false,\n })) as TokenExtended[]\n\n // Combine both sets of tokens - convert WalletTokenExtended to TokenAmount\n const allTokens = [\n ...filteredTokens,\n ...additionalTokens,\n ] as TokenExtended[]\n\n if (allTokens.length) {\n result[address][chainId] = allTokens\n }\n }\n }\n\n return result\n }, [accountsWithTokens, existingBalances, configTokens, formType])\n\n return { data: accountsWithFilteredTokens, isLoading }\n}\n"],"mappings":";;;;;;;;;AAgBA,MAAa,8BACX,oBAIA,aAIG;CACH,MAAM,EAAE,QAAQ,iBAAiB,gBAAgB;CACjD,MAAM,YAAY,aAAa;CAE/B,MAAM,aAAa,cAAc;EAI/B,OAHmB,OAAO,QAAQ,sBAAsB,CAAC,CAAC,CAAC,CAAC,MACzD,CAAC,GAAG,EAAE,iBAAiB,cAAc,UAAU,GAElC,CAAC,GAAG;CACtB,GAAG,CAAC,kBAAkB,CAAC;CAEvB,MAAM,EAAE,MAAM,kBAAkB,cAAc,SAAS;EACrD,UAAU,CAAC,yBAAyB,UAAU;EAC9C,eAAe,kBAAkB,WAAW,cAAc,EAAE;EAC5D,SAAS,CAAC,CAAC;EACX,iBAAiB;EACjB,WAAW;EACX,OAAO;CACT,CAAC;CAoGD,OAAO;EAAE,MAlG0B,cAAc;GAC/C,IAAI,CAAC,oBACH;GAIF,MAAM,SAA0D,CAAC;GACjE,IAAI,CAAC,kBAAkB;IACrB,KAAK,MAAM,CAAC,SAAS,EAAE,aAAa,OAAO,QAAQ,kBAAkB,GACnE,OAAO,WAAW;IAEpB,OAAO;GACT;GAEA,MAAM,qBAAqB,sBAAsB,YAAY;GAE7D,KAAK,MAAM,CAAC,SAAS,EAAE,aAAa,OAAO,QAAQ,kBAAkB,GAAG;IACtE,OAAO,WAAW,CAAC;IAEnB,KAAK,MAAM,CAAC,YAAY,gBAAgB,OAAO,QAAQ,MAAM,GAAG;KAC9D,MAAM,UAAU,OAAO,UAAU;KACjC,MAAM,oBAAoB,oBAAoB,IAAI,OAAO;KAEzD,MAAM,WAAW,mBAAmB;KAEpC,IAAI,CAAC,UAAU,QAAQ;MACrB,IAAI,YAAY,QACd,OAAO,QAAQ,CAAC,WAAW;MAE7B;KACF;KAGA,MAAM,aAAa,IAAI,IACrB,SAAS,KAAK,YACZ,QAAQ,QAAQ,YAAY,CAC9B,CACF;KAGA,MAAM,iBAAiB,YAAY,QAAQ,UAAU;MACnD,MAAM,WAAW,MAAM,QAAQ,YAAY;MAC3C,OAAO,WAAW,IAAI,QAAQ;KAChC,CAAC;KAGD,MAAM,gBAAgB,IAAI,IACxB,YAAY,KAAK,UAAU,MAAM,QAAQ,YAAY,CAAC,CACxD;KAGA,MAAM,yBAAyB,kBAC7B,eACC,WACC,IAAI,IACF,OACG,QAAQ,MAAM,OAAO,EAAE,OAAO,MAAM,OAAO,CAAC,CAC5C,KAAK,MAAM,EAAE,QAAQ,YAAY,CAAC,CACvC,GACF,QACF;KAEA,MAAM,mBAAmB,SACtB,QAAQ,YAAiC;MACxC,MAAM,aAAa,QAAQ,QAAQ,YAAY;MAC/C,OACE,CAAC,cAAc,IAAI,UAAU,KAC7B,iBAAiB,OAAO,KACxB,kBACE,SACA,wBACA,WACC,MAAM,EAAE,QAAQ,YAAY,CAC/B;KAEJ,CAAC,CAAC,CAED,KAAK,WAAgC;MACpC,GAAG;MACH,UACE,mBAAmB,IAAI,MAAM,QAAQ,YAAY,CAAC,KAAK;KAC3D,EAAE;KAGJ,MAAM,YAAY,CAChB,GAAG,gBACH,GAAG,gBACL;KAEA,IAAI,UAAU,QACZ,OAAO,QAAQ,CAAC,WAAW;IAE/B;GACF;GAEA,OAAO;EACT,GAAG;GAAC;GAAoB;GAAkB;GAAc;EAAQ,CAExB;EAAG;CAAU;AACvD"}
@@ -1,145 +0,0 @@
1
- import {
2
- type BaseToken,
3
- ChainType,
4
- getWalletBalances,
5
- type TokenExtended,
6
- type WalletTokenExtended,
7
- } from '@lifi/sdk'
8
- import { useQuery } from '@tanstack/react-query'
9
- import { useMemo } from 'react'
10
- import { useSDKClient } from '../providers/SDKClientProvider.js'
11
- import { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'
12
- import type { FormType } from '../stores/form/types.js'
13
- import { getConfigItemSets, isFormItemAllowed } from '../utils/item.js'
14
- import { getVerifiedTokensSets } from '../utils/token.js'
15
- import { isSupportedToken } from '../utils/tokenList.js'
16
-
17
- export const useFilteredTokensByBalance = (
18
- accountsWithTokens?: Record<
19
- string,
20
- { chainType: ChainType; tokens: Record<number, TokenExtended[]> }
21
- >,
22
- formType?: FormType
23
- ): {
24
- data: Record<string, Record<number, TokenExtended[]>> | undefined
25
- isLoading: boolean
26
- } => {
27
- const { tokens: configTokens } = useWidgetConfig()
28
- const sdkClient = useSDKClient()
29
-
30
- const evmAddress = useMemo(() => {
31
- const evmAccount = Object.entries(accountsWithTokens ?? {}).find(
32
- ([_, { chainType }]) => chainType === ChainType.EVM
33
- )
34
- return evmAccount?.[0]
35
- }, [accountsWithTokens])
36
-
37
- const { data: existingBalances, isLoading } = useQuery({
38
- queryKey: ['existing-evm-balances', evmAddress],
39
- queryFn: () => getWalletBalances(sdkClient, evmAddress ?? ''),
40
- enabled: !!evmAddress,
41
- refetchInterval: 30_000, // 30 seconds
42
- staleTime: 30_000, // 30 seconds
43
- retry: false,
44
- })
45
-
46
- const accountsWithFilteredTokens = useMemo(() => {
47
- if (!accountsWithTokens) {
48
- return undefined
49
- }
50
-
51
- // Early return if no existing balances - return all tokens
52
- const result: Record<string, Record<number, TokenExtended[]>> = {}
53
- if (!existingBalances) {
54
- for (const [address, { tokens }] of Object.entries(accountsWithTokens)) {
55
- result[address] = tokens
56
- }
57
- return result
58
- }
59
-
60
- const verifiedTokensSets = getVerifiedTokensSets(configTokens)
61
-
62
- for (const [address, { tokens }] of Object.entries(accountsWithTokens)) {
63
- result[address] = {}
64
-
65
- for (const [chainIdStr, chainTokens] of Object.entries(tokens)) {
66
- const chainId = Number(chainIdStr)
67
- const verifiedAddresses = verifiedTokensSets?.get(chainId)
68
- // Get balances for this specific chain
69
- const balances = existingBalances?.[chainId]
70
- // If no balances, RPC all tokens of the chain
71
- if (!balances?.length) {
72
- if (chainTokens.length) {
73
- result[address][chainId] = chainTokens
74
- }
75
- continue
76
- }
77
-
78
- // Optimize token matching with Set for O(1) lookup
79
- const balanceSet = new Set(
80
- balances.map((balance: WalletTokenExtended) =>
81
- balance.address.toLowerCase()
82
- )
83
- )
84
-
85
- // Get tokens that are in chainTokens and have balances
86
- const filteredTokens = chainTokens.filter((token) => {
87
- const tokenKey = token.address.toLowerCase()
88
- return balanceSet.has(tokenKey)
89
- })
90
-
91
- // Get tokens that are in balances but not in chainTokens
92
- const chainTokenSet = new Set(
93
- chainTokens.map((token) => token.address.toLowerCase())
94
- )
95
-
96
- // Get allowed addresses from config tokens
97
- const allowedAddressesConfig = getConfigItemSets(
98
- configTokens,
99
- (tokens: BaseToken[]) =>
100
- new Set(
101
- tokens
102
- .filter((t) => Number(t.chainId) === chainId)
103
- .map((t) => t.address.toLowerCase())
104
- ),
105
- formType
106
- )
107
-
108
- const additionalTokens = balances
109
- .filter((balance: WalletTokenExtended) => {
110
- const balanceKey = balance.address.toLowerCase()
111
- return (
112
- !chainTokenSet.has(balanceKey) &&
113
- isSupportedToken(balance) &&
114
- isFormItemAllowed(
115
- balance,
116
- allowedAddressesConfig,
117
- formType,
118
- (t) => t.address.toLowerCase()
119
- )
120
- )
121
- })
122
- // Mark tokens from wallet balances as unverified unless allowlisted
123
- .map((token: WalletTokenExtended) => ({
124
- ...token,
125
- verified:
126
- verifiedAddresses?.has(token.address.toLowerCase()) ?? false,
127
- })) as TokenExtended[]
128
-
129
- // Combine both sets of tokens - convert WalletTokenExtended to TokenAmount
130
- const allTokens = [
131
- ...filteredTokens,
132
- ...additionalTokens,
133
- ] as TokenExtended[]
134
-
135
- if (allTokens.length) {
136
- result[address][chainId] = allTokens
137
- }
138
- }
139
- }
140
-
141
- return result
142
- }, [accountsWithTokens, existingBalances, configTokens, formType])
143
-
144
- return { data: accountsWithFilteredTokens, isLoading }
145
- }