@lifi/widget 4.4.0 → 4.6.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/dist/esm/App.js.map +1 -1
- package/dist/esm/AppDrawer.js +2 -1
- package/dist/esm/AppDrawer.js.map +1 -1
- package/dist/esm/AppLayout.js.map +1 -1
- package/dist/esm/AppProvider.js.map +1 -1
- package/dist/esm/components/ActionRow/ActionRow.js.map +1 -1
- package/dist/esm/components/AmountInput/AmountInput.js +13 -7
- package/dist/esm/components/AmountInput/AmountInput.js.map +1 -1
- package/dist/esm/components/AmountInput/AmountInputEndAdornment.js +2 -13
- package/dist/esm/components/AmountInput/AmountInputEndAdornment.js.map +1 -1
- package/dist/esm/components/AmountInput/PriceFormHelperText.js.map +1 -1
- package/dist/esm/components/AmountInputCard/AmountInputCardPair.js.map +1 -1
- package/dist/esm/components/AmountInputCard/BalanceDisplay.js.map +1 -1
- package/dist/esm/components/AmountInputCard/FiatValueToggle.js.map +1 -1
- package/dist/esm/components/AmountInputCard/PercentageChips.js +2 -13
- package/dist/esm/components/AmountInputCard/PercentageChips.js.map +1 -1
- package/dist/esm/components/AmountInputCard/PercentageChips.style.js +1 -1
- package/dist/esm/components/AmountInputCard/PercentageChips.style.js.map +1 -1
- package/dist/esm/components/AmountInputCard/ReceiveAmountCard.js.map +1 -1
- package/dist/esm/components/AmountInputCard/SendAmountCard.js +13 -6
- package/dist/esm/components/AmountInputCard/SendAmountCard.js.map +1 -1
- package/dist/esm/components/AppContainer.js.map +1 -1
- package/dist/esm/components/Avatar/AccountAvatar.js.map +1 -1
- package/dist/esm/components/Avatar/Avatar.js.map +1 -1
- package/dist/esm/components/Avatar/ChainBadgeContent.js.map +1 -1
- package/dist/esm/components/Avatar/TokenAvatar.js.map +1 -1
- package/dist/esm/components/BaseTransactionButton/BaseTransactionButton.js.map +1 -1
- package/dist/esm/components/Card/CardButton.js.map +1 -1
- package/dist/esm/components/ChainSelect/ChainSelect.js.map +1 -1
- package/dist/esm/components/Chains/AllChainsAvatar.js +7 -1
- package/dist/esm/components/Chains/AllChainsAvatar.js.map +1 -1
- package/dist/esm/components/Chains/ChainList.js.map +1 -1
- package/dist/esm/components/Chains/ChainListItem.js.map +1 -1
- package/dist/esm/components/Chains/ChainsExpanded.js.map +1 -1
- package/dist/esm/components/Chains/PinChainButton.js.map +1 -1
- package/dist/esm/components/Chains/SelectChainExpansionContent.js.map +1 -1
- package/dist/esm/components/Chains/SelectChainPageContent.js.map +1 -1
- package/dist/esm/components/Chains/VirtualizedChainList.js.map +1 -1
- package/dist/esm/components/ContextMenu.js.map +1 -1
- package/dist/esm/components/ContractComponent/NFT/NFTBase.js.map +1 -1
- package/dist/esm/components/Dialog/Dialog.js +2 -1
- package/dist/esm/components/Dialog/Dialog.js.map +1 -1
- package/dist/esm/components/ExecutionStatusCard/ExecutionChecklist.js.map +1 -1
- package/dist/esm/components/ExecutionStatusCard/ExecutionStatusCard.js.map +1 -1
- package/dist/esm/components/ExecutionStatusCard/StaggeredRevealTypography.js.map +1 -1
- package/dist/esm/components/ExecutionStatusCard/StatusIcon.js.map +1 -1
- package/dist/esm/components/Expansion/Expansion.js +4 -3
- package/dist/esm/components/Expansion/Expansion.js.map +1 -1
- package/dist/esm/components/Expansion/ExpansionTransition.js.map +1 -1
- package/dist/esm/components/FeeBreakdownTooltip.js.map +1 -1
- package/dist/esm/components/Header/ActivitiesButton.js.map +1 -1
- package/dist/esm/components/Header/BackButton.js.map +1 -1
- package/dist/esm/components/Header/CloseDrawerButton.js.map +1 -1
- package/dist/esm/components/Header/DisconnectIconButton.js.map +1 -1
- package/dist/esm/components/Header/HeaderTabs.js.map +1 -1
- package/dist/esm/components/Header/NavigationHeader.js.map +1 -1
- package/dist/esm/components/Header/SettingsButton.js +2 -1
- package/dist/esm/components/Header/SettingsButton.js.map +1 -1
- package/dist/esm/components/Header/WalletHeader.js.map +1 -1
- package/dist/esm/components/Header/WalletMenu.js.map +1 -1
- package/dist/esm/components/IconCircle/IconCircle.js +2 -1
- package/dist/esm/components/IconCircle/IconCircle.js.map +1 -1
- package/dist/esm/components/LimitOrderSettings/LimitOrderSettings.js.map +1 -1
- package/dist/esm/components/LimitPriceCard/LimitPriceCard.js.map +1 -1
- package/dist/esm/components/LimitPriceCard/LimitPricePresets.js.map +1 -1
- package/dist/esm/components/Messages/AccountDeployedMessage.js.map +1 -1
- package/dist/esm/components/Messages/AccountNotDeployedMessage.js.map +1 -1
- package/dist/esm/components/Messages/AlertMessage.js.map +1 -1
- package/dist/esm/components/Messages/FundsSufficiencyMessage.js.map +1 -1
- package/dist/esm/components/Messages/GasRefuelMessage.js.map +1 -1
- package/dist/esm/components/Messages/GasSufficiencyMessage.js.map +1 -1
- package/dist/esm/components/Messages/MinFromAmountUSDMessage.js.map +1 -1
- package/dist/esm/components/Messages/MissingRouteRequiredAccountMessage.js.map +1 -1
- package/dist/esm/components/Messages/UnsupportedToAddressMessage.js +27 -0
- package/dist/esm/components/Messages/UnsupportedToAddressMessage.js.map +1 -0
- package/dist/esm/components/Messages/WarningMessages.d.ts.map +1 -1
- package/dist/esm/components/Messages/WarningMessages.js +2 -0
- package/dist/esm/components/Messages/WarningMessages.js.map +1 -1
- package/dist/esm/components/Messages/useMessageQueue.js +6 -1
- package/dist/esm/components/Messages/useMessageQueue.js.map +1 -1
- package/dist/esm/components/NotFound.js.map +1 -1
- package/dist/esm/components/PoweredBy/PoweredBy.js.map +1 -1
- package/dist/esm/components/ProgressToNextUpdate.js.map +1 -1
- package/dist/esm/components/ReverseTokensButton/ReverseTokensButton.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteCard.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteCardEssentials.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteCardSkeleton.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteDetails.js +2 -1
- package/dist/esm/components/RouteCard/RouteDetails.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteNotFoundCard.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteProviderCard.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteToken.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteTokens.js.map +1 -1
- package/dist/esm/components/Routes/LimitOrderRoutes.js +2 -2
- package/dist/esm/components/Routes/LimitOrderRoutes.js.map +1 -1
- package/dist/esm/components/Routes/Routes.js.map +1 -1
- package/dist/esm/components/Routes/RoutesContent.js +2 -2
- package/dist/esm/components/Routes/RoutesContent.js.map +1 -1
- package/dist/esm/components/Routes/RoutesExpanded.js.map +1 -1
- package/dist/esm/components/Search/SearchInput.js.map +1 -1
- package/dist/esm/components/SelectChainAndToken.js.map +1 -1
- package/dist/esm/components/SelectTokenButton/SelectTokenButton.js.map +1 -1
- package/dist/esm/components/SendToWallet/SendToWalletButton.js.map +1 -1
- package/dist/esm/components/SendToWallet/SendToWalletExpandButton.js +2 -2
- package/dist/esm/components/SendToWallet/SendToWalletExpandButton.js.map +1 -1
- package/dist/esm/components/SettingsPanel/SettingsPanel.js.map +1 -1
- package/dist/esm/components/Skeleton/WidgetSkeleton.js +2 -1
- package/dist/esm/components/Skeleton/WidgetSkeleton.js.map +1 -1
- package/dist/esm/components/Step/StepActions.js +18 -16
- package/dist/esm/components/Step/StepActions.js.map +1 -1
- package/dist/esm/components/StepActions/SentToWalletRow.js.map +1 -1
- package/dist/esm/components/StepActions/StepActionRow.js +2 -1
- package/dist/esm/components/StepActions/StepActionRow.js.map +1 -1
- package/dist/esm/components/StepActions/StepActionsList.js.map +1 -1
- package/dist/esm/components/SwapButton/SwapButton.js.map +1 -1
- package/dist/esm/components/Switch.js +1 -1
- package/dist/esm/components/Switch.js.map +1 -1
- package/dist/esm/components/Tabs/Tabs.style.js +4 -2
- package/dist/esm/components/Tabs/Tabs.style.js.map +1 -1
- package/dist/esm/components/TextFitter/TextFitter.js.map +1 -1
- package/dist/esm/components/Timer/StepStatusTimer.js.map +1 -1
- package/dist/esm/components/Token/Token.js.map +1 -1
- package/dist/esm/components/TokenList/PinTokenButton.js.map +1 -1
- package/dist/esm/components/TokenList/TokenDetailsSheet.js.map +1 -1
- package/dist/esm/components/TokenList/TokenDetailsSheetContent.js.map +1 -1
- package/dist/esm/components/TokenList/TokenList.js.map +1 -1
- package/dist/esm/components/TokenList/TokenListItem.js +46 -8
- package/dist/esm/components/TokenList/TokenListItem.js.map +1 -1
- package/dist/esm/components/TokenList/VirtualizedTokenList.js +22 -9
- package/dist/esm/components/TokenList/VirtualizedTokenList.js.map +1 -1
- package/dist/esm/components/TokenPillButton/TokenPillButton.js.map +1 -1
- package/dist/esm/components/TokenRate/TokenRate.js +2 -1
- package/dist/esm/components/TokenRate/TokenRate.js.map +1 -1
- package/dist/esm/components/Tools/ToolItem.js.map +1 -1
- package/dist/esm/components/Tools/Tools.js.map +1 -1
- package/dist/esm/components/TransactionCard/ActiveTransactionCard.js +22 -21
- package/dist/esm/components/TransactionCard/ActiveTransactionCard.js.map +1 -1
- package/dist/esm/components/TransactionCard/TransactionCard.js.map +1 -1
- package/dist/esm/components/TransactionCard/TransactionCardSkeleton.js.map +1 -1
- package/dist/esm/config/version.d.ts +1 -1
- package/dist/esm/config/version.js +1 -1
- package/dist/esm/config/version.js.map +1 -1
- package/dist/esm/hooks/timer/time.js +2 -2
- package/dist/esm/hooks/timer/time.js.map +1 -1
- package/dist/esm/hooks/useAccountsBalancesData.js +1 -14
- package/dist/esm/hooks/useAccountsBalancesData.js.map +1 -1
- package/dist/esm/hooks/useAvailableChains.d.ts.map +1 -1
- package/dist/esm/hooks/useAvailableChains.js +2 -1
- package/dist/esm/hooks/useAvailableChains.js.map +1 -1
- package/dist/esm/hooks/useExplorer.d.ts.map +1 -1
- package/dist/esm/hooks/useExplorer.js +4 -0
- package/dist/esm/hooks/useExplorer.js.map +1 -1
- package/dist/esm/hooks/useFlaggedTokenGuard.js +28 -0
- package/dist/esm/hooks/useFlaggedTokenGuard.js.map +1 -0
- package/dist/esm/hooks/useGasSufficiency.js +3 -1
- package/dist/esm/hooks/useGasSufficiency.js.map +1 -1
- package/dist/esm/hooks/useMaxSendAmount.js +15 -0
- package/dist/esm/hooks/useMaxSendAmount.js.map +1 -0
- package/dist/esm/hooks/usePacedRouteExecution.js +3 -2
- package/dist/esm/hooks/usePacedRouteExecution.js.map +1 -1
- package/dist/esm/hooks/useRouteExecutionMessage.js +3 -2
- package/dist/esm/hooks/useRouteExecutionMessage.js.map +1 -1
- package/dist/esm/hooks/useRoutes.d.ts.map +1 -1
- package/dist/esm/hooks/useRoutes.js +3 -1
- package/dist/esm/hooks/useRoutes.js.map +1 -1
- package/dist/esm/hooks/useToAddressAutoPopulate.js.map +1 -1
- package/dist/esm/hooks/useToAddressRequirements.d.ts +2 -0
- package/dist/esm/hooks/useToAddressRequirements.d.ts.map +1 -1
- package/dist/esm/hooks/useToAddressRequirements.js +7 -1
- package/dist/esm/hooks/useToAddressRequirements.js.map +1 -1
- package/dist/esm/hooks/useTokenBalances.d.ts.map +1 -1
- package/dist/esm/hooks/useTokenBalances.js +7 -2
- package/dist/esm/hooks/useTokenBalances.js.map +1 -1
- package/dist/esm/hooks/useTokenBalancesQueries.js +32 -29
- package/dist/esm/hooks/useTokenBalancesQueries.js.map +1 -1
- package/dist/esm/hooks/useTokenSearch.js +3 -5
- package/dist/esm/hooks/useTokenSearch.js.map +1 -1
- package/dist/esm/hooks/useTokens.js +14 -10
- package/dist/esm/hooks/useTokens.js.map +1 -1
- package/dist/esm/hooks/useWideVariant.js +2 -1
- package/dist/esm/hooks/useWideVariant.js.map +1 -1
- package/dist/esm/i18n/bn.json +3 -1
- package/dist/esm/i18n/de.json +3 -1
- package/dist/esm/i18n/en.json +12 -3
- package/dist/esm/i18n/es.json +3 -1
- package/dist/esm/i18n/fr.json +3 -1
- package/dist/esm/i18n/hi.json +3 -1
- package/dist/esm/i18n/id.json +3 -1
- package/dist/esm/i18n/it.json +3 -1
- package/dist/esm/i18n/ja.json +3 -1
- package/dist/esm/i18n/ko.json +3 -1
- package/dist/esm/i18n/pl.json +3 -1
- package/dist/esm/i18n/pt.json +3 -1
- package/dist/esm/i18n/th.json +3 -1
- package/dist/esm/i18n/tr.json +3 -1
- package/dist/esm/i18n/uk.json +3 -1
- package/dist/esm/i18n/vi.json +3 -1
- package/dist/esm/i18n/zh.json +3 -1
- package/dist/esm/pages/ActivitiesPage/ActivitiesPage.js.map +1 -1
- package/dist/esm/pages/ActivitiesPage/ActivitiesPageMenuButton.js.map +1 -1
- package/dist/esm/pages/LanguagesPage.js.map +1 -1
- package/dist/esm/pages/MainPage/LimitPageContent.js.map +1 -1
- package/dist/esm/pages/MainPage/MainPage.js +2 -1
- package/dist/esm/pages/MainPage/MainPage.js.map +1 -1
- package/dist/esm/pages/MainPage/MainPageActions.js.map +1 -1
- package/dist/esm/pages/MainPage/ReviewButton.js +2 -2
- package/dist/esm/pages/MainPage/ReviewButton.js.map +1 -1
- package/dist/esm/pages/RoutePriorityPage.js.map +1 -1
- package/dist/esm/pages/RoutesPage/RoutesPage.js +2 -2
- package/dist/esm/pages/RoutesPage/RoutesPage.js.map +1 -1
- package/dist/esm/pages/SelectChainPage/SelectChainPage.js +13 -12
- package/dist/esm/pages/SelectChainPage/SelectChainPage.js.map +1 -1
- package/dist/esm/pages/SelectEnabledToolsPage.js +8 -5
- package/dist/esm/pages/SelectEnabledToolsPage.js.map +1 -1
- package/dist/esm/pages/SelectTokenPage/SelectTokenPage.js +2 -1
- package/dist/esm/pages/SelectTokenPage/SelectTokenPage.js.map +1 -1
- package/dist/esm/pages/SendToWallet/BookmarkAddressSheet.js.map +1 -1
- package/dist/esm/pages/SendToWallet/BookmarksPage.js.map +1 -1
- package/dist/esm/pages/SendToWallet/ConfirmAddressSheet.js.map +1 -1
- package/dist/esm/pages/SendToWallet/ConnectedWalletsPage.js.map +1 -1
- package/dist/esm/pages/SendToWallet/RecentWalletsPage.js.map +1 -1
- package/dist/esm/pages/SendToWallet/SendToConfiguredWalletPage.js.map +1 -1
- package/dist/esm/pages/SendToWallet/SendToWalletPage.js.map +1 -1
- package/dist/esm/pages/SettingsPage/BridgeAndExchangeSettings.js.map +1 -1
- package/dist/esm/pages/SettingsPage/GasPriceSettings.js.map +1 -1
- package/dist/esm/pages/SettingsPage/LanguageSetting.js.map +1 -1
- package/dist/esm/pages/SettingsPage/ResetSettingsButton.js.map +1 -1
- package/dist/esm/pages/SettingsPage/RoutePrioritySettings.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SettingsCard/BadgedValue.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SettingsCard/SettingCardExpandable.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SettingsPage.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SlippageSettings/SlippagePage.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SmallBalanceFilterSettings.js +2 -1
- package/dist/esm/pages/SettingsPage/SmallBalanceFilterSettings.js.map +1 -1
- package/dist/esm/pages/SettingsPage/ThemeSettings.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/ContactSupportButton.js +2 -1
- package/dist/esm/pages/TransactionDetailsPage/ContactSupportButton.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/ReceiptsCard.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/TransactionDetailsPage.js +2 -1
- package/dist/esm/pages/TransactionDetailsPage/TransactionDetailsPage.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/TransactionDetailsSkeleton.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/TransferIdCard.js.map +1 -1
- package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.js.map +1 -1
- package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.js.map +1 -1
- package/dist/esm/pages/TransactionPage/ExecutionDoneCard.js.map +1 -1
- package/dist/esm/pages/TransactionPage/StartTransactionButton.js +4 -3
- package/dist/esm/pages/TransactionPage/StartTransactionButton.js.map +1 -1
- package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.js.map +1 -1
- package/dist/esm/pages/TransactionPage/TokenVerificationBottomSheet.js +64 -0
- package/dist/esm/pages/TransactionPage/TokenVerificationBottomSheet.js.map +1 -0
- package/dist/esm/pages/TransactionPage/TransactionDoneButtons.js.map +1 -1
- package/dist/esm/pages/TransactionPage/TransactionExecutionContent.js +19 -16
- package/dist/esm/pages/TransactionPage/TransactionExecutionContent.js.map +1 -1
- package/dist/esm/pages/TransactionPage/TransactionFailedButtons.js +3 -1
- package/dist/esm/pages/TransactionPage/TransactionFailedButtons.js.map +1 -1
- package/dist/esm/pages/TransactionPage/TransactionPage.js.map +1 -1
- package/dist/esm/pages/TransactionPage/TransactionReview.js +24 -2
- package/dist/esm/pages/TransactionPage/TransactionReview.js.map +1 -1
- package/dist/esm/providers/I18nProvider/I18nProvider.js +37 -36
- package/dist/esm/providers/I18nProvider/I18nProvider.js.map +1 -1
- package/dist/esm/providers/I18nProvider/types.d.ts.map +1 -1
- package/dist/esm/providers/ThemeProvider/ThemeProvider.js +2 -1
- package/dist/esm/providers/ThemeProvider/ThemeProvider.js.map +1 -1
- package/dist/esm/providers/WalletProvider/WalletProvider.js +10 -9
- package/dist/esm/providers/WalletProvider/WalletProvider.js.map +1 -1
- package/dist/esm/providers/WalletProvider/useExternalWalletProvider.js +7 -3
- package/dist/esm/providers/WalletProvider/useExternalWalletProvider.js.map +1 -1
- package/dist/esm/stores/StoreProvider.js.map +1 -1
- package/dist/esm/stores/form/FormStore.js.map +1 -1
- package/dist/esm/stores/form/FormUpdater.js.map +1 -1
- package/dist/esm/stores/navigationTabs/useNavigationTabsStore.js.map +1 -1
- package/dist/esm/stores/routes/useRouteExecutionIndicator.js +4 -3
- package/dist/esm/stores/routes/useRouteExecutionIndicator.js.map +1 -1
- package/dist/esm/types/token.d.ts +4 -1
- package/dist/esm/types/token.d.ts.map +1 -1
- package/dist/esm/utils/compactNumberFormatter.js +1 -3
- package/dist/esm/utils/compactNumberFormatter.js.map +1 -1
- package/dist/esm/utils/customReceiver.js +7 -0
- package/dist/esm/utils/customReceiver.js.map +1 -0
- package/dist/esm/utils/gas.js +24 -0
- package/dist/esm/utils/gas.js.map +1 -0
- package/dist/esm/utils/getErrorMessage.js +0 -1
- package/dist/esm/utils/getErrorMessage.js.map +1 -1
- package/dist/esm/utils/limitOrder.js +1 -1
- package/dist/esm/utils/limitOrder.js.map +1 -1
- package/dist/esm/utils/token.js +21 -4
- package/dist/esm/utils/token.js.map +1 -1
- package/dist/esm/utils/tokenList.js +37 -23
- package/dist/esm/utils/tokenList.js.map +1 -1
- package/package.json +15 -15
- package/src/components/AmountInput/AmountInputEndAdornment.tsx +2 -21
- package/src/components/AmountInputCard/PercentageChips.tsx +2 -18
- package/src/components/Chains/AllChainsAvatar.tsx +7 -1
- package/src/components/Messages/UnsupportedToAddressMessage.tsx +24 -0
- package/src/components/Messages/WarningMessages.tsx +3 -0
- package/src/components/Messages/useMessageQueue.ts +9 -0
- package/src/components/Routes/LimitOrderRoutes.tsx +5 -2
- package/src/components/Routes/RoutesContent.tsx +5 -2
- package/src/components/SendToWallet/SendToWalletExpandButton.tsx +2 -1
- package/src/components/TokenList/TokenListItem.tsx +68 -9
- package/src/components/TokenList/VirtualizedTokenList.tsx +33 -9
- package/src/components/TokenList/types.ts +4 -0
- package/src/config/version.ts +1 -1
- package/src/hooks/useAccountsBalancesData.ts +4 -31
- package/src/hooks/useAvailableChains.ts +1 -0
- package/src/hooks/useExplorer.ts +2 -0
- package/src/hooks/useFlaggedTokenGuard.ts +33 -0
- package/src/hooks/useGasSufficiency.ts +9 -1
- package/src/hooks/useMaxSendAmount.ts +21 -0
- package/src/hooks/useRoutes.ts +7 -0
- package/src/hooks/useToAddressRequirements.ts +17 -1
- package/src/hooks/useTokenBalances.ts +18 -2
- package/src/hooks/useTokenBalancesQueries.ts +12 -4
- package/src/hooks/useTokenSearch.ts +1 -5
- package/src/hooks/useTokens.ts +28 -13
- package/src/pages/MainPage/ReviewButton.tsx +6 -2
- package/src/pages/RoutesPage/RoutesPage.tsx +5 -2
- package/src/pages/TransactionPage/TokenVerificationBottomSheet.tsx +93 -0
- package/src/pages/TransactionPage/TransactionReview.tsx +28 -1
- package/src/providers/WalletProvider/useExternalWalletProvider.ts +9 -1
- package/src/types/token.ts +6 -3
- package/src/utils/customReceiver.ts +7 -0
- package/src/utils/gas.ts +41 -0
- package/src/utils/token.ts +53 -9
- package/src/utils/tokenList.ts +27 -7
- package/dist/esm/hooks/useFilteredByTokenBalances.js +0 -74
- package/dist/esm/hooks/useFilteredByTokenBalances.js.map +0 -1
- package/src/hooks/useFilteredByTokenBalances.ts +0 -145
package/src/utils/token.ts
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {
|
|
2
|
+
BaseToken,
|
|
3
|
+
ExtendedChain,
|
|
4
|
+
RouteExtended,
|
|
5
|
+
StaticToken,
|
|
6
|
+
Token,
|
|
7
|
+
TokenAmount,
|
|
8
|
+
} from '@lifi/sdk'
|
|
9
|
+
import { ChainId } from '@lifi/sdk'
|
|
2
10
|
import type { FormType } from '../stores/form/types.js'
|
|
3
|
-
import type { TokensByChain,
|
|
11
|
+
import type { TokensByChain, TokenWithFlags } from '../types/token.js'
|
|
4
12
|
import type { WidgetChains, WidgetTokens } from '../types/widget.js'
|
|
5
13
|
import { getConfigItemSets, isFormItemAllowed } from './item.js'
|
|
6
14
|
|
|
@@ -94,7 +102,8 @@ export const filterAllowedTokens = (
|
|
|
94
102
|
dataTokens: TokensByChain | undefined,
|
|
95
103
|
configTokens?: WidgetTokens,
|
|
96
104
|
chainsConfig?: WidgetChains,
|
|
97
|
-
formType?: FormType
|
|
105
|
+
formType?: FormType,
|
|
106
|
+
nativeTokenAddresses?: Map<number, string>
|
|
98
107
|
): TokensByChain | undefined => {
|
|
99
108
|
if (!dataTokens) {
|
|
100
109
|
return
|
|
@@ -143,13 +152,14 @@ export const filterAllowedTokens = (
|
|
|
143
152
|
)
|
|
144
153
|
|
|
145
154
|
const verifiedAddresses = verifiedTokensSets?.get(chainId)
|
|
155
|
+
const nativeAddress = nativeTokenAddresses?.get(chainId)?.toLowerCase()
|
|
146
156
|
|
|
147
|
-
const chainTokens:
|
|
157
|
+
const chainTokens: TokenWithFlags[] = [
|
|
148
158
|
...(dataTokens[chainId] ?? []),
|
|
149
159
|
...chainIncludedTokens,
|
|
150
160
|
]
|
|
151
161
|
|
|
152
|
-
const filtered:
|
|
162
|
+
const filtered: TokenWithFlags[] = []
|
|
153
163
|
const seenAddresses = new Set<string>()
|
|
154
164
|
for (const token of chainTokens) {
|
|
155
165
|
const address = token.address.toLowerCase()
|
|
@@ -167,12 +177,18 @@ export const filterAllowedTokens = (
|
|
|
167
177
|
continue
|
|
168
178
|
}
|
|
169
179
|
// Include and verified-allowlist tokens are explicitly set by the
|
|
170
|
-
// integrator, mark them as verified
|
|
171
|
-
|
|
180
|
+
// integrator, mark them as verified. Flags are only ever set to true,
|
|
181
|
+
// so a token that earns none keeps its cached object.
|
|
182
|
+
const markVerified =
|
|
172
183
|
!token.verified &&
|
|
173
184
|
(includedAddresses.has(address) || verifiedAddresses?.has(address))
|
|
174
|
-
|
|
175
|
-
|
|
185
|
+
const markNative = !!nativeAddress && nativeAddress === address
|
|
186
|
+
if (markVerified || markNative) {
|
|
187
|
+
filtered.push({
|
|
188
|
+
...token,
|
|
189
|
+
...(markVerified ? { verified: true } : {}),
|
|
190
|
+
...(markNative ? { native: true } : {}),
|
|
191
|
+
})
|
|
176
192
|
} else {
|
|
177
193
|
filtered.push(token)
|
|
178
194
|
}
|
|
@@ -192,3 +208,31 @@ export const getExecutionToToken = (route: RouteExtended): TokenAmount => ({
|
|
|
192
208
|
route.toAmount
|
|
193
209
|
),
|
|
194
210
|
})
|
|
211
|
+
|
|
212
|
+
/** Capitalized name of the first provider that verified the token. */
|
|
213
|
+
export const getTokenVerificationProvider = (
|
|
214
|
+
token: Pick<StaticToken, 'verificationStatusBreakdown'>
|
|
215
|
+
): string | undefined => {
|
|
216
|
+
const provider = token.verificationStatusBreakdown?.find(
|
|
217
|
+
(entry) => entry.result === 'verified'
|
|
218
|
+
)?.provider
|
|
219
|
+
return provider
|
|
220
|
+
? `${provider.charAt(0).toUpperCase()}${provider.slice(1)}`
|
|
221
|
+
: undefined
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Hyperliquid declares Arbitrum USDC as its native token, Lighter declares
|
|
226
|
+
* Ethereum USDC. Neither is a gas token you hold there. A chain-local
|
|
227
|
+
* stablecoin gas token, as on Arc or Stable, is genuine and stays.
|
|
228
|
+
*/
|
|
229
|
+
const chainIdsWithoutNativeToken = new Set([ChainId.HPL, ChainId.LTR])
|
|
230
|
+
|
|
231
|
+
export const getNativeTokenAddresses = (
|
|
232
|
+
chains?: ExtendedChain[]
|
|
233
|
+
): Map<number, string> =>
|
|
234
|
+
new Map(
|
|
235
|
+
chains
|
|
236
|
+
?.filter((chain) => !chainIdsWithoutNativeToken.has(chain.id))
|
|
237
|
+
.map((chain) => [chain.id, chain.nativeToken.address])
|
|
238
|
+
)
|
package/src/utils/tokenList.ts
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
formatUnits,
|
|
3
|
-
type TokenExtended,
|
|
4
|
-
type WalletTokenExtended,
|
|
5
|
-
} from '@lifi/sdk'
|
|
1
|
+
import { formatUnits, type TokenExtended } from '@lifi/sdk'
|
|
6
2
|
import type { TokenAmount, TokenAmountExtended } from '../types/token.js'
|
|
7
3
|
import type { WidgetTokens } from '../types/widget.js'
|
|
8
4
|
|
|
@@ -279,6 +275,30 @@ export const isSearchMatch = (
|
|
|
279
275
|
)
|
|
280
276
|
}
|
|
281
277
|
|
|
282
|
-
|
|
283
|
-
|
|
278
|
+
/**
|
|
279
|
+
* Moves the chain's native token to the top of its own chain's list, unless an
|
|
280
|
+
* external list already places it. Returns the array unchanged when nothing
|
|
281
|
+
* moves, so a memo downstream keeps its reference.
|
|
282
|
+
*/
|
|
283
|
+
export const hoistNativeToken = (
|
|
284
|
+
tokens: TokenAmount[],
|
|
285
|
+
selectedChainId?: number
|
|
286
|
+
): TokenAmount[] => {
|
|
287
|
+
if (!selectedChainId) {
|
|
288
|
+
return tokens
|
|
289
|
+
}
|
|
290
|
+
const index = tokens.findIndex(
|
|
291
|
+
(token) =>
|
|
292
|
+
token.native &&
|
|
293
|
+
token.chainId === selectedChainId &&
|
|
294
|
+
!token.featured &&
|
|
295
|
+
!token.popular &&
|
|
296
|
+
!token.pinned &&
|
|
297
|
+
!token.verified
|
|
298
|
+
)
|
|
299
|
+
// -1 is no native token, 0 is already first
|
|
300
|
+
if (index < 1) {
|
|
301
|
+
return tokens
|
|
302
|
+
}
|
|
303
|
+
return [tokens[index], ...tokens.slice(0, index), ...tokens.slice(index + 1)]
|
|
284
304
|
}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { getConfigItemSets, isFormItemAllowed } from "../utils/item.js";
|
|
2
|
-
import { useWidgetConfig } from "../providers/WidgetProvider/WidgetProvider.js";
|
|
3
|
-
import { useSDKClient } from "../providers/SDKClientProvider.js";
|
|
4
|
-
import { getVerifiedTokensSets } from "../utils/token.js";
|
|
5
|
-
import { isSupportedToken } from "../utils/tokenList.js";
|
|
6
|
-
import { ChainType, getWalletBalances } from "@lifi/sdk";
|
|
7
|
-
import { useMemo } from "react";
|
|
8
|
-
import { useQuery } from "@tanstack/react-query";
|
|
9
|
-
//#region src/hooks/useFilteredByTokenBalances.ts
|
|
10
|
-
const useFilteredTokensByBalance = (accountsWithTokens, formType) => {
|
|
11
|
-
const { tokens: configTokens } = useWidgetConfig();
|
|
12
|
-
const sdkClient = useSDKClient();
|
|
13
|
-
const evmAddress = useMemo(() => {
|
|
14
|
-
return Object.entries(accountsWithTokens ?? {}).find(([_, { chainType }]) => chainType === ChainType.EVM)?.[0];
|
|
15
|
-
}, [accountsWithTokens]);
|
|
16
|
-
const { data: existingBalances, isLoading } = useQuery({
|
|
17
|
-
queryKey: ["existing-evm-balances", evmAddress],
|
|
18
|
-
queryFn: () => getWalletBalances(sdkClient, evmAddress ?? ""),
|
|
19
|
-
enabled: !!evmAddress,
|
|
20
|
-
refetchInterval: 3e4,
|
|
21
|
-
staleTime: 3e4,
|
|
22
|
-
retry: false
|
|
23
|
-
});
|
|
24
|
-
return {
|
|
25
|
-
data: useMemo(() => {
|
|
26
|
-
if (!accountsWithTokens) return;
|
|
27
|
-
const result = {};
|
|
28
|
-
if (!existingBalances) {
|
|
29
|
-
for (const [address, { tokens }] of Object.entries(accountsWithTokens)) result[address] = tokens;
|
|
30
|
-
return result;
|
|
31
|
-
}
|
|
32
|
-
const verifiedTokensSets = getVerifiedTokensSets(configTokens);
|
|
33
|
-
for (const [address, { tokens }] of Object.entries(accountsWithTokens)) {
|
|
34
|
-
result[address] = {};
|
|
35
|
-
for (const [chainIdStr, chainTokens] of Object.entries(tokens)) {
|
|
36
|
-
const chainId = Number(chainIdStr);
|
|
37
|
-
const verifiedAddresses = verifiedTokensSets?.get(chainId);
|
|
38
|
-
const balances = existingBalances?.[chainId];
|
|
39
|
-
if (!balances?.length) {
|
|
40
|
-
if (chainTokens.length) result[address][chainId] = chainTokens;
|
|
41
|
-
continue;
|
|
42
|
-
}
|
|
43
|
-
const balanceSet = new Set(balances.map((balance) => balance.address.toLowerCase()));
|
|
44
|
-
const filteredTokens = chainTokens.filter((token) => {
|
|
45
|
-
const tokenKey = token.address.toLowerCase();
|
|
46
|
-
return balanceSet.has(tokenKey);
|
|
47
|
-
});
|
|
48
|
-
const chainTokenSet = new Set(chainTokens.map((token) => token.address.toLowerCase()));
|
|
49
|
-
const allowedAddressesConfig = getConfigItemSets(configTokens, (tokens) => new Set(tokens.filter((t) => Number(t.chainId) === chainId).map((t) => t.address.toLowerCase())), formType);
|
|
50
|
-
const additionalTokens = balances.filter((balance) => {
|
|
51
|
-
const balanceKey = balance.address.toLowerCase();
|
|
52
|
-
return !chainTokenSet.has(balanceKey) && isSupportedToken(balance) && isFormItemAllowed(balance, allowedAddressesConfig, formType, (t) => t.address.toLowerCase());
|
|
53
|
-
}).map((token) => ({
|
|
54
|
-
...token,
|
|
55
|
-
verified: verifiedAddresses?.has(token.address.toLowerCase()) ?? false
|
|
56
|
-
}));
|
|
57
|
-
const allTokens = [...filteredTokens, ...additionalTokens];
|
|
58
|
-
if (allTokens.length) result[address][chainId] = allTokens;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return result;
|
|
62
|
-
}, [
|
|
63
|
-
accountsWithTokens,
|
|
64
|
-
existingBalances,
|
|
65
|
-
configTokens,
|
|
66
|
-
formType
|
|
67
|
-
]),
|
|
68
|
-
isLoading
|
|
69
|
-
};
|
|
70
|
-
};
|
|
71
|
-
//#endregion
|
|
72
|
-
export { useFilteredTokensByBalance };
|
|
73
|
-
|
|
74
|
-
//# sourceMappingURL=useFilteredByTokenBalances.js.map
|
|
@@ -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
|
-
}
|