@aori/mega-swap-widget 0.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/LICENSE +21 -0
- package/README.md +404 -0
- package/dist/AssetSelectionMenu-Y3EB32BT.cjs +13 -0
- package/dist/AssetSelectionMenu-Y3EB32BT.cjs.map +1 -0
- package/dist/AssetSelectionMenu-ZRG42UCZ.js +13 -0
- package/dist/AssetSelectionMenu-ZRG42UCZ.js.map +1 -0
- package/dist/ChainSelectionMenu-FBAPPFKI.cjs +11 -0
- package/dist/ChainSelectionMenu-FBAPPFKI.cjs.map +1 -0
- package/dist/ChainSelectionMenu-QO3H4TNR.js +11 -0
- package/dist/ChainSelectionMenu-QO3H4TNR.js.map +1 -0
- package/dist/SwapFormHorizontal-JDJUDFNX.js +573 -0
- package/dist/SwapFormHorizontal-JDJUDFNX.js.map +1 -0
- package/dist/SwapFormHorizontal-WG3Z3CFT.cjs +573 -0
- package/dist/SwapFormHorizontal-WG3Z3CFT.cjs.map +1 -0
- package/dist/SwapFormSplit-7CHTPLEQ.js +441 -0
- package/dist/SwapFormSplit-7CHTPLEQ.js.map +1 -0
- package/dist/SwapFormSplit-VDDIRQUQ.cjs +441 -0
- package/dist/SwapFormSplit-VDDIRQUQ.cjs.map +1 -0
- package/dist/WalletPlaceholderPanel-7YDQ4FT6.js +57 -0
- package/dist/WalletPlaceholderPanel-7YDQ4FT6.js.map +1 -0
- package/dist/WalletPlaceholderPanel-FZ6XIAMF.cjs +57 -0
- package/dist/WalletPlaceholderPanel-FZ6XIAMF.cjs.map +1 -0
- package/dist/WidgetWalletPanel-D7I5TAU3.js +789 -0
- package/dist/WidgetWalletPanel-D7I5TAU3.js.map +1 -0
- package/dist/WidgetWalletPanel-T7H6FGVN.cjs +789 -0
- package/dist/WidgetWalletPanel-T7H6FGVN.cjs.map +1 -0
- package/dist/chunk-3E6RNP2D.cjs +389 -0
- package/dist/chunk-3E6RNP2D.cjs.map +1 -0
- package/dist/chunk-5TH6MFQD.cjs +122 -0
- package/dist/chunk-5TH6MFQD.cjs.map +1 -0
- package/dist/chunk-5XSCUUOW.js +101 -0
- package/dist/chunk-5XSCUUOW.js.map +1 -0
- package/dist/chunk-6Q7MSCKS.js +2199 -0
- package/dist/chunk-6Q7MSCKS.js.map +1 -0
- package/dist/chunk-6XB5R4GF.cjs +368 -0
- package/dist/chunk-6XB5R4GF.cjs.map +1 -0
- package/dist/chunk-6YLNOZ7P.js +389 -0
- package/dist/chunk-6YLNOZ7P.js.map +1 -0
- package/dist/chunk-7AWG6OWF.js +27 -0
- package/dist/chunk-7AWG6OWF.js.map +1 -0
- package/dist/chunk-ARMW5POL.js +3082 -0
- package/dist/chunk-ARMW5POL.js.map +1 -0
- package/dist/chunk-B3ILUJ7G.cjs +101 -0
- package/dist/chunk-B3ILUJ7G.cjs.map +1 -0
- package/dist/chunk-GGM3MDFM.js +32 -0
- package/dist/chunk-GGM3MDFM.js.map +1 -0
- package/dist/chunk-GZUTUD5O.cjs +2199 -0
- package/dist/chunk-GZUTUD5O.cjs.map +1 -0
- package/dist/chunk-HXOGJSAI.cjs +3082 -0
- package/dist/chunk-HXOGJSAI.cjs.map +1 -0
- package/dist/chunk-LTA7IG3J.js +122 -0
- package/dist/chunk-LTA7IG3J.js.map +1 -0
- package/dist/chunk-NBJPKJBC.cjs +32 -0
- package/dist/chunk-NBJPKJBC.cjs.map +1 -0
- package/dist/chunk-PGYOJ5RB.cjs +27 -0
- package/dist/chunk-PGYOJ5RB.cjs.map +1 -0
- package/dist/chunk-QHW27RMH.js +199 -0
- package/dist/chunk-QHW27RMH.js.map +1 -0
- package/dist/chunk-TMC4SUEV.js +368 -0
- package/dist/chunk-TMC4SUEV.js.map +1 -0
- package/dist/chunk-XQINW7QP.cjs +199 -0
- package/dist/chunk-XQINW7QP.cjs.map +1 -0
- package/dist/index.cjs +1780 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.css +1424 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.cts +555 -0
- package/dist/index.d.ts +555 -0
- package/dist/index.js +1780 -0
- package/dist/index.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/flooreyes/mega-swap-widget/dist/index.cjs","../src/SwapWidget.tsx","../src/components/SwapContainer.tsx","../src/components/SwapForm.tsx","../src/components/SwapFormSkeleton.tsx","../src/components/SwapHeader.tsx","../src/theme/ThemeContext.tsx","../src/theme/types.ts","../src/wallet/ConnectButton.tsx","../src/wallet/shared/transports.ts","../src/hooks/useTokenHelpers.ts"],"names":["jsxs","jsx","useCallback","useMemo"],"mappings":"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","file":"/Users/flooreyes/mega-swap-widget/dist/index.cjs","sourcesContent":[null,"'use client';\n\nimport type { Asset } from './internal';\nimport React, { type ReactNode, useMemo } from 'react';\nimport type { AoriSwapWidgetConfig } from './config/types';\nimport { SwapContainer } from './components/SwapContainer';\nimport { WidgetConfigContext } from './context/WidgetConfigContext';\nimport { useWidgetSwapUIStore } from './stores/swapUIStore';\n\nimport { WidgetThemeProvider } from './theme/ThemeContext';\nimport {\n type WidgetTheme,\n defaultDarkTheme,\n defaultLightTheme,\n themeToCSS,\n} from './theme/types';\nimport { AoriClientProvider } from './internal';\nimport { setApiKey, setRpcOverrides, setVtApiBaseUrl } from './internal/environment';\nimport { WalletModalContext } from './wallet/WalletModalContext';\n\nconst EMPTY_CHAINS: number[] = [];\nconst EMPTY_SUPPORTED_INPUT_TOKENS: Array<{ chainId: number; address: string }> = [];\nconst EMPTY_SUPPORTED_OUTPUT_TOKENS: Array<{ chainId: number; address: string }> = [];\nconst EMPTY_SUPPORTED_CHAINS: number[] = [];\n\nconst WIDGET_CRITICAL_CSS = `\n.aori-widget .text-2xs { font-size: 0.75rem; }\n.aori-widget .text-3xs { font-size: 0.68rem; }\n.aori-widget ::-webkit-scrollbar { width: 0px; height: 0px; display: none; }\n.aori-widget * { scrollbar-width: none; }\n.aori-widget input:focus, .aori-widget input:focus-visible,\n.aori-widget button:focus, .aori-widget button:focus-visible,\n.aori-widget select:focus, .aori-widget select:focus-visible { outline: none; }\n`;\n\nclass WidgetErrorBoundary extends React.Component<\n { children: ReactNode },\n { hasError: boolean }\n> {\n state = { hasError: false };\n\n static getDerivedStateFromError() {\n return { hasError: true };\n }\n\n render() {\n if (this.state.hasError) {\n return (\n <div style={{ padding: '1.5rem', textAlign: 'center', color: 'var(--widget-foreground, #888)', fontFamily: 'system-ui, sans-serif' }}>\n <p style={{ margin: '0 0 0.75rem', fontSize: '0.875rem' }}>Something went wrong.</p>\n <button\n type=\"button\"\n onClick={() => this.setState({ hasError: false })}\n style={{\n padding: '0.375rem 1rem',\n fontSize: '0.8125rem',\n cursor: 'pointer',\n border: '1px solid currentColor',\n borderRadius: '0.25rem',\n background: 'transparent',\n color: 'inherit',\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n return this.props.children;\n }\n}\n\nexport interface SwapWidgetProps {\n config: AoriSwapWidgetConfig;\n className?: string;\n onSwapComplete?: (orderHash: string) => void;\n onBaseTokenChange?: (token: Asset) => void;\n onQuoteTokenChange?: (token: Asset) => void;\n onRequestConnect?: () => void;\n onRequestAccount?: () => void;\n customWalletUI?: 'builtin' | 'none' | 'provider';\n}\n\nfunction resolveTheme(cfg: AoriSwapWidgetConfig): WidgetTheme {\n const base = cfg.theme.mode === 'light' ? defaultLightTheme : defaultDarkTheme;\n const override = cfg.theme.mode === 'light' ? cfg.theme.light : cfg.theme.dark;\n return override ? { ...base, ...override } : base;\n}\n\nexport function SwapWidget({\n config,\n className,\n onSwapComplete,\n onBaseTokenChange,\n onQuoteTokenChange,\n onRequestConnect,\n onRequestAccount,\n customWalletUI = 'builtin',\n}: SwapWidgetProps) {\n // Synchronous so every fetch (including initial token/chain queries) picks up\n // the overrides before any React Query hooks fire.\n setApiKey(config.apiKey);\n setRpcOverrides(config.rpcOverrides);\n setVtApiBaseUrl(config.vtApiBaseUrl);\n\n const theme = resolveTheme(config);\n const widgetType = config.appearance?.widgetType ?? 'default';\n const tokenDisplay = config.appearance?.tokenDisplay ?? 'default';\n const tokenBadgeOrientation = config.appearance?.tokenBadgeOrientation ?? 'left';\n const assetMenuVariant = config.appearance?.assetMenuVariant ?? 'default';\n const amountInputVariant = config.appearance?.amountInputVariant ?? 'default';\n const hideAmountInputSymbol = config.appearance?.hideAmountInputSymbol ?? false;\n const swapButtonVariant = config.appearance?.swapButtonVariant ?? 'default';\n const swapHeaderVariant = config.appearance?.swapHeaderVariant ?? 'default';\n const quoteLoaderVariant = config.appearance?.quoteLoaderVariant ?? 'default';\n const walletButtonEnabled = config.appearance?.walletButtonEnabled ?? true;\n const fillContainer = config.appearance?.fillContainer ?? false;\n const hideBorder = config.appearance?.hideBorder ?? false;\n const cssVars = themeToCSS(theme);\n\n // For default/compact with split menu, the outer div becomes a transparent flex-row\n // wrapper (no card styling) and expands to hold both the form card and selection card.\n // The card styling is applied to each individual card inside SwapContainer.\n const isSplitSideBySide =\n assetMenuVariant === 'split' &&\n (widgetType === 'default' || widgetType === 'compact');\n\n const isSelectionOpen = useWidgetSwapUIStore(\n (s) =>\n s.view === 'baseSelection' ||\n s.view === 'quoteSelection' ||\n s.view === 'baseChainSelection' ||\n s.view === 'quoteChainSelection',\n );\n\n const cardWidth = widgetType === 'compact' ? '22rem' : '24rem';\n const expandedMaxWidth = widgetType === 'compact' ? '46rem' : '49rem';\n\n const widgetDimensions: React.CSSProperties = isSplitSideBySide\n ? {\n maxWidth: isSelectionOpen ? expandedMaxWidth : cardWidth,\n transition: 'max-width 0.3s ease',\n height: 'auto',\n overflow: 'visible',\n display: 'flex',\n gap: '1rem',\n alignItems: 'stretch',\n backgroundColor: 'transparent',\n border: 'none',\n borderRadius: 0,\n boxShadow: 'none',\n padding: 0,\n }\n : {\n width: '100%',\n ...(fillContainer\n ? {}\n : {\n maxWidth:\n widgetType === 'split'\n ? '48rem'\n : widgetType === 'horizontal'\n ? '48rem'\n : widgetType === 'compact'\n ? '22rem'\n : '24rem',\n }),\n height: 'auto',\n overflow: 'hidden',\n };\n\n const cardStyles: React.CSSProperties = {\n boxSizing: 'border-box',\n backgroundColor: 'var(--widget-background)',\n color: 'var(--widget-foreground)',\n borderRadius: 'var(--widget-radius)',\n ...(hideBorder\n ? { border: 'none' }\n : {\n borderWidth: '1px',\n borderStyle: 'var(--widget-border-style)' as React.CSSProperties['borderStyle'],\n borderColor: 'var(--widget-border)',\n }),\n boxShadow:\n 'var(--widget-shadow-offset-x) var(--widget-shadow-offset-y) var(--widget-shadow-blur) var(--widget-shadow-spread) color-mix(in srgb, var(--widget-shadow-color) calc(var(--widget-shadow-opacity) * 100%), transparent)',\n padding: '0.25rem 0.5rem',\n paddingTop: '0.25rem',\n };\n\n const enabledChains = config.tokens?.enabledChains ?? EMPTY_CHAINS;\n const supportedInputTokens = config.tokens?.supportedInputTokens ?? EMPTY_SUPPORTED_INPUT_TOKENS;\n const supportedOutputTokens = config.tokens?.supportedOutputTokens ?? EMPTY_SUPPORTED_OUTPUT_TOKENS;\n const supportedInputChains = config.tokens?.supportedInputChains ?? EMPTY_SUPPORTED_CHAINS;\n const supportedOutputChains = config.tokens?.supportedOutputChains ?? EMPTY_SUPPORTED_CHAINS;\n const inputSelectionSearch = config.tokens?.inputSelectionSearch ?? true;\n const outputSelectionSearch = config.tokens?.outputSelectionSearch ?? true;\n const showInputSelectionTokenBalances = config.tokens?.showInputSelectionTokenBalances ?? true;\n const showOutputSelectionTokenBalances = config.tokens?.showOutputSelectionTokenBalances ?? true;\n const lockBase = config.tokens?.lockBase ?? false;\n const lockQuote = config.tokens?.lockQuote ?? false;\n const disableInverting = config.tokens?.disableInverting ?? false;\n const defaultSlippage = config.settings?.defaultSlippage ?? 0.01;\n const hasConnectHandler = !!onRequestConnect;\n\n const widgetConfigValue = useMemo(\n () => ({\n apiKey: config.apiKey,\n web3ConnectionType: 'custom' as const,\n enabledChains,\n supportedInputTokens,\n supportedOutputTokens,\n supportedInputChains,\n supportedOutputChains,\n inputSelectionSearch,\n outputSelectionSearch,\n showInputSelectionTokenBalances,\n showOutputSelectionTokenBalances,\n lockBase,\n lockQuote,\n disableInverting,\n defaultSlippage,\n widgetType,\n tokenDisplay,\n tokenBadgeOrientation,\n assetMenuVariant,\n amountInputVariant,\n hideAmountInputSymbol,\n swapButtonVariant,\n swapHeaderVariant,\n quoteLoaderVariant,\n walletButtonEnabled,\n hasConnectHandler,\n customWalletUI,\n }),\n [\n config.apiKey,\n enabledChains,\n supportedInputTokens,\n supportedOutputTokens,\n supportedInputChains,\n supportedOutputChains,\n inputSelectionSearch,\n outputSelectionSearch,\n showInputSelectionTokenBalances,\n showOutputSelectionTokenBalances,\n lockBase,\n lockQuote,\n disableInverting,\n defaultSlippage,\n widgetType,\n tokenDisplay,\n tokenBadgeOrientation,\n assetMenuVariant,\n amountInputVariant,\n hideAmountInputSymbol,\n swapButtonVariant,\n swapHeaderVariant,\n quoteLoaderVariant,\n walletButtonEnabled,\n hasConnectHandler,\n customWalletUI,\n ],\n );\n\n const walletModalValue = useMemo(\n () =>\n onRequestConnect\n ? { openConnectModal: onRequestConnect, openAccountModal: onRequestAccount }\n : null,\n [onRequestConnect, onRequestAccount],\n );\n\n const inner = (\n <AoriClientProvider>\n <WidgetConfigContext.Provider value={widgetConfigValue}>\n <WidgetThemeProvider theme={theme}>\n <div\n className={`aori-widget${className ? ` ${className}` : ''}`}\n style={\n {\n ...cssVars,\n '--font-sans': 'var(--widget-font-sans)',\n '--font-mono': 'var(--widget-font-mono)',\n fontFamily: 'var(--widget-font-sans)',\n letterSpacing: 'var(--widget-letter-spacing)',\n width: '100%',\n ...widgetDimensions,\n position: 'relative',\n ...(isSplitSideBySide ? {} : cardStyles),\n } as React.CSSProperties\n }\n >\n <style dangerouslySetInnerHTML={{ __html: WIDGET_CRITICAL_CSS }} />\n <WidgetErrorBoundary>\n <SwapContainer\n onSwapComplete={onSwapComplete}\n defaultBaseToken={config.tokens?.defaultBase}\n defaultQuoteToken={config.tokens?.defaultQuote}\n onBaseTokenChange={onBaseTokenChange}\n onQuoteTokenChange={onQuoteTokenChange}\n cardStyles={isSplitSideBySide ? cardStyles : undefined}\n cardWidth={isSplitSideBySide ? cardWidth : undefined}\n />\n </WidgetErrorBoundary>\n </div>\n </WidgetThemeProvider>\n </WidgetConfigContext.Provider>\n </AoriClientProvider>\n );\n\n if (walletModalValue) {\n return (\n <WalletModalContext.Provider value={walletModalValue}>\n {inner}\n </WalletModalContext.Provider>\n );\n }\n\n return inner;\n}\n","'use client';\n\nimport type { SupportedChainId } from '../internal/types';\nimport { Suspense, lazy, useCallback, useEffect, useRef, useState } from 'react';\nimport { useShallow } from 'zustand/react/shallow';\nimport { useWidgetConfig } from '../context/WidgetConfigContext';\nimport { useBalanceEventSubscription } from '../hooks/useBalanceEventListener';\nimport { RfqProvider, useRfq } from '../providers/RfqProvider';\nimport {\n SwapFormProvider,\n useSwapFormContext,\n} from '../providers/SwapFormProvider';\nimport {\n type TransitionType,\n type WidgetView,\n useWidgetSwapUIStore,\n} from '../stores/swapUIStore';\nimport { useWalletState } from '../wallet/useWalletState';\nimport SwapForm from './SwapForm';\nimport { SwapFormSkeleton } from './SwapFormSkeleton';\nimport SwapHeader from './SwapHeader';\n\nconst AssetSelectionMenu = lazy(() => import('./AssetSelectionMenu'));\nconst ChainSelectionMenu = lazy(() => import('./ChainSelectionMenu'));\nconst SwapFormHorizontal = lazy(() => import('./SwapFormHorizontal'));\nconst SwapFormSplit = lazy(() => import('./SwapFormSplit'));\nconst WidgetWalletPanel = lazy(() => import('./WidgetWalletPanel').then(m => ({ default: m.WidgetWalletPanel })));\nconst WalletPlaceholderPanel = lazy(() => import('./WalletPlaceholderPanel').then(m => ({ default: m.WalletPlaceholderPanel })));\n\ninterface SwapContainerProps {\n onSwapComplete?: (orderHash: string) => void;\n defaultBaseToken?: { chainId: number; address: string };\n defaultQuoteToken?: { chainId: number; address: string };\n onBaseTokenChange?: (token: import('../internal/types').Asset) => void;\n onQuoteTokenChange?: (token: import('../internal/types').Asset) => void;\n // Passed from SwapWidget when isSplitSideBySide — each card renders its own styling\n cardStyles?: React.CSSProperties;\n cardWidth?: string;\n}\n\nconst SwapContainerInner: React.FC<SwapContainerProps> = ({\n onSwapComplete,\n cardStyles,\n cardWidth,\n}) => {\n const {\n baseToken,\n quoteToken,\n baseAmount,\n quoteAmount,\n isWrappingPair,\n isUnwrappingPair,\n isRegistryLoading,\n } = useSwapFormContext();\n const { liquidityError, routingError, sizeCapError, stop, clear } = useRfq();\n\n const view = useWidgetSwapUIStore((state) => state.view);\n const {\n isTransitioning,\n isRecipientInputOpen,\n recipient,\n selectedChainFilterChainId,\n } = useWidgetSwapUIStore(\n useShallow((state) => ({\n isTransitioning: state.isTransitioning,\n isRecipientInputOpen: state.isRecipientInputOpen,\n recipient: state.recipient,\n selectedChainFilterChainId: state.selectedChainFilter?.chainId ?? null,\n })),\n );\n\n const enterTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const exitTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const [exitingOverlay, setExitingOverlay] = useState<WidgetView | null>(null);\n\n useBalanceEventSubscription();\n\n useEffect(() => {\n return () => {\n if (enterTimeoutRef.current) clearTimeout(enterTimeoutRef.current);\n if (exitTimeoutRef.current) clearTimeout(exitTimeoutRef.current);\n };\n }, []);\n\n useEffect(() => {\n useWidgetSwapUIStore.getState().resetUI();\n }, []);\n\n useEffect(() => {\n if (!isTransitioning) return;\n\n enterTimeoutRef.current = setTimeout(() => {\n useWidgetSwapUIStore.getState().setIsTransitioning(false);\n enterTimeoutRef.current = null;\n }, 20);\n\n return () => {\n if (enterTimeoutRef.current) {\n clearTimeout(enterTimeoutRef.current);\n enterTimeoutRef.current = null;\n }\n };\n }, [isTransitioning]);\n\n const transitionToView = useCallback(\n (newView: WidgetView, type: TransitionType = 'navigation') => {\n if (exitTimeoutRef.current) {\n clearTimeout(exitTimeoutRef.current);\n exitTimeoutRef.current = null;\n setExitingOverlay(null);\n }\n\n const currentView = useWidgetSwapUIStore.getState().view;\n if (currentView !== 'swap' && newView !== 'swap') {\n useWidgetSwapUIStore.getState().setView(newView);\n useWidgetSwapUIStore.getState().setIsTransitioning(false);\n } else {\n useWidgetSwapUIStore.getState().transitionToView(newView, type);\n }\n },\n [],\n );\n\n const handleBackToSwap = useCallback(() => {\n if (enterTimeoutRef.current) {\n clearTimeout(enterTimeoutRef.current);\n enterTimeoutRef.current = null;\n }\n if (exitTimeoutRef.current) {\n clearTimeout(exitTimeoutRef.current);\n exitTimeoutRef.current = null;\n }\n\n const currentView = useWidgetSwapUIStore.getState().view;\n setExitingOverlay(currentView);\n\n useWidgetSwapUIStore.getState().setChainFilter(null);\n useWidgetSwapUIStore.getState().setView('swap');\n useWidgetSwapUIStore.getState().setIsTransitioning(false);\n useWidgetSwapUIStore.getState().resetAssetSelection();\n\n exitTimeoutRef.current = setTimeout(() => {\n setExitingOverlay(null);\n exitTimeoutRef.current = null;\n }, 200);\n }, []);\n\n const handleChainFilterSelect = useCallback(\n (chainId: SupportedChainId) => {\n const previousView = view;\n const side = previousView === 'baseChainSelection' ? 'base' : 'quote';\n useWidgetSwapUIStore.getState().setChainFilter({ chainId, side });\n useWidgetSwapUIStore.getState().pushRecentChain(chainId);\n transitionToView(\n side === 'base' ? 'baseSelection' : 'quoteSelection',\n 'chainSelection',\n );\n },\n [view, transitionToView],\n );\n\n const handleMoreChainsClick = useCallback(() => {\n const currentView = useWidgetSwapUIStore.getState().view;\n if (currentView === 'baseSelection') {\n transitionToView('baseChainSelection', 'chainSelection');\n } else if (currentView === 'quoteSelection') {\n transitionToView('quoteChainSelection', 'chainSelection');\n }\n }, [transitionToView]);\n\n // Called by ReviewActionSignAndSubmitOrderRow after a swap is submitted.\n // Stops and fully clears the RFQ so no stale quote lingers post-submission.\n const handleSwapInitiated = useCallback(() => {\n stop();\n clear();\n }, [stop, clear]);\n\n const isSameChain =\n baseToken && quoteToken ? baseToken.chainId === quoteToken.chainId : true;\n\n const getHeaderText = () => {\n switch (view) {\n case 'wallet':\n return 'Wallet';\n case 'baseSelection':\n return 'Select Input Token';\n case 'quoteSelection':\n return 'Select Output Token';\n case 'baseChainSelection':\n case 'quoteChainSelection':\n return 'Select Chain';\n default:\n return 'Swap';\n }\n };\n\n const { assetMenuVariant, widgetType, customWalletUI } = useWidgetConfig();\n\n const isTokenSelection =\n view === 'baseSelection' || view === 'quoteSelection';\n const isChainSelection =\n view === 'baseChainSelection' || view === 'quoteChainSelection';\n\n const isSideBySide =\n assetMenuVariant === 'split' &&\n (widgetType === 'default' || widgetType === 'compact');\n const isInlineMenu =\n assetMenuVariant === 'split' &&\n (widgetType === 'horizontal' || widgetType === 'split');\n\n const isPanelMode = assetMenuVariant === 'default';\n const showSwapForm =\n view === 'swap' ||\n isTokenSelection ||\n isChainSelection ||\n view === 'wallet';\n\n const isTokenSelectionExiting =\n exitingOverlay === 'baseSelection' || exitingOverlay === 'quoteSelection';\n const isChainSelectionExiting =\n exitingOverlay === 'baseChainSelection' ||\n exitingOverlay === 'quoteChainSelection';\n\n const showTokenOverlay = isTokenSelection || isTokenSelectionExiting;\n const showChainOverlay = isChainSelection || isChainSelectionExiting;\n\n const isTokenOverlayActive = isTokenSelection && !isTransitioning;\n const isChainOverlayActive = isChainSelection && !isTransitioning;\n\n const effectiveTokenView = isTokenSelection ? view : exitingOverlay;\n const menuSide = effectiveTokenView === 'baseSelection' ? 'base' : 'quote';\n const menuOtherAsset =\n effectiveTokenView === 'baseSelection' ? quoteToken : baseToken;\n\n const effectiveChainView = isChainSelection ? view : exitingOverlay;\n const chainMenuSide =\n effectiveChainView === 'baseChainSelection' ? 'base' : 'quote';\n\n const overlayStyle = (isActive: boolean): React.CSSProperties => ({\n backgroundColor: 'var(--widget-background)',\n opacity: isActive ? 1 : 0,\n transform: isActive ? 'translateY(0)' : 'translateY(6px)',\n transition: 'opacity 200ms ease-in-out, transform 200ms ease-in-out',\n });\n\n const hasActiveOverlay =\n isPanelMode &&\n (isTokenSelection ||\n isChainSelection ||\n view === 'wallet' ||\n exitingOverlay != null);\n\n const formContent = isRegistryLoading ? (\n <SwapFormSkeleton />\n ) : widgetType === 'horizontal' ? (\n <Suspense fallback={null}>\n <SwapFormHorizontal\n onSwapComplete={onSwapComplete}\n onSwapInitiated={handleSwapInitiated}\n onBackToSwap={isInlineMenu ? handleBackToSwap : undefined}\n onMoreChainsClick={isInlineMenu ? handleMoreChainsClick : undefined}\n />\n </Suspense>\n ) : widgetType === 'split' ? (\n <Suspense fallback={null}>\n <SwapFormSplit\n onSwapComplete={onSwapComplete}\n onSwapInitiated={handleSwapInitiated}\n onBackToSwap={isInlineMenu ? handleBackToSwap : undefined}\n onMoreChainsClick={isInlineMenu ? handleMoreChainsClick : undefined}\n />\n </Suspense>\n ) : (\n <SwapForm onSwapComplete={onSwapComplete} onSwapInitiated={handleSwapInitiated} />\n );\n\n // When isSideBySide, cardStyles/cardWidth are passed from SwapWidget.\n // Each card renders its own border/bg/radius; the outer widget div is transparent.\n const cs = cardStyles ?? {};\n\n // Measure the left (form) card height so the right (selection) card matches exactly.\n const leftCardRef = useRef<HTMLDivElement>(null);\n const [leftCardHeight, setLeftCardHeight] = useState<number>(420);\n\n useEffect(() => {\n if (!isSideBySide) return;\n const el = leftCardRef.current;\n if (!el) return;\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n setLeftCardHeight(entry.contentRect.height);\n }\n });\n observer.observe(el);\n return () => observer.disconnect();\n }, [isSideBySide]);\n\n if (isSideBySide) {\n return (\n <>\n {/* ── Left card: the swap form ─────────────────── */}\n <div\n ref={leftCardRef}\n className=\"flex flex-col w-full overflow-hidden transition-colors duration-300\"\n style={{\n flex: '1 1 0',\n minWidth: 0,\n ...cs,\n }}\n >\n <SwapHeader\n headerText=\"Swap\"\n onBackClick={handleBackToSwap}\n isSameChain={isSameChain}\n isWrappingPair={isWrappingPair}\n isUnwrappingPair={isUnwrappingPair}\n hasLowLiquidity={liquidityError}\n hasInsufficientLiquidity={liquidityError}\n hasRoutingError={routingError}\n hasSizeCapError={sizeCapError}\n />\n <div className=\"overflow-hidden\">{formContent}</div>\n </div>\n\n {/* ── Right card: selection panel, height explicitly matched to the form card ─── */}\n {(showTokenOverlay || showChainOverlay) && (\n <div\n className=\"flex flex-col overflow-hidden shrink-0\"\n style={{\n width: cardWidth,\n height: `${leftCardHeight}px`,\n ...cs,\n ...(overlayStyle(\n (isTokenSelection || isChainSelection) && !isTransitioning,\n )),\n }}\n >\n {(isTokenSelection || isTokenSelectionExiting) ? (\n <Suspense fallback={null}>\n <AssetSelectionMenu\n toggle={handleBackToSwap}\n side={menuSide}\n otherAsset={menuOtherAsset}\n onMoreChainsClick={handleMoreChainsClick}\n selectedChainFilter={selectedChainFilterChainId}\n />\n </Suspense>\n ) : (\n <Suspense fallback={null}>\n <ChainSelectionMenu\n toggle={handleBackToSwap}\n side={chainMenuSide}\n onChainSelect={handleChainFilterSelect}\n />\n </Suspense>\n )}\n </div>\n )}\n </>\n );\n }\n\n return (\n <div\n className=\"flex flex-col w-full\"\n style={{\n overflow: 'hidden',\n position: 'relative',\n }}\n >\n <SwapHeader\n headerText={getHeaderText()}\n onBackClick={handleBackToSwap}\n isSameChain={isSameChain}\n isWrappingPair={isWrappingPair}\n isUnwrappingPair={isUnwrappingPair}\n hasLowLiquidity={liquidityError}\n hasInsufficientLiquidity={liquidityError}\n hasRoutingError={routingError}\n hasSizeCapError={sizeCapError}\n />\n\n <div className=\"relative overflow-hidden\">\n {showSwapForm && (\n <div\n className=\"overflow-hidden\"\n style={hasActiveOverlay ? { pointerEvents: 'none' } : undefined}\n >\n {formContent}\n </div>\n )}\n\n {(view === 'wallet' || exitingOverlay === 'wallet') && (\n <div\n className=\"absolute inset-0 overflow-hidden\"\n style={overlayStyle(view === 'wallet' && !isTransitioning)}\n >\n <Suspense fallback={null}>\n {customWalletUI === 'none' ? <WalletPlaceholderPanel /> : <WidgetWalletPanel />}\n </Suspense>\n </div>\n )}\n\n {isPanelMode && showTokenOverlay && (\n <div\n className=\"absolute inset-0 overflow-hidden\"\n style={overlayStyle(isTokenOverlayActive)}\n >\n <Suspense fallback={null}>\n <AssetSelectionMenu\n toggle={handleBackToSwap}\n side={menuSide}\n otherAsset={menuOtherAsset}\n onMoreChainsClick={handleMoreChainsClick}\n selectedChainFilter={selectedChainFilterChainId}\n />\n </Suspense>\n </div>\n )}\n\n {isPanelMode && showChainOverlay && (\n <div\n className=\"absolute inset-0 overflow-hidden\"\n style={overlayStyle(isChainOverlayActive)}\n >\n <Suspense fallback={null}>\n <ChainSelectionMenu\n toggle={handleBackToSwap}\n side={chainMenuSide}\n onChainSelect={handleChainFilterSelect}\n />\n </Suspense>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport const SwapContainer: React.FC<SwapContainerProps> = ({\n onSwapComplete,\n defaultBaseToken,\n defaultQuoteToken,\n onBaseTokenChange,\n onQuoteTokenChange,\n cardStyles,\n cardWidth,\n}) => {\n const { address: userAddress } = useWalletState();\n const recipient = useWidgetSwapUIStore((s) => s.recipient);\n\n return (\n <SwapFormProvider\n defaultBaseToken={defaultBaseToken}\n defaultQuoteToken={defaultQuoteToken}\n onBaseTokenChange={onBaseTokenChange}\n onQuoteTokenChange={onQuoteTokenChange}\n >\n <RfqProvider recipient={recipient}>\n <SwapContainerInner\n onSwapComplete={onSwapComplete}\n cardStyles={cardStyles}\n cardWidth={cardWidth}\n />\n </RfqProvider>\n </SwapFormProvider>\n );\n};\n","'use client';\n\nimport { type Asset, type ReviewOrderStep } from '../internal';\nimport { useWalletModal } from '../wallet/WalletModalContext';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { useShallow } from 'zustand/react/shallow';\nimport { useWidgetConfig } from '../context/WidgetConfigContext';\nimport { useRfq } from '../providers/RfqProvider';\nimport { useSwapFormContext } from '../providers/SwapFormProvider';\nimport { useWidgetSwapUIStore } from '../stores/swapUIStore';\nimport { useWalletState } from '../wallet/useWalletState';\nimport AssetAmountInput from './AssetAmountInput';\nimport AssetSelection from './AssetSelection';\nimport QuoteLoader from './QuoteLoader';\nimport RecipientForm from './RecipientForm';\nimport { SwapButton } from './states/SwapButton';\nimport TxStatusDisplay from './states/TxStatusDisplay';\n\ninterface ReviewActionProps {\n base: Asset;\n quote: Asset;\n baseAmount: number;\n quoteAmount: number;\n userAddress: string;\n}\n\ninterface SwapFormProps {\n onSwapComplete?: (orderHash: string) => void;\n onSwapInitiated?: () => void;\n}\n\nconst SwapForm: React.FC<SwapFormProps> = ({ onSwapComplete, onSwapInitiated }) => {\n const {\n web3ConnectionType,\n hasConnectHandler,\n lockBase,\n lockQuote,\n disableInverting,\n tokenDisplay,\n tokenBadgeOrientation,\n widgetType,\n } = useWidgetConfig();\n const isOverlayToken = tokenDisplay === 'pill' || tokenDisplay === 'ghost';\n const isCompactMode = widgetType === 'compact';\n const basePadding = isCompactMode ? 'px-4 pt-3 pb-1' : 'px-4 pt-4 pb-2';\n const quotePadding = isCompactMode ? 'px-4 pt-4 pb-1' : 'px-4 pt-6 pb-2';\n const {\n baseToken,\n quoteToken,\n baseAmount,\n quoteAmount,\n isBaseGasToken,\n isQuoteGasToken,\n isWrappingPair,\n isUnwrappingPair,\n baseBalance,\n quoteBalance,\n setBaseAmount,\n setQuoteAmount,\n swapTokens,\n clearForm,\n } = useSwapFormContext();\n\n const {\n rfqQuote,\n status: rfqStatus,\n handleInputChange,\n ensureForParams,\n stop,\n clear,\n refresh,\n } = useRfq();\n const { address: userAddress } = useWalletState();\n const { openConnectModal: openWalletModal } = useWalletModal();\n const { isRecipientInputOpen, txStatus } =\n useWidgetSwapUIStore(\n useShallow((state) => ({\n isRecipientInputOpen: state.isRecipientInputOpen,\n txStatus: state.txStatus,\n })),\n );\n\n const [reviewState, setReviewState] = useState<ReviewOrderStep | null>(null);\n const [trackedOrderHash, setTrackedOrderHash] = useState<string | null>(null);\n const isHandlingStaleRestart = useRef(false);\n const isPlacingOrder = false;\n\n const reviewActionProps = useMemo((): ReviewActionProps | null => {\n if (!baseToken || !quoteToken || typeof baseAmount !== 'number' || !quoteAmount || !userAddress) return null;\n if (parseFloat(baseBalance.formatted) < baseAmount) return null;\n return { base: baseToken, quote: quoteToken, baseAmount, quoteAmount, userAddress };\n }, [baseToken, quoteToken, baseAmount, quoteAmount, userAddress, baseBalance.formatted]);\n\n // Called by ReviewActionSignAndSubmitOrderRow on successful submission.\n const onOrderSubmitted = useCallback((orderHash: string) => {\n setTrackedOrderHash(orderHash);\n useWidgetSwapUIStore.getState().startTracking(orderHash);\n }, []);\n\n // Called by SwapButton on stale-quote restart — marks the restart so we\n // don't accidentally double-poll and calls refresh() to get a fresh quote.\n const onStaleQuoteRestart = useCallback(() => {\n isHandlingStaleRestart.current = true;\n refresh();\n }, [refresh]);\n\n useEffect(() => {\n if (reviewState !== null) return;\n if (!baseToken || !quoteToken) return;\n if (!baseAmount || baseAmount <= 0) {\n handleInputChange({ amount: null, inputToken: baseToken, outputToken: quoteToken, setOutputAmount: setQuoteAmount });\n return;\n }\n if (isWrappingPair || isUnwrappingPair) {\n setQuoteAmount(baseAmount);\n return;\n }\n handleInputChange({\n amount: baseAmount,\n inputToken: baseToken,\n outputToken: quoteToken,\n setOutputAmount: setQuoteAmount,\n });\n }, [\n reviewState,\n baseAmount,\n baseToken,\n quoteToken,\n isWrappingPair,\n isUnwrappingPair,\n handleInputChange,\n setQuoteAmount,\n ]);\n\n const handleToggleBaseSelection = useCallback(() => {\n useWidgetSwapUIStore.getState().setView('baseSelection');\n }, []);\n\n const handleToggleQuoteSelection = useCallback(() => {\n useWidgetSwapUIStore.getState().setView('quoteSelection');\n }, []);\n\n const handleInvert = useCallback(() => {\n swapTokens();\n setQuoteAmount(null);\n }, [swapTokens, setQuoteAmount]);\n\n const handleMax = useCallback(() => {\n if (!baseBalance.formatted || !baseToken || !quoteToken) return;\n const balNum = parseFloat(baseBalance.formatted);\n if (!balNum || balNum <= 0) return;\n const adjusted = balNum * 0.9999999999;\n if (isWrappingPair || isUnwrappingPair) {\n setBaseAmount(adjusted);\n setQuoteAmount(adjusted);\n clear();\n } else {\n setBaseAmount(adjusted);\n setQuoteAmount(null);\n ensureForParams({\n inputToken: baseToken,\n outputToken: quoteToken,\n inputAmount: adjusted.toString(),\n setOutputAmount: (amount) => setQuoteAmount(amount),\n });\n }\n }, [\n baseBalance.formatted,\n baseToken,\n quoteToken,\n isWrappingPair,\n isUnwrappingPair,\n setBaseAmount,\n setQuoteAmount,\n clear,\n ensureForParams,\n ]);\n\n const handleClear = useCallback(() => {\n clear();\n clearForm();\n }, [clear, clearForm]);\n\n const baseBalanceNum = baseBalance.formatted\n ? parseFloat(baseBalance.formatted)\n : null;\n const hasAmount = !!(baseAmount || quoteAmount);\n\n const baseUsd =\n baseToken?.price && baseAmount\n ? `$${(baseToken.price * baseAmount).toFixed(2)}`\n : '$0.00';\n const quoteUsd =\n quoteToken?.price && quoteAmount\n ? `$${(quoteToken.price * quoteAmount).toFixed(2)}`\n : '$0.00';\n\n const isShowingTxStatus =\n reviewState === 'trackingTx' &&\n !!trackedOrderHash &&\n !!baseToken &&\n !!quoteToken &&\n !!baseAmount &&\n !!quoteAmount;\n\n return (\n <div className=\"flex flex-col w-full\">\n {isShowingTxStatus &&\n trackedOrderHash &&\n baseToken &&\n quoteToken &&\n baseAmount &&\n quoteAmount ? (\n /* ── TX STATUS (replaces token sections during tracking) ── */\n <div className=\"overflow-hidden\">\n <TxStatusDisplay\n orderHash={trackedOrderHash}\n base={baseToken}\n quote={quoteToken}\n baseAmount={baseAmount}\n quoteAmount={quoteAmount}\n status={txStatus}\n />\n </div>\n ) : (\n <>\n {/* ── BASE TOKEN SECTION ───────────────────────────── */}\n <div\n className={`relative ${basePadding}`}\n style={{ borderBottom: '1px solid var(--widget-border)' }}\n >\n {isOverlayToken ? (\n isCompactMode ? (\n // compact + pill/ghost: side-by-side row, badge on side\n <div\n className={`flex items-center gap-2 mb-2 ${tokenBadgeOrientation === 'right' ? 'flex-row-reverse' : 'flex-row'}`}\n >\n <AssetSelection\n toggle={handleToggleBaseSelection}\n side=\"base\"\n asset={baseToken}\n isPlacingOrder={isPlacingOrder || lockBase}\n />\n <div className=\"flex-1 min-w-0\">\n <AssetAmountInput\n side=\"base\"\n asset={baseToken ?? null}\n otherAsset={quoteToken ?? null}\n isPlacingOrder={isPlacingOrder}\n isWrappingPair={isWrappingPair}\n isUnwrappingPair={isUnwrappingPair}\n />\n </div>\n </div>\n ) : (\n // default + pill/ghost: badge stacked above input, aligned to chosen side\n <div\n className={`flex flex-col ${tokenBadgeOrientation === 'right' ? 'items-end' : 'items-start'}`}\n >\n <AssetSelection\n toggle={handleToggleBaseSelection}\n side=\"base\"\n asset={baseToken}\n isPlacingOrder={isPlacingOrder || lockBase}\n />\n <AssetAmountInput\n side=\"base\"\n asset={baseToken ?? null}\n otherAsset={quoteToken ?? null}\n isPlacingOrder={isPlacingOrder}\n isWrappingPair={isWrappingPair}\n isUnwrappingPair={isUnwrappingPair}\n />\n </div>\n )\n ) : (\n <>\n <AssetSelection\n toggle={handleToggleBaseSelection}\n side=\"base\"\n asset={baseToken}\n isPlacingOrder={isPlacingOrder || lockBase}\n />\n <AssetAmountInput\n side=\"base\"\n asset={baseToken ?? null}\n otherAsset={quoteToken ?? null}\n isPlacingOrder={isPlacingOrder}\n isWrappingPair={isWrappingPair}\n isUnwrappingPair={isUnwrappingPair}\n />\n </>\n )}\n\n {/* USD value + MAX button */}\n <div className=\"mb-1 flex w-full flex-row items-center justify-between\">\n <p\n className=\"mono text-sm\"\n style={{ color: 'var(--widget-muted-foreground)' }}\n >\n {baseUsd}\n </p>\n {userAddress && baseBalanceNum !== null && baseBalanceNum > 0 && (\n <button\n type=\"button\"\n onClick={handleMax}\n disabled={isPlacingOrder}\n className=\"absolute bottom-3 right-4 flex items-center px-3 py-0.5 text-xs font-medium uppercase cursor-pointer disabled:opacity-40 disabled:cursor-not-allowed transition-colors bg-(--widget-primary) text-(--widget-primary-foreground) hover:bg-(--widget-foreground) hover:text-(--widget-card)\"\n style={{ borderRadius: 'var(--widget-radius)' }}\n >\n Max\n </button>\n )}\n </div>\n </div>\n\n {/* ── INVERT BUTTON (centered on border) ───────────── */}\n {!disableInverting && (\n <div className=\"flex justify-center -my-4 relative z-10\">\n <button\n type=\"button\"\n onClick={handleInvert}\n aria-label=\"Swap input and output tokens\"\n className=\"flex h-8 w-8 items-center justify-center rounded-full cursor-pointer transition-colors bg-(--widget-card) text-(--widget-muted-foreground) hover:bg-(--widget-secondary) hover:text-(--widget-foreground)\"\n style={{ border: '1px solid var(--widget-border)' }}\n >\n <span className=\"text-2xs\">↑</span>\n <span className=\"text-2xs\">↓</span>\n </button>\n </div>\n )}\n\n {/* ── QUOTE TOKEN SECTION ──────────────────────────── */}\n <div className={`relative ${quotePadding}`}>\n {isOverlayToken ? (\n isCompactMode ? (\n <div\n className={`flex items-center gap-2 ${tokenBadgeOrientation === 'right' ? 'flex-row-reverse' : 'flex-row'}`}\n >\n <AssetSelection\n toggle={handleToggleQuoteSelection}\n side=\"quote\"\n asset={quoteToken}\n isPlacingOrder={isPlacingOrder || lockQuote}\n />\n <div className=\"flex-1 min-w-0\">\n <AssetAmountInput\n side=\"quote\"\n asset={quoteToken ?? null}\n otherAsset={baseToken ?? null}\n isPlacingOrder={isPlacingOrder}\n isWrappingPair={isWrappingPair}\n isUnwrappingPair={isUnwrappingPair}\n />\n </div>\n </div>\n ) : (\n <div\n className={`flex flex-col ${tokenBadgeOrientation === 'right' ? 'items-end' : 'items-start'}`}\n >\n <AssetSelection\n toggle={handleToggleQuoteSelection}\n side=\"quote\"\n asset={quoteToken}\n isPlacingOrder={isPlacingOrder || lockQuote}\n />\n <AssetAmountInput\n side=\"quote\"\n asset={quoteToken ?? null}\n otherAsset={baseToken ?? null}\n isPlacingOrder={isPlacingOrder}\n isWrappingPair={isWrappingPair}\n isUnwrappingPair={isUnwrappingPair}\n />\n </div>\n )\n ) : (\n <>\n <AssetSelection\n toggle={handleToggleQuoteSelection}\n side=\"quote\"\n asset={quoteToken}\n isPlacingOrder={isPlacingOrder || lockQuote}\n />\n <AssetAmountInput\n side=\"quote\"\n asset={quoteToken ?? null}\n otherAsset={baseToken ?? null}\n isPlacingOrder={isPlacingOrder}\n isWrappingPair={isWrappingPair}\n isUnwrappingPair={isUnwrappingPair}\n />\n </>\n )}\n\n {/* USD value + CLEAR button */}\n <div className=\"flex w-full flex-row items-center justify-between\">\n <p\n className=\"mono text-sm\"\n style={{ color: 'var(--widget-muted-foreground)' }}\n >\n {quoteUsd}\n </p>\n {hasAmount && (\n <button\n type=\"button\"\n onClick={handleClear}\n disabled={isPlacingOrder}\n className=\"absolute bottom-2 right-4 flex items-center px-3 py-0.5 text-xs font-medium uppercase cursor-pointer disabled:opacity-40 disabled:cursor-not-allowed transition-colors text-(--widget-muted-foreground) hover:bg-(--widget-secondary)\"\n style={{ borderRadius: 'var(--widget-radius)' }}\n >\n Clear\n </button>\n )}\n </div>\n </div>\n\n {/* ── RECIPIENT FORM (animated maxHeight, always mounted) ── */}\n <div\n className=\"flex flex-row items-center w-full overflow-hidden\"\n style={{\n borderTop: isRecipientInputOpen\n ? '1px solid var(--widget-border)'\n : 'none',\n maxHeight: isRecipientInputOpen ? '60px' : '0px',\n opacity: isRecipientInputOpen ? 1 : 0,\n transition: 'max-height 0.3s ease, opacity 0.3s ease',\n }}\n >\n <RecipientForm />\n </div>\n\n {/* ── QUOTE LOADER with borders ── */}\n <div\n className=\"px-4\"\n style={{\n borderTop: '1px solid var(--widget-border)',\n borderBottom: '1px solid var(--widget-border)',\n }}\n >\n <QuoteLoader />\n </div>\n </>\n )}\n\n {/* ── SWAP / CONNECT BUTTON ─────────────────────────── */}\n <div className={`relative ${isShowingTxStatus ? 'px-0' : 'px-4'} ${isCompactMode ? 'py-2' : 'py-4'}`}>\n {userAddress &&\n baseToken &&\n quoteToken &&\n baseAmount &&\n baseAmount > 0 ? (\n <SwapButton\n base={baseToken}\n baseAmount={baseAmount}\n quote={quoteToken}\n quoteAmount={quoteAmount ?? 0}\n userAddress={userAddress}\n isWrappingPair={isWrappingPair}\n isUnwrappingPair={isUnwrappingPair}\n isBaseGasToken={isBaseGasToken}\n isQuoteGasToken={isQuoteGasToken}\n reviewActionProps={reviewActionProps}\n reviewState={reviewState}\n setReviewState={setReviewState}\n trackedOrderHash={trackedOrderHash}\n setTrackedOrderHash={setTrackedOrderHash}\n onSwapComplete={onSwapComplete}\n onSwapInitiated={onSwapInitiated}\n onOrderSubmitted={onOrderSubmitted}\n onStaleQuoteRestart={onStaleQuoteRestart}\n txStatus={txStatus}\n />\n ) : !userAddress && hasConnectHandler ? (\n <button\n onClick={() => openWalletModal()}\n className={`w-full ${isCompactMode ? 'py-2' : 'py-3'} text-sm font-medium cursor-pointer transition-opacity hover:opacity-80`}\n style={{\n backgroundColor: 'var(--widget-primary)',\n color: 'var(--widget-primary-foreground)',\n borderRadius: 'var(--widget-radius)',\n }}\n >\n Connect Wallet\n </button>\n ) : (\n <button\n disabled\n className={`w-full ${isCompactMode ? 'py-2' : 'py-3'} text-sm font-medium transition-colors disabled:opacity-40 cursor-not-allowed`}\n style={{\n backgroundColor: 'var(--widget-primary)',\n color: 'var(--widget-primary-foreground)',\n borderRadius: 'var(--widget-radius)',\n }}\n >\n {!userAddress ? 'Connect Wallet' : 'Enter Amount'}\n </button>\n )}\n </div>\n </div>\n );\n};\n\nexport default SwapForm;\n","'use client';\n\nimport React from 'react';\n\nexport const SwapFormSkeleton: React.FC = () => (\n <div className=\"flex flex-col w-full\">\n {/* Base section */}\n <div\n className=\"relative px-4 pt-4 pb-2\"\n style={{ borderBottom: '1px solid var(--widget-border)' }}\n >\n {/* Token selector row */}\n <div\n className=\"h-12 w-full animate-pulse\"\n style={{ backgroundColor: 'var(--widget-secondary)', borderRadius: '0.25rem' }}\n />\n {/* Amount input area */}\n <div\n className=\"mt-2 h-20 w-2/3 animate-pulse\"\n style={{ backgroundColor: 'var(--widget-secondary)', opacity: 0.5, borderRadius: '0.25rem' }}\n />\n {/* USD value row */}\n <div className=\"mt-1 mb-1 flex w-full items-center justify-between\">\n <div\n className=\"h-4 w-12 animate-pulse\"\n style={{ backgroundColor: 'var(--widget-secondary)', opacity: 0.4, borderRadius: '0.25rem' }}\n />\n </div>\n </div>\n\n {/* Invert button (centered on border) */}\n <div className=\"flex justify-center -my-4 relative z-10\">\n <div\n className=\"h-8 w-8\"\n style={{\n border: '1px solid var(--widget-border)',\n backgroundColor: 'var(--widget-card)',\n borderRadius: '9999px',\n }}\n />\n </div>\n\n {/* Quote section */}\n <div className=\"relative px-4 pt-6 pb-2\">\n {/* Token selector row */}\n <div\n className=\"h-12 w-full animate-pulse\"\n style={{ backgroundColor: 'var(--widget-secondary)', borderRadius: '0.25rem' }}\n />\n {/* Amount input area */}\n <div\n className=\"mt-2 h-20 w-2/3 animate-pulse\"\n style={{ backgroundColor: 'var(--widget-secondary)', opacity: 0.5, borderRadius: '0.25rem' }}\n />\n {/* USD value row */}\n <div className=\"mt-1 mb-1 flex w-full items-center justify-between\">\n <div\n className=\"h-4 w-12 animate-pulse\"\n style={{ backgroundColor: 'var(--widget-secondary)', opacity: 0.4, borderRadius: '0.25rem' }}\n />\n </div>\n </div>\n\n {/* Quote loader bar */}\n <div\n className=\"px-4\"\n style={{\n height: '28px',\n borderTop: '1px solid var(--widget-border)',\n borderBottom: '1px solid var(--widget-border)',\n }}\n />\n\n {/* Swap button */}\n <div className=\"relative px-4 py-4\">\n <div\n className=\"w-full animate-pulse\"\n style={{\n height: '44px',\n backgroundColor: 'var(--widget-secondary)',\n borderRadius: 'var(--widget-radius)',\n opacity: 0.6,\n }}\n />\n </div>\n </div>\n);\n","'use client';\n\nimport { useTextScramble } from '../internal/hooks/useTextScramble';\nimport { useWalletState } from '../wallet/useWalletState';\nimport { useWalletModal } from '../wallet/WalletModalContext';\nimport { useEffect, useState } from 'react';\nimport { useShallow } from 'zustand/react/shallow';\nimport { useWidgetConfig } from '../context/WidgetConfigContext';\nimport { useWidgetSwapUIStore } from '../stores/swapUIStore';\n\ninterface SwapHeaderProps {\n headerText: string;\n onBackClick?: () => void;\n isSameChain?: boolean;\n isWrappingPair?: boolean;\n isUnwrappingPair?: boolean;\n hasLowLiquidity?: boolean;\n hasInsufficientLiquidity?: boolean;\n hasRoutingError?: boolean;\n hasSizeCapError?: boolean;\n}\n\nconst TextScrambleDisplay = ({\n targetText,\n isError,\n}: {\n targetText: string;\n isError: boolean;\n}) => {\n const { displayText, suffix, characterColors } = useTextScramble(\n targetText,\n isError,\n );\n\n return (\n <>\n {displayText.split('').map((char, index) => (\n <span\n key={index}\n style={\n characterColors[index]\n ? { color: 'var(--widget-destructive)' }\n : undefined\n }\n >\n {char}\n </span>\n ))}\n <span\n style={{\n color: isError\n ? 'var(--widget-destructive)'\n : 'var(--widget-muted-foreground)',\n opacity: isError ? 0.5 : 1,\n }}\n >\n {suffix}\n </span>\n </>\n );\n};\n\nconst SwapHeader: React.FC<SwapHeaderProps> = ({\n headerText,\n onBackClick,\n isSameChain,\n isWrappingPair,\n isUnwrappingPair,\n hasLowLiquidity,\n hasInsufficientLiquidity,\n hasRoutingError,\n hasSizeCapError,\n}) => {\n const view = useWidgetSwapUIStore((state) => state.view);\n\n const {\n isRecipientInputOpen,\n hasAllowanceError,\n hoveredChainName,\n isTrackingTx,\n txStatus,\n walletTab,\n } = useWidgetSwapUIStore(\n useShallow((state) => ({\n isRecipientInputOpen: state.isRecipientInputOpen,\n hasAllowanceError: state.hasAllowanceError,\n hoveredChainName: state.hoveredChainName,\n isTrackingTx: state.isTrackingTx,\n txStatus: state.txStatus,\n walletTab: state.walletTab,\n })),\n );\n\n const { web3ConnectionType, swapHeaderVariant, customWalletUI, walletButtonEnabled } = useWidgetConfig();\n const { isConnected } = useWalletState();\n const { openAccountModal } = useWalletModal();\n\n const [mounted, setMounted] = useState(false);\n useEffect(() => setMounted(true), []);\n\n const [isRecipientButtonHovered, setIsRecipientButtonHovered] =\n useState(false);\n\n const scrambleKey = `${view}-${isRecipientButtonHovered}-${isRecipientInputOpen}-${hoveredChainName || 'none'}`;\n\n const getHeaderText = () => {\n if (isTrackingTx && txStatus) {\n switch (txStatus) {\n case 'pending':\n return 'Trade Pending';\n case 'received':\n return 'Trade Received';\n case 'completed':\n return 'Trade Filled';\n case 'failed':\n return 'Trade Failed';\n case 'cancelled':\n return 'Trade Cancelled';\n default:\n return 'Processing Trade';\n }\n }\n\n if (\n hoveredChainName &&\n (view === 'baseSelection' ||\n view === 'quoteSelection' ||\n view === 'baseChainSelection' ||\n view === 'quoteChainSelection')\n ) {\n return hoveredChainName;\n }\n\n if (view === 'swap' && isRecipientButtonHovered) {\n return isRecipientInputOpen\n ? 'Remove Custom Recipient'\n : 'Add Custom Recipient';\n }\n\n switch (view) {\n case 'wallet':\n return 'Wallet';\n case 'baseSelection':\n return 'Select Source Token';\n case 'quoteSelection':\n return 'Select Destination Token';\n case 'baseChainSelection':\n return 'Select Source Chain';\n case 'quoteChainSelection':\n return 'Select Destination Chain';\n default:\n if (view === 'swap') {\n if (hasAllowanceError && !isWrappingPair && !isUnwrappingPair)\n return 'Allowance check failed';\n if (hasSizeCapError && !isWrappingPair && !isUnwrappingPair)\n return 'Size limit exceeded';\n if (hasInsufficientLiquidity && !isWrappingPair && !isUnwrappingPair)\n return 'Insufficient Liquidity';\n if (hasRoutingError && !isWrappingPair && !isUnwrappingPair)\n return 'Route Not Found';\n if (hasLowLiquidity && !isWrappingPair && !isUnwrappingPair)\n return 'High Price Impact';\n }\n if (isSameChain && !isWrappingPair && !isUnwrappingPair) return 'Swap';\n if (isWrappingPair) return 'Wrap';\n if (isUnwrappingPair) return 'Unwrap';\n return headerText;\n }\n };\n\n const targetHeaderText = getHeaderText();\n\n const isErrorMessage =\n !isTrackingTx &&\n view === 'swap' &&\n !isRecipientButtonHovered &&\n ((hasAllowanceError && !isWrappingPair && !isUnwrappingPair) ||\n (hasSizeCapError && !isWrappingPair && !isUnwrappingPair) ||\n (hasInsufficientLiquidity && !isWrappingPair && !isUnwrappingPair) ||\n (hasRoutingError && !isWrappingPair && !isUnwrappingPair) ||\n (hasLowLiquidity && !isWrappingPair && !isUnwrappingPair));\n\n const statusVarMap: Record<string, string> = {\n pending: 'var(--widget-status-pending)',\n received: 'var(--widget-status-received)',\n completed: 'var(--widget-status-completed)',\n failed: 'var(--widget-status-failed)',\n cancelled: 'var(--widget-status-failed)',\n };\n\n const getHeaderTextColor = () => {\n if (!isTrackingTx || !txStatus) return null;\n return statusVarMap[txStatus] ?? null;\n };\n\n const renderRightComponent = () => {\n if (isTrackingTx) return null;\n\n if (view === 'swap') {\n return (\n <div className=\"flex items-center gap-2\">\n {walletButtonEnabled && mounted && web3ConnectionType === 'custom' && isConnected && (\n <button\n onClick={() => {\n if (customWalletUI === 'provider' && openAccountModal) {\n openAccountModal();\n } else {\n useWidgetSwapUIStore.getState().setView('wallet');\n }\n }}\n aria-label=\"Open wallet\"\n className=\"size-4 -translate-y-0.5 flex cursor-pointer items-center justify-center rounded-full transition-colors text-(--widget-muted-foreground) opacity-60 hover:text-(--widget-foreground) hover:opacity-100\"\n >\n <svg\n className=\"size-3.5\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\"2\" y=\"5\" width=\"20\" height=\"15\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M16 12C16 11.4477 16.4477 11 17 11H21V13H17C16.4477 13 16 12.5523 16 12Z\" fill=\"currentColor\" />\n <path d=\"M2 9H22\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n </button>\n )}\n {walletButtonEnabled && mounted && web3ConnectionType === 'standalone' && isConnected && openAccountModal && (\n <button\n onClick={() => openAccountModal()}\n aria-label=\"Open account\"\n className=\"size-4 -translate-y-0.5 flex cursor-pointer items-center justify-center rounded-full transition-colors text-(--widget-muted-foreground) opacity-60 hover:text-(--widget-foreground) hover:opacity-100\"\n >\n <svg\n className=\"size-3.5\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\"2\" y=\"5\" width=\"20\" height=\"15\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M16 12C16 11.4477 16.4477 11 17 11H21V13H17C16.4477 13 16 12.5523 16 12Z\" fill=\"currentColor\" />\n <path d=\"M2 9H22\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n </button>\n )}\n <button\n onClick={() =>\n useWidgetSwapUIStore.getState().toggleRecipientInput()\n }\n onMouseEnter={() => setIsRecipientButtonHovered(true)}\n onMouseLeave={() => setIsRecipientButtonHovered(false)}\n aria-label={\n isRecipientInputOpen\n ? 'Remove custom recipient'\n : 'Add custom recipient'\n }\n className={`size-4 -translate-y-0.5 flex cursor-pointer items-center justify-center rounded-full transition-colors hover:text-(--widget-foreground) hover:opacity-100 ${\n isRecipientInputOpen\n ? 'text-(--widget-destructive) opacity-80'\n : 'text-(--widget-muted-foreground) opacity-60'\n }`}\n >\n <svg\n className=\"size-3.5\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M2 7.75C1.58579 7.75 1.25 8.08579 1.25 8.5C1.25 8.91421 1.58579 9.25 2 9.25V7.75ZM2 8.5V9.25H13.5V8.5V7.75H2V8.5Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M6 16.5H8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeMiterlimit=\"10\"\n strokeLinecap=\"butt\"\n strokeLinejoin=\"miter\"\n />\n <path\n d=\"M10.5 16.5H14.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeMiterlimit=\"10\"\n strokeLinecap=\"butt\"\n strokeLinejoin=\"miter\"\n />\n <path\n d=\"M22 12.03V16.11C22 20.5 22 20.5 17.56 20.5H6.44C2 20.5 2 20.5 2 16.11V7.89C2 3.5 2 3.5 6.44 3.5H13.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"miter\"\n />\n <g\n style={{\n transform: `rotate(${isRecipientInputOpen ? '45deg' : '0deg'})`,\n transformOrigin: '18.75px 6.75px',\n transition: 'transform 150ms ease-out',\n }}\n >\n <path\n d=\"M15 6.75H22.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M18.75 10.5V3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n </g>\n </svg>\n </button>\n </div>\n );\n }\n\n return (\n <button\n onClick={() =>\n onBackClick\n ? onBackClick()\n : useWidgetSwapUIStore.getState().setView('swap')\n }\n className=\"flex cursor-pointer items-center justify-center whitespace-nowrap h-6 transition-colors text-(--widget-muted-foreground) opacity-70 hover:text-(--widget-foreground) hover:opacity-100\"\n >\n <span className=\"pr-1\">←</span>\n <span className=\"text-sm\">Back</span>\n </button>\n );\n };\n\n const headerTextColor = getHeaderTextColor();\n\n // ── none variant: render nothing ─────────────────────────────────────────\n if (swapHeaderVariant === 'none') return null;\n\n return (\n <div className=\"w-full pt-3 px-2 mono text-base flex flex-row justify-between h-6 shrink-0\">\n {view === 'wallet' ? (\n <div className=\"flex items-center gap-1 mono uppercase -translate-y-0.5 text-xs\">\n <button\n type=\"button\"\n onClick={() =>\n useWidgetSwapUIStore.getState().setWalletTab('wallet')\n }\n className=\"cursor-pointer transition-colors\"\n style={{\n color:\n walletTab === 'wallet'\n ? 'var(--widget-foreground)'\n : 'var(--widget-muted-foreground)',\n }}\n >\n <span style={{ color: 'var(--widget-muted-foreground)' }}>\n {'>> '}\n </span>\n <span>Wallet</span>\n </button>\n <span style={{ color: 'var(--widget-foreground)', opacity: 0.4 }}>\n {'>>'}\n </span>\n <button\n type=\"button\"\n onClick={() =>\n useWidgetSwapUIStore.getState().setWalletTab('activity')\n }\n className=\"cursor-pointer transition-colors\"\n style={{\n color:\n walletTab === 'activity'\n ? 'var(--widget-foreground)'\n : 'var(--widget-muted-foreground)',\n }}\n >\n Activity\n </button>\n </div>\n ) : (\n <div className=\"mono uppercase -translate-y-0.5 text-xs flex items-center\">\n <span\n className=\"mr-1.5\"\n style={{ color: 'var(--widget-muted-foreground)', opacity: 0.4 }}\n >\n {'>> '}\n </span>\n <span\n className=\"relative\"\n style={{ color: headerTextColor || 'var(--widget-foreground)' }}\n key={scrambleKey}\n >\n <TextScrambleDisplay\n targetText={targetHeaderText}\n isError={isErrorMessage ?? false}\n />\n </span>\n </div>\n )}\n <div className=\"flex flex-row items-center\">{renderRightComponent()}</div>\n </div>\n );\n};\n\nexport default SwapHeader;\n","'use client';\n\nimport { createContext, useContext, type ReactNode } from 'react';\nimport { type WidgetTheme, defaultDarkTheme } from './types';\n\nconst WidgetThemeContext = createContext<WidgetTheme>(defaultDarkTheme);\n\ninterface WidgetThemeProviderProps {\n theme: WidgetTheme;\n children: ReactNode;\n}\n\nexport function WidgetThemeProvider({ theme, children }: WidgetThemeProviderProps) {\n return (\n <WidgetThemeContext.Provider value={theme}>\n {children}\n </WidgetThemeContext.Provider>\n );\n}\n\nexport function useWidgetTheme() {\n return useContext(WidgetThemeContext);\n}\n","export interface WidgetTheme {\n background: string;\n foreground: string;\n card: string;\n 'card-foreground': string;\n popover: string;\n 'popover-foreground': string;\n primary: string;\n 'primary-foreground': string;\n secondary: string;\n 'secondary-foreground': string;\n muted: string;\n 'muted-foreground': string;\n accent: string;\n 'accent-foreground': string;\n destructive: string;\n 'destructive-foreground': string;\n border: string;\n input: string;\n ring: string;\n\n radius: string;\n 'border-style'?: string;\n\n 'font-sans'?: string;\n 'font-mono'?: string;\n\n 'shadow-color'?: string;\n 'shadow-opacity'?: string;\n 'shadow-blur'?: string;\n 'shadow-spread'?: string;\n 'shadow-offset-x'?: string;\n 'shadow-offset-y'?: string;\n\n 'letter-spacing'?: string;\n\n 'status-pending'?: string;\n 'status-received'?: string;\n 'status-completed'?: string;\n 'status-failed'?: string;\n}\n\nexport const defaultLightTheme: WidgetTheme = {\n background: '#ffffff',\n foreground: '#0a0a0a',\n card: '#ffffff',\n 'card-foreground': '#0a0a0a',\n popover: '#ffffff',\n 'popover-foreground': '#0a0a0a',\n primary: '#171717',\n 'primary-foreground': '#fafafa',\n secondary: '#f5f5f5',\n 'secondary-foreground': '#171717',\n muted: '#f5f5f5',\n 'muted-foreground': '#737373',\n accent: '#f5f5f5',\n 'accent-foreground': '#171717',\n destructive: '#e7000b',\n 'destructive-foreground': '#ffffff',\n border: '#e5e5e5',\n input: '#e5e5e5',\n ring: '#a1a1a1',\n radius: '0.625rem',\n 'border-style': 'dotted',\n 'status-pending': '#a1a1aa',\n 'status-received': '#f59e0b',\n 'status-completed': '#10b981',\n 'status-failed': '#ef4444',\n};\n\nexport const defaultDarkTheme: WidgetTheme = {\n background: '#0a0a0a',\n foreground: '#fafafa',\n card: '#171717',\n 'card-foreground': '#fafafa',\n popover: '#262626',\n 'popover-foreground': '#fafafa',\n primary: '#e5e5e5',\n 'primary-foreground': '#171717',\n secondary: '#262626',\n 'secondary-foreground': '#fafafa',\n muted: '#262626',\n 'muted-foreground': '#a1a1a1',\n accent: '#404040',\n 'accent-foreground': '#fafafa',\n destructive: '#ff6467',\n 'destructive-foreground': '#fafafa',\n border: '#282828',\n input: '#343434',\n ring: '#737373',\n radius: '0.625rem',\n 'border-style': 'dotted',\n 'status-pending': '#a1a1aa',\n 'status-received': '#fbbf24',\n 'status-completed': '#2dd4bf',\n 'status-failed': '#fb7185',\n};\n\nexport function themeToCSS(theme: WidgetTheme): Record<string, string> {\n const vars: Record<string, string> = {\n '--widget-background': theme.background,\n '--widget-foreground': theme.foreground,\n '--widget-card': theme.card,\n '--widget-card-foreground': theme['card-foreground'],\n '--widget-popover': theme.popover,\n '--widget-popover-foreground': theme['popover-foreground'],\n '--widget-primary': theme.primary,\n '--widget-primary-foreground': theme['primary-foreground'],\n '--widget-secondary': theme.secondary,\n '--widget-secondary-foreground': theme['secondary-foreground'],\n '--widget-muted': theme.muted,\n '--widget-muted-foreground': theme['muted-foreground'],\n '--widget-accent': theme.accent,\n '--widget-accent-foreground': theme['accent-foreground'],\n '--widget-destructive': theme.destructive,\n '--widget-destructive-foreground': theme['destructive-foreground'],\n '--widget-border': theme.border,\n '--widget-input': theme.input,\n '--widget-ring': theme.ring,\n '--widget-radius': theme.radius,\n '--widget-border-style': theme['border-style'] || 'dotted',\n };\n\n vars['--widget-font-sans'] = theme['font-sans'] || 'inherit';\n vars['--widget-font-mono'] = theme['font-mono'] || 'inherit';\n vars['--widget-shadow-color'] = theme['shadow-color'] || 'oklch(0 0 0)';\n vars['--widget-shadow-opacity'] = theme['shadow-opacity'] || '0.1';\n vars['--widget-shadow-blur'] = theme['shadow-blur'] || '3px';\n vars['--widget-shadow-spread'] = theme['shadow-spread'] || '0px';\n vars['--widget-shadow-offset-x'] = theme['shadow-offset-x'] || '0';\n vars['--widget-shadow-offset-y'] = theme['shadow-offset-y'] || '1px';\n vars['--widget-letter-spacing'] = theme['letter-spacing'] || 'normal';\n\n vars['--widget-status-pending'] = theme['status-pending'] || '#a1a1aa';\n vars['--widget-status-received'] = theme['status-received'] || '#fbbf24';\n vars['--widget-status-completed'] = theme['status-completed'] || '#2dd4bf';\n vars['--widget-status-failed'] = theme['status-failed'] || '#fb7185';\n\n return vars;\n}\n","'use client';\n\nimport { useWalletModal } from './WalletModalContext';\nimport { useWalletState } from './useWalletState';\n\nexport function ConnectButton() {\n const { openConnectModal } = useWalletModal();\n const { isConnected, address } = useWalletState();\n\n const label = isConnected && address\n ? `${address.slice(0, 6)}...${address.slice(-4)}`\n : 'Connect';\n\n return (\n <button\n type=\"button\"\n onClick={() => openConnectModal()}\n className=\"h-8 cursor-pointer px-3 text-xs font-bold uppercase tracking-wide transition-colors duration-150 border border-border rounded-sm bg-card text-foreground hover:bg-secondary hover:border-foreground/20\"\n >\n {label}\n </button>\n );\n}\n","import { getAllChainConfigs, staticChainsConfig, type StaticChainConfig } from '../../internal';\nimport type { Chain } from 'wagmi/chains';\nimport { http, fallback } from 'wagmi';\n\nexport function buildTransports(\n rpcOverrides?: Partial<Record<number, string | string[]>>,\n) {\n const chainEntries = Object.entries(staticChainsConfig) as [string, StaticChainConfig][];\n return Object.fromEntries(\n chainEntries.map(([id, c]) => {\n const override = rpcOverrides?.[Number(id)];\n const overrideUrls = override\n ? Array.isArray(override) ? override : [override]\n : [];\n const urls = overrideUrls.length > 0\n ? [...overrideUrls, ...c.rpcUrls]\n : c.rpcUrls;\n return [\n id,\n urls.length > 1\n ? fallback(urls.map((url) => http(url, { batch: { batchSize: 50, wait: 50 } })))\n : http(urls[0], { batch: { batchSize: 50, wait: 50 } }),\n ];\n }),\n );\n}\n\nexport const wagmiChains = getAllChainConfigs().map((c) => c.wagmiChain) as [Chain, ...Chain[]];\n","'use client';\n\nimport { useTokenData, getChainKeyToIdMapping } from '../internal';\nimport { useMemo } from 'react';\n\nexport const useTokensForChain = (chainId: number) => {\n const { tokenRegistry, isLoadingRegistry, error } = useTokenData();\n\n const tokens = useMemo(() => {\n return tokenRegistry.filter((token) => token.chainId === chainId);\n }, [tokenRegistry, chainId]);\n\n return { tokens, isLoading: isLoadingRegistry, error };\n};\n\nexport const useIsTokenSupported = (address: string, chainId: number) => {\n const { tokenRegistry } = useTokenData();\n\n return useMemo(() => {\n if (!address || !tokenRegistry.length) return false;\n return tokenRegistry.some(\n (token) =>\n token.address.toLowerCase() === address.toLowerCase() &&\n token.chainId === chainId,\n );\n }, [tokenRegistry, address, chainId]);\n};\n\nexport const useTokenByAddress = (address: string, chainId: number) => {\n const { getToken } = useTokenData();\n\n return useMemo(() => {\n if (!address || !chainId) return undefined;\n return getToken(chainId, address);\n }, [getToken, address, chainId]);\n};\n\nexport const SUPPORTED_CHAINS = getChainKeyToIdMapping();\n"]}
|