@lifi/widget 4.0.0 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/App.d.ts +4 -2
- package/dist/esm/App.d.ts.map +1 -1
- package/dist/esm/App.js +4 -4
- package/dist/esm/App.js.map +1 -1
- package/dist/esm/AppDrawer.d.ts +1 -1
- package/dist/esm/AppDrawer.d.ts.map +1 -1
- package/dist/esm/AppDrawer.js +5 -6
- package/dist/esm/AppDrawer.js.map +1 -1
- package/dist/esm/AppDrawerContext.js +2 -2
- package/dist/esm/AppDrawerContext.js.map +1 -1
- package/dist/esm/components/ActionRow/ActionRow.style.js.map +1 -1
- package/dist/esm/components/AmountInput/AmountInput.js.map +1 -1
- package/dist/esm/components/AmountInput/AmountInput.style.js.map +1 -1
- package/dist/esm/components/AmountInput/AmountInputEndAdornment.style.js.map +1 -1
- package/dist/esm/components/AmountInput/PriceFormHelperText.style.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.style.js.map +1 -1
- package/dist/esm/components/Avatar/SmallAvatar.js.map +1 -1
- package/dist/esm/components/BaseTransactionButton/BaseTransactionButton.js +1 -0
- package/dist/esm/components/BaseTransactionButton/BaseTransactionButton.js.map +1 -1
- package/dist/esm/components/BottomSheet/BottomSheet.js +3 -3
- package/dist/esm/components/BottomSheet/BottomSheet.js.map +1 -1
- package/dist/esm/components/ButtonTertiary.js.map +1 -1
- package/dist/esm/components/Card/Card.js.map +1 -1
- package/dist/esm/components/Card/CardButton.style.js.map +1 -1
- package/dist/esm/components/Card/CardHeader.js.map +1 -1
- package/dist/esm/components/Card/CardIconButton.js.map +1 -1
- package/dist/esm/components/Card/CardLabel.js.map +1 -1
- package/dist/esm/components/Card/CardTitle.js.map +1 -1
- package/dist/esm/components/Card/InputCard.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/ChainsExpanded.style.js.map +1 -1
- package/dist/esm/components/Chains/VirtualizedChainList.js.map +1 -1
- package/dist/esm/components/ContextMenu.style.js.map +1 -1
- package/dist/esm/components/ContractComponent/NFT/NFT.style.js.map +1 -1
- package/dist/esm/components/Dialog/Dialog.style.js.map +1 -1
- package/dist/esm/components/EmptyListIndicator/EmptyListIndicator.style.js.map +1 -1
- package/dist/esm/components/ExecutionStatusCard/StatusIcon.js.map +1 -1
- package/dist/esm/components/ExecutionStatusCard/StatusIcon.style.js.map +1 -1
- package/dist/esm/components/ExecutionStatusCard/iconKey.js.map +1 -1
- package/dist/esm/components/Expansion/Expansion.style.js.map +1 -1
- package/dist/esm/components/Header/ActivitiesButton.style.js.map +1 -1
- package/dist/esm/components/Header/CloseDrawerButton.js +1 -0
- package/dist/esm/components/Header/CloseDrawerButton.js.map +1 -1
- package/dist/esm/components/Header/Header.js +7 -10
- 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/HeaderNavigationTabs.js +26 -0
- package/dist/esm/components/Header/HeaderNavigationTabs.js.map +1 -0
- package/dist/esm/components/Header/HeaderTabs.js +33 -0
- package/dist/esm/components/Header/HeaderTabs.js.map +1 -0
- package/dist/esm/components/Header/NavigationHeader.js +7 -5
- package/dist/esm/components/Header/NavigationHeader.js.map +1 -1
- package/dist/esm/components/Header/SettingsButton.style.js.map +1 -1
- package/dist/esm/components/Header/WalletMenu.style.js.map +1 -1
- package/dist/esm/components/IconCircle/IconCircle.style.js.map +1 -1
- package/dist/esm/components/IconTypography.js.map +1 -1
- package/dist/esm/components/Input.js.map +1 -1
- package/dist/esm/components/ListItem/ListItem.js.map +1 -1
- package/dist/esm/components/ListItem/ListItemButton.js.map +1 -1
- package/dist/esm/components/ListItemButton.js.map +1 -1
- package/dist/esm/components/ListItemText.js.map +1 -1
- package/dist/esm/components/Menu.js.map +1 -1
- package/dist/esm/components/Messages/AlertMessage.style.js.map +1 -1
- package/dist/esm/components/Messages/GasRefuelMessage.style.js.map +1 -1
- package/dist/esm/components/Messages/WarningMessages.js.map +1 -1
- package/dist/esm/components/PageContainer.js.map +1 -1
- package/dist/esm/components/PoweredBy/PoweredBy.js.map +1 -1
- package/dist/esm/components/PoweredBy/PoweredBy.style.js.map +1 -1
- package/dist/esm/components/ReverseTokensButton/ReverseTokensButton.js +1 -0
- 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/RouteDetails.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteDetails.style.js +2 -2
- package/dist/esm/components/RouteCard/RouteDetails.style.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteToken.style.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteTokens.js.map +1 -1
- package/dist/esm/components/RouteCard/getMatchingLabels.js.map +1 -1
- package/dist/esm/components/Routes/RoutesContent.js.map +1 -1
- package/dist/esm/components/Routes/RoutesExpanded.style.js.map +1 -1
- package/dist/esm/components/Search/SearchInput.style.js.map +1 -1
- package/dist/esm/components/Search/SearchNotFound.style.js.map +1 -1
- package/dist/esm/components/SelectTokenButton/SelectTokenButton.style.js.map +1 -1
- package/dist/esm/components/SendToWallet/SendToWalletButton.style.js.map +1 -1
- package/dist/esm/components/SettingsListItemButton.js.map +1 -1
- package/dist/esm/components/Skeleton/WidgetSkeleton.js +50 -47
- 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/StepActions.js.map +1 -1
- package/dist/esm/components/Step/StepActions.style.js.map +1 -1
- package/dist/esm/components/StepActions/SentToWalletRow.style.js.map +1 -1
- package/dist/esm/components/StepActions/StepActionRow.style.js.map +1 -1
- package/dist/esm/components/Switch.js.map +1 -1
- package/dist/esm/components/Tabs/NavigationTabs.js +3 -0
- package/dist/esm/components/Tabs/NavigationTabs.js.map +1 -1
- package/dist/esm/components/Tabs/Tabs.style.js.map +1 -1
- package/dist/esm/components/Timer/StepStatusTimer.style.js.map +1 -1
- package/dist/esm/components/Token/Token.style.js.map +1 -1
- package/dist/esm/components/TokenList/PinTokenButton.js.map +1 -1
- package/dist/esm/components/TokenList/TokenDetailsSheet.js +4 -4
- package/dist/esm/components/TokenList/TokenDetailsSheet.js.map +1 -1
- package/dist/esm/components/TokenList/TokenDetailsSheetContent.js +4 -4
- package/dist/esm/components/TokenList/TokenDetailsSheetContent.js.map +1 -1
- package/dist/esm/components/TokenList/TokenDetailsSheetContent.style.js.map +1 -1
- package/dist/esm/components/TokenList/TokenList.style.js.map +1 -1
- package/dist/esm/components/TokenList/TokenListItem.js +2 -2
- package/dist/esm/components/TokenList/TokenListItem.js.map +1 -1
- package/dist/esm/components/TokenList/VirtualizedTokenList.js.map +1 -1
- package/dist/esm/components/TokenList/useTokenSelect.js +3 -3
- package/dist/esm/components/TokenList/useTokenSelect.js.map +1 -1
- package/dist/esm/components/TokenRate/TokenRate.style.js.map +1 -1
- package/dist/esm/components/TransactionCard/ActiveTransactionCard.js.map +1 -1
- package/dist/esm/components/TransactionCard/ActiveTransactionCard.style.js.map +1 -1
- package/dist/esm/components/TransactionCard/TransactionCard.style.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/validate.js.map +1 -1
- package/dist/esm/hooks/useAccountsBalancesData.js.map +1 -1
- package/dist/esm/hooks/useAvailableChains.js +1 -1
- package/dist/esm/hooks/useChainSearch.js.map +1 -1
- package/dist/esm/hooks/useChains.js +1 -1
- package/dist/esm/hooks/useExplorer.js.map +1 -1
- package/dist/esm/hooks/useFilteredByTokenBalances.js +1 -1
- package/dist/esm/hooks/useFilteredByTokenBalances.js.map +1 -1
- package/dist/esm/hooks/useFromTokenSufficiency.js.map +1 -1
- package/dist/esm/hooks/useGasSufficiency.js.map +1 -1
- package/dist/esm/hooks/useLanguages.js +2 -2
- package/dist/esm/hooks/useLanguages.js.map +1 -1
- package/dist/esm/hooks/useRouteExecution.js.map +1 -1
- package/dist/esm/hooks/useRouteExecutionMessage.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/useSwapOnly.js +2 -4
- package/dist/esm/hooks/useSwapOnly.js.map +1 -1
- package/dist/esm/hooks/useToAddressRequirements.js +2 -2
- package/dist/esm/hooks/useToAddressRequirements.js.map +1 -1
- package/dist/esm/hooks/useToken.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/useTokenSearch.js +1 -1
- package/dist/esm/hooks/useTokenSearch.js.map +1 -1
- package/dist/esm/hooks/useTokens.js +1 -1
- package/dist/esm/hooks/useTokens.js.map +1 -1
- package/dist/esm/hooks/useTools.js +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/i18n/en.json +3 -0
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/pages/ActivitiesPage/ActivitiesPage.js.map +1 -1
- package/dist/esm/pages/MainPage/ReviewButton.js +2 -2
- package/dist/esm/pages/MainPage/ReviewButton.js.map +1 -1
- package/dist/esm/pages/RoutesPage/RoutesPage.js.map +1 -1
- package/dist/esm/pages/RoutesPage/RoutesPage.style.js.map +1 -1
- package/dist/esm/pages/SelectEnabledToolsPage.js.map +1 -1
- package/dist/esm/pages/SendToWallet/BookmarkAddressSheet.js +3 -3
- package/dist/esm/pages/SendToWallet/BookmarkAddressSheet.js.map +1 -1
- package/dist/esm/pages/SendToWallet/ConfirmAddressSheet.js +3 -3
- package/dist/esm/pages/SendToWallet/ConfirmAddressSheet.js.map +1 -1
- package/dist/esm/pages/SendToWallet/SendToWalletPage.js.map +1 -1
- package/dist/esm/pages/SendToWallet/SendToWalletPage.style.js.map +1 -1
- package/dist/esm/pages/SettingsPage/BridgeAndExchangeSettings.js.map +1 -1
- package/dist/esm/pages/SettingsPage/GasPriceSettings.js +1 -1
- package/dist/esm/pages/SettingsPage/ResetSettingsButton.style.js.map +1 -1
- package/dist/esm/pages/SettingsPage/RoutePrioritySettings.js +1 -1
- package/dist/esm/pages/SettingsPage/SettingsCard/SettingCard.style.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SettingsCard/SettingCardExpandable.js +3 -3
- package/dist/esm/pages/SettingsPage/SettingsCard/SettingCardExpandable.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SettingsCard/SettingsAccordian.js +3 -3
- package/dist/esm/pages/SettingsPage/SettingsCard/SettingsAccordian.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.style.js.map +1 -1
- package/dist/esm/pages/SettingsPage/ThemeSettings.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/ContactSupportButton.style.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/TransactionPage/ConfirmToAddressSheet.js +3 -3
- package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.js.map +1 -1
- package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.js +16 -15
- package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.js.map +1 -1
- package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.style.js.map +1 -1
- package/dist/esm/pages/TransactionPage/RouteTracker.js.map +1 -1
- package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.js +3 -3
- package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.js.map +1 -1
- package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.style.js.map +1 -1
- package/dist/esm/pages/TransactionPage/TransactionExecutionContent.js +27 -31
- package/dist/esm/pages/TransactionPage/TransactionExecutionContent.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 +2 -2
- package/dist/esm/providers/QueryClientProvider.js.map +1 -1
- package/dist/esm/providers/SDKClientProvider.js +26 -27
- package/dist/esm/providers/SDKClientProvider.js.map +1 -1
- package/dist/esm/providers/WidgetProvider/WidgetProvider.js +25 -27
- package/dist/esm/providers/WidgetProvider/WidgetProvider.js.map +1 -1
- package/dist/esm/stores/StoreProvider.js +3 -4
- package/dist/esm/stores/StoreProvider.js.map +1 -1
- package/dist/esm/stores/bookmarks/BookmarkStore.js +3 -3
- package/dist/esm/stores/bookmarks/BookmarkStore.js.map +1 -1
- package/dist/esm/stores/bookmarks/createBookmarkStore.js.map +1 -1
- package/dist/esm/stores/chains/ChainOrderStore.js +4 -4
- package/dist/esm/stores/chains/ChainOrderStore.js.map +1 -1
- package/dist/esm/stores/chains/createChainOrderStore.js.map +1 -1
- package/dist/esm/stores/form/FormStore.js +1 -1
- package/dist/esm/stores/form/FormStore.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 +2 -2
- package/dist/esm/stores/form/useFormStore.js.map +1 -1
- package/dist/esm/stores/header/useHeaderStore.js +3 -3
- package/dist/esm/stores/header/useHeaderStore.js.map +1 -1
- package/dist/esm/stores/inputMode/useInputModeStore.js.map +1 -1
- package/dist/esm/stores/navigationTabs/useNavigationTabLabel.js +22 -0
- package/dist/esm/stores/navigationTabs/useNavigationTabLabel.js.map +1 -0
- package/dist/esm/stores/navigationTabs/useNavigationTabsStore.js +62 -0
- package/dist/esm/stores/navigationTabs/useNavigationTabsStore.js.map +1 -0
- package/dist/esm/stores/navigationTabs/utils.js +92 -0
- package/dist/esm/stores/navigationTabs/utils.js.map +1 -0
- package/dist/esm/stores/pinnedTokens/PinnedTokensStore.js +3 -3
- 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 +3 -3
- 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/utils.js.map +1 -1
- package/dist/esm/stores/settings/SettingsStore.js +3 -3
- package/dist/esm/stores/settings/SettingsStore.js.map +1 -1
- package/dist/esm/stores/settings/createSettingsStore.js +122 -96
- package/dist/esm/stores/settings/createSettingsStore.js.map +1 -1
- package/dist/esm/stores/settings/types.d.ts +0 -2
- package/dist/esm/stores/settings/types.d.ts.map +1 -1
- package/dist/esm/stores/settings/types.js.map +1 -1
- package/dist/esm/stores/settings/useSettingsActions.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/widget.d.ts +19 -2
- 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/deepEqual.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/item.js.map +1 -1
- package/dist/esm/utils/{variant.js → mode.js} +2 -2
- package/dist/esm/utils/mode.js.map +1 -0
- package/dist/esm/utils/prepareActions.js +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 +1 -1
- package/dist/esm/utils/token.js.map +1 -1
- package/dist/esm/utils/tokenList.js.map +1 -1
- package/package.json +11 -11
- package/src/App.tsx +7 -7
- package/src/AppDrawer.tsx +77 -78
- package/src/AppDrawerContext.ts +2 -2
- package/src/components/BaseTransactionButton/BaseTransactionButton.tsx +1 -0
- package/src/components/BottomSheet/BottomSheet.tsx +56 -52
- package/src/components/Header/CloseDrawerButton.tsx +5 -1
- package/src/components/Header/Header.tsx +20 -18
- package/src/components/Header/HeaderNavigationTabs.tsx +25 -0
- package/src/components/Header/HeaderTabs.tsx +48 -0
- package/src/components/Header/NavigationHeader.tsx +11 -8
- package/src/components/ReverseTokensButton/ReverseTokensButton.tsx +4 -1
- package/src/components/Skeleton/WidgetSkeleton.tsx +1 -1
- package/src/components/Tabs/NavigationTabs.tsx +3 -0
- package/src/components/TokenList/TokenDetailsSheet.tsx +9 -7
- package/src/components/TokenList/TokenDetailsSheetContent.tsx +176 -177
- package/src/components/TokenList/useTokenSelect.ts +2 -2
- package/src/config/version.ts +1 -1
- package/src/hooks/useSwapOnly.ts +2 -5
- package/src/hooks/useToAddressRequirements.ts +2 -2
- package/src/pages/MainPage/ReviewButton.tsx +2 -2
- package/src/pages/SendToWallet/BookmarkAddressSheet.tsx +176 -185
- package/src/pages/SendToWallet/ConfirmAddressSheet.tsx +9 -6
- package/src/pages/SettingsPage/SettingsCard/SettingCardExpandable.tsx +58 -65
- package/src/pages/SettingsPage/SettingsCard/SettingsAccordian.tsx +4 -4
- package/src/pages/TransactionPage/ConfirmToAddressSheet.tsx +9 -6
- package/src/pages/TransactionPage/ExchangeRateBottomSheet.tsx +53 -58
- package/src/pages/TransactionPage/TokenValueBottomSheet.tsx +24 -21
- package/src/pages/TransactionPage/TransactionExecutionContent.tsx +8 -6
- package/src/providers/QueryClientProvider.tsx +2 -2
- package/src/providers/SDKClientProvider.tsx +3 -7
- package/src/providers/WidgetProvider/WidgetProvider.tsx +6 -7
- package/src/stores/StoreProvider.tsx +3 -10
- package/src/stores/bookmarks/BookmarkStore.tsx +4 -4
- package/src/stores/chains/ChainOrderStore.tsx +4 -4
- package/src/stores/form/FormStore.tsx +2 -2
- package/src/stores/form/useFormStore.ts +2 -2
- package/src/stores/header/useHeaderStore.tsx +3 -5
- package/src/stores/navigationTabs/types.ts +27 -0
- package/src/stores/navigationTabs/useNavigationTabLabel.ts +28 -0
- package/src/stores/navigationTabs/useNavigationTabsStore.tsx +108 -0
- package/src/stores/navigationTabs/utils.ts +134 -0
- package/src/stores/pinnedTokens/PinnedTokensStore.tsx +4 -4
- package/src/stores/routes/RouteExecutionStore.tsx +4 -4
- package/src/stores/settings/SettingsStore.tsx +4 -4
- package/src/stores/settings/createSettingsStore.ts +48 -12
- package/src/stores/settings/types.ts +1 -16
- package/src/types/widget.ts +31 -1
- package/dist/esm/components/Header/SplitNavigationTabs.js +0 -33
- package/dist/esm/components/Header/SplitNavigationTabs.js.map +0 -1
- package/dist/esm/stores/settings/useSplitModeStore.js +0 -36
- package/dist/esm/stores/settings/useSplitModeStore.js.map +0 -1
- package/dist/esm/utils/variant.js.map +0 -1
- package/src/components/Header/SplitNavigationTabs.tsx +0 -32
- package/src/stores/settings/useSplitModeStore.tsx +0 -58
- /package/src/utils/{variant.ts → mode.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compactNumberFormatter.js","names":[],"sources":["../../../src/utils/compactNumberFormatter.ts"],"sourcesContent":["/**\n * Converts a non-negative integer to its subscript representation using Unicode subscript characters.\n * @param n - The number to convert to subscript\n * @returns A string where each digit is converted to its subscript equivalent\n * @example\n * toSubscript(5) => '₅'\n * toSubscript(10) => '₁₀'\n */\nfunction toSubscript(n: number): string {\n return n\n .toString()\n .split('')\n .map((digit) => String.fromCharCode(8320 + Number(digit)))\n .join('')\n}\n\n/**\n * Formats numbers with special handling for small decimal values, converting runs of leading zeros\n * into a more compact subscript notation.\n *\n * @param value - The numeric value to format (expected to be a string representing a BigInt)\n * @param lng - The locale string for number formatting\n * @param options - Formatting options including decimals and Intl.NumberFormat options\n * @returns A formatted string with subscript notation for leading zeros\n */\nexport const compactNumberFormatter = (\n lng: string | undefined,\n options: any\n): ((value: any) => string) => {\n const formatter = new Intl.NumberFormat(lng, {\n notation: 'standard',\n roundingPriority: 'morePrecision',\n maximumSignificantDigits: 20,\n maximumFractionDigits: 20,\n ...options,\n })\n return (value: any) => {\n if (!Number.parseFloat(value) || Number.isNaN(Number(value))) {\n return '0'\n }\n\n const parts = formatter.formatToParts(value as Intl.StringNumericLiteral)\n let integerPart = ''\n let fractionPart = ''\n let decimalSeparator = ''\n let minusSign = ''\n\n for (const p of parts) {\n switch (p.type) {\n case 'integer':\n case 'group':\n integerPart += p.value\n break\n case 'fraction':\n fractionPart += p.value\n break\n case 'decimal':\n decimalSeparator = p.value\n break\n case 'minusSign':\n minusSign = p.value\n break\n }\n }\n\n // For numbers with no decimal part, return early\n if (!fractionPart) {\n return `${minusSign}${integerPart}`\n }\n\n // Count consecutive leading zeros in the fraction part\n const match = fractionPart.match(/^0+/)\n const leadingZerosCount = match ? match[0].length : 0\n\n // For numbers with few leading zeros (≤ 3), format normally\n // but limit the total length and trim trailing zeros\n if (leadingZerosCount <= 3) {\n fractionPart = fractionPart.slice(0, 6).replace(/0+$/, '')\n return `${minusSign}${integerPart}${decimalSeparator}${fractionPart}`\n }\n\n // For numbers with many leading zeros (> 3), use subscript notation\n // Format: \"0.0₍number_of_zeros₎significant_digits\"\n const zerosSubscript = toSubscript(leadingZerosCount)\n const remainder = fractionPart\n .slice(leadingZerosCount, leadingZerosCount + 4)\n .replace(/0+$/, '')\n\n return `${minusSign}${integerPart}${decimalSeparator}0${zerosSubscript}${remainder}`\n }\n}\n"],"mappings":";;;;;;;;;AAQA,SAAS,YAAY,GAAmB;CACtC,OAAO,EACJ,SAAS,
|
|
1
|
+
{"version":3,"file":"compactNumberFormatter.js","names":[],"sources":["../../../src/utils/compactNumberFormatter.ts"],"sourcesContent":["/**\n * Converts a non-negative integer to its subscript representation using Unicode subscript characters.\n * @param n - The number to convert to subscript\n * @returns A string where each digit is converted to its subscript equivalent\n * @example\n * toSubscript(5) => '₅'\n * toSubscript(10) => '₁₀'\n */\nfunction toSubscript(n: number): string {\n return n\n .toString()\n .split('')\n .map((digit) => String.fromCharCode(8320 + Number(digit)))\n .join('')\n}\n\n/**\n * Formats numbers with special handling for small decimal values, converting runs of leading zeros\n * into a more compact subscript notation.\n *\n * @param value - The numeric value to format (expected to be a string representing a BigInt)\n * @param lng - The locale string for number formatting\n * @param options - Formatting options including decimals and Intl.NumberFormat options\n * @returns A formatted string with subscript notation for leading zeros\n */\nexport const compactNumberFormatter = (\n lng: string | undefined,\n options: any\n): ((value: any) => string) => {\n const formatter = new Intl.NumberFormat(lng, {\n notation: 'standard',\n roundingPriority: 'morePrecision',\n maximumSignificantDigits: 20,\n maximumFractionDigits: 20,\n ...options,\n })\n return (value: any) => {\n if (!Number.parseFloat(value) || Number.isNaN(Number(value))) {\n return '0'\n }\n\n const parts = formatter.formatToParts(value as Intl.StringNumericLiteral)\n let integerPart = ''\n let fractionPart = ''\n let decimalSeparator = ''\n let minusSign = ''\n\n for (const p of parts) {\n switch (p.type) {\n case 'integer':\n case 'group':\n integerPart += p.value\n break\n case 'fraction':\n fractionPart += p.value\n break\n case 'decimal':\n decimalSeparator = p.value\n break\n case 'minusSign':\n minusSign = p.value\n break\n }\n }\n\n // For numbers with no decimal part, return early\n if (!fractionPart) {\n return `${minusSign}${integerPart}`\n }\n\n // Count consecutive leading zeros in the fraction part\n const match = fractionPart.match(/^0+/)\n const leadingZerosCount = match ? match[0].length : 0\n\n // For numbers with few leading zeros (≤ 3), format normally\n // but limit the total length and trim trailing zeros\n if (leadingZerosCount <= 3) {\n fractionPart = fractionPart.slice(0, 6).replace(/0+$/, '')\n return `${minusSign}${integerPart}${decimalSeparator}${fractionPart}`\n }\n\n // For numbers with many leading zeros (> 3), use subscript notation\n // Format: \"0.0₍number_of_zeros₎significant_digits\"\n const zerosSubscript = toSubscript(leadingZerosCount)\n const remainder = fractionPart\n .slice(leadingZerosCount, leadingZerosCount + 4)\n .replace(/0+$/, '')\n\n return `${minusSign}${integerPart}${decimalSeparator}0${zerosSubscript}${remainder}`\n }\n}\n"],"mappings":";;;;;;;;;AAQA,SAAS,YAAY,GAAmB;CACtC,OAAO,EACJ,SAAS,CAAC,CACV,MAAM,EAAE,CAAC,CACT,KAAK,UAAU,OAAO,aAAa,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,CACzD,KAAK,EAAE;AACZ;;;;;;;;;;AAWA,MAAa,0BACX,KACA,YAC6B;CAC7B,MAAM,YAAY,IAAI,KAAK,aAAa,KAAK;EAC3C,UAAU;EACV,kBAAkB;EAClB,0BAA0B;EAC1B,uBAAuB;EACvB,GAAG;CACL,CAAC;CACD,QAAQ,UAAe;EACrB,IAAI,CAAC,OAAO,WAAW,KAAK,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC,GACzD,OAAO;EAGT,MAAM,QAAQ,UAAU,cAAc,KAAkC;EACxE,IAAI,cAAc;EAClB,IAAI,eAAe;EACnB,IAAI,mBAAmB;EACvB,IAAI,YAAY;EAEhB,KAAK,MAAM,KAAK,OACd,QAAQ,EAAE,MAAV;GACE,KAAK;GACL,KAAK;IACH,eAAe,EAAE;IACjB;GACF,KAAK;IACH,gBAAgB,EAAE;IAClB;GACF,KAAK;IACH,mBAAmB,EAAE;IACrB;GACF,KAAK;IACH,YAAY,EAAE;IACd;EACJ;EAIF,IAAI,CAAC,cACH,OAAO,GAAG,YAAY;EAIxB,MAAM,QAAQ,aAAa,MAAM,KAAK;EACtC,MAAM,oBAAoB,QAAQ,MAAM,EAAE,CAAC,SAAS;EAIpD,IAAI,qBAAqB,GAAG;GAC1B,eAAe,aAAa,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,OAAO,EAAE;GACzD,OAAO,GAAG,YAAY,cAAc,mBAAmB;EACzD;EAIA,MAAM,iBAAiB,YAAY,iBAAiB;EACpD,MAAM,YAAY,aACf,MAAM,mBAAmB,oBAAoB,CAAC,CAAC,CAC/C,QAAQ,OAAO,EAAE;EAEpB,OAAO,GAAG,YAAY,cAAc,iBAAiB,GAAG,iBAAiB;CAC3E;AACF"}
|
|
@@ -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":"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,CAAC,KAAK,MAAM,QAAQ,CAAC,GAAG;GACxC,SAAS,EAAE;GACX,IAAI,WAAW,EAAE,QACf,OAAO;GAET,KAAK,IAAI,QAAQ,QAAQ,IACvB,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,GACvB,OAAO;GAGX,OAAO;EACT;EAEA,IAAI,EAAE,YAAY,OAAO,UAAU,SACjC,OAAO,EAAE,QAAQ,MAAM,EAAE,QAAQ;EAEnC,IAAI,EAAE,aAAa,OAAO,UAAU,UAClC,OAAO,EAAE,SAAS,MAAM,EAAE,SAAS;EAGrC,MAAM,OAAO,OAAO,KAAK,CAAC;EAC1B,SAAS,KAAK;EACd,IAAI,WAAW,OAAO,KAAK,CAAC,
|
|
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,CAAC,KAAK,MAAM,QAAQ,CAAC,GAAG;GACxC,SAAS,EAAE;GACX,IAAI,WAAW,EAAE,QACf,OAAO;GAET,KAAK,IAAI,QAAQ,QAAQ,IACvB,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,GACvB,OAAO;GAGX,OAAO;EACT;EAEA,IAAI,EAAE,YAAY,OAAO,UAAU,SACjC,OAAO,EAAE,QAAQ,MAAM,EAAE,QAAQ;EAEnC,IAAI,EAAE,aAAa,OAAO,UAAU,UAClC,OAAO,EAAE,SAAS,MAAM,EAAE,SAAS;EAGrC,MAAM,OAAO,OAAO,KAAK,CAAC;EAC1B,SAAS,KAAK;EACd,IAAI,WAAW,OAAO,KAAK,CAAC,CAAC,CAAC,QAC5B,OAAO;EAGT,KAAK,IAAI,QAAQ,QAAQ,IACvB,IAAI,CAAC,OAAO,OAAO,GAAG,KAAK,EAAG,GAC5B,OAAO;EAIX,KAAK,IAAI,QAAQ,QAAQ,IAAK;GAC5B,MAAM,MAAM,KAAK;GAEjB,IAAI,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,GAClC,OAAO;EAEX;EAEA,OAAO;CACT;CAIA,OAAO,MAAM,KAAK,MAAM;AAC1B"}
|
|
@@ -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,KAAK;CAC3C,MAAM,WAAW,qBAAqB,OAAO,QAAQ;CACrD,MAAM,aAAa,SAAS,QACzB,KAAK,YAAY,MAAM,QAAQ,WAChC,CACF;CACA,MAAM,aAAa,SAAS,QACzB,KAAK,YAAY,MAAM,QAAQ,WAChC,CACF;CAEA,OAAO;EACL;EACA;EACA;EACA;EACA,iBANsB,aAAa;CAOrC;AACF;AAEA,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,QAAQ;GACrC,MAAM,iBAAiB,gBAAgB,IAAI,MAAM,OAAO;GACxD,MAAM,SAAS,iBACX,eAAe,SAAS,gBACxB;GACJ,MAAM,YAAY,iBACd,eAAe,YAAY,mBAC3B;GACJ,gBAAgB,IAAI,MAAM,SAAS;IACjC;IACA;IACA;GACF,CAAC;GACD,OAAO;EACT;EACA,OAAO;CACT,mBAAG,IAAI,IAA2B,CAAC,
|
|
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,KAAK;CAC3C,MAAM,WAAW,qBAAqB,OAAO,QAAQ;CACrD,MAAM,aAAa,SAAS,QACzB,KAAK,YAAY,MAAM,QAAQ,WAChC,CACF;CACA,MAAM,aAAa,SAAS,QACzB,KAAK,YAAY,MAAM,QAAQ,WAChC,CACF;CAEA,OAAO;EACL;EACA;EACA;EACA;EACA,iBANsB,aAAa;CAOrC;AACF;AAEA,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,QAAQ;GACrC,MAAM,iBAAiB,gBAAgB,IAAI,MAAM,OAAO;GACxD,MAAM,SAAS,iBACX,eAAe,SAAS,gBACxB;GACJ,MAAM,YAAY,iBACd,eAAe,YAAY,mBAC3B;GACJ,gBAAgB,IAAI,MAAM,SAAS;IACjC;IACA;IACA;GACF,CAAC;GACD,OAAO;EACT;EACA,OAAO;CACT,mBAAG,IAAI,IAA2B,CAAC,CAAC,CACnC,OAAO,CACZ;AACF;AAEA,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,QACpC;EAEF,IAAI,UAAU,QAAQ;GACpB,MAAM,EACJ,OACA,QAAQ,eACR,WAAW,qBACT,yBAAyB,QAAQ;GACrC,MAAM,iBAAiB,gBAAgB,IAAI,MAAM,OAAO;GACxD,MAAM,SAAS,iBACX,eAAe,SAAS,gBACxB;GACJ,MAAM,YAAY,iBACd,eAAe,YAAY,mBAC3B;GACJ,gBAAgB,IAAI,MAAM,SAAS;IACjC;IACA;IACA;GACF,CAAC;GACD,OAAO;EACT;EACA,OAAO;CACT,mBAAG,IAAI,IAA2B,CAAC,CAAC,CACnC,OAAO,CACZ;AACF;AAEA,MAAM,4BACJ,aACkB;CAClB,MAAM,EAAE,UAAU,SAAS;CAE3B,MAAM,EAAE,QAAQ,cAAc,SAAS,QACpC,KAAK,YAAY;EAChB,MAAM,YAAY,OAAO,OAAO,QAAQ,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;EAC/D,MAAM,YAAY,iBAChB,WACA,QAAQ,MAAM,UACd,QAAQ,MAAM,QAChB;EAEA,IAAI,UAAU;EACd,IAAI,aAAa;EACjB,OAAO;CACT,GACA;EAAE,QAAQ;EAAI,WAAW;CAAE,CAC7B;CAEA,OAAO;EACL;EACA;EACA;CACF;AACF"}
|
|
@@ -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,QAAQ,IAAI;CAEjE,IAAI,CADiB,OAAO,WAAW,eACvB,KAAK,OAAO,MAAM,OAAO,eAAe,CAAC,GACvD,OAAO;CAGT,OAAO;AACT;AAEA,SAAgB,eACd,WAAW,IACX,eAAe,IACf,gBAAgB,OACR;CACR,IAAI,CAAC,UACH,OAAO;CAET,MAAM,iBAAiB,OAAO,WAAW,QAAQ;CACjD,IAAI,OAAO,MAAM,OAAO,QAAQ,CAAC,KAAK,CAAC,OAAO,MAAM,cAAc,GAChE,OAAO,eAAe,SAAS;CAEjC,IAAI,OAAO,MAAM,cAAc,GAC7B,OAAO;CAET,IAAI,kBAAkB,KACpB,OAAO;CAET,IAAI,iBAAiB,GACnB,OAAO,KAAK,IAAI,cAAc,
|
|
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,QAAQ,IAAI;CAEjE,IAAI,CADiB,OAAO,WAAW,eACvB,KAAK,OAAO,MAAM,OAAO,eAAe,CAAC,GACvD,OAAO;CAGT,OAAO;AACT;AAEA,SAAgB,eACd,WAAW,IACX,eAAe,IACf,gBAAgB,OACR;CACR,IAAI,CAAC,UACH,OAAO;CAET,MAAM,iBAAiB,OAAO,WAAW,QAAQ;CACjD,IAAI,OAAO,MAAM,OAAO,QAAQ,CAAC,KAAK,CAAC,OAAO,MAAM,cAAc,GAChE,OAAO,eAAe,SAAS;CAEjC,IAAI,OAAO,MAAM,cAAc,GAC7B,OAAO;CAET,IAAI,kBAAkB,KACpB,OAAO;CAET,IAAI,iBAAiB,GACnB,OAAO,KAAK,IAAI,cAAc,CAAC,CAAC,SAAS;CAE3C,IAAI,eACF,OAAO;CAET,OAAO,eAAe,SAAS;AACjC;;;;;;;;;;AAWA,SAAgB,kBACd,QACA,WAA0B,MAC1B,gBAAyB,OACjB;CACR,IAAI,CAAC,QACH,OAAO;CAIT,IAAI,kBAAkB,OAAO,KAAK,CAAC,CAAC,WAAW,KAAK,GAAG;CAGvD,MAAM,WAAW,gBAAgB,QAAQ,GAAG;CAC5C,IAAI,aAAa,IACf,kBAAkB,GAAG,gBAAgB,MAAM,GAAG,WAAW,CAAC,IAAI,gBAAgB,MAAM,WAAW,CAAC,CAAC,CAAC,WAAW,KAAK,EAAE;CAItH,IACG,CAAC,iBAAiB,gBAAgB,WAAW,GAAG,KACjD,oBAAoB,KAEpB,kBAAkB,IAAI;CAIxB,MAAM,eAAe,OAAO,WAAW,eAAe;CACtD,IAAI,OAAO,MAAM,OAAO,eAAe,CAAC,KAAK,CAAC,OAAO,MAAM,YAAY,GACrE,kBAAkB,aAAa,SAAS;CAE1C,IAAI,OAAO,MAAM,KAAK,IAAI,OAAO,eAAe,CAAC,CAAC,GAChD,OAAO;CAIT,IAAI,CAAC,SAAS,WAAW,MAAM,gBAAgB,MAAM,GAAG;CACxD,IAAI,aAAa,QAAQ,SAAS,SAAS,UACzC,WAAW,SAAS,MAAM,GAAG,QAAQ;CAGvC,IAAI,eAAe;EACjB,IAAI,CAAC,UACH,OAAO;EAET,OAAO,GAAG,UAAU,WAAW,IAAI,aAAa;CAClD;CAGA,UAAU,QAAQ,QAAQ,SAAS,EAAE;CAErC,WAAW,SAAS,QAAQ,SAAS,EAAE;CAEvC,OAAO,GAAG,YAAY,WAAW,MAAM,MAAM,WAAW,IAAI,aAAa;AAC3E;AAEA,SAAgB,iBACd,QACA,OACA,UACQ;CACR,IAAI,CAAC,UAAU,CAAC,OACd,OAAO;CAGT,MAAM,kBACJ,OAAO,WAAW,YAAY,aAAa,KAAA,IACvC,YAAY,QAAQ,QAAQ,IAC5B,OAAO,SAAS;CAEtB,IAAI,OAAO,MAAM,OAAO,eAAe,CAAC,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC,GACrE,OAAO;CAET,OAAO,OAAO,WAAW,eAAe,IAAI,OAAO,WAAW,KAAK;AACrE;;;;AAKA,MAAM,YAAY,IAAI,KAAK,aAAa,MAAM;CAC5C,UAAU;CACV,kBAAkB;CAClB,0BAA0B;CAC1B,uBAAuB;CACvB,aAAa;AACf,CAAC;;;;AAKD,SAAgB,mBACd,YACA,UACQ;CACR,IAAI,CAAC,cAAc,CAAC,UAClB,OAAO;CAGT,MAAM,oBAAoB,OAAO,WAAW,UAAU;CACtD,MAAM,eAAe,OAAO,WAAW,QAAQ;CAE/C,IACE,OAAO,MAAM,iBAAiB,KAC9B,OAAO,MAAM,YAAY,KACzB,CAAC,cAED,OAAO;CAGT,OAAO,UAAU,OAAO,oBAAoB,YAAY;AAC1D;AAEA,MAAM,QAAQ;CACZ,CAAC,OAAO,KAAK;CACb,CAAC,QAAQ,IAAI;CACb,CAAC,UAAU,EAAE;CACb,CAAC,UAAU,CAAC;AACd;AAEA,SAAgB,eAAe,SAAiB,QAAwB;CACtE,MAAM,QAAQ,MAAM,MAAM,GAAG,OAAO,WAAW,CAAC;CAChD,MAAM,SAAS,QAAQ,KAAK,MAAM,UAAU,MAAM,EAAE,IAAI;CACxD,MAAM,OAAO,QAAQ,MAAM;CAE3B,OAAO,OAAO,eAAe,QAAQ;EACnC,OAAO;EACP;EACA,aAAa;CACf,CAAC;AACH;AAEA,SAAgB,cAAc,MAAsB;CAClD,OAAO,KAAK,QACV,aACC,SAAS,GAAG,KAAK,MAAM,GAAG,CAAC,EAAE,KAAK,KAAK,MAAM,EAAE,GAClD;AACF"}
|
|
@@ -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 { ModeOptions, WidgetMode } from '../types/widget.js'\n\nexport function getActionMessage(\n t: TFunction,\n step: LiFiStepExtended,\n type: ExecutionActionType,\n status: ExecutionActionStatus,\n substatus?: Substatus,\n mode?: WidgetMode,\n modeOptions?: ModeOptions\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]?.(t, step, mode, modeOptions)\n return { title }\n}\n\nconst actionStatusMessages: Record<\n ExecutionActionType,\n Partial<\n Record<\n ExecutionActionStatus,\n (\n t: TFunction,\n step: LiFiStepExtended,\n mode?: WidgetMode,\n modeOptions?: ModeOptions\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, _, mode, modeOptions) =>\n mode === 'custom'\n ? t(`main.process.${modeOptions?.custom?.type ?? '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, _, mode, modeOptions) =>\n mode === 'custom'\n ? t(`main.process.${modeOptions?.custom?.type ?? '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,MACA,aAIA;CAOA,OAAO,EAAE,QANoB,YACzB,wBAAwB,
|
|
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 { ModeOptions, WidgetMode } from '../types/widget.js'\n\nexport function getActionMessage(\n t: TFunction,\n step: LiFiStepExtended,\n type: ExecutionActionType,\n status: ExecutionActionStatus,\n substatus?: Substatus,\n mode?: WidgetMode,\n modeOptions?: ModeOptions\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]?.(t, step, mode, modeOptions)\n return { title }\n}\n\nconst actionStatusMessages: Record<\n ExecutionActionType,\n Partial<\n Record<\n ExecutionActionStatus,\n (\n t: TFunction,\n step: LiFiStepExtended,\n mode?: WidgetMode,\n modeOptions?: ModeOptions\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, _, mode, modeOptions) =>\n mode === 'custom'\n ? t(`main.process.${modeOptions?.custom?.type ?? '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, _, mode, modeOptions) =>\n mode === 'custom'\n ? t(`main.process.${modeOptions?.custom?.type ?? '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,MACA,aAIA;CAOA,OAAO,EAAE,QANoB,YACzB,wBAAwB,OAAwB,GAAG,UAAU,GAAG,CAAC,IACjE,KAAA,MAGF,qBAAqB,KAAK,GAAG,OAAO,GAAG,GAAG,MAAM,MAAM,WAAW,EACpD;AACjB;AAEA,MAAM,uBAaF;CACF,iBAAiB;EACf,UAAU,GAAG,SACX,EAAE,uCAAuC,EACvC,aAAa,KAAK,OAAO,UAAU,OACrC,CAAC;EACH,UAAU,GAAG,SACX,EAAE,uCAAuC,EACvC,aAAa,KAAK,OAAO,UAAU,OACrC,CAAC;EACH,OAAO,GAAG,SACR,EAAE,oCAAoC,EACpC,aAAa,KAAK,OAAO,UAAU,OACrC,CAAC;CACL;CACA,eAAe;EACb,UAAU,MAAM,EAAE,6BAA6B;EAC/C,kBAAkB,MAAM,EAAE,oCAAoC;EAC9D,UAAU,MAAM,EAAE,6BAA6B;EAC/C,OAAO,MAAM,EAAE,0BAA0B;CAC3C;CACA,iBAAiB;EACf,UAAU,GAAG,SACX,EAAE,uCAAuC,EACvC,aAAa,KAAK,OAAO,UAAU,OACrC,CAAC;EACH,iBAAiB,GAAG,SAClB,EAAE,6CAA6C,EAC7C,aAAa,KAAK,OAAO,UAAU,OACrC,CAAC;EACH,UAAU,GAAG,SACX,EAAE,uCAAuC,EACvC,aAAa,KAAK,OAAO,UAAU,OACrC,CAAC;EACH,OAAO,GAAG,SACR,EAAE,uCAAuC,EACvC,aAAa,KAAK,OAAO,UAAU,OACrC,CAAC;CACL;CACA,eAAe;EACb,UAAU,GAAG,SACX,EAAE,uCAAuC,EACvC,aAAa,KAAK,OAAO,UAAU,OACrC,CAAC;EACH,kBAAkB,GAAG,SACnB,EAAE,8CAA8C,EAC9C,aAAa,KAAK,OAAO,UAAU,OACrC,CAAC;EACH,UAAU,GAAG,SACX,EAAE,uCAAuC,EACvC,aAAa,KAAK,OAAO,UAAU,OACrC,CAAC;EACH,OAAO,GAAG,SACR,EAAE,oCAAoC,EACpC,aAAa,KAAK,OAAO,UAAU,OACrC,CAAC;CACL;CACA,QAAQ;EACN,UAAU,MAAM,EAAE,6BAA6B;EAC/C,kBAAkB,MAAM,EAAE,oCAAoC;EAC9D,UAAU,MAAM,EAAE,6BAA6B;EAC/C,OAAO,MAAM,EAAE,0BAA0B;CAC3C;CACA,MAAM;EACJ,UAAU,MAAM,EAAE,2BAA2B;EAC7C,kBAAkB,MAAM,EAAE,kCAAkC;EAC5D,mBAAmB,MAAM,EAAE,mCAAmC;EAC9D,UAAU,MAAM,EAAE,2BAA2B;EAC7C,OAAO,GAAG,GAAG,MAAM,gBACjB,SAAS,WACL,EAAE,gBAAgB,aAAa,QAAQ,QAAQ,WAAW,MAAM,IAChE,EAAE,wBAAwB;CAClC;CACA,aAAa;EACX,UAAU,MAAM,EAAE,6BAA6B;EAC/C,kBAAkB,MAAM,EAAE,oCAAoC;EAC9D,mBAAmB,MAAM,EAAE,qCAAqC;EAChE,UAAU,MAAM,EAAE,6BAA6B;EAC/C,OAAO,MAAM,EAAE,0BAA0B;CAC3C;CACA,iBAAiB;EACf,UAAU,MAAM,EAAE,qCAAqC;EACvD,UAAU,MAAM,EAAE,qCAAqC;EACvD,OAAO,GAAG,GAAG,MAAM,gBACjB,SAAS,WACL,EAAE,gBAAgB,aAAa,QAAQ,QAAQ,WAAW,MAAM,IAChE,EAAE,kCAAkC;CAC5C;AACF;AAEA,MAAM,0BAGF;CACF,SAAS,CAST;CACA,MAAM;EAEJ,UAAU,MAAM,EAAE,qCAAqC;EACvD,WAAW,MAAM,EAAE,qCAAqC;CAC1D;CACA,QAAQ,CAMR;CACA,SAAS,CAAC;CACV,WAAW,CAAC;AACd"}
|
|
@@ -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;CAC5B,IAAI,CAAC,OACH,OAAO;EACL,OAAO,EAAE,qBAAqB;EAC9B,SAAS,EAAE,uBAAuB;CACpC;CAGF,MAAM,0BAA0B,QAC9B,GAAG,EAAG,OAAe,kCAAkC,EAAE,GAAG,EAC1D,oCACA;EACE,QAAQ,kBACN,OAAO,KAAK,OAAO,UAAU,GAC7B,KAAK,OAAO,UAAU,QACxB;EACA,aAAa,KAAK,OAAO,UAAU;EACnC,WAAW,aAAa,KAAK,OAAO,WAAW,
|
|
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":"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,IAAI;CAElC,OAAO,CAAC,OAAO,MAAM,SAAS,IAAI;AACpC;AAGA,MAAa,wBACX,MACA,OACA,WACY;CACZ,IAAI,OAAO,OAAO,MAChB,OAAO,MAAM,MAAM,IAAI,SAAS,IAAI,KAAM,IAAyB;CAErE,OAAO,CAAC,OAAO,MAAM,IAAI,SAAS,IAAI,KAAM,IAAyB;AACvE;AAEA,MAAa,qBACX,OACA,QACA,aAC8B;CAC9B,IAAI,CAAC,OACH;CAEF,OAAO;EACL,OAAO,OAAO,MAAM,SAAS,CAAC,CAAC;EAC/B,MAAM,OAAO,MAAM,QAAQ,CAAC,CAAC;EAC7B,GAAI,YAAY,GACb,WAAW;GACV,OAAO,OAAO,MAAM,
|
|
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,IAAI;CAElC,OAAO,CAAC,OAAO,MAAM,SAAS,IAAI;AACpC;AAGA,MAAa,wBACX,MACA,OACA,WACY;CACZ,IAAI,OAAO,OAAO,MAChB,OAAO,MAAM,MAAM,IAAI,SAAS,IAAI,KAAM,IAAyB;CAErE,OAAO,CAAC,OAAO,MAAM,IAAI,SAAS,IAAI,KAAM,IAAyB;AACvE;AAEA,MAAa,qBACX,OACA,QACA,aAC8B;CAC9B,IAAI,CAAC,OACH;CAEF,OAAO;EACL,OAAO,OAAO,MAAM,SAAS,CAAC,CAAC;EAC/B,MAAM,OAAO,MAAM,QAAQ,CAAC,CAAC;EAC7B,GAAI,YAAY,GACb,WAAW;GACV,OAAO,OAAO,MAAM,SAAS,EAAE,SAAS,CAAC,CAAC;GAC1C,MAAM,OAAO,MAAM,SAAS,EAAE,QAAQ,CAAC,CAAC;EAC1C,EACF;CACF;AACF;AAEA,MAAa,qBACX,MACA,cACA,UACA,WACY;CACZ,OACE,qBAAqB,MAAM,cAAc,MAAM,MAC9C,WACG,qBAAqB,MAAM,eAAe,WAAW,MAAM,IAC3D;AAER"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//#region src/utils/
|
|
1
|
+
//#region src/utils/mode.ts
|
|
2
2
|
const getSplitMode = (split) => {
|
|
3
3
|
if (!split) return "swap";
|
|
4
4
|
if (typeof split === "string") return split;
|
|
@@ -7,4 +7,4 @@ const getSplitMode = (split) => {
|
|
|
7
7
|
//#endregion
|
|
8
8
|
export { getSplitMode };
|
|
9
9
|
|
|
10
|
-
//# sourceMappingURL=
|
|
10
|
+
//# sourceMappingURL=mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mode.js","names":[],"sources":["../../../src/utils/mode.ts"],"sourcesContent":["import type { SplitMode, SplitModeOptions } from '../types/widget.js'\n\nexport const getSplitMode = (\n split?: SplitMode | SplitModeOptions\n): SplitMode => {\n if (!split) {\n return 'swap'\n }\n if (typeof split === 'string') {\n return split\n }\n return split.defaultTab\n}\n"],"mappings":";AAEA,MAAa,gBACX,UACc;CACd,IAAI,CAAC,OACH,OAAO;CAET,IAAI,OAAO,UAAU,UACnB,OAAO;CAET,OAAO,MAAM;AACf"}
|
|
@@ -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,
|
|
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,iCAAiB,IAAI,IAAI;CAC7B;CACA;CACA;CACA;AACF,CAAC;AAED,SAAgB,eACd,SACqB;CACrB,MAAM,yBAAS,IAAI,IAAwC;CAC3D,KAAK,MAAM,UAAU,SAAS;EAC5B,MAAM,MAAM,eAAe,IAAI,OAAO,IAAI,IACtC,oBACA,OAAO;EACX,MAAM,QAAQ,OAAO,IAAI,GAAG;EAC5B,IAAI,OACF,MAAM,KAAK,MAAM;OAEjB,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC;CAE5B;CACA,OAAO,CAAC,GAAG,OAAO,OAAO,CAAC;AAC5B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timer.js","names":[],"sources":["../../../src/utils/timer.ts"],"sourcesContent":["import type { LiFiStepExtended } from '@lifi/sdk'\n\nexport function getExpiryTimestamp(step?: LiFiStepExtended): Date {\n const { signedAt } = step?.execution ?? {}\n if (!step || !signedAt) {\n return new Date()\n }\n return new Date(signedAt + step.estimate.executionDuration * 1000)\n}\n\nexport 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":";AAEA,SAAgB,mBAAmB,MAA+B;CAChE,MAAM,EAAE,aAAa,MAAM,aAAa,CAAC;CACzC,IAAI,CAAC,QAAQ,CAAC,UACZ,uBAAO,IAAI,KAAK;CAElB,OAAO,IAAI,KAAK,WAAW,KAAK,SAAS,oBAAoB,GAAI;AACnE;AAEA,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;CAChB,CAAC,
|
|
1
|
+
{"version":3,"file":"timer.js","names":[],"sources":["../../../src/utils/timer.ts"],"sourcesContent":["import type { LiFiStepExtended } from '@lifi/sdk'\n\nexport function getExpiryTimestamp(step?: LiFiStepExtended): Date {\n const { signedAt } = step?.execution ?? {}\n if (!step || !signedAt) {\n return new Date()\n }\n return new Date(signedAt + step.estimate.executionDuration * 1000)\n}\n\nexport 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":";AAEA,SAAgB,mBAAmB,MAA+B;CAChE,MAAM,EAAE,aAAa,MAAM,aAAa,CAAC;CACzC,IAAI,CAAC,QAAQ,CAAC,UACZ,uBAAO,IAAI,KAAK;CAElB,OAAO,IAAI,KAAK,WAAW,KAAK,SAAS,oBAAoB,GAAI;AACnE;AAEA,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;CAChB,CAAC,CAAC,CAAC,OAAO;EACR;EACA;EACA;EACA;CACF,CAOU,CAAC,CAAC,QAAQ,QAAQ,EAAE;CAGhC,OAAO;AACT"}
|
package/dist/esm/utils/token.js
CHANGED
|
@@ -38,7 +38,7 @@ const updateTokenInCache = (data, token) => {
|
|
|
38
38
|
const filterAllowedTokens = (dataTokens, configTokens, chainsConfig, formType) => {
|
|
39
39
|
if (!dataTokens) return;
|
|
40
40
|
const includedTokens = configTokens?.include || [];
|
|
41
|
-
const allChainIds = Array.from(new Set([...includedTokens.map((t) => t.chainId), ...Object.keys(dataTokens)])).map((chainId) => Number(chainId));
|
|
41
|
+
const allChainIds = Array.from(/* @__PURE__ */ new Set([...includedTokens.map((t) => t.chainId), ...Object.keys(dataTokens)])).map((chainId) => Number(chainId));
|
|
42
42
|
const configChainIdsSet = getConfigItemSets(chainsConfig, (chainIds) => new Set(chainIds), formType);
|
|
43
43
|
const allowedChainIds = configChainIdsSet ? allChainIds.filter((chainId) => isFormItemAllowed(chainId, configChainIdsSet, formType)) : allChainIds;
|
|
44
44
|
const allowedTokensByChain = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.js","names":[],"sources":["../../../src/utils/token.ts"],"sourcesContent":["import type {\n BaseToken,\n RouteExtended,\n Token,\n TokenAmount,\n TokenExtended,\n} 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\nexport const getExecutionToToken = (route: RouteExtended): TokenAmount => ({\n ...(route.steps.at(-1)?.execution?.toToken ?? route.toToken),\n amount: BigInt(\n route.steps.at(-1)?.execution?.toAmount ??\n route.steps.at(-1)?.estimate.toAmount ??\n route.toAmount\n ),\n})\n"],"mappings":";;;;;;AAgBA,MAAa,iCACX,gBACA,iBAC8B;CAC9B,IAAI,CAAC,gBACH,OAAO;CAET,IAAI,CAAC,cACH,OAAO;CAGT,MAAM,SAAS,EAAE,GAAG,eAAe;CAEnC,KAAK,MAAM,CAAC,SAAS,WAAW,OAAO,QAAQ,YAAY,GAAG;EAC5D,MAAM,aAAa,OAAO,OAAO;EACjC,MAAM,iBAAiB,OAAO,eAAe,CAAC;EAC9C,MAAM,oBAAoB,IAAI,IAC5B,eAAe,KAAK,MAAM,EAAE,QAAQ,YAAY,CAAC,CACnD;EAEA,MAAM,YAAY,OAAO,QACtB,MAAM,CAAC,kBAAkB,IAAI,EAAE,QAAQ,YAAY,CAAC,CACvD;EAEA,IAAI,UAAU,QACZ,OAAO,cAAc,CAAC,GAAG,gBAAgB,GAAG,SAAS;CAEzD;CAEA,OAAO;AACT;;;;;AAMA,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,OAAO;CACtE,IAAI,QAAQ,GACV,OAAO;CAET,OAAO;EACL,GAAG;GACF,MAAM,UAAU,YAAY,KAAK,GAAG,MACnC,MAAM,QAAQ;GAAE,GAAG;GAAG,GAAG;EAAM,IAAI,CACrC;CACF;AACF;AAEA,MAAa,uBACX,YACA,cACA,cACA,aACuD;CACvD,IAAI,CAAC,YACH;CAGF,MAAM,iBAAiB,cAAc,WAAW,CAAC;CACjD,MAAM,cAAc,MAAM,
|
|
1
|
+
{"version":3,"file":"token.js","names":[],"sources":["../../../src/utils/token.ts"],"sourcesContent":["import type {\n BaseToken,\n RouteExtended,\n Token,\n TokenAmount,\n TokenExtended,\n} 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\nexport const getExecutionToToken = (route: RouteExtended): TokenAmount => ({\n ...(route.steps.at(-1)?.execution?.toToken ?? route.toToken),\n amount: BigInt(\n route.steps.at(-1)?.execution?.toAmount ??\n route.steps.at(-1)?.estimate.toAmount ??\n route.toAmount\n ),\n})\n"],"mappings":";;;;;;AAgBA,MAAa,iCACX,gBACA,iBAC8B;CAC9B,IAAI,CAAC,gBACH,OAAO;CAET,IAAI,CAAC,cACH,OAAO;CAGT,MAAM,SAAS,EAAE,GAAG,eAAe;CAEnC,KAAK,MAAM,CAAC,SAAS,WAAW,OAAO,QAAQ,YAAY,GAAG;EAC5D,MAAM,aAAa,OAAO,OAAO;EACjC,MAAM,iBAAiB,OAAO,eAAe,CAAC;EAC9C,MAAM,oBAAoB,IAAI,IAC5B,eAAe,KAAK,MAAM,EAAE,QAAQ,YAAY,CAAC,CACnD;EAEA,MAAM,YAAY,OAAO,QACtB,MAAM,CAAC,kBAAkB,IAAI,EAAE,QAAQ,YAAY,CAAC,CACvD;EAEA,IAAI,UAAU,QACZ,OAAO,cAAc,CAAC,GAAG,gBAAgB,GAAG,SAAS;CAEzD;CAEA,OAAO;AACT;;;;;AAMA,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,OAAO;CACtE,IAAI,QAAQ,GACV,OAAO;CAET,OAAO;EACL,GAAG;GACF,MAAM,UAAU,YAAY,KAAK,GAAG,MACnC,MAAM,QAAQ;GAAE,GAAG;GAAG,GAAG;EAAM,IAAI,CACrC;CACF;AACF;AAEA,MAAa,uBACX,YACA,cACA,cACA,aACuD;CACvD,IAAI,CAAC,YACH;CAGF,MAAM,iBAAiB,cAAc,WAAW,CAAC;CACjD,MAAM,cAAc,MAAM,qBACxB,IAAI,IAAI,CACN,GAAG,eAAe,KAAK,MAAM,EAAE,OAAO,GACtC,GAAG,OAAO,KAAK,UAAU,CAC3B,CAAC,CACH,CAAC,CAAC,KAAK,YAAY,OAAO,OAAO,CAAC;CAElC,MAAM,oBAAoB,kBACxB,eACC,aAAuB,IAAI,IAAI,QAAQ,GACxC,QACF;CAEA,MAAM,kBAAkB,oBACpB,YAAY,QAAQ,YAClB,kBAAkB,SAAS,mBAAmB,QAAQ,CACxD,IACA;CAEJ,MAAM,uBAA+D,CAAC;CACtE,KAAK,MAAM,WAAW,iBAAiB;EACrC,MAAM,cAAc,CAClB,GAAG,WAAW,UACd,GAAG,eAAe,QAAQ,MAAM,OAAO,EAAE,OAAO,MAAM,OAAO,CAC/D;EAEA,MAAM,mBAAmB,kBACvB,eACC,WACC,IAAI,IACF,OACG,QAAQ,MAAM,OAAO,EAAE,OAAO,MAAM,OAAO,CAAC,CAC5C,KAAK,MAAM,EAAE,QAAQ,YAAY,CAAC,CACvC,GACF,QACF;EAQA,qBAAqB,WANJ,YAAY,QAAQ,UACnC,kBAAkB,OAAO,kBAAkB,WAAW,MACpD,EAAE,QAAQ,YAAY,CACxB,CAGqC;CACzC;CAEA,OAAO;AACT;AAEA,MAAa,uBAAuB,WAAuC;CACzE,GAAI,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,WAAW,WAAW,MAAM;CACpD,QAAQ,OACN,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,WAAW,YAC7B,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,SAAS,YAC7B,MAAM,QACV;AACF"}
|
|
@@ -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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lifi/widget",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.1.0",
|
|
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",
|
|
@@ -35,26 +35,26 @@
|
|
|
35
35
|
"@emotion/react": "^11.14.0",
|
|
36
36
|
"@emotion/styled": "^11.14.1",
|
|
37
37
|
"@lifi/sdk": "^4.0.0",
|
|
38
|
-
"@mui/icons-material": "^9.
|
|
39
|
-
"@mui/material": "^9.
|
|
40
|
-
"@mui/system": "^9.
|
|
41
|
-
"@tanstack/react-router": "^1.170.
|
|
42
|
-
"@tanstack/react-virtual": "^3.14.
|
|
38
|
+
"@mui/icons-material": "^9.1.1",
|
|
39
|
+
"@mui/material": "^9.1.1",
|
|
40
|
+
"@mui/system": "^9.1.1",
|
|
41
|
+
"@tanstack/react-router": "^1.170.16",
|
|
42
|
+
"@tanstack/react-virtual": "^3.14.3",
|
|
43
43
|
"eventemitter3": "^5.0.4",
|
|
44
|
-
"i18next": "^26.3.
|
|
44
|
+
"i18next": "^26.3.1",
|
|
45
45
|
"microdiff": "^1.5.0",
|
|
46
46
|
"motion": "^12.38.0",
|
|
47
47
|
"react-i18next": "^17.0.8",
|
|
48
48
|
"react-intersection-observer": "^10.0.3",
|
|
49
49
|
"react-transition-group": "^4.4.5",
|
|
50
50
|
"zustand": "^5.0.14",
|
|
51
|
-
"@lifi/
|
|
52
|
-
"@lifi/
|
|
51
|
+
"@lifi/widget-provider": "4.1.0",
|
|
52
|
+
"@lifi/wallet-management": "4.1.0"
|
|
53
53
|
},
|
|
54
54
|
"peerDependencies": {
|
|
55
55
|
"@tanstack/react-query": ">=5.90.0",
|
|
56
|
-
"react": ">=
|
|
57
|
-
"react-dom": ">=
|
|
56
|
+
"react": ">=19",
|
|
57
|
+
"react-dom": ">=19"
|
|
58
58
|
},
|
|
59
59
|
"module": "./dist/esm/index.js",
|
|
60
60
|
"typesVersions": {
|
package/src/App.tsx
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
'use client'
|
|
2
|
-
import type {
|
|
3
|
-
import {
|
|
2
|
+
import type { JSX, Ref } from 'react'
|
|
3
|
+
import { useMemo } from 'react'
|
|
4
4
|
import { AppDefault } from './AppDefault.js'
|
|
5
5
|
import type { WidgetDrawer } from './AppDrawer.js'
|
|
6
6
|
import { AppDrawer } from './AppDrawer.js'
|
|
7
7
|
import { AppProvider } from './AppProvider.js'
|
|
8
8
|
import type { WidgetConfig, WidgetProps } from './types/widget.js'
|
|
9
9
|
|
|
10
|
-
export const App
|
|
11
|
-
WidgetProps &
|
|
12
|
-
|
|
10
|
+
export const App = (
|
|
11
|
+
props: WidgetProps & { ref?: Ref<WidgetDrawer> }
|
|
12
|
+
): JSX.Element => {
|
|
13
13
|
const config: WidgetConfig = useMemo(() => {
|
|
14
14
|
const config = { ...props, ...props.config }
|
|
15
15
|
if (config.variant === 'drawer') {
|
|
@@ -28,7 +28,7 @@ export const App: ForwardRefExoticComponent<
|
|
|
28
28
|
return (
|
|
29
29
|
<AppProvider config={config} formRef={props.formRef}>
|
|
30
30
|
<AppDrawer
|
|
31
|
-
ref={ref}
|
|
31
|
+
ref={props.ref}
|
|
32
32
|
elementRef={props.elementRef}
|
|
33
33
|
config={config}
|
|
34
34
|
open={props.open}
|
|
@@ -45,4 +45,4 @@ export const App: ForwardRefExoticComponent<
|
|
|
45
45
|
<AppDefault />
|
|
46
46
|
</AppProvider>
|
|
47
47
|
)
|
|
48
|
-
}
|
|
48
|
+
}
|