@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/chunk-HXOGJSAI.cjs","../src/hooks/useBalanceEventListener.ts","../src/providers/RfqProvider.tsx","../src/wallet/WalletModalContext.tsx","../src/components/AssetAmountInput.tsx","../src/components/AssetSelection.tsx","../src/components/RecipientForm.tsx","../src/lib/pollOrderStatus.ts","../src/hooks/useOrderStatusPolling.ts","../src/wallet/TransactionRegistryContext.tsx","../src/lib/signSwap.ts","../src/lib/submitTracker.ts","../src/queries/useUnwrapToken.ts","../src/queries/useWrapToken.ts","../src/components/states/SwapButton.tsx","../src/wallet/useTransactionTracker.ts","../src/components/states/ReviewActionChainSwitchRow.tsx","../src/components/states/ReviewActionSignAndSubmitOrderRow.tsx","../src/components/CountDown.tsx","../src/components/states/ReviewActionTxRow.tsx","../src/components/states/ReviewActionUnwrapGasToken.tsx","../src/components/states/ReviewActionWrapGasToken.tsx","../src/components/states/TxStatusDisplay.tsx"],"names":["useRef","useCallback","createContext","useContext","jsx","jsxs","useState","useMutation","wethAbi","useConfig","waitForTransactionReceipt","useChainId","useEffect","useAccount","useSwitchChain","ComponentStep","parseUnits","useWriteContract"],"mappings":"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","file":"/Users/flooreyes/mega-swap-widget/dist/chunk-HXOGJSAI.cjs","sourcesContent":[null,"'use client';\n\nimport {\n type Asset,\n type WalletBalanceResponse,\n balanceKeys,\n fetchSwapBalances,\n getChainConfig,\n} from '../internal';\nimport { useWalletState } from '../wallet/useWalletState';\nimport { useEnabledChainIds } from './useEnabledChainIds';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useCallback, useEffect, useRef } from 'react';\n\ninterface BalanceUpdateEvent {\n type: 'swap' | 'wrap' | 'unwrap';\n tokens: Array<{ asset: Asset; userAddress: string }>;\n}\n\nfunction getRefetchDelay(chainIds: number[]): number {\n const MIN_DELAY = 1_000;\n const MAX_DELAY = 5_000;\n const BUFFER = 1_000;\n if (chainIds.length === 0) return 5_000;\n const maxBlockTime = Math.max(\n ...chainIds.map((id) => getChainConfig(id)?.blockTimeMs ?? 2_000),\n );\n return Math.min(MAX_DELAY, Math.max(MIN_DELAY, maxBlockTime * 2 + BUFFER));\n}\n\nexport const useBalanceEventListener = () => {\n const { address: userAddress } = useWalletState();\n const availableChainIds = useEnabledChainIds();\n const queryClient = useQueryClient();\n const pendingTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const mountedRef = useRef(true);\n\n const triggerBalanceUpdate = useCallback(\n (event: BalanceUpdateEvent) => {\n if (!userAddress) return;\n\n const chainIds = [...new Set(event.tokens.map((t) => t.asset.chainId))];\n const delay = getRefetchDelay(chainIds);\n\n if (pendingTimerRef.current) {\n clearTimeout(pendingTimerRef.current);\n pendingTimerRef.current = null;\n }\n\n pendingTimerRef.current = setTimeout(async () => {\n pendingTimerRef.current = null;\n if (!mountedRef.current) return;\n try {\n const tokens = event.tokens.map((t) => ({\n chainId: t.asset.chainId,\n tokenAddress: t.asset.address,\n }));\n\n const swapResult = await fetchSwapBalances(userAddress, tokens);\n if (swapResult.balances.length === 0) return;\n\n if (event.tokens.length >= 2) {\n const base = event.tokens[0].asset;\n const quote = event.tokens[1].asset;\n const swapKey = balanceKeys.swap(\n userAddress, base.chainId, base.address, quote.chainId, quote.address,\n );\n queryClient.setQueryData(swapKey, swapResult);\n }\n\n const bulkKey = balanceKeys.bulk(userAddress, availableChainIds);\n const existingBulk = queryClient.getQueryData<WalletBalanceResponse>(bulkKey);\n\n if (existingBulk) {\n const updatedBalances = existingBulk.balances.map((existing) => {\n const updated = swapResult.balances.find(\n (b) => b.chainId === existing.chainId && b.token.toLowerCase() === existing.token.toLowerCase(),\n );\n return updated ?? existing;\n });\n for (const newBalance of swapResult.balances) {\n if (!updatedBalances.some(\n (b) => b.chainId === newBalance.chainId && b.token.toLowerCase() === newBalance.token.toLowerCase(),\n )) updatedBalances.push(newBalance);\n }\n for (const eventToken of event.tokens) {\n const inResult = swapResult.balances.some(\n (b) =>\n b.chainId === eventToken.asset.chainId &&\n b.token.toLowerCase() === eventToken.asset.address.toLowerCase(),\n );\n if (!inResult) {\n const idx = updatedBalances.findIndex(\n (b) =>\n b.chainId === eventToken.asset.chainId &&\n b.token.toLowerCase() === eventToken.asset.address.toLowerCase(),\n );\n if (idx !== -1) {\n updatedBalances[idx] = { ...updatedBalances[idx], balance: '0', shiftedBalance: '0' };\n }\n }\n }\n queryClient.setQueryData(bulkKey, { balances: updatedBalances });\n }\n } catch { /* next interaction will refetch */ }\n }, delay);\n },\n [userAddress, availableChainIds, queryClient],\n );\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n if (pendingTimerRef.current) {\n clearTimeout(pendingTimerRef.current);\n pendingTimerRef.current = null;\n }\n };\n }, []);\n\n return { triggerBalanceUpdate };\n};\n\nclass BalanceEventEmitter extends EventTarget {\n emit(event: BalanceUpdateEvent) {\n this.dispatchEvent(new CustomEvent('balance-update', { detail: event }));\n }\n}\n\nexport const balanceEventEmitter = new BalanceEventEmitter();\n\nexport const useEmitBalanceEvent = () => {\n return (event: BalanceUpdateEvent) => balanceEventEmitter.emit(event);\n};\n\nexport const useBalanceEventSubscription = () => {\n const { triggerBalanceUpdate } = useBalanceEventListener();\n\n useEffect(() => {\n const handler = (event: CustomEvent<BalanceUpdateEvent>) => {\n triggerBalanceUpdate(event.detail);\n };\n balanceEventEmitter.addEventListener('balance-update', handler as EventListener);\n return () => balanceEventEmitter.removeEventListener('balance-update', handler as EventListener);\n }, [triggerBalanceUpdate]);\n};\n","'use client';\n\nimport {\n type Asset,\n getVtApiUrl,\n getVtHeaders,\n getChainConfig,\n toBigInt,\n checkedAddress,\n} from '../internal';\nimport { getKeyForChainId } from '../internal/queries/chains/getAvailableChains';\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { formatUnits, parseUnits } from 'viem';\nimport { useWalletState } from '../wallet/useWalletState';\n\n// ── VT API Quote Types ─────────────────────────────────────────────────────\n\nexport interface VtTypedData {\n domain: Record<string, unknown>;\n types: Record<string, unknown>;\n primaryType: string;\n message: Record<string, unknown>;\n}\n\nexport interface VtUserStep {\n type: 'TRANSACTION' | 'SIGNATURE';\n chainKey?: string;\n chainType?: string;\n description?: string;\n signerAddress?: string;\n transaction?: {\n encoded?: {\n chainId?: number;\n to?: string;\n data?: string;\n value?: string;\n from?: string;\n };\n };\n to?: string;\n data?: string;\n value?: string;\n signature?: {\n type: string;\n typedData: VtTypedData;\n };\n}\n\nexport interface VtRouteStep {\n type: string;\n srcChainKey?: string;\n}\n\nexport interface VtQuote {\n id: string;\n srcChainKey: string;\n dstChainKey: string;\n srcToken: { address: string; decimals: number; symbol: string; name?: string };\n dstToken: { address: string; decimals: number; symbol: string; name?: string };\n srcAmount: string;\n dstAmount: string;\n srcAmountUsd?: string;\n dstAmountUsd?: string;\n feeUsd?: string;\n feePercent?: string;\n routeSteps?: VtRouteStep[];\n userSteps: VtUserStep[];\n duration?: { estimated?: string };\n /** Synthetic timestamp set when we receive the quote */\n _receivedAt: number;\n}\n\n// ── Provider Types ─────────────────────────────────────────────────────────\n\ntype RfqStatus = 'idle' | 'polling' | 'fresh' | 'stale' | 'refreshing';\ntype InputState = 'idle' | 'typing' | 'settled';\n\ninterface PollingParams {\n inputToken: Asset;\n outputToken: Asset;\n inputAmount: string;\n setOutputAmount?: (amount: number | null) => void;\n}\n\ninterface InputChangeParams {\n amount: number | null;\n inputToken: Asset;\n outputToken: Asset;\n setOutputAmount: (amount: number | null) => void;\n}\n\ninterface RfqContextType {\n status: RfqStatus;\n inputState: InputState;\n rfqQuote: VtQuote | null;\n error: string | null;\n liquidityError: boolean;\n routingError: boolean;\n sizeCapError: boolean;\n\n ensureForParams: (params: PollingParams) => void;\n stop: () => void;\n refresh: () => void;\n clear: () => void;\n handleInputChange: (params: InputChangeParams) => void;\n}\n\nconst RfqContext = createContext<RfqContextType | undefined>(undefined);\n\nconst POLLING_INTERVAL_MS = 10_000;\nconst STALE_WINDOW_MS = 30_000;\nconst TYPING_SETTLE_DELAY_MS = 1_000;\nconst ROUTING_ERROR_THRESHOLD = 2;\n\ninterface RfqProviderProps {\n children: React.ReactNode;\n recipient?: string | null;\n}\n\nfunction selectQuote(quotes: VtQuote[]): VtQuote | undefined {\n const aori = quotes.find((q) => q.routeSteps?.[0]?.type === 'AORI_V1');\n return aori ?? quotes[0];\n}\n\nexport const RfqProvider: React.FC<RfqProviderProps> = ({\n children,\n recipient: recipientProp,\n}) => {\n const { address: userAddress } = useWalletState();\n const recipient = recipientProp || userAddress;\n\n const [status, setStatus] = useState<RfqStatus>('idle');\n const [inputState, setInputState] = useState<InputState>('idle');\n const [rfqQuote, setRfqQuote] = useState<VtQuote | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [liquidityError, setLiquidityError] = useState(false);\n const [routingError, setRoutingError] = useState(false);\n const [sizeCapError, setSizeCapError] = useState(false);\n\n const sessionIdRef = useRef<string | null>(null);\n const lastParamsRef = useRef<PollingParams | null>(null);\n const pollingIntervalRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const staleTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const typingTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const latestRequestId = useRef(0);\n const lastRequestAtRef = useRef(0);\n const lastStartAtRef = useRef(0);\n const hasQuoteRef = useRef(false);\n const routingErrorsRef = useRef<Map<string, number>>(new Map());\n\n const clearTimers = useCallback(() => {\n if (pollingIntervalRef.current) clearTimeout(pollingIntervalRef.current);\n if (staleTimerRef.current) clearTimeout(staleTimerRef.current);\n if (typingTimerRef.current) clearTimeout(typingTimerRef.current);\n pollingIntervalRef.current = null;\n staleTimerRef.current = null;\n typingTimerRef.current = null;\n }, []);\n\n const stop = useCallback(() => {\n clearTimers();\n sessionIdRef.current = null;\n latestRequestId.current = 0;\n setStatus(() => (hasQuoteRef.current ? 'fresh' : 'idle'));\n }, [clearTimers]);\n\n const clear = useCallback(() => {\n stop();\n lastParamsRef.current = null;\n setRfqQuote(null);\n setError(null);\n setLiquidityError(false);\n setRoutingError(false);\n setSizeCapError(false);\n routingErrorsRef.current.clear();\n setStatus('idle');\n setInputState('idle');\n }, [stop]);\n\n const scheduleStale = useCallback((receivedAt: number) => {\n if (!receivedAt) return;\n if (staleTimerRef.current) clearTimeout(staleTimerRef.current);\n const delay = Math.max(0, receivedAt + STALE_WINDOW_MS - Date.now());\n staleTimerRef.current = setTimeout(() => {\n setStatus((prev) => (prev === 'idle' ? 'idle' : 'stale'));\n }, delay);\n }, []);\n\n const requestQuoteOnce = useCallback(\n async (params: PollingParams, sessionId: string) => {\n const { inputToken, outputToken, inputAmount, setOutputAmount } = params;\n if (!inputToken || !outputToken || !inputAmount || parseFloat(inputAmount) <= 0)\n return;\n\n const now = Date.now();\n if (now - (lastRequestAtRef.current || 0) < POLLING_INTERVAL_MS - 10)\n return;\n\n const requestId = ++latestRequestId.current;\n\n try {\n if (!inputToken?.decimals || !outputToken?.decimals) return;\n\n const srcChainKey = getKeyForChainId(inputToken.chainId)\n || getChainConfig(inputToken.chainId)?.key\n || '';\n const dstChainKey = getKeyForChainId(outputToken.chainId)\n || getChainConfig(outputToken.chainId)?.key\n || '';\n\n if (!srcChainKey || !dstChainKey) throw new Error('Unknown chain');\n\n const normalizedAmount = parseUnits(\n inputAmount.toString(),\n inputToken.decimals,\n ).toString();\n\n const body = {\n srcChainKey,\n dstChainKey,\n srcTokenAddress: checkedAddress(inputToken.address as `0x${string}`),\n dstTokenAddress: checkedAddress(outputToken.address as `0x${string}`),\n amount: normalizedAmount,\n srcWalletAddress:\n userAddress || '0x0000000000000000000000000000000000000000',\n dstWalletAddress:\n recipient || userAddress || '0x0000000000000000000000000000000000000000',\n options: {\n amountType: 'EXACT_SRC_AMOUNT',\n feeTolerance: { type: 'PERCENT', amount: 2 },\n },\n };\n\n lastRequestAtRef.current = Date.now();\n\n const res = await fetch(`${getVtApiUrl()}/quotes`, {\n method: 'POST',\n headers: getVtHeaders(),\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(15000),\n });\n\n if (!res.ok) {\n const errBody = await res.json().catch(() => ({}));\n const msg = (errBody as any)?.message || res.statusText;\n throw Object.assign(new Error(msg), { status: res.status });\n }\n\n const data = await res.json();\n if (requestId !== latestRequestId.current || sessionIdRef.current !== sessionId)\n return;\n\n const quotes: VtQuote[] = data.quotes ?? [];\n const selected = selectQuote(quotes);\n if (!selected) throw Object.assign(new Error('No quotes returned'), { emptyQuotes: true });\n\n const formattedOutput = Number(\n formatUnits(toBigInt(selected.dstAmount), outputToken.decimals),\n );\n if (typeof setOutputAmount === 'function') setOutputAmount(formattedOutput);\n\n selected._receivedAt = Date.now();\n setRfqQuote(selected);\n setError(null);\n setLiquidityError(false);\n setStatus('fresh');\n scheduleStale(selected._receivedAt);\n if (sessionId) routingErrorsRef.current.delete(sessionId);\n } catch (e: unknown) {\n if (requestId !== latestRequestId.current || sessionIdRef.current !== sessionId)\n return;\n\n const statusCode = (e as any)?.status as number | undefined;\n const errorMessage = e instanceof Error ? e.message : '';\n\n const isEmptyQuotes = !!(e as any)?.emptyQuotes;\n\n if ((statusCode === 400 || isEmptyQuotes || errorMessage.includes('Quote request failed')) && sessionId) {\n const current = routingErrorsRef.current.get(sessionId) || 0;\n const newCount = current + 1;\n routingErrorsRef.current.set(sessionId, newCount);\n if (newCount >= ROUTING_ERROR_THRESHOLD) {\n setRoutingError(true);\n clearTimers();\n sessionIdRef.current = null;\n return;\n }\n }\n\n if (errorMessage.toLowerCase().includes('order cap exceeded')) {\n setSizeCapError(true);\n clearTimers();\n sessionIdRef.current = null;\n return;\n }\n\n if (errorMessage.toLowerCase().includes('insufficient executor balance')) {\n setLiquidityError(true);\n clearTimers();\n sessionIdRef.current = null;\n return;\n }\n\n setError(e instanceof Error ? e.message : 'Unknown error');\n }\n },\n [userAddress, recipient, scheduleStale, clearTimers],\n );\n\n const startPolling = useCallback(\n (params: PollingParams, sessionId: string) => {\n clearTimers();\n lastParamsRef.current = params;\n lastRequestAtRef.current = 0;\n routingErrorsRef.current.delete(sessionId);\n setLiquidityError(false);\n setRoutingError(false);\n setSizeCapError(false);\n setError(null);\n setStatus('polling');\n\n const poll = async () => {\n if (sessionIdRef.current !== sessionId) return;\n await requestQuoteOnce(params, sessionId);\n if (sessionIdRef.current !== sessionId) return;\n pollingIntervalRef.current = setTimeout(poll, POLLING_INTERVAL_MS);\n };\n poll();\n },\n [clearTimers, requestQuoteOnce],\n );\n\n const ensureForParams = useCallback(\n (params: PollingParams) => {\n if (\n !params?.inputToken ||\n !params?.outputToken ||\n !params?.inputAmount ||\n parseFloat(params.inputAmount) <= 0\n ) {\n stop();\n return;\n }\n\n const prev = lastParamsRef.current;\n const sameParams =\n prev &&\n prev.inputToken?.address === params.inputToken?.address &&\n prev.inputToken?.chainId === params.inputToken?.chainId &&\n prev.outputToken?.address === params.outputToken?.address &&\n prev.outputToken?.chainId === params.outputToken?.chainId &&\n prev.inputAmount === params.inputAmount;\n if (sameParams && sessionIdRef.current) return;\n\n const now = Date.now();\n if (now - lastStartAtRef.current < 100) return;\n lastStartAtRef.current = now;\n\n const newSessionId = `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n sessionIdRef.current = newSessionId;\n startPolling(params, newSessionId);\n },\n [startPolling, stop],\n );\n\n const handleInputChange = useCallback(\n ({ amount, inputToken, outputToken, setOutputAmount }: InputChangeParams) => {\n setOutputAmount(null);\n if (typingTimerRef.current) clearTimeout(typingTimerRef.current);\n\n if (!amount || amount === 0) {\n setInputState('idle');\n stop();\n setRfqQuote(null);\n setError(null);\n setLiquidityError(false);\n setRoutingError(false);\n setSizeCapError(false);\n } else {\n setInputState('typing');\n stop();\n setRfqQuote(null);\n setLiquidityError(false);\n setRoutingError(false);\n setSizeCapError(false);\n setError(null);\n typingTimerRef.current = setTimeout(() => {\n setInputState('settled');\n if (inputToken && outputToken && amount > 0) {\n ensureForParams({\n inputToken,\n outputToken,\n inputAmount: amount.toString(),\n setOutputAmount,\n });\n }\n }, TYPING_SETTLE_DELAY_MS);\n }\n },\n [stop, ensureForParams],\n );\n\n const refresh = useCallback(() => {\n const params = lastParamsRef.current;\n if (!params) return;\n setRfqQuote(null);\n const newSessionId = `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n sessionIdRef.current = newSessionId;\n setStatus('refreshing');\n if (typeof params.setOutputAmount === 'function')\n params.setOutputAmount(null);\n startPolling(params, newSessionId);\n }, [startPolling]);\n\n useEffect(() => {\n hasQuoteRef.current = !!rfqQuote;\n }, [rfqQuote]);\n useEffect(() => () => clearTimers(), [clearTimers]);\n\n const contextValue = useMemo<RfqContextType>(\n () => ({\n status,\n inputState,\n rfqQuote,\n error,\n liquidityError,\n routingError,\n sizeCapError,\n ensureForParams,\n stop,\n refresh,\n clear,\n handleInputChange,\n }),\n [\n status,\n inputState,\n rfqQuote,\n error,\n liquidityError,\n routingError,\n sizeCapError,\n ensureForParams,\n stop,\n refresh,\n clear,\n handleInputChange,\n ],\n );\n\n return (\n <RfqContext.Provider value={contextValue}>{children}</RfqContext.Provider>\n );\n};\n\nexport const useRfq = (): RfqContextType => {\n const context = useContext(RfqContext);\n if (context === undefined)\n throw new Error('useRfq must be used within an RfqProvider');\n return context;\n};\n","'use client';\n\nimport { createContext, useContext } from 'react';\n\ninterface WalletModalContextValue {\n openConnectModal: () => void;\n openAccountModal?: () => void;\n}\n\nexport const WalletModalContext = createContext<WalletModalContextValue>({\n openConnectModal: () => {},\n});\n\nexport const useWalletModal = () => useContext(WalletModalContext);\n","'use client';\n\nimport type { Asset } from '../internal';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useWidgetConfig } from '../context/WidgetConfigContext';\nimport { useSwapFormContext } from '../providers/SwapFormProvider';\n\nconst MAX_INPUT_LENGTH = 20;\n\ninterface AssetAmountInputProps {\n side: 'base' | 'quote';\n asset: Asset | null;\n otherAsset?: Asset | null;\n isPlacingOrder: boolean;\n isWrappingPair: boolean;\n isUnwrappingPair: boolean;\n}\n\nconst AssetAmountInput: React.FC<AssetAmountInputProps> = ({\n side,\n asset,\n otherAsset,\n isPlacingOrder,\n isWrappingPair,\n isUnwrappingPair,\n}) => {\n const { baseAmount, quoteAmount, setBaseAmount, setQuoteAmount } =\n useSwapFormContext();\n const { amountInputVariant, hideAmountInputSymbol, widgetType } =\n useWidgetConfig();\n const isCompactMode = widgetType === 'compact';\n const [setAssetAmount, setOtherAssetAmount] =\n side === 'base'\n ? [setBaseAmount, setQuoteAmount]\n : [setQuoteAmount, setBaseAmount];\n\n const disabled = !asset || side === 'quote' || isPlacingOrder;\n const maxFontSize = isCompactMode\n ? 32\n : amountInputVariant === 'default'\n ? 64\n : 32; // normal\n const [fontSize, setFontSize] = useState(maxFontSize);\n const [inputValue, setInputValue] = useState<string>('');\n const containerRef = useRef<HTMLDivElement>(null);\n const measureRef = useRef<HTMLSpanElement>(null);\n const symbolRef = useRef<HTMLSpanElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const placeholderText = 'USD';\n const assetAmount = side === 'base' ? baseAmount : quoteAmount;\n const [isMounted, setIsMounted] = useState(false);\n\n const adjustFontSize = useCallback(() => {\n if (amountInputVariant !== 'default') {\n setFontSize(maxFontSize);\n return;\n }\n if (!containerRef.current || !measureRef.current || !symbolRef.current)\n return;\n const containerWidth = containerRef.current.offsetWidth;\n const padding = 20;\n let newFontSize = maxFontSize;\n while (newFontSize > 20) {\n measureRef.current.style.fontSize = `${newFontSize}px`;\n symbolRef.current.style.fontSize = `${newFontSize}px`;\n const totalWidth =\n measureRef.current.offsetWidth +\n symbolRef.current.offsetWidth +\n padding;\n if (totalWidth <= containerWidth) break;\n newFontSize -= 1;\n }\n setFontSize(newFontSize);\n }, [amountInputVariant, maxFontSize]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === '.' && inputValue.includes('.')) e.preventDefault();\n },\n [inputValue],\n );\n\n const handleAmountChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n let newValue = e.target.value;\n if (newValue === '.') newValue = '0.';\n if (!/^\\d*\\.?\\d*$/.test(newValue)) return;\n if ((newValue.match(/\\./g) || []).length > 1) return;\n if (newValue.length > 1 && newValue[0] === '0' && newValue[1] !== '.') {\n newValue = newValue.replace(/^0+/, '') || '0';\n }\n if (asset?.decimals !== undefined && newValue.includes('.')) {\n const [, fracPart] = newValue.split('.');\n if (fracPart && fracPart.length > asset.decimals) return;\n }\n if (newValue.length > MAX_INPUT_LENGTH) return;\n\n setInputValue(newValue);\n const newAmount = parseFloat(newValue);\n\n if (newValue !== inputValue) {\n if (newValue === '' || newValue === '0.' || newValue.endsWith('.')) {\n setAssetAmount(null);\n if (side === 'base') setOtherAssetAmount(null);\n } else if (!Number.isNaN(newAmount) && newAmount >= 0) {\n setAssetAmount(newAmount);\n }\n if (side === 'base') setQuoteAmount(null);\n if (isUnwrappingPair || isWrappingPair) setQuoteAmount(newAmount || 0);\n }\n },\n [\n inputValue,\n setAssetAmount,\n side,\n setQuoteAmount,\n asset?.decimals,\n setOtherAssetAmount,\n isUnwrappingPair,\n isWrappingPair,\n ],\n );\n\n useEffect(() => {\n const formatAmount = (amount: number | null) => {\n if (amount === null) return '';\n const decimals = asset?.decimals;\n if (decimals === undefined) return '';\n let asString = amount.toString();\n if (/e/i.test(asString)) {\n asString = Number(amount).toLocaleString('en-US', {\n useGrouping: false,\n maximumFractionDigits: decimals,\n });\n }\n if (asString.includes('.')) {\n const [intPart, fracPartRaw] = asString.split('.');\n const fracPart = fracPartRaw.slice(0, decimals);\n return fracPart ? `${intPart}.${fracPart}` : intPart;\n }\n return asString;\n };\n\n if (assetAmount === null) {\n const isTypingDecimal =\n inputValue === '0.' || (inputValue !== '' && inputValue.endsWith('.'));\n if (!isTypingDecimal) setInputValue('');\n return;\n }\n\n const isUserTyping =\n !disabled &&\n (inputValue.endsWith('.') ||\n inputValue.match(/\\.\\d*0$/) ||\n inputValue === '0' ||\n inputValue === '0.');\n if (isUserTyping && inputValue !== '') return;\n\n const currentNumericValue = parseFloat(inputValue) || 0;\n if (\n inputValue === '' ||\n Math.abs(currentNumericValue - assetAmount) > 0.0000000001\n ) {\n setInputValue(formatAmount(assetAmount));\n }\n }, [assetAmount, asset?.decimals, inputValue, disabled]);\n\n useEffect(() => {\n adjustFontSize();\n }, [inputValue, adjustFontSize]);\n useEffect(() => {\n setIsMounted(true);\n }, []);\n useEffect(() => {\n if (isMounted) adjustFontSize();\n }, [isMounted, adjustFontSize]);\n useEffect(() => {\n if (measureRef.current && inputRef.current) {\n inputRef.current.style.width = `${measureRef.current.offsetWidth}px`;\n }\n }, [inputValue]);\n\n useEffect(() => {\n if (!isMounted) return;\n const resizeObserver = new ResizeObserver(() => {\n if (isMounted) adjustFontSize();\n });\n if (containerRef.current) resizeObserver.observe(containerRef.current);\n return () => resizeObserver.disconnect();\n }, [isMounted, adjustFontSize]);\n\n return (\n <div\n ref={containerRef}\n style={{\n fontSize: `${fontSize}px`,\n transition: 'font-size 0.05s ease-in-out',\n }}\n className={`mt-2 box-border flex ${\n isCompactMode\n ? amountInputVariant === 'normal'\n ? 'h-12 my-1'\n : 'h-10 my-0.5'\n : amountInputVariant === 'normal'\n ? 'h-12 my-1'\n : 'h-20 my-1'\n } w-full flex-row items-center ${disabled ? 'cursor-default' : 'cursor-text'}`}\n onClick={() => inputRef.current?.focus()}\n >\n <div className=\"relative flex w-full items-center\">\n <label htmlFor={`${side}Amount`} className=\"sr-only\">\n {side === 'base' ? 'Input token amount' : 'Output token amount'}\n </label>\n <input\n ref={inputRef}\n type=\"text\"\n inputMode=\"decimal\"\n placeholder=\"0\"\n autoComplete=\"off\"\n id={`${side}Amount`}\n value={inputValue}\n onWheel={(e) => (e.target as HTMLInputElement).blur()}\n onKeyDown={handleKeyDown}\n onChange={handleAmountChange}\n style={{\n transition: 'width 0.15s ease-in-out',\n color: disabled\n ? 'var(--widget-foreground)'\n : 'var(--widget-foreground)',\n WebkitTextFillColor: disabled\n ? 'var(--widget-foreground)'\n : 'var(--widget-foreground)',\n opacity: disabled ? 0.4 : 1,\n }}\n className=\"flex min-w-[45px] whitespace-nowrap bg-transparent placeholder:opacity-50\"\n disabled={disabled}\n />\n <span\n style={{ transition: 'width 0.15s ease-in-out' }}\n ref={measureRef}\n className=\"pointer-events-none absolute flex whitespace-nowrap invisible\"\n >\n {inputValue || 0}\n </span>\n {!hideAmountInputSymbol && amountInputVariant !== 'normal' && (\n <span\n ref={symbolRef}\n className=\"ml-2 font-light uppercase\"\n style={{\n color: 'var(--widget-foreground)',\n opacity: 0.5,\n fontSize: `${fontSize}px`,\n }}\n >\n {asset?.symbol\n ? asset.symbol.length > 6\n ? `${asset.symbol.slice(0, 6)}...`\n : asset.symbol\n : placeholderText}\n </span>\n )}\n {(hideAmountInputSymbol || amountInputVariant === 'normal') && (\n <span ref={symbolRef} className=\"hidden\" />\n )}\n </div>\n </div>\n );\n};\n\nexport default AssetAmountInput;\n","'use client';\n\nimport { ChainIcon, DropdownIcon, TokenImage, type Asset, formatNumber } from '../internal';\nimport React from 'react';\nimport { useWidgetConfig } from '../context/WidgetConfigContext';\nimport { useSwapFormContext } from '../providers/SwapFormProvider';\n\ninterface AssetSelectionProps {\n toggle: () => void;\n side: 'base' | 'quote';\n asset: Asset | null;\n isPlacingOrder: boolean;\n}\n\nconst AssetSelection: React.FC<AssetSelectionProps> = ({\n toggle,\n side,\n asset,\n isPlacingOrder,\n}) => {\n const { baseBalance, quoteBalance } = useSwapFormContext();\n const { tokenDisplay, tokenBadgeOrientation, widgetType } = useWidgetConfig();\n const isCompactMode = widgetType === 'compact';\n const cardHeight = isCompactMode ? 'h-10' : 'h-12';\n const iconSize = isCompactMode ? 'h-10 w-10' : 'h-12 w-12';\n\n const userBalance =\n side === 'base'\n ? baseBalance.formatted\n ? (() => {\n const value = parseFloat(baseBalance.formatted);\n return value >= 100_000_000\n ? formatNumber(value)\n : value.toFixed(3);\n })()\n : undefined\n : quoteBalance.formatted\n ? (() => {\n const value = parseFloat(quoteBalance.formatted);\n return value >= 100_000_000\n ? formatNumber(value)\n : value.toFixed(3);\n })()\n : undefined;\n\n const sharedProps = {\n role: 'button' as const,\n tabIndex: isPlacingOrder ? -1 : 0,\n 'aria-disabled': isPlacingOrder,\n 'aria-label': `Select ${side === 'base' ? 'input' : 'output'} token${asset ? `: ${asset.symbol}` : ''}`,\n onClick: !isPlacingOrder ? toggle : undefined,\n onKeyDown: !isPlacingOrder\n ? (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n toggle();\n }\n }\n : undefined,\n };\n\n // ── PILL variant ─────────────────────────────────────────────────────────\n if (tokenDisplay === 'pill') {\n const isRight = tokenBadgeOrientation === 'right';\n return (\n <div\n {...sharedProps}\n className={`inline-flex items-center gap-1.5 h-7 px-2.5 rounded-full cursor-pointer transition-colors ${isRight ? 'ml-auto' : ''}`}\n style={{\n border: '1px solid var(--widget-border)',\n backgroundColor: 'var(--widget-secondary)',\n color: 'var(--widget-secondary-foreground)',\n }}\n >\n {asset ? (\n <>\n <ChainIcon chain={asset.chainId} size=\"xs\" />\n <TokenImage\n className=\"rounded-full\"\n asset={asset}\n size=\"xxs\"\n noChain\n />\n <span className=\"text-xs font-medium uppercase\">\n {asset.symbol}\n </span>\n <DropdownIcon\n className=\"w-1.5 opacity-60\"\n style={{ color: 'var(--widget-secondary-foreground)' }}\n />\n </>\n ) : (\n <>\n <span className=\"text-xs opacity-70\">Select</span>\n <DropdownIcon\n className=\"w-1.5 opacity-60\"\n style={{ color: 'var(--widget-secondary-foreground)' }}\n />\n </>\n )}\n </div>\n );\n }\n\n // ── GHOST variant ─────────────────────────────────────────────────────────\n if (tokenDisplay === 'ghost') {\n return (\n <div\n {...sharedProps}\n className=\"inline-flex items-center gap-1.5 cursor-pointer transition-opacity hover:opacity-70 py-1\"\n style={{ color: 'var(--widget-foreground)' }}\n >\n {asset ? (\n <>\n <ChainIcon chain={asset.chainId} size=\"xs\" />\n <TokenImage\n className=\"rounded-full\"\n asset={asset}\n size=\"xxs\"\n noChain\n />\n <span className=\"text-sm font-medium uppercase\">\n {asset.symbol}\n </span>\n </>\n ) : (\n <span\n className=\"text-sm\"\n style={{ color: 'var(--widget-muted-foreground)' }}\n >\n Select token\n </span>\n )}\n <DropdownIcon className=\"w-1.5 opacity-50\" />\n </div>\n );\n }\n\n // ── CARD/default variant ────────────────────────────────────────────────\n return (\n <div\n {...sharedProps}\n className={`relative ${cardHeight} w-full cursor-pointer text-xl duration-100 ease-linear`}\n style={{\n border: '1px solid var(--widget-border)',\n backgroundColor: 'var(--widget-secondary)',\n borderTopLeftRadius: '9999px',\n borderBottomLeftRadius: '9999px',\n borderTopRightRadius: 'var(--widget-radius)',\n borderBottomRightRadius: 'var(--widget-radius)',\n }}\n >\n <div className=\"relative flex h-full w-full flex-row items-center\">\n {asset ? (\n <div className=\"relative flex h-full w-full flex-row items-center\">\n <div\n className={`${iconSize} pl-px flex items-center justify-center`}\n >\n <TokenImage className=\"rounded-full\" asset={asset} size=\"md\" />\n </div>\n <div className=\"flex h-full w-full flex-row items-center justify-between pl-1.5 pr-7\">\n <div className=\"flex h-full flex-col justify-center\">\n <p\n className=\"text-sm font-medium uppercase\"\n style={{ color: 'var(--widget-secondary-foreground)' }}\n >\n {asset.symbol}\n </p>\n <span\n className=\"text-2xs font-mono\"\n style={{\n color: 'var(--widget-secondary-foreground)',\n opacity: 0.6,\n }}\n >\n {asset.address?.slice(0, 6)}...{asset.address?.slice(-4)}\n </span>\n </div>\n {userBalance !== undefined && (\n <div className=\"flex flex-col text-right\">\n <p\n className=\"text-2xs\"\n style={{\n color: 'var(--widget-secondary-foreground)',\n opacity: 0.5,\n }}\n >\n Balance\n </p>\n <span\n className=\"font-mono text-xs tabular-nums\"\n style={{ color: 'var(--widget-secondary-foreground)' }}\n >\n {userBalance}\n </span>\n </div>\n )}\n </div>\n <DropdownIcon\n className=\"absolute right-3 top-1/2 w-1.5 translate-y-[-50%]\"\n style={{\n color: 'var(--widget-secondary-foreground)',\n opacity: 0.6,\n }}\n />\n </div>\n ) : (\n <div className=\"flex h-full w-full items-center justify-center\">\n <span\n className=\"text-sm\"\n style={{\n color: 'var(--widget-secondary-foreground)',\n opacity: 0.7,\n }}\n >\n Select token\n </span>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default AssetSelection;\n","'use client';\n\nimport { UserIcon, isAddress, useDebounce } from '../internal';\nimport { makeGradient } from 'ethereum-gradient-base64';\nimport React, { useState, useEffect } from 'react';\nimport { useWidgetSwapUIStore } from '../stores/swapUIStore';\n\nconst RecipientForm = () => {\n const [recipient, setRecipient] = useState<string | null>(null);\n const [inputValue, setInputValue] = useState('');\n const debouncedValue = useDebounce(inputValue, 1000);\n const [isError, setIsError] = useState(false);\n const [errorMessage, setErrorMessage] = useState('');\n\n useEffect(() => {\n useWidgetSwapUIStore.getState().setRecipient(recipient);\n }, [recipient]);\n\n useEffect(() => {\n if (recipient) setInputValue(recipient);\n else setInputValue('');\n }, [recipient]);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n if (isError) {\n setIsError(false);\n setErrorMessage('');\n setRecipient(null);\n }\n setInputValue(value);\n if (value === '') setRecipient(null);\n };\n\n useEffect(() => {\n if (debouncedValue === '' || !debouncedValue) {\n setIsError(false);\n setErrorMessage('');\n setRecipient(null);\n } else if (!isAddress(debouncedValue)) {\n setIsError(true);\n setErrorMessage('Invalid wallet address...');\n setRecipient(null);\n setInputValue('');\n } else {\n setIsError(false);\n setErrorMessage('');\n setRecipient(debouncedValue);\n }\n }, [debouncedValue]);\n\n useEffect(() => {\n if (isError) {\n const timeout = setTimeout(() => {\n setRecipient(null);\n setInputValue('');\n setIsError(false);\n setErrorMessage('');\n }, 2000);\n return () => clearTimeout(timeout);\n }\n }, [isError]);\n\n const handleClear = () => {\n setRecipient(null);\n setInputValue('');\n setIsError(false);\n setErrorMessage('');\n };\n\n return (\n <div className=\"w-full\">\n <div className=\"relative flex flex-row items-center\">\n {/* Hidden password input to fool browser autofill */}\n <input\n type=\"password\"\n style={{ display: 'none' }}\n aria-hidden=\"true\"\n tabIndex={-1}\n />\n\n <label htmlFor=\"recipient-address\" className=\"sr-only\">\n Recipient wallet address\n </label>\n\n {/* Left avatar / icon */}\n <div\n className=\"absolute left-3 flex h-6 w-6 items-end justify-center overflow-hidden rounded-full\"\n style={{ backgroundColor: 'var(--widget-secondary)' }}\n >\n {recipient && !isError ? (\n <img\n className=\"h-full w-full rounded-full object-cover\"\n src={makeGradient(recipient)}\n alt=\"Recipient avatar\"\n />\n ) : (\n <UserIcon\n className=\"h-5 w-5\"\n style={{\n color: isError\n ? 'var(--widget-destructive)'\n : 'var(--widget-muted-foreground)',\n }}\n />\n )}\n </div>\n\n {/* \"To:\" label */}\n <div\n className=\"absolute left-12 top-1.5 -translate-y-1 text-xs font-medium opacity-60\"\n style={{\n color: isError\n ? 'var(--widget-destructive)'\n : 'var(--widget-muted-foreground)',\n }}\n aria-hidden=\"true\"\n >\n To:\n </div>\n\n {/* Address input */}\n <input\n id=\"recipient-address\"\n className=\"mono block h-10 w-full items-center pl-12 pt-4 pr-8 text-xs\"\n style={{\n backgroundColor: isError\n ? `color-mix(in srgb, var(--widget-destructive) 10%, transparent)`\n : 'transparent',\n color: isError\n ? 'var(--widget-destructive)'\n : 'var(--widget-foreground)',\n outline: 'none',\n opacity: isError ? 0.9 : 1,\n }}\n placeholder={isError ? errorMessage : 'Enter recipient address...'}\n value={inputValue}\n onChange={handleInputChange}\n spellCheck={false}\n aria-invalid={isError}\n aria-describedby={isError ? 'recipient-error' : undefined}\n />\n\n {isError && (\n <span id=\"recipient-error\" className=\"sr-only\">\n {errorMessage}\n </span>\n )}\n\n {/* Clear button */}\n {recipient && !isError && (\n <button\n type=\"button\"\n className=\"absolute right-2 top-1/2 -translate-y-1/2 cursor-pointer flex items-center justify-center h-4 w-4 rounded-full transition-colors hover:[color:var(--widget-destructive)]\"\n style={{ color: 'var(--widget-muted-foreground)' }}\n onClick={handleClear}\n aria-label=\"Clear recipient\"\n >\n <svg className=\"h-2.5 w-2.5\" viewBox=\"0 -0.5 21 21\" fill=\"none\">\n <g fill=\"currentColor\" fillRule=\"evenodd\">\n <polygon\n points=\"375.0183 90 384 98.554 382.48065 100 373.5 91.446 364.5183 100 363 98.554 371.98065 90 363 81.446 364.5183 80 373.5 88.554 382.48065 80 384 81.446\"\n transform=\"translate(-363 -80)\"\n />\n </g>\n </svg>\n <span className=\"sr-only\">Clear recipient</span>\n </button>\n )}\n </div>\n </div>\n );\n};\n\nexport default RecipientForm;\n","import { getVtHeaders } from '../internal';\n\nexport interface VtOrderStatus {\n status: string;\n srcTxHash?: string;\n dstTxHash?: string;\n explorerUrl?: string;\n}\n\nexport interface PollOrderStatusOptions {\n onStatusChange?: (status: VtOrderStatus) => void;\n onComplete?: (status: VtOrderStatus) => void;\n onError?: (error: Error) => void;\n interval?: number;\n timeout?: number;\n txHash?: string;\n signal?: AbortSignal;\n}\n\nconst TERMINAL_STATUSES = ['SUCCEEDED', 'FAILED', 'COMPLETED', 'CANCELLED'];\n\nexport async function pollOrderStatus(\n quoteId: string,\n baseUrl: string,\n options: PollOrderStatusOptions = {},\n): Promise<VtOrderStatus> {\n const {\n onStatusChange,\n onComplete,\n onError,\n interval = 4000,\n timeout = 300000,\n txHash,\n signal,\n } = options;\n\n let lastStatus: string | null = null;\n const startTime = Date.now();\n let consecutiveErrorCount = 0;\n const MAX_CONSECUTIVE_ERRORS = 8;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const queryString = txHash ? `?txHash=${txHash}` : '';\n\n return new Promise((resolve, reject) => {\n const checkStatus = async () => {\n try {\n if (signal?.aborted) {\n if (timeoutId) clearTimeout(timeoutId);\n reject(new DOMException('Polling aborted', 'AbortError'));\n return;\n }\n\n if (Date.now() - startTime > timeout) {\n if (timeoutId) clearTimeout(timeoutId);\n const error = new Error('Order status polling timed out');\n onError?.(error);\n reject(error);\n return;\n }\n\n const response = await fetch(`${baseUrl}/status/${quoteId}${queryString}`, {\n headers: getVtHeaders(),\n signal,\n });\n\n if (response.status === 404) {\n timeoutId = setTimeout(checkStatus, interval);\n return;\n }\n\n if (!response.ok) {\n throw new Error(`Failed to fetch order status: ${await response.text()}`);\n }\n\n const status: VtOrderStatus = await response.json();\n\n if (!status || typeof status !== 'object' || !status.status) {\n throw new Error(`Invalid status response format: ${JSON.stringify(status)}`);\n }\n\n consecutiveErrorCount = 0;\n\n const normalized = status.status.toUpperCase();\n\n if (normalized !== lastStatus) {\n lastStatus = normalized;\n onStatusChange?.(status);\n }\n\n if (TERMINAL_STATUSES.includes(normalized)) {\n if (timeoutId) clearTimeout(timeoutId);\n onComplete?.(status);\n resolve(status);\n return;\n }\n\n timeoutId = setTimeout(checkStatus, interval);\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n if (timeoutId) clearTimeout(timeoutId);\n reject(error);\n return;\n }\n\n if (++consecutiveErrorCount >= MAX_CONSECUTIVE_ERRORS) {\n if (timeoutId) clearTimeout(timeoutId);\n const err = error instanceof Error ? error : new Error(String(error));\n onError?.(err);\n reject(err);\n return;\n }\n\n timeoutId = setTimeout(checkStatus, interval);\n }\n };\n\n checkStatus();\n });\n}\n","'use client';\n\nimport { useEmitBalanceEvent } from './useBalanceEventListener';\nimport { pollOrderStatus, type VtOrderStatus } from '../lib/pollOrderStatus';\nimport type { ToastStatus } from '../stores/swapUIStore';\nimport { type Asset, getVtApiUrl } from '../internal';\nimport { useWalletState } from '../wallet/useWalletState';\nimport { useCallback, useEffect, useRef } from 'react';\n\ninterface OrderMetadata {\n baseToken?: Asset;\n quoteToken?: Asset;\n}\n\nfunction normalizeStatus(vtStatus: string): ToastStatus {\n const upper = vtStatus.toUpperCase();\n if (upper === 'SUCCEEDED' || upper === 'COMPLETED') return 'completed';\n if (upper === 'FAILED') return 'failed';\n if (upper === 'CANCELLED') return 'cancelled';\n if (upper === 'PROCESSING') return 'received';\n return 'pending';\n}\n\nexport const useOrderStatusPolling = (\n onStatusUpdate?: (quoteId: string, status: ToastStatus) => void,\n) => {\n const activePolls = useRef<Map<string, boolean>>(new Map());\n const orderMetadata = useRef<Map<string, OrderMetadata>>(new Map());\n const abortControllers = useRef<Map<string, AbortController>>(new Map());\n const pollingLock = useRef(0);\n const incrementPollingLock = useCallback(() => ++pollingLock.current, []);\n\n const { address: userAddress } = useWalletState();\n const emitBalanceEvent = useEmitBalanceEvent();\n\n const startPolling = useCallback(\n (quoteId: string, metadata?: OrderMetadata) => {\n if (activePolls.current.get(quoteId)) return;\n\n if (metadata) orderMetadata.current.set(quoteId, metadata);\n\n activePolls.current.set(quoteId, true);\n const currentLock = pollingLock.current;\n\n const abortController = new AbortController();\n abortControllers.current.set(quoteId, abortController);\n\n const isMainnet = metadata?.baseToken?.chainId === 1;\n pollOrderStatus(\n quoteId,\n getVtApiUrl(),\n {\n interval: isMainnet ? 1000 : 500,\n timeout: 300000,\n signal: abortController.signal,\n\n onStatusChange: (status: VtOrderStatus) => {\n if (!status?.status) return;\n const statusValue = normalizeStatus(status.status);\n\n onStatusUpdate?.(quoteId, statusValue);\n\n if (statusValue === 'completed' && userAddress) {\n const meta = orderMetadata.current.get(quoteId);\n if (meta && (meta.baseToken || meta.quoteToken)) {\n const tokens: Array<{ asset: Asset; userAddress: string }> = [];\n if (meta.baseToken) tokens.push({ asset: meta.baseToken, userAddress });\n if (meta.quoteToken) tokens.push({ asset: meta.quoteToken, userAddress });\n emitBalanceEvent({ type: 'swap', tokens });\n }\n }\n\n if (['completed', 'failed', 'cancelled'].includes(statusValue)) {\n activePolls.current.delete(quoteId);\n orderMetadata.current.delete(quoteId);\n }\n\n if (currentLock !== pollingLock.current) {\n activePolls.current.delete(quoteId);\n orderMetadata.current.delete(quoteId);\n }\n },\n\n onComplete: (status: VtOrderStatus) => {\n if (status?.status) {\n onStatusUpdate?.(quoteId, normalizeStatus(status.status));\n }\n activePolls.current.delete(quoteId);\n orderMetadata.current.delete(quoteId);\n },\n\n onError: () => {\n activePolls.current.delete(quoteId);\n orderMetadata.current.delete(quoteId);\n },\n },\n ).catch((error) => {\n if (error instanceof Error && error.name === 'AbortError') return;\n activePolls.current.delete(quoteId);\n orderMetadata.current.delete(quoteId);\n abortControllers.current.delete(quoteId);\n });\n },\n [userAddress, emitBalanceEvent, onStatusUpdate],\n );\n\n const stopPolling = useCallback(\n (quoteId: string) => {\n const controller = abortControllers.current.get(quoteId);\n if (controller) {\n controller.abort();\n abortControllers.current.delete(quoteId);\n }\n incrementPollingLock();\n activePolls.current.delete(quoteId);\n orderMetadata.current.delete(quoteId);\n },\n [incrementPollingLock],\n );\n\n const stopAllPolling = useCallback(() => {\n for (const controller of abortControllers.current.values()) controller.abort();\n abortControllers.current.clear();\n incrementPollingLock();\n activePolls.current.clear();\n orderMetadata.current.clear();\n }, [incrementPollingLock]);\n\n useEffect(() => {\n return () => stopAllPolling();\n }, [stopAllPolling]);\n\n return {\n startPolling,\n stopPolling,\n stopAllPolling,\n isPolling: (quoteId: string) => activePolls.current.has(quoteId),\n };\n};\n","'use client';\n\nimport { createContext, useContext } from 'react';\n\nexport const TransactionRegistryContext = createContext<{\n registerTransaction: (hash: string, description: string) => void;\n enabled: boolean;\n}>({\n registerTransaction: () => {},\n enabled: false,\n});\n\nexport const useTransactionRegistry = () => useContext(TransactionRegistryContext);\n","import { getVtApiUrl, getVtHeaders } from '../internal';\nimport type { VtQuote, VtUserStep } from '../providers/RfqProvider';\nimport type { Address, WalletClient } from 'viem';\nimport { signTypedData } from 'viem/actions';\n\ntype SwapWalletClient = WalletClient & {\n switchChain?: (args: { id: number }) => Promise<void>;\n send?: (method: string, params: unknown[]) => Promise<unknown>;\n getChainId?: () => number | Promise<number>;\n};\n\nfunction isUserRejection(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n return (\n error.name === 'UserRejectedRequestError' ||\n error.message.includes('User rejected') ||\n error.message.includes('rejected') ||\n error.message.includes('denied') ||\n error.message.includes('cancelled') ||\n error.message.includes('canceled')\n );\n}\n\nasync function resolveChainId(walletClient: SwapWalletClient): Promise<number | null> {\n if (walletClient.chain?.id) return walletClient.chain.id;\n const result = walletClient.getChainId?.();\n if (result != null) return await result;\n return null;\n}\n\nexport const ChainSwitch = async (\n walletClient: SwapWalletClient,\n requiredChainId: number,\n): Promise<boolean> => {\n try {\n const currentChainId = await resolveChainId(walletClient);\n if (currentChainId === requiredChainId) return true;\n\n if (walletClient.request) {\n await walletClient.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: `0x${requiredChainId.toString(16)}` }],\n });\n } else if (walletClient.switchChain) {\n await walletClient.switchChain({ id: requiredChainId });\n } else if (walletClient.send) {\n await walletClient.send('wallet_switchEthereumChain', [\n { chainId: `0x${requiredChainId.toString(16)}` },\n ]);\n } else {\n throw new Error(\"Wallet doesn't support chain switching\");\n }\n\n const newChainId = await resolveChainId(walletClient);\n return newChainId === requiredChainId;\n } catch (error) {\n if (isUserRejection(error)) {\n throw new Error('User rejected the chain switch request');\n }\n throw new Error(\n `Please switch your wallet to the required network (Chain ID: ${requiredChainId})`,\n );\n }\n};\n\ninterface ISignSwapParams {\n quote: VtQuote;\n signatureStep: VtUserStep;\n userAddress: string;\n walletClient: SwapWalletClient;\n}\n\nexport const SignSwap = async (params: ISignSwapParams): Promise<{ quoteId: string; signature: string }> => {\n const { quote, signatureStep, userAddress, walletClient } = params;\n\n if (!walletClient) throw new Error('Wallet client not available');\n if (signatureStep.type !== 'SIGNATURE' || !signatureStep.signature?.typedData)\n throw new Error('Invalid signature step');\n\n try {\n const typed = signatureStep.signature.typedData;\n\n const normalizedMessage = { ...typed.message };\n for (const key of ['inputAmount', 'outputAmount', 'startTime', 'endTime']) {\n if (normalizedMessage[key] != null) {\n normalizedMessage[key] = BigInt(normalizedMessage[key] as string | number);\n }\n }\n\n const domain = typed.domain as Record<string, unknown> & { chainId?: number | bigint };\n if (domain.chainId != null) {\n const chainId = Number(domain.chainId);\n await ChainSwitch(walletClient, chainId);\n }\n\n const signature = await signTypedData(walletClient, {\n account: userAddress as Address,\n domain,\n types: typed.types,\n primaryType: typed.primaryType,\n message: normalizedMessage,\n });\n\n const submitRes = await fetch(`${getVtApiUrl()}/submit-signature`, {\n method: 'POST',\n headers: getVtHeaders(),\n body: JSON.stringify({\n quoteId: quote.id,\n signatures: [signature],\n }),\n });\n\n if (!submitRes.ok) {\n const errBody = await submitRes.json().catch(() => ({}));\n throw new Error((errBody as any)?.message || `Submit failed: ${submitRes.status}`);\n }\n\n return { quoteId: quote.id, signature };\n } catch (error) {\n if (isUserRejection(error)) {\n throw new Error('User rejected the signing request');\n }\n if (error instanceof Error && error.message.includes('chain')) {\n throw new Error('Chain switching failed. Please manually switch to the correct network.');\n }\n throw error;\n }\n};\n","interface SubmittedQuote {\n quoteId: string;\n submittedAt: number;\n createdAt: number;\n}\n\nconst STORAGE_KEY = 'vt_submitted_quotes';\nconst QUOTE_EXPIRATION_MS = 30 * 1000;\n\nconst getSubmittedQuotes = (): SubmittedQuote[] => {\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n return stored ? JSON.parse(stored) : [];\n } catch {\n return [];\n }\n};\n\nconst saveSubmittedQuotes = (quotes: SubmittedQuote[]): void => {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(quotes));\n } catch { /* ignore */ }\n};\n\nexport const isQuoteFresh = (createdAt: string | number): boolean => {\n const now = Date.now();\n const createdMs =\n typeof createdAt === 'string'\n ? new Date(createdAt).getTime()\n : createdAt > 9999999999 ? createdAt : createdAt * 1000;\n return now < createdMs + QUOTE_EXPIRATION_MS;\n};\n\nexport const isOrderAlreadySubmitted = (quoteId: string): boolean => {\n return getSubmittedQuotes().some((q) => q.quoteId === quoteId);\n};\n\nexport const canSubmitOrder = (\n quoteId: string,\n createdAt: string | number,\n): { canSubmit: boolean; reason?: string } => {\n if (isOrderAlreadySubmitted(quoteId)) {\n return { canSubmit: false, reason: 'Order already submitted' };\n }\n if (!isQuoteFresh(createdAt)) {\n return { canSubmit: false, reason: 'Quote has expired' };\n }\n return { canSubmit: true };\n};\n\nexport const markOrderAsSubmitted = (quoteId: string, createdAt: string | number): void => {\n const createdMs =\n typeof createdAt === 'string' ? new Date(createdAt).getTime() : createdAt;\n const submitted = getSubmittedQuotes();\n submitted.push({ quoteId, submittedAt: Date.now(), createdAt: createdMs });\n saveSubmittedQuotes(submitted);\n};\n\nexport const cleanupOldSubmissions = (): void => {\n const submitted = getSubmittedQuotes();\n const now = Date.now();\n const CLEANUP_THRESHOLD = 5 * 60 * 1000;\n const cleaned = submitted.filter((q) => now - q.submittedAt < CLEANUP_THRESHOLD);\n if (cleaned.length !== submitted.length) saveSubmittedQuotes(cleaned);\n};\n\nexport const clearAllSubmissions = (): void => {\n try {\n localStorage.removeItem(STORAGE_KEY);\n } catch { /* SSR / restricted storage */ }\n};\n","'use client';\n\nimport { getChainConfig, type SupportedChainId } from '../internal';\nimport { useMutation } from '@tanstack/react-query';\nimport { waitForTransactionReceipt } from '@wagmi/core';\nimport { wethAbi } from 'abitype/abis';\nimport { useConfig, type useWriteContract } from 'wagmi';\n\nexport interface UnwrapTokenParams {\n chainId: SupportedChainId;\n accountAddress: `0x${string}`;\n amountRaw: bigint;\n writeContractAsync: ReturnType<typeof useWriteContract>['writeContractAsync'];\n}\n\nexport function useUnwrapToken() {\n const wagmiConfig = useConfig();\n return useMutation({\n mutationFn: async ({ chainId, accountAddress, amountRaw, writeContractAsync }: UnwrapTokenParams) => {\n const chainConfig = getChainConfig(chainId);\n if (!chainConfig) throw new Error(`No wrapping contract for chain ${chainId}`);\n\n const wNativeAddress = chainConfig.wrappedAsset.address as `0x${string}`;\n\n const hash = await writeContractAsync({\n abi: wethAbi,\n functionName: 'withdraw',\n address: wNativeAddress,\n account: accountAddress,\n args: [amountRaw],\n chainId,\n } as any); /* wagmi v2 chainId literal type mismatch */\n\n const receipt = await waitForTransactionReceipt(wagmiConfig, {\n hash, chainId, confirmations: 1, pollingInterval: 4_000,\n });\n\n if (receipt.status !== 'success') {\n throw new Error('Unwrap transaction did not get successful receipt');\n }\n\n return { success: true, hash };\n },\n });\n}\n","'use client';\n\nimport { getChainConfig, type SupportedChainId } from '../internal';\nimport { useMutation } from '@tanstack/react-query';\nimport { waitForTransactionReceipt } from '@wagmi/core';\nimport { wethAbi } from 'abitype/abis';\nimport { useConfig, type useWriteContract } from 'wagmi';\n\nexport interface WrapTokenParams {\n chainId: SupportedChainId;\n accountAddress: `0x${string}`;\n amountRaw: bigint;\n writeContractAsync: ReturnType<typeof useWriteContract>['writeContractAsync'];\n}\n\nexport function useWrapToken() {\n const wagmiConfig = useConfig();\n return useMutation({\n mutationFn: async ({ chainId, accountAddress, amountRaw, writeContractAsync }: WrapTokenParams) => {\n const chainConfig = getChainConfig(chainId);\n if (!chainConfig) throw new Error(`No wrapping contract for chain ${chainId}`);\n\n const wNativeAddress = chainConfig.wrappedAsset.address as `0x${string}`;\n\n const hash = await writeContractAsync({\n abi: wethAbi,\n functionName: 'deposit',\n address: wNativeAddress,\n account: accountAddress,\n value: amountRaw,\n chainId,\n } as any); /* wagmi v2 chainId literal type mismatch */\n\n const receipt = await waitForTransactionReceipt(wagmiConfig, {\n hash, chainId, confirmations: 1, pollingInterval: 4_000,\n });\n\n if (receipt.status !== 'success') {\n throw new Error('Wrap transaction did not get successful receipt');\n }\n\n return { success: true, hash };\n },\n });\n}\n","'use client';\n\nimport {\n type Asset,\n type ReviewOrderStep,\n type SupportedChainId,\n getChainConfig,\n getNextReviewStep,\n sleep,\n} from '../../internal';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useChainId } from 'wagmi';\nimport { useWidgetConfig } from '../../context/WidgetConfigContext';\nimport { useOrderStatusPolling } from '../../hooks/useOrderStatusPolling';\nimport { useRfq } from '../../providers/RfqProvider';\nimport { useSwapFormContext } from '../../providers/SwapFormProvider';\nimport type { ToastStatus } from '../../stores/swapUIStore';\nimport { useWidgetSwapUIStore } from '../../stores/swapUIStore';\nimport { useTransactionTracker } from '../../wallet/useTransactionTracker';\nimport ReviewActionChainSwitchRow from './ReviewActionChainSwitchRow';\nimport ReviewActionSignAndSubmitOrderRow from './ReviewActionSignAndSubmitOrderRow';\nimport ReviewActionTxRow from './ReviewActionTxRow';\nimport ReviewActionUnwrapGasToken from './ReviewActionUnwrapGasToken';\nimport ReviewActionWrapGasToken from './ReviewActionWrapGasToken';\n\ninterface ReviewActionProps {\n base: Asset;\n quote: Asset;\n baseAmount: number;\n quoteAmount: number;\n userAddress: string;\n}\n\ninterface SwapButtonProps {\n // Core swap data\n base: Asset;\n baseAmount: number;\n quote: Asset;\n quoteAmount: number;\n userAddress: string;\n isWrappingPair: boolean;\n isUnwrappingPair: boolean;\n isBaseGasToken: boolean;\n isQuoteGasToken: boolean;\n // Review flow state (owned by parent form)\n reviewActionProps: ReviewActionProps | null;\n reviewState: ReviewOrderStep | null;\n setReviewState: (state: ReviewOrderStep | null) => void;\n // Order tracking (owned by parent form)\n trackedOrderHash: string | null;\n setTrackedOrderHash: (hash: string | null) => void;\n txStatus: ToastStatus;\n // Callbacks from parent\n onSwapComplete?: (orderHash: string) => void;\n onSwapInitiated?: () => void;\n onOrderSubmitted?: (orderHash: string) => void;\n onStaleQuoteRestart?: () => void;\n setExitHandler?: (handler: () => void) => void;\n setRetryHandler?: (handler: () => void) => void;\n}\n\nexport const SwapButton: React.FC<SwapButtonProps> = ({\n base,\n baseAmount,\n quote,\n quoteAmount,\n userAddress,\n isWrappingPair,\n isUnwrappingPair,\n isBaseGasToken,\n isQuoteGasToken,\n reviewActionProps,\n reviewState,\n setReviewState,\n trackedOrderHash,\n setTrackedOrderHash,\n txStatus,\n onSwapComplete,\n onSwapInitiated,\n onOrderSubmitted,\n onStaleQuoteRestart,\n setExitHandler,\n setRetryHandler,\n}) => {\n const {\n rfqQuote,\n status: rfqStatus,\n liquidityError,\n routingError,\n sizeCapError,\n stop,\n clear,\n } = useRfq();\n const { clearForm } = useSwapFormContext();\n const currentChainId = useChainId();\n const { swapButtonVariant, widgetType } = useWidgetConfig();\n const isCompact = widgetType === 'compact';\n\n const { trackOrderTransaction, trackNativeTransaction } = useTransactionTracker();\n const { startPolling } = useOrderStatusPolling((orderHash, status) => {\n useWidgetSwapUIStore.getState().setTxStatus(status);\n if (status === 'completed') {\n trackOrderTransaction(orderHash, `Swap ${base.symbol} → ${quote.symbol}`);\n }\n });\n\n // Local state\n const [isRestarting, setIsRestarting] = useState(false);\n const awaitingAutoResumeRef = useRef(false);\n const restartTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Derived booleans — computed internally\n const needsToWrap = isWrappingPair;\n const needsToUnwrap = isUnwrappingPair;\n const needsSignature = !isWrappingPair && !isUnwrappingPair;\n const needsChainSwitch =\n currentChainId !== base?.chainId &&\n (needsToWrap || needsToUnwrap || needsSignature);\n\n // Inline chain info for ChainSwitchRow\n const chainConfig = getChainConfig(base.chainId);\n const requiredChain = {\n chainId: base.chainId as SupportedChainId,\n name: chainConfig?.displayName ?? `Chain ${base.chainId}`,\n };\n\n // ── Step machine ────────────────────────────────────────────────────────────\n\n const goToNextStep = useCallback(\n (componentStep: ReviewOrderStep, currentStep: ReviewOrderStep | null) => {\n // Guard: only advance if this component IS the current review step\n if (currentStep !== componentStep) return;\n\n // Do NOT fall through to getNextReviewStep() for these steps —\n // its generic array lookup returns 'submittingOrder' / 'sendingTx'\n // which the widget never renders, causing the \"Processing...\" fallback.\n if (componentStep === 'chain') {\n if (needsToWrap) {\n setReviewState('wrapping');\n return;\n }\n if (needsToUnwrap) {\n setReviewState('unwrapping');\n return;\n }\n setReviewState('signingOrder');\n return;\n }\n if (componentStep === 'signingOrder') {\n setReviewState('trackingTx');\n return;\n }\n if (componentStep === 'wrapping') {\n if (!isWrappingPair) {\n setReviewState('signingOrder');\n return;\n }\n setReviewState('wrapSuccess');\n return;\n }\n if (componentStep === 'unwrapping') {\n setReviewState('wrapSuccess');\n return;\n }\n const nextStep = getNextReviewStep(componentStep);\n if (nextStep) setReviewState(nextStep);\n },\n [\n setReviewState,\n isWrappingPair,\n needsToWrap,\n needsToUnwrap,\n needsSignature,\n ],\n );\n\n const determineInitialStep = useCallback((): ReviewOrderStep | null => {\n if (needsChainSwitch) return 'chain';\n if (needsToWrap) return 'wrapping';\n if (needsToUnwrap) return 'unwrapping';\n if (needsSignature) return 'signingOrder';\n return null;\n }, [\n needsChainSwitch,\n needsToWrap,\n needsToUnwrap,\n needsSignature,\n ]);\n\n const resetState = useCallback(() => {\n setReviewState(null);\n clearForm();\n }, [clearForm, setReviewState]);\n\n const delayedClose = useCallback(async () => {\n setReviewState('wrapSuccess');\n for (let i = 0; i < 3; i++) {\n await sleep(700);\n }\n resetState();\n }, [resetState, setReviewState]);\n\n const cancel = useCallback(async () => {\n clear();\n setReviewState('cancelled');\n for (let i = 0; i < 3; i++) {\n await sleep(500);\n }\n resetState();\n }, [clear, resetState, setReviewState]);\n\n const handleNewSwap = useCallback(() => {\n if (!trackedOrderHash) return;\n useWidgetSwapUIStore.getState().stopTracking();\n setReviewState(null);\n setTrackedOrderHash(null);\n clearForm();\n }, [trackedOrderHash, setReviewState, setTrackedOrderHash, clearForm]);\n\n const handleRetrySwap = useCallback(() => {\n setReviewState(null);\n setTrackedOrderHash(null);\n awaitingAutoResumeRef.current = true;\n onStaleQuoteRestart?.();\n }, [setReviewState, setTrackedOrderHash, onStaleQuoteRestart]);\n\n const handleReview = useCallback(() => {\n if (reviewActionProps) {\n setReviewState(determineInitialStep());\n }\n }, [determineInitialStep, reviewActionProps, setReviewState]);\n\n const restartSigningFlow = useCallback(\n (isFromStaleState = false) => {\n if (isFromStaleState) {\n awaitingAutoResumeRef.current = true;\n setReviewState(null);\n onStaleQuoteRestart?.();\n } else {\n setReviewState(null);\n restartTimerRef.current = setTimeout(() => {\n if (reviewActionProps) {\n setReviewState(determineInitialStep());\n setIsRestarting(false);\n }\n }, 100);\n }\n },\n [\n setReviewState,\n reviewActionProps,\n determineInitialStep,\n onStaleQuoteRestart,\n ],\n );\n\n // ── useEffects ──────────────────────────────────────────────────────────────\n\n // Stop RFQ polling the moment any review step becomes active\n useEffect(() => {\n if (reviewState !== null) stop();\n }, [reviewState, stop]);\n\n // Clear isRestarting when a review step resumes\n useEffect(() => {\n if (reviewState !== null && isRestarting) setIsRestarting(false);\n }, [reviewState, isRestarting]);\n\n // Register handleNewSwap with parent (header X button)\n useEffect(() => {\n setExitHandler?.(handleNewSwap);\n }, [setExitHandler, handleNewSwap]);\n\n // Register handleRetrySwap with parent (TxStatusDisplay retry)\n useEffect(() => {\n setRetryHandler?.(handleRetrySwap);\n }, [setRetryHandler, handleRetrySwap]);\n\n useEffect(() => {\n return () => {\n if (restartTimerRef.current) clearTimeout(restartTimerRef.current);\n };\n }, []);\n\n // Auto-resume to signing when a fresh quote arrives after stale restart\n useEffect(() => {\n if (\n awaitingAutoResumeRef.current &&\n rfqStatus === 'fresh' &&\n rfqQuote?.id\n ) {\n awaitingAutoResumeRef.current = false;\n setReviewState('signingOrder');\n }\n }, [rfqStatus, rfqQuote?.id, setReviewState]);\n\n // ── Render helpers ──────────────────────────────────────────────────────────\n\n // Button style generator (widget theming — swapButtonVariant)\n const getIdleButtonStyle = (active: boolean): React.CSSProperties => {\n if (!active) {\n return {\n backgroundColor:\n swapButtonVariant === 'default'\n ? 'var(--widget-muted)'\n : 'transparent',\n color: 'var(--widget-muted-foreground)',\n border:\n swapButtonVariant !== 'default'\n ? '1px solid var(--widget-border)'\n : 'none',\n borderRadius: 'var(--widget-radius)',\n };\n }\n switch (swapButtonVariant) {\n case 'outline':\n return {\n backgroundColor: 'transparent',\n color: 'var(--widget-primary)',\n border: '1px solid var(--widget-primary)',\n borderRadius: 'var(--widget-radius)',\n };\n case 'ghost':\n return {\n backgroundColor: 'transparent',\n color: 'var(--widget-primary)',\n border: 'none',\n borderRadius: 'var(--widget-radius)',\n };\n default:\n return {\n backgroundColor: 'var(--widget-primary)',\n color: 'var(--widget-primary-foreground)',\n borderRadius: 'var(--widget-radius)',\n };\n }\n };\n\n const idleButtonClass = `w-full ${isCompact ? 'py-2' : 'py-3'} text-sm font-medium transition-colors cursor-pointer mt-1`;\n\n // ── Render ──────────────────────────────────────────────────────────────────\n\n // ── Idle state: no review in progress ──────────────────────────────────────\n\n if (reviewState === null && !isWrappingPair && !isUnwrappingPair) {\n if (isRestarting) {\n return (\n <button\n className={idleButtonClass}\n disabled\n style={{\n ...getIdleButtonStyle(false),\n opacity: 0.6,\n cursor: 'not-allowed',\n }}\n >\n Getting fresh quote...\n </button>\n );\n }\n const getIdleText = () => {\n if (liquidityError) return 'Insufficient Liquidity';\n if (routingError) return 'Route Not Available';\n if (sizeCapError) return 'Size Cap Exceeded';\n if (!rfqQuote && rfqStatus === 'polling') return 'Getting Quote...';\n if (!rfqQuote) return 'Enter Amount';\n return 'Swap';\n };\n const isActive = !!reviewActionProps;\n return (\n <button\n onClick={isActive ? handleReview : undefined}\n disabled={!isActive}\n className={`${idleButtonClass} disabled:opacity-40 disabled:cursor-not-allowed`}\n style={getIdleButtonStyle(isActive)}\n >\n {getIdleText()}\n </button>\n );\n }\n\n if (reviewState === null && isUnwrappingPair) {\n return (\n <button\n onClick={reviewActionProps ? handleReview : undefined}\n disabled={!reviewActionProps}\n className={`${idleButtonClass} disabled:opacity-40 disabled:cursor-not-allowed`}\n style={getIdleButtonStyle(!!reviewActionProps)}\n >\n Unwrap\n </button>\n );\n }\n\n if (reviewState === null && isWrappingPair) {\n return (\n <button\n onClick={reviewActionProps ? handleReview : undefined}\n disabled={!reviewActionProps}\n className={`${idleButtonClass} disabled:opacity-40 disabled:cursor-not-allowed`}\n style={getIdleButtonStyle(!!reviewActionProps)}\n >\n Wrap\n </button>\n );\n }\n\n // ── Terminal review states ──────────────────────────────────────────────────\n\n if (reviewState === 'success') {\n return (\n <div className=\"flex flex-col gap-2 w-full\">\n <button\n className={`w-full ${isCompact ? 'py-2' : 'py-3'} text-sm font-medium cursor-default`}\n style={{\n backgroundColor: 'color-mix(in srgb, var(--widget-status-completed) 15%, transparent)',\n color: 'var(--widget-status-completed)',\n border: '1px solid color-mix(in srgb, var(--widget-status-completed) 20%, transparent)',\n borderRadius: 'var(--widget-radius)',\n }}\n >\n Order Placed\n </button>\n </div>\n );\n }\n\n if (reviewState === 'wrapSuccess') {\n return (\n <div className=\"flex flex-col gap-2 w-full\">\n <button\n className={`w-full ${isCompact ? 'py-2' : 'py-3'} text-sm font-medium cursor-default`}\n style={{\n backgroundColor: 'color-mix(in srgb, var(--widget-status-completed) 15%, transparent)',\n color: 'var(--widget-status-completed)',\n border: '1px solid color-mix(in srgb, var(--widget-status-completed) 20%, transparent)',\n borderRadius: 'var(--widget-radius)',\n }}\n >\n {isWrappingPair ? 'Wrapped Successfully' : 'Unwrapped Successfully'}\n </button>\n </div>\n );\n }\n\n if (reviewState === 'cancelled') {\n return (\n <div className=\"flex flex-col gap-2 w-full\">\n <button\n onClick={resetState}\n className={`w-full ${isCompact ? 'py-2' : 'py-3'} text-sm font-medium cursor-pointer`}\n style={{\n backgroundColor: 'color-mix(in srgb, var(--widget-status-failed) 15%, transparent)',\n color: 'var(--widget-status-failed)',\n border: '1px solid color-mix(in srgb, var(--widget-status-failed) 20%, transparent)',\n borderRadius: 'var(--widget-radius)',\n }}\n >\n Order Cancelled\n </button>\n </div>\n );\n }\n\n // ── Per-step review rows ─────────────────────────────────────────────────────\n\n return (\n <div className=\"flex w-full\">\n {reviewState === 'chain' && needsChainSwitch && (\n <ReviewActionChainSwitchRow\n requiredChain={requiredChain}\n needsChainSwitch={needsChainSwitch && currentChainId !== base.chainId}\n reviewState={reviewState}\n goToNextStep={goToNextStep}\n cancel={cancel}\n />\n )}\n {reviewState === 'wrapping' && needsToWrap && (\n <ReviewActionWrapGasToken\n needsToWrap={needsToWrap}\n amount={baseAmount}\n chainId={base.chainId as SupportedChainId}\n token={base}\n reviewState={reviewState}\n setReviewState={setReviewState}\n goToNextStep={goToNextStep}\n cancel={cancel}\n delayedClose={delayedClose}\n isWrappingPair={isWrappingPair}\n />\n )}\n {reviewState === 'unwrapping' && needsToUnwrap && (\n <ReviewActionUnwrapGasToken\n needsToUnwrap={needsToUnwrap}\n amount={baseAmount}\n chainId={base.chainId as SupportedChainId}\n token={base}\n reviewState={reviewState}\n setReviewState={setReviewState}\n goToNextStep={goToNextStep}\n cancel={cancel}\n delayedClose={delayedClose}\n />\n )}\n {reviewState === 'signingOrder' && needsSignature && (\n <ReviewActionSignAndSubmitOrderRow\n base={base}\n baseAmount={baseAmount}\n quote={quote}\n quoteAmount={quoteAmount}\n userAddress={userAddress}\n reviewState={reviewState}\n goToNextStep={goToNextStep}\n cancel={cancel}\n restartSigningFlow={restartSigningFlow}\n onSwapInitiated={onSwapInitiated}\n onOrderSubmitted={onOrderSubmitted}\n isWrappingPair={isWrappingPair}\n isUnwrappingPair={isUnwrappingPair}\n onSwapComplete={onSwapComplete}\n startPolling={startPolling}\n trackNativeTransaction={trackNativeTransaction}\n />\n )}\n {reviewState === 'trackingTx' && trackedOrderHash && (\n <ReviewActionTxRow\n orderHash={trackedOrderHash}\n base={base}\n quote={quote}\n baseAmount={baseAmount}\n quoteAmount={quoteAmount}\n reviewState={reviewState}\n status={txStatus}\n onNewSwap={handleNewSwap}\n onRetry={handleRetrySwap}\n />\n )}\n {/* Fallback for unhandled transitional states */}\n {reviewState &&\n ![\n 'chain',\n 'wrapping',\n 'unwrapping',\n 'approval',\n 'signingOrder',\n 'trackingTx',\n 'success',\n 'wrapSuccess',\n 'cancelled',\n ].includes(reviewState) && (\n <button\n disabled\n className={`w-full ${isCompact ? 'py-2' : 'py-3'} text-sm font-medium`}\n style={{\n backgroundColor: 'var(--widget-muted)',\n color: 'var(--widget-muted-foreground)',\n borderRadius: 'var(--widget-radius)',\n }}\n >\n Processing...\n </button>\n )}\n </div>\n );\n};\n","'use client';\n\nimport { useCallback, useRef } from 'react';\nimport { useTransactionRegistry } from './TransactionRegistryContext';\n\nexport function useTransactionTracker() {\n const { registerTransaction, enabled } = useTransactionRegistry();\n const registeredRef = useRef(new Set<string>());\n\n const trackOrderTransaction = useCallback(\n (quoteId: string, description: string) => {\n if (!enabled || registeredRef.current.has(quoteId)) return;\n registeredRef.current.add(quoteId);\n registerTransaction(quoteId, description);\n },\n [enabled, registerTransaction],\n );\n\n const trackNativeTransaction = useCallback(\n (txHash: string, description: string) => {\n if (!enabled || registeredRef.current.has(txHash)) return;\n registeredRef.current.add(txHash);\n registerTransaction(txHash, description);\n },\n [enabled, registerTransaction],\n );\n\n return { trackOrderTransaction, trackNativeTransaction, txTrackingEnabled: enabled };\n}\n","'use client';\n\nimport { ChainIcon, Checkmark, LoadingSpinner, RedoIcon, isReviewStepPast, type SupportedChainId, type ReviewOrderStep } from '../../internal';\nimport React, { useEffect, useState, useCallback, useRef } from 'react';\nimport { useAccount, useChainId, useSwitchChain } from 'wagmi';\n\ntype ChainState = 'pending' | 'error' | 'success';\n\nconst WALLET_TIMEOUT_MS = 15_000;\n\ninterface IReviewActionChainSwitchRow {\n needsChainSwitch: boolean;\n requiredChain: { chainId: SupportedChainId; name: string };\n reviewState: ReviewOrderStep | null;\n goToNextStep: (componentStep: ReviewOrderStep, currentStep: ReviewOrderStep | null) => void;\n cancel: () => Promise<void>;\n}\n\nconst ComponentStep: ReviewOrderStep = 'chain';\n\nconst ReviewActionChainSwitchRow: React.FC<IReviewActionChainSwitchRow> = ({\n needsChainSwitch, requiredChain, reviewState, goToNextStep, cancel,\n}) => {\n const hasSucceeded = isReviewStepPast(ComponentStep, reviewState);\n const [chainState, setChainState] = useState<ChainState>('pending');\n const isSwitching = useRef(false);\n const switchAttempted = useRef(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const currentChainId = useChainId();\n const { switchChainAsync } = useSwitchChain();\n const { status: wagmiStatus, isReconnecting } = useAccount();\n\n const clearPendingTimeout = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n }, []);\n\n const handleChainSwitch = useCallback(async () => {\n if (isSwitching.current || switchAttempted.current || wagmiStatus !== 'connected' || isReconnecting) return;\n isSwitching.current = true;\n switchAttempted.current = true;\n setChainState('pending');\n\n timeoutRef.current = setTimeout(() => {\n if (isSwitching.current) {\n setChainState('error');\n isSwitching.current = false;\n }\n }, WALLET_TIMEOUT_MS);\n\n try {\n await switchChainAsync({ chainId: requiredChain.chainId });\n clearPendingTimeout();\n setChainState('success');\n goToNextStep(ComponentStep, reviewState);\n } catch {\n clearPendingTimeout();\n setChainState('error');\n } finally {\n isSwitching.current = false;\n }\n }, [switchChainAsync, wagmiStatus, isReconnecting, requiredChain.chainId, goToNextStep, reviewState, clearPendingTimeout]);\n\n useEffect(() => {\n if (isSwitching.current || switchAttempted.current) return;\n if (reviewState === ComponentStep && chainState === 'pending' && wagmiStatus === 'connected' && !isReconnecting) {\n if (needsChainSwitch && currentChainId !== requiredChain.chainId) handleChainSwitch();\n else { setChainState('success'); goToNextStep(ComponentStep, reviewState); }\n }\n }, [reviewState, chainState, needsChainSwitch, currentChainId, requiredChain.chainId, wagmiStatus, isReconnecting, handleChainSwitch, goToNextStep]);\n\n useEffect(() => () => clearPendingTimeout(), [clearPendingTimeout]);\n\n const handleRetry = () => { if (chainState === 'error') { switchAttempted.current = false; setChainState('pending'); } };\n\n const isError = !hasSucceeded && chainState === 'error';\n const showCancel = !hasSucceeded && (chainState === 'pending' || chainState === 'error');\n const statusVar = isError ? 'var(--widget-status-failed)' : 'var(--widget-status-pending)';\n\n return (\n <div className=\"flex w-full flex-row justify-between space-x-3\">\n <button\n type=\"button\"\n className={`inline-flex h-12 w-full items-center justify-center text-sm font-medium transition duration-150 ${isError ? 'cursor-pointer' : 'cursor-not-allowed'}`}\n style={{\n backgroundColor: `color-mix(in srgb, ${statusVar} 12%, transparent)`,\n border: `1px solid color-mix(in srgb, ${statusVar} 20%, transparent)`,\n color: statusVar,\n borderRadius: 'var(--widget-radius)',\n }}\n onClick={isError ? handleRetry : undefined}\n >\n <div className=\"flex h-10 w-full flex-row items-center space-x-3 px-4\">\n <ChainIcon chain={requiredChain.chainId} size=\"xs\" />\n <p className=\"whitespace-nowrap\">{isError ? 'Retry Switch' : `Switch to ${requiredChain.name}`}</p>\n <div className=\"flex flex-1 border-t\" style={{ borderColor: 'var(--widget-border)' }} />\n <div className=\"flex h-6 w-3 items-center justify-center rounded-full\">\n {!hasSucceeded && chainState === 'pending' && <LoadingSpinner size=\"5\" />}\n {(hasSucceeded || chainState === 'success') && <Checkmark className=\"h-8 w-8\" />}\n {isError && <RedoIcon className=\"h-[12px] w-[12px]\" />}\n </div>\n </div>\n </button>\n {showCancel && (\n <button\n type=\"button\"\n className=\"inline-flex h-12 items-center justify-center px-8 text-sm font-medium transition duration-150 cursor-pointer\"\n style={{\n backgroundColor: 'color-mix(in srgb, var(--widget-status-failed) 12%, transparent)',\n border: '1px solid color-mix(in srgb, var(--widget-status-failed) 20%, transparent)',\n color: 'var(--widget-status-failed)',\n borderRadius: 'var(--widget-radius)',\n }}\n onClick={cancel}\n >\n Cancel\n </button>\n )}\n </div>\n );\n};\n\nexport default ReviewActionChainSwitchRow;\n","'use client';\n\nimport { SignSwap, ChainSwitch } from '../../lib/signSwap';\nimport { canSubmitOrder, cleanupOldSubmissions, markOrderAsSubmitted } from '../../lib/submitTracker';\nimport { useRfq, type VtUserStep } from '../../providers/RfqProvider';\nimport {\n Checkmark, LoadingSpinner, RedoIcon, TokenImage,\n getViemChainById, getChainConfig, getRpcUrlsForChain,\n isReviewStepPast,\n type Asset, type ReviewOrderStep,\n} from '../../internal';\nimport { getChainIdForKey } from '../../internal/queries/chains/getAvailableChains';\nimport { waitForTransactionReceipt } from '@wagmi/core';\nimport React, { useCallback, useEffect, useState, useRef } from 'react';\nimport { http, fallback, createPublicClient } from 'viem';\nimport { useAccount, useConfig, useSendTransaction, useSwitchChain, useWalletClient } from 'wagmi';\nimport CountDown from '../CountDown';\n\ntype SignState = 'idle' | 'signing' | 'submitting' | 'success' | 'error' | 'refreshingQuote' | 'stale';\n\nfunction isUserRejectionError(error: Error): boolean {\n return (\n error.name === 'UserRejectedRequestError' ||\n error.message.includes('User rejected') ||\n error.message.includes('rejected') ||\n error.message.includes('denied') ||\n error.message.includes('cancelled') ||\n error.message.includes('canceled')\n );\n}\n\ninterface ReviewActionSignAndSubmitOrderRowProps {\n base: Asset;\n baseAmount: number;\n quote: Asset;\n quoteAmount: number;\n userAddress: string;\n reviewState: ReviewOrderStep | null;\n goToNextStep: (componentStep: ReviewOrderStep, currentStep: ReviewOrderStep | null) => void;\n cancel: () => Promise<void>;\n isWrappingPair: boolean;\n isUnwrappingPair: boolean;\n restartSigningFlow?: (isFromStaleState?: boolean) => void;\n onSwapInitiated?: () => void;\n onOrderSubmitted?: (quoteId: string) => void;\n onSwapComplete?: (quoteId: string) => void;\n startPolling: (quoteId: string, metadata?: { baseToken?: Asset; quoteToken?: Asset }) => void;\n trackNativeTransaction: (txHash: string, description: string) => void;\n}\n\nconst ComponentStep: ReviewOrderStep = 'signingOrder';\n\nasync function executeTransactionStep(\n step: VtUserStep,\n userAddress: string,\n sendTransactionAsync: (args: any) => Promise<`0x${string}`>,\n wagmiConfig: any,\n fallbackChainKey?: string,\n): Promise<`0x${string}`> {\n const encoded = step.transaction?.encoded;\n const to = encoded?.to ?? step.to;\n const data = encoded?.data ?? step.data;\n const value = encoded?.value ?? step.value;\n\n if (!to) throw new Error('Transaction step missing \"to\" address');\n\n const encodedChainId = encoded?.chainId;\n const resolvedChainKey = step.chainKey || fallbackChainKey;\n const chainId = encodedChainId || (resolvedChainKey ? getChainIdForKey(resolvedChainKey) : undefined);\n if (!chainId) throw new Error(`Unknown chain: ${resolvedChainKey}`);\n\n const viemChain = getViemChainById()[chainId];\n const hash = await sendTransactionAsync({\n account: userAddress as `0x${string}`,\n chain: viemChain,\n to: to as `0x${string}`,\n data: (data || '0x') as `0x${string}`,\n value: BigInt(value || '0'),\n });\n\n await waitForTransactionReceipt(wagmiConfig, { hash, chainId });\n return hash;\n}\n\nconst ReviewActionSignAndSubmitOrderRow: React.FC<ReviewActionSignAndSubmitOrderRowProps> = ({\n base, baseAmount, quote, quoteAmount, userAddress, reviewState, goToNextStep, cancel,\n isWrappingPair, isUnwrappingPair, restartSigningFlow, onSwapInitiated, onOrderSubmitted, onSwapComplete,\n startPolling, trackNativeTransaction,\n}) => {\n const hasSucceeded = isReviewStepPast(ComponentStep, reviewState);\n const [signState, setSignState] = useState<SignState>('idle');\n const isProcessing = useRef(false);\n const hasAutoStartedRef = useRef<string | null>(null);\n\n const wagmiConfig = useConfig();\n const { isReconnecting } = useAccount();\n const { rfqQuote, stop: stopRfq, refresh } = useRfq();\n const { data: walletClient } = useWalletClient({ chainId: base.chainId });\n const { switchChain } = useSwitchChain();\n const { sendTransactionAsync } = useSendTransaction();\n\n const quoteReceivedAtMs = rfqQuote?._receivedAt ?? 0;\n\n const isQuoteStale = useCallback(() => {\n if (!quoteReceivedAtMs) return false;\n return Date.now() >= quoteReceivedAtMs + 30 * 1000;\n }, [quoteReceivedAtMs]);\n\n const handleSignAndSubmit = useCallback(async () => {\n if (isProcessing.current || !['idle', 'error'].includes(signState)) return;\n if (!rfqQuote?.id || !rfqQuote?._receivedAt) {\n setSignState('error');\n return;\n }\n\n const validation = canSubmitOrder(rfqQuote.id, rfqQuote._receivedAt);\n if (!validation.canSubmit) {\n setSignState('stale');\n return;\n }\n\n isProcessing.current = true;\n\n try {\n if (!walletClient) throw new Error('Wallet client not available');\n cleanupOldSubmissions();\n\n const steps = rfqQuote.userSteps ?? [];\n let lastTxHash: `0x${string}` | undefined;\n\n for (const step of steps) {\n if (step.type === 'TRANSACTION') {\n setSignState('submitting');\n const resolvedKey = step.chainKey || rfqQuote.srcChainKey;\n const chainId = resolvedKey ? getChainIdForKey(resolvedKey) : undefined;\n if (chainId && (walletClient as any).chain?.id !== chainId) {\n await switchChain({ chainId });\n await new Promise((r) => setTimeout(r, 800));\n }\n lastTxHash = await executeTransactionStep(step, userAddress, sendTransactionAsync, wagmiConfig, rfqQuote.srcChainKey);\n trackNativeTransaction(lastTxHash, step.description || `Tx on ${resolvedKey}`);\n } else if (step.type === 'SIGNATURE') {\n setSignState('signing');\n await SignSwap({\n quote: rfqQuote,\n signatureStep: step,\n userAddress,\n walletClient,\n });\n }\n }\n\n markOrderAsSubmitted(rfqQuote.id, rfqQuote._receivedAt);\n onOrderSubmitted?.(rfqQuote.id);\n startPolling(rfqQuote.id, { baseToken: base, quoteToken: quote });\n onSwapInitiated?.();\n stopRfq();\n\n setSignState('success');\n goToNextStep(ComponentStep, reviewState);\n onSwapComplete?.(rfqQuote.id);\n } catch (error) {\n if (error instanceof Error && isUserRejectionError(error)) {\n hasAutoStartedRef.current = null;\n setSignState('idle');\n } else {\n setSignState('error');\n }\n } finally {\n isProcessing.current = false;\n }\n }, [signState, rfqQuote, walletClient, base, quote, userAddress, stopRfq, startPolling, goToNextStep, reviewState, onSwapComplete, switchChain, sendTransactionAsync, onSwapInitiated, onOrderSubmitted, trackNativeTransaction, wagmiConfig]);\n\n useEffect(() => {\n if (reviewState === ComponentStep) stopRfq();\n\n if (hasSucceeded && signState !== 'success') {\n setSignState('success');\n goToNextStep(ComponentStep, reviewState);\n return;\n }\n if (signState === 'success') {\n goToNextStep(ComponentStep, reviewState);\n return;\n }\n if (reviewState === ComponentStep && signState === 'idle' && !rfqQuote?.id) {\n setSignState('refreshingQuote');\n refresh();\n return;\n }\n if (reviewState === ComponentStep && signState === 'idle' && walletClient && !isProcessing.current && !isReconnecting) {\n const currentId = rfqQuote?.id || null;\n if (currentId && hasAutoStartedRef.current !== currentId) {\n hasAutoStartedRef.current = currentId;\n handleSignAndSubmit();\n }\n }\n }, [hasSucceeded, reviewState, signState, walletClient, isReconnecting, handleSignAndSubmit, goToNextStep, rfqQuote?.id, refresh, stopRfq]);\n\n useEffect(() => {\n if (signState === 'refreshingQuote' && rfqQuote?.id) {\n setSignState('idle');\n }\n }, [signState, rfqQuote?.id]);\n\n useEffect(() => {\n if (reviewState !== ComponentStep) hasAutoStartedRef.current = null;\n }, [reviewState]);\n\n useEffect(() => {\n const interval = setInterval(() => {\n if (isQuoteStale() && !isProcessing.current && signState !== 'submitting' && signState !== 'success') {\n setSignState('stale');\n }\n }, 1000);\n return () => clearInterval(interval);\n }, [isQuoteStale, signState]);\n\n const handleRetry = () => {\n if (signState === 'error' && !isProcessing.current) {\n hasAutoStartedRef.current = null;\n setSignState('idle');\n }\n };\n\n const handleRefreshFromStale = useCallback(() => {\n hasAutoStartedRef.current = null;\n setSignState('refreshingQuote');\n refresh();\n }, [refresh]);\n\n const handleCloseWalletAndRestart = useCallback(() => {\n if (restartSigningFlow) {\n restartSigningFlow(true);\n } else {\n cancel();\n }\n }, [restartSigningFlow, cancel]);\n\n const buttonText = () => {\n if (signState === 'error') return 'Retry swap';\n if (signState === 'signing') return 'Sign Swap Order';\n if (signState === 'submitting') return 'Submitting...';\n if (signState === 'refreshingQuote') return 'Refreshing Quote...';\n if (signState === 'stale') return 'Quote Stale';\n return 'Sign & Submit';\n };\n\n const isErrorOrStale = !hasSucceeded && (signState === 'error' || signState === 'stale');\n const statusVar = isErrorOrStale ? 'var(--widget-status-failed)' : 'var(--widget-status-pending)';\n\n return (\n <div className=\"flex w-full flex-row justify-between space-x-3\">\n <button\n type=\"button\"\n className={`inline-flex h-12 w-full items-center justify-center text-sm font-medium transition duration-150 ${isErrorOrStale ? 'cursor-pointer' : 'cursor-not-allowed'}`}\n style={{\n backgroundColor: `color-mix(in srgb, ${statusVar} 12%, transparent)`,\n border: `1px solid color-mix(in srgb, ${statusVar} 20%, transparent)`,\n color: statusVar,\n borderRadius: 'var(--widget-radius)',\n }}\n onClick={\n !hasSucceeded && signState === 'error'\n ? handleRetry\n : signState === 'stale'\n ? handleCloseWalletAndRestart\n : undefined\n }\n >\n <div className=\"flex h-10 w-full flex-row items-center space-x-3 px-4\">\n <TokenImage asset={base} size=\"xs\" noChain />\n <p className=\"whitespace-nowrap\">{buttonText()}</p>\n <div className=\"flex flex-1 border-t\" style={{ borderColor: 'var(--widget-border)' }} />\n {quoteReceivedAtMs > 0 && signState !== 'success' && signState !== 'error' && signState !== 'stale' && (\n <CountDown startTime={quoteReceivedAtMs} onExpired={() => setSignState('stale')} />\n )}\n <div className=\"flex h-6 w-3 items-center justify-center rounded-full\">\n {!hasSucceeded && (signState === 'idle' || signState === 'signing' || signState === 'submitting' || signState === 'refreshingQuote') && <LoadingSpinner size=\"5\" />}\n {(hasSucceeded || signState === 'success') && <Checkmark className=\"h-8 w-8\" />}\n {!hasSucceeded && (signState === 'error' || signState === 'stale') && <RedoIcon className=\"h-[12px] w-[12px]\" />}\n </div>\n </div>\n </button>\n {!hasSucceeded && signState === 'error' && (\n <button\n type=\"button\"\n className=\"inline-flex h-12 items-center justify-center px-8 text-sm font-medium transition duration-150 cursor-pointer\"\n style={{\n backgroundColor: 'color-mix(in srgb, var(--widget-status-failed) 12%, transparent)',\n border: '1px solid color-mix(in srgb, var(--widget-status-failed) 20%, transparent)',\n color: 'var(--widget-status-failed)',\n borderRadius: 'var(--widget-radius)',\n }}\n onClick={cancel}\n >\n Cancel\n </button>\n )}\n </div>\n );\n};\n\nexport default ReviewActionSignAndSubmitOrderRow;\n","'use client';\n\nimport React, { useEffect, useRef, useState } from 'react';\n\ninterface CountDownProps {\n startTime: number;\n onExpired: () => void;\n}\n\nconst CountDown: React.FC<CountDownProps> = ({ startTime, onExpired }) => {\n const [timeLeft, setTimeLeft] = useState<number>(30);\n const [isExpired, setIsExpired] = useState<boolean>(false);\n const firedRef = useRef(false);\n const onExpiredRef = useRef(onExpired);\n onExpiredRef.current = onExpired;\n\n useEffect(() => {\n firedRef.current = false;\n }, [startTime]);\n\n useEffect(() => {\n const calculateTimeLeft = () => {\n const now = Date.now();\n const startTimeMs = startTime > 9999999999 ? startTime : startTime * 1000;\n const expirationTime = startTimeMs + 30 * 1000;\n const remaining = Math.max(0, expirationTime - now);\n const remainingSeconds = Math.floor(remaining / 1000);\n\n if (remainingSeconds <= 0) {\n setTimeLeft(0);\n if (!firedRef.current) {\n firedRef.current = true;\n setIsExpired(true);\n onExpiredRef.current();\n }\n return;\n }\n\n setTimeLeft(remainingSeconds);\n setIsExpired(false);\n };\n\n if (isExpired) return;\n\n calculateTimeLeft();\n const interval = setInterval(calculateTimeLeft, 1000);\n return () => clearInterval(interval);\n }, [startTime, isExpired]);\n\n const formatTime = (seconds: number) => {\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\n };\n\n if (isExpired) return null;\n\n return <span className=\"text-xs font-mono\">{formatTime(timeLeft)}</span>;\n};\n\nexport default CountDown;\n","'use client';\n\nimport type { ToastStatus } from '../../stores/swapUIStore';\nimport {\n Checkmark,\n LoadingSpinner,\n RedoAnimation,\n XAnimation,\n isReviewStepPast,\n type Asset,\n type ReviewOrderStep,\n} from '../../internal';\nimport React, { useEffect } from 'react';\n\nconst ComponentStep: ReviewOrderStep = 'trackingTx';\n\ninterface IReviewActionTxRow {\n orderHash: string;\n base: Asset;\n quote: Asset;\n baseAmount: number;\n quoteAmount: number;\n reviewState: ReviewOrderStep | null;\n onNewSwap: () => void;\n onRetry: () => void;\n status: ToastStatus;\n}\n\nconst statusConfig = {\n pending: {\n icon: <LoadingSpinner size=\"5\" />,\n buttonText: 'Trade Pending',\n showNewSwap: false,\n statusVar: 'var(--widget-status-pending)',\n clickable: false,\n },\n received: {\n icon: <LoadingSpinner size=\"5\" />,\n buttonText: 'Trade Received',\n showNewSwap: false,\n statusVar: 'var(--widget-status-received)',\n clickable: false,\n },\n completed: {\n icon: <Checkmark />,\n buttonText: 'Continue Swapping',\n showNewSwap: true,\n statusVar: 'var(--widget-status-completed)',\n clickable: true,\n },\n failed: {\n icon: <XAnimation />,\n buttonText: 'Retry Swap',\n showNewSwap: true,\n statusVar: 'var(--widget-status-failed)',\n clickable: true,\n },\n cancelled: {\n icon: <XAnimation />,\n buttonText: 'Continue Swapping',\n showNewSwap: true,\n statusVar: 'var(--widget-status-failed)',\n clickable: true,\n },\n} as const;\n\nconst ReviewActionTxRow: React.FC<IReviewActionTxRow> = ({\n orderHash, base, quote, baseAmount, quoteAmount, reviewState, onNewSwap, onRetry, status,\n}) => {\n const hasSucceeded = isReviewStepPast(ComponentStep, reviewState);\n const config = statusConfig[status] || statusConfig.pending;\n\n useEffect(() => {\n if (status === 'completed') {\n const timer = setTimeout(onNewSwap, 5000);\n return () => clearTimeout(timer);\n }\n }, [status, onNewSwap]);\n\n const handleClick = () => {\n if (status === 'failed') onRetry();\n else if (config.showNewSwap) onNewSwap();\n };\n\n const sv = config.statusVar;\n\n return (\n <div className=\"flex flex-row justify-between space-x-3 w-full\">\n <button\n type=\"button\"\n className={`inline-flex h-12 w-full items-center justify-center text-sm font-medium transition duration-150 ${config.clickable ? 'cursor-pointer' : 'cursor-not-allowed'}`}\n style={{\n backgroundColor: `color-mix(in srgb, ${sv} 12%, transparent)`,\n border: `1px solid color-mix(in srgb, ${sv} 20%, transparent)`,\n color: sv,\n borderRadius: 'var(--widget-radius)',\n }}\n onClick={config.showNewSwap ? handleClick : undefined}\n >\n <div className=\"flex h-10 w-full flex-row items-center space-x-3 px-4\">\n <div className=\"flex h-6 w-6 items-center justify-center rounded-full\">\n {config.icon}\n </div>\n <p className=\"whitespace-nowrap\">{config.buttonText}</p>\n <div className=\"flex flex-1 border-t\" style={{ borderColor: 'var(--widget-border)' }} />\n {config.showNewSwap && (\n <div className=\"flex h-6 w-6 items-center justify-center\">\n <RedoAnimation />\n </div>\n )}\n </div>\n </button>\n </div>\n );\n};\n\nexport default ReviewActionTxRow;\n","'use client';\n\nimport { useEmitBalanceEvent } from '../../hooks/useBalanceEventListener';\nimport { useUnwrapToken } from '../../queries/useUnwrapToken';\nimport { Checkmark, LoadingSpinner, RedoIcon, getChainConfig, isReviewStepPast, NATIVE_ASSET_ADDRESS, type SupportedChainId, type Asset, type ReviewOrderStep } from '../../internal';\nimport { useWalletState } from '../../wallet/useWalletState';\nimport React, { useCallback, useEffect, useState, useRef } from 'react';\nimport { parseUnits } from 'viem';\nimport { useAccount, useWriteContract } from 'wagmi';\n\ntype UnwrappingState = 'idle' | 'pending' | 'error' | 'success';\n\nconst WALLET_TIMEOUT_MS = 15_000;\n\ninterface ReviewActionUnwrapGasTokenProps {\n needsToUnwrap: boolean;\n amount: number;\n chainId: SupportedChainId;\n token?: Asset;\n reviewState: ReviewOrderStep | null;\n setReviewState: (state: ReviewOrderStep | null) => void;\n goToNextStep: (componentStep: ReviewOrderStep, currentStep: ReviewOrderStep | null) => void;\n cancel: () => Promise<void>;\n delayedClose: () => Promise<void>;\n}\n\nconst ComponentStep: ReviewOrderStep = 'unwrapping';\n\nconst ReviewActionUnwrapGasToken: React.FC<ReviewActionUnwrapGasTokenProps> = ({\n needsToUnwrap, amount, chainId, token, reviewState, setReviewState, goToNextStep, cancel, delayedClose,\n}) => {\n const hasSucceeded = isReviewStepPast(ComponentStep, reviewState);\n const [unwrappingState, setUnwrappingState] = useState<UnwrappingState>('idle');\n const unwrapMutation = useUnwrapToken();\n const { writeContractAsync } = useWriteContract();\n const { address } = useWalletState();\n const emitBalanceEvent = useEmitBalanceEvent();\n const isUnwrapping = useRef(false);\n const unwrapAttempted = useRef(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const { status: wagmiStatus } = useAccount();\n\n const clearPendingTimeout = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n }, []);\n\n const handleUnwrap = useCallback(async () => {\n if (isUnwrapping.current || unwrapAttempted.current || !address || wagmiStatus !== 'connected') return;\n isUnwrapping.current = true;\n unwrapAttempted.current = true;\n setUnwrappingState('pending');\n\n timeoutRef.current = setTimeout(() => {\n if (isUnwrapping.current) {\n setUnwrappingState('error');\n isUnwrapping.current = false;\n }\n }, WALLET_TIMEOUT_MS);\n\n try {\n const chainConfig = getChainConfig(chainId);\n if (!chainConfig) throw new Error(`No config for chain ${chainId}`);\n const wrappedDecimals = chainConfig.wrappedAsset.decimals ?? chainConfig.nativeAsset.decimals;\n const amountRaw = parseUnits(amount.toString(), wrappedDecimals);\n await unwrapMutation.mutateAsync({\n chainId, accountAddress: address as `0x${string}`, amountRaw, writeContractAsync,\n });\n const nativeAsset: Asset = {\n symbol: chainConfig.nativeAsset.symbol, name: chainConfig.nativeAsset.name,\n address: NATIVE_ASSET_ADDRESS, decimals: chainConfig.nativeAsset.decimals, chainId,\n };\n const wrappedAsset: Asset = {\n symbol: chainConfig.wrappedAsset.symbol, name: chainConfig.wrappedAsset.name,\n address: chainConfig.wrappedAsset.address, decimals: chainConfig.wrappedAsset.decimals, chainId,\n };\n emitBalanceEvent({\n type: 'unwrap',\n tokens: [\n { asset: nativeAsset, userAddress: address },\n { asset: wrappedAsset, userAddress: address },\n ],\n });\n clearPendingTimeout();\n setUnwrappingState('success');\n goToNextStep(ComponentStep, reviewState);\n await delayedClose();\n } catch {\n clearPendingTimeout();\n setUnwrappingState('error');\n } finally {\n isUnwrapping.current = false;\n }\n }, [address, wagmiStatus, chainId, amount, unwrapMutation, writeContractAsync, emitBalanceEvent, goToNextStep, reviewState, delayedClose, clearPendingTimeout]);\n\n useEffect(() => {\n if (isUnwrapping.current || unwrapAttempted.current) return;\n if (reviewState === ComponentStep && unwrappingState === 'idle' && wagmiStatus === 'connected') {\n if (needsToUnwrap) handleUnwrap();\n else { setUnwrappingState('success'); goToNextStep(ComponentStep, reviewState); }\n }\n }, [reviewState, unwrappingState, needsToUnwrap, wagmiStatus, handleUnwrap, goToNextStep]);\n\n useEffect(() => () => clearPendingTimeout(), [clearPendingTimeout]);\n\n const handleRetry = () => { if (unwrappingState === 'error') { unwrapAttempted.current = false; setUnwrappingState('idle'); } };\n\n const isError = !hasSucceeded && unwrappingState === 'error';\n const showCancel = !hasSucceeded && (unwrappingState === 'pending' || unwrappingState === 'idle' || unwrappingState === 'error');\n const statusVar = isError ? 'var(--widget-status-failed)' : 'var(--widget-status-pending)';\n\n return (\n <div className=\"flex w-full flex-row justify-between space-x-3\">\n <button\n type=\"button\"\n className={`inline-flex h-12 w-full items-center justify-center text-sm font-medium transition duration-150 ${isError ? 'cursor-pointer' : 'cursor-not-allowed'}`}\n style={{\n backgroundColor: `color-mix(in srgb, ${statusVar} 12%, transparent)`,\n border: `1px solid color-mix(in srgb, ${statusVar} 20%, transparent)`,\n color: statusVar,\n borderRadius: 'var(--widget-radius)',\n }}\n onClick={isError ? handleRetry : undefined}\n >\n <div className=\"flex h-10 w-full flex-row items-center space-x-3 px-4\">\n <p className=\"whitespace-nowrap\">{isError ? 'Retry Unwrap' : token ? `Unwrap ${token.symbol}` : 'Unwrap Native Token'}</p>\n <div className=\"flex flex-1 border-t\" style={{ borderColor: 'var(--widget-border)' }} />\n <div className=\"flex h-6 w-3 items-center justify-center rounded-full\">\n {!hasSucceeded && (unwrappingState === 'pending' || unwrappingState === 'idle') && <LoadingSpinner size=\"5\" />}\n {(hasSucceeded || unwrappingState === 'success') && <Checkmark className=\"h-8 w-8\" />}\n {isError && <RedoIcon className=\"h-[12px] w-[12px]\" />}\n </div>\n </div>\n </button>\n {showCancel && (\n <button\n type=\"button\"\n className=\"inline-flex h-12 items-center justify-center px-8 text-sm font-medium transition duration-150 cursor-pointer\"\n style={{\n backgroundColor: 'color-mix(in srgb, var(--widget-status-failed) 12%, transparent)',\n border: '1px solid color-mix(in srgb, var(--widget-status-failed) 20%, transparent)',\n color: 'var(--widget-status-failed)',\n borderRadius: 'var(--widget-radius)',\n }}\n onClick={cancel}\n >\n Cancel\n </button>\n )}\n </div>\n );\n};\n\nexport default ReviewActionUnwrapGasToken;\n","'use client';\n\nimport { useEmitBalanceEvent } from '../../hooks/useBalanceEventListener';\nimport { useWrapToken } from '../../queries/useWrapToken';\nimport { Checkmark, LoadingSpinner, RedoIcon, TokenImage, getChainConfig, isReviewStepPast, NATIVE_ASSET_ADDRESS, type SupportedChainId, type Asset, type ReviewOrderStep } from '../../internal';\nimport { useWalletState } from '../../wallet/useWalletState';\nimport React, { useCallback, useEffect, useState, useRef } from 'react';\nimport { parseUnits } from 'viem';\nimport { useAccount, useWriteContract } from 'wagmi';\n\ntype WrappingState = 'idle' | 'pending' | 'error' | 'success';\n\nconst WALLET_TIMEOUT_MS = 15_000;\n\ninterface ReviewActionWrapGasTokenProps {\n needsToWrap: boolean;\n amount: number;\n chainId: SupportedChainId;\n token?: Asset;\n reviewState: ReviewOrderStep | null;\n setReviewState: (state: ReviewOrderStep | null) => void;\n goToNextStep: (componentStep: ReviewOrderStep, currentStep: ReviewOrderStep | null) => void;\n cancel: () => Promise<void>;\n delayedClose: () => Promise<void>;\n isWrappingPair: boolean;\n}\n\nconst ComponentStep: ReviewOrderStep = 'wrapping';\n\nconst ReviewActionWrapGasToken: React.FC<ReviewActionWrapGasTokenProps> = ({\n needsToWrap, amount, chainId, token, reviewState, setReviewState, goToNextStep, cancel, delayedClose, isWrappingPair,\n}) => {\n const hasSucceeded = isReviewStepPast(ComponentStep, reviewState);\n const [wrappingState, setWrappingState] = useState<WrappingState>('idle');\n const wrapMutation = useWrapToken();\n const { writeContractAsync } = useWriteContract();\n const { address } = useWalletState();\n const emitBalanceEvent = useEmitBalanceEvent();\n const isWrapping = useRef(false);\n const wrapAttempted = useRef(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const { status: wagmiStatus } = useAccount();\n\n const clearPendingTimeout = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n }, []);\n\n const handleWrap = useCallback(async () => {\n if (isWrapping.current || wrapAttempted.current || !address || wagmiStatus !== 'connected') return;\n isWrapping.current = true;\n wrapAttempted.current = true;\n setWrappingState('pending');\n\n timeoutRef.current = setTimeout(() => {\n if (isWrapping.current) {\n setWrappingState('error');\n isWrapping.current = false;\n }\n }, WALLET_TIMEOUT_MS);\n\n try {\n const chainConfig = getChainConfig(chainId);\n if (!chainConfig) throw new Error(`No config for chain ${chainId}`);\n const amountRaw = parseUnits(amount.toString(), chainConfig.nativeAsset.decimals);\n await wrapMutation.mutateAsync({\n chainId, accountAddress: address as `0x${string}`, amountRaw, writeContractAsync,\n });\n const nativeAsset: Asset = {\n symbol: chainConfig.nativeAsset.symbol, name: chainConfig.nativeAsset.name,\n address: NATIVE_ASSET_ADDRESS, decimals: chainConfig.nativeAsset.decimals, chainId,\n };\n const wrappedAsset: Asset = {\n symbol: chainConfig.wrappedAsset.symbol, name: chainConfig.wrappedAsset.name,\n address: chainConfig.wrappedAsset.address, decimals: chainConfig.wrappedAsset.decimals, chainId,\n };\n emitBalanceEvent({\n type: 'wrap',\n tokens: [\n { asset: nativeAsset, userAddress: address },\n { asset: wrappedAsset, userAddress: address },\n ],\n });\n clearPendingTimeout();\n setWrappingState('success');\n goToNextStep(ComponentStep, reviewState);\n if (isWrappingPair) await delayedClose();\n } catch {\n clearPendingTimeout();\n setWrappingState('error');\n } finally {\n isWrapping.current = false;\n }\n }, [address, wagmiStatus, chainId, amount, wrapMutation, writeContractAsync, emitBalanceEvent, goToNextStep, reviewState, delayedClose, isWrappingPair, clearPendingTimeout]);\n\n useEffect(() => {\n if (isWrapping.current || wrapAttempted.current) return;\n if (reviewState === ComponentStep && wrappingState === 'idle' && wagmiStatus === 'connected') {\n if (needsToWrap) handleWrap();\n else { setWrappingState('success'); goToNextStep(ComponentStep, reviewState); }\n }\n }, [reviewState, wrappingState, needsToWrap, wagmiStatus, handleWrap, goToNextStep]);\n\n useEffect(() => () => clearPendingTimeout(), [clearPendingTimeout]);\n\n const handleRetry = () => { if (wrappingState === 'error') { wrapAttempted.current = false; setWrappingState('idle'); } };\n\n const isError = !hasSucceeded && wrappingState === 'error';\n const showCancel = !hasSucceeded && (wrappingState === 'pending' || wrappingState === 'idle' || wrappingState === 'error');\n const statusVar = isError ? 'var(--widget-status-failed)' : 'var(--widget-status-pending)';\n\n return (\n <div className=\"flex w-full flex-row justify-between space-x-3\">\n <button\n type=\"button\"\n className={`inline-flex h-12 w-full items-center justify-center text-sm font-medium transition duration-150 ${isError ? 'cursor-pointer' : 'cursor-not-allowed'}`}\n style={{\n backgroundColor: `color-mix(in srgb, ${statusVar} 12%, transparent)`,\n border: `1px solid color-mix(in srgb, ${statusVar} 20%, transparent)`,\n color: statusVar,\n borderRadius: 'var(--widget-radius)',\n }}\n onClick={isError ? handleRetry : undefined}\n >\n <div className=\"flex h-10 w-full flex-row items-center space-x-3 px-4\">\n <p className=\"whitespace-nowrap\">{isError ? 'Retry Wrap' : token ? `Wrap ${token.symbol}` : 'Wrap Native Token'}</p>\n <div className=\"flex flex-1 border-t\" style={{ borderColor: 'var(--widget-border)' }} />\n <div className=\"flex h-6 w-3 items-center justify-center rounded-full\">\n {!hasSucceeded && (wrappingState === 'pending' || wrappingState === 'idle') && <LoadingSpinner size=\"5\" />}\n {(hasSucceeded || wrappingState === 'success') && <Checkmark className=\"h-8 w-8\" />}\n {isError && <RedoIcon className=\"h-[12px] w-[12px]\" />}\n </div>\n </div>\n </button>\n {showCancel && (\n <button\n type=\"button\"\n className=\"inline-flex h-12 items-center justify-center px-8 text-sm font-medium transition duration-150 cursor-pointer\"\n style={{\n backgroundColor: 'color-mix(in srgb, var(--widget-status-failed) 12%, transparent)',\n border: '1px solid color-mix(in srgb, var(--widget-status-failed) 20%, transparent)',\n color: 'var(--widget-status-failed)',\n borderRadius: 'var(--widget-radius)',\n }}\n onClick={cancel}\n >\n Cancel\n </button>\n )}\n </div>\n );\n};\n\nexport default ReviewActionWrapGasToken;\n","'use client';\n\nimport {\n Checkmark,\n LoadingSpinner,\n TokenImage,\n XAnimation,\n formatNumber,\n type Asset,\n} from '../../internal';\nimport React, { useState, useCallback, useRef, useEffect } from 'react';\nimport { useShallow } from 'zustand/react/shallow';\nimport type { ToastStatus } from '../../stores/swapUIStore';\nimport { useWidgetSwapUIStore } from '../../stores/swapUIStore';\n\ninterface TxStatusDisplayProps {\n orderHash: string;\n base: Asset;\n quote: Asset;\n baseAmount: number;\n quoteAmount: number;\n status: ToastStatus | string;\n}\n\nconst 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\nconst statusLabels: Record<string, { title: string; subtitle: string }> = {\n pending: { title: 'Trade Pending', subtitle: 'Submitting to network' },\n received: { title: 'Trade Received', subtitle: 'Processing settlement' },\n completed: { title: 'Trade Filled', subtitle: 'Settlement complete' },\n failed: { title: 'Trade Failed', subtitle: 'Settlement unsuccessful' },\n cancelled: { title: 'Trade Cancelled', subtitle: 'Order was cancelled' },\n};\n\nfunction getStatusStyles(status: string) {\n const v = statusVarMap[status] ?? statusVarMap.pending;\n return {\n textColor: v,\n bgColor: `color-mix(in srgb, ${v} 15%, transparent)`,\n borderColor: `color-mix(in srgb, ${v} 20%, transparent)`,\n cardBgColor: `color-mix(in srgb, ${v} 8%, transparent)`,\n cardBorderColor: `color-mix(in srgb, ${v} 15%, transparent)`,\n iconBgColor: `color-mix(in srgb, ${v} 12%, transparent)`,\n iconBorderColor: `color-mix(in srgb, ${v} 15%, transparent)`,\n };\n}\n\nconst StatusIcon = ({ status }: { status: string }) => {\n switch (status) {\n case 'completed':\n return <Checkmark />;\n case 'failed':\n case 'cancelled':\n return <XAnimation />;\n default:\n return <LoadingSpinner size=\"10\" />;\n }\n};\n\nconst TxStatusDisplay: React.FC<TxStatusDisplayProps> = ({\n orderHash,\n base,\n quote,\n baseAmount,\n quoteAmount,\n status,\n}) => {\n const [copied, setCopied] = useState(false);\n const receivedTimeRef = useRef<number | null>(null);\n const submissionTimeRef = useRef<number>(Date.now());\n const [transactionSpeed, setTransactionSpeed] = useState<number | null>(null);\n const copyTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const { isRecipientInputOpen, recipient } = useWidgetSwapUIStore(\n useShallow((state) => ({\n isRecipientInputOpen: state.isRecipientInputOpen,\n recipient: state.recipient,\n })),\n );\n\n useEffect(() => {\n if (status === 'received') receivedTimeRef.current = Date.now();\n }, [status]);\n\n useEffect(() => {\n if (status === 'completed' && !transactionSpeed) {\n const startTime = receivedTimeRef.current || submissionTimeRef.current;\n setTransactionSpeed((Date.now() - startTime) / 1000);\n }\n }, [status, transactionSpeed]);\n\n useEffect(() => {\n return () => {\n if (copyTimerRef.current) clearTimeout(copyTimerRef.current);\n };\n }, []);\n\n const handleCopyHash = useCallback(() => {\n if (!navigator.clipboard?.writeText) return;\n navigator.clipboard.writeText(orderHash).then(() => {\n setCopied(true);\n if (copyTimerRef.current) clearTimeout(copyTimerRef.current);\n copyTimerRef.current = setTimeout(() => setCopied(false), 2000);\n }).catch(() => { /* non-secure context or denied */ });\n }, [orderHash]);\n\n const labels = statusLabels[status as string] ?? statusLabels.pending;\n const config = getStatusStyles(status as string);\n const formattedBaseAmount = formatNumber(baseAmount);\n const formattedQuoteAmount = formatNumber(quoteAmount);\n\n return (\n <div\n className=\"relative w-full h-full overflow-hidden flex flex-col\"\n style={{\n backgroundColor: config.bgColor,\n border: `1px var(--widget-border-style) ${config.borderColor}`,\n backdropFilter: 'blur(8px)',\n }}\n >\n <div className=\"relative z-10 px-3 pt-5 pb-3 flex-1 flex flex-col\">\n {/* Status Header */}\n <div className=\"flex items-center justify-center mb-2\">\n <div className=\"flex flex-col items-center gap-1 text-center\">\n <div\n className=\"flex h-10 w-10 items-center justify-center rounded-full border\"\n style={{\n backgroundColor: config.iconBgColor,\n borderColor: config.iconBorderColor,\n }}\n >\n <div className=\"h-7 w-7 flex items-center justify-center\">\n <StatusIcon status={status as string} />\n </div>\n </div>\n <div>\n <h3\n className=\"text-xl font-bold\"\n style={{ color: config.textColor }}\n >\n {labels.title}\n </h3>\n <p\n className=\"text-2xs uppercase tracking-wider\"\n style={{ color: config.textColor, opacity: 0.6 }}\n >\n {labels.subtitle}\n </p>\n </div>\n </div>\n </div>\n\n {/* Trade Details */}\n <div className=\"flex-1 flex flex-col justify-center\">\n <div className=\"space-y-1.5\">\n {/* From */}\n <div\n className=\"flex items-center justify-between backdrop-blur-sm p-2.5 border transition-all duration-300\"\n style={{\n backgroundColor: config.cardBgColor,\n borderColor: config.cardBorderColor,\n }}\n >\n <div className=\"flex items-center gap-2.5\">\n <TokenImage asset={base} size=\"sm\" />\n <div>\n <div\n className=\"text-sm font-bold\"\n style={{ color: config.textColor }}\n >\n {base.symbol}\n </div>\n <div\n className=\"text-2xs\"\n style={{ color: config.textColor, opacity: 0.5 }}\n >\n {base.name}\n </div>\n </div>\n </div>\n <div className=\"text-right\">\n <div\n className=\"text-lg font-bold mono\"\n style={{ color: config.textColor }}\n >\n {formattedBaseAmount}\n </div>\n {base.price && (\n <div\n className=\"text-2xs mono\"\n style={{ color: config.textColor, opacity: 0.5 }}\n >\n ${(base.price * baseAmount).toFixed(2)}\n </div>\n )}\n </div>\n </div>\n\n {/* Arrow */}\n <div className=\"flex justify-center pb-0.5 pt-1\">\n <div\n className=\"flex h-6 w-6 items-center justify-center rounded-full border\"\n style={{\n backgroundColor: config.cardBgColor,\n borderColor: config.cardBorderColor,\n }}\n >\n <span className=\"text-base\" style={{ color: config.textColor }}>\n ↓\n </span>\n </div>\n </div>\n\n {/* To */}\n <div\n className=\"flex items-center justify-between backdrop-blur-sm p-2.5 border transition-all duration-300\"\n style={{\n backgroundColor: config.cardBgColor,\n borderColor: config.cardBorderColor,\n }}\n >\n <div className=\"flex items-center gap-2.5\">\n <TokenImage asset={quote} size=\"sm\" />\n <div>\n <div\n className=\"text-sm font-bold\"\n style={{ color: config.textColor }}\n >\n {quote.symbol}\n </div>\n <div\n className=\"text-2xs\"\n style={{ color: config.textColor, opacity: 0.5 }}\n >\n {quote.name}\n </div>\n </div>\n </div>\n <div className=\"text-right\">\n <div\n className=\"text-lg font-bold mono\"\n style={{ color: config.textColor }}\n >\n {formattedQuoteAmount}\n </div>\n {quote.price && (\n <div\n className=\"text-2xs mono\"\n style={{ color: config.textColor, opacity: 0.5 }}\n >\n ${(quote.price * quoteAmount).toFixed(2)}\n </div>\n )}\n </div>\n </div>\n\n {/* Recipient */}\n {isRecipientInputOpen && recipient && (\n <div className=\"mt-1.5\">\n <div\n className=\"text-2xs mb-0.5 uppercase tracking-wider font-medium\"\n style={{ color: config.textColor, opacity: 0.5 }}\n >\n Recipient\n </div>\n <div\n className=\"flex items-center backdrop-blur-sm p-2 border transition-all duration-300\"\n style={{\n backgroundColor: config.cardBgColor,\n borderColor: config.cardBorderColor,\n }}\n >\n <div className=\"flex items-center gap-2\">\n <div\n className=\"flex h-5 w-5 items-center justify-center overflow-hidden rounded-full\"\n style={{ backgroundColor: config.iconBgColor }}\n >\n <span className=\"text-2xs\">👤</span>\n </div>\n <div className=\"flex flex-col\">\n <div\n className=\"text-2xs\"\n style={{ color: config.textColor, opacity: 0.5 }}\n >\n To:\n </div>\n <div\n className=\"text-xs mono\"\n style={{ color: config.textColor }}\n >\n {recipient.slice(0, 6)}...{recipient.slice(-4)}\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Footer */}\n <div\n className=\"mt-3 pt-2.5 space-y-1.5\"\n style={{ borderTop: `1px solid ${config.cardBorderColor}` }}\n >\n <div\n role=\"button\"\n tabIndex={0}\n onClick={handleCopyHash}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleCopyHash(); } }}\n className=\"flex items-center justify-between cursor-pointer group hover:opacity-80 transition-opacity\"\n >\n <div\n className=\"text-xs uppercase tracking-wider font-medium\"\n style={{ color: config.textColor, opacity: 0.5 }}\n >\n {copied\n ? 'Copied!'\n : status === 'completed' ||\n status === 'failed' ||\n status === 'cancelled'\n ? 'Order Hash'\n : status === 'received'\n ? 'Received'\n : 'Pending'}\n </div>\n <div\n className=\"text-xs mono transition-colors\"\n style={{ color: config.textColor }}\n >\n {orderHash.slice(0, 6)}...{orderHash.slice(-4)}\n </div>\n </div>\n\n {status === 'completed' && transactionSpeed ? (\n <div className=\"flex items-center justify-between\">\n <div\n className=\"text-xs uppercase tracking-wider font-medium\"\n style={{ color: config.textColor, opacity: 0.5 }}\n >\n Speed\n </div>\n <div\n className=\"text-base font-bold mono\"\n style={{ color: config.textColor }}\n >\n {transactionSpeed.toFixed(2)}s\n </div>\n </div>\n ) : (\n <div className=\"h-5\" />\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default TxStatusDisplay;\n"]}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
__commonJS
|
|
4
|
+
} from "./chunk-GGM3MDFM.js";
|
|
5
|
+
|
|
6
|
+
// node_modules/ethereum-gradient-base64/dist/main.js
|
|
7
|
+
var require_main = __commonJS({
|
|
8
|
+
"node_modules/ethereum-gradient-base64/dist/main.js"(exports, module) {
|
|
9
|
+
"use strict";
|
|
10
|
+
!(function(t, e) {
|
|
11
|
+
"object" == typeof exports && "object" == typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define([], e) : "object" == typeof exports ? exports["ethereum-gradient-base64"] = e() : t["ethereum-gradient-base64"] = e();
|
|
12
|
+
})(exports, (() => {
|
|
13
|
+
return t = { 727: (t2) => {
|
|
14
|
+
function e2(t3, e3, n) {
|
|
15
|
+
return n < 0 && (n += 1), n > 1 && (n -= 1), n < 1 / 6 ? t3 + 6 * (e3 - t3) * n : n < 0.5 ? e3 : n < 2 / 3 ? t3 + (e3 - t3) * (2 / 3 - n) * 6 : t3;
|
|
16
|
+
}
|
|
17
|
+
t2.exports = function(t3, n, o) {
|
|
18
|
+
let r, a, s;
|
|
19
|
+
if (0 == n) r = a = s = o;
|
|
20
|
+
else {
|
|
21
|
+
const i = o < 0.5 ? o * (1 + n) : o + n - o * n, l = 2 * o - i;
|
|
22
|
+
r = e2(l, i, t3 + 1 / 3), a = e2(l, i, t3), s = e2(l, i, t3 - 1 / 3);
|
|
23
|
+
}
|
|
24
|
+
return [Math.round(255 * r), Math.round(255 * a), Math.round(255 * s), 255];
|
|
25
|
+
};
|
|
26
|
+
}, 225: (t2, e2, n) => {
|
|
27
|
+
const o = n(727), r = new Array(4);
|
|
28
|
+
function a() {
|
|
29
|
+
const t3 = r[0] ^ r[0] << 11;
|
|
30
|
+
return r[0] = r[1], r[1] = r[2], r[2] = r[3], r[3] = r[3] ^ r[3] >> 19 ^ t3 ^ t3 >> 8, (r[3] >>> 0) / (1 << 31 >>> 0);
|
|
31
|
+
}
|
|
32
|
+
function s() {
|
|
33
|
+
return [Math.floor(360 * a()) / 360, (50 * a() + 50) / 100, 25 * (a() + a() + a() + a()) / 100];
|
|
34
|
+
}
|
|
35
|
+
function i(t3) {
|
|
36
|
+
if (!t3.seed) throw new Error("No seed provided");
|
|
37
|
+
return (function(t4) {
|
|
38
|
+
for (let t5 = 0; t5 < r.length; t5++) r[t5] = 0;
|
|
39
|
+
for (let e3 = 0; e3 < t4.length; e3++) r[e3 % 4] = (r[e3 % 4] << 5) - r[e3 % 4] + t4.charCodeAt(e3);
|
|
40
|
+
})(t3.seed), Object.assign({ size: 8, scale: 16, color: s(), bgcolor: s(), spotcolor: s(), extracolor: s() }, t3);
|
|
41
|
+
}
|
|
42
|
+
t2.exports = { makeGradient: function(t3) {
|
|
43
|
+
const e3 = i({ seed: t3.toLowerCase() });
|
|
44
|
+
let n2 = e3.size * e3.scale;
|
|
45
|
+
const r2 = o(...e3.color), a2 = o(...e3.spotcolor), s2 = o(...e3.extracolor), l = `rgb(${r2[0]},${r2[1]},${r2[2]})`, d = `rgb(${a2[0]},${a2[1]},${a2[2]})`, p = `rgb(${s2[0]},${s2[1]},${s2[2]})`;
|
|
46
|
+
return `data:image/svg+xml;base64,${btoa(unescape(encodeURIComponent(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${n2} ${n2}">
|
|
47
|
+
<defs>
|
|
48
|
+
<linearGradient id='a' gradientUnits='objectBoundingBox' x1='0' y1='0' x2='1' y2='1'>
|
|
49
|
+
<stop offset='0' stop-color='${l}'>
|
|
50
|
+
<animate attributeName="stop-color"
|
|
51
|
+
values="${l};${d};${p};${l};${d};${p};${l};" dur="20s" repeatCount="indefinite">
|
|
52
|
+
</animate>
|
|
53
|
+
</stop>
|
|
54
|
+
<stop offset='.5' stop-color='${d}'>
|
|
55
|
+
<animate attributeName="stop-color"
|
|
56
|
+
values="${d};${p};${l};${d};${p};${l};${d};" dur="20s" repeatCount="indefinite">
|
|
57
|
+
</animate>
|
|
58
|
+
</stop>
|
|
59
|
+
<stop offset='1' stop-color=' ${p}'>
|
|
60
|
+
<animate attributeName="stop-color"
|
|
61
|
+
values="${p};${l};${d};${p};${l};${d};${p};" dur="20s" repeatCount="indefinite">
|
|
62
|
+
</animate>
|
|
63
|
+
</stop>
|
|
64
|
+
<animateTransform attributeName="gradientTransform" type="rotate" from="0 .5 .5" to="360 .5 .5"
|
|
65
|
+
dur="20s" repeatCount="indefinite" />
|
|
66
|
+
</linearGradient>
|
|
67
|
+
<linearGradient id='b' gradientUnits='objectBoundingBox' x1='0' y1='1' x2='1' y2='1'>
|
|
68
|
+
<stop offset='0' stop-color='${l}'>
|
|
69
|
+
<animate attributeName="stop-color"
|
|
70
|
+
values="${l};${d};${p};${l};${d};${p};${l};" dur="20s" repeatCount="indefinite">
|
|
71
|
+
</animate>
|
|
72
|
+
</stop>
|
|
73
|
+
<stop offset='1' stop-color='${d}' stop-opacity="0">
|
|
74
|
+
<animate attributeName="stop-color"
|
|
75
|
+
values="${d};${p};${l};${d};${p};${l};${d};" dur="20s" repeatCount="indefinite">
|
|
76
|
+
</animate>
|
|
77
|
+
</stop>
|
|
78
|
+
<animateTransform attributeName="gradientTransform" type="rotate" values="360 .5 .5;0 .5 .5" class="ignore"
|
|
79
|
+
dur="10s" repeatCount="indefinite" />
|
|
80
|
+
</linearGradient>
|
|
81
|
+
</defs>
|
|
82
|
+
<rect fill='url(#a)' width='100%' height='100%' />
|
|
83
|
+
<rect fill='url(#b)' width='100%' height='100%' />
|
|
84
|
+
</svg>`)))}`;
|
|
85
|
+
}, makeGradientStatic: function(t3) {
|
|
86
|
+
const e3 = i({ seed: t3.toLowerCase() });
|
|
87
|
+
let n2 = e3.size * e3.scale;
|
|
88
|
+
const r2 = o(...e3.color), a2 = o(...e3.spotcolor), s2 = o(...e3.extracolor), l = `rgb(${r2[0]},${r2[1]},${r2[2]})`, d = `rgb(${a2[0]},${a2[1]},${a2[2]})`, p = `rgb(${s2[0]},${s2[1]},${s2[2]})`;
|
|
89
|
+
return `data:image/svg+xml;base64,${btoa(unescape(encodeURIComponent(`<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 ${n2} ${n2}">
|
|
90
|
+
<defs>
|
|
91
|
+
<linearGradient id="a">
|
|
92
|
+
<stop offset="0" stop-color="${p}"/>
|
|
93
|
+
<stop offset="1" stop-opacity="0"/>
|
|
94
|
+
</linearGradient>
|
|
95
|
+
<linearGradient id="b">
|
|
96
|
+
<stop offset="0" stop-color="${l}"/>
|
|
97
|
+
<stop offset="1" stop-color="${d}"/>
|
|
98
|
+
</linearGradient>
|
|
99
|
+
<linearGradient xlink:href="#a" id="d" x1="45.214" x2="118.616" y1="16.659" y2="198.682" gradientTransform="translate(.2 26.325)" gradientUnits="userSpaceOnUse"/>
|
|
100
|
+
<linearGradient xlink:href="#b" id="c" x1="-18.396" x2="287.531" y1="153.501" y2="84.825" gradientTransform="translate(.2 26.325)" gradientUnits="userSpaceOnUse"/>
|
|
101
|
+
</defs>
|
|
102
|
+
<g paint-order="fill markers stroke">
|
|
103
|
+
<path fill="url(#c)" d="M10.027 63.278h185.208v185.208H10.027z" transform="translate(-10.027 -63.278)"/>
|
|
104
|
+
<path fill="url(#d)" d="M10.027 63.278h185.208v185.208H10.027z" transform="translate(-10.027 -63.278)"/>
|
|
105
|
+
</g>
|
|
106
|
+
</svg>`)))}`;
|
|
107
|
+
} };
|
|
108
|
+
} }, e = {}, (function n(o) {
|
|
109
|
+
var r = e[o];
|
|
110
|
+
if (void 0 !== r) return r.exports;
|
|
111
|
+
var a = e[o] = { exports: {} };
|
|
112
|
+
return t[o](a, a.exports, n), a.exports;
|
|
113
|
+
})(225);
|
|
114
|
+
var t, e;
|
|
115
|
+
}));
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
export {
|
|
120
|
+
require_main
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=chunk-LTA7IG3J.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../node_modules/ethereum-gradient-base64/dist/main.js"],"sourcesContent":["!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports[\"ethereum-gradient-base64\"]=e():t[\"ethereum-gradient-base64\"]=e()}(this,(()=>{return t={727:t=>{function e(t,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+6*(e-t)*n:n<.5?e:n<2/3?t+(e-t)*(2/3-n)*6:t}t.exports=function(t,n,o){let r,a,s;if(0==n)r=a=s=o;else{const i=o<.5?o*(1+n):o+n-o*n,l=2*o-i;r=e(l,i,t+1/3),a=e(l,i,t),s=e(l,i,t-1/3)}return[Math.round(255*r),Math.round(255*a),Math.round(255*s),255]}},225:(t,e,n)=>{const o=n(727),r=new Array(4);function a(){const t=r[0]^r[0]<<11;return r[0]=r[1],r[1]=r[2],r[2]=r[3],r[3]=r[3]^r[3]>>19^t^t>>8,(r[3]>>>0)/(1<<31>>>0)}function s(){return[Math.floor(360*a())/360,(50*a()+50)/100,25*(a()+a()+a()+a())/100]}function i(t){if(!t.seed)throw new Error(\"No seed provided\");return function(t){for(let t=0;t<r.length;t++)r[t]=0;for(let e=0;e<t.length;e++)r[e%4]=(r[e%4]<<5)-r[e%4]+t.charCodeAt(e)}(t.seed),Object.assign({size:8,scale:16,color:s(),bgcolor:s(),spotcolor:s(),extracolor:s()},t)}t.exports={makeGradient:function(t){const e=i({seed:t.toLowerCase()});let n=e.size*e.scale;const r=o(...e.color),a=o(...e.spotcolor),s=o(...e.extracolor),l=`rgb(${r[0]},${r[1]},${r[2]})`,d=`rgb(${a[0]},${a[1]},${a[2]})`,p=`rgb(${s[0]},${s[1]},${s[2]})`;return`data:image/svg+xml;base64,${btoa(unescape(encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${n} ${n}\">\\n <defs>\\n <linearGradient id='a' gradientUnits='objectBoundingBox' x1='0' y1='0' x2='1' y2='1'>\\n <stop offset='0' stop-color='${l}'>\\n <animate attributeName=\"stop-color\"\\n values=\"${l};${d};${p};${l};${d};${p};${l};\" dur=\"20s\" repeatCount=\"indefinite\">\\n </animate>\\n </stop>\\n <stop offset='.5' stop-color='${d}'>\\n <animate attributeName=\"stop-color\"\\n values=\"${d};${p};${l};${d};${p};${l};${d};\" dur=\"20s\" repeatCount=\"indefinite\">\\n </animate>\\n </stop>\\n <stop offset='1' stop-color=' ${p}'>\\n <animate attributeName=\"stop-color\"\\n values=\"${p};${l};${d};${p};${l};${d};${p};\" dur=\"20s\" repeatCount=\"indefinite\">\\n </animate>\\n </stop>\\n <animateTransform attributeName=\"gradientTransform\" type=\"rotate\" from=\"0 .5 .5\" to=\"360 .5 .5\"\\n dur=\"20s\" repeatCount=\"indefinite\" />\\n </linearGradient>\\n <linearGradient id='b' gradientUnits='objectBoundingBox' x1='0' y1='1' x2='1' y2='1'>\\n <stop offset='0' stop-color='${l}'>\\n <animate attributeName=\"stop-color\"\\n values=\"${l};${d};${p};${l};${d};${p};${l};\" dur=\"20s\" repeatCount=\"indefinite\">\\n </animate>\\n </stop>\\n <stop offset='1' stop-color='${d}' stop-opacity=\"0\">\\n <animate attributeName=\"stop-color\"\\n values=\"${d};${p};${l};${d};${p};${l};${d};\" dur=\"20s\" repeatCount=\"indefinite\">\\n </animate>\\n </stop>\\n <animateTransform attributeName=\"gradientTransform\" type=\"rotate\" values=\"360 .5 .5;0 .5 .5\" class=\"ignore\"\\n dur=\"10s\" repeatCount=\"indefinite\" />\\n </linearGradient>\\n </defs>\\n <rect fill='url(#a)' width='100%' height='100%' />\\n <rect fill='url(#b)' width='100%' height='100%' />\\n</svg>`)))}`},makeGradientStatic:function(t){const e=i({seed:t.toLowerCase()});let n=e.size*e.scale;const r=o(...e.color),a=o(...e.spotcolor),s=o(...e.extracolor),l=`rgb(${r[0]},${r[1]},${r[2]})`,d=`rgb(${a[0]},${a[1]},${a[2]})`,p=`rgb(${s[0]},${s[1]},${s[2]})`;return`data:image/svg+xml;base64,${btoa(unescape(encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 ${n} ${n}\">\\n <defs>\\n <linearGradient id=\"a\">\\n <stop offset=\"0\" stop-color=\"${p}\"/>\\n <stop offset=\"1\" stop-opacity=\"0\"/>\\n </linearGradient>\\n <linearGradient id=\"b\">\\n <stop offset=\"0\" stop-color=\"${l}\"/>\\n <stop offset=\"1\" stop-color=\"${d}\"/>\\n </linearGradient>\\n <linearGradient xlink:href=\"#a\" id=\"d\" x1=\"45.214\" x2=\"118.616\" y1=\"16.659\" y2=\"198.682\" gradientTransform=\"translate(.2 26.325)\" gradientUnits=\"userSpaceOnUse\"/>\\n <linearGradient xlink:href=\"#b\" id=\"c\" x1=\"-18.396\" x2=\"287.531\" y1=\"153.501\" y2=\"84.825\" gradientTransform=\"translate(.2 26.325)\" gradientUnits=\"userSpaceOnUse\"/>\\n </defs>\\n <g paint-order=\"fill markers stroke\">\\n <path fill=\"url(#c)\" d=\"M10.027 63.278h185.208v185.208H10.027z\" transform=\"translate(-10.027 -63.278)\"/>\\n <path fill=\"url(#d)\" d=\"M10.027 63.278h185.208v185.208H10.027z\" transform=\"translate(-10.027 -63.278)\"/>\\n </g>\\n </svg>`)))}`}}}},e={},function n(o){var r=e[o];if(void 0!==r)return r.exports;var a=e[o]={exports:{}};return t[o](a,a.exports,n),a.exports}(225);var t,e}));"],"mappings":"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","names":["t","e","n","r","a","s"]}
|