@lifi/widget 4.0.0-beta.14 → 4.0.0-beta.18
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/AppDefault.js +31 -29
- package/dist/esm/AppDefault.js.map +1 -1
- package/dist/esm/AppLayout.js +2 -2
- package/dist/esm/AppLayout.js.map +1 -1
- package/dist/esm/components/AmountInput/AmountInput.js +2 -2
- package/dist/esm/components/AmountInput/AmountInput.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 +3 -3
- package/dist/esm/components/AppContainer.js.map +1 -1
- package/dist/esm/components/ChainSelect/ChainSelect.js.map +1 -1
- package/dist/esm/components/ChainSelect/useChainSelect.js.map +1 -1
- package/dist/esm/components/Chains/AllChainsAvatar.js +7 -1
- package/dist/esm/components/Chains/AllChainsAvatar.js.map +1 -1
- package/dist/esm/components/Chains/SelectChainContent.js.map +1 -1
- package/dist/esm/components/ContractComponent/ItemPrice.js +1 -1
- package/dist/esm/components/ContractComponent/ItemPrice.js.map +1 -1
- package/dist/esm/components/ContractComponent/NFT/NFTBase.js +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 +4 -4
- package/dist/esm/components/Expansion/Expansion.js.map +1 -1
- package/dist/esm/components/Header/ActivitiesButton.js +1 -1
- package/dist/esm/components/Header/ActivitiesButton.js.map +1 -1
- package/dist/esm/components/Header/Header.js +2 -2
- package/dist/esm/components/Header/Header.js.map +1 -1
- package/dist/esm/components/Header/NavigationHeader.js +3 -3
- package/dist/esm/components/Header/NavigationHeader.js.map +1 -1
- package/dist/esm/components/Header/WalletHeader.js +3 -3
- package/dist/esm/components/Header/WalletHeader.js.map +1 -1
- package/dist/esm/components/IconCircle/IconCircle.js.map +1 -1
- package/dist/esm/components/IconTypography.js.map +1 -1
- package/dist/esm/components/Messages/AlertMessage.js +1 -1
- package/dist/esm/components/Messages/AlertMessage.js.map +1 -1
- package/dist/esm/components/PageEntered.js +2 -2
- package/dist/esm/components/PageEntered.js.map +1 -1
- package/dist/esm/components/ReverseTokensButton/ReverseTokensButton.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteCard.js +2 -2
- package/dist/esm/components/RouteCard/RouteCard.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteCardEssentials.js +10 -4
- package/dist/esm/components/RouteCard/RouteCardEssentials.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteToken.js +2 -2
- package/dist/esm/components/RouteCard/RouteToken.js.map +1 -1
- package/dist/esm/components/Routes/RoutesExpanded.js +3 -3
- package/dist/esm/components/Routes/RoutesExpanded.js.map +1 -1
- package/dist/esm/components/SelectChainAndToken.js +8 -5
- package/dist/esm/components/SelectChainAndToken.js.map +1 -1
- package/dist/esm/components/SelectTokenButton/SelectTokenButton.style.js +1 -2
- package/dist/esm/components/SelectTokenButton/SelectTokenButton.style.js.map +1 -1
- package/dist/esm/components/SendToWallet/SendToWalletButton.js +4 -4
- package/dist/esm/components/SendToWallet/SendToWalletButton.js.map +1 -1
- package/dist/esm/components/SendToWallet/SendToWalletExpandButton.js +3 -3
- package/dist/esm/components/SendToWallet/SendToWalletExpandButton.js.map +1 -1
- package/dist/esm/components/Skeleton/WidgetSkeleton.js.map +1 -1
- package/dist/esm/components/Step/Step.js +20 -9
- package/dist/esm/components/Step/Step.js.map +1 -1
- package/dist/esm/components/Step/StepActions.js +2 -2
- package/dist/esm/components/Step/StepActions.js.map +1 -1
- package/dist/esm/components/StepActions/StepActions.js +2 -2
- package/dist/esm/components/StepActions/StepActions.js.map +1 -1
- package/dist/esm/components/Tabs/Tabs.style.js.map +1 -1
- package/dist/esm/components/Timer/StepTimer.js.map +1 -1
- package/dist/esm/components/Timer/TimerContent.js +1 -0
- package/dist/esm/components/Timer/TimerContent.js.map +1 -1
- package/dist/esm/components/Token/Token.js +2 -2
- package/dist/esm/components/Token/Token.js.map +1 -1
- package/dist/esm/components/TokenList/TokenDetailsSheetContent.js +6 -4
- package/dist/esm/components/TokenList/TokenDetailsSheetContent.js.map +1 -1
- package/dist/esm/components/TokenList/TokenList.js +2 -2
- 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/VirtualizedTokenList.js.map +1 -1
- package/dist/esm/components/TokenList/useTokenSelect.js +2 -2
- package/dist/esm/components/TokenList/useTokenSelect.js.map +1 -1
- package/dist/esm/components/TransactionCard/ActiveTransactionCard.js +2 -3
- package/dist/esm/components/TransactionCard/ActiveTransactionCard.js.map +1 -1
- package/dist/esm/components/TransactionDetails.js +5 -2
- 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/useAccountsBalancesData.js.map +1 -1
- package/dist/esm/hooks/useActionMessage.js +2 -2
- package/dist/esm/hooks/useActionMessage.js.map +1 -1
- package/dist/esm/hooks/useAddressActivity.js.map +1 -1
- package/dist/esm/hooks/useAddressValidation.js +3 -8
- package/dist/esm/hooks/useAddressValidation.js.map +1 -1
- package/dist/esm/hooks/useAvailableChains.js +2 -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 +3 -3
- package/dist/esm/hooks/useContactSupport.js.map +1 -1
- package/dist/esm/hooks/useDebouncedWatch.js.map +1 -1
- package/dist/esm/hooks/useExplorer.js +15 -4
- 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 +2 -2
- package/dist/esm/hooks/useGasRecommendation.js.map +1 -1
- package/dist/esm/hooks/useGasRefuel.js +2 -2
- package/dist/esm/hooks/useGasRefuel.js.map +1 -1
- package/dist/esm/hooks/useGasSufficiency.js +2 -2
- package/dist/esm/hooks/useGasSufficiency.js.map +1 -1
- package/dist/esm/hooks/useHasChainExpansion.js +3 -3
- package/dist/esm/hooks/useHasChainExpansion.js.map +1 -1
- package/dist/esm/hooks/useIsContractAddress.js.map +1 -1
- package/dist/esm/hooks/useListHeight.js +2 -2
- 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 +5 -7
- package/dist/esm/hooks/useRouteExecution.js.map +1 -1
- package/dist/esm/hooks/useRoutes.js +4 -4
- package/dist/esm/hooks/useRoutes.js.map +1 -1
- package/dist/esm/hooks/useScrollableContainer.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 +2 -2
- package/dist/esm/hooks/useToAddressRequirements.js.map +1 -1
- package/dist/esm/hooks/useToAddressReset.js +2 -2
- package/dist/esm/hooks/useToAddressReset.js.map +1 -1
- package/dist/esm/hooks/useTokenBalance.js.map +1 -1
- package/dist/esm/hooks/useTokenBalances.js +2 -2
- package/dist/esm/hooks/useTokenBalances.js.map +1 -1
- package/dist/esm/hooks/useTokenBalancesQueries.js.map +1 -1
- package/dist/esm/hooks/useTokenSearch.js.map +1 -1
- package/dist/esm/hooks/useTokens.js +4 -2
- package/dist/esm/hooks/useTokens.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 +2 -3
- package/dist/esm/hooks/useTransactionList.js.map +1 -1
- package/dist/esm/hooks/useWidgetEvents.js.map +1 -1
- package/dist/esm/i18n/bn.json +3 -0
- package/dist/esm/i18n/de.json +3 -0
- package/dist/esm/i18n/en.json +3 -0
- package/dist/esm/i18n/es.json +3 -0
- package/dist/esm/i18n/fr.json +3 -0
- package/dist/esm/i18n/hi.json +3 -0
- package/dist/esm/i18n/id.json +3 -0
- package/dist/esm/i18n/it.json +3 -0
- package/dist/esm/i18n/ja.json +3 -0
- package/dist/esm/i18n/ko.json +3 -0
- package/dist/esm/i18n/pl.json +3 -0
- package/dist/esm/i18n/pt.json +3 -0
- package/dist/esm/i18n/th.json +3 -0
- package/dist/esm/i18n/tr.json +3 -0
- package/dist/esm/i18n/uk.json +3 -0
- package/dist/esm/i18n/vi.json +3 -0
- package/dist/esm/i18n/zh.json +3 -0
- package/dist/esm/pages/ActivitiesPage/ActivitiesPage.js +1 -2
- package/dist/esm/pages/ActivitiesPage/ActivitiesPage.js.map +1 -1
- package/dist/esm/pages/ActivitiesPage/ActivitiesPageMenuButton.js +1 -1
- package/dist/esm/pages/ActivitiesPage/ActivitiesPageMenuButton.js.map +1 -1
- package/dist/esm/pages/MainPage/MainPage.js +6 -6
- package/dist/esm/pages/MainPage/MainPage.js.map +1 -1
- package/dist/esm/pages/MainPage/ReviewButton.js +2 -2
- package/dist/esm/pages/MainPage/ReviewButton.js.map +1 -1
- package/dist/esm/pages/RoutesPage/RoutesPage.js +3 -3
- 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/SelectTokenPage.js +3 -3
- package/dist/esm/pages/SelectTokenPage/SelectTokenPage.js.map +1 -1
- package/dist/esm/pages/SendToWallet/BookmarksPage.js +1 -1
- package/dist/esm/pages/SendToWallet/BookmarksPage.js.map +1 -1
- package/dist/esm/pages/SendToWallet/RecentWalletsPage.js +1 -1
- package/dist/esm/pages/SendToWallet/RecentWalletsPage.js.map +1 -1
- package/dist/esm/pages/SendToWallet/SendToWalletPage.js +6 -6
- package/dist/esm/pages/SendToWallet/SendToWalletPage.js.map +1 -1
- package/dist/esm/pages/SettingsPage/BridgeAndExchangeSettings.js +2 -2
- package/dist/esm/pages/SettingsPage/BridgeAndExchangeSettings.js.map +1 -1
- package/dist/esm/pages/SettingsPage/LanguageSetting.js +2 -2
- package/dist/esm/pages/SettingsPage/LanguageSetting.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SettingsPage.js +2 -2
- package/dist/esm/pages/SettingsPage/SettingsPage.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SmallBalanceFilterSettings.js.map +1 -1
- package/dist/esm/pages/SettingsPage/ThemeSettings.js +2 -2
- package/dist/esm/pages/SettingsPage/ThemeSettings.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/ContactSupportButton.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/StepActionRow.js +2 -2
- package/dist/esm/pages/TransactionDetailsPage/StepActionRow.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/StepActionsList.js +11 -5
- 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/TransferIdCard.js +2 -2
- package/dist/esm/pages/TransactionDetailsPage/TransferIdCard.js.map +1 -1
- package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.js +2 -2
- package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.js.map +1 -1
- package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.js +1 -1
- package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.js.map +1 -1
- package/dist/esm/pages/TransactionPage/StartTransactionButton.js.map +1 -1
- package/dist/esm/pages/TransactionPage/StatusBottomSheet.js +20 -21
- package/dist/esm/pages/TransactionPage/StatusBottomSheet.js.map +1 -1
- package/dist/esm/pages/TransactionPage/StatusBottomSheet.style.js +5 -6
- package/dist/esm/pages/TransactionPage/StatusBottomSheet.style.js.map +1 -1
- package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.js +14 -4
- package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.js.map +1 -1
- package/dist/esm/pages/TransactionPage/TransactionPage.js +15 -19
- package/dist/esm/pages/TransactionPage/TransactionPage.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/ThemeProvider/ThemeProvider.js.map +1 -1
- package/dist/esm/providers/WalletProvider/WalletProvider.js.map +1 -1
- package/dist/esm/providers/WalletProvider/useExternalWalletProvider.js +7 -3
- package/dist/esm/providers/WalletProvider/useExternalWalletProvider.js.map +1 -1
- package/dist/esm/providers/WidgetProvider/WidgetProvider.js.map +1 -1
- package/dist/esm/stores/bookmarks/useBookmarkActions.js.map +1 -1
- package/dist/esm/stores/chains/ChainOrderStore.js +2 -2
- package/dist/esm/stores/chains/ChainOrderStore.js.map +1 -1
- package/dist/esm/stores/chains/createChainOrderStore.js +2 -2
- 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/URLSearchParamsBuilder.js.map +1 -1
- package/dist/esm/stores/form/createFormStore.js.map +1 -1
- package/dist/esm/stores/form/useFieldActions.js +3 -3
- 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 +2 -2
- package/dist/esm/stores/form/useFormRef.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/routes/RouteExecutionStore.js.map +1 -1
- package/dist/esm/stores/routes/createRouteExecutionStore.js +8 -9
- package/dist/esm/stores/routes/createRouteExecutionStore.js.map +1 -1
- package/dist/esm/stores/routes/useRouteExecutionIndicator.js +2 -3
- package/dist/esm/stores/routes/useRouteExecutionIndicator.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 +1 -5
- package/dist/esm/stores/settings/createSettingsStore.js.map +1 -1
- package/dist/esm/stores/settings/useSettingsActions.js +2 -2
- 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 +4 -4
- package/dist/esm/themes/createTheme.js.map +1 -1
- package/dist/esm/types/events.d.ts +0 -5
- package/dist/esm/types/events.d.ts.map +1 -1
- package/dist/esm/types/events.js +0 -4
- package/dist/esm/types/events.js.map +1 -1
- package/dist/esm/types/widget.d.ts +1 -5
- package/dist/esm/types/widget.d.ts.map +1 -1
- package/dist/esm/types/widget.js.map +1 -1
- package/dist/esm/utils/converters.js.map +1 -1
- package/dist/esm/utils/elements.js +5 -12
- package/dist/esm/utils/elements.js.map +1 -1
- package/dist/esm/utils/format.js.map +1 -1
- package/dist/esm/utils/timer.js.map +1 -1
- package/dist/esm/utils/token.js.map +1 -1
- package/package.json +11 -11
- package/src/AppDefault.tsx +9 -11
- package/src/components/Chains/AllChainsAvatar.tsx +7 -1
- package/src/components/ContractComponent/ItemPrice.tsx +1 -1
- package/src/components/ContractComponent/NFT/NFTBase.tsx +1 -1
- package/src/components/Header/ActivitiesButton.tsx +1 -1
- package/src/components/IconTypography.ts +8 -8
- package/src/components/Messages/AlertMessage.tsx +1 -1
- package/src/components/RouteCard/RouteCardEssentials.tsx +2 -2
- package/src/components/SelectChainAndToken.tsx +1 -1
- package/src/components/SendToWallet/SendToWalletButton.tsx +1 -1
- package/src/components/Step/Step.tsx +6 -7
- package/src/components/Timer/TimerContent.tsx +1 -0
- package/src/components/Token/Token.tsx +2 -2
- package/src/components/TokenList/TokenDetailsSheetContent.tsx +6 -4
- package/src/components/TransactionCard/ActiveTransactionCard.tsx +1 -1
- package/src/components/TransactionDetails.tsx +1 -1
- package/src/config/version.ts +1 -1
- package/src/hooks/useActionMessage.ts +4 -3
- package/src/hooks/useAvailableChains.ts +1 -0
- package/src/hooks/useExplorer.ts +16 -5
- package/src/hooks/useRouteExecution.ts +0 -2
- package/src/hooks/useTokens.ts +2 -0
- package/src/pages/ActivitiesPage/ActivitiesPageMenuButton.tsx +1 -1
- package/src/pages/MainPage/MainPage.tsx +3 -3
- package/src/pages/RoutesPage/RoutesPage.tsx +6 -1
- package/src/pages/SendToWallet/BookmarksPage.tsx +1 -1
- package/src/pages/SendToWallet/RecentWalletsPage.tsx +1 -1
- package/src/pages/TransactionDetailsPage/StepActionRow.tsx +3 -2
- package/src/pages/TransactionDetailsPage/StepActionsList.tsx +19 -12
- package/src/pages/TransactionPage/ExchangeRateBottomSheet.tsx +1 -1
- package/src/pages/TransactionPage/StatusBottomSheet.tsx +1 -1
- package/src/pages/TransactionPage/TokenValueBottomSheet.tsx +27 -5
- package/src/pages/TransactionPage/TransactionPage.tsx +2 -9
- package/src/providers/WalletProvider/useExternalWalletProvider.ts +9 -1
- package/src/stores/settings/createSettingsStore.ts +1 -9
- package/src/themes/createTheme.ts +4 -6
- package/src/types/events.ts +0 -5
- package/src/types/widget.ts +1 -4
- package/dist/esm/stores/routes/types.js +0 -14
- package/dist/esm/stores/routes/types.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAddressValidation.js","names":[],"sources":["../../../src/hooks/useAddressValidation.ts"],"sourcesContent":["import type { Chain, ChainType } from '@lifi/sdk'\nimport { getNameServiceAddress } from '@lifi/sdk'\nimport { useChainTypeFromAddress } from '@lifi/widget-provider'\nimport { useMutation } from '@tanstack/react-query'\nimport { useTranslation } from 'react-i18next'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\n\nexport enum AddressType {\n Address = 0,\n NameService = 1,\n}\n\ntype ValidationArgs = {\n value: string\n chainType?: ChainType\n chain?: Chain\n}\n\ntype ValidResponse = {\n address: string\n addressType: AddressType\n chainType: ChainType\n isValid: true\n}\n\ntype InvalidResponse = {\n error: string\n isValid: false\n}\n\nexport const useAddressValidation = (): {\n validateAddress: (\n args: ValidationArgs\n ) => Promise<ValidResponse | InvalidResponse>\n isValidating: boolean\n} => {\n const { t } = useTranslation()\n const { getChainTypeFromAddress } = useChainTypeFromAddress()\n const sdkClient = useSDKClient()\n\n const { mutateAsync: validateAddress, isPending: isValidating } = useMutation(\n {\n mutationFn: async ({\n value,\n chainType,\n chain,\n }: ValidationArgs): Promise<ValidResponse | InvalidResponse> => {\n try {\n if (!value) {\n throw new Error()\n }\n\n const _chainType = getChainTypeFromAddress(value)\n if (_chainType) {\n return {\n address: value,\n addressType: AddressType.Address,\n chainType: _chainType,\n isValid: true,\n }\n }\n\n const address = await getNameServiceAddress(\n sdkClient,\n value,\n chainType\n )\n\n if (address) {\n const _chainType = getChainTypeFromAddress(address)\n if (_chainType) {\n return {\n address: address,\n addressType: AddressType.NameService,\n chainType: _chainType,\n isValid: true,\n }\n }\n }\n\n throw new Error()\n } catch (_) {\n return {\n isValid: false,\n error: t(\n 'error.title.walletAddressInvalid',\n chain?.name\n ? { context: 'chain', chainName: chain.name }\n : undefined\n ),\n }\n }\n },\n }\n )\n\n return {\n validateAddress,\n isValidating,\n }\n}\n"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"useAddressValidation.js","names":[],"sources":["../../../src/hooks/useAddressValidation.ts"],"sourcesContent":["import type { Chain, ChainType } from '@lifi/sdk'\nimport { getNameServiceAddress } from '@lifi/sdk'\nimport { useChainTypeFromAddress } from '@lifi/widget-provider'\nimport { useMutation } from '@tanstack/react-query'\nimport { useTranslation } from 'react-i18next'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\n\nexport enum AddressType {\n Address = 0,\n NameService = 1,\n}\n\ntype ValidationArgs = {\n value: string\n chainType?: ChainType\n chain?: Chain\n}\n\ntype ValidResponse = {\n address: string\n addressType: AddressType\n chainType: ChainType\n isValid: true\n}\n\ntype InvalidResponse = {\n error: string\n isValid: false\n}\n\nexport const useAddressValidation = (): {\n validateAddress: (\n args: ValidationArgs\n ) => Promise<ValidResponse | InvalidResponse>\n isValidating: boolean\n} => {\n const { t } = useTranslation()\n const { getChainTypeFromAddress } = useChainTypeFromAddress()\n const sdkClient = useSDKClient()\n\n const { mutateAsync: validateAddress, isPending: isValidating } = useMutation(\n {\n mutationFn: async ({\n value,\n chainType,\n chain,\n }: ValidationArgs): Promise<ValidResponse | InvalidResponse> => {\n try {\n if (!value) {\n throw new Error()\n }\n\n const _chainType = getChainTypeFromAddress(value)\n if (_chainType) {\n return {\n address: value,\n addressType: AddressType.Address,\n chainType: _chainType,\n isValid: true,\n }\n }\n\n const address = await getNameServiceAddress(\n sdkClient,\n value,\n chainType\n )\n\n if (address) {\n const _chainType = getChainTypeFromAddress(address)\n if (_chainType) {\n return {\n address: address,\n addressType: AddressType.NameService,\n chainType: _chainType,\n isValid: true,\n }\n }\n }\n\n throw new Error()\n } catch (_) {\n return {\n isValid: false,\n error: t(\n 'error.title.walletAddressInvalid',\n chain?.name\n ? { context: 'chain', chainName: chain.name }\n : undefined\n ),\n }\n }\n },\n }\n )\n\n return {\n validateAddress,\n isValidating,\n }\n}\n"],"mappings":";;;;;;AA8BA,MAAa,6BAKR;CACH,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EAAE,4BAA4B,yBAAyB;CAC7D,MAAM,YAAY,cAAc;CAEhC,MAAM,EAAE,aAAa,iBAAiB,WAAW,iBAAiB,YAChE,EACE,YAAY,OAAO,EACjB,OACA,WACA,YAC8D;AAC9D,MAAI;AACF,OAAI,CAAC,MACH,OAAM,IAAI,OAAO;GAGnB,MAAM,aAAa,wBAAwB,MAAM;AACjD,OAAI,WACF,QAAO;IACL,SAAS;IACT,aAAA;IACA,WAAW;IACX,SAAS;IACV;GAGH,MAAM,UAAU,MAAM,sBACpB,WACA,OACA,UACD;AAED,OAAI,SAAS;IACX,MAAM,aAAa,wBAAwB,QAAQ;AACnD,QAAI,WACF,QAAO;KACI;KACT,aAAA;KACA,WAAW;KACX,SAAS;KACV;;AAIL,SAAM,IAAI,OAAO;WACV,GAAG;AACV,UAAO;IACL,SAAS;IACT,OAAO,EACL,oCACA,OAAO,OACH;KAAE,SAAS;KAAS,WAAW,MAAM;KAAM,GAC3C,KAAA,EACL;IACF;;IAGN,CACF;AAED,QAAO;EACL;EACA;EACD"}
|
|
@@ -10,7 +10,8 @@ const supportedChainTypes = [
|
|
|
10
10
|
ChainType.EVM,
|
|
11
11
|
ChainType.SVM,
|
|
12
12
|
ChainType.UTXO,
|
|
13
|
-
ChainType.MVM
|
|
13
|
+
ChainType.MVM,
|
|
14
|
+
ChainType.TVM
|
|
14
15
|
];
|
|
15
16
|
const useAvailableChains = (chainTypes, widgetConfig) => {
|
|
16
17
|
const { chains: internalChains, keyPrefix: internalKeyPrefix } = useWidgetConfig();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAvailableChains.js","names":[],"sources":["../../../src/hooks/useAvailableChains.ts"],"sourcesContent":["import type { ExtendedChain } from '@lifi/sdk'\nimport { ChainType, createClient, getChains } from '@lifi/sdk'\nimport { useQuery } from '@tanstack/react-query'\nimport { useCallback, useEffect, useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport type { WidgetConfig } from '../types/widget.js'\nimport { getConfigItemSets, isItemAllowedForSets } from '../utils/item.js'\nimport { getQueryKey } from '../utils/queries.js'\n\ntype GetChainById = (\n chainId?: number,\n chains?: ExtendedChain[]\n) => ExtendedChain | undefined\n\nconst supportedChainTypes = [\n ChainType.EVM,\n ChainType.SVM,\n ChainType.UTXO,\n ChainType.MVM,\n]\n\nexport const useAvailableChains = (\n chainTypes?: ChainType[],\n widgetConfig?: WidgetConfig\n): {\n chains: ExtendedChain[] | undefined\n getChainById: GetChainById\n isLoading: boolean\n} => {\n const { chains: internalChains, keyPrefix: internalKeyPrefix } =\n useWidgetConfig()\n const internalClient = useSDKClient()\n\n const externalClient = useMemo(() => {\n if (!widgetConfig) {\n return undefined\n }\n return createClient({\n ...widgetConfig.sdkConfig,\n apiKey: widgetConfig.apiKey,\n integrator: widgetConfig.integrator ?? window?.location.hostname,\n })\n }, [widgetConfig])\n\n // Overwrite widget config if passed as param\n const keyPrefix = widgetConfig?.keyPrefix ?? internalKeyPrefix\n const chains = widgetConfig?.chains ?? internalChains\n\n const { data, isLoading } = useQuery({\n queryKey: [\n getQueryKey('chains', keyPrefix),\n chains?.types,\n chains?.allow,\n chains?.deny,\n chains?.from,\n chains?.to,\n !!externalClient,\n ] as const,\n queryFn: async ({ queryKey: [, chainTypesConfig] }) => {\n const chainsConfigSets = getConfigItemSets(\n chainTypesConfig,\n (chains) => new Set(chains)\n )\n const chainTypesRequest = supportedChainTypes.filter((chainType) =>\n isItemAllowedForSets(chainType, chainsConfigSets)\n )\n const client = externalClient ?? internalClient\n const availableChains = await getChains(client, {\n chainTypes: chainTypes || chainTypesRequest,\n })\n client.setChains(availableChains)\n return availableChains\n },\n refetchInterval: 300_000,\n staleTime: 300_000,\n })\n\n // Ensure the current internal client always has chains, even when:\n // - the query result came from cache (external call populated it first)\n // - the client was recreated due to config changes (stale closure in queryFn)\n useEffect(() => {\n if (data && !externalClient) {\n internalClient.setChains(data)\n }\n }, [data, externalClient, internalClient])\n\n const getChainById: GetChainById = useCallback(\n (chainId?: number, chains: ExtendedChain[] | undefined = data) => {\n if (!chainId) {\n return\n }\n const chain = chains?.find((chain) => chain.id === chainId)\n // if (!chain) {\n // throw new Error('Chain not found or chainId is invalid.');\n // }\n return chain\n },\n [data]\n )\n\n return {\n chains: data,\n getChainById,\n isLoading,\n }\n}\n"],"mappings":";;;;;;;;AAeA,MAAM,sBAAsB;CAC1B,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACX;AAED,MAAa,sBACX,YACA,iBAKG;CACH,MAAM,EAAE,QAAQ,gBAAgB,WAAW,sBACzC,iBAAiB;CACnB,MAAM,iBAAiB,cAAc;CAErC,MAAM,iBAAiB,cAAc;AACnC,MAAI,CAAC,aACH;AAEF,SAAO,aAAa;GAClB,GAAG,aAAa;GAChB,QAAQ,aAAa;GACrB,YAAY,aAAa,cAAc,QAAQ,SAAS;GACzD,CAAC;IACD,CAAC,aAAa,CAAC;CAGlB,MAAM,YAAY,cAAc,aAAa;CAC7C,MAAM,SAAS,cAAc,UAAU;CAEvC,MAAM,EAAE,MAAM,cAAc,SAAS;EACnC,UAAU;GACR,YAAY,UAAU,UAAU;GAChC,QAAQ;GACR,QAAQ;GACR,QAAQ;GACR,QAAQ;GACR,QAAQ;GACR,CAAC,CAAC;GACH;EACD,SAAS,OAAO,EAAE,UAAU,GAAG,wBAAwB;GACrD,MAAM,mBAAmB,kBACvB,mBACC,WAAW,IAAI,IAAI,OAAO,CAC5B;GACD,MAAM,oBAAoB,oBAAoB,QAAQ,cACpD,qBAAqB,WAAW,iBAAiB,CAClD;GACD,MAAM,SAAS,kBAAkB;GACjC,MAAM,kBAAkB,MAAM,UAAU,QAAQ,EAC9C,YAAY,cAAc,mBAC3B,CAAC;AACF,UAAO,UAAU,gBAAgB;AACjC,UAAO;;EAET,iBAAiB;EACjB,WAAW;EACZ,CAAC;AAKF,iBAAgB;AACd,MAAI,QAAQ,CAAC,eACX,gBAAe,UAAU,KAAK;IAE/B;EAAC;EAAM;EAAgB;EAAe,CAAC;AAgB1C,QAAO;EACL,QAAQ;EACR,cAhBiC,aAChC,SAAkB,SAAsC,SAAS;AAChE,OAAI,CAAC,QACH;AAMF,UAJc,QAAQ,MAAM,UAAU,MAAM,OAAO,QAAQ;KAM7D,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"useAvailableChains.js","names":[],"sources":["../../../src/hooks/useAvailableChains.ts"],"sourcesContent":["import type { ExtendedChain } from '@lifi/sdk'\nimport { ChainType, createClient, getChains } from '@lifi/sdk'\nimport { useQuery } from '@tanstack/react-query'\nimport { useCallback, useEffect, useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport type { WidgetConfig } from '../types/widget.js'\nimport { getConfigItemSets, isItemAllowedForSets } from '../utils/item.js'\nimport { getQueryKey } from '../utils/queries.js'\n\ntype GetChainById = (\n chainId?: number,\n chains?: ExtendedChain[]\n) => ExtendedChain | undefined\n\nconst supportedChainTypes = [\n ChainType.EVM,\n ChainType.SVM,\n ChainType.UTXO,\n ChainType.MVM,\n ChainType.TVM,\n]\n\nexport const useAvailableChains = (\n chainTypes?: ChainType[],\n widgetConfig?: WidgetConfig\n): {\n chains: ExtendedChain[] | undefined\n getChainById: GetChainById\n isLoading: boolean\n} => {\n const { chains: internalChains, keyPrefix: internalKeyPrefix } =\n useWidgetConfig()\n const internalClient = useSDKClient()\n\n const externalClient = useMemo(() => {\n if (!widgetConfig) {\n return undefined\n }\n return createClient({\n ...widgetConfig.sdkConfig,\n apiKey: widgetConfig.apiKey,\n integrator: widgetConfig.integrator ?? window?.location.hostname,\n })\n }, [widgetConfig])\n\n // Overwrite widget config if passed as param\n const keyPrefix = widgetConfig?.keyPrefix ?? internalKeyPrefix\n const chains = widgetConfig?.chains ?? internalChains\n\n const { data, isLoading } = useQuery({\n queryKey: [\n getQueryKey('chains', keyPrefix),\n chains?.types,\n chains?.allow,\n chains?.deny,\n chains?.from,\n chains?.to,\n !!externalClient,\n ] as const,\n queryFn: async ({ queryKey: [, chainTypesConfig] }) => {\n const chainsConfigSets = getConfigItemSets(\n chainTypesConfig,\n (chains) => new Set(chains)\n )\n const chainTypesRequest = supportedChainTypes.filter((chainType) =>\n isItemAllowedForSets(chainType, chainsConfigSets)\n )\n const client = externalClient ?? internalClient\n const availableChains = await getChains(client, {\n chainTypes: chainTypes || chainTypesRequest,\n })\n client.setChains(availableChains)\n return availableChains\n },\n refetchInterval: 300_000,\n staleTime: 300_000,\n })\n\n // Ensure the current internal client always has chains, even when:\n // - the query result came from cache (external call populated it first)\n // - the client was recreated due to config changes (stale closure in queryFn)\n useEffect(() => {\n if (data && !externalClient) {\n internalClient.setChains(data)\n }\n }, [data, externalClient, internalClient])\n\n const getChainById: GetChainById = useCallback(\n (chainId?: number, chains: ExtendedChain[] | undefined = data) => {\n if (!chainId) {\n return\n }\n const chain = chains?.find((chain) => chain.id === chainId)\n // if (!chain) {\n // throw new Error('Chain not found or chainId is invalid.');\n // }\n return chain\n },\n [data]\n )\n\n return {\n chains: data,\n getChainById,\n isLoading,\n }\n}\n"],"mappings":";;;;;;;;AAeA,MAAM,sBAAsB;CAC1B,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACX;AAED,MAAa,sBACX,YACA,iBAKG;CACH,MAAM,EAAE,QAAQ,gBAAgB,WAAW,sBACzC,iBAAiB;CACnB,MAAM,iBAAiB,cAAc;CAErC,MAAM,iBAAiB,cAAc;AACnC,MAAI,CAAC,aACH;AAEF,SAAO,aAAa;GAClB,GAAG,aAAa;GAChB,QAAQ,aAAa;GACrB,YAAY,aAAa,cAAc,QAAQ,SAAS;GACzD,CAAC;IACD,CAAC,aAAa,CAAC;CAGlB,MAAM,YAAY,cAAc,aAAa;CAC7C,MAAM,SAAS,cAAc,UAAU;CAEvC,MAAM,EAAE,MAAM,cAAc,SAAS;EACnC,UAAU;GACR,YAAY,UAAU,UAAU;GAChC,QAAQ;GACR,QAAQ;GACR,QAAQ;GACR,QAAQ;GACR,QAAQ;GACR,CAAC,CAAC;GACH;EACD,SAAS,OAAO,EAAE,UAAU,GAAG,wBAAwB;GACrD,MAAM,mBAAmB,kBACvB,mBACC,WAAW,IAAI,IAAI,OAAO,CAC5B;GACD,MAAM,oBAAoB,oBAAoB,QAAQ,cACpD,qBAAqB,WAAW,iBAAiB,CAClD;GACD,MAAM,SAAS,kBAAkB;GACjC,MAAM,kBAAkB,MAAM,UAAU,QAAQ,EAC9C,YAAY,cAAc,mBAC3B,CAAC;AACF,UAAO,UAAU,gBAAgB;AACjC,UAAO;;EAET,iBAAiB;EACjB,WAAW;EACZ,CAAC;AAKF,iBAAgB;AACd,MAAI,QAAQ,CAAC,eACX,gBAAe,UAAU,KAAK;IAE/B;EAAC;EAAM;EAAgB;EAAe,CAAC;AAgB1C,QAAO;EACL,QAAQ;EACR,cAhBiC,aAChC,SAAkB,SAAsC,SAAS;AAChE,OAAI,CAAC,QACH;AAMF,UAJc,QAAQ,MAAM,UAAU,MAAM,OAAO,QAAQ;KAM7D,CAAC,KAAK,CAKM;EACZ;EACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useChain.js","names":[],"sources":["../../../src/hooks/useChain.ts"],"sourcesContent":["import type { ExtendedChain } from '@lifi/sdk'\nimport { useMemo } from 'react'\nimport { useAvailableChains } from './useAvailableChains.js'\n\nexport const useChain = (\n chainId?: number\n): {\n chain: ExtendedChain | undefined\n isLoading: boolean\n getChainById: (\n chainId?: number,\n chains?: ExtendedChain[]\n ) => ExtendedChain | undefined\n} => {\n const { isLoading, getChainById } = useAvailableChains()\n\n const chain = useMemo(() => getChainById(chainId), [chainId, getChainById])\n\n return {\n chain,\n isLoading,\n getChainById,\n }\n}\n"],"mappings":";;;AAIA,MAAa,YACX,YAQG;CACH,MAAM,EAAE,WAAW,iBAAiB,oBAAoB;AAIxD,QAAO;EACL,OAHY,cAAc,aAAa,QAAQ,EAAE,CAAC,SAAS,aAAa,
|
|
1
|
+
{"version":3,"file":"useChain.js","names":[],"sources":["../../../src/hooks/useChain.ts"],"sourcesContent":["import type { ExtendedChain } from '@lifi/sdk'\nimport { useMemo } from 'react'\nimport { useAvailableChains } from './useAvailableChains.js'\n\nexport const useChain = (\n chainId?: number\n): {\n chain: ExtendedChain | undefined\n isLoading: boolean\n getChainById: (\n chainId?: number,\n chains?: ExtendedChain[]\n ) => ExtendedChain | undefined\n} => {\n const { isLoading, getChainById } = useAvailableChains()\n\n const chain = useMemo(() => getChainById(chainId), [chainId, getChainById])\n\n return {\n chain,\n isLoading,\n getChainById,\n }\n}\n"],"mappings":";;;AAIA,MAAa,YACX,YAQG;CACH,MAAM,EAAE,WAAW,iBAAiB,oBAAoB;AAIxD,QAAO;EACL,OAHY,cAAc,aAAa,QAAQ,EAAE,CAAC,SAAS,aAAa,CAGnE;EACL;EACA;EACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useChains.js","names":[],"sources":["../../../src/hooks/useChains.ts"],"sourcesContent":["import type { ChainType, ExtendedChain } from '@lifi/sdk'\nimport { useMemo } from 'react'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport type { FormType } from '../stores/form/types.js'\nimport { getConfigItemSets, isFormItemAllowed } from '../utils/item.js'\nimport { useAvailableChains } from './useAvailableChains.js'\n\nexport const useChains = (\n type?: FormType,\n chainTypes?: ChainType[]\n): {\n chains: ExtendedChain[] | undefined\n getChainById: (\n chainId?: number,\n chains?: ExtendedChain[]\n ) => ExtendedChain | undefined\n isLoading: boolean\n} => {\n const { chains } = useWidgetConfig()\n const {\n chains: availableChains,\n isLoading: isLoadingAvailableChains,\n getChainById,\n } = useAvailableChains()\n\n const filteredChains = useMemo(() => {\n const chainsConfigSets = getConfigItemSets(\n chains,\n (chains) => new Set(chains),\n type\n )\n const filteredChains = type\n ? availableChains?.filter(\n (chain) =>\n isFormItemAllowed(chain.id, chainsConfigSets, type) &&\n // Check against chain types if they are provided\n (chainTypes?.includes(chain.chainType) ?? true)\n )\n : availableChains?.filter((chain) =>\n isFormItemAllowed(chain.id, chainsConfigSets)\n )\n return filteredChains\n }, [availableChains, chainTypes, chains, type])\n\n return {\n chains: filteredChains,\n getChainById,\n isLoading: isLoadingAvailableChains,\n }\n}\n"],"mappings":";;;;;AAOA,MAAa,aACX,MACA,eAQG;CACH,MAAM,EAAE,WAAW,iBAAiB;CACpC,MAAM,EACJ,QAAQ,iBACR,WAAW,0BACX,iBACE,oBAAoB;AAqBxB,QAAO;EACL,QApBqB,cAAc;GACnC,MAAM,mBAAmB,kBACvB,SACC,WAAW,IAAI,IAAI,OAAO,EAC3B,KACD;AAWD,UAVuB,OACnB,iBAAiB,QACd,UACC,kBAAkB,MAAM,IAAI,kBAAkB,KAAK,KAElD,YAAY,SAAS,MAAM,UAAU,IAAI,MAC7C,GACD,iBAAiB,QAAQ,UACvB,kBAAkB,MAAM,IAAI,iBAAiB,CAC9C;KAEJ;GAAC;GAAiB;GAAY;GAAQ;GAAK,
|
|
1
|
+
{"version":3,"file":"useChains.js","names":[],"sources":["../../../src/hooks/useChains.ts"],"sourcesContent":["import type { ChainType, ExtendedChain } from '@lifi/sdk'\nimport { useMemo } from 'react'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport type { FormType } from '../stores/form/types.js'\nimport { getConfigItemSets, isFormItemAllowed } from '../utils/item.js'\nimport { useAvailableChains } from './useAvailableChains.js'\n\nexport const useChains = (\n type?: FormType,\n chainTypes?: ChainType[]\n): {\n chains: ExtendedChain[] | undefined\n getChainById: (\n chainId?: number,\n chains?: ExtendedChain[]\n ) => ExtendedChain | undefined\n isLoading: boolean\n} => {\n const { chains } = useWidgetConfig()\n const {\n chains: availableChains,\n isLoading: isLoadingAvailableChains,\n getChainById,\n } = useAvailableChains()\n\n const filteredChains = useMemo(() => {\n const chainsConfigSets = getConfigItemSets(\n chains,\n (chains) => new Set(chains),\n type\n )\n const filteredChains = type\n ? availableChains?.filter(\n (chain) =>\n isFormItemAllowed(chain.id, chainsConfigSets, type) &&\n // Check against chain types if they are provided\n (chainTypes?.includes(chain.chainType) ?? true)\n )\n : availableChains?.filter((chain) =>\n isFormItemAllowed(chain.id, chainsConfigSets)\n )\n return filteredChains\n }, [availableChains, chainTypes, chains, type])\n\n return {\n chains: filteredChains,\n getChainById,\n isLoading: isLoadingAvailableChains,\n }\n}\n"],"mappings":";;;;;AAOA,MAAa,aACX,MACA,eAQG;CACH,MAAM,EAAE,WAAW,iBAAiB;CACpC,MAAM,EACJ,QAAQ,iBACR,WAAW,0BACX,iBACE,oBAAoB;AAqBxB,QAAO;EACL,QApBqB,cAAc;GACnC,MAAM,mBAAmB,kBACvB,SACC,WAAW,IAAI,IAAI,OAAO,EAC3B,KACD;AAWD,UAVuB,OACnB,iBAAiB,QACd,UACC,kBAAkB,MAAM,IAAI,kBAAkB,KAAK,KAElD,YAAY,SAAS,MAAM,UAAU,IAAI,MAC7C,GACD,iBAAiB,QAAQ,UACvB,kBAAkB,MAAM,IAAI,iBAAiB,CAC9C;KAEJ;GAAC;GAAiB;GAAY;GAAQ;GAAK,CAGtB;EACtB;EACA,WAAW;EACZ"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { useWidgetEvents } from "./useWidgetEvents.js";
|
|
2
|
-
import
|
|
2
|
+
import "../types/events.js";
|
|
3
3
|
//#region src/hooks/useContactSupport.ts
|
|
4
4
|
const useContactSupport = (supportId) => {
|
|
5
5
|
const widgetEvents = useWidgetEvents();
|
|
6
6
|
const handleContactSupport = () => {
|
|
7
|
-
if (!widgetEvents.all.has(
|
|
8
|
-
else widgetEvents.emit(
|
|
7
|
+
if (!widgetEvents.all.has("contactSupport")) window.open("https://help.li.fi", "_blank", "nofollow noreferrer");
|
|
8
|
+
else widgetEvents.emit("contactSupport", { supportId });
|
|
9
9
|
};
|
|
10
10
|
return handleContactSupport;
|
|
11
11
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useContactSupport.js","names":[],"sources":["../../../src/hooks/useContactSupport.ts"],"sourcesContent":["import { WidgetEvent } from '../types/events.js'\nimport { useWidgetEvents } from './useWidgetEvents.js'\n\nexport const useContactSupport = (supportId?: string): (() => void) => {\n const widgetEvents = useWidgetEvents()\n\n const handleContactSupport = () => {\n if (!widgetEvents.all.has(WidgetEvent.ContactSupport)) {\n window.open('https://help.li.fi', '_blank', 'nofollow noreferrer')\n } else {\n widgetEvents.emit(WidgetEvent.ContactSupport, { supportId })\n }\n }\n\n return handleContactSupport\n}\n"],"mappings":";;;AAGA,MAAa,qBAAqB,cAAqC;CACrE,MAAM,eAAe,iBAAiB;CAEtC,MAAM,6BAA6B;AACjC,MAAI,CAAC,aAAa,IAAI,
|
|
1
|
+
{"version":3,"file":"useContactSupport.js","names":[],"sources":["../../../src/hooks/useContactSupport.ts"],"sourcesContent":["import { WidgetEvent } from '../types/events.js'\nimport { useWidgetEvents } from './useWidgetEvents.js'\n\nexport const useContactSupport = (supportId?: string): (() => void) => {\n const widgetEvents = useWidgetEvents()\n\n const handleContactSupport = () => {\n if (!widgetEvents.all.has(WidgetEvent.ContactSupport)) {\n window.open('https://help.li.fi', '_blank', 'nofollow noreferrer')\n } else {\n widgetEvents.emit(WidgetEvent.ContactSupport, { supportId })\n }\n }\n\n return handleContactSupport\n}\n"],"mappings":";;;AAGA,MAAa,qBAAqB,cAAqC;CACrE,MAAM,eAAe,iBAAiB;CAEtC,MAAM,6BAA6B;AACjC,MAAI,CAAC,aAAa,IAAI,IAAA,iBAA+B,CACnD,QAAO,KAAK,sBAAsB,UAAU,sBAAsB;MAElE,cAAa,KAAA,kBAAiC,EAAE,WAAW,CAAC;;AAIhE,QAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDebouncedWatch.js","names":[],"sources":["../../../src/hooks/useDebouncedWatch.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react'\nimport type { FormFieldArray, FormFieldNames } from '../stores/form/types.js'\nimport { useFieldValues } from '../stores/form/useFieldValues.js'\n\nexport const useDebouncedWatch = <T extends FormFieldNames[]>(\n delay: number,\n ...name: T\n): FormFieldArray<T> => {\n const watchedValue = useFieldValues(...name)\n const [debouncedValue, setDebouncedValue] = useState(watchedValue)\n const debouncedValueRef = useRef<typeof watchedValue>(null)\n const isMounted = useRef(false)\n\n useEffect(() => {\n if (isMounted.current) {\n const hasWatchedValue = watchedValue.some((value) => value)\n if (hasWatchedValue) {\n const handler = setTimeout(() => {\n setDebouncedValue(watchedValue)\n }, delay)\n return () => clearTimeout(handler)\n }\n debouncedValueRef.current = watchedValue\n setDebouncedValue(watchedValue)\n return undefined\n }\n isMounted.current = true\n return undefined\n }, [delay, watchedValue])\n\n return debouncedValue\n}\n"],"mappings":";;;AAIA,MAAa,qBACX,OACA,GAAG,SACmB;CACtB,MAAM,eAAe,eAAe,GAAG,KAAK;CAC5C,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,aAAa;CAClE,MAAM,oBAAoB,OAA4B,KAAK;CAC3D,MAAM,YAAY,OAAO,MAAM;AAE/B,iBAAgB;AACd,MAAI,UAAU,SAAS;AAErB,OADwB,aAAa,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"useDebouncedWatch.js","names":[],"sources":["../../../src/hooks/useDebouncedWatch.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react'\nimport type { FormFieldArray, FormFieldNames } from '../stores/form/types.js'\nimport { useFieldValues } from '../stores/form/useFieldValues.js'\n\nexport const useDebouncedWatch = <T extends FormFieldNames[]>(\n delay: number,\n ...name: T\n): FormFieldArray<T> => {\n const watchedValue = useFieldValues(...name)\n const [debouncedValue, setDebouncedValue] = useState(watchedValue)\n const debouncedValueRef = useRef<typeof watchedValue>(null)\n const isMounted = useRef(false)\n\n useEffect(() => {\n if (isMounted.current) {\n const hasWatchedValue = watchedValue.some((value) => value)\n if (hasWatchedValue) {\n const handler = setTimeout(() => {\n setDebouncedValue(watchedValue)\n }, delay)\n return () => clearTimeout(handler)\n }\n debouncedValueRef.current = watchedValue\n setDebouncedValue(watchedValue)\n return undefined\n }\n isMounted.current = true\n return undefined\n }, [delay, watchedValue])\n\n return debouncedValue\n}\n"],"mappings":";;;AAIA,MAAa,qBACX,OACA,GAAG,SACmB;CACtB,MAAM,eAAe,eAAe,GAAG,KAAK;CAC5C,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,aAAa;CAClE,MAAM,oBAAoB,OAA4B,KAAK;CAC3D,MAAM,YAAY,OAAO,MAAM;AAE/B,iBAAgB;AACd,MAAI,UAAU,SAAS;AAErB,OADwB,aAAa,MAAM,UAAU,MAClC,EAAE;IACnB,MAAM,UAAU,iBAAiB;AAC/B,uBAAkB,aAAa;OAC9B,MAAM;AACT,iBAAa,aAAa,QAAQ;;AAEpC,qBAAkB,UAAU;AAC5B,qBAAkB,aAAa;AAC/B;;AAEF,YAAU,UAAU;IAEnB,CAAC,OAAO,aAAa,CAAC;AAEzB,QAAO"}
|
|
@@ -4,19 +4,30 @@ import { useAvailableChains } from "./useAvailableChains.js";
|
|
|
4
4
|
import { ChainId, ChainType, isHex } from "@lifi/sdk";
|
|
5
5
|
//#region src/hooks/useExplorer.ts
|
|
6
6
|
const sanitiseBaseUrl = (baseUrl) => baseUrl.trim().replace(/\/+$/, "");
|
|
7
|
+
const explorerPathOverrides = {
|
|
8
|
+
[ChainId.SUI]: {
|
|
9
|
+
txPath: "txblock",
|
|
10
|
+
addressPath: "coin"
|
|
11
|
+
},
|
|
12
|
+
[ChainType.TVM]: {
|
|
13
|
+
txPath: "#/transaction",
|
|
14
|
+
addressPath: "#/address"
|
|
15
|
+
}
|
|
16
|
+
};
|
|
7
17
|
const useExplorer = () => {
|
|
8
18
|
const { explorerUrls } = useWidgetConfig();
|
|
9
19
|
const { getChainById } = useAvailableChains();
|
|
10
20
|
const getExplorerConfig = (chain) => {
|
|
11
21
|
const resolvedChain = Number.isFinite(chain) ? getChainById(chain) : chain;
|
|
12
22
|
const explorerUrl = (resolvedChain ? explorerUrls?.[resolvedChain.id]?.[0] ?? resolvedChain.metamask.blockExplorerUrls[0] : explorerUrls?.internal?.[0]) || "https://scan.li.fi";
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
const
|
|
23
|
+
const baseUrl = typeof explorerUrl === "string" ? explorerUrl : explorerUrl.url;
|
|
24
|
+
const overrides = explorerPathOverrides[resolvedChain?.id] ?? explorerPathOverrides[resolvedChain?.chainType];
|
|
25
|
+
const defaultTxPath = overrides?.txPath ?? "tx";
|
|
26
|
+
const defaultAddressPath = overrides?.addressPath ?? "address";
|
|
16
27
|
const txPath = typeof explorerUrl === "string" ? defaultTxPath : explorerUrl.txPath || defaultTxPath;
|
|
17
28
|
const addressPath = typeof explorerUrl === "string" ? defaultAddressPath : explorerUrl.addressPath || defaultAddressPath;
|
|
18
29
|
return {
|
|
19
|
-
url: sanitiseBaseUrl(
|
|
30
|
+
url: sanitiseBaseUrl(baseUrl),
|
|
20
31
|
txPath,
|
|
21
32
|
addressPath,
|
|
22
33
|
resolvedChain
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useExplorer.js","names":[],"sources":["../../../src/hooks/useExplorer.ts"],"sourcesContent":["import type { Chain } from '@lifi/sdk'\nimport { ChainId, ChainType, isHex } from '@lifi/sdk'\nimport { internalExplorerUrl } from '../config/constants.js'\nimport { useAvailableChains } from '../hooks/useAvailableChains.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\n\nconst sanitiseBaseUrl = (baseUrl: string) => baseUrl.trim().replace(/\\/+$/, '')\n\ntype TransactionLinkProps = { chain?: Chain | number } & (\n | {\n txHash: string\n txLink?: never\n }\n | {\n txHash?: never\n txLink: string\n }\n)\n\nexport const useExplorer = (): {\n getTransactionLink: (props: TransactionLinkProps) => string | undefined\n getAddressLink: (address: string, chain?: Chain | number) => string\n} => {\n const { explorerUrls } = useWidgetConfig()\n const { getChainById } = useAvailableChains()\n\n const getExplorerConfig = (chain?: Chain | number) => {\n const resolvedChain = Number.isFinite(chain)\n ? getChainById(chain as number)\n : (chain as Chain)\n\n const explorerUrl =\n (resolvedChain\n ? (explorerUrls?.[resolvedChain.id]?.[0] ??\n resolvedChain.metamask.blockExplorerUrls[0])\n : explorerUrls?.internal?.[0]) || internalExplorerUrl\n\n const
|
|
1
|
+
{"version":3,"file":"useExplorer.js","names":[],"sources":["../../../src/hooks/useExplorer.ts"],"sourcesContent":["import type { Chain } from '@lifi/sdk'\nimport { ChainId, ChainType, isHex } from '@lifi/sdk'\nimport { internalExplorerUrl } from '../config/constants.js'\nimport { useAvailableChains } from '../hooks/useAvailableChains.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\n\nconst sanitiseBaseUrl = (baseUrl: string) => baseUrl.trim().replace(/\\/+$/, '')\n\nconst explorerPathOverrides: Partial<\n Record<ChainType | ChainId, { txPath: string; addressPath: string }>\n> = {\n [ChainId.SUI]: { txPath: 'txblock', addressPath: 'coin' },\n [ChainType.TVM]: { txPath: '#/transaction', addressPath: '#/address' },\n}\n\ntype TransactionLinkProps = { chain?: Chain | number } & (\n | {\n txHash: string\n txLink?: never\n }\n | {\n txHash?: never\n txLink: string\n }\n)\n\nexport const useExplorer = (): {\n getTransactionLink: (props: TransactionLinkProps) => string | undefined\n getAddressLink: (address: string, chain?: Chain | number) => string\n} => {\n const { explorerUrls } = useWidgetConfig()\n const { getChainById } = useAvailableChains()\n\n const getExplorerConfig = (chain?: Chain | number) => {\n const resolvedChain = Number.isFinite(chain)\n ? getChainById(chain as number)\n : (chain as Chain)\n\n const explorerUrl =\n (resolvedChain\n ? (explorerUrls?.[resolvedChain.id]?.[0] ??\n resolvedChain.metamask.blockExplorerUrls[0])\n : explorerUrls?.internal?.[0]) || internalExplorerUrl\n\n const baseUrl =\n typeof explorerUrl === 'string' ? explorerUrl : explorerUrl.url\n\n const overrides =\n explorerPathOverrides[resolvedChain?.id as ChainId] ??\n explorerPathOverrides[resolvedChain?.chainType as ChainType]\n\n const defaultTxPath = overrides?.txPath ?? 'tx'\n const defaultAddressPath = overrides?.addressPath ?? 'address'\n const txPath =\n typeof explorerUrl === 'string'\n ? defaultTxPath\n : explorerUrl.txPath || defaultTxPath\n const addressPath =\n typeof explorerUrl === 'string'\n ? defaultAddressPath\n : explorerUrl.addressPath || defaultAddressPath\n\n return {\n url: sanitiseBaseUrl(baseUrl),\n txPath,\n addressPath,\n resolvedChain,\n }\n }\n\n const getTransactionLink = ({\n txHash,\n txLink,\n chain,\n }: TransactionLinkProps): string | undefined => {\n if (!txHash) {\n return txLink\n }\n\n const config = getExplorerConfig(chain)\n\n // For EVM chains, validate the transaction hash as some relayers return custom task hashes that are not visible on-chain\n if (config.resolvedChain?.chainType === ChainType.EVM) {\n if (!isHex(txHash, { strict: true })) {\n return undefined\n }\n }\n\n return `${config.url}/${config.txPath}/${txHash}`\n }\n\n const getAddressLink = (address: string, chain?: Chain | number) => {\n const config = getExplorerConfig(chain)\n return `${config.url}/${config.addressPath}/${address}`\n }\n\n return {\n getTransactionLink,\n getAddressLink,\n }\n}\n"],"mappings":";;;;;AAMA,MAAM,mBAAmB,YAAoB,QAAQ,MAAM,CAAC,QAAQ,QAAQ,GAAG;AAE/E,MAAM,wBAEF;EACD,QAAQ,MAAM;EAAE,QAAQ;EAAW,aAAa;EAAQ;EACxD,UAAU,MAAM;EAAE,QAAQ;EAAiB,aAAa;EAAa;CACvE;AAaD,MAAa,oBAGR;CACH,MAAM,EAAE,iBAAiB,iBAAiB;CAC1C,MAAM,EAAE,iBAAiB,oBAAoB;CAE7C,MAAM,qBAAqB,UAA2B;EACpD,MAAM,gBAAgB,OAAO,SAAS,MAAM,GACxC,aAAa,MAAgB,GAC5B;EAEL,MAAM,eACH,gBACI,eAAe,cAAc,MAAM,MACpC,cAAc,SAAS,kBAAkB,KACzC,cAAc,WAAW,OAAA;EAE/B,MAAM,UACJ,OAAO,gBAAgB,WAAW,cAAc,YAAY;EAE9D,MAAM,YACJ,sBAAsB,eAAe,OACrC,sBAAsB,eAAe;EAEvC,MAAM,gBAAgB,WAAW,UAAU;EAC3C,MAAM,qBAAqB,WAAW,eAAe;EACrD,MAAM,SACJ,OAAO,gBAAgB,WACnB,gBACA,YAAY,UAAU;EAC5B,MAAM,cACJ,OAAO,gBAAgB,WACnB,qBACA,YAAY,eAAe;AAEjC,SAAO;GACL,KAAK,gBAAgB,QAAQ;GAC7B;GACA;GACA;GACD;;CAGH,MAAM,sBAAsB,EAC1B,QACA,QACA,YAC8C;AAC9C,MAAI,CAAC,OACH,QAAO;EAGT,MAAM,SAAS,kBAAkB,MAAM;AAGvC,MAAI,OAAO,eAAe,cAAc,UAAU;OAC5C,CAAC,MAAM,QAAQ,EAAE,QAAQ,MAAM,CAAC,CAClC;;AAIJ,SAAO,GAAG,OAAO,IAAI,GAAG,OAAO,OAAO,GAAG;;CAG3C,MAAM,kBAAkB,SAAiB,UAA2B;EAClE,MAAM,SAAS,kBAAkB,MAAM;AACvC,SAAO,GAAG,OAAO,IAAI,GAAG,OAAO,YAAY,GAAG;;AAGhD,QAAO;EACL;EACA;EACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFilteredByTokenBalances.js","names":[],"sources":["../../../src/hooks/useFilteredByTokenBalances.ts"],"sourcesContent":["import {\n type BaseToken,\n ChainType,\n getWalletBalances,\n type TokenExtended,\n type WalletTokenExtended,\n} from '@lifi/sdk'\nimport { useQuery } from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport type { FormType } from '../stores/form/types.js'\nimport { getConfigItemSets, isFormItemAllowed } from '../utils/item.js'\nimport { isSupportedToken } from '../utils/tokenList.js'\n\nexport const useFilteredTokensByBalance = (\n accountsWithTokens?: Record<\n string,\n { chainType: ChainType; tokens: Record<number, TokenExtended[]> }\n >,\n formType?: FormType\n): {\n data: Record<string, Record<number, TokenExtended[]>> | undefined\n isLoading: boolean\n} => {\n const { tokens: configTokens } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n const evmAddress = useMemo(() => {\n const evmAccount = Object.entries(accountsWithTokens ?? {}).find(\n ([_, { chainType }]) => chainType === ChainType.EVM\n )\n return evmAccount?.[0]\n }, [accountsWithTokens])\n\n const { data: existingBalances, isLoading } = useQuery({\n queryKey: ['existing-evm-balances', evmAddress],\n queryFn: () => getWalletBalances(sdkClient, evmAddress ?? ''),\n enabled: !!evmAddress,\n refetchInterval: 30_000, // 30 seconds\n staleTime: 30_000, // 30 seconds\n retry: false,\n })\n\n const accountsWithFilteredTokens = useMemo(() => {\n if (!accountsWithTokens) {\n return undefined\n }\n\n // Early return if no existing balances - return all tokens\n const result: Record<string, Record<number, TokenExtended[]>> = {}\n if (!existingBalances) {\n for (const [address, { tokens }] of Object.entries(accountsWithTokens)) {\n result[address] = tokens\n }\n return result\n }\n\n for (const [address, { tokens }] of Object.entries(accountsWithTokens)) {\n result[address] = {}\n\n for (const [chainIdStr, chainTokens] of Object.entries(tokens)) {\n const chainId = Number(chainIdStr)\n // Get balances for this specific chain\n const balances = existingBalances?.[chainId]\n // If no balances, RPC all tokens of the chain\n if (!balances?.length) {\n if (chainTokens.length) {\n result[address][chainId] = chainTokens\n }\n continue\n }\n\n // Optimize token matching with Set for O(1) lookup\n const balanceSet = new Set(\n balances.map((balance: WalletTokenExtended) =>\n balance.address.toLowerCase()\n )\n )\n\n // Get tokens that are in chainTokens and have balances\n const filteredTokens = chainTokens.filter((token) => {\n const tokenKey = token.address.toLowerCase()\n return balanceSet.has(tokenKey)\n })\n\n // Get tokens that are in balances but not in chainTokens\n const chainTokenSet = new Set(\n chainTokens.map((token) => token.address.toLowerCase())\n )\n\n // Get allowed addresses from config tokens\n const allowedAddressesConfig = getConfigItemSets(\n configTokens,\n (tokens: BaseToken[]) =>\n new Set(\n tokens\n .filter((t) => Number(t.chainId) === chainId)\n .map((t) => t.address.toLowerCase())\n ),\n formType\n )\n\n const additionalTokens = balances\n .filter((balance: WalletTokenExtended) => {\n const balanceKey = balance.address.toLowerCase()\n return (\n !chainTokenSet.has(balanceKey) &&\n isSupportedToken(balance) &&\n isFormItemAllowed(\n balance,\n allowedAddressesConfig,\n formType,\n (t) => t.address.toLowerCase()\n )\n )\n })\n // Mark tokens from wallet balances as unverified\n .map((token: WalletTokenExtended) => ({\n ...token,\n verified: false,\n })) as TokenExtended[]\n\n // Combine both sets of tokens - convert WalletTokenExtended to TokenAmount\n const allTokens = [\n ...filteredTokens,\n ...additionalTokens,\n ] as TokenExtended[]\n\n if (allTokens.length) {\n result[address][chainId] = allTokens\n }\n }\n }\n\n return result\n }, [accountsWithTokens, existingBalances, configTokens, formType])\n\n return { data: accountsWithFilteredTokens, isLoading }\n}\n"],"mappings":";;;;;;;;AAeA,MAAa,8BACX,oBAIA,aAIG;CACH,MAAM,EAAE,QAAQ,iBAAiB,iBAAiB;CAClD,MAAM,YAAY,cAAc;CAEhC,MAAM,aAAa,cAAc;AAI/B,SAHmB,OAAO,QAAQ,sBAAsB,EAAE,CAAC,CAAC,MACzD,CAAC,GAAG,EAAE,iBAAiB,cAAc,UAAU,
|
|
1
|
+
{"version":3,"file":"useFilteredByTokenBalances.js","names":[],"sources":["../../../src/hooks/useFilteredByTokenBalances.ts"],"sourcesContent":["import {\n type BaseToken,\n ChainType,\n getWalletBalances,\n type TokenExtended,\n type WalletTokenExtended,\n} from '@lifi/sdk'\nimport { useQuery } from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport type { FormType } from '../stores/form/types.js'\nimport { getConfigItemSets, isFormItemAllowed } from '../utils/item.js'\nimport { isSupportedToken } from '../utils/tokenList.js'\n\nexport const useFilteredTokensByBalance = (\n accountsWithTokens?: Record<\n string,\n { chainType: ChainType; tokens: Record<number, TokenExtended[]> }\n >,\n formType?: FormType\n): {\n data: Record<string, Record<number, TokenExtended[]>> | undefined\n isLoading: boolean\n} => {\n const { tokens: configTokens } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n const evmAddress = useMemo(() => {\n const evmAccount = Object.entries(accountsWithTokens ?? {}).find(\n ([_, { chainType }]) => chainType === ChainType.EVM\n )\n return evmAccount?.[0]\n }, [accountsWithTokens])\n\n const { data: existingBalances, isLoading } = useQuery({\n queryKey: ['existing-evm-balances', evmAddress],\n queryFn: () => getWalletBalances(sdkClient, evmAddress ?? ''),\n enabled: !!evmAddress,\n refetchInterval: 30_000, // 30 seconds\n staleTime: 30_000, // 30 seconds\n retry: false,\n })\n\n const accountsWithFilteredTokens = useMemo(() => {\n if (!accountsWithTokens) {\n return undefined\n }\n\n // Early return if no existing balances - return all tokens\n const result: Record<string, Record<number, TokenExtended[]>> = {}\n if (!existingBalances) {\n for (const [address, { tokens }] of Object.entries(accountsWithTokens)) {\n result[address] = tokens\n }\n return result\n }\n\n for (const [address, { tokens }] of Object.entries(accountsWithTokens)) {\n result[address] = {}\n\n for (const [chainIdStr, chainTokens] of Object.entries(tokens)) {\n const chainId = Number(chainIdStr)\n // Get balances for this specific chain\n const balances = existingBalances?.[chainId]\n // If no balances, RPC all tokens of the chain\n if (!balances?.length) {\n if (chainTokens.length) {\n result[address][chainId] = chainTokens\n }\n continue\n }\n\n // Optimize token matching with Set for O(1) lookup\n const balanceSet = new Set(\n balances.map((balance: WalletTokenExtended) =>\n balance.address.toLowerCase()\n )\n )\n\n // Get tokens that are in chainTokens and have balances\n const filteredTokens = chainTokens.filter((token) => {\n const tokenKey = token.address.toLowerCase()\n return balanceSet.has(tokenKey)\n })\n\n // Get tokens that are in balances but not in chainTokens\n const chainTokenSet = new Set(\n chainTokens.map((token) => token.address.toLowerCase())\n )\n\n // Get allowed addresses from config tokens\n const allowedAddressesConfig = getConfigItemSets(\n configTokens,\n (tokens: BaseToken[]) =>\n new Set(\n tokens\n .filter((t) => Number(t.chainId) === chainId)\n .map((t) => t.address.toLowerCase())\n ),\n formType\n )\n\n const additionalTokens = balances\n .filter((balance: WalletTokenExtended) => {\n const balanceKey = balance.address.toLowerCase()\n return (\n !chainTokenSet.has(balanceKey) &&\n isSupportedToken(balance) &&\n isFormItemAllowed(\n balance,\n allowedAddressesConfig,\n formType,\n (t) => t.address.toLowerCase()\n )\n )\n })\n // Mark tokens from wallet balances as unverified\n .map((token: WalletTokenExtended) => ({\n ...token,\n verified: false,\n })) as TokenExtended[]\n\n // Combine both sets of tokens - convert WalletTokenExtended to TokenAmount\n const allTokens = [\n ...filteredTokens,\n ...additionalTokens,\n ] as TokenExtended[]\n\n if (allTokens.length) {\n result[address][chainId] = allTokens\n }\n }\n }\n\n return result\n }, [accountsWithTokens, existingBalances, configTokens, formType])\n\n return { data: accountsWithFilteredTokens, isLoading }\n}\n"],"mappings":";;;;;;;;AAeA,MAAa,8BACX,oBAIA,aAIG;CACH,MAAM,EAAE,QAAQ,iBAAiB,iBAAiB;CAClD,MAAM,YAAY,cAAc;CAEhC,MAAM,aAAa,cAAc;AAI/B,SAHmB,OAAO,QAAQ,sBAAsB,EAAE,CAAC,CAAC,MACzD,CAAC,GAAG,EAAE,iBAAiB,cAAc,UAAU,IAEjC,GAAG;IACnB,CAAC,mBAAmB,CAAC;CAExB,MAAM,EAAE,MAAM,kBAAkB,cAAc,SAAS;EACrD,UAAU,CAAC,yBAAyB,WAAW;EAC/C,eAAe,kBAAkB,WAAW,cAAc,GAAG;EAC7D,SAAS,CAAC,CAAC;EACX,iBAAiB;EACjB,WAAW;EACX,OAAO;EACR,CAAC;AAgGF,QAAO;EAAE,MA9F0B,cAAc;AAC/C,OAAI,CAAC,mBACH;GAIF,MAAM,SAA0D,EAAE;AAClE,OAAI,CAAC,kBAAkB;AACrB,SAAK,MAAM,CAAC,SAAS,EAAE,aAAa,OAAO,QAAQ,mBAAmB,CACpE,QAAO,WAAW;AAEpB,WAAO;;AAGT,QAAK,MAAM,CAAC,SAAS,EAAE,aAAa,OAAO,QAAQ,mBAAmB,EAAE;AACtE,WAAO,WAAW,EAAE;AAEpB,SAAK,MAAM,CAAC,YAAY,gBAAgB,OAAO,QAAQ,OAAO,EAAE;KAC9D,MAAM,UAAU,OAAO,WAAW;KAElC,MAAM,WAAW,mBAAmB;AAEpC,SAAI,CAAC,UAAU,QAAQ;AACrB,UAAI,YAAY,OACd,QAAO,SAAS,WAAW;AAE7B;;KAIF,MAAM,aAAa,IAAI,IACrB,SAAS,KAAK,YACZ,QAAQ,QAAQ,aAAa,CAC9B,CACF;KAGD,MAAM,iBAAiB,YAAY,QAAQ,UAAU;MACnD,MAAM,WAAW,MAAM,QAAQ,aAAa;AAC5C,aAAO,WAAW,IAAI,SAAS;OAC/B;KAGF,MAAM,gBAAgB,IAAI,IACxB,YAAY,KAAK,UAAU,MAAM,QAAQ,aAAa,CAAC,CACxD;KAGD,MAAM,yBAAyB,kBAC7B,eACC,WACC,IAAI,IACF,OACG,QAAQ,MAAM,OAAO,EAAE,QAAQ,KAAK,QAAQ,CAC5C,KAAK,MAAM,EAAE,QAAQ,aAAa,CAAC,CACvC,EACH,SACD;KAED,MAAM,mBAAmB,SACtB,QAAQ,YAAiC;MACxC,MAAM,aAAa,QAAQ,QAAQ,aAAa;AAChD,aACE,CAAC,cAAc,IAAI,WAAW,IAC9B,iBAAiB,QAAQ,IACzB,kBACE,SACA,wBACA,WACC,MAAM,EAAE,QAAQ,aAAa,CAC/B;OAEH,CAED,KAAK,WAAgC;MACpC,GAAG;MACH,UAAU;MACX,EAAE;KAGL,MAAM,YAAY,CAChB,GAAG,gBACH,GAAG,iBACJ;AAED,SAAI,UAAU,OACZ,QAAO,SAAS,WAAW;;;AAKjC,UAAO;KACN;GAAC;GAAoB;GAAkB;GAAc;GAAS,CAExB;EAAE;EAAW"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFromAmountThreshold.js","names":[],"sources":["../../../src/hooks/useFromAmountThreshold.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { FormKeyHelper } from '../stores/form/types.js'\nimport { useFieldValues } from '../stores/form/useFieldValues.js'\nimport { formatTokenPrice } from '../utils/format.js'\nimport { useToken } from './useToken.js'\n\nexport const useFromAmountThreshold = (): {\n belowMinFromAmountUSD: boolean\n minFromAmountUSD: number | undefined\n} => {\n const { minFromAmountUSD } = useWidgetConfig()\n\n const [chainId, tokenAddress, fromAmount] = useFieldValues(\n FormKeyHelper.getChainKey('from'),\n FormKeyHelper.getTokenKey('from'),\n FormKeyHelper.getAmountKey('from')\n )\n const { token } = useToken(chainId, tokenAddress)\n\n const belowMinFromAmountUSD = useMemo(() => {\n const fromAmountUSD = formatTokenPrice(\n fromAmount,\n token?.priceUSD,\n token?.decimals\n )\n\n if (!minFromAmountUSD || !fromAmountUSD) {\n return false\n }\n return fromAmountUSD < minFromAmountUSD\n }, [minFromAmountUSD, fromAmount, token?.priceUSD, token?.decimals])\n\n return {\n belowMinFromAmountUSD,\n minFromAmountUSD,\n }\n}\n"],"mappings":";;;;;;;AAOA,MAAa,+BAGR;CACH,MAAM,EAAE,qBAAqB,iBAAiB;CAE9C,MAAM,CAAC,SAAS,cAAc,cAAc,eAC1C,cAAc,YAAY,OAAO,EACjC,cAAc,YAAY,OAAO,EACjC,cAAc,aAAa,OAAO,CACnC;CACD,MAAM,EAAE,UAAU,SAAS,SAAS,aAAa;AAejD,QAAO;EACL,uBAd4B,cAAc;GAC1C,MAAM,gBAAgB,iBACpB,YACA,OAAO,UACP,OAAO,SACR;AAED,OAAI,CAAC,oBAAoB,CAAC,cACxB,QAAO;AAET,UAAO,gBAAgB;KACtB;GAAC;GAAkB;GAAY,OAAO;GAAU,OAAO;GAAS,
|
|
1
|
+
{"version":3,"file":"useFromAmountThreshold.js","names":[],"sources":["../../../src/hooks/useFromAmountThreshold.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { FormKeyHelper } from '../stores/form/types.js'\nimport { useFieldValues } from '../stores/form/useFieldValues.js'\nimport { formatTokenPrice } from '../utils/format.js'\nimport { useToken } from './useToken.js'\n\nexport const useFromAmountThreshold = (): {\n belowMinFromAmountUSD: boolean\n minFromAmountUSD: number | undefined\n} => {\n const { minFromAmountUSD } = useWidgetConfig()\n\n const [chainId, tokenAddress, fromAmount] = useFieldValues(\n FormKeyHelper.getChainKey('from'),\n FormKeyHelper.getTokenKey('from'),\n FormKeyHelper.getAmountKey('from')\n )\n const { token } = useToken(chainId, tokenAddress)\n\n const belowMinFromAmountUSD = useMemo(() => {\n const fromAmountUSD = formatTokenPrice(\n fromAmount,\n token?.priceUSD,\n token?.decimals\n )\n\n if (!minFromAmountUSD || !fromAmountUSD) {\n return false\n }\n return fromAmountUSD < minFromAmountUSD\n }, [minFromAmountUSD, fromAmount, token?.priceUSD, token?.decimals])\n\n return {\n belowMinFromAmountUSD,\n minFromAmountUSD,\n }\n}\n"],"mappings":";;;;;;;AAOA,MAAa,+BAGR;CACH,MAAM,EAAE,qBAAqB,iBAAiB;CAE9C,MAAM,CAAC,SAAS,cAAc,cAAc,eAC1C,cAAc,YAAY,OAAO,EACjC,cAAc,YAAY,OAAO,EACjC,cAAc,aAAa,OAAO,CACnC;CACD,MAAM,EAAE,UAAU,SAAS,SAAS,aAAa;AAejD,QAAO;EACL,uBAd4B,cAAc;GAC1C,MAAM,gBAAgB,iBACpB,YACA,OAAO,UACP,OAAO,SACR;AAED,OAAI,CAAC,oBAAoB,CAAC,cACxB,QAAO;AAET,UAAO,gBAAgB;KACtB;GAAC;GAAkB;GAAY,OAAO;GAAU,OAAO;GAAS,CAG5C;EACrB;EACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFromTokenSufficiency.js","names":[],"sources":["../../../src/hooks/useFromTokenSufficiency.ts"],"sourcesContent":["import { parseUnits, type RouteExtended } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport { keepPreviousData, useQuery } from '@tanstack/react-query'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { useFieldValues } from '../stores/form/useFieldValues.js'\nimport { isRouteDone } from '../stores/routes/utils.js'\nimport { getQueryKey } from '../utils/queries.js'\nimport { useTokenAddressBalance } from './useTokenAddressBalance.js'\nimport { getTokenBalancesWithRetry } from './useTokenBalance.js'\n\nconst refetchInterval = 30_000\n\nexport const useFromTokenSufficiency = (\n route?: RouteExtended\n): {\n insufficientFromToken: boolean | undefined\n isLoading: boolean\n} => {\n const [fromChainId, fromTokenAddress, fromAmount] = useFieldValues(\n 'fromChain',\n 'fromToken',\n 'fromAmount'\n )\n const { keyPrefix } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n let chainId = fromChainId\n let tokenAddress = fromTokenAddress\n if (route) {\n chainId = route.fromToken.chainId\n tokenAddress = route.fromToken.address\n }\n\n const {\n token,\n chain,\n isLoading: isTokenAddressBalanceLoading,\n } = useTokenAddressBalance(chainId, tokenAddress)\n\n const { account } = useAccount({ chainType: chain?.chainType })\n\n const { data: insufficientFromToken, isLoading } = useQuery({\n queryKey: [\n getQueryKey('from-token-sufficiency-check', keyPrefix),\n account.address,\n chainId,\n tokenAddress,\n route?.id ?? fromAmount,\n ] as const,\n queryFn: async ({ queryKey: [, accountAddress] }) => {\n if (!accountAddress || !token) {\n return\n }\n const parsedFromAmount = parseUnits(fromAmount, token.decimals)\n let currentTokenBalance = token.amount ?? 0n\n\n if (!route || isRouteDone(route)) {\n const insufficientFunds = currentTokenBalance < parsedFromAmount\n return insufficientFunds\n }\n\n const currentAction = route.steps.filter(\n (step) => !step.execution || step.execution.status !== 'DONE'\n )[0]?.action\n\n if (\n token.chainId === currentAction.fromToken.chainId &&\n token.address === currentAction.fromToken.address &&\n currentTokenBalance > 0\n ) {\n const insufficientFunds = BigInt(route.fromAmount) > currentTokenBalance\n return insufficientFunds\n }\n\n const tokenBalances = await getTokenBalancesWithRetry(\n sdkClient,\n accountAddress,\n [currentAction.fromToken]\n )\n\n currentTokenBalance = tokenBalances?.[0]?.amount ?? 0n\n const insufficientFunds =\n BigInt(currentAction.fromAmount) > currentTokenBalance\n return insufficientFunds\n },\n\n enabled: Boolean(account.address && token && !isTokenAddressBalanceLoading),\n refetchInterval,\n staleTime: refetchInterval,\n placeholderData: account.address ? keepPreviousData : undefined,\n })\n\n return {\n insufficientFromToken,\n isLoading,\n }\n}\n"],"mappings":";;;;;;;;;;;AAWA,MAAM,kBAAkB;AAExB,MAAa,2BACX,UAIG;CACH,MAAM,CAAC,aAAa,kBAAkB,cAAc,eAClD,aACA,aACA,aACD;CACD,MAAM,EAAE,cAAc,iBAAiB;CACvC,MAAM,YAAY,cAAc;CAEhC,IAAI,UAAU;CACd,IAAI,eAAe;AACnB,KAAI,OAAO;AACT,YAAU,MAAM,UAAU;AAC1B,iBAAe,MAAM,UAAU;;CAGjC,MAAM,EACJ,OACA,OACA,WAAW,iCACT,uBAAuB,SAAS,aAAa;CAEjD,MAAM,EAAE,YAAY,WAAW,EAAE,WAAW,OAAO,WAAW,CAAC;CAE/D,MAAM,EAAE,MAAM,uBAAuB,cAAc,SAAS;EAC1D,UAAU;GACR,YAAY,gCAAgC,UAAU;GACtD,QAAQ;GACR;GACA;GACA,OAAO,MAAM;GACd;EACD,SAAS,OAAO,EAAE,UAAU,GAAG,sBAAsB;AACnD,OAAI,CAAC,kBAAkB,CAAC,MACtB;GAEF,MAAM,mBAAmB,WAAW,YAAY,MAAM,SAAS;GAC/D,IAAI,sBAAsB,MAAM,UAAU;AAE1C,OAAI,CAAC,SAAS,YAAY,MAAM,CAE9B,QAD0B,sBAAsB;GAIlD,MAAM,gBAAgB,MAAM,MAAM,QAC/B,SAAS,CAAC,KAAK,aAAa,KAAK,UAAU,WAAW,OACxD,CAAC,IAAI;AAEN,OACE,MAAM,YAAY,cAAc,UAAU,WAC1C,MAAM,YAAY,cAAc,UAAU,WAC1C,sBAAsB,EAGtB,QAD0B,OAAO,MAAM,WAAW,GAAG;AAUvD,
|
|
1
|
+
{"version":3,"file":"useFromTokenSufficiency.js","names":[],"sources":["../../../src/hooks/useFromTokenSufficiency.ts"],"sourcesContent":["import { parseUnits, type RouteExtended } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport { keepPreviousData, useQuery } from '@tanstack/react-query'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { useFieldValues } from '../stores/form/useFieldValues.js'\nimport { isRouteDone } from '../stores/routes/utils.js'\nimport { getQueryKey } from '../utils/queries.js'\nimport { useTokenAddressBalance } from './useTokenAddressBalance.js'\nimport { getTokenBalancesWithRetry } from './useTokenBalance.js'\n\nconst refetchInterval = 30_000\n\nexport const useFromTokenSufficiency = (\n route?: RouteExtended\n): {\n insufficientFromToken: boolean | undefined\n isLoading: boolean\n} => {\n const [fromChainId, fromTokenAddress, fromAmount] = useFieldValues(\n 'fromChain',\n 'fromToken',\n 'fromAmount'\n )\n const { keyPrefix } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n let chainId = fromChainId\n let tokenAddress = fromTokenAddress\n if (route) {\n chainId = route.fromToken.chainId\n tokenAddress = route.fromToken.address\n }\n\n const {\n token,\n chain,\n isLoading: isTokenAddressBalanceLoading,\n } = useTokenAddressBalance(chainId, tokenAddress)\n\n const { account } = useAccount({ chainType: chain?.chainType })\n\n const { data: insufficientFromToken, isLoading } = useQuery({\n queryKey: [\n getQueryKey('from-token-sufficiency-check', keyPrefix),\n account.address,\n chainId,\n tokenAddress,\n route?.id ?? fromAmount,\n ] as const,\n queryFn: async ({ queryKey: [, accountAddress] }) => {\n if (!accountAddress || !token) {\n return\n }\n const parsedFromAmount = parseUnits(fromAmount, token.decimals)\n let currentTokenBalance = token.amount ?? 0n\n\n if (!route || isRouteDone(route)) {\n const insufficientFunds = currentTokenBalance < parsedFromAmount\n return insufficientFunds\n }\n\n const currentAction = route.steps.filter(\n (step) => !step.execution || step.execution.status !== 'DONE'\n )[0]?.action\n\n if (\n token.chainId === currentAction.fromToken.chainId &&\n token.address === currentAction.fromToken.address &&\n currentTokenBalance > 0\n ) {\n const insufficientFunds = BigInt(route.fromAmount) > currentTokenBalance\n return insufficientFunds\n }\n\n const tokenBalances = await getTokenBalancesWithRetry(\n sdkClient,\n accountAddress,\n [currentAction.fromToken]\n )\n\n currentTokenBalance = tokenBalances?.[0]?.amount ?? 0n\n const insufficientFunds =\n BigInt(currentAction.fromAmount) > currentTokenBalance\n return insufficientFunds\n },\n\n enabled: Boolean(account.address && token && !isTokenAddressBalanceLoading),\n refetchInterval,\n staleTime: refetchInterval,\n placeholderData: account.address ? keepPreviousData : undefined,\n })\n\n return {\n insufficientFromToken,\n isLoading,\n }\n}\n"],"mappings":";;;;;;;;;;;AAWA,MAAM,kBAAkB;AAExB,MAAa,2BACX,UAIG;CACH,MAAM,CAAC,aAAa,kBAAkB,cAAc,eAClD,aACA,aACA,aACD;CACD,MAAM,EAAE,cAAc,iBAAiB;CACvC,MAAM,YAAY,cAAc;CAEhC,IAAI,UAAU;CACd,IAAI,eAAe;AACnB,KAAI,OAAO;AACT,YAAU,MAAM,UAAU;AAC1B,iBAAe,MAAM,UAAU;;CAGjC,MAAM,EACJ,OACA,OACA,WAAW,iCACT,uBAAuB,SAAS,aAAa;CAEjD,MAAM,EAAE,YAAY,WAAW,EAAE,WAAW,OAAO,WAAW,CAAC;CAE/D,MAAM,EAAE,MAAM,uBAAuB,cAAc,SAAS;EAC1D,UAAU;GACR,YAAY,gCAAgC,UAAU;GACtD,QAAQ;GACR;GACA;GACA,OAAO,MAAM;GACd;EACD,SAAS,OAAO,EAAE,UAAU,GAAG,sBAAsB;AACnD,OAAI,CAAC,kBAAkB,CAAC,MACtB;GAEF,MAAM,mBAAmB,WAAW,YAAY,MAAM,SAAS;GAC/D,IAAI,sBAAsB,MAAM,UAAU;AAE1C,OAAI,CAAC,SAAS,YAAY,MAAM,CAE9B,QAD0B,sBAAsB;GAIlD,MAAM,gBAAgB,MAAM,MAAM,QAC/B,SAAS,CAAC,KAAK,aAAa,KAAK,UAAU,WAAW,OACxD,CAAC,IAAI;AAEN,OACE,MAAM,YAAY,cAAc,UAAU,WAC1C,MAAM,YAAY,cAAc,UAAU,WAC1C,sBAAsB,EAGtB,QAD0B,OAAO,MAAM,WAAW,GAAG;AAUvD,0BAAsB,MANM,0BAC1B,WACA,gBACA,CAAC,cAAc,UAAU,CAC1B,IAEqC,IAAI,UAAU;AAGpD,UADE,OAAO,cAAc,WAAW,GAAG;;EAIvC,SAAS,QAAQ,QAAQ,WAAW,SAAS,CAAC,6BAA6B;EAC3E;EACA,WAAW;EACX,iBAAiB,QAAQ,UAAU,mBAAmB,KAAA;EACvD,CAAC;AAEF,QAAO;EACL;EACA;EACD"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useWidgetConfig } from "../providers/WidgetProvider/WidgetProvider.js";
|
|
2
|
-
import
|
|
2
|
+
import "../types/widget.js";
|
|
3
3
|
import { useSDKClient } from "../providers/SDKClientProvider.js";
|
|
4
4
|
import { getQueryKey } from "../utils/queries.js";
|
|
5
5
|
import { useAvailableChains } from "./useAvailableChains.js";
|
|
@@ -28,7 +28,7 @@ const useGasRecommendation = (toChainId, fromChain, fromToken) => {
|
|
|
28
28
|
fromToken
|
|
29
29
|
}, { signal });
|
|
30
30
|
},
|
|
31
|
-
enabled: (checkRecommendationLiFuel || checkRecommendationMaxButton) && !hiddenUI?.includes(
|
|
31
|
+
enabled: (checkRecommendationLiFuel || checkRecommendationMaxButton) && !hiddenUI?.includes("gasRefuelMessage"),
|
|
32
32
|
refetchInterval,
|
|
33
33
|
staleTime: refetchInterval
|
|
34
34
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGasRecommendation.js","names":[],"sources":["../../../src/hooks/useGasRecommendation.ts"],"sourcesContent":["import { type ChainId, getGasRecommendation } from '@lifi/sdk'\nimport type { UseQueryResult } from '@tanstack/react-query'\nimport { useQuery } from '@tanstack/react-query'\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'\n\nconst refetchInterval = 60_000\n\nexport const useGasRecommendation = (\n toChainId?: ChainId,\n fromChain?: ChainId,\n fromToken?: string\n): UseQueryResult<Awaited<ReturnType<typeof getGasRecommendation>> | null> => {\n const { chains } = useAvailableChains()\n const { keyPrefix, hiddenUI } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n const checkRecommendationLiFuel =\n Boolean(toChainId) &&\n Boolean(fromChain) &&\n Boolean(fromToken) &&\n Boolean(chains?.length)\n\n const checkRecommendationMaxButton =\n Boolean(toChainId) && !fromChain && !fromToken && Boolean(chains?.length)\n\n return useQuery({\n queryKey: [\n getQueryKey('gas-recommendation', keyPrefix),\n toChainId,\n fromChain,\n fromToken,\n ],\n queryFn: async ({\n queryKey: [_, toChainId, fromChain, fromToken],\n signal,\n }) => {\n if (!chains?.some((chain) => chain.id === toChainId)) {\n return null\n }\n const gasRecommendation = await getGasRecommendation(\n sdkClient,\n {\n chainId: toChainId as ChainId,\n fromChain: fromChain as ChainId,\n fromToken: fromToken as string,\n },\n { signal }\n )\n return gasRecommendation\n },\n enabled:\n (checkRecommendationLiFuel || checkRecommendationMaxButton) &&\n !hiddenUI?.includes(HiddenUI.GasRefuelMessage),\n refetchInterval,\n staleTime: refetchInterval,\n })\n}\n"],"mappings":";;;;;;;;AASA,MAAM,kBAAkB;AAExB,MAAa,wBACX,WACA,WACA,cAC4E;CAC5E,MAAM,EAAE,WAAW,oBAAoB;CACvC,MAAM,EAAE,WAAW,aAAa,iBAAiB;CACjD,MAAM,YAAY,cAAc;CAEhC,MAAM,4BACJ,QAAQ,UAAU,IAClB,QAAQ,UAAU,IAClB,QAAQ,UAAU,IAClB,QAAQ,QAAQ,OAAO;CAEzB,MAAM,+BACJ,QAAQ,UAAU,IAAI,CAAC,aAAa,CAAC,aAAa,QAAQ,QAAQ,OAAO;AAE3E,QAAO,SAAS;EACd,UAAU;GACR,YAAY,sBAAsB,UAAU;GAC5C;GACA;GACA;GACD;EACD,SAAS,OAAO,EACd,UAAU,CAAC,GAAG,WAAW,WAAW,YACpC,aACI;AACJ,OAAI,CAAC,QAAQ,MAAM,UAAU,MAAM,OAAO,UAAU,CAClD,QAAO;AAWT,
|
|
1
|
+
{"version":3,"file":"useGasRecommendation.js","names":[],"sources":["../../../src/hooks/useGasRecommendation.ts"],"sourcesContent":["import { type ChainId, getGasRecommendation } from '@lifi/sdk'\nimport type { UseQueryResult } from '@tanstack/react-query'\nimport { useQuery } from '@tanstack/react-query'\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'\n\nconst refetchInterval = 60_000\n\nexport const useGasRecommendation = (\n toChainId?: ChainId,\n fromChain?: ChainId,\n fromToken?: string\n): UseQueryResult<Awaited<ReturnType<typeof getGasRecommendation>> | null> => {\n const { chains } = useAvailableChains()\n const { keyPrefix, hiddenUI } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n const checkRecommendationLiFuel =\n Boolean(toChainId) &&\n Boolean(fromChain) &&\n Boolean(fromToken) &&\n Boolean(chains?.length)\n\n const checkRecommendationMaxButton =\n Boolean(toChainId) && !fromChain && !fromToken && Boolean(chains?.length)\n\n return useQuery({\n queryKey: [\n getQueryKey('gas-recommendation', keyPrefix),\n toChainId,\n fromChain,\n fromToken,\n ],\n queryFn: async ({\n queryKey: [_, toChainId, fromChain, fromToken],\n signal,\n }) => {\n if (!chains?.some((chain) => chain.id === toChainId)) {\n return null\n }\n const gasRecommendation = await getGasRecommendation(\n sdkClient,\n {\n chainId: toChainId as ChainId,\n fromChain: fromChain as ChainId,\n fromToken: fromToken as string,\n },\n { signal }\n )\n return gasRecommendation\n },\n enabled:\n (checkRecommendationLiFuel || checkRecommendationMaxButton) &&\n !hiddenUI?.includes(HiddenUI.GasRefuelMessage),\n refetchInterval,\n staleTime: refetchInterval,\n })\n}\n"],"mappings":";;;;;;;;AASA,MAAM,kBAAkB;AAExB,MAAa,wBACX,WACA,WACA,cAC4E;CAC5E,MAAM,EAAE,WAAW,oBAAoB;CACvC,MAAM,EAAE,WAAW,aAAa,iBAAiB;CACjD,MAAM,YAAY,cAAc;CAEhC,MAAM,4BACJ,QAAQ,UAAU,IAClB,QAAQ,UAAU,IAClB,QAAQ,UAAU,IAClB,QAAQ,QAAQ,OAAO;CAEzB,MAAM,+BACJ,QAAQ,UAAU,IAAI,CAAC,aAAa,CAAC,aAAa,QAAQ,QAAQ,OAAO;AAE3E,QAAO,SAAS;EACd,UAAU;GACR,YAAY,sBAAsB,UAAU;GAC5C;GACA;GACA;GACD;EACD,SAAS,OAAO,EACd,UAAU,CAAC,GAAG,WAAW,WAAW,YACpC,aACI;AACJ,OAAI,CAAC,QAAQ,MAAM,UAAU,MAAM,OAAO,UAAU,CAClD,QAAO;AAWT,UAAO,MATyB,qBAC9B,WACA;IACE,SAAS;IACE;IACA;IACZ,EACD,EAAE,QAAQ,CACX;;EAGH,UACG,6BAA6B,iCAC9B,CAAC,UAAU,SAAA,mBAAmC;EAChD;EACA,WAAW;EACZ,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useWidgetConfig } from "../providers/WidgetProvider/WidgetProvider.js";
|
|
2
|
-
import
|
|
2
|
+
import "../types/widget.js";
|
|
3
3
|
import { useFieldValues } from "../stores/form/useFieldValues.js";
|
|
4
4
|
import { useAvailableChains } from "./useAvailableChains.js";
|
|
5
5
|
import { useGasRecommendation } from "./useGasRecommendation.js";
|
|
@@ -23,7 +23,7 @@ const useGasRefuel = () => {
|
|
|
23
23
|
const isToAddressSatisfied = effectiveToAddress && !isToContractAddress;
|
|
24
24
|
return {
|
|
25
25
|
enabled: useMemo(() => {
|
|
26
|
-
if (fromChainId === toChainId || !gasRecommendation?.available || !gasRecommendation?.recommended || !destinationNativeToken || !isChainTypeSatisfied || !isToAddressSatisfied || hiddenUI?.includes(
|
|
26
|
+
if (fromChainId === toChainId || !gasRecommendation?.available || !gasRecommendation?.recommended || !destinationNativeToken || !isChainTypeSatisfied || !isToAddressSatisfied || hiddenUI?.includes("gasRefuelMessage")) return false;
|
|
27
27
|
return (destinationNativeToken.amount ?? 0n) < BigInt(gasRecommendation.recommended.amount) / 2n;
|
|
28
28
|
}, [
|
|
29
29
|
fromChainId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGasRefuel.js","names":[],"sources":["../../../src/hooks/useGasRefuel.ts"],"sourcesContent":["import type { ExtendedChain } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport { useMemo } from 'react'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { useFieldValues } from '../stores/form/useFieldValues.js'\nimport { HiddenUI } from '../types/widget.js'\nimport { useAvailableChains } from './useAvailableChains.js'\nimport { useGasRecommendation } from './useGasRecommendation.js'\nimport { useIsContractAddress } from './useIsContractAddress.js'\nimport { useTokenBalance } from './useTokenBalance.js'\n\nexport const useGasRefuel = (): {\n enabled: boolean\n availble: boolean | undefined\n isLoading: boolean\n chain: ExtendedChain | undefined\n fromAmount: string | undefined\n} => {\n const { getChainById } = useAvailableChains()\n const { hiddenUI } = useWidgetConfig()\n const [fromChainId, fromTokenAddress, toChainId, toAddress] = useFieldValues(\n 'fromChain',\n 'fromToken',\n 'toChain',\n 'toAddress'\n )\n\n const toChain = getChainById(toChainId)\n const fromChain = getChainById(fromChainId)\n\n const { account: toAccount } = useAccount({ chainType: toChain?.chainType })\n\n const effectiveToAddress = toAddress || toAccount?.address\n\n const { isContractAddress: isToContractAddress } = useIsContractAddress(\n effectiveToAddress,\n toChainId,\n toChain?.chainType\n )\n\n const { token: destinationNativeToken } = useTokenBalance(\n effectiveToAddress,\n toChainId ? toChain?.nativeToken : undefined\n )\n\n const { data: gasRecommendation, isLoading } = useGasRecommendation(\n toChainId,\n fromChainId,\n fromTokenAddress\n )\n\n // When we bridge between ecosystems we need to be sure toAddress is set\n const isChainTypeSatisfied =\n fromChain?.chainType !== toChain?.chainType ? Boolean(toAddress) : true\n\n // We should not refuel to the contract address\n const isToAddressSatisfied = effectiveToAddress && !isToContractAddress\n\n const enabled = useMemo(() => {\n if (\n // Same chain refuel is not allowed since users need gas on source chain to initiate transaction\n // We allow refuel when bridging to native token since bridging routes may require gas for destination swaps\n fromChainId === toChainId ||\n !gasRecommendation?.available ||\n !gasRecommendation?.recommended ||\n !destinationNativeToken ||\n !isChainTypeSatisfied ||\n !isToAddressSatisfied ||\n hiddenUI?.includes(HiddenUI.GasRefuelMessage)\n ) {\n return false\n }\n const tokenBalance = destinationNativeToken.amount ?? 0n\n\n // Check if the user balance < 50% of the recommended amount\n const recommendedAmount = BigInt(gasRecommendation.recommended.amount) / 2n\n\n const insufficientGas = tokenBalance < recommendedAmount\n return insufficientGas\n }, [\n fromChainId,\n gasRecommendation,\n isChainTypeSatisfied,\n isToAddressSatisfied,\n destinationNativeToken,\n toChainId,\n hiddenUI,\n ])\n\n return {\n enabled: enabled,\n availble: gasRecommendation?.available,\n isLoading: isLoading,\n chain: toChain,\n fromAmount: gasRecommendation?.available\n ? gasRecommendation.fromAmount\n : undefined,\n }\n}\n"],"mappings":";;;;;;;;;;AAWA,MAAa,qBAMR;CACH,MAAM,EAAE,iBAAiB,oBAAoB;CAC7C,MAAM,EAAE,aAAa,iBAAiB;CACtC,MAAM,CAAC,aAAa,kBAAkB,WAAW,aAAa,eAC5D,aACA,aACA,WACA,YACD;CAED,MAAM,UAAU,aAAa,UAAU;CACvC,MAAM,YAAY,aAAa,YAAY;CAE3C,MAAM,EAAE,SAAS,cAAc,WAAW,EAAE,WAAW,SAAS,WAAW,CAAC;CAE5E,MAAM,qBAAqB,aAAa,WAAW;CAEnD,MAAM,EAAE,mBAAmB,wBAAwB,qBACjD,oBACA,WACA,SAAS,UACV;CAED,MAAM,EAAE,OAAO,2BAA2B,gBACxC,oBACA,YAAY,SAAS,cAAc,KAAA,EACpC;CAED,MAAM,EAAE,MAAM,mBAAmB,cAAc,qBAC7C,WACA,aACA,iBACD;CAGD,MAAM,uBACJ,WAAW,cAAc,SAAS,YAAY,QAAQ,UAAU,GAAG;CAGrE,MAAM,uBAAuB,sBAAsB,CAAC;AAiCpD,QAAO;EACL,SAhCc,cAAc;AAC5B,OAGE,gBAAgB,aAChB,CAAC,mBAAmB,aACpB,CAAC,mBAAmB,eACpB,CAAC,0BACD,CAAC,wBACD,CAAC,wBACD,UAAU,
|
|
1
|
+
{"version":3,"file":"useGasRefuel.js","names":[],"sources":["../../../src/hooks/useGasRefuel.ts"],"sourcesContent":["import type { ExtendedChain } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport { useMemo } from 'react'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { useFieldValues } from '../stores/form/useFieldValues.js'\nimport { HiddenUI } from '../types/widget.js'\nimport { useAvailableChains } from './useAvailableChains.js'\nimport { useGasRecommendation } from './useGasRecommendation.js'\nimport { useIsContractAddress } from './useIsContractAddress.js'\nimport { useTokenBalance } from './useTokenBalance.js'\n\nexport const useGasRefuel = (): {\n enabled: boolean\n availble: boolean | undefined\n isLoading: boolean\n chain: ExtendedChain | undefined\n fromAmount: string | undefined\n} => {\n const { getChainById } = useAvailableChains()\n const { hiddenUI } = useWidgetConfig()\n const [fromChainId, fromTokenAddress, toChainId, toAddress] = useFieldValues(\n 'fromChain',\n 'fromToken',\n 'toChain',\n 'toAddress'\n )\n\n const toChain = getChainById(toChainId)\n const fromChain = getChainById(fromChainId)\n\n const { account: toAccount } = useAccount({ chainType: toChain?.chainType })\n\n const effectiveToAddress = toAddress || toAccount?.address\n\n const { isContractAddress: isToContractAddress } = useIsContractAddress(\n effectiveToAddress,\n toChainId,\n toChain?.chainType\n )\n\n const { token: destinationNativeToken } = useTokenBalance(\n effectiveToAddress,\n toChainId ? toChain?.nativeToken : undefined\n )\n\n const { data: gasRecommendation, isLoading } = useGasRecommendation(\n toChainId,\n fromChainId,\n fromTokenAddress\n )\n\n // When we bridge between ecosystems we need to be sure toAddress is set\n const isChainTypeSatisfied =\n fromChain?.chainType !== toChain?.chainType ? Boolean(toAddress) : true\n\n // We should not refuel to the contract address\n const isToAddressSatisfied = effectiveToAddress && !isToContractAddress\n\n const enabled = useMemo(() => {\n if (\n // Same chain refuel is not allowed since users need gas on source chain to initiate transaction\n // We allow refuel when bridging to native token since bridging routes may require gas for destination swaps\n fromChainId === toChainId ||\n !gasRecommendation?.available ||\n !gasRecommendation?.recommended ||\n !destinationNativeToken ||\n !isChainTypeSatisfied ||\n !isToAddressSatisfied ||\n hiddenUI?.includes(HiddenUI.GasRefuelMessage)\n ) {\n return false\n }\n const tokenBalance = destinationNativeToken.amount ?? 0n\n\n // Check if the user balance < 50% of the recommended amount\n const recommendedAmount = BigInt(gasRecommendation.recommended.amount) / 2n\n\n const insufficientGas = tokenBalance < recommendedAmount\n return insufficientGas\n }, [\n fromChainId,\n gasRecommendation,\n isChainTypeSatisfied,\n isToAddressSatisfied,\n destinationNativeToken,\n toChainId,\n hiddenUI,\n ])\n\n return {\n enabled: enabled,\n availble: gasRecommendation?.available,\n isLoading: isLoading,\n chain: toChain,\n fromAmount: gasRecommendation?.available\n ? gasRecommendation.fromAmount\n : undefined,\n }\n}\n"],"mappings":";;;;;;;;;;AAWA,MAAa,qBAMR;CACH,MAAM,EAAE,iBAAiB,oBAAoB;CAC7C,MAAM,EAAE,aAAa,iBAAiB;CACtC,MAAM,CAAC,aAAa,kBAAkB,WAAW,aAAa,eAC5D,aACA,aACA,WACA,YACD;CAED,MAAM,UAAU,aAAa,UAAU;CACvC,MAAM,YAAY,aAAa,YAAY;CAE3C,MAAM,EAAE,SAAS,cAAc,WAAW,EAAE,WAAW,SAAS,WAAW,CAAC;CAE5E,MAAM,qBAAqB,aAAa,WAAW;CAEnD,MAAM,EAAE,mBAAmB,wBAAwB,qBACjD,oBACA,WACA,SAAS,UACV;CAED,MAAM,EAAE,OAAO,2BAA2B,gBACxC,oBACA,YAAY,SAAS,cAAc,KAAA,EACpC;CAED,MAAM,EAAE,MAAM,mBAAmB,cAAc,qBAC7C,WACA,aACA,iBACD;CAGD,MAAM,uBACJ,WAAW,cAAc,SAAS,YAAY,QAAQ,UAAU,GAAG;CAGrE,MAAM,uBAAuB,sBAAsB,CAAC;AAiCpD,QAAO;EACL,SAhCc,cAAc;AAC5B,OAGE,gBAAgB,aAChB,CAAC,mBAAmB,aACpB,CAAC,mBAAmB,eACpB,CAAC,0BACD,CAAC,wBACD,CAAC,wBACD,UAAU,SAAA,mBAAmC,CAE7C,QAAO;AAQT,WANqB,uBAAuB,UAAU,MAG5B,OAAO,kBAAkB,YAAY,OAAO,GAAG;KAIxE;GACD;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAGiB;EAChB,UAAU,mBAAmB;EAClB;EACX,OAAO;EACP,YAAY,mBAAmB,YAC3B,kBAAkB,aAClB,KAAA;EACL"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useWidgetConfig } from "../providers/WidgetProvider/WidgetProvider.js";
|
|
2
|
-
import
|
|
2
|
+
import "../types/widget.js";
|
|
3
3
|
import { useSDKClient } from "../providers/SDKClientProvider.js";
|
|
4
4
|
import { getQueryKey } from "../utils/queries.js";
|
|
5
5
|
import { useAvailableChains } from "./useAvailableChains.js";
|
|
@@ -90,7 +90,7 @@ const useGasSufficiency = (route) => {
|
|
|
90
90
|
});
|
|
91
91
|
return Object.values(gasCosts).filter((gasCost) => gasCost.insufficient);
|
|
92
92
|
},
|
|
93
|
-
enabled: Boolean(!isContractAddress && !isContractAddressLoading && relevantAccounts.length > 0 && route && !hiddenUI?.includes(
|
|
93
|
+
enabled: Boolean(!isContractAddress && !isContractAddressLoading && relevantAccounts.length > 0 && route && !hiddenUI?.includes("insufficientGasMessage")),
|
|
94
94
|
refetchInterval,
|
|
95
95
|
staleTime: refetchInterval
|
|
96
96
|
});
|
|
@@ -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,5 +1,5 @@
|
|
|
1
1
|
import { useWidgetConfig } from "../providers/WidgetProvider/WidgetProvider.js";
|
|
2
|
-
import
|
|
2
|
+
import "../types/widget.js";
|
|
3
3
|
import { navigationRoutes } from "../utils/navigationRoutes.js";
|
|
4
4
|
import { useSwapOnly } from "./useSwapOnly.js";
|
|
5
5
|
import { useLocation } from "@tanstack/react-router";
|
|
@@ -8,8 +8,8 @@ const useHasChainExpansion = () => {
|
|
|
8
8
|
const { hiddenUI, subvariantOptions } = useWidgetConfig();
|
|
9
9
|
const swapOnly = useSwapOnly();
|
|
10
10
|
const { pathname } = useLocation();
|
|
11
|
-
const expansionType = pathname === navigationRoutes.home ?
|
|
12
|
-
return [(expansionType ===
|
|
11
|
+
const expansionType = pathname === navigationRoutes.home ? "routes" : pathname.endsWith(navigationRoutes.fromToken) ? "fromChain" : pathname.endsWith(navigationRoutes.toToken) ? "toChain" : null;
|
|
12
|
+
return [(expansionType === "fromChain" || expansionType === "toChain") && !(swapOnly && expansionType === "toChain") && !hiddenUI?.includes("chainSelect") && !subvariantOptions?.wide?.disableChainSidebar, expansionType];
|
|
13
13
|
};
|
|
14
14
|
//#endregion
|
|
15
15
|
export { useHasChainExpansion };
|
|
@@ -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,
|
|
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;AASV,QAAO,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":"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;AAEnB,
|
|
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;AAEnB,UAAO,MADY,cAAc,SAAU,QAAS,IACrC;;EAEjB,iBAAiB;EACjB,WAAW;EACX,SACE,cAAc,UAAU,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,CAAC;EAC9D,CAAC;AAEF,QAAO;EACL,mBAAmB,CAAC,CAAC;EACrB,cAAc,gBAAgB,KAAA;EAC9B;EACA;EACD"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getAppContainer, getHeaderElement, getScrollableContainer } from "../utils/elements.js";
|
|
2
2
|
import { useDefaultElementId } from "./useDefaultElementId.js";
|
|
3
3
|
import { useLayoutEffect, useState } from "react";
|
|
4
4
|
import { debounce, useTheme } from "@mui/material";
|
|
@@ -13,7 +13,7 @@ const getContentHeight = (elementId, listParentRef) => {
|
|
|
13
13
|
listParentElement.style.height = "0";
|
|
14
14
|
}
|
|
15
15
|
if (!containerElement || !headerElement) {
|
|
16
|
-
console.warn(`Can't find
|
|
16
|
+
console.warn(`Can't find widget-scrollable-container or widget-header id.`);
|
|
17
17
|
return 0;
|
|
18
18
|
}
|
|
19
19
|
const { height: containerHeight } = containerElement.getBoundingClientRect();
|
|
@@ -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;AAIJ,KAAI,mBAAmB;AACrB,cAAY,kBAAkB,MAAM;AACpC,oBAAkB,MAAM,SAAS;;AAGnC,KAAI,CAAC,oBAAoB,CAAC,eAAe;AACvC,UAAQ,KACN,
|
|
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;AAIJ,KAAI,mBAAmB;AACrB,cAAY,kBAAkB,MAAM;AACpC,oBAAkB,MAAM,SAAS;;AAGnC,KAAI,CAAC,oBAAoB,CAAC,eAAe;AACvC,UAAQ,KACN,8DACD;AACD,SAAO;;CAET,MAAM,EAAE,QAAQ,oBAAoB,iBAAiB,uBAAuB;CAC5E,MAAM,EAAE,QAAQ,iBAAiB,cAAc,uBAAuB;AAItE,KAAI,qBAAqB,UACvB,mBAAkB,MAAM,SAAS;AAGnC,QAAO,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;AAExB,uBAAsB;EACpB,MAAM,qBAAqB;AACzB,oBAAiB,iBAAiB,WAAW,cAAc,CAAC;;EAG9D,MAAM,gBAAgB,eAAe,cAAc,EAAE,GAAG;AAGxD,gBAAc;EAEd,MAAM,eAAe,gBAAgB,UAAU;EAE/C,IAAI;AACJ,MAAI,cAAc;AAChB,oBAAiB,IAAI,eAAe,cAAc;AAClD,kBAAe,QAAQ,aAAa;;AAGtC,eAAa;AACX,OAAI,eACF,gBAAe,YAAY;;IAG9B,CAAC,WAAW,cAAc,CAAC;CAE9B,MAAM,gBACJ,MAAM,WAAW,WAAW,SACxB,sBACA;AAON,QAAO,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;AACzB,eAAa,UAAU;AACvB,cAAY,UAAU;GAAE,GAAG,EAAE;GAAS,GAAG,EAAE;GAAS;AACpD,WAAS,UAAU,iBAAiB;AAClC,OAAI,aAAa,QACf,WAAU;KAEX,GAAG;IAER,CAAC,UAAU,GAAG,CACf;CAED,MAAM,QAAQ,kBAAkB;AAC9B,eAAa,UAAU;AACvB,cAAY,UAAU;AACtB,MAAI,SAAS,QACX,cAAa,SAAS,QAAQ;IAE/B,EAAE,CAAC;AAiBN,QAAO;EACL,eAAe;EACf,aAAa;EACb,gBAAgB;EAChB,iBAAiB;EACjB,eAnBW,aACV,MAA0B;AACzB,OAAI,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;AACd,QAAI,KAAK,SAAS,KAAK,MACrB,QAAO;;KAIb,CAAC,MAAM,
|
|
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;AACzB,eAAa,UAAU;AACvB,cAAY,UAAU;GAAE,GAAG,EAAE;GAAS,GAAG,EAAE;GAAS;AACpD,WAAS,UAAU,iBAAiB;AAClC,OAAI,aAAa,QACf,WAAU;KAEX,GAAG;IAER,CAAC,UAAU,GAAG,CACf;CAED,MAAM,QAAQ,kBAAkB;AAC9B,eAAa,UAAU;AACvB,cAAY,UAAU;AACtB,MAAI,SAAS,QACX,cAAa,SAAS,QAAQ;IAE/B,EAAE,CAAC;AAiBN,QAAO;EACL,eAAe;EACf,aAAa;EACb,gBAAgB;EAChB,iBAAiB;EACjB,eAnBW,aACV,MAA0B;AACzB,OAAI,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;AACd,QAAI,KAAK,SAAS,KAAK,MACrB,QAAO;;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;AAU1B,QARqB,kBAAkB;AACrC,MAAI,OAAO,QAAQ,SAAS,EAC1B,QAAO,QAAQ,GAAG,GAAG;MAErB,QAAO,SAAS;GAAE,IAAI,iBAAiB;GAAM,SAAS;GAAM,CAAC;IAE9D,CAAC,OAAO,
|
|
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;AAU1B,QARqB,kBAAkB;AACrC,MAAI,OAAO,QAAQ,SAAS,EAC1B,QAAO,QAAQ,GAAG,GAAG;MAErB,QAAO,SAAS;GAAE,IAAI,iBAAiB;GAAM,SAAS;GAAM,CAAC;IAE9D,CAAC,OAAO,CAEQ"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useWidgetEvents } from "./useWidgetEvents.js";
|
|
2
|
-
import
|
|
2
|
+
import "../types/events.js";
|
|
3
3
|
import { useWidgetConfig } from "../providers/WidgetProvider/WidgetProvider.js";
|
|
4
4
|
import { useSDKClient } from "../providers/SDKClientProvider.js";
|
|
5
5
|
import { getQueryKey } from "../utils/queries.js";
|
|
@@ -26,14 +26,14 @@ const useRouteExecution = ({ routeId, executeInBackground, onAcceptExchangeRateU
|
|
|
26
26
|
const clonedUpdatedRoute = structuredClone(updatedRoute);
|
|
27
27
|
updateRoute(clonedUpdatedRoute);
|
|
28
28
|
const action = getUpdatedAction(routeExecution.route, clonedUpdatedRoute);
|
|
29
|
-
if (action) emitter.emit(
|
|
29
|
+
if (action) emitter.emit("routeExecutionUpdated", {
|
|
30
30
|
route: clonedUpdatedRoute,
|
|
31
31
|
action
|
|
32
32
|
});
|
|
33
33
|
const executionCompleted = isRouteDone(clonedUpdatedRoute);
|
|
34
34
|
const executionFailed = isRouteFailed(clonedUpdatedRoute);
|
|
35
|
-
if (executionCompleted) emitter.emit(
|
|
36
|
-
if (executionFailed && action) emitter.emit(
|
|
35
|
+
if (executionCompleted) emitter.emit("routeExecutionCompleted", clonedUpdatedRoute);
|
|
36
|
+
if (executionFailed && action) emitter.emit("routeExecutionFailed", {
|
|
37
37
|
route: clonedUpdatedRoute,
|
|
38
38
|
action
|
|
39
39
|
});
|
|
@@ -74,14 +74,13 @@ const useRouteExecution = ({ routeId, executeInBackground, onAcceptExchangeRateU
|
|
|
74
74
|
return executeRoute(sdkClient, routeExecution.route, {
|
|
75
75
|
updateRouteHook,
|
|
76
76
|
acceptExchangeRateUpdateHook,
|
|
77
|
-
infiniteApproval: false,
|
|
78
77
|
executeInBackground,
|
|
79
78
|
...sdkClient.config?.executionOptions
|
|
80
79
|
});
|
|
81
80
|
},
|
|
82
81
|
onMutate: () => {
|
|
83
82
|
console.log("Execution started.", routeId);
|
|
84
|
-
if (routeExecution) emitter.emit(
|
|
83
|
+
if (routeExecution) emitter.emit("routeExecutionStarted", routeExecution.route);
|
|
85
84
|
}
|
|
86
85
|
});
|
|
87
86
|
const resumeRouteMutation = useMutation({
|
|
@@ -91,7 +90,6 @@ const useRouteExecution = ({ routeId, executeInBackground, onAcceptExchangeRateU
|
|
|
91
90
|
return resumeRoute(sdkClient, resumedRoute ?? routeExecution.route, {
|
|
92
91
|
updateRouteHook,
|
|
93
92
|
acceptExchangeRateUpdateHook,
|
|
94
|
-
infiniteApproval: false,
|
|
95
93
|
executeInBackground
|
|
96
94
|
});
|
|
97
95
|
},
|