@lifi/widget 4.6.0 → 4.7.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/README.md +26 -3
- package/dist/esm/App.d.ts +1 -2
- package/dist/esm/App.d.ts.map +1 -1
- package/dist/esm/AppDrawer.d.ts +1 -2
- package/dist/esm/AppDrawer.d.ts.map +1 -1
- package/dist/esm/components/ActionRow/ActionRow.d.ts +1 -2
- package/dist/esm/components/ActionRow/ActionRow.d.ts.map +1 -1
- package/dist/esm/components/AmountInput/AmountInput.style.d.ts +2 -2
- package/dist/esm/components/AmountInput/AmountInput.style.d.ts.map +1 -1
- package/dist/esm/components/AmountInput/AmountInputEndAdornment.d.ts +1 -2
- package/dist/esm/components/AmountInput/AmountInputEndAdornment.d.ts.map +1 -1
- package/dist/esm/components/AmountInput/PriceFormHelperText.style.d.ts +1 -2
- package/dist/esm/components/AmountInput/PriceFormHelperText.style.d.ts.map +1 -1
- package/dist/esm/components/AmountInputCard/ReceiveAmountCard.js +6 -2
- package/dist/esm/components/AmountInputCard/ReceiveAmountCard.js.map +1 -1
- package/dist/esm/components/Avatar/Avatar.d.ts +1 -2
- package/dist/esm/components/Avatar/Avatar.d.ts.map +1 -1
- package/dist/esm/components/Avatar/TokenAvatar.d.ts +1 -2
- package/dist/esm/components/Avatar/TokenAvatar.d.ts.map +1 -1
- package/dist/esm/components/BaseTransactionButton/BaseTransactionButton.d.ts +1 -2
- package/dist/esm/components/BaseTransactionButton/BaseTransactionButton.d.ts.map +1 -1
- package/dist/esm/components/BaseTransactionButton/types.d.ts +1 -2
- package/dist/esm/components/BaseTransactionButton/types.d.ts.map +1 -1
- package/dist/esm/components/BottomSheet/BottomSheet.js +1 -0
- package/dist/esm/components/BottomSheet/BottomSheet.js.map +1 -1
- package/dist/esm/components/BottomSheet/types.d.ts +1 -2
- package/dist/esm/components/BottomSheet/types.d.ts.map +1 -1
- package/dist/esm/components/ButtonTertiary.d.ts +1 -2
- package/dist/esm/components/ButtonTertiary.d.ts.map +1 -1
- package/dist/esm/components/Card/CardIconButton.d.ts +1 -2
- package/dist/esm/components/Card/CardIconButton.d.ts.map +1 -1
- package/dist/esm/components/Card/CardTitle.d.ts +1 -2
- package/dist/esm/components/Card/CardTitle.d.ts.map +1 -1
- package/dist/esm/components/Card/InputCard.d.ts +1 -2
- package/dist/esm/components/Card/InputCard.d.ts.map +1 -1
- package/dist/esm/components/ChainSelect/ChainSelect.d.ts +1 -2
- package/dist/esm/components/ChainSelect/ChainSelect.d.ts.map +1 -1
- package/dist/esm/components/ChainSelect/ChainSelect.style.d.ts +1 -2
- package/dist/esm/components/ChainSelect/ChainSelect.style.d.ts.map +1 -1
- package/dist/esm/components/ContractComponent/ContractComponent.d.ts +1 -2
- package/dist/esm/components/ContractComponent/ContractComponent.d.ts.map +1 -1
- package/dist/esm/components/ContractComponent/ItemPrice.d.ts +2 -3
- package/dist/esm/components/ContractComponent/ItemPrice.d.ts.map +1 -1
- package/dist/esm/components/ContractComponent/NFT/NFT.d.ts +1 -2
- package/dist/esm/components/ContractComponent/NFT/NFT.d.ts.map +1 -1
- package/dist/esm/components/ContractComponent/NFT/NFTBase.d.ts +1 -2
- package/dist/esm/components/ContractComponent/NFT/NFTBase.d.ts.map +1 -1
- package/dist/esm/components/ContractComponent/NFT/types.d.ts +3 -4
- package/dist/esm/components/ContractComponent/NFT/types.d.ts.map +1 -1
- package/dist/esm/components/ExecutionStatusCard/ExecutionStatusCard.d.ts +1 -2
- package/dist/esm/components/ExecutionStatusCard/ExecutionStatusCard.d.ts.map +1 -1
- package/dist/esm/components/ExecutionStatusCard/StatusIcon.d.ts +1 -2
- package/dist/esm/components/ExecutionStatusCard/StatusIcon.d.ts.map +1 -1
- package/dist/esm/components/FeeBreakdownTooltip.d.ts +1 -2
- package/dist/esm/components/FeeBreakdownTooltip.d.ts.map +1 -1
- package/dist/esm/components/IconCircle/IconCircle.d.ts +1 -2
- package/dist/esm/components/IconCircle/IconCircle.d.ts.map +1 -1
- package/dist/esm/components/IconCircle/statusIcons.d.ts +1 -2
- package/dist/esm/components/IconCircle/statusIcons.d.ts.map +1 -1
- package/dist/esm/components/IconTypography.d.ts +1 -2
- package/dist/esm/components/IconTypography.d.ts.map +1 -1
- package/dist/esm/components/ListItem/ListItemButton.d.ts +1 -2
- package/dist/esm/components/ListItem/ListItemButton.d.ts.map +1 -1
- package/dist/esm/components/Messages/WarningMessages.d.ts +1 -2
- package/dist/esm/components/Messages/WarningMessages.d.ts.map +1 -1
- package/dist/esm/components/PageContainer.d.ts +2 -3
- package/dist/esm/components/PageContainer.d.ts.map +1 -1
- package/dist/esm/components/PoweredBy/PoweredBy.d.ts +1 -2
- package/dist/esm/components/PoweredBy/PoweredBy.d.ts.map +1 -1
- package/dist/esm/components/ProgressToNextUpdate.d.ts +1 -2
- package/dist/esm/components/ProgressToNextUpdate.d.ts.map +1 -1
- package/dist/esm/components/RouteCard/RouteCard.d.ts +1 -2
- package/dist/esm/components/RouteCard/RouteCard.d.ts.map +1 -1
- package/dist/esm/components/RouteCard/RouteCardSkeleton.d.ts +1 -2
- package/dist/esm/components/RouteCard/RouteCardSkeleton.d.ts.map +1 -1
- package/dist/esm/components/RouteCard/RouteDetails.d.ts +1 -2
- package/dist/esm/components/RouteCard/RouteDetails.d.ts.map +1 -1
- package/dist/esm/components/RouteCard/RouteDetails.style.d.ts +5 -6
- package/dist/esm/components/RouteCard/RouteDetails.style.d.ts.map +1 -1
- package/dist/esm/components/RouteCard/RouteNotFoundCard.d.ts +1 -2
- package/dist/esm/components/RouteCard/RouteNotFoundCard.d.ts.map +1 -1
- package/dist/esm/components/RouteCard/RouteTokens.d.ts +1 -2
- package/dist/esm/components/RouteCard/RouteTokens.d.ts.map +1 -1
- package/dist/esm/components/RouteCard/types.d.ts +2 -3
- package/dist/esm/components/RouteCard/types.d.ts.map +1 -1
- package/dist/esm/components/Search/SearchInput.d.ts +1 -2
- package/dist/esm/components/Search/SearchInput.d.ts.map +1 -1
- package/dist/esm/components/SendToWallet/SendToWalletButton.d.ts +1 -2
- package/dist/esm/components/SendToWallet/SendToWalletButton.d.ts.map +1 -1
- package/dist/esm/components/Skeleton/WidgetSkeleton.d.ts +1 -2
- package/dist/esm/components/Skeleton/WidgetSkeleton.d.ts.map +1 -1
- package/dist/esm/components/StepActions/SentToWalletRow.d.ts +1 -2
- package/dist/esm/components/StepActions/SentToWalletRow.d.ts.map +1 -1
- package/dist/esm/components/StepActions/StepActionRow.style.d.ts +1 -2
- package/dist/esm/components/StepActions/StepActionRow.style.d.ts.map +1 -1
- package/dist/esm/components/StepActions/StepActionsList.d.ts +1 -2
- package/dist/esm/components/StepActions/StepActionsList.d.ts.map +1 -1
- package/dist/esm/components/StepActions/executionRows.d.ts +2 -3
- package/dist/esm/components/StepActions/executionRows.d.ts.map +1 -1
- package/dist/esm/components/Token/Token.d.ts.map +1 -1
- package/dist/esm/components/Token/Token.js +2 -4
- package/dist/esm/components/Token/Token.js.map +1 -1
- package/dist/esm/components/TokenList/RecentTokensHeader.js +44 -0
- package/dist/esm/components/TokenList/RecentTokensHeader.js.map +1 -0
- package/dist/esm/components/TokenList/RecentTokensToggle.js +36 -0
- package/dist/esm/components/TokenList/RecentTokensToggle.js.map +1 -0
- package/dist/esm/components/TokenList/RemoveRecentTokenButton.js +32 -0
- package/dist/esm/components/TokenList/RemoveRecentTokenButton.js.map +1 -0
- package/dist/esm/components/TokenList/TokenList.js +55 -5
- package/dist/esm/components/TokenList/TokenList.js.map +1 -1
- package/dist/esm/components/TokenList/TokenListItem.js +35 -19
- package/dist/esm/components/TokenList/TokenListItem.js.map +1 -1
- package/dist/esm/components/TokenList/TokenNotFound.d.ts +1 -2
- package/dist/esm/components/TokenList/TokenNotFound.d.ts.map +1 -1
- package/dist/esm/components/TokenList/VirtualizedTokenList.d.ts +1 -2
- package/dist/esm/components/TokenList/VirtualizedTokenList.d.ts.map +1 -1
- package/dist/esm/components/TokenList/VirtualizedTokenList.js +55 -42
- package/dist/esm/components/TokenList/VirtualizedTokenList.js.map +1 -1
- package/dist/esm/components/TokenList/types.d.ts +9 -2
- package/dist/esm/components/TokenList/types.d.ts.map +1 -1
- package/dist/esm/components/TokenList/useTokenSelect.d.ts +1 -2
- package/dist/esm/components/TokenList/useTokenSelect.d.ts.map +1 -1
- package/dist/esm/components/TokenRate/TokenRate.d.ts +1 -2
- package/dist/esm/components/TokenRate/TokenRate.d.ts.map +1 -1
- package/dist/esm/components/TransactionCard/TransactionCard.style.d.ts +2 -3
- package/dist/esm/components/TransactionCard/TransactionCard.style.d.ts.map +1 -1
- package/dist/esm/config/constants.d.ts +1 -2
- package/dist/esm/config/constants.d.ts.map +1 -1
- package/dist/esm/config/version.d.ts +2 -3
- package/dist/esm/config/version.d.ts.map +1 -1
- package/dist/esm/config/version.js +1 -1
- package/dist/esm/config/version.js.map +1 -1
- package/dist/esm/hooks/useAddressActivity.d.ts +1 -2
- package/dist/esm/hooks/useAddressActivity.d.ts.map +1 -1
- package/dist/esm/hooks/useAddressValidation.d.ts +2 -3
- package/dist/esm/hooks/useAddressValidation.d.ts.map +1 -1
- package/dist/esm/hooks/useAvailableChains.d.ts +1 -2
- package/dist/esm/hooks/useAvailableChains.d.ts.map +1 -1
- package/dist/esm/hooks/useChain.d.ts +1 -2
- package/dist/esm/hooks/useChain.d.ts.map +1 -1
- package/dist/esm/hooks/useContactSupport.d.ts +1 -2
- package/dist/esm/hooks/useContactSupport.d.ts.map +1 -1
- package/dist/esm/hooks/useDebouncedWatch.d.ts +1 -2
- package/dist/esm/hooks/useDebouncedWatch.d.ts.map +1 -1
- package/dist/esm/hooks/useDisplayedTokens.js +6 -4
- package/dist/esm/hooks/useDisplayedTokens.js.map +1 -1
- package/dist/esm/hooks/useExplorer.d.ts +1 -2
- package/dist/esm/hooks/useExplorer.d.ts.map +1 -1
- package/dist/esm/hooks/useHeader.d.ts +1 -2
- package/dist/esm/hooks/useHeader.d.ts.map +1 -1
- package/dist/esm/hooks/useListHeight.d.ts +1 -2
- package/dist/esm/hooks/useListHeight.d.ts.map +1 -1
- package/dist/esm/hooks/useNavigateBack.d.ts +1 -2
- package/dist/esm/hooks/useNavigateBack.d.ts.map +1 -1
- package/dist/esm/hooks/useRecentTokens.js +46 -0
- package/dist/esm/hooks/useRecentTokens.js.map +1 -0
- package/dist/esm/hooks/useRouteExecution.d.ts +1 -2
- package/dist/esm/hooks/useRouteExecution.d.ts.map +1 -1
- package/dist/esm/hooks/useRouteExecutionMessage.d.ts +1 -2
- package/dist/esm/hooks/useRouteExecutionMessage.d.ts.map +1 -1
- package/dist/esm/hooks/useRoutes.d.ts +1 -2
- package/dist/esm/hooks/useRoutes.d.ts.map +1 -1
- package/dist/esm/hooks/useRoutes.js +7 -2
- package/dist/esm/hooks/useRoutes.js.map +1 -1
- package/dist/esm/hooks/useToAddressRequirements.d.ts +1 -2
- package/dist/esm/hooks/useToAddressRequirements.d.ts.map +1 -1
- package/dist/esm/hooks/useToAddressRequirements.js +8 -2
- package/dist/esm/hooks/useToAddressRequirements.js.map +1 -1
- package/dist/esm/hooks/useToken.d.ts +1 -2
- package/dist/esm/hooks/useToken.d.ts.map +1 -1
- package/dist/esm/hooks/useTokenAddressBalance.d.ts +1 -2
- package/dist/esm/hooks/useTokenAddressBalance.d.ts.map +1 -1
- package/dist/esm/hooks/useTokenBalances.d.ts +3 -2
- package/dist/esm/hooks/useTokenBalances.d.ts.map +1 -1
- package/dist/esm/hooks/useTokenBalances.js +15 -9
- package/dist/esm/hooks/useTokenBalances.js.map +1 -1
- package/dist/esm/hooks/useTokenList.d.ts +1 -2
- package/dist/esm/hooks/useTokenList.d.ts.map +1 -1
- package/dist/esm/hooks/useTokenSearch.js +3 -2
- package/dist/esm/hooks/useTokenSearch.js.map +1 -1
- package/dist/esm/hooks/useTokens.js +26 -15
- package/dist/esm/hooks/useTokens.js.map +1 -1
- package/dist/esm/hooks/useTools.d.ts +1 -2
- package/dist/esm/hooks/useTools.d.ts.map +1 -1
- package/dist/esm/hooks/useWidgetChains.d.ts +1 -2
- package/dist/esm/hooks/useWidgetChains.d.ts.map +1 -1
- package/dist/esm/hooks/useWidgetEvents.d.ts +3 -4
- package/dist/esm/hooks/useWidgetEvents.d.ts.map +1 -1
- package/dist/esm/i18n/bn.json +4 -0
- package/dist/esm/i18n/de.json +4 -0
- package/dist/esm/i18n/en.json +4 -0
- package/dist/esm/i18n/es.json +4 -0
- package/dist/esm/i18n/fr.json +4 -0
- package/dist/esm/i18n/hi.json +4 -0
- package/dist/esm/i18n/id.json +4 -0
- package/dist/esm/i18n/it.json +4 -0
- package/dist/esm/i18n/ja.json +4 -0
- package/dist/esm/i18n/ko.json +4 -0
- package/dist/esm/i18n/pl.json +4 -0
- package/dist/esm/i18n/pt.json +4 -0
- package/dist/esm/i18n/th.json +4 -0
- package/dist/esm/i18n/tr.json +4 -0
- package/dist/esm/i18n/uk.json +4 -0
- package/dist/esm/i18n/vi.json +4 -0
- package/dist/esm/i18n/zh.json +4 -0
- package/dist/esm/pages/MainPage/MainWarningMessages.d.ts +1 -2
- package/dist/esm/pages/MainPage/MainWarningMessages.d.ts.map +1 -1
- package/dist/esm/pages/SelectChainPage/SelectChainPage.d.ts +1 -2
- package/dist/esm/pages/SelectChainPage/SelectChainPage.d.ts.map +1 -1
- package/dist/esm/pages/SelectChainPage/types.d.ts +1 -2
- package/dist/esm/pages/SelectChainPage/types.d.ts.map +1 -1
- package/dist/esm/pages/SelectTokenPage/SearchTokenInput.d.ts +1 -2
- package/dist/esm/pages/SelectTokenPage/SearchTokenInput.d.ts.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/ContactSupportButton.d.ts +1 -2
- package/dist/esm/pages/TransactionDetailsPage/ContactSupportButton.d.ts.map +1 -1
- package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.d.ts +1 -2
- package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.d.ts.map +1 -1
- package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.d.ts +2 -3
- package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.d.ts.map +1 -1
- package/dist/esm/pages/TransactionPage/ExecutionDoneCard.d.ts +1 -2
- package/dist/esm/pages/TransactionPage/ExecutionDoneCard.d.ts.map +1 -1
- package/dist/esm/pages/TransactionPage/RouteTracker.d.ts +1 -2
- package/dist/esm/pages/TransactionPage/RouteTracker.d.ts.map +1 -1
- package/dist/esm/pages/TransactionPage/StartTransactionButton.d.ts +1 -2
- package/dist/esm/pages/TransactionPage/StartTransactionButton.d.ts.map +1 -1
- package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.d.ts +1 -2
- package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.d.ts.map +1 -1
- package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.js +0 -1
- package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.js.map +1 -1
- package/dist/esm/pages/TransactionPage/TokenVerificationBottomSheet.js +0 -1
- package/dist/esm/pages/TransactionPage/TokenVerificationBottomSheet.js.map +1 -1
- package/dist/esm/pages/TransactionPage/TransactionDoneButtons.d.ts +1 -2
- package/dist/esm/pages/TransactionPage/TransactionDoneButtons.d.ts.map +1 -1
- package/dist/esm/pages/TransactionPage/TransactionFailedButtons.js +38 -12
- package/dist/esm/pages/TransactionPage/TransactionFailedButtons.js.map +1 -1
- package/dist/esm/pages/TransactionPage/TransactionReview.js +22 -21
- package/dist/esm/pages/TransactionPage/TransactionReview.js.map +1 -1
- package/dist/esm/pages/TransactionPage/types.d.ts +1 -2
- package/dist/esm/pages/TransactionPage/types.d.ts.map +1 -1
- package/dist/esm/pages/TransactionPage/utils.d.ts +2 -3
- package/dist/esm/pages/TransactionPage/utils.d.ts.map +1 -1
- package/dist/esm/pages/TransactionPage/utils.js +23 -1
- package/dist/esm/pages/TransactionPage/utils.js.map +1 -1
- package/dist/esm/providers/I18nProvider/I18nProvider.d.ts +1 -2
- package/dist/esm/providers/I18nProvider/I18nProvider.d.ts.map +1 -1
- package/dist/esm/providers/I18nProvider/types.d.ts +4 -5
- package/dist/esm/providers/I18nProvider/types.d.ts.map +1 -1
- package/dist/esm/providers/QueryClientProvider.d.ts +1 -2
- package/dist/esm/providers/QueryClientProvider.d.ts.map +1 -1
- package/dist/esm/providers/SDKClientProvider.d.ts +2 -3
- package/dist/esm/providers/SDKClientProvider.d.ts.map +1 -1
- package/dist/esm/providers/WalletProvider/WalletProvider.d.ts +1 -2
- package/dist/esm/providers/WalletProvider/WalletProvider.d.ts.map +1 -1
- package/dist/esm/providers/WidgetProvider/WidgetProvider.d.ts +2 -3
- package/dist/esm/providers/WidgetProvider/WidgetProvider.d.ts.map +1 -1
- package/dist/esm/providers/WidgetProvider/types.d.ts +2 -3
- package/dist/esm/providers/WidgetProvider/types.d.ts.map +1 -1
- package/dist/esm/stores/StoreProvider.d.ts +1 -2
- package/dist/esm/stores/StoreProvider.d.ts.map +1 -1
- package/dist/esm/stores/StoreProvider.js +10 -6
- package/dist/esm/stores/StoreProvider.js.map +1 -1
- package/dist/esm/stores/bookmarks/BookmarkStore.d.ts +1 -2
- package/dist/esm/stores/bookmarks/BookmarkStore.d.ts.map +1 -1
- package/dist/esm/stores/bookmarks/types.d.ts +5 -6
- package/dist/esm/stores/bookmarks/types.d.ts.map +1 -1
- package/dist/esm/stores/chains/ChainOrderStore.d.ts +1 -2
- package/dist/esm/stores/chains/ChainOrderStore.d.ts.map +1 -1
- package/dist/esm/stores/chains/ChainOrderStore.js +11 -5
- package/dist/esm/stores/chains/ChainOrderStore.js.map +1 -1
- package/dist/esm/stores/chains/types.d.ts +1 -2
- package/dist/esm/stores/chains/types.d.ts.map +1 -1
- package/dist/esm/stores/form/types.d.ts +20 -21
- package/dist/esm/stores/form/types.d.ts.map +1 -1
- package/dist/esm/stores/form/useFieldActions.d.ts +1 -2
- package/dist/esm/stores/form/useFieldActions.d.ts.map +1 -1
- package/dist/esm/stores/form/useFieldValues.d.ts +1 -2
- package/dist/esm/stores/form/useFieldValues.d.ts.map +1 -1
- package/dist/esm/stores/header/types.d.ts +1 -2
- package/dist/esm/stores/header/types.d.ts.map +1 -1
- package/dist/esm/stores/header/useHeaderStore.d.ts +2 -3
- package/dist/esm/stores/header/useHeaderStore.d.ts.map +1 -1
- package/dist/esm/stores/inputMode/useInputModeStore.d.ts +1 -2
- package/dist/esm/stores/inputMode/useInputModeStore.d.ts.map +1 -1
- package/dist/esm/stores/recentTokens/RecentTokensStore.js +23 -0
- package/dist/esm/stores/recentTokens/RecentTokensStore.js.map +1 -0
- package/dist/esm/stores/recentTokens/createRecentTokensStore.js +54 -0
- package/dist/esm/stores/recentTokens/createRecentTokensStore.js.map +1 -0
- package/dist/esm/stores/recentTokens/utils.js +15 -0
- package/dist/esm/stores/recentTokens/utils.js.map +1 -0
- package/dist/esm/stores/routes/RouteExecutionStore.d.ts +2 -3
- package/dist/esm/stores/routes/RouteExecutionStore.d.ts.map +1 -1
- package/dist/esm/stores/routes/types.d.ts +3 -4
- package/dist/esm/stores/routes/types.d.ts.map +1 -1
- package/dist/esm/stores/routes/utils.d.ts +4 -5
- package/dist/esm/stores/routes/utils.d.ts.map +1 -1
- package/dist/esm/stores/settings/SettingsStore.d.ts +2 -3
- package/dist/esm/stores/settings/SettingsStore.d.ts.map +1 -1
- package/dist/esm/stores/settings/types.d.ts +2 -3
- package/dist/esm/stores/settings/types.d.ts.map +1 -1
- package/dist/esm/stores/types.d.ts +2 -3
- package/dist/esm/stores/types.d.ts.map +1 -1
- package/dist/esm/themes/azureLight.d.ts +1 -2
- package/dist/esm/themes/azureLight.d.ts.map +1 -1
- package/dist/esm/themes/jumper.d.ts +1 -2
- package/dist/esm/themes/jumper.d.ts.map +1 -1
- package/dist/esm/themes/palettes.d.ts +3 -4
- package/dist/esm/themes/palettes.d.ts.map +1 -1
- package/dist/esm/themes/types.d.ts +1 -0
- package/dist/esm/themes/watermelonLight.d.ts +1 -2
- package/dist/esm/themes/watermelonLight.d.ts.map +1 -1
- package/dist/esm/themes/windows95.d.ts +1 -2
- package/dist/esm/themes/windows95.d.ts.map +1 -1
- package/dist/esm/types/events.d.ts +13 -14
- package/dist/esm/types/events.d.ts.map +1 -1
- package/dist/esm/types/token.d.ts +4 -2
- package/dist/esm/types/token.d.ts.map +1 -1
- package/dist/esm/types/widget.d.ts +55 -51
- package/dist/esm/types/widget.d.ts.map +1 -1
- package/dist/esm/types/widget.js.map +1 -1
- package/dist/esm/utils/address.js +19 -0
- package/dist/esm/utils/address.js.map +1 -0
- package/dist/esm/utils/compactNumberFormatter.d.ts +1 -2
- package/dist/esm/utils/compactNumberFormatter.d.ts.map +1 -1
- package/dist/esm/utils/converters.d.ts +1 -2
- package/dist/esm/utils/converters.d.ts.map +1 -1
- package/dist/esm/utils/currencyExtendedFormatter.d.ts +1 -2
- package/dist/esm/utils/currencyExtendedFormatter.d.ts.map +1 -1
- package/dist/esm/utils/customReceiver.js +6 -1
- package/dist/esm/utils/customReceiver.js.map +1 -1
- package/dist/esm/utils/elements.d.ts +2 -3
- package/dist/esm/utils/elements.d.ts.map +1 -1
- package/dist/esm/utils/enum.d.ts +1 -2
- package/dist/esm/utils/enum.d.ts.map +1 -1
- package/dist/esm/utils/fees.d.ts +2 -3
- package/dist/esm/utils/fees.d.ts.map +1 -1
- package/dist/esm/utils/format.d.ts +8 -9
- package/dist/esm/utils/format.d.ts.map +1 -1
- package/dist/esm/utils/getPriceImpact.d.ts +1 -2
- package/dist/esm/utils/getPriceImpact.d.ts.map +1 -1
- package/dist/esm/utils/input.d.ts +1 -2
- package/dist/esm/utils/input.d.ts.map +1 -1
- package/dist/esm/utils/navigationRoutes.d.ts +2 -3
- package/dist/esm/utils/navigationRoutes.d.ts.map +1 -1
- package/dist/esm/utils/percentFormatter.d.ts +1 -2
- package/dist/esm/utils/percentFormatter.d.ts.map +1 -1
- package/dist/esm/utils/recentTokens.js +97 -0
- package/dist/esm/utils/recentTokens.js.map +1 -0
- package/dist/esm/utils/token.js +30 -4
- package/dist/esm/utils/token.js.map +1 -1
- package/dist/esm/utils/tokenList.js +18 -6
- package/dist/esm/utils/tokenList.js.map +1 -1
- package/dist/esm/utils/tokenListBands.js +85 -0
- package/dist/esm/utils/tokenListBands.js.map +1 -0
- package/dist/esm/utils/wallet.d.ts +1 -2
- package/dist/esm/utils/wallet.d.ts.map +1 -1
- package/package.json +9 -9
- package/src/components/AmountInputCard/ReceiveAmountCard.tsx +16 -3
- package/src/components/BottomSheet/BottomSheet.tsx +3 -0
- package/src/components/Token/Token.tsx +2 -1
- package/src/components/TokenList/RecentTokensHeader.tsx +52 -0
- package/src/components/TokenList/RecentTokensToggle.tsx +45 -0
- package/src/components/TokenList/RemoveRecentTokenButton.tsx +38 -0
- package/src/components/TokenList/TokenList.tsx +92 -3
- package/src/components/TokenList/TokenListItem.tsx +15 -0
- package/src/components/TokenList/VirtualizedTokenList.tsx +84 -125
- package/src/components/TokenList/types.ts +9 -0
- package/src/config/version.ts +1 -1
- package/src/hooks/useDisplayedTokens.ts +17 -3
- package/src/hooks/useRecentTokens.ts +88 -0
- package/src/hooks/useRoutes.ts +8 -5
- package/src/hooks/useToAddressRequirements.ts +11 -5
- package/src/hooks/useTokenBalances.ts +34 -31
- package/src/hooks/useTokenSearch.ts +5 -14
- package/src/hooks/useTokens.ts +69 -27
- package/src/pages/TransactionPage/TokenValueBottomSheet.tsx +1 -1
- package/src/pages/TransactionPage/TokenVerificationBottomSheet.tsx +1 -1
- package/src/pages/TransactionPage/TransactionFailedButtons.tsx +62 -26
- package/src/pages/TransactionPage/TransactionReview.tsx +36 -37
- package/src/pages/TransactionPage/utils.ts +78 -0
- package/src/stores/StoreProvider.tsx +10 -7
- package/src/stores/chains/ChainOrderStore.test.tsx +298 -0
- package/src/stores/chains/ChainOrderStore.tsx +25 -6
- package/src/stores/recentTokens/RecentTokensStore.tsx +39 -0
- package/src/stores/recentTokens/createRecentTokensStore.ts +107 -0
- package/src/stores/recentTokens/types.ts +37 -0
- package/src/stores/recentTokens/utils.ts +18 -0
- package/src/types/token.ts +2 -0
- package/src/types/widget.ts +5 -0
- package/src/utils/address.ts +21 -0
- package/src/utils/customReceiver.ts +24 -0
- package/src/utils/recentTokens.ts +187 -0
- package/src/utils/token.ts +69 -10
- package/src/utils/tokenList.ts +41 -23
- package/src/utils/tokenListBands.ts +181 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useWidgetConfig } from "../providers/WidgetProvider/WidgetProvider.js";
|
|
2
2
|
import { useFieldValues } from "../stores/form/useFieldValues.js";
|
|
3
|
-
import { isCustomReceiverUnsupported } from "../utils/customReceiver.js";
|
|
3
|
+
import { isCustomReceiverBlocked, isCustomReceiverUnsupported } from "../utils/customReceiver.js";
|
|
4
4
|
import { useChain } from "./useChain.js";
|
|
5
5
|
import { useIsContractAddress } from "./useIsContractAddress.js";
|
|
6
6
|
import { useEthereumContext } from "@lifi/widget-provider";
|
|
@@ -23,7 +23,13 @@ const useToAddressRequirements = (route) => {
|
|
|
23
23
|
const fromContractCodeHasDelegationIndicator = isDelegationDesignatorCode?.(fromContractCode);
|
|
24
24
|
const isCrossChainContractAddress = isFromContractAddress && fromChainId !== toChainId && !fromContractCodeHasDelegationIndicator;
|
|
25
25
|
const unsupportedToAddress = isCustomReceiverUnsupported(fromChain?.chainType, toChain?.chainType);
|
|
26
|
-
const unsupportedReceiverBlocking =
|
|
26
|
+
const unsupportedReceiverBlocking = isCustomReceiverBlocked({
|
|
27
|
+
fromChainType: fromChain?.chainType,
|
|
28
|
+
toChainType: toChain?.chainType,
|
|
29
|
+
toAddress,
|
|
30
|
+
signerAddress: fromAddress,
|
|
31
|
+
receiverRequired: requiredUI?.toAddress
|
|
32
|
+
});
|
|
27
33
|
const requiredToAddress = Boolean((isDifferentChainType || isCrossChainContractAddress || requiredUI?.toAddress) && !hiddenUI?.toAddress && !unsupportedToAddress);
|
|
28
34
|
const accountNotDeployedAtDestination = Boolean(isFromContractAddress && !fromContractCodeHasDelegationIndicator && !isToContractAddress && fromAddress?.toLowerCase() === toAddress?.toLowerCase());
|
|
29
35
|
const accountDeployedAtDestination = Boolean(isFromContractAddress && isToContractAddress && !fromContractCodeHasDelegationIndicator && fromAddress?.toLowerCase() === toAddress?.toLowerCase());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useToAddressRequirements.js","names":[],"sources":["../../../src/hooks/useToAddressRequirements.ts"],"sourcesContent":["import type { ChainType, RouteExtended } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport { useEthereumContext } from '@lifi/widget-provider'\nimport { useChain } from '../hooks/useChain.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { useFieldValues } from '../stores/form/useFieldValues.js'\nimport {
|
|
1
|
+
{"version":3,"file":"useToAddressRequirements.js","names":[],"sources":["../../../src/hooks/useToAddressRequirements.ts"],"sourcesContent":["import type { ChainType, RouteExtended } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport { useEthereumContext } from '@lifi/widget-provider'\nimport { useChain } from '../hooks/useChain.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { useFieldValues } from '../stores/form/useFieldValues.js'\nimport {\n isCustomReceiverBlocked,\n isCustomReceiverUnsupported,\n} from '../utils/customReceiver.js'\nimport { useIsContractAddress } from './useIsContractAddress.js'\n\nexport const useToAddressRequirements = (\n route?: RouteExtended\n): {\n requiredToAddress: boolean\n unsupportedToAddress: boolean\n unsupportedReceiverBlocking: boolean\n requiredToChainType: ChainType | undefined\n accountNotDeployedAtDestination: boolean\n accountDeployedAtDestination: boolean\n toAddress: string | undefined\n isFromContractAddress: boolean | undefined\n isToContractAddress: boolean | undefined\n isLoading: boolean\n isFetched: boolean\n} => {\n const { requiredUI, hiddenUI } = useWidgetConfig()\n const [formFromChainId, formToChainId, formToAddress] = useFieldValues(\n 'fromChain',\n 'toChain',\n 'toAddress'\n )\n const { isDelegationDesignatorCode } = useEthereumContext()\n\n const fromChainId = route?.fromChainId ?? formFromChainId\n const toChainId = route?.toChainId ?? formToChainId\n\n const { chain: fromChain } = useChain(fromChainId)\n const { chain: toChain } = useChain(toChainId)\n const { account } = useAccount({\n chainType: fromChain?.chainType,\n })\n\n const fromAddress = route?.fromAddress ?? account.address\n const toAddress = route\n ? route.fromAddress !== route.toAddress\n ? route.toAddress\n : formToAddress\n : formToAddress\n\n const {\n isContractAddress: isFromContractAddress,\n contractCode: fromContractCode,\n isLoading: isFromContractLoading,\n isFetched: isFromContractFetched,\n } = useIsContractAddress(account.address, fromChain?.id, account.chainType)\n const {\n isContractAddress: isToContractAddress,\n isLoading: isToContractLoading,\n isFetched: isToContractFetched,\n } = useIsContractAddress(toAddress, toChain?.id, toChain?.chainType)\n\n const isDifferentChainType =\n fromChain && toChain && fromChain.chainType !== toChain.chainType\n\n // We don't want to block transfers for EIP-7702 accounts since they are designed\n // to maintain EOA-like properties while delegating execution.\n const fromContractCodeHasDelegationIndicator =\n isDelegationDesignatorCode?.(fromContractCode)\n\n const isCrossChainContractAddress =\n isFromContractAddress &&\n fromChainId !== toChainId &&\n !fromContractCodeHasDelegationIndicator\n\n const unsupportedToAddress = isCustomReceiverUnsupported(\n fromChain?.chainType,\n toChain?.chainType\n )\n\n const unsupportedReceiverBlocking = isCustomReceiverBlocked({\n fromChainType: fromChain?.chainType,\n toChainType: toChain?.chainType,\n toAddress,\n signerAddress: fromAddress,\n receiverRequired: requiredUI?.toAddress,\n })\n\n const requiredToAddress = Boolean(\n (isDifferentChainType ||\n isCrossChainContractAddress ||\n requiredUI?.toAddress) &&\n !hiddenUI?.toAddress &&\n !unsupportedToAddress\n )\n\n const accountNotDeployedAtDestination = Boolean(\n isFromContractAddress &&\n !fromContractCodeHasDelegationIndicator &&\n !isToContractAddress &&\n fromAddress?.toLowerCase() === toAddress?.toLowerCase()\n )\n\n const accountDeployedAtDestination = Boolean(\n isFromContractAddress &&\n isToContractAddress &&\n !fromContractCodeHasDelegationIndicator &&\n fromAddress?.toLowerCase() === toAddress?.toLowerCase()\n )\n\n return {\n requiredToAddress,\n unsupportedToAddress,\n unsupportedReceiverBlocking,\n requiredToChainType: toChain?.chainType,\n accountNotDeployedAtDestination,\n accountDeployedAtDestination,\n toAddress,\n isFromContractAddress,\n isToContractAddress,\n isLoading: isFromContractLoading || isToContractLoading,\n isFetched: isFromContractFetched && isToContractFetched,\n }\n}\n"],"mappings":";;;;;;;;AAYA,MAAa,4BACX,UAaG;CACH,MAAM,EAAE,YAAY,aAAa,gBAAgB;CACjD,MAAM,CAAC,iBAAiB,eAAe,iBAAiB,eACtD,aACA,WACA,WACF;CACA,MAAM,EAAE,+BAA+B,mBAAmB;CAE1D,MAAM,cAAc,OAAO,eAAe;CAC1C,MAAM,YAAY,OAAO,aAAa;CAEtC,MAAM,EAAE,OAAO,cAAc,SAAS,WAAW;CACjD,MAAM,EAAE,OAAO,YAAY,SAAS,SAAS;CAC7C,MAAM,EAAE,YAAY,WAAW,EAC7B,WAAW,WAAW,UACxB,CAAC;CAED,MAAM,cAAc,OAAO,eAAe,QAAQ;CAClD,MAAM,YAAY,QACd,MAAM,gBAAgB,MAAM,YAC1B,MAAM,YACN,gBACF;CAEJ,MAAM,EACJ,mBAAmB,uBACnB,cAAc,kBACd,WAAW,uBACX,WAAW,0BACT,qBAAqB,QAAQ,SAAS,WAAW,IAAI,QAAQ,SAAS;CAC1E,MAAM,EACJ,mBAAmB,qBACnB,WAAW,qBACX,WAAW,wBACT,qBAAqB,WAAW,SAAS,IAAI,SAAS,SAAS;CAEnE,MAAM,uBACJ,aAAa,WAAW,UAAU,cAAc,QAAQ;CAI1D,MAAM,yCACJ,6BAA6B,gBAAgB;CAE/C,MAAM,8BACJ,yBACA,gBAAgB,aAChB,CAAC;CAEH,MAAM,uBAAuB,4BAC3B,WAAW,WACX,SAAS,SACX;CAEA,MAAM,8BAA8B,wBAAwB;EAC1D,eAAe,WAAW;EAC1B,aAAa,SAAS;EACtB;EACA,eAAe;EACf,kBAAkB,YAAY;CAChC,CAAC;CAED,MAAM,oBAAoB,SACvB,wBACC,+BACA,YAAY,cACZ,CAAC,UAAU,aACX,CAAC,oBACL;CAEA,MAAM,kCAAkC,QACtC,yBACE,CAAC,0CACD,CAAC,uBACD,aAAa,YAAY,MAAM,WAAW,YAAY,CAC1D;CAEA,MAAM,+BAA+B,QACnC,yBACE,uBACA,CAAC,0CACD,aAAa,YAAY,MAAM,WAAW,YAAY,CAC1D;CAEA,OAAO;EACL;EACA;EACA;EACA,qBAAqB,SAAS;EAC9B;EACA;EACA;EACA;EACA;EACA,WAAW,yBAAyB;EACpC,WAAW,yBAAyB;CACtC;AACF"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { TokenExtended } from "@lifi/sdk";
|
|
2
2
|
//#region src/hooks/useToken.d.ts
|
|
3
|
-
declare const useToken: (chainId?: number, tokenAddress?: string, latest?: boolean) => {
|
|
3
|
+
export declare const useToken: (chainId?: number, tokenAddress?: string, latest?: boolean) => {
|
|
4
4
|
token: TokenExtended | undefined;
|
|
5
5
|
isLoading: boolean;
|
|
6
6
|
};
|
|
7
7
|
//#endregion
|
|
8
|
-
export { useToken };
|
|
9
8
|
//# sourceMappingURL=useToken.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useToken.d.ts","names":[],"sources":["../../../src/hooks/useToken.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"useToken.d.ts","names":[],"sources":["../../../src/hooks/useToken.ts"],"mappings":";;qBAKa,WACX,kBACA,uBACA;EAEA,OAAO;EACP"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { ExtendedChain, TokenAmount } from "@lifi/sdk";
|
|
2
2
|
//#region src/hooks/useTokenAddressBalance.d.ts
|
|
3
|
-
declare const useTokenAddressBalance: (chainId?: number, tokenAddress?: string) => {
|
|
3
|
+
export declare const useTokenAddressBalance: (chainId?: number, tokenAddress?: string) => {
|
|
4
4
|
token: TokenAmount;
|
|
5
5
|
chain: ExtendedChain | undefined;
|
|
6
6
|
isLoading: boolean;
|
|
7
7
|
refetch: () => void;
|
|
8
8
|
};
|
|
9
9
|
//#endregion
|
|
10
|
-
export { useTokenAddressBalance };
|
|
11
10
|
//# sourceMappingURL=useTokenAddressBalance.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTokenAddressBalance.d.ts","names":[],"sources":["../../../src/hooks/useTokenAddressBalance.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"useTokenAddressBalance.d.ts","names":[],"sources":["../../../src/hooks/useTokenAddressBalance.ts"],"mappings":";;qBAMa,yBACX,kBACA;EAEA,OAAO;EACP,OAAO;EACP;EACA"}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { FormType } from "../stores/form/types.js";
|
|
2
2
|
import { TokenAmount } from "../types/token.js";
|
|
3
3
|
//#region src/hooks/useTokenBalances.d.ts
|
|
4
|
-
declare const useTokenBalances: (selectedChainId?: number, formType?: FormType, isAllNetworks?: boolean, search?: string) => {
|
|
4
|
+
export declare const useTokenBalances: (selectedChainId?: number, formType?: FormType, isAllNetworks?: boolean, search?: string) => {
|
|
5
5
|
tokens: TokenAmount[];
|
|
6
6
|
withCategories: boolean;
|
|
7
7
|
withPinnedTokens: boolean;
|
|
8
8
|
isTokensLoading: boolean;
|
|
9
9
|
isSearchLoading: boolean;
|
|
10
10
|
isBalanceLoading: boolean;
|
|
11
|
+
/** Always set; optional so hand-built results of this public shape stay valid. */
|
|
12
|
+
nativeHoisted?: boolean;
|
|
11
13
|
};
|
|
12
14
|
//#endregion
|
|
13
|
-
export { useTokenBalances };
|
|
14
15
|
//# sourceMappingURL=useTokenBalances.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTokenBalances.d.ts","names":[],"sources":["../../../src/hooks/useTokenBalances.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"useTokenBalances.d.ts","names":[],"sources":["../../../src/hooks/useTokenBalances.ts"],"mappings":";;;qBAea,mBACX,0BACA,WAAW,UACX,yBACA;EAEA,QAAQ;EACR;EACA;EACA;EACA;EACA;;EAEA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useWidgetConfig } from "../providers/WidgetProvider/WidgetProvider.js";
|
|
2
2
|
import { formatTokenPrice } from "../utils/format.js";
|
|
3
3
|
import { useSettings } from "../stores/settings/useSettings.js";
|
|
4
|
-
import { hoistNativeToken,
|
|
4
|
+
import { hoistNativeToken, isHoistableNative, processTokenList } from "../utils/tokenList.js";
|
|
5
5
|
import { useAccountsBalancesData } from "./useAccountsBalancesData.js";
|
|
6
6
|
import { useDisplayedTokens } from "./useDisplayedTokens.js";
|
|
7
7
|
import { useTokenBalancesQueries } from "./useTokenBalancesQueries.js";
|
|
@@ -9,7 +9,7 @@ import { useMemo } from "react";
|
|
|
9
9
|
//#region src/hooks/useTokenBalances.ts
|
|
10
10
|
const useTokenBalances = (selectedChainId, formType, isAllNetworks, search) => {
|
|
11
11
|
const { hiddenUI, tokens: configTokens } = useWidgetConfig();
|
|
12
|
-
const { allTokens, displayedTokensList, isPinnedToken, isTokensLoading, isSearchLoading } = useDisplayedTokens(selectedChainId, formType, isAllNetworks, search);
|
|
12
|
+
const { allTokens, displayedTokensList, isPinnedToken, matchesSearch, isTokensLoading, isSearchLoading } = useDisplayedTokens(selectedChainId, formType, isAllNetworks, search);
|
|
13
13
|
const { data: accountsWithAllTokens, isLoading: isAccountsLoading } = useAccountsBalancesData(selectedChainId, formType, isAllNetworks, allTokens);
|
|
14
14
|
const { data: allTokensWithBalances, isLoading: isBalanceQueriesLoading } = useTokenBalancesQueries(accountsWithAllTokens, Boolean(accountsWithAllTokens) && !isAccountsLoading);
|
|
15
15
|
const { smallBalanceThreshold } = useSettings(["smallBalanceThreshold"]);
|
|
@@ -23,8 +23,8 @@ const useTokenBalances = (selectedChainId, formType, isAllNetworks, search) => {
|
|
|
23
23
|
return balancesByChain.reduce((acc, token) => {
|
|
24
24
|
const tokenKey = `${token.chainId}-${token.address.toLowerCase()}`;
|
|
25
25
|
const isInDisplayedList = displayedTokensSet.has(tokenKey) && token.amount;
|
|
26
|
-
const
|
|
27
|
-
if (!isInDisplayedList && !
|
|
26
|
+
const matchesTheSearch = matchesSearch(token);
|
|
27
|
+
if (!isInDisplayedList && !matchesTheSearch) return acc;
|
|
28
28
|
let processedToken = token;
|
|
29
29
|
if (hideSmallBalances && threshold !== void 0 && threshold >= 0 && token.amount) {
|
|
30
30
|
if (formatTokenPrice(token.amount, token.priceUSD, token.decimals) < threshold) processedToken = {
|
|
@@ -38,18 +38,23 @@ const useTokenBalances = (selectedChainId, formType, isAllNetworks, search) => {
|
|
|
38
38
|
}, [
|
|
39
39
|
allTokensWithBalances,
|
|
40
40
|
displayedTokensList,
|
|
41
|
-
|
|
41
|
+
matchesSearch,
|
|
42
42
|
selectedChainId,
|
|
43
43
|
isAllNetworks,
|
|
44
44
|
smallBalanceThreshold,
|
|
45
45
|
hiddenUI
|
|
46
46
|
]);
|
|
47
|
-
const { processedTokens, withCategories, withPinnedTokens } = useMemo(() => {
|
|
47
|
+
const { processedTokens, withCategories, withPinnedTokens, nativeHoisted } = useMemo(() => {
|
|
48
48
|
const result = processTokenList(isBalanceLoading, isAllNetworks || !!search, configTokens, selectedChainId, displayedTokensList, displayedTokensWithBalances, isPinnedToken);
|
|
49
|
-
if (isAllNetworks || search) return
|
|
49
|
+
if (isAllNetworks || search) return {
|
|
50
|
+
...result,
|
|
51
|
+
nativeHoisted: false
|
|
52
|
+
};
|
|
53
|
+
const hoisted = hoistNativeToken(result.processedTokens, selectedChainId);
|
|
50
54
|
return {
|
|
51
55
|
...result,
|
|
52
|
-
processedTokens:
|
|
56
|
+
processedTokens: hoisted,
|
|
57
|
+
nativeHoisted: isHoistableNative(hoisted[0], selectedChainId)
|
|
53
58
|
};
|
|
54
59
|
}, [
|
|
55
60
|
isBalanceLoading,
|
|
@@ -67,7 +72,8 @@ const useTokenBalances = (selectedChainId, formType, isAllNetworks, search) => {
|
|
|
67
72
|
withPinnedTokens,
|
|
68
73
|
isTokensLoading,
|
|
69
74
|
isSearchLoading,
|
|
70
|
-
isBalanceLoading
|
|
75
|
+
isBalanceLoading,
|
|
76
|
+
nativeHoisted
|
|
71
77
|
};
|
|
72
78
|
};
|
|
73
79
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTokenBalances.js","names":[],"sources":["../../../src/hooks/useTokenBalances.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport type { FormType } from '../stores/form/types.js'\nimport { useSettings } from '../stores/settings/useSettings.js'\nimport type { TokenAmount } from '../types/token.js'\nimport { formatTokenPrice } from '../utils/format.js'\nimport {\n hoistNativeToken,\n
|
|
1
|
+
{"version":3,"file":"useTokenBalances.js","names":[],"sources":["../../../src/hooks/useTokenBalances.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport type { FormType } from '../stores/form/types.js'\nimport { useSettings } from '../stores/settings/useSettings.js'\nimport type { TokenAmount } from '../types/token.js'\nimport { formatTokenPrice } from '../utils/format.js'\nimport {\n hoistNativeToken,\n isHoistableNative,\n processTokenList,\n} from '../utils/tokenList.js'\nimport { useAccountsBalancesData } from './useAccountsBalancesData.js'\nimport { useDisplayedTokens } from './useDisplayedTokens.js'\nimport { useTokenBalancesQueries } from './useTokenBalancesQueries.js'\n\nexport const useTokenBalances = (\n selectedChainId?: number,\n formType?: FormType,\n isAllNetworks?: boolean,\n search?: string\n): {\n tokens: TokenAmount[]\n withCategories: boolean\n withPinnedTokens: boolean\n isTokensLoading: boolean\n isSearchLoading: boolean\n isBalanceLoading: boolean\n /** Always set; optional so hand-built results of this public shape stay valid. */\n nativeHoisted?: boolean\n} => {\n const { hiddenUI, tokens: configTokens } = useWidgetConfig()\n const {\n allTokens,\n displayedTokensList,\n isPinnedToken,\n matchesSearch,\n isTokensLoading,\n isSearchLoading,\n } = useDisplayedTokens(selectedChainId, formType, isAllNetworks, search)\n\n const { data: accountsWithAllTokens, isLoading: isAccountsLoading } =\n useAccountsBalancesData(selectedChainId, formType, isAllNetworks, allTokens)\n\n const isBalanceLoadingEnabled =\n Boolean(accountsWithAllTokens) && !isAccountsLoading\n\n const { data: allTokensWithBalances, isLoading: isBalanceQueriesLoading } =\n useTokenBalancesQueries(accountsWithAllTokens, isBalanceLoadingEnabled)\n\n const { smallBalanceThreshold } = useSettings(['smallBalanceThreshold'])\n\n const isBalanceLoading =\n (isBalanceQueriesLoading || isAccountsLoading) &&\n !allTokensWithBalances?.length\n\n const displayedTokensWithBalances = useMemo(() => {\n const balancesByChain = isAllNetworks\n ? allTokensWithBalances\n : selectedChainId\n ? allTokensWithBalances?.filter((t) => t.chainId === selectedChainId)\n : undefined\n const displayedTokensSet = new Set(\n displayedTokensList?.map(\n (t) => `${t.chainId}-${t.address.toLowerCase()}`\n ) || []\n )\n\n const hideSmallBalances =\n !!smallBalanceThreshold && !hiddenUI?.hideSmallBalances\n const threshold = hideSmallBalances\n ? Number.parseFloat(smallBalanceThreshold)\n : undefined\n\n if (!balancesByChain) {\n return undefined\n }\n\n return balancesByChain.reduce<typeof balancesByChain>((acc, token) => {\n const tokenKey = `${token.chainId}-${token.address.toLowerCase()}`\n // Check if token is in displayed list and has amount\n const isInDisplayedList = displayedTokensSet.has(tokenKey) && token.amount\n // Check if it matches search (for cached appended tokens)\n const matchesTheSearch = matchesSearch(token)\n\n // Filter: only include tokens that match our criteria\n if (!isInDisplayedList && !matchesTheSearch) {\n return acc\n }\n\n // Apply small balance threshold transformation if enabled\n let processedToken = token\n if (\n hideSmallBalances &&\n threshold !== undefined &&\n threshold >= 0 &&\n token.amount\n ) {\n const balanceUSD = formatTokenPrice(\n token.amount,\n token.priceUSD,\n token.decimals\n )\n if (balanceUSD < threshold) {\n processedToken = {\n ...token,\n amount: 0n,\n }\n }\n }\n\n acc.push(processedToken)\n return acc\n }, [])\n }, [\n allTokensWithBalances,\n displayedTokensList,\n matchesSearch,\n selectedChainId,\n isAllNetworks,\n smallBalanceThreshold,\n hiddenUI,\n ])\n\n const { processedTokens, withCategories, withPinnedTokens, nativeHoisted } =\n useMemo(() => {\n const result = processTokenList(\n isBalanceLoading,\n isAllNetworks || !!search,\n configTokens,\n selectedChainId,\n displayedTokensList,\n displayedTokensWithBalances,\n isPinnedToken\n )\n // Search results stay ranked, and All networks has no single native.\n if (isAllNetworks || search) {\n return { ...result, nativeHoisted: false }\n }\n const hoisted = hoistNativeToken(result.processedTokens, selectedChainId)\n return {\n ...result,\n processedTokens: hoisted,\n nativeHoisted: isHoistableNative(hoisted[0], selectedChainId),\n }\n }, [\n isBalanceLoading,\n isAllNetworks,\n configTokens,\n selectedChainId,\n displayedTokensList,\n displayedTokensWithBalances,\n search,\n isPinnedToken,\n ])\n\n return {\n tokens: processedTokens ?? [],\n withCategories,\n withPinnedTokens,\n isTokensLoading,\n isSearchLoading,\n isBalanceLoading,\n nativeHoisted,\n }\n}\n"],"mappings":";;;;;;;;;AAeA,MAAa,oBACX,iBACA,UACA,eACA,WAUG;CACH,MAAM,EAAE,UAAU,QAAQ,iBAAiB,gBAAgB;CAC3D,MAAM,EACJ,WACA,qBACA,eACA,eACA,iBACA,oBACE,mBAAmB,iBAAiB,UAAU,eAAe,MAAM;CAEvE,MAAM,EAAE,MAAM,uBAAuB,WAAW,sBAC9C,wBAAwB,iBAAiB,UAAU,eAAe,SAAS;CAK7E,MAAM,EAAE,MAAM,uBAAuB,WAAW,4BAC9C,wBAAwB,uBAHxB,QAAQ,qBAAqB,KAAK,CAAC,iBAGmC;CAExE,MAAM,EAAE,0BAA0B,YAAY,CAAC,uBAAuB,CAAC;CAEvE,MAAM,oBACH,2BAA2B,sBAC5B,CAAC,uBAAuB;CAE1B,MAAM,8BAA8B,cAAc;EAChD,MAAM,kBAAkB,gBACpB,wBACA,kBACE,uBAAuB,QAAQ,MAAM,EAAE,YAAY,eAAe,IAClE,KAAA;EACN,MAAM,qBAAqB,IAAI,IAC7B,qBAAqB,KAClB,MAAM,GAAG,EAAE,QAAQ,GAAG,EAAE,QAAQ,YAAY,GAC/C,KAAK,CAAC,CACR;EAEA,MAAM,oBACJ,CAAC,CAAC,yBAAyB,CAAC,UAAU;EACxC,MAAM,YAAY,oBACd,OAAO,WAAW,qBAAqB,IACvC,KAAA;EAEJ,IAAI,CAAC,iBACH;EAGF,OAAO,gBAAgB,QAAgC,KAAK,UAAU;GACpE,MAAM,WAAW,GAAG,MAAM,QAAQ,GAAG,MAAM,QAAQ,YAAY;GAE/D,MAAM,oBAAoB,mBAAmB,IAAI,QAAQ,KAAK,MAAM;GAEpE,MAAM,mBAAmB,cAAc,KAAK;GAG5C,IAAI,CAAC,qBAAqB,CAAC,kBACzB,OAAO;GAIT,IAAI,iBAAiB;GACrB,IACE,qBACA,cAAc,KAAA,KACd,aAAa,KACb,MAAM,QAEa;QAAA,iBACjB,MAAM,QACN,MAAM,UACN,MAAM,QAEK,IAAI,WACf,iBAAiB;KACf,GAAG;KACH,QAAQ;IACV;GAAA;GAIJ,IAAI,KAAK,cAAc;GACvB,OAAO;EACT,GAAG,CAAC,CAAC;CACP,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,MAAM,EAAE,iBAAiB,gBAAgB,kBAAkB,kBACzD,cAAc;EACZ,MAAM,SAAS,iBACb,kBACA,iBAAiB,CAAC,CAAC,QACnB,cACA,iBACA,qBACA,6BACA,aACF;EAEA,IAAI,iBAAiB,QACnB,OAAO;GAAE,GAAG;GAAQ,eAAe;EAAM;EAE3C,MAAM,UAAU,iBAAiB,OAAO,iBAAiB,eAAe;EACxE,OAAO;GACL,GAAG;GACH,iBAAiB;GACjB,eAAe,kBAAkB,QAAQ,IAAI,eAAe;EAC9D;CACF,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAEH,OAAO;EACL,QAAQ,mBAAmB,CAAC;EAC5B;EACA;EACA;EACA;EACA;EACA;CACF;AACF"}
|
|
@@ -4,7 +4,7 @@ import { TokenAmount } from "../types/token.js";
|
|
|
4
4
|
/**
|
|
5
5
|
* Token-selection list without wallet balances - No accounts are resolved and no balance queries are fired.
|
|
6
6
|
*/
|
|
7
|
-
declare const useTokenList: (selectedChainId?: number, formType?: FormType, isAllNetworks?: boolean, search?: string) => {
|
|
7
|
+
export declare const useTokenList: (selectedChainId?: number, formType?: FormType, isAllNetworks?: boolean, search?: string) => {
|
|
8
8
|
tokens: TokenAmount[];
|
|
9
9
|
withCategories: boolean;
|
|
10
10
|
withPinnedTokens: boolean;
|
|
@@ -12,5 +12,4 @@ declare const useTokenList: (selectedChainId?: number, formType?: FormType, isAl
|
|
|
12
12
|
isSearchLoading: boolean;
|
|
13
13
|
};
|
|
14
14
|
//#endregion
|
|
15
|
-
export { useTokenList };
|
|
16
15
|
//# sourceMappingURL=useTokenList.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTokenList.d.ts","names":[],"sources":["../../../src/hooks/useTokenList.ts"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"useTokenList.d.ts","names":[],"sources":["../../../src/hooks/useTokenList.ts"],"mappings":";;;;;;qBAUa,eACX,0BACA,WAAW,UACX,yBACA;EAEA,QAAQ;EACR;EACA;EACA;EACA"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isFormItemAllowed } from "../utils/item.js";
|
|
2
2
|
import { useWidgetConfig } from "../providers/WidgetProvider/WidgetProvider.js";
|
|
3
3
|
import { useSDKClient } from "../providers/SDKClientProvider.js";
|
|
4
4
|
import { getQueryKey } from "../utils/queries.js";
|
|
5
|
+
import { getChainTokenAllowSets } from "../utils/token.js";
|
|
5
6
|
import { getToken } from "@lifi/sdk";
|
|
6
7
|
import { useQuery, useQueryClient } from "@tanstack/react-query";
|
|
7
8
|
//#region src/hooks/useTokenSearch.ts
|
|
@@ -18,7 +19,7 @@ const useTokenSearch = (chainId, tokenQuery, enabled, formType) => {
|
|
|
18
19
|
queryFn: async ({ queryKey: [, chainId, tokenQuery], signal }) => {
|
|
19
20
|
const token = await getToken(sdkClient, chainId, tokenQuery, { signal });
|
|
20
21
|
if (token) {
|
|
21
|
-
const filteredConfigTokens =
|
|
22
|
+
const filteredConfigTokens = getChainTokenAllowSets(configTokens, token.chainId, formType);
|
|
22
23
|
if (!isFormItemAllowed(token, filteredConfigTokens, formType, (t) => t.address.toLowerCase())) return null;
|
|
23
24
|
queryClient.setQueriesData({ queryKey: [getQueryKey("tokens", keyPrefix)] }, (data) => {
|
|
24
25
|
if (!data) return data;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTokenSearch.js","names":[],"sources":["../../../src/hooks/useTokenSearch.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"useTokenSearch.js","names":[],"sources":["../../../src/hooks/useTokenSearch.ts"],"sourcesContent":["import { type ChainId, getToken, type TokenExtended } from '@lifi/sdk'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport type { FormType } from '../stores/form/types.js'\nimport type { TokensByChain } from '../types/token.js'\nimport { isFormItemAllowed } from '../utils/item.js'\nimport { getQueryKey } from '../utils/queries.js'\nimport { getChainTokenAllowSets } from '../utils/token.js'\n\nexport const useTokenSearch = (\n chainId?: number,\n tokenQuery?: string,\n enabled?: boolean,\n formType?: FormType\n): {\n token: TokenExtended | undefined\n isLoading: boolean\n} => {\n const queryClient = useQueryClient()\n const { tokens: configTokens, keyPrefix } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n const { data, isLoading } = useQuery({\n queryKey: [getQueryKey('token-search', keyPrefix), chainId, tokenQuery],\n queryFn: async ({ queryKey: [, chainId, tokenQuery], signal }) => {\n const token = await getToken(\n sdkClient,\n chainId as ChainId,\n tokenQuery as string,\n {\n signal,\n }\n )\n\n if (token) {\n // Filter config tokens by chain before checking if token is allowed\n const filteredConfigTokens = getChainTokenAllowSets(\n configTokens,\n token.chainId,\n formType\n )\n\n // Return undefined if the token is denied\n if (\n !isFormItemAllowed(token, filteredConfigTokens, formType, (t) =>\n t.address.toLowerCase()\n )\n ) {\n return null\n }\n\n // Add token to main tokens cache\n queryClient.setQueriesData<TokensByChain>(\n { queryKey: [getQueryKey('tokens', keyPrefix)] },\n (data) => {\n if (!data) {\n return data\n }\n const chainTokens = data[chainId as number]\n if (\n chainTokens?.some(\n (t) => t.address.toLowerCase() === token.address.toLowerCase()\n )\n ) {\n return data\n }\n return {\n ...data,\n [chainId as number]: [...(chainTokens ?? []), token],\n }\n }\n )\n }\n return token as TokenExtended\n },\n\n enabled: Boolean(chainId && tokenQuery && enabled),\n retry: false,\n })\n return {\n token: data || undefined,\n isLoading,\n }\n}\n"],"mappings":";;;;;;;;AAUA,MAAa,kBACX,SACA,YACA,SACA,aAIG;CACH,MAAM,cAAc,eAAe;CACnC,MAAM,EAAE,QAAQ,cAAc,cAAc,gBAAgB;CAC5D,MAAM,YAAY,aAAa;CAE/B,MAAM,EAAE,MAAM,cAAc,SAAS;EACnC,UAAU;GAAC,YAAY,gBAAgB,SAAS;GAAG;GAAS;EAAU;EACtE,SAAS,OAAO,EAAE,UAAU,GAAG,SAAS,aAAa,aAAa;GAChE,MAAM,QAAQ,MAAM,SAClB,WACA,SACA,YACA,EACE,OACF,CACF;GAEA,IAAI,OAAO;IAET,MAAM,uBAAuB,uBAC3B,cACA,MAAM,SACN,QACF;IAGA,IACE,CAAC,kBAAkB,OAAO,sBAAsB,WAAW,MACzD,EAAE,QAAQ,YAAY,CACxB,GAEA,OAAO;IAIT,YAAY,eACV,EAAE,UAAU,CAAC,YAAY,UAAU,SAAS,CAAC,EAAE,IAC9C,SAAS;KACR,IAAI,CAAC,MACH,OAAO;KAET,MAAM,cAAc,KAAK;KACzB,IACE,aAAa,MACV,MAAM,EAAE,QAAQ,YAAY,MAAM,MAAM,QAAQ,YAAY,CAC/D,GAEA,OAAO;KAET,OAAO;MACL,GAAG;OACF,UAAoB,CAAC,GAAI,eAAe,CAAC,GAAI,KAAK;KACrD;IACF,CACF;GACF;GACA,OAAO;EACT;EAEA,SAAS,QAAQ,WAAW,cAAc,OAAO;EACjD,OAAO;CACT,CAAC;CACD,OAAO;EACL,OAAO,QAAQ,KAAA;EACf;CACF;AACF"}
|
|
@@ -4,6 +4,7 @@ import { useSDKClient } from "../providers/SDKClientProvider.js";
|
|
|
4
4
|
import { getQueryKey } from "../utils/queries.js";
|
|
5
5
|
import { useAvailableChains } from "./useAvailableChains.js";
|
|
6
6
|
import { filterAllowedTokens, getNativeTokenAddresses, mergeVerifiedWithSearchTokens } from "../utils/token.js";
|
|
7
|
+
import { isAddressQuery } from "../utils/address.js";
|
|
7
8
|
import { defaultChainIdsByType } from "../utils/chainType.js";
|
|
8
9
|
import { ChainType, getToken, getTokens } from "@lifi/sdk";
|
|
9
10
|
import { useMemo } from "react";
|
|
@@ -14,7 +15,9 @@ const refetchInterval = 3e5;
|
|
|
14
15
|
const useTokens = (formType, search, chainId) => {
|
|
15
16
|
const { tokens: configTokens, chains: chainsConfig, keyPrefix } = useWidgetConfig();
|
|
16
17
|
const sdkClient = useSDKClient();
|
|
17
|
-
const {
|
|
18
|
+
const { getChainTypeFromTokenAddress } = useChainTypeFromAddress();
|
|
19
|
+
const trimmedSearch = search?.trim();
|
|
20
|
+
const isAddressSearch = useMemo(() => isAddressQuery(trimmedSearch, getChainTypeFromTokenAddress), [trimmedSearch, getChainTypeFromTokenAddress]);
|
|
18
21
|
const { data: verifiedTokens, isLoading } = useQuery({
|
|
19
22
|
queryKey: [getQueryKey("tokens", keyPrefix)],
|
|
20
23
|
queryFn: async ({ signal }) => {
|
|
@@ -44,11 +47,12 @@ const useTokens = (formType, search, chainId) => {
|
|
|
44
47
|
const { data: searchTokens, isLoading: isSearchLoading } = useQuery({
|
|
45
48
|
queryKey: [
|
|
46
49
|
getQueryKey("tokens-search", keyPrefix),
|
|
47
|
-
|
|
48
|
-
chainId
|
|
50
|
+
trimmedSearch,
|
|
51
|
+
chainId,
|
|
52
|
+
isAddressSearch
|
|
49
53
|
],
|
|
50
54
|
queryFn: async ({ queryKey, signal }) => {
|
|
51
|
-
const [, searchQuery, searchChainId] = queryKey;
|
|
55
|
+
const [, searchQuery, searchChainId, addressSearch] = queryKey;
|
|
52
56
|
const chainTypes = [
|
|
53
57
|
ChainType.EVM,
|
|
54
58
|
ChainType.SVM,
|
|
@@ -65,20 +69,26 @@ const useTokens = (formType, search, chainId) => {
|
|
|
65
69
|
limit: 1e3,
|
|
66
70
|
minPriceUSD: 1e-6
|
|
67
71
|
}, { signal });
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const
|
|
71
|
-
if (
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
72
|
+
if (searchQuery) {
|
|
73
|
+
const chainType = getChainTypeFromTokenAddress(searchQuery);
|
|
74
|
+
const lookupChainId = searchChainId ?? (chainType ? defaultChainIdsByType[chainType] : void 0);
|
|
75
|
+
if (lookupChainId) {
|
|
76
|
+
const existingTokens = tokensResponse.tokens[lookupChainId] ?? [];
|
|
77
|
+
const hasTokenAtAddress = () => {
|
|
78
|
+
const address = searchQuery.toLowerCase();
|
|
79
|
+
return (searchChainId ? [existingTokens] : Object.values(tokensResponse.tokens)).some((tokens) => tokens.some((token) => token.address?.toLowerCase() === address));
|
|
80
|
+
};
|
|
81
|
+
if (addressSearch ? !hasTokenAtAddress() : !existingTokens.length) try {
|
|
82
|
+
const token = await getToken(sdkClient, lookupChainId, searchQuery, { signal });
|
|
83
|
+
if (token) tokensResponse.tokens[lookupChainId] = [...existingTokens, token];
|
|
84
|
+
} catch (error) {
|
|
85
|
+
if (signal.aborted) throw error;
|
|
86
|
+
}
|
|
77
87
|
}
|
|
78
88
|
}
|
|
79
89
|
return tokensResponse.tokens;
|
|
80
90
|
},
|
|
81
|
-
enabled: !!
|
|
91
|
+
enabled: !!trimmedSearch,
|
|
82
92
|
refetchInterval,
|
|
83
93
|
staleTime: refetchInterval
|
|
84
94
|
});
|
|
@@ -97,7 +107,8 @@ const useTokens = (formType, search, chainId) => {
|
|
|
97
107
|
nativeTokenAddresses
|
|
98
108
|
]),
|
|
99
109
|
isLoading,
|
|
100
|
-
isSearchLoading
|
|
110
|
+
isSearchLoading,
|
|
111
|
+
isAddressSearch
|
|
101
112
|
};
|
|
102
113
|
};
|
|
103
114
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTokens.js","names":[],"sources":["../../../src/hooks/useTokens.ts"],"sourcesContent":["import {\n ChainType,\n getToken,\n getTokens,\n type TokenExtended,\n type TokensExtendedResponse,\n} from '@lifi/sdk'\nimport { useChainTypeFromAddress } from '@lifi/widget-provider'\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 type { TokensByChain } from '../types/token.js'\nimport { defaultChainIdsByType } from '../utils/chainType.js'\nimport { isItemAllowed } from '../utils/item.js'\nimport { getQueryKey } from '../utils/queries.js'\nimport {\n filterAllowedTokens,\n getNativeTokenAddresses,\n mergeVerifiedWithSearchTokens,\n} from '../utils/token.js'\nimport { useAvailableChains } from './useAvailableChains.js'\n\nconst refetchInterval = 300_000\n\nexport const useTokens = (\n formType?: FormType,\n search?: string,\n chainId?: number\n): {\n allTokens: Record<number, TokenExtended[]> | undefined\n isLoading: boolean\n isSearchLoading: boolean\n} => {\n const {\n tokens: configTokens,\n chains: chainsConfig,\n keyPrefix,\n } = useWidgetConfig()\n const sdkClient = useSDKClient()\n const {
|
|
1
|
+
{"version":3,"file":"useTokens.js","names":[],"sources":["../../../src/hooks/useTokens.ts"],"sourcesContent":["import {\n ChainType,\n getToken,\n getTokens,\n type TokenExtended,\n type TokensExtendedResponse,\n} from '@lifi/sdk'\nimport { useChainTypeFromAddress } from '@lifi/widget-provider'\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 type { TokensByChain } from '../types/token.js'\nimport { isAddressQuery } from '../utils/address.js'\nimport { defaultChainIdsByType } from '../utils/chainType.js'\nimport { isItemAllowed } from '../utils/item.js'\nimport { getQueryKey } from '../utils/queries.js'\nimport {\n filterAllowedTokens,\n getNativeTokenAddresses,\n mergeVerifiedWithSearchTokens,\n} from '../utils/token.js'\nimport { useAvailableChains } from './useAvailableChains.js'\n\nconst refetchInterval = 300_000\n\nexport const useTokens = (\n formType?: FormType,\n search?: string,\n chainId?: number\n): {\n allTokens: Record<number, TokenExtended[]> | undefined\n isLoading: boolean\n isSearchLoading: boolean\n /** The search is a contract address, so only the token at that address matches. */\n isAddressSearch: boolean\n} => {\n const {\n tokens: configTokens,\n chains: chainsConfig,\n keyPrefix,\n } = useWidgetConfig()\n const sdkClient = useSDKClient()\n const { getChainTypeFromTokenAddress } = useChainTypeFromAddress()\n // A pasted address often carries a trailing space or newline, which the\n // API rejects. Trim once so the key, the requests and the checks agree.\n const trimmedSearch = search?.trim()\n // Keep this memoized, and out of any per-token loop: a provider validates by\n // parsing, which costs microseconds per call rather than nanoseconds.\n const isAddressSearch = useMemo(\n () => isAddressQuery(trimmedSearch, getChainTypeFromTokenAddress),\n [trimmedSearch, getChainTypeFromTokenAddress]\n )\n\n // Main tokens cache - verified tokens from API\n const { data: verifiedTokens, isLoading } = useQuery({\n queryKey: [getQueryKey('tokens', keyPrefix)],\n queryFn: async ({ signal }) => {\n const chainTypes = [\n ChainType.EVM,\n ChainType.SVM,\n ChainType.UTXO,\n ChainType.MVM,\n ChainType.TVM,\n ChainType.STL,\n ].filter((chainType) => isItemAllowed(chainType, chainsConfig?.types))\n\n const tokensResponse: TokensExtendedResponse = await getTokens(\n sdkClient,\n {\n chainTypes,\n orderBy: 'volumeUSD24H',\n extended: true,\n limit: 1000,\n minPriceUSD: 0.000001,\n },\n { signal }\n )\n\n // `listed` tells a main-list token from a searched one\n const tokens: TokensByChain = Object.fromEntries(\n Object.entries(tokensResponse.tokens).map(([chainId, tokens]) => [\n chainId,\n tokens.map((token) => ({ ...token, listed: true })),\n ])\n )\n\n return tokens\n },\n refetchInterval,\n staleTime: refetchInterval,\n })\n\n // Search tokens cache - unverified tokens from search\n const { data: searchTokens, isLoading: isSearchLoading } = useQuery({\n queryKey: [\n getQueryKey('tokens-search', keyPrefix),\n trimmedSearch,\n chainId,\n isAddressSearch,\n ] as const,\n queryFn: async ({ queryKey, signal }) => {\n const [, searchQuery, searchChainId, addressSearch] = queryKey\n const chainTypes = [\n ChainType.EVM,\n ChainType.SVM,\n ChainType.UTXO,\n ChainType.MVM,\n ChainType.TVM,\n ChainType.STL,\n ].filter((chainType) => isItemAllowed(chainType, chainsConfig?.types))\n\n const tokensResponse: TokensExtendedResponse = await getTokens(\n sdkClient,\n {\n chainTypes,\n orderBy: 'volumeUSD24H',\n extended: true,\n search: searchQuery,\n limit: 1000,\n minPriceUSD: 0.000001,\n },\n { signal }\n )\n\n // Fallback: fetch a single token from the /token endpoint when the\n // search did not deliver one. Look it up on the selected chain, or\n // without one on the default chain of the address format.\n if (searchQuery) {\n const chainType = getChainTypeFromTokenAddress(searchQuery)\n const lookupChainId =\n searchChainId ??\n (chainType ? defaultChainIdsByType[chainType] : undefined)\n if (lookupChainId) {\n const existingTokens = tokensResponse.tokens[lookupChainId] ?? []\n // The search index also matches names, so for an address query\n // impersonators that embed the address can fill the list while the\n // token at that address is missing. Without a selected chain the\n // token can sit on any chain of the response.\n const hasTokenAtAddress = () => {\n const address = searchQuery.toLowerCase()\n const candidates = searchChainId\n ? [existingTokens]\n : Object.values(tokensResponse.tokens)\n return candidates.some((tokens) =>\n tokens.some((token) => token.address?.toLowerCase() === address)\n )\n }\n const isTokenMissing = addressSearch\n ? !hasTokenAtAddress()\n : !existingTokens.length\n if (isTokenMissing) {\n try {\n const token = await getToken(\n sdkClient,\n lookupChainId,\n searchQuery,\n { signal }\n )\n if (token) {\n tokensResponse.tokens[lookupChainId] = [\n ...existingTokens,\n token,\n ]\n }\n } catch (error) {\n // A guessed chain may not hold the token (HTTP 400). Keep the\n // search results instead of failing the whole query.\n if (signal.aborted) {\n throw error\n }\n }\n }\n }\n }\n\n return tokensResponse.tokens as TokensByChain\n },\n enabled: !!trimmedSearch,\n refetchInterval,\n staleTime: refetchInterval,\n })\n\n const { chains } = useAvailableChains()\n const nativeTokenAddresses = useMemo(\n () => getNativeTokenAddresses(chains),\n [chains]\n )\n\n // Merge tokens at read time - single place where caches are combined\n const allTokens = useMemo(() => {\n const merged = mergeVerifiedWithSearchTokens(verifiedTokens, searchTokens)\n return filterAllowedTokens(\n merged,\n configTokens,\n chainsConfig,\n formType,\n nativeTokenAddresses\n )\n }, [\n verifiedTokens,\n searchTokens,\n configTokens,\n chainsConfig,\n formType,\n nativeTokenAddresses,\n ])\n\n return {\n allTokens,\n isLoading,\n isSearchLoading,\n isAddressSearch,\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAyBA,MAAM,kBAAkB;AAExB,MAAa,aACX,UACA,QACA,YAOG;CACH,MAAM,EACJ,QAAQ,cACR,QAAQ,cACR,cACE,gBAAgB;CACpB,MAAM,YAAY,aAAa;CAC/B,MAAM,EAAE,iCAAiC,wBAAwB;CAGjE,MAAM,gBAAgB,QAAQ,KAAK;CAGnC,MAAM,kBAAkB,cAChB,eAAe,eAAe,4BAA4B,GAChE,CAAC,eAAe,4BAA4B,CAC9C;CAGA,MAAM,EAAE,MAAM,gBAAgB,cAAc,SAAS;EACnD,UAAU,CAAC,YAAY,UAAU,SAAS,CAAC;EAC3C,SAAS,OAAO,EAAE,aAAa;GAC7B,MAAM,aAAa;IACjB,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;GACZ,CAAC,CAAC,QAAQ,cAAc,cAAc,WAAW,cAAc,KAAK,CAAC;GAErE,MAAM,iBAAyC,MAAM,UACnD,WACA;IACE;IACA,SAAS;IACT,UAAU;IACV,OAAO;IACP,aAAa;GACf,GACA,EAAE,OAAO,CACX;GAUA,OAP8B,OAAO,YACnC,OAAO,QAAQ,eAAe,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,YAAY,CAC/D,SACA,OAAO,KAAK,WAAW;IAAE,GAAG;IAAO,QAAQ;GAAK,EAAE,CACpD,CAAC,CAGS;EACd;EACA;EACA,WAAW;CACb,CAAC;CAGD,MAAM,EAAE,MAAM,cAAc,WAAW,oBAAoB,SAAS;EAClE,UAAU;GACR,YAAY,iBAAiB,SAAS;GACtC;GACA;GACA;EACF;EACA,SAAS,OAAO,EAAE,UAAU,aAAa;GACvC,MAAM,GAAG,aAAa,eAAe,iBAAiB;GACtD,MAAM,aAAa;IACjB,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;GACZ,CAAC,CAAC,QAAQ,cAAc,cAAc,WAAW,cAAc,KAAK,CAAC;GAErE,MAAM,iBAAyC,MAAM,UACnD,WACA;IACE;IACA,SAAS;IACT,UAAU;IACV,QAAQ;IACR,OAAO;IACP,aAAa;GACf,GACA,EAAE,OAAO,CACX;GAKA,IAAI,aAAa;IACf,MAAM,YAAY,6BAA6B,WAAW;IAC1D,MAAM,gBACJ,kBACC,YAAY,sBAAsB,aAAa,KAAA;IAClD,IAAI,eAAe;KACjB,MAAM,iBAAiB,eAAe,OAAO,kBAAkB,CAAC;KAKhE,MAAM,0BAA0B;MAC9B,MAAM,UAAU,YAAY,YAAY;MAIxC,QAHmB,gBACf,CAAC,cAAc,IACf,OAAO,OAAO,eAAe,MAAM,EAAA,CACrB,MAAM,WACtB,OAAO,MAAM,UAAU,MAAM,SAAS,YAAY,MAAM,OAAO,CACjE;KACF;KAIA,IAHuB,gBACnB,CAAC,kBAAkB,IACnB,CAAC,eAAe,QAElB,IAAI;MACF,MAAM,QAAQ,MAAM,SAClB,WACA,eACA,aACA,EAAE,OAAO,CACX;MACA,IAAI,OACF,eAAe,OAAO,iBAAiB,CACrC,GAAG,gBACH,KACF;KAEJ,SAAS,OAAO;MAGd,IAAI,OAAO,SACT,MAAM;KAEV;IAEJ;GACF;GAEA,OAAO,eAAe;EACxB;EACA,SAAS,CAAC,CAAC;EACX;EACA,WAAW;CACb,CAAC;CAED,MAAM,EAAE,WAAW,mBAAmB;CACtC,MAAM,uBAAuB,cACrB,wBAAwB,MAAM,GACpC,CAAC,MAAM,CACT;CAqBA,OAAO;EACL,WAnBgB,cAAc;GAC9B,MAAM,SAAS,8BAA8B,gBAAgB,YAAY;GACzE,OAAO,oBACL,QACA,cACA,cACA,UACA,oBACF;EACF,GAAG;GACD;GACA;GACA;GACA;GACA;GACA;EACF,CAGU;EACR;EACA;EACA;CACF;AACF"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { ToolsResponse } from "@lifi/sdk";
|
|
2
2
|
//#region src/hooks/useTools.d.ts
|
|
3
|
-
declare const useTools: () => {
|
|
3
|
+
export declare const useTools: () => {
|
|
4
4
|
tools: ToolsResponse | undefined;
|
|
5
5
|
};
|
|
6
6
|
//#endregion
|
|
7
|
-
export { useTools };
|
|
8
7
|
//# sourceMappingURL=useTools.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTools.d.ts","names":[],"sources":["../../../src/hooks/useTools.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"useTools.d.ts","names":[],"sources":["../../../src/hooks/useTools.ts"],"mappings":";;qBAQa;EAAiB,OAAO"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { WidgetConfig } from "../types/widget.js";
|
|
2
2
|
import { ExtendedChain } from "@lifi/sdk";
|
|
3
3
|
//#region src/hooks/useWidgetChains.d.ts
|
|
4
|
-
declare const useWidgetChains: (widgetConfig: WidgetConfig) => {
|
|
4
|
+
export declare const useWidgetChains: (widgetConfig: WidgetConfig) => {
|
|
5
5
|
chains: ExtendedChain[] | undefined;
|
|
6
6
|
getChainById: (chainId?: number, chains?: ExtendedChain[]) => ExtendedChain | undefined;
|
|
7
7
|
isLoading: boolean;
|
|
8
8
|
};
|
|
9
9
|
//#endregion
|
|
10
|
-
export { useWidgetChains };
|
|
11
10
|
//# sourceMappingURL=useWidgetChains.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useWidgetChains.d.ts","names":[],"sources":["../../../src/hooks/useWidgetChains.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"useWidgetChains.d.ts","names":[],"sources":["../../../src/hooks/useWidgetChains.ts"],"mappings":";;;qBAIa,kBACX,cAAc;EAEd,QAAQ;EACR,eACE,kBACA,SAAS,oBACN;EACL"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { WidgetEvents } from "../types/events.js";
|
|
2
2
|
import EventEmitter from "eventemitter3";
|
|
3
3
|
//#region src/hooks/useWidgetEvents.d.ts
|
|
4
|
-
type WidgetEventEmitter = EventEmitter<WidgetEvents>;
|
|
5
|
-
declare const widgetEvents: WidgetEventEmitter;
|
|
6
|
-
declare const useWidgetEvents: () => WidgetEventEmitter;
|
|
4
|
+
export type WidgetEventEmitter = EventEmitter<WidgetEvents>;
|
|
5
|
+
export declare const widgetEvents: WidgetEventEmitter;
|
|
6
|
+
export declare const useWidgetEvents: () => WidgetEventEmitter;
|
|
7
7
|
//#endregion
|
|
8
|
-
export { WidgetEventEmitter, useWidgetEvents, widgetEvents };
|
|
9
8
|
//# sourceMappingURL=useWidgetEvents.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useWidgetEvents.d.ts","names":[],"sources":["../../../src/hooks/useWidgetEvents.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"useWidgetEvents.d.ts","names":[],"sources":["../../../src/hooks/useWidgetEvents.ts"],"mappings":";;;YAGY,qBAAqB,aAAa;qBAEjC,cAAc;qBAEd,uBAAsB"}
|
package/dist/esm/i18n/bn.json
CHANGED
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
"buy": "",
|
|
19
19
|
"cancel": "বাতিল করুন",
|
|
20
20
|
"checkoutReview": "",
|
|
21
|
+
"clear": "",
|
|
21
22
|
"clearAllFailed": "",
|
|
22
23
|
"clearTransaction": "",
|
|
23
24
|
"close": "",
|
|
@@ -45,6 +46,8 @@
|
|
|
45
46
|
"resetSettings": "সেটিংস রিসেট করুন",
|
|
46
47
|
"seeDetails": "বিস্তারিত দেখুন",
|
|
47
48
|
"showAll": "সবগুলো দেখুন",
|
|
49
|
+
"showLess": "",
|
|
50
|
+
"showMore": "",
|
|
48
51
|
"startBridging": "",
|
|
49
52
|
"startSwapping": "",
|
|
50
53
|
"swap": "সোওয়াপ",
|
|
@@ -287,6 +290,7 @@
|
|
|
287
290
|
"quotedAmount": "উদ্ধৃত পরিমাণ",
|
|
288
291
|
"rateChange": "রেট পরিবর্তন",
|
|
289
292
|
"receiving": "রিসিভিং",
|
|
293
|
+
"recentSearches": "",
|
|
290
294
|
"refuelStepDetails": "{{tool}} এর মাধ্যমে গ্যাস পান",
|
|
291
295
|
"route": "",
|
|
292
296
|
"select": "",
|
package/dist/esm/i18n/de.json
CHANGED
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
"buy": "Buy",
|
|
19
19
|
"cancel": "Abbrechen",
|
|
20
20
|
"checkoutReview": "",
|
|
21
|
+
"clear": "",
|
|
21
22
|
"clearAllFailed": "",
|
|
22
23
|
"clearTransaction": "",
|
|
23
24
|
"close": "",
|
|
@@ -45,6 +46,8 @@
|
|
|
45
46
|
"resetSettings": "Einstellungen zurücksetzen",
|
|
46
47
|
"seeDetails": "Siehe Einzelheiten",
|
|
47
48
|
"showAll": "Alles anzeigen",
|
|
49
|
+
"showLess": "",
|
|
50
|
+
"showMore": "",
|
|
48
51
|
"startBridging": "Starte Bridge Protokoll",
|
|
49
52
|
"startSwapping": "Swap starten",
|
|
50
53
|
"swap": "Swap",
|
|
@@ -287,6 +290,7 @@
|
|
|
287
290
|
"quotedAmount": "Angebotsbetrag",
|
|
288
291
|
"rateChange": "Wechselkurs geändert",
|
|
289
292
|
"receiving": "Eingehend",
|
|
293
|
+
"recentSearches": "",
|
|
290
294
|
"refuelStepDetails": "Gas über {{tool}} erhalten",
|
|
291
295
|
"route": "",
|
|
292
296
|
"select": "",
|
package/dist/esm/i18n/en.json
CHANGED
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
"buy": "Buy",
|
|
19
19
|
"cancel": "Cancel",
|
|
20
20
|
"checkoutReview": "Review purchase",
|
|
21
|
+
"clear": "Clear",
|
|
21
22
|
"clearAllFailed": "Clear all failed",
|
|
22
23
|
"clearTransaction": "Clear transaction",
|
|
23
24
|
"close": "Close",
|
|
@@ -56,6 +57,8 @@
|
|
|
56
57
|
"viewRefundStatus": "View refund status",
|
|
57
58
|
"viewTransferDetails": "View transfer details",
|
|
58
59
|
"showAll": "Show all",
|
|
60
|
+
"showLess": "Show less",
|
|
61
|
+
"showMore": "Show {{count}} more",
|
|
59
62
|
"startBridging": "Start bridging",
|
|
60
63
|
"startSwapping": "Start swapping",
|
|
61
64
|
"swap": "Swap",
|
|
@@ -321,6 +324,7 @@
|
|
|
321
324
|
"quotedAmount": "Quoted amount",
|
|
322
325
|
"rateChange": "Rate change",
|
|
323
326
|
"receiving": "Receiving",
|
|
327
|
+
"recentSearches": "Recent searches",
|
|
324
328
|
"refuelStepDetails": "Get gas via {{tool}}",
|
|
325
329
|
"route": "Route",
|
|
326
330
|
"select": "Select",
|
package/dist/esm/i18n/es.json
CHANGED
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
"buy": "Comprar",
|
|
19
19
|
"cancel": "Cancelar",
|
|
20
20
|
"checkoutReview": "Revisar compra",
|
|
21
|
+
"clear": "",
|
|
21
22
|
"clearAllFailed": "",
|
|
22
23
|
"clearTransaction": "",
|
|
23
24
|
"close": "Cerrar",
|
|
@@ -45,6 +46,8 @@
|
|
|
45
46
|
"resetSettings": "Reiniciar ajustes",
|
|
46
47
|
"seeDetails": "Ver detalles",
|
|
47
48
|
"showAll": "Mostrar todo",
|
|
49
|
+
"showLess": "",
|
|
50
|
+
"showMore": "",
|
|
48
51
|
"startBridging": "Comenzar puente",
|
|
49
52
|
"startSwapping": "Iniciar intercambio",
|
|
50
53
|
"swap": "Swap",
|
|
@@ -287,6 +290,7 @@
|
|
|
287
290
|
"quotedAmount": "Monto citado",
|
|
288
291
|
"rateChange": "Cambios de precio detectado",
|
|
289
292
|
"receiving": "Recibiendo",
|
|
293
|
+
"recentSearches": "",
|
|
290
294
|
"refuelStepDetails": "Obtener gas a través de {{tool}}",
|
|
291
295
|
"route": "",
|
|
292
296
|
"select": "",
|
package/dist/esm/i18n/fr.json
CHANGED
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
"buy": "Acheter",
|
|
19
19
|
"cancel": "Annuler",
|
|
20
20
|
"checkoutReview": "",
|
|
21
|
+
"clear": "",
|
|
21
22
|
"clearAllFailed": "",
|
|
22
23
|
"clearTransaction": "",
|
|
23
24
|
"close": "Fermer",
|
|
@@ -45,6 +46,8 @@
|
|
|
45
46
|
"resetSettings": "Réinitialiser les paramètres",
|
|
46
47
|
"seeDetails": "Voir les détails",
|
|
47
48
|
"showAll": "Afficher tout",
|
|
49
|
+
"showLess": "",
|
|
50
|
+
"showMore": "",
|
|
48
51
|
"startBridging": "Commencer le pont",
|
|
49
52
|
"startSwapping": "Commencer à échanger",
|
|
50
53
|
"swap": "Échanger",
|
|
@@ -287,6 +290,7 @@
|
|
|
287
290
|
"quotedAmount": "Montant indiqué",
|
|
288
291
|
"rateChange": "Taux de change",
|
|
289
292
|
"receiving": "En cours de réception",
|
|
293
|
+
"recentSearches": "",
|
|
290
294
|
"refuelStepDetails": "Obtenir du gaz via {{tool}}",
|
|
291
295
|
"route": "",
|
|
292
296
|
"select": "",
|
package/dist/esm/i18n/hi.json
CHANGED
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
"buy": "",
|
|
19
19
|
"cancel": "रद्द करें",
|
|
20
20
|
"checkoutReview": "",
|
|
21
|
+
"clear": "",
|
|
21
22
|
"clearAllFailed": "",
|
|
22
23
|
"clearTransaction": "",
|
|
23
24
|
"close": "",
|
|
@@ -45,6 +46,8 @@
|
|
|
45
46
|
"resetSettings": "कुंजी: बटन. सेटिंग्स रीसेट करें\nबटन -> सेटिंग्स रीसेट करें",
|
|
46
47
|
"seeDetails": "कुंजी: बटन. जानकारी देखें\nबटन -> जानकारी देखें",
|
|
47
48
|
"showAll": "कुंजी: बटन. सभी दिखाएँ\nबटन -> सभी दिखाएँ",
|
|
49
|
+
"showLess": "",
|
|
50
|
+
"showMore": "",
|
|
48
51
|
"startBridging": "",
|
|
49
52
|
"startSwapping": "",
|
|
50
53
|
"swap": "कुंजी: बटन. विनिमय \nबटन -> विनिमय ",
|
|
@@ -287,6 +290,7 @@
|
|
|
287
290
|
"quotedAmount": "",
|
|
288
291
|
"rateChange": "",
|
|
289
292
|
"receiving": "",
|
|
293
|
+
"recentSearches": "",
|
|
290
294
|
"refuelStepDetails": "",
|
|
291
295
|
"route": "",
|
|
292
296
|
"select": "",
|