@lifi/widget 4.0.0-beta.18 → 4.0.0-beta.20
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/AppDefault.js.map +1 -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/AmountInput/AmountInput.js.map +1 -1
- package/dist/esm/components/AmountInput/AmountInputEndAdornment.js.map +1 -1
- package/dist/esm/components/AmountInput/AmountInputStartAdornment.js.map +1 -1
- package/dist/esm/components/AmountInput/PriceFormHelperText.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/Avatar.style.js.map +1 -1
- package/dist/esm/components/Avatar/ChainBadgeContent.js.map +1 -1
- package/dist/esm/components/Avatar/SmallAvatar.js.map +1 -1
- package/dist/esm/components/Avatar/TokenAvatar.js.map +1 -1
- package/dist/esm/components/Avatar/utils.js.map +1 -1
- package/dist/esm/components/BaseTransactionButton/BaseTransactionButton.js.map +1 -1
- package/dist/esm/components/BottomSheet/BottomSheet.js.map +1 -1
- package/dist/esm/components/Card/Card.js.map +1 -1
- package/dist/esm/components/Card/CardIconButton.js.map +1 -1
- package/dist/esm/components/ChainSelect/ChainSelect.js.map +1 -1
- package/dist/esm/components/ChainSelect/ChainSelect.style.js.map +1 -1
- package/dist/esm/components/ChainSelect/useChainSelect.js.map +1 -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/ChainList.style.js.map +1 -1
- package/dist/esm/components/Chains/ChainListItem.js.map +1 -1
- package/dist/esm/components/Chains/ChainSearchInput.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/SelectChainContent.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/ContractComponent.js.map +1 -1
- package/dist/esm/components/ContractComponent/ItemPrice.js.map +1 -1
- package/dist/esm/components/ContractComponent/NFT/NFT.js.map +1 -1
- package/dist/esm/components/ContractComponent/NFT/NFTBase.js.map +1 -1
- package/dist/esm/components/Dialog/Dialog.js.map +1 -1
- 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/Header.js.map +1 -1
- package/dist/esm/components/Header/Header.style.js.map +1 -1
- package/dist/esm/components/Header/NavigationHeader.js.map +1 -1
- package/dist/esm/components/Header/SettingsButton.js.map +1 -1
- package/dist/esm/components/Header/SettingsButton.style.js.map +1 -1
- package/dist/esm/components/Header/SplitNavigationTabs.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.map +1 -1
- package/dist/esm/components/IconCircle/IconCircle.style.js.map +1 -1
- package/dist/esm/components/Initializer.js.map +1 -1
- package/dist/esm/components/ListItemButton.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/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/WarningMessages.js.map +1 -1
- package/dist/esm/components/Messages/useMessageQueue.js.map +1 -1
- package/dist/esm/components/NotFound.js.map +1 -1
- package/dist/esm/components/PageEntered.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/ReverseTokensButton/ReverseTokensButton.style.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.map +1 -1
- package/dist/esm/components/RouteCard/RouteNotFoundCard.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/RouteCard/getMatchingLabels.js +1 -0
- package/dist/esm/components/RouteCard/getMatchingLabels.js.map +1 -1
- package/dist/esm/components/Routes/Routes.js.map +1 -1
- package/dist/esm/components/Routes/RoutesContent.js.map +1 -1
- package/dist/esm/components/Routes/RoutesExpanded.js.map +1 -1
- package/dist/esm/components/Routes/RoutesExpanded.style.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/SelectTokenButton/SelectTokenButton.style.js.map +1 -1
- package/dist/esm/components/SendToWallet/SendToWalletButton.js.map +1 -1
- package/dist/esm/components/SendToWallet/SendToWalletExpandButton.js.map +1 -1
- package/dist/esm/components/Skeleton/WidgetSkeleton.js.map +1 -1
- package/dist/esm/components/Skeleton/WidgetSkeleton.style.js.map +1 -1
- package/dist/esm/components/Step/CircularProgress.js.map +1 -1
- package/dist/esm/components/Step/CircularProgress.style.js.map +1 -1
- package/dist/esm/components/Step/DestinationWalletAddress.js.map +1 -1
- package/dist/esm/components/Step/Step.js.map +1 -1
- package/dist/esm/components/Step/StepAction.js.map +1 -1
- package/dist/esm/components/Step/StepActions.js.map +1 -1
- package/dist/esm/components/Step/StepList.js.map +1 -1
- package/dist/esm/components/StepActions/StepActions.js.map +1 -1
- package/dist/esm/components/StepDivider/StepDivider.js.map +1 -1
- package/dist/esm/components/TextFitter/TextFitter.js.map +1 -1
- package/dist/esm/components/Timer/StepTimer.js.map +1 -1
- package/dist/esm/components/Timer/TimerContent.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.map +1 -1
- package/dist/esm/components/TokenList/TokenNotFound.js.map +1 -1
- package/dist/esm/components/TokenList/VirtualizedTokenList.js.map +1 -1
- package/dist/esm/components/TokenList/useTokenSelect.js.map +1 -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.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/components/TransactionDetails.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.map +1 -1
- package/dist/esm/hooks/timer/useExecutionTimer.js.map +1 -1
- package/dist/esm/hooks/timer/useInterval.js.map +1 -1
- package/dist/esm/hooks/timer/useTimer.js.map +1 -1
- package/dist/esm/hooks/timer/validate.js.map +1 -1
- package/dist/esm/hooks/useAccountsBalancesData.js.map +1 -1
- package/dist/esm/hooks/useActionMessage.js.map +1 -1
- package/dist/esm/hooks/useAddressActivity.js.map +1 -1
- package/dist/esm/hooks/useAddressValidation.js.map +1 -1
- package/dist/esm/hooks/useAvailableChains.js.map +1 -1
- package/dist/esm/hooks/useChain.js.map +1 -1
- package/dist/esm/hooks/useChains.js.map +1 -1
- package/dist/esm/hooks/useContactSupport.js.map +1 -1
- package/dist/esm/hooks/useDebouncedWatch.js.map +1 -1
- package/dist/esm/hooks/useDefaultElementId.js.map +1 -1
- package/dist/esm/hooks/useExplorer.js.map +1 -1
- package/dist/esm/hooks/useFilteredByTokenBalances.js.map +1 -1
- package/dist/esm/hooks/useFromAmountThreshold.js.map +1 -1
- package/dist/esm/hooks/useFromTokenSufficiency.js.map +1 -1
- package/dist/esm/hooks/useGasRecommendation.js.map +1 -1
- package/dist/esm/hooks/useGasRefuel.js.map +1 -1
- package/dist/esm/hooks/useGasSufficiency.js.map +1 -1
- package/dist/esm/hooks/useHasChainExpansion.js.map +1 -1
- package/dist/esm/hooks/useHeader.js.map +1 -1
- package/dist/esm/hooks/useInitializeSDKProviders.js.map +1 -1
- package/dist/esm/hooks/useInitializer.js.map +1 -1
- package/dist/esm/hooks/useIsBatchingSupported.js.map +1 -1
- package/dist/esm/hooks/useIsContractAddress.js.map +1 -1
- package/dist/esm/hooks/useLanguages.js.map +1 -1
- package/dist/esm/hooks/useListHeight.js.map +1 -1
- package/dist/esm/hooks/useLongPress.js.map +1 -1
- package/dist/esm/hooks/useNavigateBack.js.map +1 -1
- package/dist/esm/hooks/useRouteExecution.js.map +1 -1
- package/dist/esm/hooks/useRouteRequiredAccountConnection.js.map +1 -1
- package/dist/esm/hooks/useRoutes.js.map +1 -1
- package/dist/esm/hooks/useScrollableContainer.js.map +1 -1
- package/dist/esm/hooks/useSetContentHeight.js.map +1 -1
- package/dist/esm/hooks/useSettingMonitor.js.map +1 -1
- package/dist/esm/hooks/useSwapOnly.js.map +1 -1
- package/dist/esm/hooks/useToAddressAutoPopulate.js.map +1 -1
- package/dist/esm/hooks/useToAddressRequirements.js.map +1 -1
- package/dist/esm/hooks/useToAddressReset.js.map +1 -1
- package/dist/esm/hooks/useToken.js.map +1 -1
- package/dist/esm/hooks/useTokenAddressBalance.js.map +1 -1
- package/dist/esm/hooks/useTokenBalance.js.map +1 -1
- package/dist/esm/hooks/useTokenBalances.js.map +1 -1
- package/dist/esm/hooks/useTokenBalancesQueries.js.map +1 -1
- package/dist/esm/hooks/useTokenRateText.js.map +1 -1
- package/dist/esm/hooks/useTokenSearch.js.map +1 -1
- package/dist/esm/hooks/useTokens.js.map +1 -1
- package/dist/esm/hooks/useTools.js.map +1 -1
- package/dist/esm/hooks/useTransactionDetails.js.map +1 -1
- package/dist/esm/hooks/useTransactionHistory.js.map +1 -1
- package/dist/esm/hooks/useTransactionList.js.map +1 -1
- package/dist/esm/hooks/useWideVariant.js.map +1 -1
- package/dist/esm/hooks/useWidgetChains.js.map +1 -1
- package/dist/esm/hooks/useWidgetEvents.js.map +1 -1
- package/dist/esm/pages/ActivitiesPage/ActiveTransactionItem.js.map +1 -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/ActivitiesPage/TransactionHistoryEmpty.js.map +1 -1
- package/dist/esm/pages/ActivitiesPage/TransactionHistoryItem.js.map +1 -1
- package/dist/esm/pages/LanguagesPage.js.map +1 -1
- package/dist/esm/pages/MainPage/MainPage.js.map +1 -1
- package/dist/esm/pages/MainPage/MainWarningMessages.js.map +1 -1
- package/dist/esm/pages/MainPage/ReviewButton.js.map +1 -1
- package/dist/esm/pages/RoutesPage/RoutesPage.js.map +1 -1
- package/dist/esm/pages/SelectChainPage/SelectChainPage.js.map +1 -1
- package/dist/esm/pages/SelectEnabledToolsPage.js.map +1 -1
- package/dist/esm/pages/SelectTokenPage/SearchTokenInput.js.map +1 -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/SettingCardExpandable.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SettingsCard/SettingsAccordian.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SettingsPage.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.style.js.map +1 -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/ActionRow.js.map +1 -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/SentToWalletRow.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/StepActionRow.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/StepActionsList.js.map +1 -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/RouteTracker.js.map +1 -1
- package/dist/esm/pages/TransactionPage/StartTransactionButton.js.map +1 -1
- package/dist/esm/pages/TransactionPage/StatusBottomSheet.js.map +1 -1
- package/dist/esm/pages/TransactionPage/StatusBottomSheet.style.js.map +1 -1
- package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.js.map +1 -1
- package/dist/esm/pages/TransactionPage/TransactionPage.js.map +1 -1
- package/dist/esm/pages/TransactionPage/utils.js.map +1 -1
- package/dist/esm/providers/I18nProvider/I18nProvider.js.map +1 -1
- package/dist/esm/providers/I18nProvider/i18n.js.map +1 -1
- package/dist/esm/providers/QueryClientProvider.js.map +1 -1
- package/dist/esm/providers/SDKClientProvider.js.map +1 -1
- package/dist/esm/providers/ThemeProvider/ThemeProvider.js.map +1 -1
- package/dist/esm/providers/WalletProvider/WalletProvider.js.map +1 -1
- package/dist/esm/providers/WalletProvider/useExternalWalletProvider.js.map +1 -1
- package/dist/esm/providers/WidgetProvider/WidgetProvider.js.map +1 -1
- package/dist/esm/stores/StoreProvider.js.map +1 -1
- package/dist/esm/stores/bookmarks/BookmarkStore.js.map +1 -1
- package/dist/esm/stores/bookmarks/createBookmarkStore.js.map +1 -1
- package/dist/esm/stores/bookmarks/useBookmarkActions.js.map +1 -1
- package/dist/esm/stores/bookmarks/useBookmarks.js.map +1 -1
- package/dist/esm/stores/chains/ChainOrderStore.js.map +1 -1
- package/dist/esm/stores/chains/createChainOrderStore.js.map +1 -1
- package/dist/esm/stores/chains/useChainOrder.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/form/URLSearchParamsBuilder.js.map +1 -1
- package/dist/esm/stores/form/createFormStore.js.map +1 -1
- package/dist/esm/stores/form/getDefaultValuesFromQueryString.js.map +1 -1
- package/dist/esm/stores/form/useFieldActions.js.map +1 -1
- package/dist/esm/stores/form/useFieldValues.js.map +1 -1
- package/dist/esm/stores/form/useFormRef.js.map +1 -1
- package/dist/esm/stores/form/useFormStore.js.map +1 -1
- package/dist/esm/stores/form/useTouchedFields.js.map +1 -1
- package/dist/esm/stores/header/useHeaderStore.js.map +1 -1
- package/dist/esm/stores/inputMode/useInputModeStore.js.map +1 -1
- package/dist/esm/stores/pinnedTokens/PinnedTokensStore.js.map +1 -1
- package/dist/esm/stores/pinnedTokens/createPinnedTokensStore.js.map +1 -1
- package/dist/esm/stores/routes/RouteExecutionStore.js.map +1 -1
- package/dist/esm/stores/routes/createRouteExecutionStore.js.map +1 -1
- package/dist/esm/stores/routes/useIntermediateRoutesStore.js.map +1 -1
- package/dist/esm/stores/routes/useRouteExecutionIndicator.js.map +1 -1
- package/dist/esm/stores/routes/useSetExecutableRoute.js.map +1 -1
- package/dist/esm/stores/routes/utils.js.map +1 -1
- package/dist/esm/stores/settings/SettingsStore.js.map +1 -1
- package/dist/esm/stores/settings/createSettingsStore.js.map +1 -1
- package/dist/esm/stores/settings/useSettings.js.map +1 -1
- package/dist/esm/stores/settings/useSettingsActions.js.map +1 -1
- package/dist/esm/stores/settings/useSplitSubvariantStore.js.map +1 -1
- package/dist/esm/themes/createTheme.js.map +1 -1
- package/dist/esm/themes/utils.js.map +1 -1
- package/dist/esm/types/events.js.map +1 -1
- package/dist/esm/types/widget.d.ts +9 -1
- package/dist/esm/types/widget.d.ts.map +1 -1
- package/dist/esm/types/widget.js.map +1 -1
- package/dist/esm/utils/compactNumberFormatter.js.map +1 -1
- package/dist/esm/utils/converters.js.map +1 -1
- package/dist/esm/utils/currencyExtendedFormatter.js.map +1 -1
- package/dist/esm/utils/deepEqual.js.map +1 -1
- package/dist/esm/utils/deepMerge.js.map +1 -1
- package/dist/esm/utils/fees.js.map +1 -1
- package/dist/esm/utils/format.js.map +1 -1
- package/dist/esm/utils/getActionMessage.js.map +1 -1
- package/dist/esm/utils/getErrorMessage.js.map +1 -1
- package/dist/esm/utils/getPriceImpact.js.map +1 -1
- package/dist/esm/utils/input.js.map +1 -1
- package/dist/esm/utils/item.js.map +1 -1
- package/dist/esm/utils/percentFormatter.js.map +1 -1
- package/dist/esm/utils/prepareActions.js.map +1 -1
- package/dist/esm/utils/timer.js.map +1 -1
- package/dist/esm/utils/token.js.map +1 -1
- package/dist/esm/utils/tokenList.js.map +1 -1
- package/dist/esm/utils/variant.js.map +1 -1
- package/dist/esm/utils/widgetSize.js.map +1 -1
- package/package.json +11 -11
- package/src/components/RouteCard/getMatchingLabels.ts +5 -0
- package/src/config/version.ts +1 -1
- package/src/types/widget.ts +9 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGasSufficiency.js","names":[],"sources":["../../../src/hooks/useGasSufficiency.ts"],"sourcesContent":["import type { EVMChain, RouteExtended, Token, TokenAmount } from '@lifi/sdk'\nimport { ChainType } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport { useQuery } from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { HiddenUI } from '../types/widget.js'\nimport { getQueryKey } from '../utils/queries.js'\nimport { useAvailableChains } from './useAvailableChains.js'\nimport { useIsContractAddress } from './useIsContractAddress.js'\nimport { getTokenBalancesWithRetry } from './useTokenBalance.js'\n\nexport interface GasSufficiency {\n gasAmount: bigint\n tokenAmount?: bigint\n insufficientAmount?: bigint\n insufficient?: boolean\n token: Token\n chain?: EVMChain\n}\n\nconst refetchInterval = 30_000\n\nexport const useGasSufficiency = (\n route?: RouteExtended\n): {\n insufficientGas: GasSufficiency[] | undefined\n isLoading: boolean\n} => {\n const { getChainById } = useAvailableChains()\n const { account: EVMAccount, accounts } = useAccount({\n chainType: ChainType.EVM,\n })\n const { keyPrefix, hiddenUI } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n const { relevantAccounts, relevantAccountsQueryKey } = useMemo(() => {\n const chainTypes = route?.steps.reduce((acc, step) => {\n const chainType = getChainById(step.action.fromChainId)?.chainType\n if (chainType) {\n acc.add(chainType)\n }\n return acc\n }, new Set<ChainType>())\n\n const relevantAccounts = accounts.filter(\n (account) =>\n account.isConnected &&\n account.address &&\n chainTypes?.has(account.chainType)\n )\n return {\n relevantAccounts,\n relevantAccountsQueryKey: relevantAccounts\n .map((account) => account.address)\n .join(','),\n }\n }, [accounts, route?.steps, getChainById])\n\n const { isContractAddress, isLoading: isContractAddressLoading } =\n useIsContractAddress(\n EVMAccount.address,\n route?.fromChainId,\n EVMAccount.chainType\n )\n\n const { data: insufficientGas, isLoading } = useQuery<GasSufficiency[]>({\n queryKey: [\n getQueryKey('gas-sufficiency-check', keyPrefix),\n relevantAccountsQueryKey,\n route?.id,\n isContractAddress,\n ] as const,\n queryFn: async () => {\n if (!route) {\n return []\n }\n\n // Filter out steps that are relayer steps or have primaryType 'Permit' or 'Order'\n const filteredSteps = route.steps.filter(\n (step) =>\n !step.typedData?.some(\n (t) => t.primaryType === 'Permit' || t.primaryType === 'Order'\n )\n )\n\n // If all steps are filtered out, we don't need to check for gas sufficiency\n if (!filteredSteps.length) {\n return []\n }\n\n // We assume that LI.Fuel protocol always refuels the destination chain\n const hasRefuelStep = route.steps\n .flatMap((step) => step.includedSteps)\n .some((includedStep) => includedStep.tool === 'gasZip')\n\n const gasCosts = filteredSteps\n .filter((step) => !step.execution || step.execution.status !== 'DONE')\n .reduce(\n (groupedGasCosts, step) => {\n // We need to avoid destination chain step sufficiency check if we have LI.Fuel protocol sub-step\n const skipDueToRefuel =\n step.action.fromChainId === route.toChainId && hasRefuelStep\n if (step.estimate.gasCosts && !skipDueToRefuel) {\n const { token } = step.estimate.gasCosts[0]\n const gasCostAmount = step.estimate.gasCosts.reduce(\n (amount, gasCost) =>\n amount + BigInt(Number(gasCost.amount).toFixed(0)),\n 0n\n )\n if (gasCostAmount > 0n) {\n groupedGasCosts[token.chainId] = {\n gasAmount: groupedGasCosts[token.chainId]\n ? groupedGasCosts[token.chainId].gasAmount + gasCostAmount\n : gasCostAmount,\n token,\n chain: getChainById(token.chainId),\n }\n }\n }\n // Add fees paid in native tokens to gas sufficiency check (included: false)\n const nonIncludedFeeCosts = step.estimate.feeCosts?.filter(\n (feeCost) => !feeCost.included\n )\n if (nonIncludedFeeCosts?.length) {\n const { token } = nonIncludedFeeCosts[0]\n const feeCostAmount = nonIncludedFeeCosts.reduce(\n (amount, feeCost) =>\n amount + BigInt(Number(feeCost.amount).toFixed(0)),\n 0n\n )\n if (feeCostAmount > 0n) {\n groupedGasCosts[token.chainId] = {\n gasAmount: groupedGasCosts[token.chainId]\n ? groupedGasCosts[token.chainId].gasAmount + feeCostAmount\n : feeCostAmount,\n token,\n chain: getChainById(token.chainId),\n }\n }\n }\n return groupedGasCosts\n },\n {} as Record<string, GasSufficiency>\n )\n\n // Check whether we are sending a native token\n // For native tokens we want to check for the total amount, including the network fee\n if (\n route.fromToken.address === gasCosts[route.fromChainId]?.token.address\n ) {\n gasCosts[route.fromChainId].tokenAmount =\n gasCosts[route.fromChainId]?.gasAmount + BigInt(route.fromAmount)\n }\n\n const gasCostsValues = Object.values(gasCosts)\n\n const balanceChecks = await Promise.allSettled(\n relevantAccounts.map((account) => {\n const relevantTokens = gasCostsValues\n .filter((gasCost) => gasCost.chain?.chainType === account.chainType)\n .map((item) => item.token)\n\n return getTokenBalancesWithRetry(\n sdkClient,\n account.address!,\n relevantTokens\n )\n })\n )\n\n const tokenBalances = balanceChecks\n .filter(\n (result): result is PromiseFulfilledResult<TokenAmount[]> =>\n result.status === 'fulfilled' && Boolean(result.value)\n )\n .flatMap((result) => result.value)\n\n if (!tokenBalances?.length) {\n return []\n }\n\n Object.keys(gasCosts).forEach((chainId) => {\n if (gasCosts[chainId]) {\n const gasTokenBalance =\n tokenBalances?.find(\n (t) =>\n t.chainId === gasCosts[chainId].token.chainId &&\n t.address === gasCosts[chainId].token.address\n )?.amount ?? 0n\n const insufficient =\n gasTokenBalance <= 0n ||\n gasTokenBalance < gasCosts[chainId].gasAmount ||\n gasTokenBalance < (gasCosts[chainId].tokenAmount ?? 0n)\n\n const insufficientAmount = insufficient\n ? gasCosts[chainId].tokenAmount\n ? gasCosts[chainId].tokenAmount! - gasTokenBalance\n : gasCosts[chainId].gasAmount - gasTokenBalance\n : undefined\n\n gasCosts[chainId] = {\n ...gasCosts[chainId],\n insufficient,\n insufficientAmount,\n chain: insufficient ? getChainById(Number(chainId)) : undefined,\n }\n }\n })\n\n const gasCostResult = Object.values(gasCosts).filter(\n (gasCost) => gasCost.insufficient\n )\n\n return gasCostResult\n },\n\n enabled: Boolean(\n !isContractAddress &&\n !isContractAddressLoading &&\n relevantAccounts.length > 0 &&\n route &&\n !hiddenUI?.includes(HiddenUI.InsufficientGasMessage)\n ),\n refetchInterval,\n staleTime: refetchInterval,\n })\n\n return {\n insufficientGas,\n isLoading,\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useGasSufficiency.js","names":[],"sources":["../../../src/hooks/useGasSufficiency.ts"],"sourcesContent":["import type { EVMChain, RouteExtended, Token, TokenAmount } from '@lifi/sdk'\nimport { ChainType } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport { useQuery } from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { HiddenUI } from '../types/widget.js'\nimport { getQueryKey } from '../utils/queries.js'\nimport { useAvailableChains } from './useAvailableChains.js'\nimport { useIsContractAddress } from './useIsContractAddress.js'\nimport { getTokenBalancesWithRetry } from './useTokenBalance.js'\n\nexport interface GasSufficiency {\n gasAmount: bigint\n tokenAmount?: bigint\n insufficientAmount?: bigint\n insufficient?: boolean\n token: Token\n chain?: EVMChain\n}\n\nconst refetchInterval = 30_000\n\nexport const useGasSufficiency = (\n route?: RouteExtended\n): {\n insufficientGas: GasSufficiency[] | undefined\n isLoading: boolean\n} => {\n const { getChainById } = useAvailableChains()\n const { account: EVMAccount, accounts } = useAccount({\n chainType: ChainType.EVM,\n })\n const { keyPrefix, hiddenUI } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n const { relevantAccounts, relevantAccountsQueryKey } = useMemo(() => {\n const chainTypes = route?.steps.reduce((acc, step) => {\n const chainType = getChainById(step.action.fromChainId)?.chainType\n if (chainType) {\n acc.add(chainType)\n }\n return acc\n }, new Set<ChainType>())\n\n const relevantAccounts = accounts.filter(\n (account) =>\n account.isConnected &&\n account.address &&\n chainTypes?.has(account.chainType)\n )\n return {\n relevantAccounts,\n relevantAccountsQueryKey: relevantAccounts\n .map((account) => account.address)\n .join(','),\n }\n }, [accounts, route?.steps, getChainById])\n\n const { isContractAddress, isLoading: isContractAddressLoading } =\n useIsContractAddress(\n EVMAccount.address,\n route?.fromChainId,\n EVMAccount.chainType\n )\n\n const { data: insufficientGas, isLoading } = useQuery<GasSufficiency[]>({\n queryKey: [\n getQueryKey('gas-sufficiency-check', keyPrefix),\n relevantAccountsQueryKey,\n route?.id,\n isContractAddress,\n ] as const,\n queryFn: async () => {\n if (!route) {\n return []\n }\n\n // Filter out steps that are relayer steps or have primaryType 'Permit' or 'Order'\n const filteredSteps = route.steps.filter(\n (step) =>\n !step.typedData?.some(\n (t) => t.primaryType === 'Permit' || t.primaryType === 'Order'\n )\n )\n\n // If all steps are filtered out, we don't need to check for gas sufficiency\n if (!filteredSteps.length) {\n return []\n }\n\n // We assume that LI.Fuel protocol always refuels the destination chain\n const hasRefuelStep = route.steps\n .flatMap((step) => step.includedSteps)\n .some((includedStep) => includedStep.tool === 'gasZip')\n\n const gasCosts = filteredSteps\n .filter((step) => !step.execution || step.execution.status !== 'DONE')\n .reduce(\n (groupedGasCosts, step) => {\n // We need to avoid destination chain step sufficiency check if we have LI.Fuel protocol sub-step\n const skipDueToRefuel =\n step.action.fromChainId === route.toChainId && hasRefuelStep\n if (step.estimate.gasCosts && !skipDueToRefuel) {\n const { token } = step.estimate.gasCosts[0]\n const gasCostAmount = step.estimate.gasCosts.reduce(\n (amount, gasCost) =>\n amount + BigInt(Number(gasCost.amount).toFixed(0)),\n 0n\n )\n if (gasCostAmount > 0n) {\n groupedGasCosts[token.chainId] = {\n gasAmount: groupedGasCosts[token.chainId]\n ? groupedGasCosts[token.chainId].gasAmount + gasCostAmount\n : gasCostAmount,\n token,\n chain: getChainById(token.chainId),\n }\n }\n }\n // Add fees paid in native tokens to gas sufficiency check (included: false)\n const nonIncludedFeeCosts = step.estimate.feeCosts?.filter(\n (feeCost) => !feeCost.included\n )\n if (nonIncludedFeeCosts?.length) {\n const { token } = nonIncludedFeeCosts[0]\n const feeCostAmount = nonIncludedFeeCosts.reduce(\n (amount, feeCost) =>\n amount + BigInt(Number(feeCost.amount).toFixed(0)),\n 0n\n )\n if (feeCostAmount > 0n) {\n groupedGasCosts[token.chainId] = {\n gasAmount: groupedGasCosts[token.chainId]\n ? groupedGasCosts[token.chainId].gasAmount + feeCostAmount\n : feeCostAmount,\n token,\n chain: getChainById(token.chainId),\n }\n }\n }\n return groupedGasCosts\n },\n {} as Record<string, GasSufficiency>\n )\n\n // Check whether we are sending a native token\n // For native tokens we want to check for the total amount, including the network fee\n if (\n route.fromToken.address === gasCosts[route.fromChainId]?.token.address\n ) {\n gasCosts[route.fromChainId].tokenAmount =\n gasCosts[route.fromChainId]?.gasAmount + BigInt(route.fromAmount)\n }\n\n const gasCostsValues = Object.values(gasCosts)\n\n const balanceChecks = await Promise.allSettled(\n relevantAccounts.map((account) => {\n const relevantTokens = gasCostsValues\n .filter((gasCost) => gasCost.chain?.chainType === account.chainType)\n .map((item) => item.token)\n\n return getTokenBalancesWithRetry(\n sdkClient,\n account.address!,\n relevantTokens\n )\n })\n )\n\n const tokenBalances = balanceChecks\n .filter(\n (result): result is PromiseFulfilledResult<TokenAmount[]> =>\n result.status === 'fulfilled' && Boolean(result.value)\n )\n .flatMap((result) => result.value)\n\n if (!tokenBalances?.length) {\n return []\n }\n\n Object.keys(gasCosts).forEach((chainId) => {\n if (gasCosts[chainId]) {\n const gasTokenBalance =\n tokenBalances?.find(\n (t) =>\n t.chainId === gasCosts[chainId].token.chainId &&\n t.address === gasCosts[chainId].token.address\n )?.amount ?? 0n\n const insufficient =\n gasTokenBalance <= 0n ||\n gasTokenBalance < gasCosts[chainId].gasAmount ||\n gasTokenBalance < (gasCosts[chainId].tokenAmount ?? 0n)\n\n const insufficientAmount = insufficient\n ? gasCosts[chainId].tokenAmount\n ? gasCosts[chainId].tokenAmount! - gasTokenBalance\n : gasCosts[chainId].gasAmount - gasTokenBalance\n : undefined\n\n gasCosts[chainId] = {\n ...gasCosts[chainId],\n insufficient,\n insufficientAmount,\n chain: insufficient ? getChainById(Number(chainId)) : undefined,\n }\n }\n })\n\n const gasCostResult = Object.values(gasCosts).filter(\n (gasCost) => gasCost.insufficient\n )\n\n return gasCostResult\n },\n\n enabled: Boolean(\n !isContractAddress &&\n !isContractAddressLoading &&\n relevantAccounts.length > 0 &&\n route &&\n !hiddenUI?.includes(HiddenUI.InsufficientGasMessage)\n ),\n refetchInterval,\n staleTime: refetchInterval,\n })\n\n return {\n insufficientGas,\n isLoading,\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHasChainExpansion.js","names":[],"sources":["../../../src/hooks/useHasChainExpansion.ts"],"sourcesContent":["import { useLocation } from '@tanstack/react-router'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { ExpansionType, HiddenUI } from '../types/widget.js'\nimport { navigationRoutes } from '../utils/navigationRoutes.js'\nimport { useSwapOnly } from './useSwapOnly.js'\n\nexport const useHasChainExpansion = (): readonly [\n boolean,\n ExpansionType | null,\n] => {\n const { hiddenUI, subvariantOptions } = useWidgetConfig()\n const swapOnly = useSwapOnly()\n const { pathname } = useLocation()\n\n const expansionType =\n pathname === navigationRoutes.home\n ? ExpansionType.Routes\n : pathname.endsWith(navigationRoutes.fromToken)\n ? ExpansionType.FromChain\n : pathname.endsWith(navigationRoutes.toToken)\n ? ExpansionType.ToChain\n : null\n\n const withChainExpansion =\n (expansionType === ExpansionType.FromChain ||\n expansionType === ExpansionType.ToChain) &&\n !(swapOnly && expansionType === ExpansionType.ToChain) &&\n !hiddenUI?.includes(HiddenUI.ChainSelect) &&\n !subvariantOptions?.wide?.disableChainSidebar\n\n return [withChainExpansion, expansionType] as const\n}\n"],"mappings":";;;;;;AAMA,MAAa,6BAGR;CACH,MAAM,EAAE,UAAU,sBAAsB,iBAAiB;CACzD,MAAM,WAAW,aAAa;CAC9B,MAAM,EAAE,aAAa,aAAa;CAElC,MAAM,gBACJ,aAAa,iBAAiB,OAAA,WAE1B,SAAS,SAAS,iBAAiB,UAAU,GAAA,cAE3C,SAAS,SAAS,iBAAiB,QAAQ,GAAA,YAEzC;
|
|
1
|
+
{"version":3,"file":"useHasChainExpansion.js","names":[],"sources":["../../../src/hooks/useHasChainExpansion.ts"],"sourcesContent":["import { useLocation } from '@tanstack/react-router'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { ExpansionType, HiddenUI } from '../types/widget.js'\nimport { navigationRoutes } from '../utils/navigationRoutes.js'\nimport { useSwapOnly } from './useSwapOnly.js'\n\nexport const useHasChainExpansion = (): readonly [\n boolean,\n ExpansionType | null,\n] => {\n const { hiddenUI, subvariantOptions } = useWidgetConfig()\n const swapOnly = useSwapOnly()\n const { pathname } = useLocation()\n\n const expansionType =\n pathname === navigationRoutes.home\n ? ExpansionType.Routes\n : pathname.endsWith(navigationRoutes.fromToken)\n ? ExpansionType.FromChain\n : pathname.endsWith(navigationRoutes.toToken)\n ? ExpansionType.ToChain\n : null\n\n const withChainExpansion =\n (expansionType === ExpansionType.FromChain ||\n expansionType === ExpansionType.ToChain) &&\n !(swapOnly && expansionType === ExpansionType.ToChain) &&\n !hiddenUI?.includes(HiddenUI.ChainSelect) &&\n !subvariantOptions?.wide?.disableChainSidebar\n\n return [withChainExpansion, expansionType] as const\n}\n"],"mappings":";;;;;;AAMA,MAAa,6BAGR;CACH,MAAM,EAAE,UAAU,sBAAsB,iBAAiB;CACzD,MAAM,WAAW,aAAa;CAC9B,MAAM,EAAE,aAAa,aAAa;CAElC,MAAM,gBACJ,aAAa,iBAAiB,OAAA,WAE1B,SAAS,SAAS,iBAAiB,UAAU,GAAA,cAE3C,SAAS,SAAS,iBAAiB,QAAQ,GAAA,YAEzC;CASV,OAAO,EANJ,kBAAA,eACC,kBAAA,cACF,EAAE,YAAY,kBAAA,cACd,CAAC,UAAU,SAAA,cAA8B,IACzC,CAAC,mBAAmB,MAAM,qBAEA,cAAc"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHeader.js","names":[],"sources":["../../../src/hooks/useHeader.ts"],"sourcesContent":["import type { ReactNode } from 'react'\nimport { useEffect } from 'react'\nimport { useHeaderStore } from '../stores/header/useHeaderStore.js'\n\nexport function useHeader(title: string, action?: ReactNode): void {\n const [setTitle, setAction] = useHeaderStore((state) => [\n state.setTitle,\n state.setAction,\n ])\n\n useEffect(() => {\n const removeTitle = setTitle(title)\n const removeAction = action ? setAction(action) : undefined\n return () => {\n removeTitle()\n if (removeAction) {\n removeAction()\n }\n }\n }, [setTitle, setAction, action, title])\n}\n"],"mappings":";;;AAIA,SAAgB,UAAU,OAAe,QAA0B;CACjE,MAAM,CAAC,UAAU,aAAa,gBAAgB,UAAU,CACtD,MAAM,UACN,MAAM,UACP,CAAC;
|
|
1
|
+
{"version":3,"file":"useHeader.js","names":[],"sources":["../../../src/hooks/useHeader.ts"],"sourcesContent":["import type { ReactNode } from 'react'\nimport { useEffect } from 'react'\nimport { useHeaderStore } from '../stores/header/useHeaderStore.js'\n\nexport function useHeader(title: string, action?: ReactNode): void {\n const [setTitle, setAction] = useHeaderStore((state) => [\n state.setTitle,\n state.setAction,\n ])\n\n useEffect(() => {\n const removeTitle = setTitle(title)\n const removeAction = action ? setAction(action) : undefined\n return () => {\n removeTitle()\n if (removeAction) {\n removeAction()\n }\n }\n }, [setTitle, setAction, action, title])\n}\n"],"mappings":";;;AAIA,SAAgB,UAAU,OAAe,QAA0B;CACjE,MAAM,CAAC,UAAU,aAAa,gBAAgB,UAAU,CACtD,MAAM,UACN,MAAM,UACP,CAAC;CAEF,gBAAgB;EACd,MAAM,cAAc,SAAS,MAAM;EACnC,MAAM,eAAe,SAAS,UAAU,OAAO,GAAG,KAAA;EAClD,aAAa;GACX,aAAa;GACb,IAAI,cACF,cAAc;;IAGjB;EAAC;EAAU;EAAW;EAAQ;EAAM,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInitializeSDKProviders.js","names":[],"sources":["../../../src/hooks/useInitializeSDKProviders.ts"],"sourcesContent":["import { useSDKProviders } from '@lifi/widget-provider'\nimport { useEffect } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\n\nexport const useInitializeSDKProviders = (): void => {\n const sdkProviders = useSDKProviders()\n const sdkClient = useSDKClient()\n\n useEffect(() => {\n sdkClient.setProviders(sdkProviders)\n }, [sdkClient, sdkProviders])\n}\n"],"mappings":";;;;AAIA,MAAa,kCAAwC;CACnD,MAAM,eAAe,iBAAiB;CACtC,MAAM,YAAY,cAAc;
|
|
1
|
+
{"version":3,"file":"useInitializeSDKProviders.js","names":[],"sources":["../../../src/hooks/useInitializeSDKProviders.ts"],"sourcesContent":["import { useSDKProviders } from '@lifi/widget-provider'\nimport { useEffect } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\n\nexport const useInitializeSDKProviders = (): void => {\n const sdkProviders = useSDKProviders()\n const sdkClient = useSDKClient()\n\n useEffect(() => {\n sdkClient.setProviders(sdkProviders)\n }, [sdkClient, sdkProviders])\n}\n"],"mappings":";;;;AAIA,MAAa,kCAAwC;CACnD,MAAM,eAAe,iBAAiB;CACtC,MAAM,YAAY,cAAc;CAEhC,gBAAgB;EACd,UAAU,aAAa,aAAa;IACnC,CAAC,WAAW,aAAa,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInitializer.js","names":[],"sources":["../../../src/hooks/useInitializer.ts"],"sourcesContent":["import { checkPackageUpdates } from '@lifi/sdk'\nimport { useEffect } from 'react'\nimport { name, version } from '../config/version.js'\nimport { useTools } from './useTools.js'\n\nlet checkedPackageUpdates = false\n\nexport const useInitializer = (): void => {\n useTools()\n useEffect(() => {\n if (!checkedPackageUpdates && process.env.NODE_ENV === 'development') {\n checkedPackageUpdates = true\n checkPackageUpdates(name, version)\n }\n }, [])\n}\n"],"mappings":";;;;;AAKA,IAAI,wBAAwB;AAE5B,MAAa,uBAA6B;
|
|
1
|
+
{"version":3,"file":"useInitializer.js","names":[],"sources":["../../../src/hooks/useInitializer.ts"],"sourcesContent":["import { checkPackageUpdates } from '@lifi/sdk'\nimport { useEffect } from 'react'\nimport { name, version } from '../config/version.js'\nimport { useTools } from './useTools.js'\n\nlet checkedPackageUpdates = false\n\nexport const useInitializer = (): void => {\n useTools()\n useEffect(() => {\n if (!checkedPackageUpdates && process.env.NODE_ENV === 'development') {\n checkedPackageUpdates = true\n checkPackageUpdates(name, version)\n }\n }, [])\n}\n"],"mappings":";;;;;AAKA,IAAI,wBAAwB;AAE5B,MAAa,uBAA6B;CACxC,UAAU;CACV,gBAAgB;EACd,IAAI,CAAC,yBAAyB,QAAQ,IAAI,aAAa,eAAe;GACpE,wBAAwB;GACxB,oBAAoB,MAAM,QAAQ;;IAEnC,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useIsBatchingSupported.js","names":[],"sources":["../../../src/hooks/useIsBatchingSupported.ts"],"sourcesContent":["import type { ExtendedChain } from '@lifi/sdk'\nimport { ChainType } from '@lifi/sdk'\nimport { useEthereumContext } from '@lifi/widget-provider'\nimport { useQuery } from '@tanstack/react-query'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { getQueryKey } from '../utils/queries.js'\n\nexport function useIsBatchingSupported(\n chain?: ExtendedChain,\n address?: string\n): {\n isBatchingSupported: boolean | undefined\n isBatchingSupportedLoading: boolean\n} {\n const { keyPrefix } = useWidgetConfig()\n const sdkClient = useSDKClient()\n const { isBatchingSupported } = useEthereumContext()\n\n const enabled = Boolean(\n chain && chain.chainType === ChainType.EVM && !!address\n )\n const { data, isLoading } = useQuery({\n queryKey: [\n getQueryKey('isBatchingSupported', keyPrefix),\n chain?.id,\n address,\n ],\n queryFn: () => {\n return (\n isBatchingSupported?.(sdkClient, {\n chainId: chain!.id,\n skipReady: true,\n }) ?? false\n )\n },\n enabled,\n staleTime: 3_600_000,\n retry: false,\n })\n\n return {\n isBatchingSupported: data,\n isBatchingSupportedLoading: enabled && isLoading,\n }\n}\n"],"mappings":";;;;;;;AAQA,SAAgB,uBACd,OACA,SAIA;CACA,MAAM,EAAE,cAAc,iBAAiB;CACvC,MAAM,YAAY,cAAc;CAChC,MAAM,EAAE,wBAAwB,oBAAoB;CAEpD,MAAM,UAAU,QACd,SAAS,MAAM,cAAc,UAAU,OAAO,CAAC,CAAC,QACjD;CACD,MAAM,EAAE,MAAM,cAAc,SAAS;EACnC,UAAU;GACR,YAAY,uBAAuB,UAAU;GAC7C,OAAO;GACP;GACD;EACD,eAAe;
|
|
1
|
+
{"version":3,"file":"useIsBatchingSupported.js","names":[],"sources":["../../../src/hooks/useIsBatchingSupported.ts"],"sourcesContent":["import type { ExtendedChain } from '@lifi/sdk'\nimport { ChainType } from '@lifi/sdk'\nimport { useEthereumContext } from '@lifi/widget-provider'\nimport { useQuery } from '@tanstack/react-query'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { getQueryKey } from '../utils/queries.js'\n\nexport function useIsBatchingSupported(\n chain?: ExtendedChain,\n address?: string\n): {\n isBatchingSupported: boolean | undefined\n isBatchingSupportedLoading: boolean\n} {\n const { keyPrefix } = useWidgetConfig()\n const sdkClient = useSDKClient()\n const { isBatchingSupported } = useEthereumContext()\n\n const enabled = Boolean(\n chain && chain.chainType === ChainType.EVM && !!address\n )\n const { data, isLoading } = useQuery({\n queryKey: [\n getQueryKey('isBatchingSupported', keyPrefix),\n chain?.id,\n address,\n ],\n queryFn: () => {\n return (\n isBatchingSupported?.(sdkClient, {\n chainId: chain!.id,\n skipReady: true,\n }) ?? false\n )\n },\n enabled,\n staleTime: 3_600_000,\n retry: false,\n })\n\n return {\n isBatchingSupported: data,\n isBatchingSupportedLoading: enabled && isLoading,\n }\n}\n"],"mappings":";;;;;;;AAQA,SAAgB,uBACd,OACA,SAIA;CACA,MAAM,EAAE,cAAc,iBAAiB;CACvC,MAAM,YAAY,cAAc;CAChC,MAAM,EAAE,wBAAwB,oBAAoB;CAEpD,MAAM,UAAU,QACd,SAAS,MAAM,cAAc,UAAU,OAAO,CAAC,CAAC,QACjD;CACD,MAAM,EAAE,MAAM,cAAc,SAAS;EACnC,UAAU;GACR,YAAY,uBAAuB,UAAU;GAC7C,OAAO;GACP;GACD;EACD,eAAe;GACb,OACE,sBAAsB,WAAW;IAC/B,SAAS,MAAO;IAChB,WAAW;IACZ,CAAC,IAAI;;EAGV;EACA,WAAW;EACX,OAAO;EACR,CAAC;CAEF,OAAO;EACL,qBAAqB;EACrB,4BAA4B,WAAW;EACxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useIsContractAddress.js","names":[],"sources":["../../../src/hooks/useIsContractAddress.ts"],"sourcesContent":["import { ChainType } from '@lifi/sdk'\nimport { useEthereumContext } from '@lifi/widget-provider'\nimport { useQuery } from '@tanstack/react-query'\n\nexport const useIsContractAddress = (\n address?: string,\n chainId?: number,\n chainType?: ChainType\n): {\n isContractAddress: boolean\n contractCode?: string\n isLoading: boolean\n isFetched: boolean\n} => {\n const { getBytecode } = useEthereumContext()\n\n const {\n data: contractCode,\n isLoading,\n isFetched,\n } = useQuery({\n queryKey: ['getBytecode', address, chainId],\n queryFn: async () => {\n const code = await getBytecode?.(chainId!, address!)\n return code ?? null\n },\n refetchInterval: 300_000,\n staleTime: 300_000,\n enabled:\n chainType === ChainType.EVM && !!chainId && !!address && !!getBytecode,\n })\n\n return {\n isContractAddress: !!contractCode,\n contractCode: contractCode ?? undefined,\n isLoading,\n isFetched,\n }\n}\n"],"mappings":";;;;AAIA,MAAa,wBACX,SACA,SACA,cAMG;CACH,MAAM,EAAE,gBAAgB,oBAAoB;CAE5C,MAAM,EACJ,MAAM,cACN,WACA,cACE,SAAS;EACX,UAAU;GAAC;GAAe;GAAS;GAAQ;EAC3C,SAAS,YAAY;
|
|
1
|
+
{"version":3,"file":"useIsContractAddress.js","names":[],"sources":["../../../src/hooks/useIsContractAddress.ts"],"sourcesContent":["import { ChainType } from '@lifi/sdk'\nimport { useEthereumContext } from '@lifi/widget-provider'\nimport { useQuery } from '@tanstack/react-query'\n\nexport const useIsContractAddress = (\n address?: string,\n chainId?: number,\n chainType?: ChainType\n): {\n isContractAddress: boolean\n contractCode?: string\n isLoading: boolean\n isFetched: boolean\n} => {\n const { getBytecode } = useEthereumContext()\n\n const {\n data: contractCode,\n isLoading,\n isFetched,\n } = useQuery({\n queryKey: ['getBytecode', address, chainId],\n queryFn: async () => {\n const code = await getBytecode?.(chainId!, address!)\n return code ?? null\n },\n refetchInterval: 300_000,\n staleTime: 300_000,\n enabled:\n chainType === ChainType.EVM && !!chainId && !!address && !!getBytecode,\n })\n\n return {\n isContractAddress: !!contractCode,\n contractCode: contractCode ?? undefined,\n isLoading,\n isFetched,\n }\n}\n"],"mappings":";;;;AAIA,MAAa,wBACX,SACA,SACA,cAMG;CACH,MAAM,EAAE,gBAAgB,oBAAoB;CAE5C,MAAM,EACJ,MAAM,cACN,WACA,cACE,SAAS;EACX,UAAU;GAAC;GAAe;GAAS;GAAQ;EAC3C,SAAS,YAAY;GAEnB,OAAO,MADY,cAAc,SAAU,QAAS,IACrC;;EAEjB,iBAAiB;EACjB,WAAW;EACX,SACE,cAAc,UAAU,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,CAAC;EAC9D,CAAC;CAEF,OAAO;EACL,mBAAmB,CAAC,CAAC;EACrB,cAAc,gBAAgB,KAAA;EAC9B;EACA;EACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLanguages.js","names":[],"sources":["../../../src/hooks/useLanguages.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { allLanguages } from '../providers/I18nProvider/constants.js'\nimport { loadLocale } from '../providers/I18nProvider/i18n.js'\nimport type {\n LanguageKey,\n LanguageResource,\n} from '../providers/I18nProvider/types.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { useSettings } from '../stores/settings/useSettings.js'\nimport { useSettingsActions } from '../stores/settings/useSettingsActions.js'\nimport { getConfigItemSets, isItemAllowedForSets } from '../utils/item.js'\n\nexport const useLanguages = (): {\n availableLanguages: LanguageKey[]\n selectedLanguageCode: LanguageKey | string\n setLanguageWithCode: (languageCode: LanguageKey) => void\n} => {\n const { i18n } = useTranslation()\n const { languages: languagesConfig, languageResources } = useWidgetConfig()\n const { language } = useSettings(['language'])\n const { setValues } = useSettingsActions()\n\n const sortedLanguages = useMemo(() => {\n const loadedLanguageKeys = Object.keys(i18n.store.data)\n // NB: custom language resources added statically to i18n might not exist in allLanguages (language files)\n const allLanguagesWithCustom = [\n ...new Set([...allLanguages, ...loadedLanguageKeys]),\n ]\n let supportedLanguages: (LanguageKey | string)[] = []\n if (!languagesConfig) {\n supportedLanguages = allLanguagesWithCustom\n } else {\n const languagesConfigSets = getConfigItemSets(\n languagesConfig,\n (languages) => new Set(languages)\n )\n supportedLanguages = allLanguagesWithCustom.filter((language) =>\n isItemAllowedForSets(language, languagesConfigSets)\n )\n }\n return supportedLanguages.sort()\n }, [languagesConfig, i18n.store.data])\n\n const handleLanguageChange = useCallback(\n async (languageKey: string) => {\n // Cache the language resource to prevent blinking\n // after switching languages and reloading the page.\n let newLanguageCache: LanguageResource | undefined\n if (\n !i18n.hasResourceBundle(languageKey, 'translation') &&\n languageKey !== 'en'\n ) {\n await loadLocale(\n languageKey as LanguageKey,\n languageResources?.[languageKey as LanguageKey]\n ).then((languageResource) => {\n i18n.addResourceBundle(\n languageKey,\n 'translation',\n languageResource,\n true,\n true\n )\n newLanguageCache = languageResource\n })\n } else {\n // If the language is already loaded, just cache the existing resource\n newLanguageCache = i18n.getResourceBundle(languageKey, 'translation')\n }\n\n // Set the new language and language cache to the settings store.\n setValues({ language: languageKey, languageCache: newLanguageCache })\n\n // Update the i18n instance to the new language.\n if (languageKey !== i18n.language) {\n await i18n.changeLanguage(languageKey)\n }\n },\n [i18n, languageResources, setValues]\n )\n\n const selectedLanguage = language || i18n.resolvedLanguage || ''\n const selectedLanguageCode = sortedLanguages.includes(selectedLanguage)\n ? selectedLanguage\n : languagesConfig?.default || 'en'\n\n return {\n availableLanguages: sortedLanguages as LanguageKey[],\n selectedLanguageCode: selectedLanguageCode,\n setLanguageWithCode: handleLanguageChange,\n }\n}\n"],"mappings":";;;;;;;;;AAaA,MAAa,qBAIR;CACH,MAAM,EAAE,SAAS,gBAAgB;CACjC,MAAM,EAAE,WAAW,iBAAiB,sBAAsB,iBAAiB;CAC3E,MAAM,EAAE,aAAa,YAAY,CAAC,WAAW,CAAC;CAC9C,MAAM,EAAE,cAAc,oBAAoB;CAE1C,MAAM,kBAAkB,cAAc;EACpC,MAAM,qBAAqB,OAAO,KAAK,KAAK,MAAM,KAAK;EAEvD,MAAM,yBAAyB,CAC7B,GAAG,IAAI,IAAI,CAAC,GAAG,cAAc,GAAG,mBAAmB,CAAC,CACrD;EACD,IAAI,qBAA+C,EAAE;
|
|
1
|
+
{"version":3,"file":"useLanguages.js","names":[],"sources":["../../../src/hooks/useLanguages.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { allLanguages } from '../providers/I18nProvider/constants.js'\nimport { loadLocale } from '../providers/I18nProvider/i18n.js'\nimport type {\n LanguageKey,\n LanguageResource,\n} from '../providers/I18nProvider/types.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { useSettings } from '../stores/settings/useSettings.js'\nimport { useSettingsActions } from '../stores/settings/useSettingsActions.js'\nimport { getConfigItemSets, isItemAllowedForSets } from '../utils/item.js'\n\nexport const useLanguages = (): {\n availableLanguages: LanguageKey[]\n selectedLanguageCode: LanguageKey | string\n setLanguageWithCode: (languageCode: LanguageKey) => void\n} => {\n const { i18n } = useTranslation()\n const { languages: languagesConfig, languageResources } = useWidgetConfig()\n const { language } = useSettings(['language'])\n const { setValues } = useSettingsActions()\n\n const sortedLanguages = useMemo(() => {\n const loadedLanguageKeys = Object.keys(i18n.store.data)\n // NB: custom language resources added statically to i18n might not exist in allLanguages (language files)\n const allLanguagesWithCustom = [\n ...new Set([...allLanguages, ...loadedLanguageKeys]),\n ]\n let supportedLanguages: (LanguageKey | string)[] = []\n if (!languagesConfig) {\n supportedLanguages = allLanguagesWithCustom\n } else {\n const languagesConfigSets = getConfigItemSets(\n languagesConfig,\n (languages) => new Set(languages)\n )\n supportedLanguages = allLanguagesWithCustom.filter((language) =>\n isItemAllowedForSets(language, languagesConfigSets)\n )\n }\n return supportedLanguages.sort()\n }, [languagesConfig, i18n.store.data])\n\n const handleLanguageChange = useCallback(\n async (languageKey: string) => {\n // Cache the language resource to prevent blinking\n // after switching languages and reloading the page.\n let newLanguageCache: LanguageResource | undefined\n if (\n !i18n.hasResourceBundle(languageKey, 'translation') &&\n languageKey !== 'en'\n ) {\n await loadLocale(\n languageKey as LanguageKey,\n languageResources?.[languageKey as LanguageKey]\n ).then((languageResource) => {\n i18n.addResourceBundle(\n languageKey,\n 'translation',\n languageResource,\n true,\n true\n )\n newLanguageCache = languageResource\n })\n } else {\n // If the language is already loaded, just cache the existing resource\n newLanguageCache = i18n.getResourceBundle(languageKey, 'translation')\n }\n\n // Set the new language and language cache to the settings store.\n setValues({ language: languageKey, languageCache: newLanguageCache })\n\n // Update the i18n instance to the new language.\n if (languageKey !== i18n.language) {\n await i18n.changeLanguage(languageKey)\n }\n },\n [i18n, languageResources, setValues]\n )\n\n const selectedLanguage = language || i18n.resolvedLanguage || ''\n const selectedLanguageCode = sortedLanguages.includes(selectedLanguage)\n ? selectedLanguage\n : languagesConfig?.default || 'en'\n\n return {\n availableLanguages: sortedLanguages as LanguageKey[],\n selectedLanguageCode: selectedLanguageCode,\n setLanguageWithCode: handleLanguageChange,\n }\n}\n"],"mappings":";;;;;;;;;AAaA,MAAa,qBAIR;CACH,MAAM,EAAE,SAAS,gBAAgB;CACjC,MAAM,EAAE,WAAW,iBAAiB,sBAAsB,iBAAiB;CAC3E,MAAM,EAAE,aAAa,YAAY,CAAC,WAAW,CAAC;CAC9C,MAAM,EAAE,cAAc,oBAAoB;CAE1C,MAAM,kBAAkB,cAAc;EACpC,MAAM,qBAAqB,OAAO,KAAK,KAAK,MAAM,KAAK;EAEvD,MAAM,yBAAyB,CAC7B,GAAG,IAAI,IAAI,CAAC,GAAG,cAAc,GAAG,mBAAmB,CAAC,CACrD;EACD,IAAI,qBAA+C,EAAE;EACrD,IAAI,CAAC,iBACH,qBAAqB;OAChB;GACL,MAAM,sBAAsB,kBAC1B,kBACC,cAAc,IAAI,IAAI,UAAU,CAClC;GACD,qBAAqB,uBAAuB,QAAQ,aAClD,qBAAqB,UAAU,oBAAoB,CACpD;;EAEH,OAAO,mBAAmB,MAAM;IAC/B,CAAC,iBAAiB,KAAK,MAAM,KAAK,CAAC;CAEtC,MAAM,uBAAuB,YAC3B,OAAO,gBAAwB;EAG7B,IAAI;EACJ,IACE,CAAC,KAAK,kBAAkB,aAAa,cAAc,IACnD,gBAAgB,MAEhB,MAAM,WACJ,aACA,oBAAoB,aACrB,CAAC,MAAM,qBAAqB;GAC3B,KAAK,kBACH,aACA,eACA,kBACA,MACA,KACD;GACD,mBAAmB;IACnB;OAGF,mBAAmB,KAAK,kBAAkB,aAAa,cAAc;EAIvE,UAAU;GAAE,UAAU;GAAa,eAAe;GAAkB,CAAC;EAGrE,IAAI,gBAAgB,KAAK,UACvB,MAAM,KAAK,eAAe,YAAY;IAG1C;EAAC;EAAM;EAAmB;EAAU,CACrC;CAED,MAAM,mBAAmB,YAAY,KAAK,oBAAoB;CAK9D,OAAO;EACL,oBAAoB;EACpB,sBAN2B,gBAAgB,SAAS,iBAAiB,GACnE,mBACA,iBAAiB,WAAW;EAK9B,qBAAqB;EACtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useListHeight.js","names":[],"sources":["../../../src/hooks/useListHeight.ts"],"sourcesContent":["import { debounce, useTheme } from '@mui/material'\nimport type { RefObject } from 'react'\nimport { useLayoutEffect, useState } from 'react'\nimport {\n ElementId,\n getAppContainer,\n getHeaderElement,\n getScrollableContainer,\n} from '../utils/elements.js'\nimport { useDefaultElementId } from './useDefaultElementId.js'\n\nconst getContentHeight = (\n elementId: string,\n listParentRef: RefObject<HTMLUListElement | HTMLDivElement | null>\n) => {\n const containerElement = getScrollableContainer(elementId)\n\n const headerElement = getHeaderElement(elementId)\n\n const listParentElement = listParentRef?.current\n\n let oldHeight: string | undefined\n\n // This covers the case where in full height flex mode when the browser height is reduced\n // - this allows a virtualised list to be made smaller\n if (listParentElement) {\n oldHeight = listParentElement.style.height\n listParentElement.style.height = '0'\n }\n\n if (!containerElement || !headerElement) {\n console.warn(\n `Can't find ${ElementId.ScrollableContainer} or ${ElementId.Header} id.`\n )\n return 0\n }\n const { height: containerHeight } = containerElement.getBoundingClientRect()\n const { height: headerHeight } = headerElement.getBoundingClientRect()\n\n // This covers the case where in full height flex mode when the browser height is reduced the\n // - this allows a virtualised list to be set to minimum size\n if (listParentElement && oldHeight) {\n listParentElement.style.height = oldHeight\n }\n\n return containerHeight - headerHeight\n}\n\ninterface UseContentHeightProps {\n listParentRef: RefObject<HTMLUListElement | HTMLDivElement | null>\n headerRef?: RefObject<HTMLElement | null>\n}\n\nconst defaultMinListHeight = 360\nconst minMobileListHeight = 160\n\n// NOTE: this hook is implicitly tied to the widget height functionality in the\n// AppExpandedContainer, RelativeContainer and CssBaselineContainer components as defined in AppContainer.ts\n// CSS changes in those components can have implications for the functionality in this hook\n\nexport const useListHeight = ({\n listParentRef,\n headerRef,\n}: UseContentHeightProps): { listHeight: number } => {\n const elementId = useDefaultElementId() ?? ''\n const [contentHeight, setContentHeight] = useState<number>(0)\n const theme = useTheme()\n\n useLayoutEffect(() => {\n const handleResize = () => {\n setContentHeight(getContentHeight(elementId, listParentRef))\n }\n\n const processResize = debounce(() => handleResize(), 40)\n\n // calling this on initial mount prevents the lists resizing appearing glitchy\n handleResize()\n\n const appContainer = getAppContainer(elementId)\n\n let resizeObserver: ResizeObserver\n if (appContainer) {\n resizeObserver = new ResizeObserver(processResize)\n resizeObserver.observe(appContainer)\n }\n\n return () => {\n if (resizeObserver) {\n resizeObserver.disconnect()\n }\n }\n }, [elementId, listParentRef])\n\n const minListHeight =\n theme.container?.height === '100%'\n ? minMobileListHeight\n : defaultMinListHeight\n\n const listHeight = Math.max(\n contentHeight - (headerRef?.current?.offsetHeight ?? 0),\n minListHeight\n )\n\n return {\n listHeight,\n }\n}\n"],"mappings":";;;;;AAWA,MAAM,oBACJ,WACA,kBACG;CACH,MAAM,mBAAmB,uBAAuB,UAAU;CAE1D,MAAM,gBAAgB,iBAAiB,UAAU;CAEjD,MAAM,oBAAoB,eAAe;CAEzC,IAAI;
|
|
1
|
+
{"version":3,"file":"useListHeight.js","names":[],"sources":["../../../src/hooks/useListHeight.ts"],"sourcesContent":["import { debounce, useTheme } from '@mui/material'\nimport type { RefObject } from 'react'\nimport { useLayoutEffect, useState } from 'react'\nimport {\n ElementId,\n getAppContainer,\n getHeaderElement,\n getScrollableContainer,\n} from '../utils/elements.js'\nimport { useDefaultElementId } from './useDefaultElementId.js'\n\nconst getContentHeight = (\n elementId: string,\n listParentRef: RefObject<HTMLUListElement | HTMLDivElement | null>\n) => {\n const containerElement = getScrollableContainer(elementId)\n\n const headerElement = getHeaderElement(elementId)\n\n const listParentElement = listParentRef?.current\n\n let oldHeight: string | undefined\n\n // This covers the case where in full height flex mode when the browser height is reduced\n // - this allows a virtualised list to be made smaller\n if (listParentElement) {\n oldHeight = listParentElement.style.height\n listParentElement.style.height = '0'\n }\n\n if (!containerElement || !headerElement) {\n console.warn(\n `Can't find ${ElementId.ScrollableContainer} or ${ElementId.Header} id.`\n )\n return 0\n }\n const { height: containerHeight } = containerElement.getBoundingClientRect()\n const { height: headerHeight } = headerElement.getBoundingClientRect()\n\n // This covers the case where in full height flex mode when the browser height is reduced the\n // - this allows a virtualised list to be set to minimum size\n if (listParentElement && oldHeight) {\n listParentElement.style.height = oldHeight\n }\n\n return containerHeight - headerHeight\n}\n\ninterface UseContentHeightProps {\n listParentRef: RefObject<HTMLUListElement | HTMLDivElement | null>\n headerRef?: RefObject<HTMLElement | null>\n}\n\nconst defaultMinListHeight = 360\nconst minMobileListHeight = 160\n\n// NOTE: this hook is implicitly tied to the widget height functionality in the\n// AppExpandedContainer, RelativeContainer and CssBaselineContainer components as defined in AppContainer.ts\n// CSS changes in those components can have implications for the functionality in this hook\n\nexport const useListHeight = ({\n listParentRef,\n headerRef,\n}: UseContentHeightProps): { listHeight: number } => {\n const elementId = useDefaultElementId() ?? ''\n const [contentHeight, setContentHeight] = useState<number>(0)\n const theme = useTheme()\n\n useLayoutEffect(() => {\n const handleResize = () => {\n setContentHeight(getContentHeight(elementId, listParentRef))\n }\n\n const processResize = debounce(() => handleResize(), 40)\n\n // calling this on initial mount prevents the lists resizing appearing glitchy\n handleResize()\n\n const appContainer = getAppContainer(elementId)\n\n let resizeObserver: ResizeObserver\n if (appContainer) {\n resizeObserver = new ResizeObserver(processResize)\n resizeObserver.observe(appContainer)\n }\n\n return () => {\n if (resizeObserver) {\n resizeObserver.disconnect()\n }\n }\n }, [elementId, listParentRef])\n\n const minListHeight =\n theme.container?.height === '100%'\n ? minMobileListHeight\n : defaultMinListHeight\n\n const listHeight = Math.max(\n contentHeight - (headerRef?.current?.offsetHeight ?? 0),\n minListHeight\n )\n\n return {\n listHeight,\n }\n}\n"],"mappings":";;;;;AAWA,MAAM,oBACJ,WACA,kBACG;CACH,MAAM,mBAAmB,uBAAuB,UAAU;CAE1D,MAAM,gBAAgB,iBAAiB,UAAU;CAEjD,MAAM,oBAAoB,eAAe;CAEzC,IAAI;CAIJ,IAAI,mBAAmB;EACrB,YAAY,kBAAkB,MAAM;EACpC,kBAAkB,MAAM,SAAS;;CAGnC,IAAI,CAAC,oBAAoB,CAAC,eAAe;EACvC,QAAQ,KACN,8DACD;EACD,OAAO;;CAET,MAAM,EAAE,QAAQ,oBAAoB,iBAAiB,uBAAuB;CAC5E,MAAM,EAAE,QAAQ,iBAAiB,cAAc,uBAAuB;CAItE,IAAI,qBAAqB,WACvB,kBAAkB,MAAM,SAAS;CAGnC,OAAO,kBAAkB;;AAQ3B,MAAM,uBAAuB;AAC7B,MAAM,sBAAsB;AAM5B,MAAa,iBAAiB,EAC5B,eACA,gBACmD;CACnD,MAAM,YAAY,qBAAqB,IAAI;CAC3C,MAAM,CAAC,eAAe,oBAAoB,SAAiB,EAAE;CAC7D,MAAM,QAAQ,UAAU;CAExB,sBAAsB;EACpB,MAAM,qBAAqB;GACzB,iBAAiB,iBAAiB,WAAW,cAAc,CAAC;;EAG9D,MAAM,gBAAgB,eAAe,cAAc,EAAE,GAAG;EAGxD,cAAc;EAEd,MAAM,eAAe,gBAAgB,UAAU;EAE/C,IAAI;EACJ,IAAI,cAAc;GAChB,iBAAiB,IAAI,eAAe,cAAc;GAClD,eAAe,QAAQ,aAAa;;EAGtC,aAAa;GACX,IAAI,gBACF,eAAe,YAAY;;IAG9B,CAAC,WAAW,cAAc,CAAC;CAE9B,MAAM,gBACJ,MAAM,WAAW,WAAW,SACxB,sBACA;CAON,OAAO,EACL,YANiB,KAAK,IACtB,iBAAiB,WAAW,SAAS,gBAAgB,IACrD,cAIU,EACX"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLongPress.js","names":[],"sources":["../../../src/hooks/useLongPress.ts"],"sourcesContent":["import { useCallback, useRef } from 'react'\n\nexport const useLongPress = (\n callback: () => void = () => {},\n ms: number = 500\n): {\n onPointerDown: (e: React.PointerEvent) => void\n onPointerUp: () => void\n onPointerLeave: () => void\n onPointerCancel: () => void\n onPointerMove: (e: React.PointerEvent) => void\n} => {\n const timerRef = useRef<NodeJS.Timeout | null>(null)\n const isPressedRef = useRef(false)\n const startPosRef = useRef<{ x: number; y: number } | null>(null)\n\n const start = useCallback(\n (e: React.PointerEvent) => {\n isPressedRef.current = true\n startPosRef.current = { x: e.clientX, y: e.clientY }\n timerRef.current = setTimeout(() => {\n if (isPressedRef.current) {\n callback()\n }\n }, ms)\n },\n [callback, ms]\n )\n\n const clear = useCallback(() => {\n isPressedRef.current = false\n startPosRef.current = null\n if (timerRef.current) {\n clearTimeout(timerRef.current)\n }\n }, [])\n\n // Based on https://github.com/minwork/react/tree/main/packages/use-long-press\n const move = useCallback(\n (e: React.PointerEvent) => {\n if (isPressedRef.current && startPosRef.current) {\n const dx = Math.abs(e.clientX - startPosRef.current.x)\n const dy = Math.abs(e.clientY - startPosRef.current.y)\n const limit = 25\n if (dx > limit || dy > limit) {\n clear() // cancel on movement\n }\n }\n },\n [clear]\n )\n\n return {\n onPointerDown: start,\n onPointerUp: clear,\n onPointerLeave: clear,\n onPointerCancel: clear,\n onPointerMove: move,\n }\n}\n"],"mappings":";;AAEA,MAAa,gBACX,iBAA6B,IAC7B,KAAa,QAOV;CACH,MAAM,WAAW,OAA8B,KAAK;CACpD,MAAM,eAAe,OAAO,MAAM;CAClC,MAAM,cAAc,OAAwC,KAAK;CAEjE,MAAM,QAAQ,aACX,MAA0B;
|
|
1
|
+
{"version":3,"file":"useLongPress.js","names":[],"sources":["../../../src/hooks/useLongPress.ts"],"sourcesContent":["import { useCallback, useRef } from 'react'\n\nexport const useLongPress = (\n callback: () => void = () => {},\n ms: number = 500\n): {\n onPointerDown: (e: React.PointerEvent) => void\n onPointerUp: () => void\n onPointerLeave: () => void\n onPointerCancel: () => void\n onPointerMove: (e: React.PointerEvent) => void\n} => {\n const timerRef = useRef<NodeJS.Timeout | null>(null)\n const isPressedRef = useRef(false)\n const startPosRef = useRef<{ x: number; y: number } | null>(null)\n\n const start = useCallback(\n (e: React.PointerEvent) => {\n isPressedRef.current = true\n startPosRef.current = { x: e.clientX, y: e.clientY }\n timerRef.current = setTimeout(() => {\n if (isPressedRef.current) {\n callback()\n }\n }, ms)\n },\n [callback, ms]\n )\n\n const clear = useCallback(() => {\n isPressedRef.current = false\n startPosRef.current = null\n if (timerRef.current) {\n clearTimeout(timerRef.current)\n }\n }, [])\n\n // Based on https://github.com/minwork/react/tree/main/packages/use-long-press\n const move = useCallback(\n (e: React.PointerEvent) => {\n if (isPressedRef.current && startPosRef.current) {\n const dx = Math.abs(e.clientX - startPosRef.current.x)\n const dy = Math.abs(e.clientY - startPosRef.current.y)\n const limit = 25\n if (dx > limit || dy > limit) {\n clear() // cancel on movement\n }\n }\n },\n [clear]\n )\n\n return {\n onPointerDown: start,\n onPointerUp: clear,\n onPointerLeave: clear,\n onPointerCancel: clear,\n onPointerMove: move,\n }\n}\n"],"mappings":";;AAEA,MAAa,gBACX,iBAA6B,IAC7B,KAAa,QAOV;CACH,MAAM,WAAW,OAA8B,KAAK;CACpD,MAAM,eAAe,OAAO,MAAM;CAClC,MAAM,cAAc,OAAwC,KAAK;CAEjE,MAAM,QAAQ,aACX,MAA0B;EACzB,aAAa,UAAU;EACvB,YAAY,UAAU;GAAE,GAAG,EAAE;GAAS,GAAG,EAAE;GAAS;EACpD,SAAS,UAAU,iBAAiB;GAClC,IAAI,aAAa,SACf,UAAU;KAEX,GAAG;IAER,CAAC,UAAU,GAAG,CACf;CAED,MAAM,QAAQ,kBAAkB;EAC9B,aAAa,UAAU;EACvB,YAAY,UAAU;EACtB,IAAI,SAAS,SACX,aAAa,SAAS,QAAQ;IAE/B,EAAE,CAAC;CAiBN,OAAO;EACL,eAAe;EACf,aAAa;EACb,gBAAgB;EAChB,iBAAiB;EACjB,eAnBW,aACV,MAA0B;GACzB,IAAI,aAAa,WAAW,YAAY,SAAS;IAC/C,MAAM,KAAK,KAAK,IAAI,EAAE,UAAU,YAAY,QAAQ,EAAE;IACtD,MAAM,KAAK,KAAK,IAAI,EAAE,UAAU,YAAY,QAAQ,EAAE;IACtD,MAAM,QAAQ;IACd,IAAI,KAAK,SAAS,KAAK,OACrB,OAAO;;KAIb,CAAC,MAAM,CAQY;EACpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNavigateBack.js","names":[],"sources":["../../../src/hooks/useNavigateBack.ts"],"sourcesContent":["import { useRouter } from '@tanstack/react-router'\nimport { useCallback } from 'react'\nimport { navigationRoutes } from '../utils/navigationRoutes.js'\n\nexport const useNavigateBack = (): (() => void) => {\n const router = useRouter()\n\n const navigateBack = useCallback(() => {\n if (router.history.length > 1) {\n router.history.go(-1)\n } else {\n router.navigate({ to: navigationRoutes.home, replace: true })\n }\n }, [router])\n\n return navigateBack\n}\n"],"mappings":";;;;AAIA,MAAa,wBAAsC;CACjD,MAAM,SAAS,WAAW;
|
|
1
|
+
{"version":3,"file":"useNavigateBack.js","names":[],"sources":["../../../src/hooks/useNavigateBack.ts"],"sourcesContent":["import { useRouter } from '@tanstack/react-router'\nimport { useCallback } from 'react'\nimport { navigationRoutes } from '../utils/navigationRoutes.js'\n\nexport const useNavigateBack = (): (() => void) => {\n const router = useRouter()\n\n const navigateBack = useCallback(() => {\n if (router.history.length > 1) {\n router.history.go(-1)\n } else {\n router.navigate({ to: navigationRoutes.home, replace: true })\n }\n }, [router])\n\n return navigateBack\n}\n"],"mappings":";;;;AAIA,MAAa,wBAAsC;CACjD,MAAM,SAAS,WAAW;CAU1B,OARqB,kBAAkB;EACrC,IAAI,OAAO,QAAQ,SAAS,GAC1B,OAAO,QAAQ,GAAG,GAAG;OAErB,OAAO,SAAS;GAAE,IAAI,iBAAiB;GAAM,SAAS;GAAM,CAAC;IAE9D,CAAC,OAAO,CAEQ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRouteExecution.js","names":[],"sources":["../../../src/hooks/useRouteExecution.ts"],"sourcesContent":["import type { ExchangeRateUpdateParams, Route, RouteExtended } from '@lifi/sdk'\nimport { executeRoute, resumeRoute, updateRouteExecution } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useCallback, useEffect, useRef } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport {\n useRouteExecutionStore,\n useRouteExecutionStoreContext,\n} from '../stores/routes/RouteExecutionStore.js'\nimport type { RouteExecutionStatus } from '../stores/routes/types.js'\nimport {\n getUpdatedAction,\n isRouteActive,\n isRouteDone,\n isRouteFailed,\n} from '../stores/routes/utils.js'\nimport { WidgetEvent } from '../types/events.js'\nimport { getQueryKey } from '../utils/queries.js'\nimport { useWidgetEvents } from './useWidgetEvents.js'\n\ninterface RouteExecutionProps {\n routeId: string\n executeInBackground?: boolean\n onAcceptExchangeRateUpdate?(\n resolver: (value: boolean) => void,\n data: ExchangeRateUpdateParams\n ): void\n}\n\nexport const useRouteExecution = ({\n routeId,\n executeInBackground,\n onAcceptExchangeRateUpdate,\n}: RouteExecutionProps): {\n executeRoute: () => void\n restartRoute: () => void\n deleteRoute: () => void\n route: RouteExtended | undefined\n status: RouteExecutionStatus | undefined\n} => {\n const queryClient = useQueryClient()\n const { account } = useAccount()\n const resumedAfterMount = useRef(false)\n const { keyPrefix } = useWidgetConfig()\n const sdkClient = useSDKClient()\n const emitter = useWidgetEvents()\n const routeExecutionStoreContext = useRouteExecutionStoreContext()\n const routeExecution = useRouteExecutionStore(\n (state) => state.routes[routeId]\n )\n const [updateRoute, deleteRoute] = useRouteExecutionStore((state) => [\n state.updateRoute,\n state.deleteRoute,\n ])\n\n const updateRouteHook = (updatedRoute: Route) => {\n const routeExecution =\n routeExecutionStoreContext.getState().routes[updatedRoute.id]\n if (!routeExecution) {\n return\n }\n const clonedUpdatedRoute = structuredClone(updatedRoute)\n updateRoute(clonedUpdatedRoute)\n const action = getUpdatedAction(routeExecution.route, clonedUpdatedRoute)\n if (action) {\n emitter.emit(WidgetEvent.RouteExecutionUpdated, {\n route: clonedUpdatedRoute,\n action,\n })\n }\n const executionCompleted = isRouteDone(clonedUpdatedRoute)\n const executionFailed = isRouteFailed(clonedUpdatedRoute)\n if (executionCompleted) {\n emitter.emit(WidgetEvent.RouteExecutionCompleted, clonedUpdatedRoute)\n }\n if (executionFailed && action) {\n emitter.emit(WidgetEvent.RouteExecutionFailed, {\n route: clonedUpdatedRoute,\n action,\n })\n }\n if (executionCompleted || executionFailed) {\n const invalidateKeys = [\n [\n getQueryKey('token-balances', keyPrefix),\n clonedUpdatedRoute.fromAddress,\n clonedUpdatedRoute.fromChainId,\n ],\n [\n getQueryKey('token-balances', keyPrefix),\n clonedUpdatedRoute.toAddress,\n clonedUpdatedRoute.toChainId,\n ],\n [getQueryKey('transaction-history', keyPrefix)],\n ]\n for (const key of invalidateKeys) {\n queryClient.invalidateQueries(\n {\n queryKey: key,\n exact: false,\n refetchType: 'all',\n },\n { cancelRefetch: false }\n )\n }\n }\n // biome-ignore lint/suspicious/noConsole: logs route information\n console.log('Route updated.', clonedUpdatedRoute)\n }\n\n const acceptExchangeRateUpdateHook = async (\n params: ExchangeRateUpdateParams\n ) => {\n if (!onAcceptExchangeRateUpdate) {\n return false\n }\n\n const accepted = await new Promise<boolean>((resolve) =>\n onAcceptExchangeRateUpdate(resolve, params)\n )\n\n return accepted\n }\n\n const executeRouteMutation = useMutation({\n mutationFn: () => {\n if (!account.isConnected) {\n throw new Error('Account is not connected.')\n }\n if (!routeExecution?.route) {\n throw new Error('Execution route not found.')\n }\n queryClient.removeQueries({\n queryKey: [getQueryKey('routes', keyPrefix)],\n exact: false,\n })\n return executeRoute(sdkClient, routeExecution.route, {\n updateRouteHook,\n acceptExchangeRateUpdateHook,\n executeInBackground,\n ...sdkClient.config?.executionOptions,\n })\n },\n onMutate: () => {\n // biome-ignore lint/suspicious/noConsole: logs route information\n console.log('Execution started.', routeId)\n if (routeExecution) {\n emitter.emit(WidgetEvent.RouteExecutionStarted, routeExecution.route)\n }\n },\n })\n\n const resumeRouteMutation = useMutation({\n mutationFn: (resumedRoute?: Route) => {\n if (!account.isConnected) {\n throw new Error('Account is not connected.')\n }\n if (!routeExecution?.route) {\n throw new Error('Execution route not found.')\n }\n return resumeRoute(sdkClient, resumedRoute ?? routeExecution.route, {\n updateRouteHook,\n acceptExchangeRateUpdateHook,\n executeInBackground,\n })\n },\n onMutate: () => {\n // biome-ignore lint/suspicious/noConsole: logs route information\n console.log('Resumed to execution.', routeId)\n },\n })\n\n const _executeRoute = useCallback(() => {\n executeRouteMutation.mutateAsync(undefined, {\n onError: (error) => {\n console.warn('Execution failed!', routeId, error)\n },\n onSuccess: (route: Route) => {\n // biome-ignore lint/suspicious/noConsole: logs route information\n console.log('Executed successfully!', route)\n },\n })\n }, [executeRouteMutation, routeId])\n\n const _resumeRoute = useCallback(\n (route?: Route) => {\n resumeRouteMutation.mutateAsync(route, {\n onError: (error) => {\n console.warn('Resumed execution failed.', routeId, error)\n },\n onSuccess: (route) => {\n // biome-ignore lint/suspicious/noConsole: logs route information\n console.log('Resumed execution successful.', route)\n },\n })\n },\n [resumeRouteMutation, routeId]\n )\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: run only when routeId changes\n const restartRouteMutation = useCallback(() => {\n _resumeRoute(routeExecution?.route)\n }, [_resumeRoute, routeExecution?.route, routeId])\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: run only when routeId changes\n const deleteRouteMutation = useCallback(() => {\n deleteRoute(routeId)\n }, [routeId])\n\n // Resume route execution after page reload\n // biome-ignore lint/correctness/useExhaustiveDependencies: run only when routeId changes\n useEffect(() => {\n // Check if route is eligible for automatic resuming\n const route = routeExecutionStoreContext.getState().routes[routeId]?.route\n if (\n isRouteActive(route) &&\n account.isConnected &&\n !resumedAfterMount.current\n ) {\n resumedAfterMount.current = true\n _resumeRoute()\n }\n\n // Move execution to background on unmount\n return () => {\n const route = routeExecutionStoreContext.getState().routes[routeId]?.route\n if (!route || !isRouteActive(route)) {\n return\n }\n updateRouteExecution(route, { executeInBackground: true })\n // biome-ignore lint/suspicious/noConsole: logs route information\n console.log('Move route execution to background.', routeId)\n resumedAfterMount.current = false\n }\n }, [account.isConnected, routeExecutionStoreContext, routeId])\n\n return {\n executeRoute: _executeRoute,\n restartRoute: restartRouteMutation,\n deleteRoute: deleteRouteMutation,\n route: routeExecution?.route,\n status: routeExecution?.status,\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useRouteExecution.js","names":[],"sources":["../../../src/hooks/useRouteExecution.ts"],"sourcesContent":["import type { ExchangeRateUpdateParams, Route, RouteExtended } from '@lifi/sdk'\nimport { executeRoute, resumeRoute, updateRouteExecution } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useCallback, useEffect, useRef } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport {\n useRouteExecutionStore,\n useRouteExecutionStoreContext,\n} from '../stores/routes/RouteExecutionStore.js'\nimport type { RouteExecutionStatus } from '../stores/routes/types.js'\nimport {\n getUpdatedAction,\n isRouteActive,\n isRouteDone,\n isRouteFailed,\n} from '../stores/routes/utils.js'\nimport { WidgetEvent } from '../types/events.js'\nimport { getQueryKey } from '../utils/queries.js'\nimport { useWidgetEvents } from './useWidgetEvents.js'\n\ninterface RouteExecutionProps {\n routeId: string\n executeInBackground?: boolean\n onAcceptExchangeRateUpdate?(\n resolver: (value: boolean) => void,\n data: ExchangeRateUpdateParams\n ): void\n}\n\nexport const useRouteExecution = ({\n routeId,\n executeInBackground,\n onAcceptExchangeRateUpdate,\n}: RouteExecutionProps): {\n executeRoute: () => void\n restartRoute: () => void\n deleteRoute: () => void\n route: RouteExtended | undefined\n status: RouteExecutionStatus | undefined\n} => {\n const queryClient = useQueryClient()\n const { account } = useAccount()\n const resumedAfterMount = useRef(false)\n const { keyPrefix } = useWidgetConfig()\n const sdkClient = useSDKClient()\n const emitter = useWidgetEvents()\n const routeExecutionStoreContext = useRouteExecutionStoreContext()\n const routeExecution = useRouteExecutionStore(\n (state) => state.routes[routeId]\n )\n const [updateRoute, deleteRoute] = useRouteExecutionStore((state) => [\n state.updateRoute,\n state.deleteRoute,\n ])\n\n const updateRouteHook = (updatedRoute: Route) => {\n const routeExecution =\n routeExecutionStoreContext.getState().routes[updatedRoute.id]\n if (!routeExecution) {\n return\n }\n const clonedUpdatedRoute = structuredClone(updatedRoute)\n updateRoute(clonedUpdatedRoute)\n const action = getUpdatedAction(routeExecution.route, clonedUpdatedRoute)\n if (action) {\n emitter.emit(WidgetEvent.RouteExecutionUpdated, {\n route: clonedUpdatedRoute,\n action,\n })\n }\n const executionCompleted = isRouteDone(clonedUpdatedRoute)\n const executionFailed = isRouteFailed(clonedUpdatedRoute)\n if (executionCompleted) {\n emitter.emit(WidgetEvent.RouteExecutionCompleted, clonedUpdatedRoute)\n }\n if (executionFailed && action) {\n emitter.emit(WidgetEvent.RouteExecutionFailed, {\n route: clonedUpdatedRoute,\n action,\n })\n }\n if (executionCompleted || executionFailed) {\n const invalidateKeys = [\n [\n getQueryKey('token-balances', keyPrefix),\n clonedUpdatedRoute.fromAddress,\n clonedUpdatedRoute.fromChainId,\n ],\n [\n getQueryKey('token-balances', keyPrefix),\n clonedUpdatedRoute.toAddress,\n clonedUpdatedRoute.toChainId,\n ],\n [getQueryKey('transaction-history', keyPrefix)],\n ]\n for (const key of invalidateKeys) {\n queryClient.invalidateQueries(\n {\n queryKey: key,\n exact: false,\n refetchType: 'all',\n },\n { cancelRefetch: false }\n )\n }\n }\n // biome-ignore lint/suspicious/noConsole: logs route information\n console.log('Route updated.', clonedUpdatedRoute)\n }\n\n const acceptExchangeRateUpdateHook = async (\n params: ExchangeRateUpdateParams\n ) => {\n if (!onAcceptExchangeRateUpdate) {\n return false\n }\n\n const accepted = await new Promise<boolean>((resolve) =>\n onAcceptExchangeRateUpdate(resolve, params)\n )\n\n return accepted\n }\n\n const executeRouteMutation = useMutation({\n mutationFn: () => {\n if (!account.isConnected) {\n throw new Error('Account is not connected.')\n }\n if (!routeExecution?.route) {\n throw new Error('Execution route not found.')\n }\n queryClient.removeQueries({\n queryKey: [getQueryKey('routes', keyPrefix)],\n exact: false,\n })\n return executeRoute(sdkClient, routeExecution.route, {\n updateRouteHook,\n acceptExchangeRateUpdateHook,\n executeInBackground,\n ...sdkClient.config?.executionOptions,\n })\n },\n onMutate: () => {\n // biome-ignore lint/suspicious/noConsole: logs route information\n console.log('Execution started.', routeId)\n if (routeExecution) {\n emitter.emit(WidgetEvent.RouteExecutionStarted, routeExecution.route)\n }\n },\n })\n\n const resumeRouteMutation = useMutation({\n mutationFn: (resumedRoute?: Route) => {\n if (!account.isConnected) {\n throw new Error('Account is not connected.')\n }\n if (!routeExecution?.route) {\n throw new Error('Execution route not found.')\n }\n return resumeRoute(sdkClient, resumedRoute ?? routeExecution.route, {\n updateRouteHook,\n acceptExchangeRateUpdateHook,\n executeInBackground,\n })\n },\n onMutate: () => {\n // biome-ignore lint/suspicious/noConsole: logs route information\n console.log('Resumed to execution.', routeId)\n },\n })\n\n const _executeRoute = useCallback(() => {\n executeRouteMutation.mutateAsync(undefined, {\n onError: (error) => {\n console.warn('Execution failed!', routeId, error)\n },\n onSuccess: (route: Route) => {\n // biome-ignore lint/suspicious/noConsole: logs route information\n console.log('Executed successfully!', route)\n },\n })\n }, [executeRouteMutation, routeId])\n\n const _resumeRoute = useCallback(\n (route?: Route) => {\n resumeRouteMutation.mutateAsync(route, {\n onError: (error) => {\n console.warn('Resumed execution failed.', routeId, error)\n },\n onSuccess: (route) => {\n // biome-ignore lint/suspicious/noConsole: logs route information\n console.log('Resumed execution successful.', route)\n },\n })\n },\n [resumeRouteMutation, routeId]\n )\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: run only when routeId changes\n const restartRouteMutation = useCallback(() => {\n _resumeRoute(routeExecution?.route)\n }, [_resumeRoute, routeExecution?.route, routeId])\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: run only when routeId changes\n const deleteRouteMutation = useCallback(() => {\n deleteRoute(routeId)\n }, [routeId])\n\n // Resume route execution after page reload\n // biome-ignore lint/correctness/useExhaustiveDependencies: run only when routeId changes\n useEffect(() => {\n // Check if route is eligible for automatic resuming\n const route = routeExecutionStoreContext.getState().routes[routeId]?.route\n if (\n isRouteActive(route) &&\n account.isConnected &&\n !resumedAfterMount.current\n ) {\n resumedAfterMount.current = true\n _resumeRoute()\n }\n\n // Move execution to background on unmount\n return () => {\n const route = routeExecutionStoreContext.getState().routes[routeId]?.route\n if (!route || !isRouteActive(route)) {\n return\n }\n updateRouteExecution(route, { executeInBackground: true })\n // biome-ignore lint/suspicious/noConsole: logs route information\n console.log('Move route execution to background.', routeId)\n resumedAfterMount.current = false\n }\n }, [account.isConnected, routeExecutionStoreContext, routeId])\n\n return {\n executeRoute: _executeRoute,\n restartRoute: restartRouteMutation,\n deleteRoute: deleteRouteMutation,\n route: routeExecution?.route,\n status: routeExecution?.status,\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRouteRequiredAccountConnection.js","names":[],"sources":["../../../src/hooks/useRouteRequiredAccountConnection.ts"],"sourcesContent":["import type { ExtendedChain, Route } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport { useMemo } from 'react'\nimport { useFieldValues } from '../stores/form/useFieldValues.js'\nimport { useChain } from './useChain.js'\n\nexport const useRouteRequiredAccountConnection = (\n route?: Route,\n chain?: ExtendedChain\n): {\n connected: boolean\n missingChain?: ExtendedChain\n missingAccountAddress?: string\n} => {\n const { account, accounts } = useAccount({ chainType: chain?.chainType })\n const [toAddress] = useFieldValues('toAddress')\n const { getChainById } = useChain()\n\n return useMemo(() => {\n if (!route?.steps.length) {\n return {\n connected: account.isConnected,\n }\n }\n\n const connectedChainTypes = new Map(\n accounts\n .filter((account) => account.isConnected && account.address)\n .map((account) => [account.chainType, account])\n )\n\n if (!connectedChainTypes.size) {\n return {\n connected: false,\n }\n }\n\n for (const step of route.steps) {\n const chain = getChainById(step.action.fromChainId)\n if (!chain) {\n continue\n }\n\n const connectedAccount = connectedChainTypes.get(chain.chainType)\n const isToAddressSatisfied = toAddress\n ? connectedAccount?.address === step.action.fromAddress\n : true\n\n if (!connectedAccount || !isToAddressSatisfied) {\n return {\n connected: false,\n missingChain: chain,\n missingAccountAddress: !isToAddressSatisfied\n ? step.action.fromAddress\n : undefined,\n }\n }\n }\n\n return { connected: true }\n }, [account.isConnected, route, accounts, getChainById, toAddress])\n}\n"],"mappings":";;;;;AAMA,MAAa,qCACX,OACA,UAKG;CACH,MAAM,EAAE,SAAS,aAAa,WAAW,EAAE,WAAW,OAAO,WAAW,CAAC;CACzE,MAAM,CAAC,aAAa,eAAe,YAAY;CAC/C,MAAM,EAAE,iBAAiB,UAAU;
|
|
1
|
+
{"version":3,"file":"useRouteRequiredAccountConnection.js","names":[],"sources":["../../../src/hooks/useRouteRequiredAccountConnection.ts"],"sourcesContent":["import type { ExtendedChain, Route } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport { useMemo } from 'react'\nimport { useFieldValues } from '../stores/form/useFieldValues.js'\nimport { useChain } from './useChain.js'\n\nexport const useRouteRequiredAccountConnection = (\n route?: Route,\n chain?: ExtendedChain\n): {\n connected: boolean\n missingChain?: ExtendedChain\n missingAccountAddress?: string\n} => {\n const { account, accounts } = useAccount({ chainType: chain?.chainType })\n const [toAddress] = useFieldValues('toAddress')\n const { getChainById } = useChain()\n\n return useMemo(() => {\n if (!route?.steps.length) {\n return {\n connected: account.isConnected,\n }\n }\n\n const connectedChainTypes = new Map(\n accounts\n .filter((account) => account.isConnected && account.address)\n .map((account) => [account.chainType, account])\n )\n\n if (!connectedChainTypes.size) {\n return {\n connected: false,\n }\n }\n\n for (const step of route.steps) {\n const chain = getChainById(step.action.fromChainId)\n if (!chain) {\n continue\n }\n\n const connectedAccount = connectedChainTypes.get(chain.chainType)\n const isToAddressSatisfied = toAddress\n ? connectedAccount?.address === step.action.fromAddress\n : true\n\n if (!connectedAccount || !isToAddressSatisfied) {\n return {\n connected: false,\n missingChain: chain,\n missingAccountAddress: !isToAddressSatisfied\n ? step.action.fromAddress\n : undefined,\n }\n }\n }\n\n return { connected: true }\n }, [account.isConnected, route, accounts, getChainById, toAddress])\n}\n"],"mappings":";;;;;AAMA,MAAa,qCACX,OACA,UAKG;CACH,MAAM,EAAE,SAAS,aAAa,WAAW,EAAE,WAAW,OAAO,WAAW,CAAC;CACzE,MAAM,CAAC,aAAa,eAAe,YAAY;CAC/C,MAAM,EAAE,iBAAiB,UAAU;CAEnC,OAAO,cAAc;EACnB,IAAI,CAAC,OAAO,MAAM,QAChB,OAAO,EACL,WAAW,QAAQ,aACpB;EAGH,MAAM,sBAAsB,IAAI,IAC9B,SACG,QAAQ,YAAY,QAAQ,eAAe,QAAQ,QAAQ,CAC3D,KAAK,YAAY,CAAC,QAAQ,WAAW,QAAQ,CAAC,CAClD;EAED,IAAI,CAAC,oBAAoB,MACvB,OAAO,EACL,WAAW,OACZ;EAGH,KAAK,MAAM,QAAQ,MAAM,OAAO;GAC9B,MAAM,QAAQ,aAAa,KAAK,OAAO,YAAY;GACnD,IAAI,CAAC,OACH;GAGF,MAAM,mBAAmB,oBAAoB,IAAI,MAAM,UAAU;GACjE,MAAM,uBAAuB,YACzB,kBAAkB,YAAY,KAAK,OAAO,cAC1C;GAEJ,IAAI,CAAC,oBAAoB,CAAC,sBACxB,OAAO;IACL,WAAW;IACX,cAAc;IACd,uBAAuB,CAAC,uBACpB,KAAK,OAAO,cACZ,KAAA;IACL;;EAIL,OAAO,EAAE,WAAW,MAAM;IACzB;EAAC,QAAQ;EAAa;EAAO;EAAU;EAAc;EAAU,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRoutes.js","names":[],"sources":["../../../src/hooks/useRoutes.ts"],"sourcesContent":["import type { ExtendedChain, Route, Token } from '@lifi/sdk'\nimport {\n ChainType,\n convertQuoteToRoute,\n getContractCallsQuote,\n getRelayerQuote,\n getRoutes,\n LiFiErrorCode,\n parseUnits,\n} from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport {\n useChainTypeFromAddress,\n useEthereumContext,\n} from '@lifi/widget-provider'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useCallback, useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { useFieldValues } from '../stores/form/useFieldValues.js'\nimport { useIntermediateRoutesStore } from '../stores/routes/useIntermediateRoutesStore.js'\nimport { useSetExecutableRoute } from '../stores/routes/useSetExecutableRoute.js'\nimport { defaultSlippage } from '../stores/settings/createSettingsStore.js'\nimport { useSettings } from '../stores/settings/useSettings.js'\nimport { WidgetEvent } from '../types/events.js'\nimport type { TokensByChain } from '../types/token.js'\nimport { getQueryKey } from '../utils/queries.js'\nimport { updateTokenInCache } from '../utils/token.js'\nimport { useChain } from './useChain.js'\nimport { useDebouncedWatch } from './useDebouncedWatch.js'\nimport { useGasRefuel } from './useGasRefuel.js'\nimport { useIsBatchingSupported } from './useIsBatchingSupported.js'\nimport { useSwapOnly } from './useSwapOnly.js'\nimport { useToken } from './useToken.js'\nimport { useWidgetEvents } from './useWidgetEvents.js'\n\nconst refetchTime = 60_000\n\ninterface RoutesProps {\n observableRoute?: Route\n}\n\nexport const useRoutes = ({\n observableRoute,\n}: RoutesProps = {}): {\n routes: Route[] | undefined\n isLoading: boolean\n isFetching: boolean\n isFetched: boolean\n dataUpdatedAt: number\n refetchTime: number\n refetch: () => void\n fromChain: ExtendedChain | undefined\n toChain: ExtendedChain | undefined\n queryKey: readonly unknown[]\n setReviewableRoute: (route: Route) => void\n} => {\n const {\n subvariant,\n subvariantOptions,\n contractTool,\n bridges,\n exchanges,\n fee,\n feeConfig,\n useRelayerRoutes,\n keyPrefix,\n } = useWidgetConfig()\n const sdkClient = useSDKClient()\n const setExecutableRoute = useSetExecutableRoute()\n const queryClient = useQueryClient()\n const emitter = useWidgetEvents()\n const swapOnly = useSwapOnly()\n const {\n disabledBridges,\n disabledExchanges,\n enabledBridges,\n enabledExchanges,\n enabledAutoRefuel,\n routePriority,\n slippage,\n } = useSettings([\n 'disabledBridges',\n 'disabledExchanges',\n 'enabledBridges',\n 'enabledExchanges',\n 'enabledAutoRefuel',\n 'routePriority',\n 'slippage',\n ])\n const [fromTokenAmount] = useDebouncedWatch(500, 'fromAmount')\n const [\n fromChainId,\n fromTokenAddress,\n toAddress,\n toTokenAmount,\n toChainId,\n toTokenAddress,\n contractCalls,\n ] = useFieldValues(\n 'fromChain',\n 'fromToken',\n 'toAddress',\n 'toAmount',\n 'toChain',\n 'toToken',\n 'contractCalls'\n )\n const { token: fromToken } = useToken(fromChainId, fromTokenAddress)\n const { token: toToken } = useToken(toChainId, toTokenAddress)\n const { chain: fromChain } = useChain(fromChainId)\n const { chain: toChain } = useChain(toChainId)\n const { enabled: enabledRefuel, fromAmount: gasRecommendationFromAmount } =\n useGasRefuel()\n const { getChainTypeFromAddress } = useChainTypeFromAddress()\n const { isGaslessStep, disableMessageSigning } = useEthereumContext()\n const { account } = useAccount({ chainType: fromChain?.chainType })\n const { isBatchingSupported, isBatchingSupportedLoading } =\n useIsBatchingSupported(fromChain, account.address)\n\n const hasAmount = Number(fromTokenAmount) > 0 || Number(toTokenAmount) > 0\n\n const contractCallQuoteEnabled: boolean =\n subvariant === 'custom' ? Boolean(contractCalls && account.address) : true\n\n // When we bridge between ecosystems we need to be sure toAddress is set and has the same chainType as toChain\n // If toAddress is set, it must have the same chainType as toChain\n const hasToAddressAndChainTypeSatisfied: boolean =\n !!toChain &&\n !!toAddress &&\n getChainTypeFromAddress(toAddress) === toChain.chainType\n // We need to check for toAddress only if it is set\n const isToAddressSatisfied = toAddress\n ? hasToAddressAndChainTypeSatisfied\n : true\n\n // toAddress might be an empty string, but we need to pass undefined if there is no value\n const toWalletAddress = toAddress || undefined\n\n // We need to send the full allowed tools array if custom tool settings are applied\n const allowedBridges =\n bridges?.allow?.length || bridges?.deny?.length ? enabledBridges : undefined\n const allowedExchanges =\n exchanges?.allow?.length || exchanges?.deny?.length\n ? enabledExchanges\n : undefined\n const allowSwitchChain = sdkClient.config?.routeOptions?.allowSwitchChain\n\n const isEnabled =\n Boolean(Number(fromChain?.id)) &&\n Boolean(Number(toChain?.id)) &&\n Boolean(fromToken?.address) &&\n Boolean(toToken?.address) &&\n !Number.isNaN(slippage) &&\n hasAmount &&\n isToAddressSatisfied &&\n contractCallQuoteEnabled &&\n !isBatchingSupportedLoading\n\n // Some values should be strictly typed and isEnabled ensures that\n const queryKey = useMemo(\n () =>\n [\n getQueryKey('routes', keyPrefix),\n account.address,\n fromChain?.id as number,\n fromToken?.address as string,\n fromTokenAmount,\n toWalletAddress,\n toChain?.id as number,\n toToken?.address as string,\n toTokenAmount,\n contractCalls,\n slippage,\n swapOnly,\n disabledBridges,\n disabledExchanges,\n allowedBridges,\n allowedExchanges,\n routePriority,\n subvariant,\n allowSwitchChain,\n enabledRefuel && enabledAutoRefuel,\n gasRecommendationFromAmount,\n feeConfig?.fee || fee,\n disableMessageSigning,\n !!isBatchingSupported,\n observableRoute?.id,\n ] as const,\n [\n keyPrefix,\n account.address,\n fromChain?.id,\n fromToken?.address,\n fromTokenAmount,\n toWalletAddress,\n toChain?.id,\n toToken?.address,\n toTokenAmount,\n contractCalls,\n slippage,\n swapOnly,\n disabledBridges,\n disabledExchanges,\n allowedBridges,\n allowedExchanges,\n routePriority,\n subvariant,\n allowSwitchChain,\n enabledRefuel,\n enabledAutoRefuel,\n gasRecommendationFromAmount,\n feeConfig?.fee,\n fee,\n disableMessageSigning,\n isBatchingSupported,\n observableRoute?.id,\n ]\n )\n\n const { getIntermediateRoutes, setIntermediateRoutes } =\n useIntermediateRoutesStore()\n\n const { data, isLoading, isFetching, isFetched, dataUpdatedAt, refetch } =\n useQuery({\n queryKey,\n queryFn: async ({\n queryKey: [\n _,\n fromAddress,\n fromChainId,\n fromTokenAddress,\n fromTokenAmount,\n toAddress,\n toChainId,\n toTokenAddress,\n toTokenAmount,\n contractCalls,\n slippage = defaultSlippage,\n swapOnly,\n disabledBridges,\n disabledExchanges,\n allowedBridges,\n allowedExchanges,\n routePriority,\n subvariant,\n allowSwitchChain,\n enabledRefuel,\n gasRecommendationFromAmount,\n fee,\n disableMessageSigning,\n isBatchingSupported,\n // _observableRouteId must be the last element in the query key\n _observableRouteId,\n ],\n signal,\n }) => {\n const fromAmount = parseUnits(fromTokenAmount, fromToken!.decimals)\n const toAmount = parseUnits(toTokenAmount, toToken!.decimals)\n const formattedSlippage = slippage\n ? Number.parseFloat(slippage) / 100\n : defaultSlippage\n\n const allowBridges = swapOnly\n ? []\n : observableRoute\n ? observableRoute.steps.flatMap((step) =>\n step.includedSteps.reduce((toolKeys, includedStep) => {\n if (includedStep.type === 'cross') {\n toolKeys.push(includedStep.toolDetails.key)\n }\n return toolKeys\n }, [] as string[])\n )\n : allowedBridges\n const allowExchanges = observableRoute\n ? observableRoute.steps.flatMap((step) =>\n step.includedSteps.reduce((toolKeys, includedStep) => {\n if (includedStep.type === 'swap') {\n toolKeys.push(includedStep.toolDetails.key)\n }\n return toolKeys\n }, [] as string[])\n )\n : allowedExchanges\n\n const calculatedFee = await feeConfig?.calculateFee?.({\n fromChain: fromChain!,\n toChain: toChain!,\n fromToken: fromToken!,\n toToken: toToken!,\n fromAddress,\n toAddress,\n fromAmount,\n toAmount,\n slippage: formattedSlippage,\n })\n\n if (subvariant === 'custom' && contractCalls && toAmount) {\n const contractCallQuote = await getContractCallsQuote(\n sdkClient,\n {\n // Contract calls are enabled only when fromAddress is set\n fromAddress: fromAddress as string,\n fromChain: fromChainId,\n fromToken: fromTokenAddress,\n toAmount: toAmount.toString(),\n toChain: toChainId,\n toToken: toTokenAddress,\n contractCalls,\n denyBridges: disabledBridges.length ? disabledBridges : undefined,\n denyExchanges: disabledExchanges.length\n ? disabledExchanges\n : undefined,\n allowBridges,\n allowExchanges,\n toFallbackAddress: toAddress,\n slippage: formattedSlippage,\n fee: calculatedFee || fee,\n },\n { signal }\n )\n\n contractCallQuote.action.toToken = toToken!\n\n const customStep =\n subvariant === 'custom'\n ? contractCallQuote.includedSteps?.find(\n (step) => step.type === 'custom'\n )\n : undefined\n\n if (customStep && contractTool) {\n const toolDetails = {\n key: contractTool.name,\n name: contractTool.name,\n logoURI: contractTool.logoURI,\n }\n customStep.toolDetails = toolDetails\n contractCallQuote.toolDetails = toolDetails\n }\n\n const route: Route = convertQuoteToRoute(contractCallQuote)\n\n return [route]\n }\n\n // Prevent sending a request for the same chain token combinations.\n // Exception: proceed anyway if subvariant is custom and subvariantOptions is deposit\n if (\n fromChainId === toChainId &&\n fromTokenAddress === toTokenAddress &&\n !(subvariant === 'custom' && subvariantOptions?.custom === 'deposit')\n ) {\n return\n }\n\n const isObservableRelayerRoute = observableRoute?.steps?.some(\n (step) => !!isGaslessStep?.(step, fromChain)\n )\n\n const shouldUseMainRoutes =\n !observableRoute || !isObservableRelayerRoute\n const shouldUseRelayerQuote =\n fromAddress &&\n fromChain?.chainType === ChainType.EVM &&\n fromChain.permit2 &&\n fromChain.permit2Proxy &&\n fromChain.relayerSupported &&\n fromChain.nativeToken.address !== fromTokenAddress &&\n useRelayerRoutes &&\n !isBatchingSupported &&\n (!observableRoute || isObservableRelayerRoute)\n\n const mainRoutesPromise = shouldUseMainRoutes\n ? getRoutes(\n sdkClient,\n {\n fromAddress,\n fromAmount: fromAmount.toString(),\n fromChainId,\n fromTokenAddress,\n toAddress,\n toChainId,\n toTokenAddress,\n fromAmountForGas:\n enabledRefuel && gasRecommendationFromAmount\n ? gasRecommendationFromAmount\n : undefined,\n options: {\n allowSwitchChain:\n subvariant === 'refuel' ? false : allowSwitchChain,\n bridges:\n allowBridges?.length || disabledBridges.length\n ? {\n allow: allowBridges,\n deny: disabledBridges.length\n ? disabledBridges\n : undefined,\n }\n : undefined,\n exchanges:\n allowExchanges?.length || disabledExchanges.length\n ? {\n allow: allowExchanges,\n deny: disabledExchanges.length\n ? disabledExchanges\n : undefined,\n }\n : undefined,\n order: routePriority,\n slippage: formattedSlippage,\n fee: calculatedFee || fee,\n executionType: disableMessageSigning ? 'transaction' : 'all',\n },\n },\n { signal }\n )\n : Promise.resolve(null)\n\n const relayerQuotePromise = shouldUseRelayerQuote\n ? getRelayerQuote(\n sdkClient,\n {\n fromAddress,\n fromAmount: fromAmount.toString(),\n fromChain: fromChainId,\n fromToken: fromTokenAddress,\n toAddress,\n toChain: toChainId,\n toToken: toTokenAddress,\n fromAmountForGas:\n enabledRefuel && gasRecommendationFromAmount\n ? gasRecommendationFromAmount\n : undefined,\n order: routePriority,\n slippage: formattedSlippage,\n fee: calculatedFee || fee,\n ...(allowBridges?.length || disabledBridges.length\n ? {\n allowBridges: allowBridges,\n denyBridges: disabledBridges.length\n ? disabledBridges\n : undefined,\n }\n : undefined),\n ...(allowExchanges?.length || disabledExchanges.length\n ? {\n allowExchanges: allowExchanges,\n denyExchanges: disabledExchanges.length\n ? disabledExchanges\n : undefined,\n }\n : undefined),\n },\n { signal }\n )\n .then(convertQuoteToRoute)\n .catch(() => null)\n : Promise.resolve(null)\n\n // Wait for the main routes to complete first\n const routesResult = await mainRoutesPromise\n\n if (routesResult?.routes[0] && fromAddress) {\n // Update local tokens cache to keep priceUSD in sync\n const { fromToken, toToken } = routesResult.routes[0]\n ;[fromToken, toToken].forEach((token) => {\n // Update main tokens cache (verified)\n queryClient.setQueriesData<TokensByChain>(\n { queryKey: [getQueryKey('tokens', keyPrefix)] },\n (data) => updateTokenInCache(data, token)\n )\n\n // Update search tokens cache (unverified) - matches any search query\n queryClient.setQueriesData<TokensByChain>(\n {\n queryKey: [getQueryKey('tokens-search', keyPrefix)],\n exact: false,\n },\n (data) => updateTokenInCache(data, token)\n )\n\n queryClient.setQueriesData<Token[]>(\n {\n queryKey: [\n getQueryKey('token-balances', keyPrefix),\n fromAddress,\n token.chainId,\n ],\n },\n (data) => {\n if (data) {\n const clonedData = [...data]\n const index = clonedData.findIndex(\n (dataToken) => dataToken.address === token.address\n )\n if (index >= 0) {\n clonedData[index] = {\n ...clonedData[index],\n ...token,\n }\n }\n return clonedData\n }\n }\n )\n })\n }\n\n const initialRoutes = routesResult?.routes ?? []\n\n if (shouldUseRelayerQuote && initialRoutes.length) {\n setIntermediateRoutes(queryKey, initialRoutes)\n emitter.emit(WidgetEvent.AvailableRoutes, initialRoutes)\n // Return early if we're only using main routes\n } else if (shouldUseMainRoutes) {\n // If we don't need relayer quote, return the initial routes\n emitter.emit(WidgetEvent.AvailableRoutes, initialRoutes)\n return initialRoutes\n }\n\n const relayerRouteResult = await relayerQuotePromise\n // If we have a relayer route, add it to the routes array\n if (relayerRouteResult) {\n // Insert the relayer route at position 1 (after the first route)\n initialRoutes.splice(1, 0, relayerRouteResult)\n // Emit the updated routes\n emitter.emit(WidgetEvent.AvailableRoutes, initialRoutes)\n }\n\n return initialRoutes\n },\n enabled: isEnabled,\n staleTime: refetchTime,\n refetchInterval(query) {\n return Math.min(\n Math.abs(refetchTime - (Date.now() - query.state.dataUpdatedAt)),\n refetchTime\n )\n },\n retry(failureCount, error: any) {\n if (process.env.NODE_ENV === 'development') {\n console.warn('Route query failed:', { failureCount, error })\n }\n if (failureCount >= 3) {\n return false\n }\n if (error?.code === LiFiErrorCode.NotFound) {\n return false\n }\n return true\n },\n })\n\n const setReviewableRoute = useCallback(\n (route: Route) => {\n const queryDataKey = queryKey.toSpliced(queryKey.length - 1, 1, route.id)\n queryClient.setQueryData(queryDataKey, [route], {\n updatedAt: dataUpdatedAt || Date.now(),\n })\n setExecutableRoute(route)\n },\n [queryClient, dataUpdatedAt, setExecutableRoute, queryKey]\n )\n\n return {\n routes: data || getIntermediateRoutes(queryKey),\n isLoading: isEnabled && isLoading,\n isFetching,\n isFetched,\n dataUpdatedAt,\n refetchTime,\n refetch,\n fromChain,\n toChain,\n queryKey,\n setReviewableRoute,\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAoCA,MAAM,cAAc;AAMpB,MAAa,aAAa,EACxB,oBACe,EAAE,KAYd;CACH,MAAM,EACJ,YACA,mBACA,cACA,SACA,WACA,KACA,WACA,kBACA,cACE,iBAAiB;CACrB,MAAM,YAAY,cAAc;CAChC,MAAM,qBAAqB,uBAAuB;CAClD,MAAM,cAAc,gBAAgB;CACpC,MAAM,UAAU,iBAAiB;CACjC,MAAM,WAAW,aAAa;CAC9B,MAAM,EACJ,iBACA,mBACA,gBACA,kBACA,mBACA,eACA,aACE,YAAY;EACd;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CACF,MAAM,CAAC,mBAAmB,kBAAkB,KAAK,aAAa;CAC9D,MAAM,CACJ,aACA,kBACA,WACA,eACA,WACA,gBACA,iBACE,eACF,aACA,aACA,aACA,YACA,WACA,WACA,gBACD;CACD,MAAM,EAAE,OAAO,cAAc,SAAS,aAAa,iBAAiB;CACpE,MAAM,EAAE,OAAO,YAAY,SAAS,WAAW,eAAe;CAC9D,MAAM,EAAE,OAAO,cAAc,SAAS,YAAY;CAClD,MAAM,EAAE,OAAO,YAAY,SAAS,UAAU;CAC9C,MAAM,EAAE,SAAS,eAAe,YAAY,gCAC1C,cAAc;CAChB,MAAM,EAAE,4BAA4B,yBAAyB;CAC7D,MAAM,EAAE,eAAe,0BAA0B,oBAAoB;CACrE,MAAM,EAAE,YAAY,WAAW,EAAE,WAAW,WAAW,WAAW,CAAC;CACnE,MAAM,EAAE,qBAAqB,+BAC3B,uBAAuB,WAAW,QAAQ,QAAQ;CAEpD,MAAM,YAAY,OAAO,gBAAgB,GAAG,KAAK,OAAO,cAAc,GAAG;CAEzE,MAAM,2BACJ,eAAe,WAAW,QAAQ,iBAAiB,QAAQ,QAAQ,GAAG;CAIxE,MAAM,oCACJ,CAAC,CAAC,WACF,CAAC,CAAC,aACF,wBAAwB,UAAU,KAAK,QAAQ;CAEjD,MAAM,uBAAuB,YACzB,oCACA;CAGJ,MAAM,kBAAkB,aAAa,KAAA;CAGrC,MAAM,iBACJ,SAAS,OAAO,UAAU,SAAS,MAAM,SAAS,iBAAiB,KAAA;CACrE,MAAM,mBACJ,WAAW,OAAO,UAAU,WAAW,MAAM,SACzC,mBACA,KAAA;CACN,MAAM,mBAAmB,UAAU,QAAQ,cAAc;CAEzD,MAAM,YACJ,QAAQ,OAAO,WAAW,GAAG,CAAC,IAC9B,QAAQ,OAAO,SAAS,GAAG,CAAC,IAC5B,QAAQ,WAAW,QAAQ,IAC3B,QAAQ,SAAS,QAAQ,IACzB,CAAC,OAAO,MAAM,SAAS,IACvB,aACA,wBACA,4BACA,CAAC;CAGH,MAAM,WAAW,cAEb;EACE,YAAY,UAAU,UAAU;EAChC,QAAQ;EACR,WAAW;EACX,WAAW;EACX;EACA;EACA,SAAS;EACT,SAAS;EACT;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,iBAAiB;EACjB;EACA,WAAW,OAAO;EAClB;EACA,CAAC,CAAC;EACF,iBAAiB;EAClB,EACH;EACE;EACA,QAAQ;EACR,WAAW;EACX,WAAW;EACX;EACA;EACA,SAAS;EACT,SAAS;EACT;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,WAAW;EACX;EACA;EACA;EACA,iBAAiB;EAClB,CACF;CAED,MAAM,EAAE,uBAAuB,0BAC7B,4BAA4B;CAE9B,MAAM,EAAE,MAAM,WAAW,YAAY,WAAW,eAAe,YAC7D,SAAS;EACP;EACA,SAAS,OAAO,EACd,UAAU,CACR,GACA,aACA,aACA,kBACA,iBACA,WACA,WACA,gBACA,eACA,eACA,WAAA,KAAA,GACA,UACA,iBACA,mBACA,gBACA,kBACA,eACA,YACA,kBACA,eACA,6BACA,KACA,uBACA,qBAEA,qBAEF,aACI;GACJ,MAAM,aAAa,WAAW,iBAAiB,UAAW,SAAS;GACnE,MAAM,WAAW,WAAW,eAAe,QAAS,SAAS;GAC7D,MAAM,oBAAoB,WACtB,OAAO,WAAW,SAAS,GAAG,MAAA,KAAA;GAGlC,MAAM,eAAe,WACjB,EAAE,GACF,kBACE,gBAAgB,MAAM,SAAS,SAC7B,KAAK,cAAc,QAAQ,UAAU,iBAAiB;AACpD,QAAI,aAAa,SAAS,QACxB,UAAS,KAAK,aAAa,YAAY,IAAI;AAE7C,WAAO;MACN,EAAE,CAAa,CACnB,GACD;GACN,MAAM,iBAAiB,kBACnB,gBAAgB,MAAM,SAAS,SAC7B,KAAK,cAAc,QAAQ,UAAU,iBAAiB;AACpD,QAAI,aAAa,SAAS,OACxB,UAAS,KAAK,aAAa,YAAY,IAAI;AAE7C,WAAO;MACN,EAAE,CAAa,CACnB,GACD;GAEJ,MAAM,gBAAgB,MAAM,WAAW,eAAe;IACzC;IACF;IACE;IACF;IACT;IACA;IACA;IACA;IACA,UAAU;IACX,CAAC;AAEF,OAAI,eAAe,YAAY,iBAAiB,UAAU;IACxD,MAAM,oBAAoB,MAAM,sBAC9B,WACA;KAEe;KACb,WAAW;KACX,WAAW;KACX,UAAU,SAAS,UAAU;KAC7B,SAAS;KACT,SAAS;KACT;KACA,aAAa,gBAAgB,SAAS,kBAAkB,KAAA;KACxD,eAAe,kBAAkB,SAC7B,oBACA,KAAA;KACJ;KACA;KACA,mBAAmB;KACnB,UAAU;KACV,KAAK,iBAAiB;KACvB,EACD,EAAE,QAAQ,CACX;AAED,sBAAkB,OAAO,UAAU;IAEnC,MAAM,aACJ,eAAe,WACX,kBAAkB,eAAe,MAC9B,SAAS,KAAK,SAAS,SACzB,GACD,KAAA;AAEN,QAAI,cAAc,cAAc;KAC9B,MAAM,cAAc;MAClB,KAAK,aAAa;MAClB,MAAM,aAAa;MACnB,SAAS,aAAa;MACvB;AACD,gBAAW,cAAc;AACzB,uBAAkB,cAAc;;AAKlC,WAAO,CAFc,oBAAoB,kBAE5B,CAAC;;AAKhB,OACE,gBAAgB,aAChB,qBAAqB,kBACrB,EAAE,eAAe,YAAY,mBAAmB,WAAW,WAE3D;GAGF,MAAM,2BAA2B,iBAAiB,OAAO,MACtD,SAAS,CAAC,CAAC,gBAAgB,MAAM,UAAU,CAC7C;GAED,MAAM,sBACJ,CAAC,mBAAmB,CAAC;GACvB,MAAM,wBACJ,eACA,WAAW,cAAc,UAAU,OACnC,UAAU,WACV,UAAU,gBACV,UAAU,oBACV,UAAU,YAAY,YAAY,oBAClC,oBACA,CAAC,wBACA,CAAC,mBAAmB;GAEvB,MAAM,oBAAoB,sBACtB,UACE,WACA;IACE;IACA,YAAY,WAAW,UAAU;IACjC;IACA;IACA;IACA;IACA;IACA,kBACE,iBAAiB,8BACb,8BACA,KAAA;IACN,SAAS;KACP,kBACE,eAAe,WAAW,QAAQ;KACpC,SACE,cAAc,UAAU,gBAAgB,SACpC;MACE,OAAO;MACP,MAAM,gBAAgB,SAClB,kBACA,KAAA;MACL,GACD,KAAA;KACN,WACE,gBAAgB,UAAU,kBAAkB,SACxC;MACE,OAAO;MACP,MAAM,kBAAkB,SACpB,oBACA,KAAA;MACL,GACD,KAAA;KACN,OAAO;KACP,UAAU;KACV,KAAK,iBAAiB;KACtB,eAAe,wBAAwB,gBAAgB;KACxD;IACF,EACD,EAAE,QAAQ,CACX,GACD,QAAQ,QAAQ,KAAK;GAEzB,MAAM,sBAAsB,wBACxB,gBACE,WACA;IACE;IACA,YAAY,WAAW,UAAU;IACjC,WAAW;IACX,WAAW;IACX;IACA,SAAS;IACT,SAAS;IACT,kBACE,iBAAiB,8BACb,8BACA,KAAA;IACN,OAAO;IACP,UAAU;IACV,KAAK,iBAAiB;IACtB,GAAI,cAAc,UAAU,gBAAgB,SACxC;KACgB;KACd,aAAa,gBAAgB,SACzB,kBACA,KAAA;KACL,GACD,KAAA;IACJ,GAAI,gBAAgB,UAAU,kBAAkB,SAC5C;KACkB;KAChB,eAAe,kBAAkB,SAC7B,oBACA,KAAA;KACL,GACD,KAAA;IACL,EACD,EAAE,QAAQ,CACX,CACE,KAAK,oBAAoB,CACzB,YAAY,KAAK,GACpB,QAAQ,QAAQ,KAAK;GAGzB,MAAM,eAAe,MAAM;AAE3B,OAAI,cAAc,OAAO,MAAM,aAAa;IAE1C,MAAM,EAAE,WAAW,YAAY,aAAa,OAAO;AAClD,KAAC,WAAW,QAAQ,CAAC,SAAS,UAAU;AAEvC,iBAAY,eACV,EAAE,UAAU,CAAC,YAAY,UAAU,UAAU,CAAC,EAAE,GAC/C,SAAS,mBAAmB,MAAM,MAAM,CAC1C;AAGD,iBAAY,eACV;MACE,UAAU,CAAC,YAAY,iBAAiB,UAAU,CAAC;MACnD,OAAO;MACR,GACA,SAAS,mBAAmB,MAAM,MAAM,CAC1C;AAED,iBAAY,eACV,EACE,UAAU;MACR,YAAY,kBAAkB,UAAU;MACxC;MACA,MAAM;MACP,EACF,GACA,SAAS;AACR,UAAI,MAAM;OACR,MAAM,aAAa,CAAC,GAAG,KAAK;OAC5B,MAAM,QAAQ,WAAW,WACtB,cAAc,UAAU,YAAY,MAAM,QAC5C;AACD,WAAI,SAAS,EACX,YAAW,SAAS;QAClB,GAAG,WAAW;QACd,GAAG;QACJ;AAEH,cAAO;;OAGZ;MACD;;GAGJ,MAAM,gBAAgB,cAAc,UAAU,EAAE;AAEhD,OAAI,yBAAyB,cAAc,QAAQ;AACjD,0BAAsB,UAAU,cAAc;AAC9C,YAAQ,KAAA,mBAAkC,cAAc;cAE/C,qBAAqB;AAE9B,YAAQ,KAAA,mBAAkC,cAAc;AACxD,WAAO;;GAGT,MAAM,qBAAqB,MAAM;AAEjC,OAAI,oBAAoB;AAEtB,kBAAc,OAAO,GAAG,GAAG,mBAAmB;AAE9C,YAAQ,KAAA,mBAAkC,cAAc;;AAG1D,UAAO;;EAET,SAAS;EACT,WAAW;EACX,gBAAgB,OAAO;AACrB,UAAO,KAAK,IACV,KAAK,IAAI,eAAe,KAAK,KAAK,GAAG,MAAM,MAAM,eAAe,EAChE,YACD;;EAEH,MAAM,cAAc,OAAY;AAC9B,OAAI,QAAQ,IAAI,aAAa,cAC3B,SAAQ,KAAK,uBAAuB;IAAE;IAAc;IAAO,CAAC;AAE9D,OAAI,gBAAgB,EAClB,QAAO;AAET,OAAI,OAAO,SAAS,cAAc,SAChC,QAAO;AAET,UAAO;;EAEV,CAAC;CAEJ,MAAM,qBAAqB,aACxB,UAAiB;EAChB,MAAM,eAAe,SAAS,UAAU,SAAS,SAAS,GAAG,GAAG,MAAM,GAAG;AACzE,cAAY,aAAa,cAAc,CAAC,MAAM,EAAE,EAC9C,WAAW,iBAAiB,KAAK,KAAK,EACvC,CAAC;AACF,qBAAmB,MAAM;IAE3B;EAAC;EAAa;EAAe;EAAoB;EAAS,CAC3D;AAED,QAAO;EACL,QAAQ,QAAQ,sBAAsB,SAAS;EAC/C,WAAW,aAAa;EACxB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD"}
|
|
1
|
+
{"version":3,"file":"useRoutes.js","names":[],"sources":["../../../src/hooks/useRoutes.ts"],"sourcesContent":["import type { ExtendedChain, Route, Token } from '@lifi/sdk'\nimport {\n ChainType,\n convertQuoteToRoute,\n getContractCallsQuote,\n getRelayerQuote,\n getRoutes,\n LiFiErrorCode,\n parseUnits,\n} from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport {\n useChainTypeFromAddress,\n useEthereumContext,\n} from '@lifi/widget-provider'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useCallback, useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { useFieldValues } from '../stores/form/useFieldValues.js'\nimport { useIntermediateRoutesStore } from '../stores/routes/useIntermediateRoutesStore.js'\nimport { useSetExecutableRoute } from '../stores/routes/useSetExecutableRoute.js'\nimport { defaultSlippage } from '../stores/settings/createSettingsStore.js'\nimport { useSettings } from '../stores/settings/useSettings.js'\nimport { WidgetEvent } from '../types/events.js'\nimport type { TokensByChain } from '../types/token.js'\nimport { getQueryKey } from '../utils/queries.js'\nimport { updateTokenInCache } from '../utils/token.js'\nimport { useChain } from './useChain.js'\nimport { useDebouncedWatch } from './useDebouncedWatch.js'\nimport { useGasRefuel } from './useGasRefuel.js'\nimport { useIsBatchingSupported } from './useIsBatchingSupported.js'\nimport { useSwapOnly } from './useSwapOnly.js'\nimport { useToken } from './useToken.js'\nimport { useWidgetEvents } from './useWidgetEvents.js'\n\nconst refetchTime = 60_000\n\ninterface RoutesProps {\n observableRoute?: Route\n}\n\nexport const useRoutes = ({\n observableRoute,\n}: RoutesProps = {}): {\n routes: Route[] | undefined\n isLoading: boolean\n isFetching: boolean\n isFetched: boolean\n dataUpdatedAt: number\n refetchTime: number\n refetch: () => void\n fromChain: ExtendedChain | undefined\n toChain: ExtendedChain | undefined\n queryKey: readonly unknown[]\n setReviewableRoute: (route: Route) => void\n} => {\n const {\n subvariant,\n subvariantOptions,\n contractTool,\n bridges,\n exchanges,\n fee,\n feeConfig,\n useRelayerRoutes,\n keyPrefix,\n } = useWidgetConfig()\n const sdkClient = useSDKClient()\n const setExecutableRoute = useSetExecutableRoute()\n const queryClient = useQueryClient()\n const emitter = useWidgetEvents()\n const swapOnly = useSwapOnly()\n const {\n disabledBridges,\n disabledExchanges,\n enabledBridges,\n enabledExchanges,\n enabledAutoRefuel,\n routePriority,\n slippage,\n } = useSettings([\n 'disabledBridges',\n 'disabledExchanges',\n 'enabledBridges',\n 'enabledExchanges',\n 'enabledAutoRefuel',\n 'routePriority',\n 'slippage',\n ])\n const [fromTokenAmount] = useDebouncedWatch(500, 'fromAmount')\n const [\n fromChainId,\n fromTokenAddress,\n toAddress,\n toTokenAmount,\n toChainId,\n toTokenAddress,\n contractCalls,\n ] = useFieldValues(\n 'fromChain',\n 'fromToken',\n 'toAddress',\n 'toAmount',\n 'toChain',\n 'toToken',\n 'contractCalls'\n )\n const { token: fromToken } = useToken(fromChainId, fromTokenAddress)\n const { token: toToken } = useToken(toChainId, toTokenAddress)\n const { chain: fromChain } = useChain(fromChainId)\n const { chain: toChain } = useChain(toChainId)\n const { enabled: enabledRefuel, fromAmount: gasRecommendationFromAmount } =\n useGasRefuel()\n const { getChainTypeFromAddress } = useChainTypeFromAddress()\n const { isGaslessStep, disableMessageSigning } = useEthereumContext()\n const { account } = useAccount({ chainType: fromChain?.chainType })\n const { isBatchingSupported, isBatchingSupportedLoading } =\n useIsBatchingSupported(fromChain, account.address)\n\n const hasAmount = Number(fromTokenAmount) > 0 || Number(toTokenAmount) > 0\n\n const contractCallQuoteEnabled: boolean =\n subvariant === 'custom' ? Boolean(contractCalls && account.address) : true\n\n // When we bridge between ecosystems we need to be sure toAddress is set and has the same chainType as toChain\n // If toAddress is set, it must have the same chainType as toChain\n const hasToAddressAndChainTypeSatisfied: boolean =\n !!toChain &&\n !!toAddress &&\n getChainTypeFromAddress(toAddress) === toChain.chainType\n // We need to check for toAddress only if it is set\n const isToAddressSatisfied = toAddress\n ? hasToAddressAndChainTypeSatisfied\n : true\n\n // toAddress might be an empty string, but we need to pass undefined if there is no value\n const toWalletAddress = toAddress || undefined\n\n // We need to send the full allowed tools array if custom tool settings are applied\n const allowedBridges =\n bridges?.allow?.length || bridges?.deny?.length ? enabledBridges : undefined\n const allowedExchanges =\n exchanges?.allow?.length || exchanges?.deny?.length\n ? enabledExchanges\n : undefined\n const allowSwitchChain = sdkClient.config?.routeOptions?.allowSwitchChain\n\n const isEnabled =\n Boolean(Number(fromChain?.id)) &&\n Boolean(Number(toChain?.id)) &&\n Boolean(fromToken?.address) &&\n Boolean(toToken?.address) &&\n !Number.isNaN(slippage) &&\n hasAmount &&\n isToAddressSatisfied &&\n contractCallQuoteEnabled &&\n !isBatchingSupportedLoading\n\n // Some values should be strictly typed and isEnabled ensures that\n const queryKey = useMemo(\n () =>\n [\n getQueryKey('routes', keyPrefix),\n account.address,\n fromChain?.id as number,\n fromToken?.address as string,\n fromTokenAmount,\n toWalletAddress,\n toChain?.id as number,\n toToken?.address as string,\n toTokenAmount,\n contractCalls,\n slippage,\n swapOnly,\n disabledBridges,\n disabledExchanges,\n allowedBridges,\n allowedExchanges,\n routePriority,\n subvariant,\n allowSwitchChain,\n enabledRefuel && enabledAutoRefuel,\n gasRecommendationFromAmount,\n feeConfig?.fee || fee,\n disableMessageSigning,\n !!isBatchingSupported,\n observableRoute?.id,\n ] as const,\n [\n keyPrefix,\n account.address,\n fromChain?.id,\n fromToken?.address,\n fromTokenAmount,\n toWalletAddress,\n toChain?.id,\n toToken?.address,\n toTokenAmount,\n contractCalls,\n slippage,\n swapOnly,\n disabledBridges,\n disabledExchanges,\n allowedBridges,\n allowedExchanges,\n routePriority,\n subvariant,\n allowSwitchChain,\n enabledRefuel,\n enabledAutoRefuel,\n gasRecommendationFromAmount,\n feeConfig?.fee,\n fee,\n disableMessageSigning,\n isBatchingSupported,\n observableRoute?.id,\n ]\n )\n\n const { getIntermediateRoutes, setIntermediateRoutes } =\n useIntermediateRoutesStore()\n\n const { data, isLoading, isFetching, isFetched, dataUpdatedAt, refetch } =\n useQuery({\n queryKey,\n queryFn: async ({\n queryKey: [\n _,\n fromAddress,\n fromChainId,\n fromTokenAddress,\n fromTokenAmount,\n toAddress,\n toChainId,\n toTokenAddress,\n toTokenAmount,\n contractCalls,\n slippage = defaultSlippage,\n swapOnly,\n disabledBridges,\n disabledExchanges,\n allowedBridges,\n allowedExchanges,\n routePriority,\n subvariant,\n allowSwitchChain,\n enabledRefuel,\n gasRecommendationFromAmount,\n fee,\n disableMessageSigning,\n isBatchingSupported,\n // _observableRouteId must be the last element in the query key\n _observableRouteId,\n ],\n signal,\n }) => {\n const fromAmount = parseUnits(fromTokenAmount, fromToken!.decimals)\n const toAmount = parseUnits(toTokenAmount, toToken!.decimals)\n const formattedSlippage = slippage\n ? Number.parseFloat(slippage) / 100\n : defaultSlippage\n\n const allowBridges = swapOnly\n ? []\n : observableRoute\n ? observableRoute.steps.flatMap((step) =>\n step.includedSteps.reduce((toolKeys, includedStep) => {\n if (includedStep.type === 'cross') {\n toolKeys.push(includedStep.toolDetails.key)\n }\n return toolKeys\n }, [] as string[])\n )\n : allowedBridges\n const allowExchanges = observableRoute\n ? observableRoute.steps.flatMap((step) =>\n step.includedSteps.reduce((toolKeys, includedStep) => {\n if (includedStep.type === 'swap') {\n toolKeys.push(includedStep.toolDetails.key)\n }\n return toolKeys\n }, [] as string[])\n )\n : allowedExchanges\n\n const calculatedFee = await feeConfig?.calculateFee?.({\n fromChain: fromChain!,\n toChain: toChain!,\n fromToken: fromToken!,\n toToken: toToken!,\n fromAddress,\n toAddress,\n fromAmount,\n toAmount,\n slippage: formattedSlippage,\n })\n\n if (subvariant === 'custom' && contractCalls && toAmount) {\n const contractCallQuote = await getContractCallsQuote(\n sdkClient,\n {\n // Contract calls are enabled only when fromAddress is set\n fromAddress: fromAddress as string,\n fromChain: fromChainId,\n fromToken: fromTokenAddress,\n toAmount: toAmount.toString(),\n toChain: toChainId,\n toToken: toTokenAddress,\n contractCalls,\n denyBridges: disabledBridges.length ? disabledBridges : undefined,\n denyExchanges: disabledExchanges.length\n ? disabledExchanges\n : undefined,\n allowBridges,\n allowExchanges,\n toFallbackAddress: toAddress,\n slippage: formattedSlippage,\n fee: calculatedFee || fee,\n },\n { signal }\n )\n\n contractCallQuote.action.toToken = toToken!\n\n const customStep =\n subvariant === 'custom'\n ? contractCallQuote.includedSteps?.find(\n (step) => step.type === 'custom'\n )\n : undefined\n\n if (customStep && contractTool) {\n const toolDetails = {\n key: contractTool.name,\n name: contractTool.name,\n logoURI: contractTool.logoURI,\n }\n customStep.toolDetails = toolDetails\n contractCallQuote.toolDetails = toolDetails\n }\n\n const route: Route = convertQuoteToRoute(contractCallQuote)\n\n return [route]\n }\n\n // Prevent sending a request for the same chain token combinations.\n // Exception: proceed anyway if subvariant is custom and subvariantOptions is deposit\n if (\n fromChainId === toChainId &&\n fromTokenAddress === toTokenAddress &&\n !(subvariant === 'custom' && subvariantOptions?.custom === 'deposit')\n ) {\n return\n }\n\n const isObservableRelayerRoute = observableRoute?.steps?.some(\n (step) => !!isGaslessStep?.(step, fromChain)\n )\n\n const shouldUseMainRoutes =\n !observableRoute || !isObservableRelayerRoute\n const shouldUseRelayerQuote =\n fromAddress &&\n fromChain?.chainType === ChainType.EVM &&\n fromChain.permit2 &&\n fromChain.permit2Proxy &&\n fromChain.relayerSupported &&\n fromChain.nativeToken.address !== fromTokenAddress &&\n useRelayerRoutes &&\n !isBatchingSupported &&\n (!observableRoute || isObservableRelayerRoute)\n\n const mainRoutesPromise = shouldUseMainRoutes\n ? getRoutes(\n sdkClient,\n {\n fromAddress,\n fromAmount: fromAmount.toString(),\n fromChainId,\n fromTokenAddress,\n toAddress,\n toChainId,\n toTokenAddress,\n fromAmountForGas:\n enabledRefuel && gasRecommendationFromAmount\n ? gasRecommendationFromAmount\n : undefined,\n options: {\n allowSwitchChain:\n subvariant === 'refuel' ? false : allowSwitchChain,\n bridges:\n allowBridges?.length || disabledBridges.length\n ? {\n allow: allowBridges,\n deny: disabledBridges.length\n ? disabledBridges\n : undefined,\n }\n : undefined,\n exchanges:\n allowExchanges?.length || disabledExchanges.length\n ? {\n allow: allowExchanges,\n deny: disabledExchanges.length\n ? disabledExchanges\n : undefined,\n }\n : undefined,\n order: routePriority,\n slippage: formattedSlippage,\n fee: calculatedFee || fee,\n executionType: disableMessageSigning ? 'transaction' : 'all',\n },\n },\n { signal }\n )\n : Promise.resolve(null)\n\n const relayerQuotePromise = shouldUseRelayerQuote\n ? getRelayerQuote(\n sdkClient,\n {\n fromAddress,\n fromAmount: fromAmount.toString(),\n fromChain: fromChainId,\n fromToken: fromTokenAddress,\n toAddress,\n toChain: toChainId,\n toToken: toTokenAddress,\n fromAmountForGas:\n enabledRefuel && gasRecommendationFromAmount\n ? gasRecommendationFromAmount\n : undefined,\n order: routePriority,\n slippage: formattedSlippage,\n fee: calculatedFee || fee,\n ...(allowBridges?.length || disabledBridges.length\n ? {\n allowBridges: allowBridges,\n denyBridges: disabledBridges.length\n ? disabledBridges\n : undefined,\n }\n : undefined),\n ...(allowExchanges?.length || disabledExchanges.length\n ? {\n allowExchanges: allowExchanges,\n denyExchanges: disabledExchanges.length\n ? disabledExchanges\n : undefined,\n }\n : undefined),\n },\n { signal }\n )\n .then(convertQuoteToRoute)\n .catch(() => null)\n : Promise.resolve(null)\n\n // Wait for the main routes to complete first\n const routesResult = await mainRoutesPromise\n\n if (routesResult?.routes[0] && fromAddress) {\n // Update local tokens cache to keep priceUSD in sync\n const { fromToken, toToken } = routesResult.routes[0]\n ;[fromToken, toToken].forEach((token) => {\n // Update main tokens cache (verified)\n queryClient.setQueriesData<TokensByChain>(\n { queryKey: [getQueryKey('tokens', keyPrefix)] },\n (data) => updateTokenInCache(data, token)\n )\n\n // Update search tokens cache (unverified) - matches any search query\n queryClient.setQueriesData<TokensByChain>(\n {\n queryKey: [getQueryKey('tokens-search', keyPrefix)],\n exact: false,\n },\n (data) => updateTokenInCache(data, token)\n )\n\n queryClient.setQueriesData<Token[]>(\n {\n queryKey: [\n getQueryKey('token-balances', keyPrefix),\n fromAddress,\n token.chainId,\n ],\n },\n (data) => {\n if (data) {\n const clonedData = [...data]\n const index = clonedData.findIndex(\n (dataToken) => dataToken.address === token.address\n )\n if (index >= 0) {\n clonedData[index] = {\n ...clonedData[index],\n ...token,\n }\n }\n return clonedData\n }\n }\n )\n })\n }\n\n const initialRoutes = routesResult?.routes ?? []\n\n if (shouldUseRelayerQuote && initialRoutes.length) {\n setIntermediateRoutes(queryKey, initialRoutes)\n emitter.emit(WidgetEvent.AvailableRoutes, initialRoutes)\n // Return early if we're only using main routes\n } else if (shouldUseMainRoutes) {\n // If we don't need relayer quote, return the initial routes\n emitter.emit(WidgetEvent.AvailableRoutes, initialRoutes)\n return initialRoutes\n }\n\n const relayerRouteResult = await relayerQuotePromise\n // If we have a relayer route, add it to the routes array\n if (relayerRouteResult) {\n // Insert the relayer route at position 1 (after the first route)\n initialRoutes.splice(1, 0, relayerRouteResult)\n // Emit the updated routes\n emitter.emit(WidgetEvent.AvailableRoutes, initialRoutes)\n }\n\n return initialRoutes\n },\n enabled: isEnabled,\n staleTime: refetchTime,\n refetchInterval(query) {\n return Math.min(\n Math.abs(refetchTime - (Date.now() - query.state.dataUpdatedAt)),\n refetchTime\n )\n },\n retry(failureCount, error: any) {\n if (process.env.NODE_ENV === 'development') {\n console.warn('Route query failed:', { failureCount, error })\n }\n if (failureCount >= 3) {\n return false\n }\n if (error?.code === LiFiErrorCode.NotFound) {\n return false\n }\n return true\n },\n })\n\n const setReviewableRoute = useCallback(\n (route: Route) => {\n const queryDataKey = queryKey.toSpliced(queryKey.length - 1, 1, route.id)\n queryClient.setQueryData(queryDataKey, [route], {\n updatedAt: dataUpdatedAt || Date.now(),\n })\n setExecutableRoute(route)\n },\n [queryClient, dataUpdatedAt, setExecutableRoute, queryKey]\n )\n\n return {\n routes: data || getIntermediateRoutes(queryKey),\n isLoading: isEnabled && isLoading,\n isFetching,\n isFetched,\n dataUpdatedAt,\n refetchTime,\n refetch,\n fromChain,\n toChain,\n queryKey,\n setReviewableRoute,\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useScrollableContainer.js","names":[],"sources":["../../../src/hooks/useScrollableContainer.ts"],"sourcesContent":["import { useCallback, useLayoutEffect, useState } from 'react'\nimport { getScrollableContainer } from '../utils/elements.js'\nimport { useDefaultElementId } from './useDefaultElementId.js'\n\nexport const useGetScrollableContainer = (): (() => HTMLElement | null) => {\n const elementId = useDefaultElementId() ?? ''\n const getContainer = useCallback(\n () => getScrollableContainer(elementId),\n [elementId]\n )\n\n return getContainer\n}\n\nexport const useScrollableContainer = (\n elementId: string\n): HTMLElement | null => {\n const [containerElement, setContainerElement] = useState(() =>\n getScrollableContainer(elementId)\n )\n\n useLayoutEffect(() => {\n if (!containerElement) {\n setContainerElement(getScrollableContainer(elementId))\n }\n }, [containerElement, elementId])\n\n return containerElement\n}\n\nexport const useScrollableOverflowHidden = (): void => {\n const elementId = useDefaultElementId() ?? ''\n useLayoutEffect(() => {\n const element = getScrollableContainer(elementId)\n if (element) {\n element.style.overflowY = 'hidden'\n }\n return () => {\n if (element) {\n element.style.overflowY = 'auto'\n }\n }\n }, [elementId])\n}\n"],"mappings":";;;;AAIA,MAAa,kCAA8D;CACzE,MAAM,YAAY,qBAAqB,IAAI;
|
|
1
|
+
{"version":3,"file":"useScrollableContainer.js","names":[],"sources":["../../../src/hooks/useScrollableContainer.ts"],"sourcesContent":["import { useCallback, useLayoutEffect, useState } from 'react'\nimport { getScrollableContainer } from '../utils/elements.js'\nimport { useDefaultElementId } from './useDefaultElementId.js'\n\nexport const useGetScrollableContainer = (): (() => HTMLElement | null) => {\n const elementId = useDefaultElementId() ?? ''\n const getContainer = useCallback(\n () => getScrollableContainer(elementId),\n [elementId]\n )\n\n return getContainer\n}\n\nexport const useScrollableContainer = (\n elementId: string\n): HTMLElement | null => {\n const [containerElement, setContainerElement] = useState(() =>\n getScrollableContainer(elementId)\n )\n\n useLayoutEffect(() => {\n if (!containerElement) {\n setContainerElement(getScrollableContainer(elementId))\n }\n }, [containerElement, elementId])\n\n return containerElement\n}\n\nexport const useScrollableOverflowHidden = (): void => {\n const elementId = useDefaultElementId() ?? ''\n useLayoutEffect(() => {\n const element = getScrollableContainer(elementId)\n if (element) {\n element.style.overflowY = 'hidden'\n }\n return () => {\n if (element) {\n element.style.overflowY = 'auto'\n }\n }\n }, [elementId])\n}\n"],"mappings":";;;;AAIA,MAAa,kCAA8D;CACzE,MAAM,YAAY,qBAAqB,IAAI;CAM3C,OALqB,kBACb,uBAAuB,UAAU,EACvC,CAAC,UAAU,CAGM;;AAGrB,MAAa,0BACX,cACuB;CACvB,MAAM,CAAC,kBAAkB,uBAAuB,eAC9C,uBAAuB,UAAU,CAClC;CAED,sBAAsB;EACpB,IAAI,CAAC,kBACH,oBAAoB,uBAAuB,UAAU,CAAC;IAEvD,CAAC,kBAAkB,UAAU,CAAC;CAEjC,OAAO;;AAGT,MAAa,oCAA0C;CACrD,MAAM,YAAY,qBAAqB,IAAI;CAC3C,sBAAsB;EACpB,MAAM,UAAU,uBAAuB,UAAU;EACjD,IAAI,SACF,QAAQ,MAAM,YAAY;EAE5B,aAAa;GACX,IAAI,SACF,QAAQ,MAAM,YAAY;;IAG7B,CAAC,UAAU,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSetContentHeight.js","names":[],"sources":["../../../src/hooks/useSetContentHeight.ts"],"sourcesContent":["import type { RefObject } from 'react'\nimport { useLayoutEffect } from 'react'\nimport { getRelativeContainer } from '../utils/elements.js'\nimport { useDefaultElementId } from './useDefaultElementId.js'\n\n// NOTE: this hook is implicitly tied to the widget height functionality in the\n// AppExpandedContainer, RelativeContainer and CssBaselineContainer components as defined in AppContainer.ts\n// CSS changes in those components can have implications for the functionality in this hook\n\nexport const useSetContentHeight = (\n ref: RefObject<HTMLElement | null>,\n dependency?: unknown\n): void => {\n const elementId = useDefaultElementId() ?? ''\n // biome-ignore lint/correctness/useExhaustiveDependencies: we use dependency to refresh height\n useLayoutEffect(() => {\n const relativeContainer = getRelativeContainer(elementId)\n if (\n !relativeContainer ||\n !ref.current ||\n ref.current?.clientHeight <= relativeContainer?.clientHeight\n ) {\n return\n }\n relativeContainer.style.minHeight = `${ref.current.clientHeight}px`\n return () => {\n relativeContainer.style.removeProperty('min-height')\n }\n }, [elementId, ref, dependency])\n}\n"],"mappings":";;;;AASA,MAAa,uBACX,KACA,eACS;CACT,MAAM,YAAY,qBAAqB,IAAI;
|
|
1
|
+
{"version":3,"file":"useSetContentHeight.js","names":[],"sources":["../../../src/hooks/useSetContentHeight.ts"],"sourcesContent":["import type { RefObject } from 'react'\nimport { useLayoutEffect } from 'react'\nimport { getRelativeContainer } from '../utils/elements.js'\nimport { useDefaultElementId } from './useDefaultElementId.js'\n\n// NOTE: this hook is implicitly tied to the widget height functionality in the\n// AppExpandedContainer, RelativeContainer and CssBaselineContainer components as defined in AppContainer.ts\n// CSS changes in those components can have implications for the functionality in this hook\n\nexport const useSetContentHeight = (\n ref: RefObject<HTMLElement | null>,\n dependency?: unknown\n): void => {\n const elementId = useDefaultElementId() ?? ''\n // biome-ignore lint/correctness/useExhaustiveDependencies: we use dependency to refresh height\n useLayoutEffect(() => {\n const relativeContainer = getRelativeContainer(elementId)\n if (\n !relativeContainer ||\n !ref.current ||\n ref.current?.clientHeight <= relativeContainer?.clientHeight\n ) {\n return\n }\n relativeContainer.style.minHeight = `${ref.current.clientHeight}px`\n return () => {\n relativeContainer.style.removeProperty('min-height')\n }\n }, [elementId, ref, dependency])\n}\n"],"mappings":";;;;AASA,MAAa,uBACX,KACA,eACS;CACT,MAAM,YAAY,qBAAqB,IAAI;CAE3C,sBAAsB;EACpB,MAAM,oBAAoB,qBAAqB,UAAU;EACzD,IACE,CAAC,qBACD,CAAC,IAAI,WACL,IAAI,SAAS,gBAAgB,mBAAmB,cAEhD;EAEF,kBAAkB,MAAM,YAAY,GAAG,IAAI,QAAQ,aAAa;EAChE,aAAa;GACX,kBAAkB,MAAM,eAAe,aAAa;;IAErD;EAAC;EAAW;EAAK;EAAW,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSettingMonitor.js","names":[],"sources":["../../../src/hooks/useSettingMonitor.ts"],"sourcesContent":["import { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { defaultConfigurableSettings } from '../stores/settings/createSettingsStore.js'\nimport { useSettingsStore } from '../stores/settings/SettingsStore.js'\nimport { useSettingsActions } from '../stores/settings/useSettingsActions.js'\nimport { useTools } from './useTools.js'\n\nexport const useSettingMonitor = (): {\n isBridgesChanged: boolean\n isExchangesChanged: boolean\n isSlippageChanged: boolean\n isSlippageNotRecommended: boolean\n isSlippageOutsideRecommendedLimits: boolean\n isSlippageUnderRecommendedLimits: boolean\n isRoutePriorityChanged: boolean\n isGasPriceChanged: boolean\n isCustomRouteSettings: boolean\n isRouteSettingsWithWarnings: boolean\n reset: () => void\n} => {\n const [\n disabledBridges,\n disabledExchanges,\n routePriority,\n slippage,\n gasPrice,\n ] = useSettingsStore((state) => [\n state.disabledBridges,\n state.disabledExchanges,\n state.routePriority,\n state.slippage,\n state.gasPrice,\n ])\n const { tools } = useTools()\n const config = useWidgetConfig()\n const { setDefaultSettings, resetSettings } = useSettingsActions()\n\n const isSlippageChanged = config.slippage\n ? Number(slippage) !== config.slippage * 100\n : slippage !== defaultConfigurableSettings.slippage\n\n const isSlippageOutsideRecommendedLimits =\n isSlippageChanged && !!slippage && Number(slippage) > 1\n\n const isSlippageUnderRecommendedLimits =\n isSlippageChanged && !!slippage && Number(slippage) < 0.1\n\n const isSlippageNotRecommended = Boolean(\n isSlippageOutsideRecommendedLimits || isSlippageUnderRecommendedLimits\n )\n\n const isRoutePriorityChanged = config.routePriority\n ? routePriority !== config.routePriority\n : routePriority !== defaultConfigurableSettings.routePriority\n\n const isGasPriceChanged = gasPrice !== defaultConfigurableSettings.gasPrice\n\n const isBridgesChanged = Boolean(disabledBridges.length)\n const isExchangesChanged = Boolean(disabledExchanges.length)\n\n const isCustomRouteSettings =\n isBridgesChanged ||\n isExchangesChanged ||\n isSlippageChanged ||\n isRoutePriorityChanged ||\n isGasPriceChanged\n\n const isRouteSettingsWithWarnings = isSlippageNotRecommended\n\n const reset = () => {\n if (tools) {\n resetSettings(\n tools.bridges.map((tool) => tool.key),\n tools.exchanges.map((tool) => tool.key)\n )\n\n setDefaultSettings(config)\n }\n }\n\n return {\n isBridgesChanged,\n isExchangesChanged,\n isSlippageChanged,\n isSlippageNotRecommended,\n isSlippageOutsideRecommendedLimits,\n isSlippageUnderRecommendedLimits,\n isRoutePriorityChanged,\n isGasPriceChanged,\n isCustomRouteSettings,\n isRouteSettingsWithWarnings,\n reset,\n }\n}\n"],"mappings":";;;;;;AAMA,MAAa,0BAYR;CACH,MAAM,CACJ,iBACA,mBACA,eACA,UACA,YACE,kBAAkB,UAAU;EAC9B,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACP,CAAC;CACF,MAAM,EAAE,UAAU,UAAU;CAC5B,MAAM,SAAS,iBAAiB;CAChC,MAAM,EAAE,oBAAoB,kBAAkB,oBAAoB;CAElE,MAAM,oBAAoB,OAAO,WAC7B,OAAO,SAAS,KAAK,OAAO,WAAW,MACvC,aAAa,4BAA4B;CAE7C,MAAM,qCACJ,qBAAqB,CAAC,CAAC,YAAY,OAAO,SAAS,GAAG;CAExD,MAAM,mCACJ,qBAAqB,CAAC,CAAC,YAAY,OAAO,SAAS,GAAG;CAExD,MAAM,2BAA2B,QAC/B,sCAAsC,iCACvC;CAED,MAAM,yBAAyB,OAAO,gBAClC,kBAAkB,OAAO,gBACzB,kBAAkB,4BAA4B;CAElD,MAAM,oBAAoB,aAAa,4BAA4B;CAEnE,MAAM,mBAAmB,QAAQ,gBAAgB,OAAO;CACxD,MAAM,qBAAqB,QAAQ,kBAAkB,OAAO;CAE5D,MAAM,wBACJ,oBACA,sBACA,qBACA,0BACA;CAEF,MAAM,8BAA8B;CAEpC,MAAM,cAAc;
|
|
1
|
+
{"version":3,"file":"useSettingMonitor.js","names":[],"sources":["../../../src/hooks/useSettingMonitor.ts"],"sourcesContent":["import { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { defaultConfigurableSettings } from '../stores/settings/createSettingsStore.js'\nimport { useSettingsStore } from '../stores/settings/SettingsStore.js'\nimport { useSettingsActions } from '../stores/settings/useSettingsActions.js'\nimport { useTools } from './useTools.js'\n\nexport const useSettingMonitor = (): {\n isBridgesChanged: boolean\n isExchangesChanged: boolean\n isSlippageChanged: boolean\n isSlippageNotRecommended: boolean\n isSlippageOutsideRecommendedLimits: boolean\n isSlippageUnderRecommendedLimits: boolean\n isRoutePriorityChanged: boolean\n isGasPriceChanged: boolean\n isCustomRouteSettings: boolean\n isRouteSettingsWithWarnings: boolean\n reset: () => void\n} => {\n const [\n disabledBridges,\n disabledExchanges,\n routePriority,\n slippage,\n gasPrice,\n ] = useSettingsStore((state) => [\n state.disabledBridges,\n state.disabledExchanges,\n state.routePriority,\n state.slippage,\n state.gasPrice,\n ])\n const { tools } = useTools()\n const config = useWidgetConfig()\n const { setDefaultSettings, resetSettings } = useSettingsActions()\n\n const isSlippageChanged = config.slippage\n ? Number(slippage) !== config.slippage * 100\n : slippage !== defaultConfigurableSettings.slippage\n\n const isSlippageOutsideRecommendedLimits =\n isSlippageChanged && !!slippage && Number(slippage) > 1\n\n const isSlippageUnderRecommendedLimits =\n isSlippageChanged && !!slippage && Number(slippage) < 0.1\n\n const isSlippageNotRecommended = Boolean(\n isSlippageOutsideRecommendedLimits || isSlippageUnderRecommendedLimits\n )\n\n const isRoutePriorityChanged = config.routePriority\n ? routePriority !== config.routePriority\n : routePriority !== defaultConfigurableSettings.routePriority\n\n const isGasPriceChanged = gasPrice !== defaultConfigurableSettings.gasPrice\n\n const isBridgesChanged = Boolean(disabledBridges.length)\n const isExchangesChanged = Boolean(disabledExchanges.length)\n\n const isCustomRouteSettings =\n isBridgesChanged ||\n isExchangesChanged ||\n isSlippageChanged ||\n isRoutePriorityChanged ||\n isGasPriceChanged\n\n const isRouteSettingsWithWarnings = isSlippageNotRecommended\n\n const reset = () => {\n if (tools) {\n resetSettings(\n tools.bridges.map((tool) => tool.key),\n tools.exchanges.map((tool) => tool.key)\n )\n\n setDefaultSettings(config)\n }\n }\n\n return {\n isBridgesChanged,\n isExchangesChanged,\n isSlippageChanged,\n isSlippageNotRecommended,\n isSlippageOutsideRecommendedLimits,\n isSlippageUnderRecommendedLimits,\n isRoutePriorityChanged,\n isGasPriceChanged,\n isCustomRouteSettings,\n isRouteSettingsWithWarnings,\n reset,\n }\n}\n"],"mappings":";;;;;;AAMA,MAAa,0BAYR;CACH,MAAM,CACJ,iBACA,mBACA,eACA,UACA,YACE,kBAAkB,UAAU;EAC9B,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACP,CAAC;CACF,MAAM,EAAE,UAAU,UAAU;CAC5B,MAAM,SAAS,iBAAiB;CAChC,MAAM,EAAE,oBAAoB,kBAAkB,oBAAoB;CAElE,MAAM,oBAAoB,OAAO,WAC7B,OAAO,SAAS,KAAK,OAAO,WAAW,MACvC,aAAa,4BAA4B;CAE7C,MAAM,qCACJ,qBAAqB,CAAC,CAAC,YAAY,OAAO,SAAS,GAAG;CAExD,MAAM,mCACJ,qBAAqB,CAAC,CAAC,YAAY,OAAO,SAAS,GAAG;CAExD,MAAM,2BAA2B,QAC/B,sCAAsC,iCACvC;CAED,MAAM,yBAAyB,OAAO,gBAClC,kBAAkB,OAAO,gBACzB,kBAAkB,4BAA4B;CAElD,MAAM,oBAAoB,aAAa,4BAA4B;CAEnE,MAAM,mBAAmB,QAAQ,gBAAgB,OAAO;CACxD,MAAM,qBAAqB,QAAQ,kBAAkB,OAAO;CAE5D,MAAM,wBACJ,oBACA,sBACA,qBACA,0BACA;CAEF,MAAM,8BAA8B;CAEpC,MAAM,cAAc;EAClB,IAAI,OAAO;GACT,cACE,MAAM,QAAQ,KAAK,SAAS,KAAK,IAAI,EACrC,MAAM,UAAU,KAAK,SAAS,KAAK,IAAI,CACxC;GAED,mBAAmB,OAAO;;;CAI9B,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSwapOnly.js","names":[],"sources":["../../../src/hooks/useSwapOnly.ts"],"sourcesContent":["import { useSplitSubvariantStore } from '../stores/settings/useSplitSubvariantStore.js'\n\nexport const useSwapOnly = (): boolean => {\n const state = useSplitSubvariantStore((state) => state.state)\n return state === 'swap'\n}\n"],"mappings":";;AAEA,MAAa,oBAA6B;
|
|
1
|
+
{"version":3,"file":"useSwapOnly.js","names":[],"sources":["../../../src/hooks/useSwapOnly.ts"],"sourcesContent":["import { useSplitSubvariantStore } from '../stores/settings/useSplitSubvariantStore.js'\n\nexport const useSwapOnly = (): boolean => {\n const state = useSplitSubvariantStore((state) => state.state)\n return state === 'swap'\n}\n"],"mappings":";;AAEA,MAAa,oBAA6B;CAExC,OADc,yBAAyB,UAAU,MAAM,MAC3C,KAAK"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useToAddressAutoPopulate.js","names":[],"sources":["../../../src/hooks/useToAddressAutoPopulate.ts"],"sourcesContent":["import { useAccount } from '@lifi/wallet-management'\nimport { useChainTypeFromAddress } from '@lifi/widget-provider'\nimport { useCallback } from 'react'\nimport { useBookmarkActions } from '../stores/bookmarks/useBookmarkActions.js'\nimport type { FormType } from '../stores/form/types.js'\nimport { useFieldActions } from '../stores/form/useFieldActions.js'\nimport { useAvailableChains } from './useAvailableChains.js'\n\ntype UpdateToAddressArgs = {\n formType: FormType\n selectedToAddress?: string\n selectedChainId?: number\n selectedOppositeTokenAddress?: string\n selectedOppositeChainId?: number\n}\n\n/**\n * Automatically populates toAddress field if bridging across ecosystems and compatible wallet is connected\n */\nexport const useToAddressAutoPopulate = (): ((\n args: UpdateToAddressArgs\n) => string | undefined) => {\n const { setFieldValue } = useFieldActions()\n const { setSelectedBookmark } = useBookmarkActions()\n const { getChainById } = useAvailableChains()\n const { accounts } = useAccount()\n const { getChainTypeFromAddress } = useChainTypeFromAddress()\n\n return useCallback(\n ({\n formType,\n selectedToAddress,\n selectedChainId,\n selectedOppositeTokenAddress,\n selectedOppositeChainId,\n }: UpdateToAddressArgs) => {\n if (\n !selectedOppositeTokenAddress ||\n !selectedOppositeChainId ||\n !selectedChainId ||\n !accounts?.length\n ) {\n return\n }\n const selectedChain = getChainById?.(selectedChainId)\n const selectedOppositeChain = getChainById?.(selectedOppositeChainId)\n // Proceed if both chains are defined and of different ecosystem types (indicating cross-ecosystem bridging)\n if (\n !selectedChain ||\n !selectedOppositeChain ||\n selectedChain.chainType === selectedOppositeChain.chainType\n ) {\n return\n }\n // Identify the destination chain type based on the bridge direction ('from' or 'to')\n const destinationChainType =\n formType === 'from'\n ? selectedOppositeChain.chainType\n : selectedChain.chainType\n // If toAddress is already selected, verify that it matches the destination chain type\n if (selectedToAddress) {\n const selectedToAddressChainType =\n getChainTypeFromAddress(selectedToAddress)\n if (destinationChainType === selectedToAddressChainType) {\n return\n }\n }\n // Find connected account compatible with the destination chain type\n const destinationAccount = accounts?.find(\n (account) => account.chainType === destinationChainType\n )\n // If a compatible destination account is found, set toAddress as if selecting it from the \"Send to Wallet\" connected wallets page\n if (destinationAccount?.address) {\n setFieldValue('toAddress', destinationAccount.address, {\n isDirty: false,\n isTouched: true,\n })\n setSelectedBookmark({\n name: destinationAccount.connector?.name,\n address: destinationAccount.address,\n chainType: destinationAccount.chainType,\n isConnectedAccount: true,\n })\n return destinationAccount.address\n }\n },\n [\n accounts,\n getChainById,\n setFieldValue,\n setSelectedBookmark,\n getChainTypeFromAddress,\n ]\n )\n}\n"],"mappings":";;;;;;;;;;AAmBA,MAAa,iCAEe;CAC1B,MAAM,EAAE,kBAAkB,iBAAiB;CAC3C,MAAM,EAAE,wBAAwB,oBAAoB;CACpD,MAAM,EAAE,iBAAiB,oBAAoB;CAC7C,MAAM,EAAE,aAAa,YAAY;CACjC,MAAM,EAAE,4BAA4B,yBAAyB;
|
|
1
|
+
{"version":3,"file":"useToAddressAutoPopulate.js","names":[],"sources":["../../../src/hooks/useToAddressAutoPopulate.ts"],"sourcesContent":["import { useAccount } from '@lifi/wallet-management'\nimport { useChainTypeFromAddress } from '@lifi/widget-provider'\nimport { useCallback } from 'react'\nimport { useBookmarkActions } from '../stores/bookmarks/useBookmarkActions.js'\nimport type { FormType } from '../stores/form/types.js'\nimport { useFieldActions } from '../stores/form/useFieldActions.js'\nimport { useAvailableChains } from './useAvailableChains.js'\n\ntype UpdateToAddressArgs = {\n formType: FormType\n selectedToAddress?: string\n selectedChainId?: number\n selectedOppositeTokenAddress?: string\n selectedOppositeChainId?: number\n}\n\n/**\n * Automatically populates toAddress field if bridging across ecosystems and compatible wallet is connected\n */\nexport const useToAddressAutoPopulate = (): ((\n args: UpdateToAddressArgs\n) => string | undefined) => {\n const { setFieldValue } = useFieldActions()\n const { setSelectedBookmark } = useBookmarkActions()\n const { getChainById } = useAvailableChains()\n const { accounts } = useAccount()\n const { getChainTypeFromAddress } = useChainTypeFromAddress()\n\n return useCallback(\n ({\n formType,\n selectedToAddress,\n selectedChainId,\n selectedOppositeTokenAddress,\n selectedOppositeChainId,\n }: UpdateToAddressArgs) => {\n if (\n !selectedOppositeTokenAddress ||\n !selectedOppositeChainId ||\n !selectedChainId ||\n !accounts?.length\n ) {\n return\n }\n const selectedChain = getChainById?.(selectedChainId)\n const selectedOppositeChain = getChainById?.(selectedOppositeChainId)\n // Proceed if both chains are defined and of different ecosystem types (indicating cross-ecosystem bridging)\n if (\n !selectedChain ||\n !selectedOppositeChain ||\n selectedChain.chainType === selectedOppositeChain.chainType\n ) {\n return\n }\n // Identify the destination chain type based on the bridge direction ('from' or 'to')\n const destinationChainType =\n formType === 'from'\n ? selectedOppositeChain.chainType\n : selectedChain.chainType\n // If toAddress is already selected, verify that it matches the destination chain type\n if (selectedToAddress) {\n const selectedToAddressChainType =\n getChainTypeFromAddress(selectedToAddress)\n if (destinationChainType === selectedToAddressChainType) {\n return\n }\n }\n // Find connected account compatible with the destination chain type\n const destinationAccount = accounts?.find(\n (account) => account.chainType === destinationChainType\n )\n // If a compatible destination account is found, set toAddress as if selecting it from the \"Send to Wallet\" connected wallets page\n if (destinationAccount?.address) {\n setFieldValue('toAddress', destinationAccount.address, {\n isDirty: false,\n isTouched: true,\n })\n setSelectedBookmark({\n name: destinationAccount.connector?.name,\n address: destinationAccount.address,\n chainType: destinationAccount.chainType,\n isConnectedAccount: true,\n })\n return destinationAccount.address\n }\n },\n [\n accounts,\n getChainById,\n setFieldValue,\n setSelectedBookmark,\n getChainTypeFromAddress,\n ]\n )\n}\n"],"mappings":";;;;;;;;;;AAmBA,MAAa,iCAEe;CAC1B,MAAM,EAAE,kBAAkB,iBAAiB;CAC3C,MAAM,EAAE,wBAAwB,oBAAoB;CACpD,MAAM,EAAE,iBAAiB,oBAAoB;CAC7C,MAAM,EAAE,aAAa,YAAY;CACjC,MAAM,EAAE,4BAA4B,yBAAyB;CAE7D,OAAO,aACJ,EACC,UACA,mBACA,iBACA,8BACA,8BACyB;EACzB,IACE,CAAC,gCACD,CAAC,2BACD,CAAC,mBACD,CAAC,UAAU,QAEX;EAEF,MAAM,gBAAgB,eAAe,gBAAgB;EACrD,MAAM,wBAAwB,eAAe,wBAAwB;EAErE,IACE,CAAC,iBACD,CAAC,yBACD,cAAc,cAAc,sBAAsB,WAElD;EAGF,MAAM,uBACJ,aAAa,SACT,sBAAsB,YACtB,cAAc;EAEpB,IAAI;OAGE,yBADF,wBAAwB,kBAC6B,EACrD;;EAIJ,MAAM,qBAAqB,UAAU,MAClC,YAAY,QAAQ,cAAc,qBACpC;EAED,IAAI,oBAAoB,SAAS;GAC/B,cAAc,aAAa,mBAAmB,SAAS;IACrD,SAAS;IACT,WAAW;IACZ,CAAC;GACF,oBAAoB;IAClB,MAAM,mBAAmB,WAAW;IACpC,SAAS,mBAAmB;IAC5B,WAAW,mBAAmB;IAC9B,oBAAoB;IACrB,CAAC;GACF,OAAO,mBAAmB;;IAG9B;EACE;EACA;EACA;EACA;EACA;EACD,CACF"}
|
|
@@ -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 { HiddenUI, RequiredUI } from '../types/widget.js'\nimport { useIsContractAddress } from './useIsContractAddress.js'\n\nexport const useToAddressRequirements = (\n route?: RouteExtended\n): {\n requiredToAddress: 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, fromChainId, account.chainType)\n const {\n isContractAddress: isToContractAddress,\n isLoading: isToContractLoading,\n isFetched: isToContractFetched,\n } = useIsContractAddress(toAddress, toChainId, 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 requiredToAddress = Boolean(\n (isDifferentChainType ||\n isCrossChainContractAddress ||\n requiredUI?.includes(RequiredUI.ToAddress)) &&\n !hiddenUI?.includes(HiddenUI.ToAddress)\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 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":";;;;;;;;AASA,MAAa,4BACX,UAWG;CACH,MAAM,EAAE,YAAY,aAAa,iBAAiB;CAClD,MAAM,CAAC,iBAAiB,eAAe,iBAAiB,eACtD,aACA,WACA,YACD;CACD,MAAM,EAAE,+BAA+B,oBAAoB;CAE3D,MAAM,cAAc,OAAO,eAAe;CAC1C,MAAM,YAAY,OAAO,aAAa;CAEtC,MAAM,EAAE,OAAO,cAAc,SAAS,YAAY;CAClD,MAAM,EAAE,OAAO,YAAY,SAAS,UAAU;CAC9C,MAAM,EAAE,YAAY,WAAW,EAC7B,WAAW,WAAW,WACvB,CAAC;CAEF,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,aAAa,QAAQ,UAAU;CACzE,MAAM,EACJ,mBAAmB,qBACnB,WAAW,qBACX,WAAW,wBACT,qBAAqB,WAAW,WAAW,SAAS,UAAU;CAElE,MAAM,uBACJ,aAAa,WAAW,UAAU,cAAc,QAAQ;CAI1D,MAAM,yCACJ,6BAA6B,iBAAiB;CAOhD,MAAM,oBAAoB,SACvB,wBALD,yBACA,gBAAgB,aAChB,CAAC,0CAKC,YAAY,SAAA,YAA8B,KAC1C,CAAC,UAAU,SAAA,YAA4B,CAC1C;CAED,MAAM,kCAAkC,QACtC,yBACE,CAAC,0CACD,CAAC,uBACD,aAAa,aAAa,KAAK,WAAW,aAAa,CAC1D;CAED,MAAM,+BAA+B,QACnC,yBACE,uBACA,CAAC,0CACD,aAAa,aAAa,KAAK,WAAW,aAAa,CAC1D;
|
|
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 { HiddenUI, RequiredUI } from '../types/widget.js'\nimport { useIsContractAddress } from './useIsContractAddress.js'\n\nexport const useToAddressRequirements = (\n route?: RouteExtended\n): {\n requiredToAddress: 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, fromChainId, account.chainType)\n const {\n isContractAddress: isToContractAddress,\n isLoading: isToContractLoading,\n isFetched: isToContractFetched,\n } = useIsContractAddress(toAddress, toChainId, 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 requiredToAddress = Boolean(\n (isDifferentChainType ||\n isCrossChainContractAddress ||\n requiredUI?.includes(RequiredUI.ToAddress)) &&\n !hiddenUI?.includes(HiddenUI.ToAddress)\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 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":";;;;;;;;AASA,MAAa,4BACX,UAWG;CACH,MAAM,EAAE,YAAY,aAAa,iBAAiB;CAClD,MAAM,CAAC,iBAAiB,eAAe,iBAAiB,eACtD,aACA,WACA,YACD;CACD,MAAM,EAAE,+BAA+B,oBAAoB;CAE3D,MAAM,cAAc,OAAO,eAAe;CAC1C,MAAM,YAAY,OAAO,aAAa;CAEtC,MAAM,EAAE,OAAO,cAAc,SAAS,YAAY;CAClD,MAAM,EAAE,OAAO,YAAY,SAAS,UAAU;CAC9C,MAAM,EAAE,YAAY,WAAW,EAC7B,WAAW,WAAW,WACvB,CAAC;CAEF,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,aAAa,QAAQ,UAAU;CACzE,MAAM,EACJ,mBAAmB,qBACnB,WAAW,qBACX,WAAW,wBACT,qBAAqB,WAAW,WAAW,SAAS,UAAU;CAElE,MAAM,uBACJ,aAAa,WAAW,UAAU,cAAc,QAAQ;CAI1D,MAAM,yCACJ,6BAA6B,iBAAiB;CAOhD,MAAM,oBAAoB,SACvB,wBALD,yBACA,gBAAgB,aAChB,CAAC,0CAKC,YAAY,SAAA,YAA8B,KAC1C,CAAC,UAAU,SAAA,YAA4B,CAC1C;CAED,MAAM,kCAAkC,QACtC,yBACE,CAAC,0CACD,CAAC,uBACD,aAAa,aAAa,KAAK,WAAW,aAAa,CAC1D;CAED,MAAM,+BAA+B,QACnC,yBACE,uBACA,CAAC,0CACD,aAAa,aAAa,KAAK,WAAW,aAAa,CAC1D;CAED,OAAO;EACL;EACA,qBAAqB,SAAS;EAC9B;EACA;EACA;EACA;EACA;EACA,WAAW,yBAAyB;EACpC,WAAW,yBAAyB;EACrC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useToAddressReset.js","names":[],"sources":["../../../src/hooks/useToAddressReset.ts"],"sourcesContent":["import type { ExtendedChain } from '@lifi/sdk'\nimport { useCallback } from 'react'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { useBookmarkActions } from '../stores/bookmarks/useBookmarkActions.js'\nimport { useBookmarks } from '../stores/bookmarks/useBookmarks.js'\nimport { useFieldActions } from '../stores/form/useFieldActions.js'\nimport { RequiredUI } from '../types/widget.js'\n\nexport const useToAddressReset = (): {\n tryResetToAddress: (toChain: ExtendedChain) => void\n} => {\n const { requiredUI } = useWidgetConfig()\n const { setFieldValue } = useFieldActions()\n const { selectedBookmark } = useBookmarks()\n const { setSelectedBookmark } = useBookmarkActions()\n\n const tryResetToAddress = useCallback(\n (toChain: ExtendedChain) => {\n const requiredToAddress = requiredUI?.includes(RequiredUI.ToAddress)\n\n const bookmarkSatisfiesToChainType =\n selectedBookmark?.chainType === toChain?.chainType\n\n const shouldResetToAddress =\n !requiredToAddress && !bookmarkSatisfiesToChainType\n\n // We reset toAddress on each chain change if it's no longer required, ensuring that\n // switching chain types doesn't leave a stale toAddress from a different ecosystem.\n if (shouldResetToAddress) {\n setFieldValue('toAddress', '', { isTouched: true })\n setSelectedBookmark()\n }\n },\n [setFieldValue, setSelectedBookmark, requiredUI, selectedBookmark]\n )\n\n return {\n tryResetToAddress,\n }\n}\n"],"mappings":";;;;;;;AAQA,MAAa,0BAER;CACH,MAAM,EAAE,eAAe,iBAAiB;CACxC,MAAM,EAAE,kBAAkB,iBAAiB;CAC3C,MAAM,EAAE,qBAAqB,cAAc;CAC3C,MAAM,EAAE,wBAAwB,oBAAoB;
|
|
1
|
+
{"version":3,"file":"useToAddressReset.js","names":[],"sources":["../../../src/hooks/useToAddressReset.ts"],"sourcesContent":["import type { ExtendedChain } from '@lifi/sdk'\nimport { useCallback } from 'react'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { useBookmarkActions } from '../stores/bookmarks/useBookmarkActions.js'\nimport { useBookmarks } from '../stores/bookmarks/useBookmarks.js'\nimport { useFieldActions } from '../stores/form/useFieldActions.js'\nimport { RequiredUI } from '../types/widget.js'\n\nexport const useToAddressReset = (): {\n tryResetToAddress: (toChain: ExtendedChain) => void\n} => {\n const { requiredUI } = useWidgetConfig()\n const { setFieldValue } = useFieldActions()\n const { selectedBookmark } = useBookmarks()\n const { setSelectedBookmark } = useBookmarkActions()\n\n const tryResetToAddress = useCallback(\n (toChain: ExtendedChain) => {\n const requiredToAddress = requiredUI?.includes(RequiredUI.ToAddress)\n\n const bookmarkSatisfiesToChainType =\n selectedBookmark?.chainType === toChain?.chainType\n\n const shouldResetToAddress =\n !requiredToAddress && !bookmarkSatisfiesToChainType\n\n // We reset toAddress on each chain change if it's no longer required, ensuring that\n // switching chain types doesn't leave a stale toAddress from a different ecosystem.\n if (shouldResetToAddress) {\n setFieldValue('toAddress', '', { isTouched: true })\n setSelectedBookmark()\n }\n },\n [setFieldValue, setSelectedBookmark, requiredUI, selectedBookmark]\n )\n\n return {\n tryResetToAddress,\n }\n}\n"],"mappings":";;;;;;;AAQA,MAAa,0BAER;CACH,MAAM,EAAE,eAAe,iBAAiB;CACxC,MAAM,EAAE,kBAAkB,iBAAiB;CAC3C,MAAM,EAAE,qBAAqB,cAAc;CAC3C,MAAM,EAAE,wBAAwB,oBAAoB;CAsBpD,OAAO,EACL,mBArBwB,aACvB,YAA2B;EAC1B,MAAM,oBAAoB,YAAY,SAAA,YAA8B;EAEpE,MAAM,+BACJ,kBAAkB,cAAc,SAAS;EAO3C,IAJE,CAAC,qBAAqB,CAAC,8BAIC;GACxB,cAAc,aAAa,IAAI,EAAE,WAAW,MAAM,CAAC;GACnD,qBAAqB;;IAGzB;EAAC;EAAe;EAAqB;EAAY;EAAiB,CAIjD,EAClB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useToken.js","names":[],"sources":["../../../src/hooks/useToken.ts"],"sourcesContent":["import type { TokenExtended } from '@lifi/sdk'\nimport { useMemo } from 'react'\nimport { useTokenSearch } from './useTokenSearch.js'\nimport { useTokens } from './useTokens.js'\n\nexport const useToken = (\n chainId?: number,\n tokenAddress?: string,\n latest?: boolean\n): {\n token: TokenExtended | undefined\n isLoading: boolean\n} => {\n const { allTokens, isLoading: isTokensLoading } = useTokens()\n\n const token = useMemo(\n () =>\n chainId && tokenAddress\n ? allTokens?.[chainId]?.find(\n (t) => t.address.toLowerCase() === tokenAddress.toLowerCase()\n )\n : undefined,\n [allTokens, chainId, tokenAddress]\n )\n\n const tokenSearchEnabled =\n !!chainId && !!tokenAddress && (latest || (!isTokensLoading && !token))\n\n const { token: searchedToken, isLoading: isSearchLoading } = useTokenSearch(\n chainId,\n tokenAddress,\n tokenSearchEnabled\n )\n\n const resolvedToken = latest\n ? (searchedToken ?? token)\n : (token ?? searchedToken)\n\n return {\n token: resolvedToken,\n isLoading:\n !resolvedToken &&\n (isTokensLoading || (tokenSearchEnabled && isSearchLoading)),\n }\n}\n"],"mappings":";;;;AAKA,MAAa,YACX,SACA,cACA,WAIG;CACH,MAAM,EAAE,WAAW,WAAW,oBAAoB,WAAW;CAE7D,MAAM,QAAQ,cAEV,WAAW,eACP,YAAY,UAAU,MACnB,MAAM,EAAE,QAAQ,aAAa,KAAK,aAAa,aAAa,CAC9D,GACD,KAAA,GACN;EAAC;EAAW;EAAS;EAAa,CACnC;CAED,MAAM,qBACJ,CAAC,CAAC,WAAW,CAAC,CAAC,iBAAiB,UAAW,CAAC,mBAAmB,CAAC;CAElE,MAAM,EAAE,OAAO,eAAe,WAAW,oBAAoB,eAC3D,SACA,cACA,mBACD;CAED,MAAM,gBAAgB,SACjB,iBAAiB,QACjB,SAAS;
|
|
1
|
+
{"version":3,"file":"useToken.js","names":[],"sources":["../../../src/hooks/useToken.ts"],"sourcesContent":["import type { TokenExtended } from '@lifi/sdk'\nimport { useMemo } from 'react'\nimport { useTokenSearch } from './useTokenSearch.js'\nimport { useTokens } from './useTokens.js'\n\nexport const useToken = (\n chainId?: number,\n tokenAddress?: string,\n latest?: boolean\n): {\n token: TokenExtended | undefined\n isLoading: boolean\n} => {\n const { allTokens, isLoading: isTokensLoading } = useTokens()\n\n const token = useMemo(\n () =>\n chainId && tokenAddress\n ? allTokens?.[chainId]?.find(\n (t) => t.address.toLowerCase() === tokenAddress.toLowerCase()\n )\n : undefined,\n [allTokens, chainId, tokenAddress]\n )\n\n const tokenSearchEnabled =\n !!chainId && !!tokenAddress && (latest || (!isTokensLoading && !token))\n\n const { token: searchedToken, isLoading: isSearchLoading } = useTokenSearch(\n chainId,\n tokenAddress,\n tokenSearchEnabled\n )\n\n const resolvedToken = latest\n ? (searchedToken ?? token)\n : (token ?? searchedToken)\n\n return {\n token: resolvedToken,\n isLoading:\n !resolvedToken &&\n (isTokensLoading || (tokenSearchEnabled && isSearchLoading)),\n }\n}\n"],"mappings":";;;;AAKA,MAAa,YACX,SACA,cACA,WAIG;CACH,MAAM,EAAE,WAAW,WAAW,oBAAoB,WAAW;CAE7D,MAAM,QAAQ,cAEV,WAAW,eACP,YAAY,UAAU,MACnB,MAAM,EAAE,QAAQ,aAAa,KAAK,aAAa,aAAa,CAC9D,GACD,KAAA,GACN;EAAC;EAAW;EAAS;EAAa,CACnC;CAED,MAAM,qBACJ,CAAC,CAAC,WAAW,CAAC,CAAC,iBAAiB,UAAW,CAAC,mBAAmB,CAAC;CAElE,MAAM,EAAE,OAAO,eAAe,WAAW,oBAAoB,eAC3D,SACA,cACA,mBACD;CAED,MAAM,gBAAgB,SACjB,iBAAiB,QACjB,SAAS;CAEd,OAAO;EACL,OAAO;EACP,WACE,CAAC,kBACA,mBAAoB,sBAAsB;EAC9C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTokenAddressBalance.js","names":[],"sources":["../../../src/hooks/useTokenAddressBalance.ts"],"sourcesContent":["import type { ExtendedChain, TokenAmount } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport { useChain } from './useChain.js'\nimport { useToken } from './useToken.js'\nimport { useTokenBalance } from './useTokenBalance.js'\n\nexport const useTokenAddressBalance = (\n chainId?: number,\n tokenAddress?: string\n): {\n token: TokenAmount\n chain: ExtendedChain | undefined\n isLoading: boolean\n refetch: () => void\n} => {\n const { chain, isLoading: isChainLoading } = useChain(chainId)\n const { account } = useAccount({ chainType: chain?.chainType })\n const { token, isLoading: isTokenLoading } = useToken(chainId, tokenAddress)\n\n const {\n token: tokenBalance,\n isLoading: isBalanceLoading,\n refetch,\n } = useTokenBalance(account?.address, token)\n\n return {\n token: tokenBalance ?? (token as TokenAmount),\n chain,\n isLoading: isBalanceLoading || isChainLoading || isTokenLoading,\n refetch,\n }\n}\n"],"mappings":";;;;;AAMA,MAAa,0BACX,SACA,iBAMG;CACH,MAAM,EAAE,OAAO,WAAW,mBAAmB,SAAS,QAAQ;CAC9D,MAAM,EAAE,YAAY,WAAW,EAAE,WAAW,OAAO,WAAW,CAAC;CAC/D,MAAM,EAAE,OAAO,WAAW,mBAAmB,SAAS,SAAS,aAAa;CAE5E,MAAM,EACJ,OAAO,cACP,WAAW,kBACX,YACE,gBAAgB,SAAS,SAAS,MAAM;
|
|
1
|
+
{"version":3,"file":"useTokenAddressBalance.js","names":[],"sources":["../../../src/hooks/useTokenAddressBalance.ts"],"sourcesContent":["import type { ExtendedChain, TokenAmount } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport { useChain } from './useChain.js'\nimport { useToken } from './useToken.js'\nimport { useTokenBalance } from './useTokenBalance.js'\n\nexport const useTokenAddressBalance = (\n chainId?: number,\n tokenAddress?: string\n): {\n token: TokenAmount\n chain: ExtendedChain | undefined\n isLoading: boolean\n refetch: () => void\n} => {\n const { chain, isLoading: isChainLoading } = useChain(chainId)\n const { account } = useAccount({ chainType: chain?.chainType })\n const { token, isLoading: isTokenLoading } = useToken(chainId, tokenAddress)\n\n const {\n token: tokenBalance,\n isLoading: isBalanceLoading,\n refetch,\n } = useTokenBalance(account?.address, token)\n\n return {\n token: tokenBalance ?? (token as TokenAmount),\n chain,\n isLoading: isBalanceLoading || isChainLoading || isTokenLoading,\n refetch,\n }\n}\n"],"mappings":";;;;;AAMA,MAAa,0BACX,SACA,iBAMG;CACH,MAAM,EAAE,OAAO,WAAW,mBAAmB,SAAS,QAAQ;CAC9D,MAAM,EAAE,YAAY,WAAW,EAAE,WAAW,OAAO,WAAW,CAAC;CAC/D,MAAM,EAAE,OAAO,WAAW,mBAAmB,SAAS,SAAS,aAAa;CAE5E,MAAM,EACJ,OAAO,cACP,WAAW,kBACX,YACE,gBAAgB,SAAS,SAAS,MAAM;CAE5C,OAAO;EACL,OAAO,gBAAiB;EACxB;EACA,WAAW,oBAAoB,kBAAkB;EACjD;EACD"}
|