@lifi/widget 4.0.0-beta.18 → 4.0.0-beta.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/App.js.map +1 -1
- package/dist/esm/AppDefault.js.map +1 -1
- package/dist/esm/AppDrawer.js.map +1 -1
- package/dist/esm/AppLayout.js.map +1 -1
- package/dist/esm/AppProvider.js.map +1 -1
- package/dist/esm/components/AmountInput/AmountInput.js.map +1 -1
- package/dist/esm/components/AmountInput/AmountInputEndAdornment.js.map +1 -1
- package/dist/esm/components/AmountInput/AmountInputStartAdornment.js.map +1 -1
- package/dist/esm/components/AmountInput/PriceFormHelperText.js.map +1 -1
- package/dist/esm/components/AppContainer.js.map +1 -1
- package/dist/esm/components/Avatar/AccountAvatar.js.map +1 -1
- package/dist/esm/components/Avatar/Avatar.js.map +1 -1
- package/dist/esm/components/Avatar/Avatar.style.js.map +1 -1
- package/dist/esm/components/Avatar/ChainBadgeContent.js.map +1 -1
- package/dist/esm/components/Avatar/SmallAvatar.js.map +1 -1
- package/dist/esm/components/Avatar/TokenAvatar.js.map +1 -1
- package/dist/esm/components/Avatar/utils.js.map +1 -1
- package/dist/esm/components/BaseTransactionButton/BaseTransactionButton.js.map +1 -1
- package/dist/esm/components/BottomSheet/BottomSheet.js.map +1 -1
- package/dist/esm/components/Card/Card.js.map +1 -1
- package/dist/esm/components/Card/CardIconButton.js.map +1 -1
- package/dist/esm/components/ChainSelect/ChainSelect.js.map +1 -1
- package/dist/esm/components/ChainSelect/ChainSelect.style.js.map +1 -1
- package/dist/esm/components/ChainSelect/useChainSelect.js.map +1 -1
- package/dist/esm/components/Chains/AllChainsAvatar.js.map +1 -1
- package/dist/esm/components/Chains/ChainList.js.map +1 -1
- package/dist/esm/components/Chains/ChainList.style.js.map +1 -1
- package/dist/esm/components/Chains/ChainListItem.js.map +1 -1
- package/dist/esm/components/Chains/ChainSearchInput.js.map +1 -1
- package/dist/esm/components/Chains/ChainsExpanded.js.map +1 -1
- package/dist/esm/components/Chains/PinChainButton.js.map +1 -1
- package/dist/esm/components/Chains/SelectChainContent.js.map +1 -1
- package/dist/esm/components/Chains/VirtualizedChainList.js.map +1 -1
- package/dist/esm/components/ContextMenu.js.map +1 -1
- package/dist/esm/components/ContractComponent/ContractComponent.js.map +1 -1
- package/dist/esm/components/ContractComponent/ItemPrice.js.map +1 -1
- package/dist/esm/components/ContractComponent/NFT/NFT.js.map +1 -1
- package/dist/esm/components/ContractComponent/NFT/NFTBase.js.map +1 -1
- package/dist/esm/components/Dialog/Dialog.js.map +1 -1
- package/dist/esm/components/Expansion/Expansion.js.map +1 -1
- package/dist/esm/components/Expansion/ExpansionTransition.js.map +1 -1
- package/dist/esm/components/FeeBreakdownTooltip.js.map +1 -1
- package/dist/esm/components/Header/ActivitiesButton.js.map +1 -1
- package/dist/esm/components/Header/BackButton.js.map +1 -1
- package/dist/esm/components/Header/CloseDrawerButton.js.map +1 -1
- package/dist/esm/components/Header/DisconnectIconButton.js.map +1 -1
- package/dist/esm/components/Header/Header.js.map +1 -1
- package/dist/esm/components/Header/Header.style.js.map +1 -1
- package/dist/esm/components/Header/NavigationHeader.js.map +1 -1
- package/dist/esm/components/Header/SettingsButton.js.map +1 -1
- package/dist/esm/components/Header/SettingsButton.style.js.map +1 -1
- package/dist/esm/components/Header/SplitNavigationTabs.js.map +1 -1
- package/dist/esm/components/Header/WalletHeader.js.map +1 -1
- package/dist/esm/components/Header/WalletMenu.js.map +1 -1
- package/dist/esm/components/IconCircle/IconCircle.js.map +1 -1
- package/dist/esm/components/IconCircle/IconCircle.style.js.map +1 -1
- package/dist/esm/components/Initializer.js.map +1 -1
- package/dist/esm/components/ListItemButton.js.map +1 -1
- package/dist/esm/components/Messages/AccountDeployedMessage.js.map +1 -1
- package/dist/esm/components/Messages/AccountNotDeployedMessage.js.map +1 -1
- package/dist/esm/components/Messages/FundsSufficiencyMessage.js.map +1 -1
- package/dist/esm/components/Messages/GasRefuelMessage.js.map +1 -1
- package/dist/esm/components/Messages/GasSufficiencyMessage.js.map +1 -1
- package/dist/esm/components/Messages/MinFromAmountUSDMessage.js.map +1 -1
- package/dist/esm/components/Messages/MissingRouteRequiredAccountMessage.js.map +1 -1
- package/dist/esm/components/Messages/WarningMessages.js.map +1 -1
- package/dist/esm/components/Messages/useMessageQueue.js.map +1 -1
- package/dist/esm/components/NotFound.js.map +1 -1
- package/dist/esm/components/PageEntered.js.map +1 -1
- package/dist/esm/components/PoweredBy/PoweredBy.js.map +1 -1
- package/dist/esm/components/ProgressToNextUpdate.js.map +1 -1
- package/dist/esm/components/ReverseTokensButton/ReverseTokensButton.js.map +1 -1
- package/dist/esm/components/ReverseTokensButton/ReverseTokensButton.style.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteCard.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteCardEssentials.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteCardSkeleton.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteDetails.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteNotFoundCard.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteToken.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteTokens.js.map +1 -1
- package/dist/esm/components/RouteCard/getMatchingLabels.js +1 -0
- package/dist/esm/components/RouteCard/getMatchingLabels.js.map +1 -1
- package/dist/esm/components/Routes/Routes.js.map +1 -1
- package/dist/esm/components/Routes/RoutesContent.js.map +1 -1
- package/dist/esm/components/Routes/RoutesExpanded.js.map +1 -1
- package/dist/esm/components/Routes/RoutesExpanded.style.js.map +1 -1
- package/dist/esm/components/Search/SearchInput.js.map +1 -1
- package/dist/esm/components/SelectChainAndToken.js.map +1 -1
- package/dist/esm/components/SelectTokenButton/SelectTokenButton.js.map +1 -1
- package/dist/esm/components/SelectTokenButton/SelectTokenButton.style.js.map +1 -1
- package/dist/esm/components/SendToWallet/SendToWalletButton.js.map +1 -1
- package/dist/esm/components/SendToWallet/SendToWalletExpandButton.js.map +1 -1
- package/dist/esm/components/Skeleton/WidgetSkeleton.js.map +1 -1
- package/dist/esm/components/Skeleton/WidgetSkeleton.style.js.map +1 -1
- package/dist/esm/components/Step/CircularProgress.js.map +1 -1
- package/dist/esm/components/Step/CircularProgress.style.js.map +1 -1
- package/dist/esm/components/Step/DestinationWalletAddress.js.map +1 -1
- package/dist/esm/components/Step/Step.js.map +1 -1
- package/dist/esm/components/Step/StepAction.js.map +1 -1
- package/dist/esm/components/Step/StepActions.js.map +1 -1
- package/dist/esm/components/Step/StepList.js.map +1 -1
- package/dist/esm/components/StepActions/StepActions.js.map +1 -1
- package/dist/esm/components/StepDivider/StepDivider.js.map +1 -1
- package/dist/esm/components/TextFitter/TextFitter.js.map +1 -1
- package/dist/esm/components/Timer/StepTimer.js.map +1 -1
- package/dist/esm/components/Timer/TimerContent.js.map +1 -1
- package/dist/esm/components/Token/Token.js.map +1 -1
- package/dist/esm/components/TokenList/PinTokenButton.js.map +1 -1
- package/dist/esm/components/TokenList/TokenDetailsSheet.js.map +1 -1
- package/dist/esm/components/TokenList/TokenDetailsSheetContent.js.map +1 -1
- package/dist/esm/components/TokenList/TokenList.js.map +1 -1
- package/dist/esm/components/TokenList/TokenListItem.js.map +1 -1
- package/dist/esm/components/TokenList/TokenNotFound.js.map +1 -1
- package/dist/esm/components/TokenList/VirtualizedTokenList.js.map +1 -1
- package/dist/esm/components/TokenList/useTokenSelect.js.map +1 -1
- package/dist/esm/components/TokenRate/TokenRate.js.map +1 -1
- package/dist/esm/components/Tools/ToolItem.js.map +1 -1
- package/dist/esm/components/Tools/Tools.js.map +1 -1
- package/dist/esm/components/TransactionCard/ActiveTransactionCard.js.map +1 -1
- package/dist/esm/components/TransactionCard/TransactionCard.js.map +1 -1
- package/dist/esm/components/TransactionCard/TransactionCardSkeleton.js.map +1 -1
- package/dist/esm/components/TransactionDetails.js.map +1 -1
- package/dist/esm/config/version.d.ts +1 -1
- package/dist/esm/config/version.js +1 -1
- package/dist/esm/config/version.js.map +1 -1
- package/dist/esm/hooks/timer/time.js.map +1 -1
- package/dist/esm/hooks/timer/useExecutionTimer.js.map +1 -1
- package/dist/esm/hooks/timer/useInterval.js.map +1 -1
- package/dist/esm/hooks/timer/useTimer.js.map +1 -1
- package/dist/esm/hooks/timer/validate.js.map +1 -1
- package/dist/esm/hooks/useAccountsBalancesData.js.map +1 -1
- package/dist/esm/hooks/useActionMessage.js.map +1 -1
- package/dist/esm/hooks/useAddressActivity.js.map +1 -1
- package/dist/esm/hooks/useAddressValidation.js.map +1 -1
- package/dist/esm/hooks/useAvailableChains.js.map +1 -1
- package/dist/esm/hooks/useChain.js.map +1 -1
- package/dist/esm/hooks/useChains.js.map +1 -1
- package/dist/esm/hooks/useContactSupport.js.map +1 -1
- package/dist/esm/hooks/useDebouncedWatch.js.map +1 -1
- package/dist/esm/hooks/useDefaultElementId.js.map +1 -1
- package/dist/esm/hooks/useExplorer.js.map +1 -1
- package/dist/esm/hooks/useFilteredByTokenBalances.js.map +1 -1
- package/dist/esm/hooks/useFromAmountThreshold.js.map +1 -1
- package/dist/esm/hooks/useFromTokenSufficiency.js.map +1 -1
- package/dist/esm/hooks/useGasRecommendation.js.map +1 -1
- package/dist/esm/hooks/useGasRefuel.js.map +1 -1
- package/dist/esm/hooks/useGasSufficiency.js.map +1 -1
- package/dist/esm/hooks/useHasChainExpansion.js.map +1 -1
- package/dist/esm/hooks/useHeader.js.map +1 -1
- package/dist/esm/hooks/useInitializeSDKProviders.js.map +1 -1
- package/dist/esm/hooks/useInitializer.js.map +1 -1
- package/dist/esm/hooks/useIsBatchingSupported.js.map +1 -1
- package/dist/esm/hooks/useIsContractAddress.js.map +1 -1
- package/dist/esm/hooks/useLanguages.js.map +1 -1
- package/dist/esm/hooks/useListHeight.js.map +1 -1
- package/dist/esm/hooks/useLongPress.js.map +1 -1
- package/dist/esm/hooks/useNavigateBack.js.map +1 -1
- package/dist/esm/hooks/useRouteExecution.js.map +1 -1
- package/dist/esm/hooks/useRouteRequiredAccountConnection.js.map +1 -1
- package/dist/esm/hooks/useRoutes.js.map +1 -1
- package/dist/esm/hooks/useScrollableContainer.js.map +1 -1
- package/dist/esm/hooks/useSetContentHeight.js.map +1 -1
- package/dist/esm/hooks/useSettingMonitor.js.map +1 -1
- package/dist/esm/hooks/useSwapOnly.js.map +1 -1
- package/dist/esm/hooks/useToAddressAutoPopulate.js.map +1 -1
- package/dist/esm/hooks/useToAddressRequirements.js.map +1 -1
- package/dist/esm/hooks/useToAddressReset.js.map +1 -1
- package/dist/esm/hooks/useToken.js.map +1 -1
- package/dist/esm/hooks/useTokenAddressBalance.js.map +1 -1
- package/dist/esm/hooks/useTokenBalance.js.map +1 -1
- package/dist/esm/hooks/useTokenBalances.js.map +1 -1
- package/dist/esm/hooks/useTokenBalancesQueries.js.map +1 -1
- package/dist/esm/hooks/useTokenRateText.js.map +1 -1
- package/dist/esm/hooks/useTokenSearch.js.map +1 -1
- package/dist/esm/hooks/useTokens.js.map +1 -1
- package/dist/esm/hooks/useTools.js.map +1 -1
- package/dist/esm/hooks/useTransactionDetails.js.map +1 -1
- package/dist/esm/hooks/useTransactionHistory.js.map +1 -1
- package/dist/esm/hooks/useTransactionList.js.map +1 -1
- package/dist/esm/hooks/useWideVariant.js.map +1 -1
- package/dist/esm/hooks/useWidgetChains.js.map +1 -1
- package/dist/esm/hooks/useWidgetEvents.js.map +1 -1
- package/dist/esm/pages/ActivitiesPage/ActiveTransactionItem.js.map +1 -1
- package/dist/esm/pages/ActivitiesPage/ActivitiesPage.js.map +1 -1
- package/dist/esm/pages/ActivitiesPage/ActivitiesPageMenuButton.js.map +1 -1
- package/dist/esm/pages/ActivitiesPage/TransactionHistoryEmpty.js.map +1 -1
- package/dist/esm/pages/ActivitiesPage/TransactionHistoryItem.js.map +1 -1
- package/dist/esm/pages/LanguagesPage.js.map +1 -1
- package/dist/esm/pages/MainPage/MainPage.js.map +1 -1
- package/dist/esm/pages/MainPage/MainWarningMessages.js.map +1 -1
- package/dist/esm/pages/MainPage/ReviewButton.js.map +1 -1
- package/dist/esm/pages/RoutesPage/RoutesPage.js.map +1 -1
- package/dist/esm/pages/SelectChainPage/SelectChainPage.js.map +1 -1
- package/dist/esm/pages/SelectEnabledToolsPage.js.map +1 -1
- package/dist/esm/pages/SelectTokenPage/SearchTokenInput.js.map +1 -1
- package/dist/esm/pages/SelectTokenPage/SelectTokenPage.js.map +1 -1
- package/dist/esm/pages/SendToWallet/BookmarkAddressSheet.js.map +1 -1
- package/dist/esm/pages/SendToWallet/BookmarksPage.js.map +1 -1
- package/dist/esm/pages/SendToWallet/ConfirmAddressSheet.js.map +1 -1
- package/dist/esm/pages/SendToWallet/ConnectedWalletsPage.js.map +1 -1
- package/dist/esm/pages/SendToWallet/RecentWalletsPage.js.map +1 -1
- package/dist/esm/pages/SendToWallet/SendToConfiguredWalletPage.js.map +1 -1
- package/dist/esm/pages/SendToWallet/SendToWalletPage.js.map +1 -1
- package/dist/esm/pages/SettingsPage/BridgeAndExchangeSettings.js.map +1 -1
- package/dist/esm/pages/SettingsPage/GasPriceSettings.js.map +1 -1
- package/dist/esm/pages/SettingsPage/LanguageSetting.js.map +1 -1
- package/dist/esm/pages/SettingsPage/ResetSettingsButton.js.map +1 -1
- package/dist/esm/pages/SettingsPage/RoutePrioritySettings.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SettingsCard/SettingCardExpandable.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SettingsCard/SettingsAccordian.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SettingsPage.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.style.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SmallBalanceFilterSettings.js.map +1 -1
- package/dist/esm/pages/SettingsPage/ThemeSettings.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/ActionRow.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/ContactSupportButton.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/ReceiptsCard.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/SentToWalletRow.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/StepActionRow.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/StepActionsList.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/TransactionDetailsPage.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/TransactionDetailsSkeleton.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/TransferIdCard.js.map +1 -1
- package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.js.map +1 -1
- package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.js.map +1 -1
- package/dist/esm/pages/TransactionPage/RouteTracker.js.map +1 -1
- package/dist/esm/pages/TransactionPage/StartTransactionButton.js.map +1 -1
- package/dist/esm/pages/TransactionPage/StatusBottomSheet.js.map +1 -1
- package/dist/esm/pages/TransactionPage/StatusBottomSheet.style.js.map +1 -1
- package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.js.map +1 -1
- package/dist/esm/pages/TransactionPage/TransactionPage.js.map +1 -1
- package/dist/esm/pages/TransactionPage/utils.js.map +1 -1
- package/dist/esm/providers/I18nProvider/I18nProvider.js.map +1 -1
- package/dist/esm/providers/I18nProvider/i18n.js.map +1 -1
- package/dist/esm/providers/QueryClientProvider.js.map +1 -1
- package/dist/esm/providers/SDKClientProvider.js.map +1 -1
- package/dist/esm/providers/ThemeProvider/ThemeProvider.js.map +1 -1
- package/dist/esm/providers/WalletProvider/WalletProvider.js.map +1 -1
- package/dist/esm/providers/WalletProvider/useExternalWalletProvider.js.map +1 -1
- package/dist/esm/providers/WidgetProvider/WidgetProvider.js.map +1 -1
- package/dist/esm/stores/StoreProvider.js.map +1 -1
- package/dist/esm/stores/bookmarks/BookmarkStore.js.map +1 -1
- package/dist/esm/stores/bookmarks/createBookmarkStore.js.map +1 -1
- package/dist/esm/stores/bookmarks/useBookmarkActions.js.map +1 -1
- package/dist/esm/stores/bookmarks/useBookmarks.js.map +1 -1
- package/dist/esm/stores/chains/ChainOrderStore.js.map +1 -1
- package/dist/esm/stores/chains/createChainOrderStore.js.map +1 -1
- package/dist/esm/stores/chains/useChainOrder.js.map +1 -1
- package/dist/esm/stores/form/FormStore.js.map +1 -1
- package/dist/esm/stores/form/FormUpdater.js.map +1 -1
- package/dist/esm/stores/form/URLSearchParamsBuilder.js.map +1 -1
- package/dist/esm/stores/form/createFormStore.js.map +1 -1
- package/dist/esm/stores/form/getDefaultValuesFromQueryString.js.map +1 -1
- package/dist/esm/stores/form/useFieldActions.js.map +1 -1
- package/dist/esm/stores/form/useFieldValues.js.map +1 -1
- package/dist/esm/stores/form/useFormRef.js.map +1 -1
- package/dist/esm/stores/form/useFormStore.js.map +1 -1
- package/dist/esm/stores/form/useTouchedFields.js.map +1 -1
- package/dist/esm/stores/header/useHeaderStore.js.map +1 -1
- package/dist/esm/stores/inputMode/useInputModeStore.js.map +1 -1
- package/dist/esm/stores/pinnedTokens/PinnedTokensStore.js.map +1 -1
- package/dist/esm/stores/pinnedTokens/createPinnedTokensStore.js.map +1 -1
- package/dist/esm/stores/routes/RouteExecutionStore.js.map +1 -1
- package/dist/esm/stores/routes/createRouteExecutionStore.js.map +1 -1
- package/dist/esm/stores/routes/useIntermediateRoutesStore.js.map +1 -1
- package/dist/esm/stores/routes/useRouteExecutionIndicator.js.map +1 -1
- package/dist/esm/stores/routes/useSetExecutableRoute.js.map +1 -1
- package/dist/esm/stores/routes/utils.js.map +1 -1
- package/dist/esm/stores/settings/SettingsStore.js.map +1 -1
- package/dist/esm/stores/settings/createSettingsStore.js.map +1 -1
- package/dist/esm/stores/settings/useSettings.js.map +1 -1
- package/dist/esm/stores/settings/useSettingsActions.js.map +1 -1
- package/dist/esm/stores/settings/useSplitSubvariantStore.js.map +1 -1
- package/dist/esm/themes/createTheme.js.map +1 -1
- package/dist/esm/themes/utils.js.map +1 -1
- package/dist/esm/types/events.js.map +1 -1
- package/dist/esm/types/widget.d.ts +9 -1
- package/dist/esm/types/widget.d.ts.map +1 -1
- package/dist/esm/types/widget.js.map +1 -1
- package/dist/esm/utils/compactNumberFormatter.js.map +1 -1
- package/dist/esm/utils/converters.js.map +1 -1
- package/dist/esm/utils/currencyExtendedFormatter.js.map +1 -1
- package/dist/esm/utils/deepEqual.js.map +1 -1
- package/dist/esm/utils/deepMerge.js.map +1 -1
- package/dist/esm/utils/fees.js.map +1 -1
- package/dist/esm/utils/format.js.map +1 -1
- package/dist/esm/utils/getActionMessage.js.map +1 -1
- package/dist/esm/utils/getErrorMessage.js.map +1 -1
- package/dist/esm/utils/getPriceImpact.js.map +1 -1
- package/dist/esm/utils/input.js.map +1 -1
- package/dist/esm/utils/item.js.map +1 -1
- package/dist/esm/utils/percentFormatter.js.map +1 -1
- package/dist/esm/utils/prepareActions.js.map +1 -1
- package/dist/esm/utils/timer.js.map +1 -1
- package/dist/esm/utils/token.js.map +1 -1
- package/dist/esm/utils/tokenList.js.map +1 -1
- package/dist/esm/utils/variant.js.map +1 -1
- package/dist/esm/utils/widgetSize.js.map +1 -1
- package/package.json +11 -11
- package/src/components/RouteCard/getMatchingLabels.ts +5 -0
- package/src/config/version.ts +1 -1
- package/src/types/widget.ts +9 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"converters.js","names":[],"sources":["../../../src/utils/converters.ts"],"sourcesContent":["import type {\n ExecutionAction,\n ExecutionActionStatus,\n ExtendedTransactionInfo,\n FeeCost,\n FullStatusData,\n Substatus,\n TokenAmount,\n ToolsResponse,\n} from '@lifi/sdk'\nimport type { RouteExecution } from '../stores/routes/types.js'\nimport { formatTokenPrice } from './format.js'\n\nconst buildActionsFromTxHistory = (tx: FullStatusData): ExecutionAction[] => {\n const sending = tx.sending as ExtendedTransactionInfo\n const receiving = tx.receiving as ExtendedTransactionInfo\n\n if (!sending.token?.chainId || !receiving.token?.chainId) {\n return []\n }\n\n const actionStatus: ExecutionActionStatus =\n tx.status === 'DONE' ? 'DONE' : 'FAILED'\n const substatus: Substatus =\n actionStatus === 'FAILED' ? 'UNKNOWN_ERROR' : 'COMPLETED'\n\n if (sending.chainId === receiving.chainId) {\n return [\n {\n type: 'SWAP', // operations on same chain will be swaps\n message: '',\n status: actionStatus,\n chainId: sending.chainId,\n txHash: sending.txHash,\n txLink: sending.txLink,\n substatus,\n substatusMessage: '',\n },\n ]\n }\n\n const actions: ExecutionAction[] = [\n {\n type: 'CROSS_CHAIN', // first step of bridging, ignoring the approvals\n message: '',\n status: actionStatus, // can be FAILED\n chainId: sending.chainId,\n txHash: sending.txHash,\n txLink: sending.txLink,\n },\n {\n type: 'RECEIVING_CHAIN', // final step of bridging, post swaps\n message: '',\n status: actionStatus,\n substatus,\n substatusMessage: '',\n chainId: receiving.chainId,\n txHash: receiving.txHash,\n txLink: receiving.txLink,\n },\n ]\n\n return actions\n}\n\nexport const buildRouteFromTxHistory = (\n tx: FullStatusData,\n tools?: ToolsResponse\n): RouteExecution | undefined => {\n const sending = tx.sending as ExtendedTransactionInfo\n const receiving = tx.receiving as ExtendedTransactionInfo\n\n if (!sending.token?.chainId || !receiving.token?.chainId) {\n return\n }\n\n let usedTool = tx.sending.includedSteps?.find(\n (step) => step.toolDetails.key === tx.tool\n )?.toolDetails\n\n if (!usedTool) {\n const selectedBridge = tools?.bridges.find(\n (bridge) => bridge.key === tx.tool\n )\n\n const selectedExchange = tools?.exchanges.find(\n (exchange) => exchange.key === tx.tool\n )\n usedTool = {\n key: tx.tool,\n name: selectedBridge?.name ?? selectedExchange?.name ?? tx.tool,\n logoURI: selectedBridge?.logoURI ?? selectedExchange?.logoURI ?? '',\n }\n }\n\n const fromToken: TokenAmount = {\n ...sending.token,\n amount: BigInt(sending.amount ?? 0),\n }\n\n const toToken: TokenAmount = {\n ...receiving.token,\n amount: BigInt(receiving.amount ?? 0),\n }\n\n const sendingValue = sending.value ? BigInt(sending.value) : 0n\n const sendingFeeAmount =\n sending.gasToken.address === sending.token.address && sending.amount\n ? sendingValue - BigInt(sending.amount)\n : sendingValue\n const sendingFeeAmountUsd =\n sending.gasToken.priceUSD && sendingFeeAmount\n ? formatTokenPrice(\n sendingFeeAmount,\n sending.gasToken.priceUSD,\n sending.gasToken.decimals\n )\n : 0\n\n const feeCosts: FeeCost[] | undefined = sendingFeeAmount\n ? [\n {\n amount: sendingFeeAmount.toString(),\n amountUSD: sendingFeeAmountUsd.toFixed(2),\n token: sending.gasToken,\n included: false,\n // Not used\n description: '',\n name: '',\n percentage: '',\n },\n ]\n : undefined\n\n const routeExecution: RouteExecution = {\n status: 1,\n route: {\n id: (tx as FullStatusData).transactionId,\n fromAddress: (tx as FullStatusData).fromAddress,\n toAddress: (tx as FullStatusData).toAddress,\n fromChainId: sending.chainId,\n fromAmount: sending.amount ?? '',\n fromAmountUSD: sending.amountUSD ?? '',\n toAmount: receiving.amount ?? '',\n toAmountMin: receiving.amount ?? '',\n toAmountUSD: receiving.amountUSD ?? '',\n toChainId: receiving.chainId,\n fromToken,\n toToken,\n gasCostUSD: sending.gasAmountUSD,\n steps: [\n {\n id: (tx as FullStatusData).transactionId,\n type: 'lifi',\n tool: tx.tool,\n toolDetails: usedTool,\n action: {\n fromToken: sending.token,\n fromAmount: sending.amount ?? '',\n fromChainId: sending.chainId,\n fromAddress: (tx as FullStatusData).fromAddress,\n toToken: receiving.token,\n toChainId: receiving.chainId,\n toAddress: (tx as FullStatusData).toAddress,\n slippage: 0,\n },\n estimate: {\n tool: tx.tool,\n approvalAddress: '',\n fromAmount: sending.amount ?? '',\n fromAmountUSD: sending.amountUSD ?? '',\n toAmountMin: receiving.amount ?? '',\n toAmount: receiving.amount ?? '',\n toAmountUSD: receiving.amountUSD ?? '',\n executionDuration: 0,\n },\n includedSteps: [\n {\n id: (tx as FullStatusData).transactionId,\n type: sending.chainId === receiving.chainId ? 'swap' : 'cross',\n action: {\n fromChainId: sending.chainId,\n fromAmount: sending.amount ?? '',\n fromToken: sending.token,\n toChainId: receiving.chainId,\n toToken: receiving.token,\n slippage: 0,\n fromAddress: (tx as FullStatusData).fromAddress,\n toAddress: (tx as FullStatusData).toAddress,\n },\n estimate: {\n tool: tx.tool,\n fromAmount: sending.amount ?? '',\n toAmount: receiving.amount ?? '',\n toAmountMin: receiving.amount ?? '',\n approvalAddress: '',\n executionDuration: 0,\n },\n tool: tx.tool,\n toolDetails: usedTool,\n },\n ],\n integrator: tx.metadata?.integrator ?? '',\n execution: {\n status: 'DONE', // can be FAILED\n startedAt: sending.timestamp\n ? sending.timestamp * 1000\n : Date.now(),\n actions: buildActionsFromTxHistory(tx),\n fromAmount: sending.amount,\n toAmount: receiving.amount,\n toToken: receiving.token,\n internalTxLink: tx.lifiExplorerLink,\n externalTxLink: tx.bridgeExplorerLink,\n gasCosts: [\n {\n amount: sending.gasAmount,\n amountUSD: sending.gasAmountUSD,\n token: sending.gasToken,\n estimate: '0',\n limit: '0',\n price: '0',\n type: 'SEND',\n },\n ],\n feeCosts,\n },\n },\n ],\n insurance: {\n state: 'NOT_INSURABLE',\n feeAmountUsd: '0',\n },\n },\n }\n\n return routeExecution\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"converters.js","names":[],"sources":["../../../src/utils/converters.ts"],"sourcesContent":["import type {\n ExecutionAction,\n ExecutionActionStatus,\n ExtendedTransactionInfo,\n FeeCost,\n FullStatusData,\n Substatus,\n TokenAmount,\n ToolsResponse,\n} from '@lifi/sdk'\nimport type { RouteExecution } from '../stores/routes/types.js'\nimport { formatTokenPrice } from './format.js'\n\nconst buildActionsFromTxHistory = (tx: FullStatusData): ExecutionAction[] => {\n const sending = tx.sending as ExtendedTransactionInfo\n const receiving = tx.receiving as ExtendedTransactionInfo\n\n if (!sending.token?.chainId || !receiving.token?.chainId) {\n return []\n }\n\n const actionStatus: ExecutionActionStatus =\n tx.status === 'DONE' ? 'DONE' : 'FAILED'\n const substatus: Substatus =\n actionStatus === 'FAILED' ? 'UNKNOWN_ERROR' : 'COMPLETED'\n\n if (sending.chainId === receiving.chainId) {\n return [\n {\n type: 'SWAP', // operations on same chain will be swaps\n message: '',\n status: actionStatus,\n chainId: sending.chainId,\n txHash: sending.txHash,\n txLink: sending.txLink,\n substatus,\n substatusMessage: '',\n },\n ]\n }\n\n const actions: ExecutionAction[] = [\n {\n type: 'CROSS_CHAIN', // first step of bridging, ignoring the approvals\n message: '',\n status: actionStatus, // can be FAILED\n chainId: sending.chainId,\n txHash: sending.txHash,\n txLink: sending.txLink,\n },\n {\n type: 'RECEIVING_CHAIN', // final step of bridging, post swaps\n message: '',\n status: actionStatus,\n substatus,\n substatusMessage: '',\n chainId: receiving.chainId,\n txHash: receiving.txHash,\n txLink: receiving.txLink,\n },\n ]\n\n return actions\n}\n\nexport const buildRouteFromTxHistory = (\n tx: FullStatusData,\n tools?: ToolsResponse\n): RouteExecution | undefined => {\n const sending = tx.sending as ExtendedTransactionInfo\n const receiving = tx.receiving as ExtendedTransactionInfo\n\n if (!sending.token?.chainId || !receiving.token?.chainId) {\n return\n }\n\n let usedTool = tx.sending.includedSteps?.find(\n (step) => step.toolDetails.key === tx.tool\n )?.toolDetails\n\n if (!usedTool) {\n const selectedBridge = tools?.bridges.find(\n (bridge) => bridge.key === tx.tool\n )\n\n const selectedExchange = tools?.exchanges.find(\n (exchange) => exchange.key === tx.tool\n )\n usedTool = {\n key: tx.tool,\n name: selectedBridge?.name ?? selectedExchange?.name ?? tx.tool,\n logoURI: selectedBridge?.logoURI ?? selectedExchange?.logoURI ?? '',\n }\n }\n\n const fromToken: TokenAmount = {\n ...sending.token,\n amount: BigInt(sending.amount ?? 0),\n }\n\n const toToken: TokenAmount = {\n ...receiving.token,\n amount: BigInt(receiving.amount ?? 0),\n }\n\n const sendingValue = sending.value ? BigInt(sending.value) : 0n\n const sendingFeeAmount =\n sending.gasToken.address === sending.token.address && sending.amount\n ? sendingValue - BigInt(sending.amount)\n : sendingValue\n const sendingFeeAmountUsd =\n sending.gasToken.priceUSD && sendingFeeAmount\n ? formatTokenPrice(\n sendingFeeAmount,\n sending.gasToken.priceUSD,\n sending.gasToken.decimals\n )\n : 0\n\n const feeCosts: FeeCost[] | undefined = sendingFeeAmount\n ? [\n {\n amount: sendingFeeAmount.toString(),\n amountUSD: sendingFeeAmountUsd.toFixed(2),\n token: sending.gasToken,\n included: false,\n // Not used\n description: '',\n name: '',\n percentage: '',\n },\n ]\n : undefined\n\n const routeExecution: RouteExecution = {\n status: 1,\n route: {\n id: (tx as FullStatusData).transactionId,\n fromAddress: (tx as FullStatusData).fromAddress,\n toAddress: (tx as FullStatusData).toAddress,\n fromChainId: sending.chainId,\n fromAmount: sending.amount ?? '',\n fromAmountUSD: sending.amountUSD ?? '',\n toAmount: receiving.amount ?? '',\n toAmountMin: receiving.amount ?? '',\n toAmountUSD: receiving.amountUSD ?? '',\n toChainId: receiving.chainId,\n fromToken,\n toToken,\n gasCostUSD: sending.gasAmountUSD,\n steps: [\n {\n id: (tx as FullStatusData).transactionId,\n type: 'lifi',\n tool: tx.tool,\n toolDetails: usedTool,\n action: {\n fromToken: sending.token,\n fromAmount: sending.amount ?? '',\n fromChainId: sending.chainId,\n fromAddress: (tx as FullStatusData).fromAddress,\n toToken: receiving.token,\n toChainId: receiving.chainId,\n toAddress: (tx as FullStatusData).toAddress,\n slippage: 0,\n },\n estimate: {\n tool: tx.tool,\n approvalAddress: '',\n fromAmount: sending.amount ?? '',\n fromAmountUSD: sending.amountUSD ?? '',\n toAmountMin: receiving.amount ?? '',\n toAmount: receiving.amount ?? '',\n toAmountUSD: receiving.amountUSD ?? '',\n executionDuration: 0,\n },\n includedSteps: [\n {\n id: (tx as FullStatusData).transactionId,\n type: sending.chainId === receiving.chainId ? 'swap' : 'cross',\n action: {\n fromChainId: sending.chainId,\n fromAmount: sending.amount ?? '',\n fromToken: sending.token,\n toChainId: receiving.chainId,\n toToken: receiving.token,\n slippage: 0,\n fromAddress: (tx as FullStatusData).fromAddress,\n toAddress: (tx as FullStatusData).toAddress,\n },\n estimate: {\n tool: tx.tool,\n fromAmount: sending.amount ?? '',\n toAmount: receiving.amount ?? '',\n toAmountMin: receiving.amount ?? '',\n approvalAddress: '',\n executionDuration: 0,\n },\n tool: tx.tool,\n toolDetails: usedTool,\n },\n ],\n integrator: tx.metadata?.integrator ?? '',\n execution: {\n status: 'DONE', // can be FAILED\n startedAt: sending.timestamp\n ? sending.timestamp * 1000\n : Date.now(),\n actions: buildActionsFromTxHistory(tx),\n fromAmount: sending.amount,\n toAmount: receiving.amount,\n toToken: receiving.token,\n internalTxLink: tx.lifiExplorerLink,\n externalTxLink: tx.bridgeExplorerLink,\n gasCosts: [\n {\n amount: sending.gasAmount,\n amountUSD: sending.gasAmountUSD,\n token: sending.gasToken,\n estimate: '0',\n limit: '0',\n price: '0',\n type: 'SEND',\n },\n ],\n feeCosts,\n },\n },\n ],\n insurance: {\n state: 'NOT_INSURABLE',\n feeAmountUsd: '0',\n },\n },\n }\n\n return routeExecution\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"currencyExtendedFormatter.js","names":[],"sources":["../../../src/utils/currencyExtendedFormatter.ts"],"sourcesContent":["export const currencyExtendedFormatter = (\n lng: string | undefined,\n options: any\n): ((value: any) => string) => {\n const formatter = new Intl.NumberFormat(lng, {\n ...options,\n style: 'currency',\n })\n return (value: any) => {\n if (value > 0 && value < 0.01) {\n return `<${formatter.format(0.01)}`\n }\n return formatter.format(value)\n }\n}\n"],"mappings":";AAAA,MAAa,6BACX,KACA,YAC6B;CAC7B,MAAM,YAAY,IAAI,KAAK,aAAa,KAAK;EAC3C,GAAG;EACH,OAAO;EACR,CAAC;
|
|
1
|
+
{"version":3,"file":"currencyExtendedFormatter.js","names":[],"sources":["../../../src/utils/currencyExtendedFormatter.ts"],"sourcesContent":["export const currencyExtendedFormatter = (\n lng: string | undefined,\n options: any\n): ((value: any) => string) => {\n const formatter = new Intl.NumberFormat(lng, {\n ...options,\n style: 'currency',\n })\n return (value: any) => {\n if (value > 0 && value < 0.01) {\n return `<${formatter.format(0.01)}`\n }\n return formatter.format(value)\n }\n}\n"],"mappings":";AAAA,MAAa,6BACX,KACA,YAC6B;CAC7B,MAAM,YAAY,IAAI,KAAK,aAAa,KAAK;EAC3C,GAAG;EACH,OAAO;EACR,CAAC;CACF,QAAQ,UAAe;EACrB,IAAI,QAAQ,KAAK,QAAQ,KACvB,OAAO,IAAI,UAAU,OAAO,IAAK;EAEnC,OAAO,UAAU,OAAO,MAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deepEqual.js","names":[],"sources":["../../../src/utils/deepEqual.ts"],"sourcesContent":["/** Forked from https://github.com/epoberezkin/fast-deep-equal */\n\nexport function deepEqual(a: any, b: any): boolean {\n if (a === b) {\n return true\n }\n\n if (a && b && typeof a === 'object' && typeof b === 'object') {\n if (a.constructor !== b.constructor) {\n return false\n }\n\n let length: number\n let i: number\n\n if (Array.isArray(a) && Array.isArray(b)) {\n length = a.length\n if (length !== b.length) {\n return false\n }\n for (i = length; i-- !== 0; ) {\n if (!deepEqual(a[i], b[i])) {\n return false\n }\n }\n return true\n }\n\n if (a.valueOf !== Object.prototype.valueOf) {\n return a.valueOf() === b.valueOf()\n }\n if (a.toString !== Object.prototype.toString) {\n return a.toString() === b.toString()\n }\n\n const keys = Object.keys(a)\n length = keys.length\n if (length !== Object.keys(b).length) {\n return false\n }\n\n for (i = length; i-- !== 0; ) {\n if (!Object.hasOwn(b, keys[i]!)) {\n return false\n }\n }\n\n for (i = length; i-- !== 0; ) {\n const key = keys[i]\n\n if (key && !deepEqual(a[key], b[key])) {\n return false\n }\n }\n\n return true\n }\n\n // true if both NaN, false otherwise\n // biome-ignore lint/suspicious/noSelfCompare: allowed in typescript\n return a !== a && b !== b\n}\n"],"mappings":";;AAEA,SAAgB,UAAU,GAAQ,GAAiB;
|
|
1
|
+
{"version":3,"file":"deepEqual.js","names":[],"sources":["../../../src/utils/deepEqual.ts"],"sourcesContent":["/** Forked from https://github.com/epoberezkin/fast-deep-equal */\n\nexport function deepEqual(a: any, b: any): boolean {\n if (a === b) {\n return true\n }\n\n if (a && b && typeof a === 'object' && typeof b === 'object') {\n if (a.constructor !== b.constructor) {\n return false\n }\n\n let length: number\n let i: number\n\n if (Array.isArray(a) && Array.isArray(b)) {\n length = a.length\n if (length !== b.length) {\n return false\n }\n for (i = length; i-- !== 0; ) {\n if (!deepEqual(a[i], b[i])) {\n return false\n }\n }\n return true\n }\n\n if (a.valueOf !== Object.prototype.valueOf) {\n return a.valueOf() === b.valueOf()\n }\n if (a.toString !== Object.prototype.toString) {\n return a.toString() === b.toString()\n }\n\n const keys = Object.keys(a)\n length = keys.length\n if (length !== Object.keys(b).length) {\n return false\n }\n\n for (i = length; i-- !== 0; ) {\n if (!Object.hasOwn(b, keys[i]!)) {\n return false\n }\n }\n\n for (i = length; i-- !== 0; ) {\n const key = keys[i]\n\n if (key && !deepEqual(a[key], b[key])) {\n return false\n }\n }\n\n return true\n }\n\n // true if both NaN, false otherwise\n // biome-ignore lint/suspicious/noSelfCompare: allowed in typescript\n return a !== a && b !== b\n}\n"],"mappings":";;AAEA,SAAgB,UAAU,GAAQ,GAAiB;CACjD,IAAI,MAAM,GACR,OAAO;CAGT,IAAI,KAAK,KAAK,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU;EAC5D,IAAI,EAAE,gBAAgB,EAAE,aACtB,OAAO;EAGT,IAAI;EACJ,IAAI;EAEJ,IAAI,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ,EAAE,EAAE;GACxC,SAAS,EAAE;GACX,IAAI,WAAW,EAAE,QACf,OAAO;GAET,KAAK,IAAI,QAAQ,QAAQ,IACvB,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,EACxB,OAAO;GAGX,OAAO;;EAGT,IAAI,EAAE,YAAY,OAAO,UAAU,SACjC,OAAO,EAAE,SAAS,KAAK,EAAE,SAAS;EAEpC,IAAI,EAAE,aAAa,OAAO,UAAU,UAClC,OAAO,EAAE,UAAU,KAAK,EAAE,UAAU;EAGtC,MAAM,OAAO,OAAO,KAAK,EAAE;EAC3B,SAAS,KAAK;EACd,IAAI,WAAW,OAAO,KAAK,EAAE,CAAC,QAC5B,OAAO;EAGT,KAAK,IAAI,QAAQ,QAAQ,IACvB,IAAI,CAAC,OAAO,OAAO,GAAG,KAAK,GAAI,EAC7B,OAAO;EAIX,KAAK,IAAI,QAAQ,QAAQ,IAAK;GAC5B,MAAM,MAAM,KAAK;GAEjB,IAAI,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EACnC,OAAO;;EAIX,OAAO;;CAKT,OAAO,MAAM,KAAK,MAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deepMerge.js","names":[],"sources":["../../../src/utils/deepMerge.ts"],"sourcesContent":["const isObject = (obj: any): boolean => obj && typeof obj === 'object'\n\nexport const deepMerge = (...objects: any[]): any => {\n return objects.reduce((prev, obj) => {\n for (const key in obj) {\n if (isObject(prev[key]) && isObject(obj[key])) {\n prev[key] = deepMerge(prev[key], obj[key])\n } else {\n prev[key] = obj[key]\n }\n }\n return prev\n }, {})\n}\n"],"mappings":";AAAA,MAAM,YAAY,QAAsB,OAAO,OAAO,QAAQ;AAE9D,MAAa,aAAa,GAAG,YAAwB;
|
|
1
|
+
{"version":3,"file":"deepMerge.js","names":[],"sources":["../../../src/utils/deepMerge.ts"],"sourcesContent":["const isObject = (obj: any): boolean => obj && typeof obj === 'object'\n\nexport const deepMerge = (...objects: any[]): any => {\n return objects.reduce((prev, obj) => {\n for (const key in obj) {\n if (isObject(prev[key]) && isObject(obj[key])) {\n prev[key] = deepMerge(prev[key], obj[key])\n } else {\n prev[key] = obj[key]\n }\n }\n return prev\n }, {})\n}\n"],"mappings":";AAAA,MAAM,YAAY,QAAsB,OAAO,OAAO,QAAQ;AAE9D,MAAa,aAAa,GAAG,YAAwB;CACnD,OAAO,QAAQ,QAAQ,MAAM,QAAQ;EACnC,KAAK,MAAM,OAAO,KAChB,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,IAAI,KAAK,EAC3C,KAAK,OAAO,UAAU,KAAK,MAAM,IAAI,KAAK;OAE1C,KAAK,OAAO,IAAI;EAGpB,OAAO;IACN,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fees.js","names":[],"sources":["../../../src/utils/fees.ts"],"sourcesContent":["import type { FeeCost, GasCost, RouteExtended, Token } from '@lifi/sdk'\nimport { formatTokenPrice } from './format.js'\n\nexport interface FeesBreakdown {\n amount: bigint\n amountUSD: number\n token: Token\n}\n\nexport const getAccumulatedFeeCostsBreakdown = (\n route: RouteExtended,\n included: boolean = false\n): {\n gasCosts: FeesBreakdown[]\n feeCosts: FeesBreakdown[]\n gasCostUSD: number\n feeCostUSD: number\n combinedFeesUSD: number\n} => {\n const gasCosts = getGasCostsBreakdown(route)\n const feeCosts = getFeeCostsBreakdown(route, included)\n const gasCostUSD = gasCosts.reduce(\n (sum, gasCost) => sum + gasCost.amountUSD,\n 0\n )\n const feeCostUSD = feeCosts.reduce(\n (sum, feeCost) => sum + feeCost.amountUSD,\n 0\n )\n const combinedFeesUSD = gasCostUSD + feeCostUSD\n return {\n gasCosts,\n feeCosts,\n gasCostUSD,\n feeCostUSD,\n combinedFeesUSD,\n }\n}\n\nconst getGasCostsBreakdown = (route: RouteExtended): FeesBreakdown[] => {\n return Array.from(\n route.steps\n .reduce((groupedGasCosts, step) => {\n const gasCosts = step.execution?.gasCosts ?? step.estimate.gasCosts\n if (gasCosts?.length) {\n const {\n token,\n amount: gasCostAmount,\n amountUSD: gasCostAmountUSD,\n } = getStepFeeCostsBreakdown(gasCosts)\n const groupedGasCost = groupedGasCosts.get(token.chainId)\n const amount = groupedGasCost\n ? groupedGasCost.amount + gasCostAmount\n : gasCostAmount\n const amountUSD = groupedGasCost\n ? groupedGasCost.amountUSD + gasCostAmountUSD\n : gasCostAmountUSD\n groupedGasCosts.set(token.chainId, {\n amount,\n amountUSD,\n token,\n })\n return groupedGasCosts\n }\n return groupedGasCosts\n }, new Map<number, FeesBreakdown>())\n .values()\n )\n}\n\nconst getFeeCostsBreakdown = (\n route: RouteExtended,\n included?: boolean\n): FeesBreakdown[] => {\n return Array.from(\n route.steps\n .reduce((groupedFeeCosts, step) => {\n let feeCosts = step.execution?.feeCosts ?? step.estimate.feeCosts\n if (typeof included === 'boolean') {\n feeCosts = feeCosts?.filter(\n (feeCost) => feeCost.included === included\n )\n }\n if (feeCosts?.length) {\n const {\n token,\n amount: feeCostAmount,\n amountUSD: feeCostAmountUSD,\n } = getStepFeeCostsBreakdown(feeCosts)\n const groupedFeeCost = groupedFeeCosts.get(token.chainId)\n const amount = groupedFeeCost\n ? groupedFeeCost.amount + feeCostAmount\n : feeCostAmount\n const amountUSD = groupedFeeCost\n ? groupedFeeCost.amountUSD + feeCostAmountUSD\n : feeCostAmountUSD\n groupedFeeCosts.set(token.chainId, {\n amount,\n amountUSD,\n token,\n })\n return groupedFeeCosts\n }\n return groupedFeeCosts\n }, new Map<number, FeesBreakdown>())\n .values()\n )\n}\n\nconst getStepFeeCostsBreakdown = (\n feeCosts: FeeCost[] | GasCost[]\n): FeesBreakdown => {\n const { token } = feeCosts[0]\n\n const { amount, amountUSD } = feeCosts.reduce(\n (acc, feeCost) => {\n const feeAmount = BigInt(Number(feeCost.amount).toFixed(0) || 0)\n const amountUSD = formatTokenPrice(\n feeAmount,\n feeCost.token.priceUSD,\n feeCost.token.decimals\n )\n\n acc.amount += feeAmount\n acc.amountUSD += amountUSD\n return acc\n },\n { amount: 0n, amountUSD: 0 }\n )\n\n return {\n amount,\n amountUSD,\n token,\n }\n}\n"],"mappings":";;AASA,MAAa,mCACX,OACA,WAAoB,UAOjB;CACH,MAAM,WAAW,qBAAqB,MAAM;CAC5C,MAAM,WAAW,qBAAqB,OAAO,SAAS;CACtD,MAAM,aAAa,SAAS,QACzB,KAAK,YAAY,MAAM,QAAQ,WAChC,EACD;CACD,MAAM,aAAa,SAAS,QACzB,KAAK,YAAY,MAAM,QAAQ,WAChC,EACD;
|
|
1
|
+
{"version":3,"file":"fees.js","names":[],"sources":["../../../src/utils/fees.ts"],"sourcesContent":["import type { FeeCost, GasCost, RouteExtended, Token } from '@lifi/sdk'\nimport { formatTokenPrice } from './format.js'\n\nexport interface FeesBreakdown {\n amount: bigint\n amountUSD: number\n token: Token\n}\n\nexport const getAccumulatedFeeCostsBreakdown = (\n route: RouteExtended,\n included: boolean = false\n): {\n gasCosts: FeesBreakdown[]\n feeCosts: FeesBreakdown[]\n gasCostUSD: number\n feeCostUSD: number\n combinedFeesUSD: number\n} => {\n const gasCosts = getGasCostsBreakdown(route)\n const feeCosts = getFeeCostsBreakdown(route, included)\n const gasCostUSD = gasCosts.reduce(\n (sum, gasCost) => sum + gasCost.amountUSD,\n 0\n )\n const feeCostUSD = feeCosts.reduce(\n (sum, feeCost) => sum + feeCost.amountUSD,\n 0\n )\n const combinedFeesUSD = gasCostUSD + feeCostUSD\n return {\n gasCosts,\n feeCosts,\n gasCostUSD,\n feeCostUSD,\n combinedFeesUSD,\n }\n}\n\nconst getGasCostsBreakdown = (route: RouteExtended): FeesBreakdown[] => {\n return Array.from(\n route.steps\n .reduce((groupedGasCosts, step) => {\n const gasCosts = step.execution?.gasCosts ?? step.estimate.gasCosts\n if (gasCosts?.length) {\n const {\n token,\n amount: gasCostAmount,\n amountUSD: gasCostAmountUSD,\n } = getStepFeeCostsBreakdown(gasCosts)\n const groupedGasCost = groupedGasCosts.get(token.chainId)\n const amount = groupedGasCost\n ? groupedGasCost.amount + gasCostAmount\n : gasCostAmount\n const amountUSD = groupedGasCost\n ? groupedGasCost.amountUSD + gasCostAmountUSD\n : gasCostAmountUSD\n groupedGasCosts.set(token.chainId, {\n amount,\n amountUSD,\n token,\n })\n return groupedGasCosts\n }\n return groupedGasCosts\n }, new Map<number, FeesBreakdown>())\n .values()\n )\n}\n\nconst getFeeCostsBreakdown = (\n route: RouteExtended,\n included?: boolean\n): FeesBreakdown[] => {\n return Array.from(\n route.steps\n .reduce((groupedFeeCosts, step) => {\n let feeCosts = step.execution?.feeCosts ?? step.estimate.feeCosts\n if (typeof included === 'boolean') {\n feeCosts = feeCosts?.filter(\n (feeCost) => feeCost.included === included\n )\n }\n if (feeCosts?.length) {\n const {\n token,\n amount: feeCostAmount,\n amountUSD: feeCostAmountUSD,\n } = getStepFeeCostsBreakdown(feeCosts)\n const groupedFeeCost = groupedFeeCosts.get(token.chainId)\n const amount = groupedFeeCost\n ? groupedFeeCost.amount + feeCostAmount\n : feeCostAmount\n const amountUSD = groupedFeeCost\n ? groupedFeeCost.amountUSD + feeCostAmountUSD\n : feeCostAmountUSD\n groupedFeeCosts.set(token.chainId, {\n amount,\n amountUSD,\n token,\n })\n return groupedFeeCosts\n }\n return groupedFeeCosts\n }, new Map<number, FeesBreakdown>())\n .values()\n )\n}\n\nconst getStepFeeCostsBreakdown = (\n feeCosts: FeeCost[] | GasCost[]\n): FeesBreakdown => {\n const { token } = feeCosts[0]\n\n const { amount, amountUSD } = feeCosts.reduce(\n (acc, feeCost) => {\n const feeAmount = BigInt(Number(feeCost.amount).toFixed(0) || 0)\n const amountUSD = formatTokenPrice(\n feeAmount,\n feeCost.token.priceUSD,\n feeCost.token.decimals\n )\n\n acc.amount += feeAmount\n acc.amountUSD += amountUSD\n return acc\n },\n { amount: 0n, amountUSD: 0 }\n )\n\n return {\n amount,\n amountUSD,\n token,\n }\n}\n"],"mappings":";;AASA,MAAa,mCACX,OACA,WAAoB,UAOjB;CACH,MAAM,WAAW,qBAAqB,MAAM;CAC5C,MAAM,WAAW,qBAAqB,OAAO,SAAS;CACtD,MAAM,aAAa,SAAS,QACzB,KAAK,YAAY,MAAM,QAAQ,WAChC,EACD;CACD,MAAM,aAAa,SAAS,QACzB,KAAK,YAAY,MAAM,QAAQ,WAChC,EACD;CAED,OAAO;EACL;EACA;EACA;EACA;EACA,iBANsB,aAAa;EAOpC;;AAGH,MAAM,wBAAwB,UAA0C;CACtE,OAAO,MAAM,KACX,MAAM,MACH,QAAQ,iBAAiB,SAAS;EACjC,MAAM,WAAW,KAAK,WAAW,YAAY,KAAK,SAAS;EAC3D,IAAI,UAAU,QAAQ;GACpB,MAAM,EACJ,OACA,QAAQ,eACR,WAAW,qBACT,yBAAyB,SAAS;GACtC,MAAM,iBAAiB,gBAAgB,IAAI,MAAM,QAAQ;GACzD,MAAM,SAAS,iBACX,eAAe,SAAS,gBACxB;GACJ,MAAM,YAAY,iBACd,eAAe,YAAY,mBAC3B;GACJ,gBAAgB,IAAI,MAAM,SAAS;IACjC;IACA;IACA;IACD,CAAC;GACF,OAAO;;EAET,OAAO;oBACN,IAAI,KAA4B,CAAC,CACnC,QAAQ,CACZ;;AAGH,MAAM,wBACJ,OACA,aACoB;CACpB,OAAO,MAAM,KACX,MAAM,MACH,QAAQ,iBAAiB,SAAS;EACjC,IAAI,WAAW,KAAK,WAAW,YAAY,KAAK,SAAS;EACzD,IAAI,OAAO,aAAa,WACtB,WAAW,UAAU,QAClB,YAAY,QAAQ,aAAa,SACnC;EAEH,IAAI,UAAU,QAAQ;GACpB,MAAM,EACJ,OACA,QAAQ,eACR,WAAW,qBACT,yBAAyB,SAAS;GACtC,MAAM,iBAAiB,gBAAgB,IAAI,MAAM,QAAQ;GACzD,MAAM,SAAS,iBACX,eAAe,SAAS,gBACxB;GACJ,MAAM,YAAY,iBACd,eAAe,YAAY,mBAC3B;GACJ,gBAAgB,IAAI,MAAM,SAAS;IACjC;IACA;IACA;IACD,CAAC;GACF,OAAO;;EAET,OAAO;oBACN,IAAI,KAA4B,CAAC,CACnC,QAAQ,CACZ;;AAGH,MAAM,4BACJ,aACkB;CAClB,MAAM,EAAE,UAAU,SAAS;CAE3B,MAAM,EAAE,QAAQ,cAAc,SAAS,QACpC,KAAK,YAAY;EAChB,MAAM,YAAY,OAAO,OAAO,QAAQ,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE;EAChE,MAAM,YAAY,iBAChB,WACA,QAAQ,MAAM,UACd,QAAQ,MAAM,SACf;EAED,IAAI,UAAU;EACd,IAAI,aAAa;EACjB,OAAO;IAET;EAAE,QAAQ;EAAI,WAAW;EAAG,CAC7B;CAED,OAAO;EACL;EACA;EACA;EACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","names":[],"sources":["../../../src/utils/format.ts"],"sourcesContent":["import { formatUnits } from '@lifi/sdk'\n\nexport const usdDecimals = 2\n\n/**\n * Format token amount to at least 6 decimals.\n * @param amount amount to format.\n * @returns formatted amount.\n */\nexport function formatTokenAmount(\n amount: bigint | undefined,\n decimals: number\n): string {\n const formattedAmount = amount ? formatUnits(amount, decimals) : '0'\n const parsedAmount = Number.parseFloat(formattedAmount)\n if (!parsedAmount || Number.isNaN(Number(formattedAmount))) {\n return '0'\n }\n\n return formattedAmount\n}\n\nexport function formatSlippage(\n slippage = '',\n defaultValue = '',\n returnInitial = false\n): string {\n if (!slippage) {\n return slippage\n }\n const parsedSlippage = Number.parseFloat(slippage)\n if (Number.isNaN(Number(slippage)) && !Number.isNaN(parsedSlippage)) {\n return parsedSlippage.toString()\n }\n if (Number.isNaN(parsedSlippage)) {\n return defaultValue\n }\n if (parsedSlippage >= 100) {\n return '100'\n }\n if (parsedSlippage < 0) {\n return Math.abs(parsedSlippage).toString()\n }\n if (returnInitial) {\n return slippage\n }\n return parsedSlippage.toString()\n}\n\n/**\n * Formats a user input amount string, normalizing it and optionally limiting decimal places.\n * @param amount - The amount string to format (e.g., '123.45', '1,23', '0..')\n * @param decimals - Maximum number of decimal places to allow. If null, no limit is applied.\n * @param returnInitial - If true, preserves the input format during typing (e.g., keeps trailing dots,\n * preserves leading zeros, keeps negative signs). If false (default), cleans up the\n * format on blur (removes leading/trailing zeros, removes negative signs).\n * @returns The formatted amount string, or empty string for invalid input.\n */\nexport function formatInputAmount(\n amount: string,\n decimals: number | null = null,\n returnInitial: boolean = false\n): string {\n if (!amount) {\n return amount\n }\n\n // Replace commas with dots\n let formattedAmount = amount.trim().replaceAll(',', '.')\n\n // Keep only the first dot, remove all subsequent dots\n const dotIndex = formattedAmount.indexOf('.')\n if (dotIndex !== -1) {\n formattedAmount = `${formattedAmount.slice(0, dotIndex + 1)}${formattedAmount.slice(dotIndex + 1).replaceAll('.', '')}`\n }\n\n // If the amount starts with a dot, prepend 0\n if (\n (!returnInitial && formattedAmount.startsWith('.')) ||\n formattedAmount === '.'\n ) {\n formattedAmount = `0${formattedAmount}`\n }\n\n // Parse the valid part of the amount\n const parsedAmount = Number.parseFloat(formattedAmount)\n if (Number.isNaN(Number(formattedAmount)) && !Number.isNaN(parsedAmount)) {\n formattedAmount = parsedAmount.toString()\n }\n if (Number.isNaN(Math.abs(Number(formattedAmount)))) {\n return ''\n }\n\n // Split and limit decimals\n let [integer, fraction = ''] = formattedAmount.split('.')\n if (decimals !== null && fraction.length > decimals) {\n fraction = fraction.slice(0, decimals)\n }\n\n if (returnInitial) {\n if (!fraction) {\n return formattedAmount\n }\n return `${integer}${fraction ? `.${fraction}` : ''}`\n }\n\n // Remove leading zeros and minus sign\n integer = integer.replace(/^0+|-/, '')\n // Remove trailing zeros\n fraction = fraction.replace(/(0+)$/, '')\n\n return `${integer || (fraction ? '0' : '')}${fraction ? `.${fraction}` : ''}`\n}\n\nexport function formatTokenPrice(\n amount?: string | bigint,\n price?: string,\n decimals?: number\n): number {\n if (!amount || !price) {\n return 0\n }\n\n const formattedAmount =\n typeof amount === 'bigint' && decimals !== undefined\n ? formatUnits(amount, decimals)\n : amount.toString()\n\n if (Number.isNaN(Number(formattedAmount)) || Number.isNaN(Number(price))) {\n return 0\n }\n return Number.parseFloat(formattedAmount) * Number.parseFloat(price)\n}\n\n/**\n * Formatter for price value to token amount\n */\nconst formatter = new Intl.NumberFormat('en', {\n notation: 'standard',\n roundingPriority: 'morePrecision',\n maximumSignificantDigits: 20,\n maximumFractionDigits: 20,\n useGrouping: false,\n})\n\n/**\n * Convert price value to token amount\n */\nexport function priceToTokenAmount(\n priceValue: string,\n priceUSD?: string\n): string {\n if (!priceValue || !priceUSD) {\n return '0'\n }\n\n const numericPriceValue = Number.parseFloat(priceValue)\n const numericPrice = Number.parseFloat(priceUSD)\n\n if (\n Number.isNaN(numericPriceValue) ||\n Number.isNaN(numericPrice) ||\n !numericPrice\n ) {\n return '0'\n }\n\n return formatter.format(numericPriceValue / numericPrice)\n}\n\nconst units = [\n ['day', 86400],\n ['hour', 3600],\n ['minute', 60],\n ['second', 1],\n] as const\n\nexport function formatDuration(seconds: number, locale: string): string {\n const match = units.find(([, v]) => seconds >= v)\n const amount = match ? Math.floor(seconds / match[1]) : 0\n const unit = match?.[0] ?? 'second'\n\n return amount.toLocaleString(locale, {\n style: 'unit',\n unit,\n unitDisplay: 'narrow',\n })\n}\n\nexport function wrapLongWords(text: string): string {\n return text.replace(\n /\\S{32,}/g,\n (word) => `${word.slice(0, 8)}...${word.slice(-4)}`\n )\n}\n"],"mappings":";;AAEA,MAAa,cAAc;;;;;;AAO3B,SAAgB,kBACd,QACA,UACQ;CACR,MAAM,kBAAkB,SAAS,YAAY,QAAQ,SAAS,GAAG;
|
|
1
|
+
{"version":3,"file":"format.js","names":[],"sources":["../../../src/utils/format.ts"],"sourcesContent":["import { formatUnits } from '@lifi/sdk'\n\nexport const usdDecimals = 2\n\n/**\n * Format token amount to at least 6 decimals.\n * @param amount amount to format.\n * @returns formatted amount.\n */\nexport function formatTokenAmount(\n amount: bigint | undefined,\n decimals: number\n): string {\n const formattedAmount = amount ? formatUnits(amount, decimals) : '0'\n const parsedAmount = Number.parseFloat(formattedAmount)\n if (!parsedAmount || Number.isNaN(Number(formattedAmount))) {\n return '0'\n }\n\n return formattedAmount\n}\n\nexport function formatSlippage(\n slippage = '',\n defaultValue = '',\n returnInitial = false\n): string {\n if (!slippage) {\n return slippage\n }\n const parsedSlippage = Number.parseFloat(slippage)\n if (Number.isNaN(Number(slippage)) && !Number.isNaN(parsedSlippage)) {\n return parsedSlippage.toString()\n }\n if (Number.isNaN(parsedSlippage)) {\n return defaultValue\n }\n if (parsedSlippage >= 100) {\n return '100'\n }\n if (parsedSlippage < 0) {\n return Math.abs(parsedSlippage).toString()\n }\n if (returnInitial) {\n return slippage\n }\n return parsedSlippage.toString()\n}\n\n/**\n * Formats a user input amount string, normalizing it and optionally limiting decimal places.\n * @param amount - The amount string to format (e.g., '123.45', '1,23', '0..')\n * @param decimals - Maximum number of decimal places to allow. If null, no limit is applied.\n * @param returnInitial - If true, preserves the input format during typing (e.g., keeps trailing dots,\n * preserves leading zeros, keeps negative signs). If false (default), cleans up the\n * format on blur (removes leading/trailing zeros, removes negative signs).\n * @returns The formatted amount string, or empty string for invalid input.\n */\nexport function formatInputAmount(\n amount: string,\n decimals: number | null = null,\n returnInitial: boolean = false\n): string {\n if (!amount) {\n return amount\n }\n\n // Replace commas with dots\n let formattedAmount = amount.trim().replaceAll(',', '.')\n\n // Keep only the first dot, remove all subsequent dots\n const dotIndex = formattedAmount.indexOf('.')\n if (dotIndex !== -1) {\n formattedAmount = `${formattedAmount.slice(0, dotIndex + 1)}${formattedAmount.slice(dotIndex + 1).replaceAll('.', '')}`\n }\n\n // If the amount starts with a dot, prepend 0\n if (\n (!returnInitial && formattedAmount.startsWith('.')) ||\n formattedAmount === '.'\n ) {\n formattedAmount = `0${formattedAmount}`\n }\n\n // Parse the valid part of the amount\n const parsedAmount = Number.parseFloat(formattedAmount)\n if (Number.isNaN(Number(formattedAmount)) && !Number.isNaN(parsedAmount)) {\n formattedAmount = parsedAmount.toString()\n }\n if (Number.isNaN(Math.abs(Number(formattedAmount)))) {\n return ''\n }\n\n // Split and limit decimals\n let [integer, fraction = ''] = formattedAmount.split('.')\n if (decimals !== null && fraction.length > decimals) {\n fraction = fraction.slice(0, decimals)\n }\n\n if (returnInitial) {\n if (!fraction) {\n return formattedAmount\n }\n return `${integer}${fraction ? `.${fraction}` : ''}`\n }\n\n // Remove leading zeros and minus sign\n integer = integer.replace(/^0+|-/, '')\n // Remove trailing zeros\n fraction = fraction.replace(/(0+)$/, '')\n\n return `${integer || (fraction ? '0' : '')}${fraction ? `.${fraction}` : ''}`\n}\n\nexport function formatTokenPrice(\n amount?: string | bigint,\n price?: string,\n decimals?: number\n): number {\n if (!amount || !price) {\n return 0\n }\n\n const formattedAmount =\n typeof amount === 'bigint' && decimals !== undefined\n ? formatUnits(amount, decimals)\n : amount.toString()\n\n if (Number.isNaN(Number(formattedAmount)) || Number.isNaN(Number(price))) {\n return 0\n }\n return Number.parseFloat(formattedAmount) * Number.parseFloat(price)\n}\n\n/**\n * Formatter for price value to token amount\n */\nconst formatter = new Intl.NumberFormat('en', {\n notation: 'standard',\n roundingPriority: 'morePrecision',\n maximumSignificantDigits: 20,\n maximumFractionDigits: 20,\n useGrouping: false,\n})\n\n/**\n * Convert price value to token amount\n */\nexport function priceToTokenAmount(\n priceValue: string,\n priceUSD?: string\n): string {\n if (!priceValue || !priceUSD) {\n return '0'\n }\n\n const numericPriceValue = Number.parseFloat(priceValue)\n const numericPrice = Number.parseFloat(priceUSD)\n\n if (\n Number.isNaN(numericPriceValue) ||\n Number.isNaN(numericPrice) ||\n !numericPrice\n ) {\n return '0'\n }\n\n return formatter.format(numericPriceValue / numericPrice)\n}\n\nconst units = [\n ['day', 86400],\n ['hour', 3600],\n ['minute', 60],\n ['second', 1],\n] as const\n\nexport function formatDuration(seconds: number, locale: string): string {\n const match = units.find(([, v]) => seconds >= v)\n const amount = match ? Math.floor(seconds / match[1]) : 0\n const unit = match?.[0] ?? 'second'\n\n return amount.toLocaleString(locale, {\n style: 'unit',\n unit,\n unitDisplay: 'narrow',\n })\n}\n\nexport function wrapLongWords(text: string): string {\n return text.replace(\n /\\S{32,}/g,\n (word) => `${word.slice(0, 8)}...${word.slice(-4)}`\n )\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getActionMessage.js","names":[],"sources":["../../../src/utils/getActionMessage.ts"],"sourcesContent":["import type {\n ExecutionActionStatus,\n ExecutionActionType,\n LiFiStepExtended,\n StatusMessage,\n Substatus,\n} from '@lifi/sdk'\nimport type { TFunction } from 'i18next'\nimport type { SubvariantOptions, WidgetSubvariant } from '../types/widget'\n\nexport function getActionMessage(\n t: TFunction,\n step: LiFiStepExtended,\n type: ExecutionActionType,\n status: ExecutionActionStatus,\n substatus?: Substatus,\n subvariant?: WidgetSubvariant,\n subvariantOptions?: SubvariantOptions\n): {\n title?: string\n message?: string\n} {\n const messageWithSubstatus = substatus\n ? actionSubstatusMessages[status as StatusMessage]?.[substatus]?.(t)\n : undefined\n const title =\n messageWithSubstatus ??\n actionStatusMessages[type]?.[status]?.(\n t,\n step,\n subvariant,\n subvariantOptions\n )\n return { title }\n}\n\nconst actionStatusMessages: Record<\n ExecutionActionType,\n Partial<\n Record<\n ExecutionActionStatus,\n (\n t: TFunction,\n step: LiFiStepExtended,\n subvariant?: WidgetSubvariant,\n subvariantOptions?: SubvariantOptions\n ) => string\n >\n >\n> = {\n CHECK_ALLOWANCE: {\n STARTED: (t, step) =>\n t('main.process.tokenAllowance.started', {\n tokenSymbol: step.action.fromToken.symbol,\n }),\n PENDING: (t, step) =>\n t('main.process.tokenAllowance.pending', {\n tokenSymbol: step.action.fromToken.symbol,\n }),\n DONE: (t, step) =>\n t('main.process.tokenAllowance.done', {\n tokenSymbol: step.action.fromToken.symbol,\n }),\n },\n NATIVE_PERMIT: {\n STARTED: (t) => t('main.process.permit.started'),\n ACTION_REQUIRED: (t) => t('main.process.permit.actionRequired'),\n PENDING: (t) => t('main.process.permit.pending'),\n DONE: (t) => t('main.process.permit.done'),\n },\n RESET_ALLOWANCE: {\n STARTED: (t, step) =>\n t('main.process.tokenAllowance.pending', {\n tokenSymbol: step.action.fromToken.symbol,\n }),\n RESET_REQUIRED: (t, step) =>\n t('main.process.tokenAllowance.resetRequired', {\n tokenSymbol: step.action.fromToken.symbol,\n }),\n PENDING: (t, step) =>\n t('main.process.tokenAllowance.pending', {\n tokenSymbol: step.action.fromToken.symbol,\n }),\n DONE: (t, step) =>\n t('main.process.tokenAllowance.pending', {\n tokenSymbol: step.action.fromToken.symbol,\n }),\n },\n SET_ALLOWANCE: {\n STARTED: (t, step) =>\n t('main.process.tokenAllowance.pending', {\n tokenSymbol: step.action.fromToken.symbol,\n }),\n ACTION_REQUIRED: (t, step) =>\n t('main.process.tokenAllowance.actionRequired', {\n tokenSymbol: step.action.fromToken.symbol,\n }),\n PENDING: (t, step) =>\n t('main.process.tokenAllowance.pending', {\n tokenSymbol: step.action.fromToken.symbol,\n }),\n DONE: (t, step) =>\n t('main.process.tokenAllowance.done', {\n tokenSymbol: step.action.fromToken.symbol,\n }),\n },\n PERMIT: {\n STARTED: (t) => t('main.process.permit.started'),\n ACTION_REQUIRED: (t) => t('main.process.permit.actionRequired'),\n PENDING: (t) => t('main.process.permit.pending'),\n DONE: (t) => t('main.process.permit.done'),\n },\n SWAP: {\n STARTED: (t) => t('main.process.swap.started'),\n ACTION_REQUIRED: (t) => t('main.process.swap.actionRequired'),\n MESSAGE_REQUIRED: (t) => t('main.process.swap.messageRequired'),\n PENDING: (t) => t('main.process.swap.pending'),\n DONE: (t, _, subvariant, subvariantOptions) =>\n subvariant === 'custom'\n ? t(`main.process.${subvariantOptions?.custom ?? 'checkout'}.done`)\n : t('main.process.swap.done'),\n },\n CROSS_CHAIN: {\n STARTED: (t) => t('main.process.bridge.started'),\n ACTION_REQUIRED: (t) => t('main.process.bridge.actionRequired'),\n MESSAGE_REQUIRED: (t) => t('main.process.bridge.messageRequired'),\n PENDING: (t) => t('main.process.bridge.pending'),\n DONE: (t) => t('main.process.bridge.done'),\n },\n RECEIVING_CHAIN: {\n STARTED: (t) => t('main.process.receivingChain.pending'),\n PENDING: (t) => t('main.process.receivingChain.pending'),\n DONE: (t, _, subvariant, subvariantOptions) =>\n subvariant === 'custom'\n ? t(`main.process.${subvariantOptions?.custom ?? 'checkout'}.done`)\n : t('main.process.receivingChain.done'),\n },\n}\n\nconst actionSubstatusMessages: Record<\n StatusMessage,\n Partial<Record<Substatus, (t: TFunction) => string>>\n> = {\n PENDING: {\n // BRIDGE_NOT_AVAILABLE: 'Bridge communication is temporarily unavailable.',\n // CHAIN_NOT_AVAILABLE: 'RPC communication is temporarily unavailable.',\n // REFUND_IN_PROGRESS:\n // \"The refund has been requested and it's being processed\",\n // WAIT_DESTINATION_TRANSACTION:\n // 'The bridge off-chain logic is being executed. Wait for the transaction to appear on the destination chain.',\n // WAIT_SOURCE_CONFIRMATIONS:\n // 'The bridge deposit has been received. The bridge is waiting for more confirmations to start the off-chain logic.',\n },\n DONE: {\n // COMPLETED: 'The transfer is complete.',\n PARTIAL: (t) => t('main.process.receivingChain.partial'),\n REFUNDED: (t) => t('main.process.receivingChain.partial'),\n },\n FAILED: {\n // TODO: should be moved to failed status\n // NOT_PROCESSABLE_REFUND_NEEDED:\n // 'The transfer cannot be completed successfully. A refund operation is required.',\n // UNKNOWN_ERROR:\n // 'An unexpected error occurred. Please seek assistance in the LI.FI discord server.',\n },\n INVALID: {},\n NOT_FOUND: {},\n}\n"],"mappings":";AAUA,SAAgB,iBACd,GACA,MACA,MACA,QACA,WACA,YACA,mBAIA;
|
|
1
|
+
{"version":3,"file":"getActionMessage.js","names":[],"sources":["../../../src/utils/getActionMessage.ts"],"sourcesContent":["import type {\n ExecutionActionStatus,\n ExecutionActionType,\n LiFiStepExtended,\n StatusMessage,\n Substatus,\n} from '@lifi/sdk'\nimport type { TFunction } from 'i18next'\nimport type { SubvariantOptions, WidgetSubvariant } from '../types/widget'\n\nexport function getActionMessage(\n t: TFunction,\n step: LiFiStepExtended,\n type: ExecutionActionType,\n status: ExecutionActionStatus,\n substatus?: Substatus,\n subvariant?: WidgetSubvariant,\n subvariantOptions?: SubvariantOptions\n): {\n title?: string\n message?: string\n} {\n const messageWithSubstatus = substatus\n ? actionSubstatusMessages[status as StatusMessage]?.[substatus]?.(t)\n : undefined\n const title =\n messageWithSubstatus ??\n actionStatusMessages[type]?.[status]?.(\n t,\n step,\n subvariant,\n subvariantOptions\n )\n return { title }\n}\n\nconst actionStatusMessages: Record<\n ExecutionActionType,\n Partial<\n Record<\n ExecutionActionStatus,\n (\n t: TFunction,\n step: LiFiStepExtended,\n subvariant?: WidgetSubvariant,\n subvariantOptions?: SubvariantOptions\n ) => string\n >\n >\n> = {\n CHECK_ALLOWANCE: {\n STARTED: (t, step) =>\n t('main.process.tokenAllowance.started', {\n tokenSymbol: step.action.fromToken.symbol,\n }),\n PENDING: (t, step) =>\n t('main.process.tokenAllowance.pending', {\n tokenSymbol: step.action.fromToken.symbol,\n }),\n DONE: (t, step) =>\n t('main.process.tokenAllowance.done', {\n tokenSymbol: step.action.fromToken.symbol,\n }),\n },\n NATIVE_PERMIT: {\n STARTED: (t) => t('main.process.permit.started'),\n ACTION_REQUIRED: (t) => t('main.process.permit.actionRequired'),\n PENDING: (t) => t('main.process.permit.pending'),\n DONE: (t) => t('main.process.permit.done'),\n },\n RESET_ALLOWANCE: {\n STARTED: (t, step) =>\n t('main.process.tokenAllowance.pending', {\n tokenSymbol: step.action.fromToken.symbol,\n }),\n RESET_REQUIRED: (t, step) =>\n t('main.process.tokenAllowance.resetRequired', {\n tokenSymbol: step.action.fromToken.symbol,\n }),\n PENDING: (t, step) =>\n t('main.process.tokenAllowance.pending', {\n tokenSymbol: step.action.fromToken.symbol,\n }),\n DONE: (t, step) =>\n t('main.process.tokenAllowance.pending', {\n tokenSymbol: step.action.fromToken.symbol,\n }),\n },\n SET_ALLOWANCE: {\n STARTED: (t, step) =>\n t('main.process.tokenAllowance.pending', {\n tokenSymbol: step.action.fromToken.symbol,\n }),\n ACTION_REQUIRED: (t, step) =>\n t('main.process.tokenAllowance.actionRequired', {\n tokenSymbol: step.action.fromToken.symbol,\n }),\n PENDING: (t, step) =>\n t('main.process.tokenAllowance.pending', {\n tokenSymbol: step.action.fromToken.symbol,\n }),\n DONE: (t, step) =>\n t('main.process.tokenAllowance.done', {\n tokenSymbol: step.action.fromToken.symbol,\n }),\n },\n PERMIT: {\n STARTED: (t) => t('main.process.permit.started'),\n ACTION_REQUIRED: (t) => t('main.process.permit.actionRequired'),\n PENDING: (t) => t('main.process.permit.pending'),\n DONE: (t) => t('main.process.permit.done'),\n },\n SWAP: {\n STARTED: (t) => t('main.process.swap.started'),\n ACTION_REQUIRED: (t) => t('main.process.swap.actionRequired'),\n MESSAGE_REQUIRED: (t) => t('main.process.swap.messageRequired'),\n PENDING: (t) => t('main.process.swap.pending'),\n DONE: (t, _, subvariant, subvariantOptions) =>\n subvariant === 'custom'\n ? t(`main.process.${subvariantOptions?.custom ?? 'checkout'}.done`)\n : t('main.process.swap.done'),\n },\n CROSS_CHAIN: {\n STARTED: (t) => t('main.process.bridge.started'),\n ACTION_REQUIRED: (t) => t('main.process.bridge.actionRequired'),\n MESSAGE_REQUIRED: (t) => t('main.process.bridge.messageRequired'),\n PENDING: (t) => t('main.process.bridge.pending'),\n DONE: (t) => t('main.process.bridge.done'),\n },\n RECEIVING_CHAIN: {\n STARTED: (t) => t('main.process.receivingChain.pending'),\n PENDING: (t) => t('main.process.receivingChain.pending'),\n DONE: (t, _, subvariant, subvariantOptions) =>\n subvariant === 'custom'\n ? t(`main.process.${subvariantOptions?.custom ?? 'checkout'}.done`)\n : t('main.process.receivingChain.done'),\n },\n}\n\nconst actionSubstatusMessages: Record<\n StatusMessage,\n Partial<Record<Substatus, (t: TFunction) => string>>\n> = {\n PENDING: {\n // BRIDGE_NOT_AVAILABLE: 'Bridge communication is temporarily unavailable.',\n // CHAIN_NOT_AVAILABLE: 'RPC communication is temporarily unavailable.',\n // REFUND_IN_PROGRESS:\n // \"The refund has been requested and it's being processed\",\n // WAIT_DESTINATION_TRANSACTION:\n // 'The bridge off-chain logic is being executed. Wait for the transaction to appear on the destination chain.',\n // WAIT_SOURCE_CONFIRMATIONS:\n // 'The bridge deposit has been received. The bridge is waiting for more confirmations to start the off-chain logic.',\n },\n DONE: {\n // COMPLETED: 'The transfer is complete.',\n PARTIAL: (t) => t('main.process.receivingChain.partial'),\n REFUNDED: (t) => t('main.process.receivingChain.partial'),\n },\n FAILED: {\n // TODO: should be moved to failed status\n // NOT_PROCESSABLE_REFUND_NEEDED:\n // 'The transfer cannot be completed successfully. A refund operation is required.',\n // UNKNOWN_ERROR:\n // 'An unexpected error occurred. Please seek assistance in the LI.FI discord server.',\n },\n INVALID: {},\n NOT_FOUND: {},\n}\n"],"mappings":";AAUA,SAAgB,iBACd,GACA,MACA,MACA,QACA,WACA,YACA,mBAIA;CAYA,OAAO,EAAE,QAXoB,YACzB,wBAAwB,UAA2B,aAAa,EAAE,GAClE,KAAA,MAGF,qBAAqB,QAAQ,UAC3B,GACA,MACA,YACA,kBACD,EACa;;AAGlB,MAAM,uBAaF;CACF,iBAAiB;EACf,UAAU,GAAG,SACX,EAAE,uCAAuC,EACvC,aAAa,KAAK,OAAO,UAAU,QACpC,CAAC;EACJ,UAAU,GAAG,SACX,EAAE,uCAAuC,EACvC,aAAa,KAAK,OAAO,UAAU,QACpC,CAAC;EACJ,OAAO,GAAG,SACR,EAAE,oCAAoC,EACpC,aAAa,KAAK,OAAO,UAAU,QACpC,CAAC;EACL;CACD,eAAe;EACb,UAAU,MAAM,EAAE,8BAA8B;EAChD,kBAAkB,MAAM,EAAE,qCAAqC;EAC/D,UAAU,MAAM,EAAE,8BAA8B;EAChD,OAAO,MAAM,EAAE,2BAA2B;EAC3C;CACD,iBAAiB;EACf,UAAU,GAAG,SACX,EAAE,uCAAuC,EACvC,aAAa,KAAK,OAAO,UAAU,QACpC,CAAC;EACJ,iBAAiB,GAAG,SAClB,EAAE,6CAA6C,EAC7C,aAAa,KAAK,OAAO,UAAU,QACpC,CAAC;EACJ,UAAU,GAAG,SACX,EAAE,uCAAuC,EACvC,aAAa,KAAK,OAAO,UAAU,QACpC,CAAC;EACJ,OAAO,GAAG,SACR,EAAE,uCAAuC,EACvC,aAAa,KAAK,OAAO,UAAU,QACpC,CAAC;EACL;CACD,eAAe;EACb,UAAU,GAAG,SACX,EAAE,uCAAuC,EACvC,aAAa,KAAK,OAAO,UAAU,QACpC,CAAC;EACJ,kBAAkB,GAAG,SACnB,EAAE,8CAA8C,EAC9C,aAAa,KAAK,OAAO,UAAU,QACpC,CAAC;EACJ,UAAU,GAAG,SACX,EAAE,uCAAuC,EACvC,aAAa,KAAK,OAAO,UAAU,QACpC,CAAC;EACJ,OAAO,GAAG,SACR,EAAE,oCAAoC,EACpC,aAAa,KAAK,OAAO,UAAU,QACpC,CAAC;EACL;CACD,QAAQ;EACN,UAAU,MAAM,EAAE,8BAA8B;EAChD,kBAAkB,MAAM,EAAE,qCAAqC;EAC/D,UAAU,MAAM,EAAE,8BAA8B;EAChD,OAAO,MAAM,EAAE,2BAA2B;EAC3C;CACD,MAAM;EACJ,UAAU,MAAM,EAAE,4BAA4B;EAC9C,kBAAkB,MAAM,EAAE,mCAAmC;EAC7D,mBAAmB,MAAM,EAAE,oCAAoC;EAC/D,UAAU,MAAM,EAAE,4BAA4B;EAC9C,OAAO,GAAG,GAAG,YAAY,sBACvB,eAAe,WACX,EAAE,gBAAgB,mBAAmB,UAAU,WAAW,OAAO,GACjE,EAAE,yBAAyB;EAClC;CACD,aAAa;EACX,UAAU,MAAM,EAAE,8BAA8B;EAChD,kBAAkB,MAAM,EAAE,qCAAqC;EAC/D,mBAAmB,MAAM,EAAE,sCAAsC;EACjE,UAAU,MAAM,EAAE,8BAA8B;EAChD,OAAO,MAAM,EAAE,2BAA2B;EAC3C;CACD,iBAAiB;EACf,UAAU,MAAM,EAAE,sCAAsC;EACxD,UAAU,MAAM,EAAE,sCAAsC;EACxD,OAAO,GAAG,GAAG,YAAY,sBACvB,eAAe,WACX,EAAE,gBAAgB,mBAAmB,UAAU,WAAW,OAAO,GACjE,EAAE,mCAAmC;EAC5C;CACF;AAED,MAAM,0BAGF;CACF,SAAS,EASR;CACD,MAAM;EAEJ,UAAU,MAAM,EAAE,sCAAsC;EACxD,WAAW,MAAM,EAAE,sCAAsC;EAC1D;CACD,QAAQ,EAMP;CACD,SAAS,EAAE;CACX,WAAW,EAAE;CACd"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getErrorMessage.js","names":[],"sources":["../../../src/utils/getErrorMessage.ts"],"sourcesContent":["import {\n type EVMChain,\n type ExecutionAction,\n LiFiErrorCode,\n type LiFiStepExtended,\n} from '@lifi/sdk'\nimport type { TFunction } from 'i18next'\nimport { formatTokenAmount, wrapLongWords } from '../utils/format.js'\n\nexport function getErrorMessage(\n t: TFunction,\n getChainById: (chainId: number) => EVMChain | undefined,\n step: LiFiStepExtended,\n failedAction?: ExecutionAction\n): { title: string; message: string } {\n const error = failedAction?.error\n if (!error) {\n return {\n title: t('error.title.unknown'),\n message: t('error.message.unknown'),\n }\n }\n\n const getDefaultErrorMessage = (key?: string) =>\n `${t((key as any) ?? 'error.message.transactionNotSent')} ${t(\n 'error.message.remainInYourWallet',\n {\n amount: formatTokenAmount(\n BigInt(step.action.fromAmount),\n step.action.fromToken.decimals\n ),\n tokenSymbol: step.action.fromToken.symbol,\n chainName: getChainById(step.action.fromChainId)?.name ?? '',\n }\n )}`\n\n let title = ''\n let message = ''\n switch (error.code) {\n case LiFiErrorCode.AllowanceRequired:\n title = t('error.title.allowanceRequired')\n message = t('error.message.allowanceRequired', {\n tokenSymbol: step.action.fromToken.symbol,\n })\n break\n case LiFiErrorCode.BalanceError:\n title = t('error.title.balanceIsTooLow')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.ChainSwitchError:\n title = t('error.title.chainSwitch')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.GasLimitError:\n title = t('error.title.gasLimitIsTooLow')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.InsufficientFunds:\n title = t('error.title.insufficientFunds')\n message = `${t(\n 'error.message.insufficientFunds'\n )} ${getDefaultErrorMessage()}`\n break\n case LiFiErrorCode.InsufficientGas:\n title = t('error.title.insufficientGas')\n message = `${t(\n 'error.message.insufficientFunds'\n )} ${getDefaultErrorMessage()}`\n break\n case LiFiErrorCode.SlippageError:\n title = t('error.title.slippageNotMet')\n message = t('error.message.slippageThreshold')\n break\n case LiFiErrorCode.TransactionFailed:\n title = t('error.title.transactionFailed')\n message = t('error.message.transactionFailed')\n break\n case LiFiErrorCode.TransactionExpired:\n title = t('error.title.transactionExpired')\n message = t('error.message.transactionExpired')\n break\n case LiFiErrorCode.TransactionSimulationFailed:\n title = t('error.title.transactionSimulationFailed')\n message = t('error.message.transactionSimulationFailed')\n break\n case LiFiErrorCode.WalletChangedDuringExecution:\n title = t('error.title.walletMismatch')\n message = t('error.message.walletChangedDuringExecution')\n break\n case LiFiErrorCode.RateLimitExceeded:\n title = t('error.title.rateLimitExceeded')\n message = t('error.message.rateLimitExceeded')\n break\n case LiFiErrorCode.ThirdPartyError:\n title = t('error.title.thirdPartyError')\n message = t('error.message.thirdPartyError')\n break\n case LiFiErrorCode.TransactionUnderpriced:\n title = t('error.title.transactionUnderpriced')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.TransactionUnprepared:\n title = t('error.title.transactionUnprepared')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.TransactionCanceled:\n title = t('error.title.transactionCanceled')\n message = getDefaultErrorMessage('error.message.transactionCanceled')\n break\n case LiFiErrorCode.TransactionRejected:\n title = t('error.title.transactionRejected')\n message = getDefaultErrorMessage('error.message.transactionRejected')\n break\n case LiFiErrorCode.TransactionConflict:\n title = t('error.title.transactionConflict')\n message = getDefaultErrorMessage('error.message.transactionConflict')\n break\n case LiFiErrorCode.ExchangeRateUpdateCanceled:\n title = t('error.title.exchangeRateUpdateCanceled')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.SignatureRejected:\n title = t('error.title.signatureRejected')\n message = t('error.message.signatureRejected', {\n amount: formatTokenAmount(\n BigInt(step.action.fromAmount),\n step.action.fromToken.decimals\n ),\n tokenSymbol: step.action.fromToken.symbol,\n chainName: getChainById(step.action.fromChainId)?.name ?? '',\n })\n break\n default:\n title = t('error.title.unknown')\n if (failedAction?.txHash) {\n message = t('error.message.transactionFailed')\n } else {\n message = error.message || t('error.message.unknown')\n }\n break\n }\n message = wrapLongWords(message)\n return { title, message }\n}\n"],"mappings":";;;AASA,SAAgB,gBACd,GACA,cACA,MACA,cACoC;CACpC,MAAM,QAAQ,cAAc;
|
|
1
|
+
{"version":3,"file":"getErrorMessage.js","names":[],"sources":["../../../src/utils/getErrorMessage.ts"],"sourcesContent":["import {\n type EVMChain,\n type ExecutionAction,\n LiFiErrorCode,\n type LiFiStepExtended,\n} from '@lifi/sdk'\nimport type { TFunction } from 'i18next'\nimport { formatTokenAmount, wrapLongWords } from '../utils/format.js'\n\nexport function getErrorMessage(\n t: TFunction,\n getChainById: (chainId: number) => EVMChain | undefined,\n step: LiFiStepExtended,\n failedAction?: ExecutionAction\n): { title: string; message: string } {\n const error = failedAction?.error\n if (!error) {\n return {\n title: t('error.title.unknown'),\n message: t('error.message.unknown'),\n }\n }\n\n const getDefaultErrorMessage = (key?: string) =>\n `${t((key as any) ?? 'error.message.transactionNotSent')} ${t(\n 'error.message.remainInYourWallet',\n {\n amount: formatTokenAmount(\n BigInt(step.action.fromAmount),\n step.action.fromToken.decimals\n ),\n tokenSymbol: step.action.fromToken.symbol,\n chainName: getChainById(step.action.fromChainId)?.name ?? '',\n }\n )}`\n\n let title = ''\n let message = ''\n switch (error.code) {\n case LiFiErrorCode.AllowanceRequired:\n title = t('error.title.allowanceRequired')\n message = t('error.message.allowanceRequired', {\n tokenSymbol: step.action.fromToken.symbol,\n })\n break\n case LiFiErrorCode.BalanceError:\n title = t('error.title.balanceIsTooLow')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.ChainSwitchError:\n title = t('error.title.chainSwitch')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.GasLimitError:\n title = t('error.title.gasLimitIsTooLow')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.InsufficientFunds:\n title = t('error.title.insufficientFunds')\n message = `${t(\n 'error.message.insufficientFunds'\n )} ${getDefaultErrorMessage()}`\n break\n case LiFiErrorCode.InsufficientGas:\n title = t('error.title.insufficientGas')\n message = `${t(\n 'error.message.insufficientFunds'\n )} ${getDefaultErrorMessage()}`\n break\n case LiFiErrorCode.SlippageError:\n title = t('error.title.slippageNotMet')\n message = t('error.message.slippageThreshold')\n break\n case LiFiErrorCode.TransactionFailed:\n title = t('error.title.transactionFailed')\n message = t('error.message.transactionFailed')\n break\n case LiFiErrorCode.TransactionExpired:\n title = t('error.title.transactionExpired')\n message = t('error.message.transactionExpired')\n break\n case LiFiErrorCode.TransactionSimulationFailed:\n title = t('error.title.transactionSimulationFailed')\n message = t('error.message.transactionSimulationFailed')\n break\n case LiFiErrorCode.WalletChangedDuringExecution:\n title = t('error.title.walletMismatch')\n message = t('error.message.walletChangedDuringExecution')\n break\n case LiFiErrorCode.RateLimitExceeded:\n title = t('error.title.rateLimitExceeded')\n message = t('error.message.rateLimitExceeded')\n break\n case LiFiErrorCode.ThirdPartyError:\n title = t('error.title.thirdPartyError')\n message = t('error.message.thirdPartyError')\n break\n case LiFiErrorCode.TransactionUnderpriced:\n title = t('error.title.transactionUnderpriced')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.TransactionUnprepared:\n title = t('error.title.transactionUnprepared')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.TransactionCanceled:\n title = t('error.title.transactionCanceled')\n message = getDefaultErrorMessage('error.message.transactionCanceled')\n break\n case LiFiErrorCode.TransactionRejected:\n title = t('error.title.transactionRejected')\n message = getDefaultErrorMessage('error.message.transactionRejected')\n break\n case LiFiErrorCode.TransactionConflict:\n title = t('error.title.transactionConflict')\n message = getDefaultErrorMessage('error.message.transactionConflict')\n break\n case LiFiErrorCode.ExchangeRateUpdateCanceled:\n title = t('error.title.exchangeRateUpdateCanceled')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.SignatureRejected:\n title = t('error.title.signatureRejected')\n message = t('error.message.signatureRejected', {\n amount: formatTokenAmount(\n BigInt(step.action.fromAmount),\n step.action.fromToken.decimals\n ),\n tokenSymbol: step.action.fromToken.symbol,\n chainName: getChainById(step.action.fromChainId)?.name ?? '',\n })\n break\n default:\n title = t('error.title.unknown')\n if (failedAction?.txHash) {\n message = t('error.message.transactionFailed')\n } else {\n message = error.message || t('error.message.unknown')\n }\n break\n }\n message = wrapLongWords(message)\n return { title, message }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getPriceImpact.js","names":[],"sources":["../../../src/utils/getPriceImpact.ts"],"sourcesContent":["import type { Token } from '@lifi/sdk'\nimport { formatTokenPrice } from './format.js'\n\ninterface GetPriceImpactProps {\n fromToken: Token\n toToken: Token\n fromAmount?: bigint\n toAmount?: bigint\n}\n\nexport const getPriceImpact = ({\n fromToken,\n toToken,\n fromAmount,\n toAmount,\n}: GetPriceImpactProps): number => {\n const fromTokenPrice = formatTokenPrice(\n fromAmount,\n fromToken.priceUSD,\n fromToken.decimals\n )\n const toTokenPrice = formatTokenPrice(\n toAmount,\n toToken.priceUSD,\n toToken.decimals\n )\n\n if (!fromTokenPrice) {\n return 0\n }\n\n const priceImpact = toTokenPrice / fromTokenPrice - 1\n\n return priceImpact\n}\n"],"mappings":";;AAUA,MAAa,kBAAkB,EAC7B,WACA,SACA,YACA,eACiC;CACjC,MAAM,iBAAiB,iBACrB,YACA,UAAU,UACV,UAAU,SACX;CACD,MAAM,eAAe,iBACnB,UACA,QAAQ,UACR,QAAQ,SACT;
|
|
1
|
+
{"version":3,"file":"getPriceImpact.js","names":[],"sources":["../../../src/utils/getPriceImpact.ts"],"sourcesContent":["import type { Token } from '@lifi/sdk'\nimport { formatTokenPrice } from './format.js'\n\ninterface GetPriceImpactProps {\n fromToken: Token\n toToken: Token\n fromAmount?: bigint\n toAmount?: bigint\n}\n\nexport const getPriceImpact = ({\n fromToken,\n toToken,\n fromAmount,\n toAmount,\n}: GetPriceImpactProps): number => {\n const fromTokenPrice = formatTokenPrice(\n fromAmount,\n fromToken.priceUSD,\n fromToken.decimals\n )\n const toTokenPrice = formatTokenPrice(\n toAmount,\n toToken.priceUSD,\n toToken.decimals\n )\n\n if (!fromTokenPrice) {\n return 0\n }\n\n const priceImpact = toTokenPrice / fromTokenPrice - 1\n\n return priceImpact\n}\n"],"mappings":";;AAUA,MAAa,kBAAkB,EAC7B,WACA,SACA,YACA,eACiC;CACjC,MAAM,iBAAiB,iBACrB,YACA,UAAU,UACV,UAAU,SACX;CACD,MAAM,eAAe,iBACnB,UACA,QAAQ,UACR,QAAQ,SACT;CAED,IAAI,CAAC,gBACH,OAAO;CAKT,OAFoB,eAAe,iBAAiB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.js","names":[],"sources":["../../../src/utils/input.ts"],"sourcesContent":["export const fitInputText = (\n maxFontSize: number,\n minFontSize: number,\n element: HTMLElement\n): void => {\n if (!element) {\n return\n }\n let high = maxFontSize\n let low = minFontSize\n let size = minFontSize\n let mid = 0\n // Binary search for highest font size best fit\n while (low <= high) {\n mid = (high + low) >> 1\n const fontSize = `${mid + 1}px`\n element.style.fontSize = fontSize\n // scrollWidth has different rounding than clientWidth, remove 1px for consistency\n const scrollWidth = element.scrollWidth - 1\n if (scrollWidth <= element.clientWidth) {\n size = mid\n low = mid + 1\n } else {\n high = mid - 1\n }\n }\n const fontSize = `${size}px`\n element.style.fontSize = fontSize\n}\n"],"mappings":";AAAA,MAAa,gBACX,aACA,aACA,YACS;
|
|
1
|
+
{"version":3,"file":"input.js","names":[],"sources":["../../../src/utils/input.ts"],"sourcesContent":["export const fitInputText = (\n maxFontSize: number,\n minFontSize: number,\n element: HTMLElement\n): void => {\n if (!element) {\n return\n }\n let high = maxFontSize\n let low = minFontSize\n let size = minFontSize\n let mid = 0\n // Binary search for highest font size best fit\n while (low <= high) {\n mid = (high + low) >> 1\n const fontSize = `${mid + 1}px`\n element.style.fontSize = fontSize\n // scrollWidth has different rounding than clientWidth, remove 1px for consistency\n const scrollWidth = element.scrollWidth - 1\n if (scrollWidth <= element.clientWidth) {\n size = mid\n low = mid + 1\n } else {\n high = mid - 1\n }\n }\n const fontSize = `${size}px`\n element.style.fontSize = fontSize\n}\n"],"mappings":";AAAA,MAAa,gBACX,aACA,aACA,YACS;CACT,IAAI,CAAC,SACH;CAEF,IAAI,OAAO;CACX,IAAI,MAAM;CACV,IAAI,OAAO;CACX,IAAI,MAAM;CAEV,OAAO,OAAO,MAAM;EAClB,MAAO,OAAO,OAAQ;EACtB,MAAM,WAAW,GAAG,MAAM,EAAE;EAC5B,QAAQ,MAAM,WAAW;EAGzB,IADoB,QAAQ,cAAc,KACvB,QAAQ,aAAa;GACtC,OAAO;GACP,MAAM,MAAM;SAEZ,OAAO,MAAM;;CAGjB,MAAM,WAAW,GAAG,KAAK;CACzB,QAAQ,MAAM,WAAW"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"item.js","names":[],"sources":["../../../src/utils/item.ts"],"sourcesContent":["import type { FormType } from '../stores/form/types.js'\nimport type {\n AllowDeny,\n AllowDenyItems,\n AllowDenySet,\n AllowDenySetItem,\n AllowDenySets,\n} from '../types/widget.js'\n\n// Use for a single item check\nexport const isItemAllowed = <T>(\n item: T,\n items: AllowDeny<T> | undefined\n): boolean => {\n if (items?.allow?.length) {\n return items.allow.includes(item)\n }\n return !items?.deny?.includes(item)\n}\n\n// Use for a O(1) set lookup of multiple items check\nexport const isItemAllowedForSets = <T>(\n item: T,\n items: AllowDenySet | undefined,\n getKey?: (item: T) => AllowDenySetItem\n): boolean => {\n if (items?.allow?.size) {\n return items.allow.has(getKey?.(item) ?? (item as AllowDenySetItem))\n }\n return !items?.deny?.has(getKey?.(item) ?? (item as AllowDenySetItem))\n}\n\nexport const getConfigItemSets = <T>(\n items: AllowDenyItems<T> | undefined,\n getSet: (items: T[]) => Set<AllowDenySetItem>,\n formType?: FormType\n): AllowDenySets | undefined => {\n if (!items) {\n return undefined\n }\n return {\n allow: getSet(items.allow ?? []),\n deny: getSet(items.deny ?? []),\n ...(formType && {\n [formType]: {\n allow: getSet(items[formType]?.allow ?? []),\n deny: getSet(items[formType]?.deny ?? []),\n },\n }),\n }\n}\n\nexport const isFormItemAllowed = <T>(\n item: T,\n configTokens: AllowDenySets | undefined,\n formType?: FormType,\n getKey?: (item: T) => AllowDenySetItem\n): boolean => {\n return (\n isItemAllowedForSets(item, configTokens, getKey) &&\n (formType\n ? isItemAllowedForSets(item, configTokens?.[formType], getKey)\n : true)\n )\n}\n"],"mappings":";AAUA,MAAa,iBACX,MACA,UACY;
|
|
1
|
+
{"version":3,"file":"item.js","names":[],"sources":["../../../src/utils/item.ts"],"sourcesContent":["import type { FormType } from '../stores/form/types.js'\nimport type {\n AllowDeny,\n AllowDenyItems,\n AllowDenySet,\n AllowDenySetItem,\n AllowDenySets,\n} from '../types/widget.js'\n\n// Use for a single item check\nexport const isItemAllowed = <T>(\n item: T,\n items: AllowDeny<T> | undefined\n): boolean => {\n if (items?.allow?.length) {\n return items.allow.includes(item)\n }\n return !items?.deny?.includes(item)\n}\n\n// Use for a O(1) set lookup of multiple items check\nexport const isItemAllowedForSets = <T>(\n item: T,\n items: AllowDenySet | undefined,\n getKey?: (item: T) => AllowDenySetItem\n): boolean => {\n if (items?.allow?.size) {\n return items.allow.has(getKey?.(item) ?? (item as AllowDenySetItem))\n }\n return !items?.deny?.has(getKey?.(item) ?? (item as AllowDenySetItem))\n}\n\nexport const getConfigItemSets = <T>(\n items: AllowDenyItems<T> | undefined,\n getSet: (items: T[]) => Set<AllowDenySetItem>,\n formType?: FormType\n): AllowDenySets | undefined => {\n if (!items) {\n return undefined\n }\n return {\n allow: getSet(items.allow ?? []),\n deny: getSet(items.deny ?? []),\n ...(formType && {\n [formType]: {\n allow: getSet(items[formType]?.allow ?? []),\n deny: getSet(items[formType]?.deny ?? []),\n },\n }),\n }\n}\n\nexport const isFormItemAllowed = <T>(\n item: T,\n configTokens: AllowDenySets | undefined,\n formType?: FormType,\n getKey?: (item: T) => AllowDenySetItem\n): boolean => {\n return (\n isItemAllowedForSets(item, configTokens, getKey) &&\n (formType\n ? isItemAllowedForSets(item, configTokens?.[formType], getKey)\n : true)\n )\n}\n"],"mappings":";AAUA,MAAa,iBACX,MACA,UACY;CACZ,IAAI,OAAO,OAAO,QAChB,OAAO,MAAM,MAAM,SAAS,KAAK;CAEnC,OAAO,CAAC,OAAO,MAAM,SAAS,KAAK;;AAIrC,MAAa,wBACX,MACA,OACA,WACY;CACZ,IAAI,OAAO,OAAO,MAChB,OAAO,MAAM,MAAM,IAAI,SAAS,KAAK,IAAK,KAA0B;CAEtE,OAAO,CAAC,OAAO,MAAM,IAAI,SAAS,KAAK,IAAK,KAA0B;;AAGxE,MAAa,qBACX,OACA,QACA,aAC8B;CAC9B,IAAI,CAAC,OACH;CAEF,OAAO;EACL,OAAO,OAAO,MAAM,SAAS,EAAE,CAAC;EAChC,MAAM,OAAO,MAAM,QAAQ,EAAE,CAAC;EAC9B,GAAI,YAAY,GACb,WAAW;GACV,OAAO,OAAO,MAAM,WAAW,SAAS,EAAE,CAAC;GAC3C,MAAM,OAAO,MAAM,WAAW,QAAQ,EAAE,CAAC;GAC1C,EACF;EACF;;AAGH,MAAa,qBACX,MACA,cACA,UACA,WACY;CACZ,OACE,qBAAqB,MAAM,cAAc,OAAO,KAC/C,WACG,qBAAqB,MAAM,eAAe,WAAW,OAAO,GAC5D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"percentFormatter.js","names":[],"sources":["../../../src/utils/percentFormatter.ts"],"sourcesContent":["/**\n * We use <0.01% for both small positive and negative changes to keep it simple and clear, focusing on minimal impact rather than direction.\n * Examples:\n * +0.007% -> <0.01%\n * -0.003% -> <0.01%\n */\nexport const percentFormatter = (\n lng: string | undefined,\n options: any\n): ((value: any) => string) => {\n const formatter = new Intl.NumberFormat(lng, {\n ...options,\n style: 'percent',\n })\n return (value: any) => {\n if ((value > 0 && value < 0.0001) || (value < 0 && value > -0.0001)) {\n return `<${formatter.format(0.0001)}`\n }\n\n const formattedValue = formatter.format(value)\n\n if (options?.usePlusSign && value > 0) {\n return `+${formattedValue}`\n }\n\n return formattedValue\n }\n}\n"],"mappings":";;;;;;;AAMA,MAAa,oBACX,KACA,YAC6B;CAC7B,MAAM,YAAY,IAAI,KAAK,aAAa,KAAK;EAC3C,GAAG;EACH,OAAO;EACR,CAAC;
|
|
1
|
+
{"version":3,"file":"percentFormatter.js","names":[],"sources":["../../../src/utils/percentFormatter.ts"],"sourcesContent":["/**\n * We use <0.01% for both small positive and negative changes to keep it simple and clear, focusing on minimal impact rather than direction.\n * Examples:\n * +0.007% -> <0.01%\n * -0.003% -> <0.01%\n */\nexport const percentFormatter = (\n lng: string | undefined,\n options: any\n): ((value: any) => string) => {\n const formatter = new Intl.NumberFormat(lng, {\n ...options,\n style: 'percent',\n })\n return (value: any) => {\n if ((value > 0 && value < 0.0001) || (value < 0 && value > -0.0001)) {\n return `<${formatter.format(0.0001)}`\n }\n\n const formattedValue = formatter.format(value)\n\n if (options?.usePlusSign && value > 0) {\n return `+${formattedValue}`\n }\n\n return formattedValue\n }\n}\n"],"mappings":";;;;;;;AAMA,MAAa,oBACX,KACA,YAC6B;CAC7B,MAAM,YAAY,IAAI,KAAK,aAAa,KAAK;EAC3C,GAAG;EACH,OAAO;EACR,CAAC;CACF,QAAQ,UAAe;EACrB,IAAK,QAAQ,KAAK,QAAQ,QAAY,QAAQ,KAAK,QAAQ,OACzD,OAAO,IAAI,UAAU,OAAO,KAAO;EAGrC,MAAM,iBAAiB,UAAU,OAAO,MAAM;EAE9C,IAAI,SAAS,eAAe,QAAQ,GAClC,OAAO,IAAI;EAGb,OAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepareActions.js","names":[],"sources":["../../../src/utils/prepareActions.ts"],"sourcesContent":["import type { ExecutionAction } from '@lifi/sdk'\n\n// NB: New SDK adds new actions - merge them into old TOKEN_ALLOWANCE before UI changes\nconst allowanceTypes = new Set([\n 'NATIVE_PERMIT',\n 'CHECK_ALLOWANCE',\n 'RESET_ALLOWANCE',\n 'SET_ALLOWANCE',\n])\n\nexport function prepareActions(\n actions: ExecutionAction[]\n): ExecutionAction[][] {\n const groups = new Map<string | number, ExecutionAction[]>()\n for (const action of actions) {\n const key = allowanceTypes.has(action.type)\n ? 'TOKEN_ALLOWANCE'\n : action.type\n const group = groups.get(key)\n if (group) {\n group.push(action)\n } else {\n groups.set(key, [action])\n }\n }\n return [...groups.values()]\n}\n"],"mappings":";AAGA,MAAM,iBAAiB,IAAI,IAAI;CAC7B;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAgB,eACd,SACqB;CACrB,MAAM,yBAAS,IAAI,KAAyC;
|
|
1
|
+
{"version":3,"file":"prepareActions.js","names":[],"sources":["../../../src/utils/prepareActions.ts"],"sourcesContent":["import type { ExecutionAction } from '@lifi/sdk'\n\n// NB: New SDK adds new actions - merge them into old TOKEN_ALLOWANCE before UI changes\nconst allowanceTypes = new Set([\n 'NATIVE_PERMIT',\n 'CHECK_ALLOWANCE',\n 'RESET_ALLOWANCE',\n 'SET_ALLOWANCE',\n])\n\nexport function prepareActions(\n actions: ExecutionAction[]\n): ExecutionAction[][] {\n const groups = new Map<string | number, ExecutionAction[]>()\n for (const action of actions) {\n const key = allowanceTypes.has(action.type)\n ? 'TOKEN_ALLOWANCE'\n : action.type\n const group = groups.get(key)\n if (group) {\n group.push(action)\n } else {\n groups.set(key, [action])\n }\n }\n return [...groups.values()]\n}\n"],"mappings":";AAGA,MAAM,iBAAiB,IAAI,IAAI;CAC7B;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAgB,eACd,SACqB;CACrB,MAAM,yBAAS,IAAI,KAAyC;CAC5D,KAAK,MAAM,UAAU,SAAS;EAC5B,MAAM,MAAM,eAAe,IAAI,OAAO,KAAK,GACvC,oBACA,OAAO;EACX,MAAM,QAAQ,OAAO,IAAI,IAAI;EAC7B,IAAI,OACF,MAAM,KAAK,OAAO;OAElB,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;;CAG7B,OAAO,CAAC,GAAG,OAAO,QAAQ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timer.js","names":[],"sources":["../../../src/utils/timer.ts"],"sourcesContent":["export const formatTimer = ({\n days = 0,\n hours = 0,\n minutes = 0,\n seconds = 0,\n locale = 'en',\n}: {\n days?: number\n hours?: number\n minutes?: number\n seconds?: number\n locale?: string\n}): string => {\n if (typeof (Intl as any).DurationFormat === 'function') {\n const time = new (Intl as any).DurationFormat(locale, {\n style: 'digital',\n hours: '2-digit',\n hoursDisplay: 'auto',\n }).format({\n days,\n hours,\n minutes,\n seconds,\n })\n // This handles a fixed bug with Webkit, and Safari\n // https://github.com/WebKit/WebKit/pull/38357\n // https://developer.apple.com/documentation/safari-release-notes/safari-18_4-release-notes#JavaScript\n //\n // Since most users haven't updated their browsers yet, they would have this issue\n // it should be safe to remove the check after a while.\n return time.replace(/^:, /, '')\n }\n\n return ''\n}\n"],"mappings":";AAAA,MAAa,eAAe,EAC1B,OAAO,GACP,QAAQ,GACR,UAAU,GACV,UAAU,GACV,SAAS,WAOG;
|
|
1
|
+
{"version":3,"file":"timer.js","names":[],"sources":["../../../src/utils/timer.ts"],"sourcesContent":["export const formatTimer = ({\n days = 0,\n hours = 0,\n minutes = 0,\n seconds = 0,\n locale = 'en',\n}: {\n days?: number\n hours?: number\n minutes?: number\n seconds?: number\n locale?: string\n}): string => {\n if (typeof (Intl as any).DurationFormat === 'function') {\n const time = new (Intl as any).DurationFormat(locale, {\n style: 'digital',\n hours: '2-digit',\n hoursDisplay: 'auto',\n }).format({\n days,\n hours,\n minutes,\n seconds,\n })\n // This handles a fixed bug with Webkit, and Safari\n // https://github.com/WebKit/WebKit/pull/38357\n // https://developer.apple.com/documentation/safari-release-notes/safari-18_4-release-notes#JavaScript\n //\n // Since most users haven't updated their browsers yet, they would have this issue\n // it should be safe to remove the check after a while.\n return time.replace(/^:, /, '')\n }\n\n return ''\n}\n"],"mappings":";AAAA,MAAa,eAAe,EAC1B,OAAO,GACP,QAAQ,GACR,UAAU,GACV,UAAU,GACV,SAAS,WAOG;CACZ,IAAI,OAAQ,KAAa,mBAAmB,YAiB1C,OAhBa,IAAK,KAAa,eAAe,QAAQ;EACpD,OAAO;EACP,OAAO;EACP,cAAc;EACf,CAAC,CAAC,OAAO;EACR;EACA;EACA;EACA;EACD,CAOU,CAAC,QAAQ,QAAQ,GAAG;CAGjC,OAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.js","names":[],"sources":["../../../src/utils/token.ts"],"sourcesContent":["import type { BaseToken, Token, TokenExtended } from '@lifi/sdk'\nimport type { FormType } from '../stores/form/types.js'\nimport type { TokensByChain } from '../types/token.js'\nimport type { WidgetChains, WidgetTokens } from '../types/widget.js'\nimport { getConfigItemSets, isFormItemAllowed } from './item.js'\n\n/**\n * Merges verified tokens with search tokens.\n * Verified tokens take priority - search tokens are only added if they don't already exist.\n */\nexport const mergeVerifiedWithSearchTokens = (\n verifiedTokens?: TokensByChain,\n searchTokens?: TokensByChain\n): TokensByChain | undefined => {\n if (!verifiedTokens) {\n return searchTokens\n }\n if (!searchTokens) {\n return verifiedTokens\n }\n\n const result = { ...verifiedTokens }\n\n for (const [chainId, tokens] of Object.entries(searchTokens)) {\n const chainIdNum = Number(chainId)\n const existingTokens = result[chainIdNum] || []\n const existingAddresses = new Set(\n existingTokens.map((t) => t.address.toLowerCase())\n )\n\n const newTokens = tokens.filter(\n (t) => !existingAddresses.has(t.address.toLowerCase())\n )\n\n if (newTokens.length) {\n result[chainIdNum] = [...existingTokens, ...newTokens]\n }\n }\n\n return result\n}\n\n/**\n * Updates a token in the cache by chainId and address.\n * Returns a new cache object with the token updated, or the original if not found.\n */\nexport const updateTokenInCache = (\n data: TokensByChain | undefined,\n token: Token\n): TokensByChain | undefined => {\n if (!data) {\n return data\n }\n const chainTokens = data[token.chainId]\n if (!chainTokens) {\n return data\n }\n const index = chainTokens.findIndex((t) => t.address === token.address)\n if (index < 0) {\n return data\n }\n return {\n ...data,\n [token.chainId]: chainTokens.map((t, i) =>\n i === index ? { ...t, ...token } : t\n ),\n }\n}\n\nexport const filterAllowedTokens = (\n dataTokens: { [chainId: number]: TokenExtended[] } | undefined,\n configTokens?: WidgetTokens,\n chainsConfig?: WidgetChains,\n formType?: FormType\n): { [chainId: number]: TokenExtended[] } | undefined => {\n if (!dataTokens) {\n return\n }\n\n const includedTokens = configTokens?.include || []\n const allChainIds = Array.from(\n new Set([\n ...includedTokens.map((t) => t.chainId),\n ...Object.keys(dataTokens),\n ])\n ).map((chainId) => Number(chainId))\n\n const configChainIdsSet = getConfigItemSets(\n chainsConfig,\n (chainIds: number[]) => new Set(chainIds),\n formType\n )\n\n const allowedChainIds = configChainIdsSet\n ? allChainIds.filter((chainId) =>\n isFormItemAllowed(chainId, configChainIdsSet, formType)\n )\n : allChainIds\n\n const allowedTokensByChain: { [chainId: number]: TokenExtended[] } = {}\n for (const chainId of allowedChainIds) {\n const chainTokens = [\n ...dataTokens[chainId],\n ...includedTokens.filter((t) => Number(t.chainId) === chainId),\n ]\n\n const allowedAddresses = 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 filtered = chainTokens.filter((token) =>\n isFormItemAllowed(token, allowedAddresses, formType, (t) =>\n t.address.toLowerCase()\n )\n )\n\n allowedTokensByChain[chainId] = filtered\n }\n\n return allowedTokensByChain\n}\n"],"mappings":";;;;;;AAUA,MAAa,iCACX,gBACA,iBAC8B;
|
|
1
|
+
{"version":3,"file":"token.js","names":[],"sources":["../../../src/utils/token.ts"],"sourcesContent":["import type { BaseToken, Token, TokenExtended } from '@lifi/sdk'\nimport type { FormType } from '../stores/form/types.js'\nimport type { TokensByChain } from '../types/token.js'\nimport type { WidgetChains, WidgetTokens } from '../types/widget.js'\nimport { getConfigItemSets, isFormItemAllowed } from './item.js'\n\n/**\n * Merges verified tokens with search tokens.\n * Verified tokens take priority - search tokens are only added if they don't already exist.\n */\nexport const mergeVerifiedWithSearchTokens = (\n verifiedTokens?: TokensByChain,\n searchTokens?: TokensByChain\n): TokensByChain | undefined => {\n if (!verifiedTokens) {\n return searchTokens\n }\n if (!searchTokens) {\n return verifiedTokens\n }\n\n const result = { ...verifiedTokens }\n\n for (const [chainId, tokens] of Object.entries(searchTokens)) {\n const chainIdNum = Number(chainId)\n const existingTokens = result[chainIdNum] || []\n const existingAddresses = new Set(\n existingTokens.map((t) => t.address.toLowerCase())\n )\n\n const newTokens = tokens.filter(\n (t) => !existingAddresses.has(t.address.toLowerCase())\n )\n\n if (newTokens.length) {\n result[chainIdNum] = [...existingTokens, ...newTokens]\n }\n }\n\n return result\n}\n\n/**\n * Updates a token in the cache by chainId and address.\n * Returns a new cache object with the token updated, or the original if not found.\n */\nexport const updateTokenInCache = (\n data: TokensByChain | undefined,\n token: Token\n): TokensByChain | undefined => {\n if (!data) {\n return data\n }\n const chainTokens = data[token.chainId]\n if (!chainTokens) {\n return data\n }\n const index = chainTokens.findIndex((t) => t.address === token.address)\n if (index < 0) {\n return data\n }\n return {\n ...data,\n [token.chainId]: chainTokens.map((t, i) =>\n i === index ? { ...t, ...token } : t\n ),\n }\n}\n\nexport const filterAllowedTokens = (\n dataTokens: { [chainId: number]: TokenExtended[] } | undefined,\n configTokens?: WidgetTokens,\n chainsConfig?: WidgetChains,\n formType?: FormType\n): { [chainId: number]: TokenExtended[] } | undefined => {\n if (!dataTokens) {\n return\n }\n\n const includedTokens = configTokens?.include || []\n const allChainIds = Array.from(\n new Set([\n ...includedTokens.map((t) => t.chainId),\n ...Object.keys(dataTokens),\n ])\n ).map((chainId) => Number(chainId))\n\n const configChainIdsSet = getConfigItemSets(\n chainsConfig,\n (chainIds: number[]) => new Set(chainIds),\n formType\n )\n\n const allowedChainIds = configChainIdsSet\n ? allChainIds.filter((chainId) =>\n isFormItemAllowed(chainId, configChainIdsSet, formType)\n )\n : allChainIds\n\n const allowedTokensByChain: { [chainId: number]: TokenExtended[] } = {}\n for (const chainId of allowedChainIds) {\n const chainTokens = [\n ...dataTokens[chainId],\n ...includedTokens.filter((t) => Number(t.chainId) === chainId),\n ]\n\n const allowedAddresses = 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 filtered = chainTokens.filter((token) =>\n isFormItemAllowed(token, allowedAddresses, formType, (t) =>\n t.address.toLowerCase()\n )\n )\n\n allowedTokensByChain[chainId] = filtered\n }\n\n return allowedTokensByChain\n}\n"],"mappings":";;;;;;AAUA,MAAa,iCACX,gBACA,iBAC8B;CAC9B,IAAI,CAAC,gBACH,OAAO;CAET,IAAI,CAAC,cACH,OAAO;CAGT,MAAM,SAAS,EAAE,GAAG,gBAAgB;CAEpC,KAAK,MAAM,CAAC,SAAS,WAAW,OAAO,QAAQ,aAAa,EAAE;EAC5D,MAAM,aAAa,OAAO,QAAQ;EAClC,MAAM,iBAAiB,OAAO,eAAe,EAAE;EAC/C,MAAM,oBAAoB,IAAI,IAC5B,eAAe,KAAK,MAAM,EAAE,QAAQ,aAAa,CAAC,CACnD;EAED,MAAM,YAAY,OAAO,QACtB,MAAM,CAAC,kBAAkB,IAAI,EAAE,QAAQ,aAAa,CAAC,CACvD;EAED,IAAI,UAAU,QACZ,OAAO,cAAc,CAAC,GAAG,gBAAgB,GAAG,UAAU;;CAI1D,OAAO;;;;;;AAOT,MAAa,sBACX,MACA,UAC8B;CAC9B,IAAI,CAAC,MACH,OAAO;CAET,MAAM,cAAc,KAAK,MAAM;CAC/B,IAAI,CAAC,aACH,OAAO;CAET,MAAM,QAAQ,YAAY,WAAW,MAAM,EAAE,YAAY,MAAM,QAAQ;CACvE,IAAI,QAAQ,GACV,OAAO;CAET,OAAO;EACL,GAAG;GACF,MAAM,UAAU,YAAY,KAAK,GAAG,MACnC,MAAM,QAAQ;GAAE,GAAG;GAAG,GAAG;GAAO,GAAG,EACpC;EACF;;AAGH,MAAa,uBACX,YACA,cACA,cACA,aACuD;CACvD,IAAI,CAAC,YACH;CAGF,MAAM,iBAAiB,cAAc,WAAW,EAAE;CAClD,MAAM,cAAc,MAAM,KACxB,IAAI,IAAI,CACN,GAAG,eAAe,KAAK,MAAM,EAAE,QAAQ,EACvC,GAAG,OAAO,KAAK,WAAW,CAC3B,CAAC,CACH,CAAC,KAAK,YAAY,OAAO,QAAQ,CAAC;CAEnC,MAAM,oBAAoB,kBACxB,eACC,aAAuB,IAAI,IAAI,SAAS,EACzC,SACD;CAED,MAAM,kBAAkB,oBACpB,YAAY,QAAQ,YAClB,kBAAkB,SAAS,mBAAmB,SAAS,CACxD,GACD;CAEJ,MAAM,uBAA+D,EAAE;CACvE,KAAK,MAAM,WAAW,iBAAiB;EACrC,MAAM,cAAc,CAClB,GAAG,WAAW,UACd,GAAG,eAAe,QAAQ,MAAM,OAAO,EAAE,QAAQ,KAAK,QAAQ,CAC/D;EAED,MAAM,mBAAmB,kBACvB,eACC,WACC,IAAI,IACF,OACG,QAAQ,MAAM,OAAO,EAAE,QAAQ,KAAK,QAAQ,CAC5C,KAAK,MAAM,EAAE,QAAQ,aAAa,CAAC,CACvC,EACH,SACD;EAQD,qBAAqB,WANJ,YAAY,QAAQ,UACnC,kBAAkB,OAAO,kBAAkB,WAAW,MACpD,EAAE,QAAQ,aAAa,CACxB,CAGqC;;CAG1C,OAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenList.js","names":[],"sources":["../../../src/utils/tokenList.ts"],"sourcesContent":["import {\n formatUnits,\n type TokenExtended,\n type WalletTokenExtended,\n} from '@lifi/sdk'\nimport type { TokenAmount, TokenAmountExtended } from '../types/token.js'\nimport type { WidgetTokens } from '../types/widget.js'\n\nconst sortByBalances = (a: TokenAmount, b: TokenAmount) =>\n Number.parseFloat(formatUnits(b.amount ?? 0n, b.decimals)) *\n Number.parseFloat(b.priceUSD ?? '0') -\n Number.parseFloat(formatUnits(a.amount ?? 0n, a.decimals)) *\n Number.parseFloat(a.priceUSD ?? '0')\n\nconst sortByVolume = (a: TokenExtended, b: TokenExtended) =>\n (b.volumeUSD24H ?? 0) - (a.volumeUSD24H ?? 0)\n\nexport const processTokenBalances = (\n isBalanceLoading: boolean,\n noCategories: boolean,\n configTokens?: WidgetTokens,\n selectedChainId?: number,\n tokens?: TokenExtended[],\n tokensWithBalances?: TokenAmount[],\n isPinnedToken?: (chainId: number, tokenAddress: string) => boolean\n): {\n processedTokens: TokenAmount[]\n withCategories: boolean\n withPinnedTokens: boolean\n} => {\n if (isBalanceLoading) {\n if (noCategories) {\n const sortedTokens = [...(tokens ?? [])].sort(sortByVolume)\n // Separate pinned tokens\n if (isPinnedToken) {\n const pinned: TokenAmount[] = []\n const notPinned: TokenAmount[] = []\n for (const token of sortedTokens) {\n if (isPinnedToken(token.chainId, token.address)) {\n const pinnedToken = { ...token, pinned: true } as TokenAmount\n pinned.push(pinnedToken)\n } else {\n notPinned.push(token)\n }\n }\n return {\n processedTokens: [...pinned, ...notPinned],\n withCategories: false,\n withPinnedTokens: !!pinned.length,\n }\n }\n return {\n processedTokens: sortedTokens,\n withCategories: false,\n withPinnedTokens: false,\n }\n } else {\n return processedTypedTokens(\n tokens ?? [],\n [],\n selectedChainId,\n configTokens,\n isPinnedToken\n )\n }\n }\n\n const sortedTokensWithBalances = [...(tokensWithBalances ?? [])].sort(\n sortByBalances\n )\n\n const tokensWithBalancesSet = new Set(\n sortedTokensWithBalances.map(\n (token) => `${token.chainId}-${token.address.toLowerCase()}`\n )\n )\n const tokensWithoutBalances =\n tokens\n ?.filter((token) => {\n const tokenKey = `${token.chainId}-${token.address.toLowerCase()}`\n return !tokensWithBalancesSet.has(tokenKey)\n })\n .sort(sortByVolume) ?? []\n\n if (noCategories) {\n // Separate pinned tokens\n if (isPinnedToken) {\n const pinnedWithBalances: TokenAmount[] = []\n const notPinnedWithBalances: TokenAmount[] = []\n const pinnedWithoutBalances: TokenAmount[] = []\n const notPinnedWithoutBalances: TokenAmount[] = []\n\n for (const token of sortedTokensWithBalances) {\n if (isPinnedToken(token.chainId, token.address)) {\n const pinnedToken = { ...token, pinned: true } as TokenAmount\n pinnedWithBalances.push(pinnedToken)\n } else {\n notPinnedWithBalances.push(token)\n }\n }\n\n for (const token of tokensWithoutBalances) {\n if (isPinnedToken(token.chainId, token.address)) {\n const pinnedToken = { ...token, pinned: true } as TokenAmount\n pinnedWithoutBalances.push(pinnedToken)\n } else {\n notPinnedWithoutBalances.push(token)\n }\n }\n\n return {\n processedTokens: [\n ...pinnedWithBalances,\n ...pinnedWithoutBalances,\n ...notPinnedWithBalances,\n ...notPinnedWithoutBalances,\n ],\n withCategories: false,\n withPinnedTokens:\n !!pinnedWithBalances.length || !!pinnedWithoutBalances.length,\n }\n }\n return {\n processedTokens: [...sortedTokensWithBalances, ...tokensWithoutBalances],\n withCategories: false,\n withPinnedTokens: false,\n }\n } else {\n return processedTypedTokens(\n tokensWithoutBalances,\n sortedTokensWithBalances,\n selectedChainId,\n configTokens,\n isPinnedToken\n )\n }\n}\n\n// NB: only for non-all-networks\nconst processedTypedTokens = (\n tokens: TokenAmount[],\n tokensWithBalances: TokenAmount[],\n selectedChainId?: number,\n configTokens?: WidgetTokens,\n isPinnedToken?: (chainId: number, tokenAddress: string) => boolean\n) => {\n const filteredTokensMap = new Map(\n tokens.map((token) => [token.address, token])\n )\n\n const pinnedTokens: TokenAmount[] = []\n const featuredTokensFromConfig: TokenAmount[] = []\n const popularTokensFromConfig: TokenAmount[] = []\n\n ;(['popular', 'featured'] as const).forEach((tokenType) => {\n const typedTokens = configTokens?.[tokenType]?.filter(\n (token) => token.chainId === selectedChainId\n )\n\n typedTokens?.forEach((token) => {\n const tokenAmount = { ...token } as TokenAmount\n tokenAmount[tokenType] = true\n // Config tokens are explicitly set by integrator, mark as verified\n tokenAmount.verified = true\n\n const match = filteredTokensMap.get(token.address)\n if (match?.priceUSD) {\n tokenAmount.priceUSD = match.priceUSD\n }\n if (!token.logoURI && match?.logoURI) {\n tokenAmount.logoURI = match.logoURI\n }\n\n if (tokenType === 'popular') {\n popularTokensFromConfig.push(tokenAmount)\n } else {\n featuredTokensFromConfig.push(tokenAmount)\n }\n\n // Additionally add to pinned tokens if it is pinned\n const isPinned =\n isPinnedToken && selectedChainId\n ? isPinnedToken(selectedChainId, token.address)\n : false\n if (isPinned) {\n const pinnedToken = { ...tokenAmount, pinned: true } as TokenAmount\n pinnedTokens.push(pinnedToken)\n }\n })\n })\n\n // Filter out config-added tokens from main list\n const configTokenAddresses = new Set(\n [...popularTokensFromConfig, ...featuredTokensFromConfig].map((t) =>\n t.address.toLowerCase()\n )\n )\n\n const remainingTokens = tokens.filter(\n (token) => !configTokenAddresses.has(token.address.toLowerCase())\n )\n\n const otherTokens: TokenAmount[] = []\n\n // Separate pinned tokens and categorize remaining tokens\n for (const token of remainingTokens) {\n const isPinned =\n isPinnedToken && selectedChainId\n ? isPinnedToken(selectedChainId, token.address)\n : false\n\n if (isPinned) {\n const pinnedToken = { ...token, pinned: true } as TokenAmount\n pinnedTokens.push(pinnedToken)\n } else if (token.featured) {\n featuredTokensFromConfig.push(token)\n } else if (token.popular) {\n popularTokensFromConfig.push(token)\n } else {\n otherTokens.push(token)\n }\n }\n\n // Also check tokens with balances for pinned status\n const pinnedTokensWithBalances: TokenAmount[] = []\n const nonPinnedTokensWithBalances: TokenAmount[] = []\n\n if (isPinnedToken && selectedChainId) {\n for (const token of tokensWithBalances) {\n if (isPinnedToken(selectedChainId, token.address)) {\n const pinnedToken = { ...token, pinned: true } as TokenAmount\n pinnedTokensWithBalances.push(pinnedToken)\n } else {\n nonPinnedTokensWithBalances.push(token)\n }\n }\n } else {\n nonPinnedTokensWithBalances.push(...tokensWithBalances)\n }\n\n const sortedPinnedTokens = [\n ...pinnedTokens,\n ...pinnedTokensWithBalances,\n ].sort(sortByVolume)\n const sortedFeaturedTokens = [...featuredTokensFromConfig].sort(sortByVolume)\n const sortedPopularTokens = [...popularTokensFromConfig].sort(sortByVolume)\n const sortedOtherTokens = [...otherTokens].sort(sortByVolume)\n\n return {\n processedTokens: [\n ...sortedPinnedTokens,\n ...sortedFeaturedTokens,\n ...nonPinnedTokensWithBalances,\n ...sortedPopularTokens,\n ...sortedOtherTokens,\n ],\n withCategories:\n !!featuredTokensFromConfig.length || !!popularTokensFromConfig.length,\n withPinnedTokens: !!sortedPinnedTokens.length,\n }\n}\n\nexport const isSearchMatch = (\n token: TokenExtended | TokenAmountExtended,\n search?: string\n): boolean => {\n if (!search) {\n return true\n }\n\n const searchLowerCase = search.toLowerCase()\n return (\n token.name?.toLowerCase().includes(searchLowerCase) ||\n token.symbol\n ?.replaceAll('₮', 'T')\n .toLowerCase()\n .includes(searchLowerCase) ||\n token.address?.toLowerCase().includes(searchLowerCase)\n )\n}\n\nexport const isSupportedToken = (token: WalletTokenExtended): boolean => {\n return Boolean(token.name && token.symbol && token.priceUSD && token.chainId)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tokenList.js","names":[],"sources":["../../../src/utils/tokenList.ts"],"sourcesContent":["import {\n formatUnits,\n type TokenExtended,\n type WalletTokenExtended,\n} from '@lifi/sdk'\nimport type { TokenAmount, TokenAmountExtended } from '../types/token.js'\nimport type { WidgetTokens } from '../types/widget.js'\n\nconst sortByBalances = (a: TokenAmount, b: TokenAmount) =>\n Number.parseFloat(formatUnits(b.amount ?? 0n, b.decimals)) *\n Number.parseFloat(b.priceUSD ?? '0') -\n Number.parseFloat(formatUnits(a.amount ?? 0n, a.decimals)) *\n Number.parseFloat(a.priceUSD ?? '0')\n\nconst sortByVolume = (a: TokenExtended, b: TokenExtended) =>\n (b.volumeUSD24H ?? 0) - (a.volumeUSD24H ?? 0)\n\nexport const processTokenBalances = (\n isBalanceLoading: boolean,\n noCategories: boolean,\n configTokens?: WidgetTokens,\n selectedChainId?: number,\n tokens?: TokenExtended[],\n tokensWithBalances?: TokenAmount[],\n isPinnedToken?: (chainId: number, tokenAddress: string) => boolean\n): {\n processedTokens: TokenAmount[]\n withCategories: boolean\n withPinnedTokens: boolean\n} => {\n if (isBalanceLoading) {\n if (noCategories) {\n const sortedTokens = [...(tokens ?? [])].sort(sortByVolume)\n // Separate pinned tokens\n if (isPinnedToken) {\n const pinned: TokenAmount[] = []\n const notPinned: TokenAmount[] = []\n for (const token of sortedTokens) {\n if (isPinnedToken(token.chainId, token.address)) {\n const pinnedToken = { ...token, pinned: true } as TokenAmount\n pinned.push(pinnedToken)\n } else {\n notPinned.push(token)\n }\n }\n return {\n processedTokens: [...pinned, ...notPinned],\n withCategories: false,\n withPinnedTokens: !!pinned.length,\n }\n }\n return {\n processedTokens: sortedTokens,\n withCategories: false,\n withPinnedTokens: false,\n }\n } else {\n return processedTypedTokens(\n tokens ?? [],\n [],\n selectedChainId,\n configTokens,\n isPinnedToken\n )\n }\n }\n\n const sortedTokensWithBalances = [...(tokensWithBalances ?? [])].sort(\n sortByBalances\n )\n\n const tokensWithBalancesSet = new Set(\n sortedTokensWithBalances.map(\n (token) => `${token.chainId}-${token.address.toLowerCase()}`\n )\n )\n const tokensWithoutBalances =\n tokens\n ?.filter((token) => {\n const tokenKey = `${token.chainId}-${token.address.toLowerCase()}`\n return !tokensWithBalancesSet.has(tokenKey)\n })\n .sort(sortByVolume) ?? []\n\n if (noCategories) {\n // Separate pinned tokens\n if (isPinnedToken) {\n const pinnedWithBalances: TokenAmount[] = []\n const notPinnedWithBalances: TokenAmount[] = []\n const pinnedWithoutBalances: TokenAmount[] = []\n const notPinnedWithoutBalances: TokenAmount[] = []\n\n for (const token of sortedTokensWithBalances) {\n if (isPinnedToken(token.chainId, token.address)) {\n const pinnedToken = { ...token, pinned: true } as TokenAmount\n pinnedWithBalances.push(pinnedToken)\n } else {\n notPinnedWithBalances.push(token)\n }\n }\n\n for (const token of tokensWithoutBalances) {\n if (isPinnedToken(token.chainId, token.address)) {\n const pinnedToken = { ...token, pinned: true } as TokenAmount\n pinnedWithoutBalances.push(pinnedToken)\n } else {\n notPinnedWithoutBalances.push(token)\n }\n }\n\n return {\n processedTokens: [\n ...pinnedWithBalances,\n ...pinnedWithoutBalances,\n ...notPinnedWithBalances,\n ...notPinnedWithoutBalances,\n ],\n withCategories: false,\n withPinnedTokens:\n !!pinnedWithBalances.length || !!pinnedWithoutBalances.length,\n }\n }\n return {\n processedTokens: [...sortedTokensWithBalances, ...tokensWithoutBalances],\n withCategories: false,\n withPinnedTokens: false,\n }\n } else {\n return processedTypedTokens(\n tokensWithoutBalances,\n sortedTokensWithBalances,\n selectedChainId,\n configTokens,\n isPinnedToken\n )\n }\n}\n\n// NB: only for non-all-networks\nconst processedTypedTokens = (\n tokens: TokenAmount[],\n tokensWithBalances: TokenAmount[],\n selectedChainId?: number,\n configTokens?: WidgetTokens,\n isPinnedToken?: (chainId: number, tokenAddress: string) => boolean\n) => {\n const filteredTokensMap = new Map(\n tokens.map((token) => [token.address, token])\n )\n\n const pinnedTokens: TokenAmount[] = []\n const featuredTokensFromConfig: TokenAmount[] = []\n const popularTokensFromConfig: TokenAmount[] = []\n\n ;(['popular', 'featured'] as const).forEach((tokenType) => {\n const typedTokens = configTokens?.[tokenType]?.filter(\n (token) => token.chainId === selectedChainId\n )\n\n typedTokens?.forEach((token) => {\n const tokenAmount = { ...token } as TokenAmount\n tokenAmount[tokenType] = true\n // Config tokens are explicitly set by integrator, mark as verified\n tokenAmount.verified = true\n\n const match = filteredTokensMap.get(token.address)\n if (match?.priceUSD) {\n tokenAmount.priceUSD = match.priceUSD\n }\n if (!token.logoURI && match?.logoURI) {\n tokenAmount.logoURI = match.logoURI\n }\n\n if (tokenType === 'popular') {\n popularTokensFromConfig.push(tokenAmount)\n } else {\n featuredTokensFromConfig.push(tokenAmount)\n }\n\n // Additionally add to pinned tokens if it is pinned\n const isPinned =\n isPinnedToken && selectedChainId\n ? isPinnedToken(selectedChainId, token.address)\n : false\n if (isPinned) {\n const pinnedToken = { ...tokenAmount, pinned: true } as TokenAmount\n pinnedTokens.push(pinnedToken)\n }\n })\n })\n\n // Filter out config-added tokens from main list\n const configTokenAddresses = new Set(\n [...popularTokensFromConfig, ...featuredTokensFromConfig].map((t) =>\n t.address.toLowerCase()\n )\n )\n\n const remainingTokens = tokens.filter(\n (token) => !configTokenAddresses.has(token.address.toLowerCase())\n )\n\n const otherTokens: TokenAmount[] = []\n\n // Separate pinned tokens and categorize remaining tokens\n for (const token of remainingTokens) {\n const isPinned =\n isPinnedToken && selectedChainId\n ? isPinnedToken(selectedChainId, token.address)\n : false\n\n if (isPinned) {\n const pinnedToken = { ...token, pinned: true } as TokenAmount\n pinnedTokens.push(pinnedToken)\n } else if (token.featured) {\n featuredTokensFromConfig.push(token)\n } else if (token.popular) {\n popularTokensFromConfig.push(token)\n } else {\n otherTokens.push(token)\n }\n }\n\n // Also check tokens with balances for pinned status\n const pinnedTokensWithBalances: TokenAmount[] = []\n const nonPinnedTokensWithBalances: TokenAmount[] = []\n\n if (isPinnedToken && selectedChainId) {\n for (const token of tokensWithBalances) {\n if (isPinnedToken(selectedChainId, token.address)) {\n const pinnedToken = { ...token, pinned: true } as TokenAmount\n pinnedTokensWithBalances.push(pinnedToken)\n } else {\n nonPinnedTokensWithBalances.push(token)\n }\n }\n } else {\n nonPinnedTokensWithBalances.push(...tokensWithBalances)\n }\n\n const sortedPinnedTokens = [\n ...pinnedTokens,\n ...pinnedTokensWithBalances,\n ].sort(sortByVolume)\n const sortedFeaturedTokens = [...featuredTokensFromConfig].sort(sortByVolume)\n const sortedPopularTokens = [...popularTokensFromConfig].sort(sortByVolume)\n const sortedOtherTokens = [...otherTokens].sort(sortByVolume)\n\n return {\n processedTokens: [\n ...sortedPinnedTokens,\n ...sortedFeaturedTokens,\n ...nonPinnedTokensWithBalances,\n ...sortedPopularTokens,\n ...sortedOtherTokens,\n ],\n withCategories:\n !!featuredTokensFromConfig.length || !!popularTokensFromConfig.length,\n withPinnedTokens: !!sortedPinnedTokens.length,\n }\n}\n\nexport const isSearchMatch = (\n token: TokenExtended | TokenAmountExtended,\n search?: string\n): boolean => {\n if (!search) {\n return true\n }\n\n const searchLowerCase = search.toLowerCase()\n return (\n token.name?.toLowerCase().includes(searchLowerCase) ||\n token.symbol\n ?.replaceAll('₮', 'T')\n .toLowerCase()\n .includes(searchLowerCase) ||\n token.address?.toLowerCase().includes(searchLowerCase)\n )\n}\n\nexport const isSupportedToken = (token: WalletTokenExtended): boolean => {\n return Boolean(token.name && token.symbol && token.priceUSD && token.chainId)\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variant.js","names":[],"sources":["../../../src/utils/variant.ts"],"sourcesContent":["import type {\n SplitSubvariant,\n SplitSubvariantOptions,\n} from '../types/widget.js'\n\nexport const getSplitSubvariant = (\n split?: SplitSubvariant | SplitSubvariantOptions\n): SplitSubvariant => {\n if (!split) {\n return 'swap'\n }\n if (typeof split === 'string') {\n return split\n }\n return split.defaultTab\n}\n"],"mappings":";AAKA,MAAa,sBACX,UACoB;
|
|
1
|
+
{"version":3,"file":"variant.js","names":[],"sources":["../../../src/utils/variant.ts"],"sourcesContent":["import type {\n SplitSubvariant,\n SplitSubvariantOptions,\n} from '../types/widget.js'\n\nexport const getSplitSubvariant = (\n split?: SplitSubvariant | SplitSubvariantOptions\n): SplitSubvariant => {\n if (!split) {\n return 'swap'\n }\n if (typeof split === 'string') {\n return split\n }\n return split.defaultTab\n}\n"],"mappings":";AAKA,MAAa,sBACX,UACoB;CACpB,IAAI,CAAC,OACH,OAAO;CAET,IAAI,OAAO,UAAU,UACnB,OAAO;CAET,OAAO,MAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widgetSize.js","names":[],"sources":["../../../src/utils/widgetSize.ts"],"sourcesContent":["import type { Theme } from '@mui/material'\nimport { defaultMaxHeight } from '../config/constants.js'\nimport type { WidgetTheme } from '../types/widget.js'\n\nexport const getWidgetMaxHeight = (\n theme: Theme | WidgetTheme | undefined\n): number | string => {\n if (theme?.container?.maxHeight) {\n return theme?.container?.maxHeight\n }\n\n if (theme?.container?.height && theme?.container?.height !== 'fit-content') {\n return theme?.container?.height\n }\n\n return defaultMaxHeight\n}\n"],"mappings":";;AAIA,MAAa,sBACX,UACoB;
|
|
1
|
+
{"version":3,"file":"widgetSize.js","names":[],"sources":["../../../src/utils/widgetSize.ts"],"sourcesContent":["import type { Theme } from '@mui/material'\nimport { defaultMaxHeight } from '../config/constants.js'\nimport type { WidgetTheme } from '../types/widget.js'\n\nexport const getWidgetMaxHeight = (\n theme: Theme | WidgetTheme | undefined\n): number | string => {\n if (theme?.container?.maxHeight) {\n return theme?.container?.maxHeight\n }\n\n if (theme?.container?.height && theme?.container?.height !== 'fit-content') {\n return theme?.container?.height\n }\n\n return defaultMaxHeight\n}\n"],"mappings":";;AAIA,MAAa,sBACX,UACoB;CACpB,IAAI,OAAO,WAAW,WACpB,OAAO,OAAO,WAAW;CAG3B,IAAI,OAAO,WAAW,UAAU,OAAO,WAAW,WAAW,eAC3D,OAAO,OAAO,WAAW;CAG3B,OAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lifi/widget",
|
|
3
|
-
"version": "4.0.0-beta.
|
|
3
|
+
"version": "4.0.0-beta.20",
|
|
4
4
|
"description": "LI.FI Widget for cross-chain bridging and swapping. It will drive your multi-chain strategy and attract new users from everywhere.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/esm/index.js",
|
|
@@ -34,21 +34,21 @@
|
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"@emotion/react": "^11.14.0",
|
|
36
36
|
"@emotion/styled": "^11.14.1",
|
|
37
|
-
"@lifi/sdk": "^4.0.0-beta.
|
|
38
|
-
"@mui/icons-material": "^9.0.
|
|
39
|
-
"@mui/material": "^9.0.
|
|
40
|
-
"@mui/system": "^9.0.
|
|
41
|
-
"@tanstack/react-router": "^1.
|
|
37
|
+
"@lifi/sdk": "^4.0.0-beta.11",
|
|
38
|
+
"@mui/icons-material": "^9.0.1",
|
|
39
|
+
"@mui/material": "^9.0.1",
|
|
40
|
+
"@mui/system": "^9.0.1",
|
|
41
|
+
"@tanstack/react-router": "^1.169.2",
|
|
42
42
|
"@tanstack/react-virtual": "^3.13.24",
|
|
43
|
-
"i18next": "^26.0
|
|
43
|
+
"i18next": "^26.1.0",
|
|
44
44
|
"microdiff": "^1.5.0",
|
|
45
45
|
"mitt": "^3.0.1",
|
|
46
|
-
"react-i18next": "^17.0.
|
|
46
|
+
"react-i18next": "^17.0.7",
|
|
47
47
|
"react-intersection-observer": "^10.0.3",
|
|
48
48
|
"react-transition-group": "^4.4.5",
|
|
49
|
-
"zustand": "^5.0.
|
|
50
|
-
"@lifi/wallet-management": "4.0.0-beta.
|
|
51
|
-
"@lifi/widget-provider": "4.0.0-beta.
|
|
49
|
+
"zustand": "^5.0.13",
|
|
50
|
+
"@lifi/wallet-management": "4.0.0-beta.20",
|
|
51
|
+
"@lifi/widget-provider": "4.0.0-beta.20"
|
|
52
52
|
},
|
|
53
53
|
"peerDependencies": {
|
|
54
54
|
"@tanstack/react-query": ">=5.90.0",
|
|
@@ -54,6 +54,11 @@ export const getMatchingLabels = (
|
|
|
54
54
|
conditions.push(rule.toChainId.includes(route.toChainId))
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
+
// Evaluate custom match function if specified
|
|
58
|
+
if (rule.match) {
|
|
59
|
+
conditions.push(rule.match(route))
|
|
60
|
+
}
|
|
61
|
+
|
|
57
62
|
// Must have at least one condition and all conditions must be true
|
|
58
63
|
return conditions.length && conditions.every(Boolean)
|
|
59
64
|
})
|
package/src/config/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export const name = '@lifi/widget'
|
|
2
|
-
export const version = '4.0.0-beta.
|
|
2
|
+
export const version = '4.0.0-beta.20'
|
package/src/types/widget.ts
CHANGED
|
@@ -5,6 +5,7 @@ import type {
|
|
|
5
5
|
ExecutionOptions,
|
|
6
6
|
ExtendedChain,
|
|
7
7
|
Order,
|
|
8
|
+
Route,
|
|
8
9
|
RouteExtended,
|
|
9
10
|
RouteOptions,
|
|
10
11
|
SDKConfig,
|
|
@@ -286,6 +287,14 @@ export interface RouteLabelRule {
|
|
|
286
287
|
toChainId?: number[]
|
|
287
288
|
fromTokenAddress?: string[]
|
|
288
289
|
toTokenAddress?: string[]
|
|
290
|
+
/**
|
|
291
|
+
* Custom match function evaluated against the route. When provided, its
|
|
292
|
+
* result is AND'd with the other matching criteria — all specified
|
|
293
|
+
* conditions must pass for the label to apply. Use this for matching logic
|
|
294
|
+
* that the built-in fields cannot express (gas costs, step count, route
|
|
295
|
+
* tags, etc.).
|
|
296
|
+
*/
|
|
297
|
+
match?: (route: Route) => boolean
|
|
289
298
|
}
|
|
290
299
|
|
|
291
300
|
export type ExplorerUrl =
|