hyperliquid-deposit 1.0.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/README.md +215 -0
- package/dist/index.d.ts +321 -0
- package/dist/index.js +5151 -0
- package/dist/index.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../component/wallet.ts","../component/bridge.ts","../component/depositOptimizer.ts","../component/topTokens.ts","../component/tokenSearch.ts","../component/components/DepositModal.tsx","../component/HyperliquidDeposit.tsx","../component/HyprBridgeWidget.tsx","../component/styles/defaultStyles.ts","../component/components/ConnectView.tsx","../component/components/BridgeButton.tsx","../component/components/ChainTokenSelector.tsx","../component/components/BridgeModal.tsx"],"names":["createWalletClient","custom","mapped","getTokens","ChainType","getToken","decimalMultiplier","isStablecoin","ARBITRUM_USDC_ADDRESS","ARBITRUM_CHAIN_ID","COLORS","useState","jsxs","jsx","useRef","useEffect","defaultStyles","progress","WalletManager","Fragment","chainList"],"mappings":"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","file":"index.js","sourcesContent":["import { createWalletClient, custom, formatUnits, type WalletClient } from 'viem';\nimport { mainnet } from 'viem/chains';\nimport { getTokenBalance } from '@lifi/sdk';\nimport type { WalletState, TokenBalance, TokenInfo } from '../types/index.js';\n\ndeclare global {\n interface Window {\n ethereum?: any;\n }\n}\n\nexport class WalletManager {\n private walletClient: WalletClient | null = null;\n private listeners: Set<(state: WalletState) => void> = new Set();\n\n constructor() {\n this.setupEventListeners();\n }\n\n private setupEventListeners() {\n if (typeof window !== 'undefined' && window.ethereum) {\n window.ethereum.on('accountsChanged', (accounts: string[]) => {\n this.notifyListeners({\n address: accounts[0] || null,\n chainId: this.getCurrentChainId(),\n isConnected: accounts.length > 0,\n });\n });\n\n window.ethereum.on('chainChanged', (chainId: string) => {\n this.notifyListeners({\n address: this.getCurrentAddress(),\n chainId: parseInt(chainId, 16),\n isConnected: !!this.getCurrentAddress(),\n });\n });\n }\n }\n\n async connectWallet(): Promise<WalletState> {\n if (!window.ethereum) {\n throw new Error('MetaMask is not installed');\n }\n\n try {\n // Request accounts\n const accounts = await window.ethereum.request({\n method: 'eth_requestAccounts',\n });\n\n const chainId = await window.ethereum.request({\n method: 'eth_chainId',\n });\n\n // Create wallet client\n this.walletClient = createWalletClient({\n chain: mainnet,\n transport: custom(window.ethereum),\n });\n\n const state: WalletState = {\n address: accounts[0],\n chainId: parseInt(chainId, 16),\n isConnected: true,\n };\n\n this.notifyListeners(state);\n return state;\n } catch (error) {\n console.error('Failed to connect wallet:', error);\n throw error;\n }\n }\n\n async checkExistingConnection(): Promise<WalletState> {\n if (!window.ethereum) {\n return { address: null, chainId: null, isConnected: false };\n }\n\n try {\n const accounts = await window.ethereum.request({\n method: 'eth_accounts',\n });\n\n const chainId = await window.ethereum.request({\n method: 'eth_chainId',\n });\n\n if (accounts.length > 0) {\n this.walletClient = createWalletClient({\n chain: mainnet,\n transport: custom(window.ethereum),\n });\n }\n\n return {\n address: accounts[0] || null,\n chainId: parseInt(chainId, 16),\n isConnected: accounts.length > 0,\n };\n } catch (error) {\n console.error('Failed to check connection:', error);\n return { address: null, chainId: null, isConnected: false };\n }\n }\n\n async getTokenBalance(\n address: string,\n token: TokenInfo,\n chainName: string\n ): Promise<TokenBalance> {\n try {\n // Use LiFi SDK's getTokenBalance function\n const tokenAmount = await getTokenBalance(address, token);\n\n if (!tokenAmount) {\n throw new Error(`Failed to get balance for ${token.symbol} on ${chainName}`);\n }\n\n // tokenAmount.amount is a bigint string\n const balanceBigInt = BigInt(tokenAmount.amount);\n const formatted = formatUnits(balanceBigInt, token.decimals);\n const balanceNum = parseFloat(formatted);\n\n // Smart formatting: preserve significant digits for small amounts\n let formattedBalance: string;\n if (balanceNum === 0) {\n formattedBalance = '0';\n } else if (balanceNum < 0.01) {\n // For very small amounts, show up to 6 significant digits\n formattedBalance = balanceNum.toFixed(6).replace(/\\.?0+$/, '');\n } else if (balanceNum < 1) {\n // For amounts < 1, show 4 decimals\n formattedBalance = balanceNum.toFixed(4).replace(/\\.?0+$/, '');\n } else {\n // For amounts >= 1, show 2 decimals\n formattedBalance = balanceNum.toFixed(2);\n }\n\n return {\n chainId: token.chainId,\n chainName,\n balance: balanceBigInt.toString(),\n formattedBalance,\n symbol: token.symbol,\n tokenAddress: token.address,\n };\n } catch (error) {\n // Throw the error so the chain can be filtered out\n throw new Error(`Failed to get ${token.symbol} balance on ${chainName}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n async switchChain(chainId: number): Promise<void> {\n if (!window.ethereum) {\n throw new Error('MetaMask not available');\n }\n\n try {\n await window.ethereum.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: `0x${chainId.toString(16)}` }],\n });\n } catch (error: any) {\n // Chain not added to MetaMask\n if (error.code === 4902) {\n await this.addChain(chainId);\n } else {\n throw error;\n }\n }\n }\n\n private async addChain(chainId: number, chainInfo?: any): Promise<void> {\n if (!chainInfo) {\n throw new Error(`Chain ${chainId} configuration not available`);\n }\n\n // Try to add the chain to MetaMask\n // Note: This requires proper RPC URLs which LiFi might not provide\n // For production, you'd need a mapping of chain IDs to RPC providers\n throw new Error(`Please add chain ${chainInfo.name} (${chainId}) to MetaMask manually`);\n }\n\n onStateChange(callback: (state: WalletState) => void): () => void {\n this.listeners.add(callback);\n return () => this.listeners.delete(callback);\n }\n\n private notifyListeners(state: WalletState): void {\n this.listeners.forEach((listener) => listener(state));\n }\n\n private getCurrentAddress(): string | null {\n return this.walletClient?.account?.address || null;\n }\n\n private getCurrentChainId(): number | null {\n if (!window.ethereum) return null;\n try {\n const chainId = window.ethereum.chainId;\n return chainId ? parseInt(chainId, 16) : null;\n } catch {\n return null;\n }\n }\n\n getWalletClient(): WalletClient | null {\n return this.walletClient;\n }\n}","import { createConfig, getQuote, executeRoute, convertQuoteToRoute, EVM, Solana, getChains, getToken, ChainType, getTokens, getActiveRoutes, stopRouteExecution } from '@lifi/sdk';\nimport { createWalletClient, custom } from 'viem';\nimport type { ChainInfo, TokenInfo } from '../types/index.js';\nimport type { LiFiStep, Token } from '@lifi/sdk';\n\ndeclare global {\n interface Window {\n ethereum?: any;\n }\n}\n\nexport interface BridgeProgress {\n status: 'idle' | 'approving' | 'pending' | 'completed' | 'failed';\n message: string;\n txHash?: string;\n txLink?: string;\n}\n\n// Detailed step info for status page\nexport interface StepInfo {\n id: string;\n tool: string;\n toolName: string;\n toolLogo: string;\n type: string;\n status: 'waiting' | 'action_required' | 'pending' | 'done' | 'failed';\n progress: number; // 0, 50, or 100\n txHash?: string;\n txLink?: string;\n}\n\nexport interface DetailedBridgeProgress {\n overallStatus: 'idle' | 'approving' | 'pending' | 'completed' | 'failed';\n message: string;\n steps: StepInfo[];\n txHash?: string;\n txLink?: string;\n}\n\n// Module-level singleton flag to prevent multiple SDK initializations\nlet sdkInitialized = false;\n\nexport class LiFiBridgeService {\n private chains: ChainInfo[] = [];\n\n constructor() {\n this.initializeLiFi();\n }\n\n private initializeLiFi(): void {\n if (sdkInitialized) return;\n\n try {\n createConfig({\n integrator: 'bridge-widget',\n providers: [\n // EVM chains (Ethereum, Arbitrum, Base, Polygon, etc.)\n EVM({\n getWalletClient: async () => {\n if (!window.ethereum) {\n throw new Error('No wallet provider found');\n }\n \n // Get the current account from MetaMask\n const accounts = await window.ethereum.request({ \n method: 'eth_requestAccounts' \n });\n \n // Get the current chain ID\n const chainIdHex = await window.ethereum.request({ \n method: 'eth_chainId' \n });\n const currentChainId = parseInt(chainIdHex, 16);\n \n return createWalletClient({\n account: accounts[0],\n chain: { id: currentChainId } as any,\n transport: custom(window.ethereum),\n }) as any;\n },\n switchChain: async (chainId) => {\n if (!window.ethereum) {\n throw new Error('No wallet provider found');\n }\n\n await window.ethereum.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: `0x${chainId.toString(16)}` }],\n });\n\n // Get the current account after chain switch\n const accounts = await window.ethereum.request({ \n method: 'eth_requestAccounts' \n });\n\n return createWalletClient({\n account: accounts[0],\n chain: { id: chainId } as any,\n transport: custom(window.ethereum),\n }) as any;\n },\n }),\n // Solana (SVM)\n Solana({\n getWalletAdapter: async () => {\n // Check for Phantom or other Solana wallets\n const solana = (window as any).solana || (window as any).phantom?.solana;\n if (!solana) {\n throw new Error('No Solana wallet found. Please install Phantom or another Solana wallet.');\n }\n return solana;\n },\n }),\n ],\n apiKey: \"281ba4ad-e3f3-4dc1-ad8f-d19e40722416.3c03ad3e-f891-419c-8d3d-51fb3e61737d\",\n });\n\n sdkInitialized = true;\n console.log('LI.FI SDK initialized');\n } catch (error) {\n console.error('Failed to initialize LI.FI:', error);\n }\n }\n\n async getAllChains(): Promise<ChainInfo[]> {\n if (!sdkInitialized) {\n this.initializeLiFi();\n }\n\n try {\n // Fetch all chain types: EVM, SVM (Solana), UTXO (Bitcoin), MVM (SUI)\n const lifiChains = await getChains({\n chainTypes: [ChainType.EVM, ChainType.SVM, ChainType.UTXO, ChainType.MVM],\n });\n \n this.chains = lifiChains.map((chain: any) => ({\n id: chain.id,\n name: chain.name,\n key: chain.key,\n chainType: chain.chainType,\n logoURI: chain.logoURI,\n nativeToken: {\n symbol: chain.nativeToken?.symbol || 'NATIVE',\n decimals: chain.nativeToken?.decimals || 18,\n address: chain.nativeToken?.address || '0x0000000000000000000000000000000000000000',\n },\n }));\n \n console.log(`Loaded ${this.chains.length} chains across all types (EVM, SVM, UTXO, MVM)`);\n return this.chains;\n } catch (error) {\n console.error('Failed to fetch chains:', error);\n return [];\n }\n }\n\n async getTokenInfo(chainId: number, tokenSymbol: string = 'USDC'): Promise<TokenInfo | null> {\n try {\n const token = await getToken(chainId, tokenSymbol);\n if (token) {\n return {\n address: token.address,\n symbol: token.symbol,\n decimals: token.decimals,\n chainId: token.chainId,\n name: token.name,\n logoURI: token.logoURI,\n };\n }\n return null;\n } catch (error) {\n // Concise error message without dumping full error object\n console.warn(`⚠️ ${tokenSymbol} not available on chain ${chainId}`);\n return null;\n }\n }\n\n async getBridgeRoute(\n fromChainId: number,\n toChainId: number,\n tokenAmount: string,\n userAddress: string,\n tokenSymbol: string = 'USDC'\n ): Promise<LiFiStep> {\n if (!sdkInitialized) {\n this.initializeLiFi();\n }\n\n try {\n // Get token addresses for both chains\n console.log(\"Getting token info for chain\", fromChainId, \"and\", toChainId, \"with token\", tokenSymbol);\n const fromToken = await this.getTokenInfo(fromChainId, tokenSymbol);\n const toToken = await this.getTokenInfo(toChainId, tokenSymbol);\n\n if (!fromToken || !toToken) {\n throw new Error(`${tokenSymbol} not available on selected chains`);\n }\n\n // getQuote returns a LiFiStep object directly\n const route = await getQuote({\n fromAddress: userAddress,\n fromChain: fromChainId,\n toChain: toChainId,\n fromToken: fromToken.address,\n toToken: toToken.address,\n fromAmount: tokenAmount,\n slippage: 0.005, // 0.5%\n });\n\n return route;\n } catch (error) {\n console.error('Failed to get quote:', error);\n throw new Error('Failed to get bridge quote. Please try again.');\n }\n }\n\n /**\n * Get bridge route with specific token addresses (for dynamic source/destination)\n */\n async getBridgeRouteWithTokens(\n fromChainId: number,\n toChainId: number,\n fromTokenAddress: string,\n toTokenAddress: string,\n tokenAmount: string,\n userAddress: string\n ): Promise<LiFiStep> {\n if (!sdkInitialized) {\n this.initializeLiFi();\n }\n\n try {\n console.log(`Getting quote: ${fromChainId} -> ${toChainId}, tokens: ${fromTokenAddress} -> ${toTokenAddress}`);\n \n // getQuote returns a LiFiStep object directly\n const route = await getQuote({\n fromAddress: userAddress,\n fromChain: fromChainId,\n toChain: toChainId,\n fromToken: fromTokenAddress,\n toToken: toTokenAddress,\n fromAmount: tokenAmount,\n slippage: 0.005, // 0.5%\n });\n\n return route;\n } catch (error) {\n console.error('Failed to get quote:', error);\n throw new Error('Failed to get bridge quote. Please try again.');\n }\n }\n\n async executeBridge(\n quote: LiFiStep,\n onProgress: (progress: BridgeProgress) => void\n ): Promise<void> {\n console.log(\"Executing bridge with quote:\", quote);\n try {\n onProgress({\n status: 'approving',\n message: 'Waiting for approval...',\n });\n\n // Convert quote to route before execution (required by LiFi SDK)\n const route = convertQuoteToRoute(quote);\n\n // Execute the route\n await executeRoute(route, {\n updateRouteHook: (updatedRoute) => {\n // Safely access the route steps\n if (!updatedRoute?.steps || !Array.isArray(updatedRoute.steps) || updatedRoute.steps.length === 0) {\n return;\n }\n\n const step = updatedRoute.steps[0];\n if (!step?.execution?.process || !Array.isArray(step.execution.process)) {\n return;\n }\n\n // Get the latest process status\n const process = step.execution.process[step.execution.process.length - 1];\n\n if (process) {\n const statusMap: Record<string, BridgeProgress['status']> = {\n NOT_STARTED: 'idle',\n ACTION_REQUIRED: 'approving',\n PENDING: 'pending',\n DONE: 'completed',\n FAILED: 'failed',\n };\n\n const status = statusMap[process.status] || 'pending';\n const message = this.getStatusMessage(process.status, process.type);\n\n onProgress({\n status,\n message,\n txHash: process.txHash,\n txLink: process.txLink,\n });\n }\n },\n });\n\n onProgress({\n status: 'completed',\n message: 'Bridge completed successfully!',\n });\n } catch (error) {\n console.error('Bridge execution failed:', error);\n onProgress({\n status: 'failed',\n message: error instanceof Error ? error.message : 'Bridge failed',\n });\n throw error;\n }\n }\n\n private getStatusMessage(status: string, type?: string): string {\n const messages: Record<string, string> = {\n NOT_STARTED: 'Preparing transaction...',\n ACTION_REQUIRED: 'Please confirm in your wallet...',\n PENDING: 'Transaction in progress...',\n DONE: 'Completed!',\n FAILED: 'Transaction failed',\n };\n\n if (type === 'TOKEN_ALLOWANCE' && status === 'ACTION_REQUIRED') {\n return 'Approving token spending...';\n }\n\n return messages[status] || 'Processing...';\n }\n\n /**\n * Execute bridge with detailed step-by-step progress for status page\n */\n async executeBridgeWithDetailedProgress(\n quote: LiFiStep,\n onDetailedProgress: (progress: DetailedBridgeProgress) => void\n ): Promise<void> {\n // Extract steps from the quote - these are the sub-steps within the main step\n const includedSteps = (quote as any).includedSteps || [];\n const allSteps = includedSteps.length > 0 ? includedSteps : [quote];\n \n // Initialize step info from includedSteps for UI display\n const stepsInfo: StepInfo[] = allSteps.map((step: any, index: number) => ({\n id: step.id || `step-${index}`,\n tool: step.tool || 'unknown',\n toolName: step.toolDetails?.name || step.tool || 'Unknown',\n toolLogo: step.toolDetails?.logoURI || '',\n type: step.type || 'unknown',\n status: 'waiting' as const,\n progress: 0,\n }));\n\n // Send initial state\n onDetailedProgress({\n overallStatus: 'approving',\n message: 'Waiting for wallet confirmation...',\n steps: stepsInfo,\n });\n\n try {\n // Stop any active routes from previous executions to prevent stale route interference\n const activeRoutes = getActiveRoutes();\n if (activeRoutes.length > 0) {\n console.log(`🛑 Stopping ${activeRoutes.length} active route(s) before new execution`);\n activeRoutes.forEach(r => {\n try {\n stopRouteExecution(r);\n } catch (e) {\n // Ignore errors when stopping routes\n }\n });\n }\n\n const route = convertQuoteToRoute(quote);\n\n await executeRoute(route, {\n updateRouteHook: (updatedRoute) => {\n if (!updatedRoute?.steps || !Array.isArray(updatedRoute.steps)) {\n return;\n }\n\n const mainStep = updatedRoute.steps[0];\n if (!mainStep) return;\n\n const processes = mainStep.execution?.process || [];\n\n let overallStatus: DetailedBridgeProgress['overallStatus'] = 'pending';\n let message = 'Processing...';\n let latestTxHash: string | undefined;\n let latestTxLink: string | undefined;\n\n // The SDK tracks progress via processes array, not via includedSteps\n // Processes: TOKEN_ALLOWANCE -> CROSS_CHAIN -> RECEIVING_CHAIN\n // We need to map these to our UI steps\n \n // Calculate overall progress based on processes\n const totalProcesses = Math.max(processes.length, 1);\n let completedProcesses = 0;\n let currentProcessIndex = -1;\n let currentProcessStatus: string | null = null;\n\n processes.forEach((process: any, idx: number) => {\n if (process.status === 'DONE') {\n completedProcesses++;\n } else if (process.status === 'PENDING' || process.status === 'ACTION_REQUIRED' || process.status === 'STARTED') {\n if (currentProcessIndex === -1) {\n currentProcessIndex = idx;\n currentProcessStatus = process.status;\n }\n }\n \n if (process.txHash) {\n latestTxHash = process.txHash;\n latestTxLink = process.txLink;\n }\n });\n\n // If no current process found but not all done, we're waiting\n if (currentProcessIndex === -1 && completedProcesses < totalProcesses) {\n currentProcessIndex = completedProcesses;\n }\n\n // Map processes to UI steps proportionally\n // If we have 3 UI steps and 3 processes, map 1:1\n // If different counts, distribute proportionally\n const numUISteps = stepsInfo.length;\n \n stepsInfo.forEach((step, idx) => {\n // Calculate which process this UI step corresponds to\n const processIndex = Math.floor((idx / numUISteps) * totalProcesses);\n const process = processes[processIndex];\n \n let status: StepInfo['status'] = 'waiting';\n let progress = 0;\n\n if (process) {\n const processStatus = process.status;\n \n if (processStatus === 'DONE') {\n status = 'done';\n progress = 100;\n } else if (processStatus === 'PENDING') {\n status = 'pending';\n progress = 50;\n } else if (processStatus === 'ACTION_REQUIRED') {\n status = 'action_required';\n progress = 25;\n } else if (processStatus === 'STARTED') {\n status = 'pending';\n progress = 25;\n }\n } else {\n // No process yet for this step\n // Check if earlier processes are done\n const earlierProcessIndex = Math.max(0, processIndex - 1);\n if (processes[earlierProcessIndex]?.status === 'DONE') {\n // Previous process done, this one is waiting to start\n status = 'waiting';\n progress = 0;\n }\n }\n\n // Special handling: if all processes are done, mark all steps done\n if (mainStep.execution?.status === 'DONE') {\n status = 'done';\n progress = 100;\n }\n\n stepsInfo[idx] = {\n ...stepsInfo[idx],\n status,\n progress,\n txHash: latestTxHash,\n txLink: latestTxLink,\n };\n });\n\n // Determine overall status from latest process\n const latestProcess = processes[processes.length - 1];\n if (latestProcess) {\n if (latestProcess.status === 'ACTION_REQUIRED') {\n overallStatus = 'approving';\n message = latestProcess.message || 'Please confirm in your wallet...';\n } else if (latestProcess.status === 'PENDING' || latestProcess.status === 'STARTED') {\n overallStatus = 'pending';\n message = latestProcess.message || 'Transaction in progress...';\n } else if (latestProcess.status === 'DONE') {\n // Check if this is the final process\n if (mainStep.execution?.status === 'DONE') {\n overallStatus = 'completed';\n message = 'Transaction completed successfully!';\n } else {\n overallStatus = 'pending';\n message = 'Processing next step...';\n }\n } else if (latestProcess.status === 'FAILED') {\n overallStatus = 'failed';\n message = latestProcess.message || 'Transaction failed';\n }\n }\n\n onDetailedProgress({\n overallStatus,\n message,\n steps: [...stepsInfo],\n txHash: latestTxHash,\n txLink: latestTxLink,\n });\n },\n });\n\n // Mark all steps as done\n stepsInfo.forEach(step => {\n step.status = 'done';\n step.progress = 100;\n });\n\n onDetailedProgress({\n overallStatus: 'completed',\n message: 'Bridge completed successfully!',\n steps: [...stepsInfo],\n });\n } catch (error) {\n console.error('Bridge execution failed:', error);\n \n // Mark current step as failed\n const failedStepIndex = stepsInfo.findIndex(s => s.status === 'pending' || s.status === 'action_required');\n if (failedStepIndex >= 0) {\n stepsInfo[failedStepIndex].status = 'failed';\n stepsInfo[failedStepIndex].progress = 0;\n }\n\n onDetailedProgress({\n overallStatus: 'failed',\n message: error instanceof Error ? error.message : 'Bridge failed',\n steps: [...stepsInfo],\n });\n throw error;\n }\n }\n\n /**\n * Get token price in USD\n * Returns the current USD price for a token on a specific chain\n */\n async getTokenPrice(chainId: number, tokenAddress: string): Promise<number | null> {\n try {\n const tokens = await getTokens({ chains: [chainId] });\n const token = tokens.tokens[chainId]?.find(\n t => t.address.toLowerCase() === tokenAddress.toLowerCase()\n );\n \n return token?.priceUSD ? parseFloat(token.priceUSD) : null;\n } catch (error) {\n console.warn(`Failed to get price for token ${tokenAddress} on chain ${chainId}:`, error);\n return null;\n }\n }\n}","import { LiFiBridgeService } from './bridge';\nimport { WalletManager } from './wallet';\nimport { TokenSearchService } from './tokenSearch';\nimport type { ChainInfo, TokenInfo } from '../types/index';\nimport type { LiFiStep } from '@lifi/sdk';\n\n// Arbitrum chain configuration (destination for all bridges)\nconst ARBITRUM_CHAIN_ID = 42161;\n\n// USDC on Arbitrum (native USDC)\nconst ARBITRUM_USDC_ADDRESS = '0xaf88d065e77c8cC2239327C5EDb3A432268e5831';\n\n// HyperLiquid Bridge Contract on Arbitrum\nexport const HYPERLIQUID_BRIDGE_ADDRESS = '0x2df1c51e09aecf9cacb7bc98cb1742757f163df7';\n\n// Minimum deposit to HyperLiquid (5 USDC)\nexport const MIN_HYPERLIQUID_DEPOSIT_USD = 5;\n\n// Minimum balance to consider for bridging (in USD)\nconst MIN_BALANCE_USD = 1.0;\n\n// Maximum number of tokens to check for quotes (performance)\nconst MAX_TOKENS_TO_CHECK = 20;\n\n// Native token addresses (zero address or chain-specific)\nconst NATIVE_TOKEN_ADDRESSES = [\n '0x0000000000000000000000000000000000000000',\n '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', // Common EVM native token placeholder\n];\n\n// Native token symbols - these are gas tokens on their respective chains\nconst NATIVE_TOKEN_SYMBOLS = [\n 'ETH', // Ethereum, Optimism, Base, Arbitrum, Linea, Scroll, zkSync\n 'MATIC', // Polygon\n 'POL', // Polygon (new symbol)\n 'BNB', // BSC\n 'FTM', // Fantom\n 'AVAX', // Avalanche\n 'MON', // Monad\n 'HYPE', // HyperEVM\n 'CELO', // Celo\n 'GLMR', // Moonbeam\n 'MOVR', // Moonriver\n 'ONE', // Harmony\n 'KLAY', // Klaytn\n 'CRO', // Cronos\n 'METIS', // Metis\n 'BOBA', // Boba\n];\n\n// Gas reserve amounts per chain (in native token units)\n// These are conservative estimates to ensure enough gas for transactions\nconst GAS_RESERVE_BY_CHAIN: Record<number, number> = {\n 1: 0.005, // Ethereum - ~0.015 ETH\n 10: 0.001, // Optimism - ~0.003 ETH\n 56: 0.0005, // BSC - ~0.015 BNB\n 137: 3, // Polygon - ~3 MATIC\n 250: 1.5, // Fantom - ~1.5 FTM\n 8453: 0.003, // Base - ~0.003 ETH\n 42161: 0.001, // Arbitrum - ~0.003 ETH\n 43114: 0.05, // Avalanche - ~0.15 AVAX\n 59144: 0.001, // Linea - ~0.003 ETH\n 324: 0.001, // zkSync Era - ~0.003 ETH\n 534352: 0.001, // Scroll - ~0.003 ETH\n 999: 0.03, // HyperEVM - ~0.03 HYPE\n 143: 0.4, // Monad - ~0.4 MON\n};\nconst DEFAULT_GAS_RESERVE = 0.6; // Default for unknown chains - be conservative\n\n/**\n * Check if a token is a native gas token (by address OR symbol)\n */\nfunction isNativeToken(tokenAddress: string, tokenSymbol?: string): boolean {\n // Check by address\n if (NATIVE_TOKEN_ADDRESSES.includes(tokenAddress.toLowerCase())) {\n return true;\n }\n \n // Check by symbol - if it matches a known native token symbol\n if (tokenSymbol) {\n const upperSymbol = tokenSymbol.toUpperCase();\n return NATIVE_TOKEN_SYMBOLS.includes(upperSymbol);\n }\n \n return false;\n}\n\n/**\n * Get gas reserve amount for a chain\n */\nfunction getGasReserve(chainId: number): number {\n return GAS_RESERVE_BY_CHAIN[chainId] ?? DEFAULT_GAS_RESERVE;\n}\n\n// Stablecoin symbols that should be rounded to whole units\nconst STABLECOIN_SYMBOLS = ['USDC', 'USDT', 'DAI', 'BUSD', 'TUSD', 'USDP', 'GUSD', 'FRAX', 'LUSD', 'SUSD', 'UST', 'MIM'];\n\n/**\n * Check if a token is a stablecoin based on symbol\n */\nfunction isStablecoin(tokenSymbol: string): boolean {\n const upperSymbol = tokenSymbol.toUpperCase();\n return STABLECOIN_SYMBOLS.some(stable => \n upperSymbol === stable || \n upperSymbol.includes(stable) ||\n upperSymbol.startsWith('USD') ||\n upperSymbol.endsWith('USD')\n );\n}\n\n/**\n * Round a token amount DOWN to avoid precision issues\n * For stablecoins: round to whole units (e.g., 12.05 USDC → 12 USDC)\n * For other tokens: limit to 6 significant decimals\n * This prevents floating-point precision errors when the SDK validates amounts\n */\nfunction roundTokenAmount(amount: number, tokenDecimals: number, tokenSymbol: string): string {\n // For stablecoins, ALWAYS round down to whole units\n // This prevents the \"fromAmount must be equal to constant\" error\n if (isStablecoin(tokenSymbol)) {\n const wholeUnits = Math.floor(amount);\n if (wholeUnits <= 0) return '0';\n \n // Convert whole units to smallest unit (e.g., 12 USDC = 12000000)\n const decimalMultiplier = Math.pow(10, tokenDecimals);\n return Math.floor(wholeUnits * decimalMultiplier).toString();\n }\n \n // For non-stablecoins, limit precision to avoid floating point issues\n // Use at most 4 decimals of precision for safety\n const effectiveDecimals = Math.min(tokenDecimals, 4);\n \n // Round down to effective precision first\n const scaleFactor = Math.pow(10, effectiveDecimals);\n const roundedAmount = Math.floor(amount * scaleFactor) / scaleFactor;\n \n if (roundedAmount <= 0) return '0';\n \n // Now convert to smallest unit (wei, etc.)\n // Use BigInt-like approach to avoid floating point issues\n const wholePart = Math.floor(roundedAmount);\n const fractionalPart = roundedAmount - wholePart;\n \n // Calculate smallest unit amount\n const decimalMultiplier = Math.pow(10, tokenDecimals);\n const wholeInSmallest = wholePart * decimalMultiplier;\n const fractionalInSmallest = Math.floor(fractionalPart * decimalMultiplier);\n \n return Math.floor(wholeInSmallest + fractionalInSmallest).toString();\n}\n\nexport interface TokenBalance {\n chainId: number;\n chainName: string;\n chainLogo?: string;\n tokenAddress: string;\n tokenSymbol: string;\n tokenDecimals: number;\n tokenLogo?: string;\n balance: string;\n balanceUSD: number;\n}\n\nexport interface BridgeOption {\n from: TokenBalance;\n quote: LiFiStep;\n estimatedOutputUSD: number;\n estimatedTimeSeconds: number;\n estimatedFeesUSD: number;\n efficiency: number; // output/input ratio (0-1)\n // Partial usage fields (set when selecting bridges for a strategy)\n usedInputUSD?: number; // How much of the input to actually use\n usedOutputUSD?: number; // Expected output for the used amount\n usedInputAmount?: string; // Actual token amount to bridge (in smallest unit)\n}\n\nexport interface DepositStrategy {\n type: 'fastest' | 'cheapest';\n bridges: BridgeOption[];\n totalInputUSD: number;\n totalOutputUSD: number;\n totalTimeSeconds: number;\n totalFeesUSD: number;\n efficiency: number;\n}\n\nexport interface DepositPlan {\n targetAmount: number;\n availableBalanceUSD: number;\n fastest: DepositStrategy | null;\n cheapest: DepositStrategy | null;\n allBalances: TokenBalance[];\n insufficientFunds: boolean;\n}\n\nexport class DepositOptimizer {\n private bridgeService: LiFiBridgeService;\n private walletManager: WalletManager;\n private tokenSearchService: TokenSearchService;\n\n constructor() {\n this.bridgeService = new LiFiBridgeService();\n this.walletManager = new WalletManager();\n this.tokenSearchService = new TokenSearchService();\n }\n\n /**\n * Get USDC address on Arbitrum (constant - native USDC)\n */\n private getArbitrumUSDCAddress(): string {\n return ARBITRUM_USDC_ADDRESS;\n }\n \n /**\n * Get destination chain ID (Arbitrum)\n */\n getDestinationChainId(): number {\n return ARBITRUM_CHAIN_ID;\n }\n\n /**\n * Scan all balances across all supported chains\n */\n async scanAllBalances(\n walletAddress: string,\n chains: ChainInfo[],\n onProgress?: (message: string, progress: number) => void\n ): Promise<TokenBalance[]> {\n const allBalances: TokenBalance[] = [];\n \n onProgress?.('Scanning chains for balances...', 0);\n \n console.log(`🔍 Scanning ${chains.length} chains:`, chains.map(c => `${c.name} (${c.id})`).join(', '));\n\n // For each chain, get the user's token balances\n for (let i = 0; i < chains.length; i++) {\n const chain = chains[i];\n onProgress?.(`Scanning ${chain.name}...`, (i / chains.length) * 50);\n\n try {\n // Get native token balance\n const nativeBalance = await this.walletManager.getTokenBalance(\n walletAddress,\n {\n address: '0x0000000000000000000000000000000000000000',\n symbol: chain.nativeToken?.symbol || 'ETH',\n decimals: chain.nativeToken?.decimals || 18,\n chainId: chain.id,\n name: chain.nativeToken?.symbol || 'Native Token',\n },\n chain.name\n );\n\n const nativeBalanceNum = parseFloat(nativeBalance.formattedBalance);\n if (nativeBalanceNum > 0) {\n // Get price for native token\n const price = await this.bridgeService.getTokenPrice(\n chain.id,\n '0x0000000000000000000000000000000000000000'\n );\n \n const balanceUSD = price ? nativeBalanceNum * price : 0;\n \n if (balanceUSD >= MIN_BALANCE_USD) {\n allBalances.push({\n chainId: chain.id,\n chainName: chain.name,\n chainLogo: chain.logoURI,\n tokenAddress: '0x0000000000000000000000000000000000000000',\n tokenSymbol: chain.nativeToken?.symbol || 'ETH',\n tokenDecimals: chain.nativeToken?.decimals || 18,\n tokenLogo: chain.logoURI,\n balance: nativeBalance.formattedBalance,\n balanceUSD,\n });\n }\n }\n\n // Also check for common stablecoins (USDC, USDT, DAI)\n const stablecoins = await this.getStablecoinBalances(walletAddress, chain);\n allBalances.push(...stablecoins.filter(b => b.balanceUSD >= MIN_BALANCE_USD));\n\n } catch (error) {\n console.warn(`Failed to scan ${chain.name}:`, error);\n }\n }\n\n onProgress?.('Balance scan complete', 50);\n\n // Sort by USD value descending\n return allBalances.sort((a, b) => b.balanceUSD - a.balanceUSD);\n }\n\n /**\n * Get stablecoin balances for a chain\n */\n private async getStablecoinBalances(\n walletAddress: string,\n chain: ChainInfo\n ): Promise<TokenBalance[]> {\n const balances: TokenBalance[] = [];\n \n // Common stablecoin addresses per chain (simplified - in production, use token list)\n const stablecoins: Record<number, Array<{ address: string; symbol: string; decimals: number }>> = {\n 1: [ // Ethereum\n { address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', symbol: 'USDC', decimals: 6 },\n { address: '0xdAC17F958D2ee523a2206206994597C13D831ec7', symbol: 'USDT', decimals: 6 },\n ],\n 137: [ // Polygon\n { address: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359', symbol: 'USDC', decimals: 6 },\n { address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F', symbol: 'USDT', decimals: 6 },\n ],\n 42161: [ // Arbitrum\n { address: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831', symbol: 'USDC', decimals: 6 },\n { address: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9', symbol: 'USDT', decimals: 6 },\n ],\n 8453: [ // Base\n { address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', symbol: 'USDC', decimals: 6 },\n ],\n 10: [ // Optimism\n { address: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85', symbol: 'USDC', decimals: 6 },\n { address: '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58', symbol: 'USDT', decimals: 6 },\n ],\n 43114: [ // Avalanche\n { address: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E', symbol: 'USDC', decimals: 6 },\n { address: '0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7', symbol: 'USDT', decimals: 6 },\n ],\n 56: [ // BSC\n { address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d', symbol: 'USDC', decimals: 18 },\n { address: '0x55d398326f99059fF775485246999027B3197955', symbol: 'USDT', decimals: 18 },\n ],\n 143: [ // Monad\n { address: '0x754704Bc059F8C67012fEd69BC8A327a5aafb603', symbol: 'USDC', decimals: 6 },\n ],\n 999: [ // HyperEVM\n { address: '0x2Df1c51E09aECF9cacB7bc98cB1742757f163dF7', symbol: 'USDC', decimals: 6 },\n ],\n };\n\n const chainStables = stablecoins[chain.id] || [];\n \n for (const stable of chainStables) {\n try {\n const balance = await this.walletManager.getTokenBalance(\n walletAddress,\n {\n address: stable.address,\n symbol: stable.symbol,\n decimals: stable.decimals,\n chainId: chain.id,\n name: stable.symbol,\n },\n chain.name\n );\n\n const balanceNum = parseFloat(balance.formattedBalance);\n if (balanceNum > 0) {\n // Stablecoins are ~$1\n const balanceUSD = balanceNum;\n \n balances.push({\n chainId: chain.id,\n chainName: chain.name,\n chainLogo: chain.logoURI,\n tokenAddress: stable.address,\n tokenSymbol: stable.symbol,\n tokenDecimals: stable.decimals,\n balance: balance.formattedBalance,\n balanceUSD,\n });\n }\n } catch (error) {\n // Skip failed balance fetches\n }\n }\n\n return balances;\n }\n\n /**\n * Get bridge quotes for all balances to HyperEVM USDC\n */\n async getBridgeQuotes(\n walletAddress: string,\n balances: TokenBalance[],\n onProgress?: (message: string, progress: number) => void\n ): Promise<BridgeOption[]> {\n const options: BridgeOption[] = [];\n \n // Limit number of quotes to fetch\n const balancesToQuote = balances.slice(0, MAX_TOKENS_TO_CHECK);\n \n onProgress?.('Getting bridge quotes...', 50);\n \n console.log(`💰 Found ${balances.length} balances to check:`, \n balances.map(b => `${b.tokenSymbol} on ${b.chainName} (chain ${b.chainId}): $${b.balanceUSD.toFixed(2)}`).join(', ')\n );\n\n // Get Arbitrum USDC address (destination for all bridges)\n const arbitrumUSDCAddress = this.getArbitrumUSDCAddress();\n\n for (let i = 0; i < balancesToQuote.length; i++) {\n const balance = balancesToQuote[i];\n onProgress?.(\n `Getting quote for ${balance.tokenSymbol} on ${balance.chainName}...`,\n 50 + (i / balancesToQuote.length) * 40\n );\n\n try {\n // Skip if already USDC on Arbitrum (no need to bridge)\n if (balance.chainId === ARBITRUM_CHAIN_ID && \n balance.tokenAddress.toLowerCase() === arbitrumUSDCAddress.toLowerCase()) {\n console.log('⏭️ Skipping USDC on Arbitrum - already at destination');\n continue;\n }\n\n // Convert balance to smallest unit\n const balanceNum = parseFloat(balance.balance);\n const amountInSmallestUnit = Math.floor(\n balanceNum * Math.pow(10, balance.tokenDecimals)\n ).toString();\n\n // Skip if amount is too small\n if (amountInSmallestUnit === '0') continue;\n\n // Get quote to Arbitrum USDC\n const quote = await this.bridgeService.getBridgeRouteWithTokens(\n balance.chainId,\n ARBITRUM_CHAIN_ID,\n balance.tokenAddress,\n arbitrumUSDCAddress,\n amountInSmallestUnit,\n walletAddress\n );\n\n // Calculate output in USD (USDC has 6 decimals)\n const outputAmount = parseInt(quote.estimate.toAmount) / 1e6;\n const estimatedFeesUSD = balance.balanceUSD - outputAmount;\n const efficiency = outputAmount / balance.balanceUSD;\n\n options.push({\n from: balance,\n quote,\n estimatedOutputUSD: outputAmount,\n estimatedTimeSeconds: quote.estimate.executionDuration || 60,\n estimatedFeesUSD: Math.max(0, estimatedFeesUSD),\n efficiency,\n });\n } catch (error) {\n console.warn(\n `Failed to get quote for ${balance.tokenSymbol} on ${balance.chainName}:`,\n error\n );\n }\n }\n\n onProgress?.('Quotes complete', 90);\n return options;\n }\n\n /**\n * Calculate optimal deposit strategies (fastest and cheapest)\n */\n calculateStrategies(\n targetAmount: number,\n options: BridgeOption[]\n ): { fastest: DepositStrategy | null; cheapest: DepositStrategy | null } {\n if (options.length === 0) {\n return { fastest: null, cheapest: null };\n }\n\n // Calculate FASTEST strategy (minimize total time)\n const fastest = this.selectOptimalBridges(\n targetAmount,\n options,\n 'fastest'\n );\n\n // Calculate CHEAPEST strategy (maximize efficiency / minimize fees)\n const cheapest = this.selectOptimalBridges(\n targetAmount,\n options,\n 'cheapest'\n );\n\n return { fastest, cheapest };\n }\n\n /**\n * Select optimal bridges to reach target amount (exactly)\n */\n private selectOptimalBridges(\n targetAmount: number,\n options: BridgeOption[],\n strategy: 'fastest' | 'cheapest'\n ): DepositStrategy | null {\n // Sort options based on strategy\n const sortedOptions = [...options].sort((a, b) => {\n if (strategy === 'fastest') {\n // Sort by time ascending, then by output descending\n if (a.estimatedTimeSeconds !== b.estimatedTimeSeconds) {\n return a.estimatedTimeSeconds - b.estimatedTimeSeconds;\n }\n return b.estimatedOutputUSD - a.estimatedOutputUSD;\n } else {\n // Sort by efficiency descending (best value first)\n if (a.efficiency !== b.efficiency) {\n return b.efficiency - a.efficiency;\n }\n return b.estimatedOutputUSD - a.estimatedOutputUSD;\n }\n });\n\n // Greedily select bridges until we reach target\n const selectedBridges: BridgeOption[] = [];\n let totalOutput = 0;\n let totalInput = 0;\n let totalTime = 0;\n let totalFees = 0;\n \n // Tolerance: we're done if within 5% of target (no need for tiny dust amounts)\n const COMPLETION_TOLERANCE = 0.95; // 95% of target is good enough\n const MIN_BRIDGE_USD = 1.0; // Skip bridges worth less than $1\n\n for (const option of sortedOptions) {\n // Stop if we've reached target\n if (totalOutput >= targetAmount) break;\n \n // Stop if we're within 5% of target - no need for tiny dust bridges\n if (totalOutput >= targetAmount * COMPLETION_TOLERANCE) {\n console.log(`✅ Reached ${((totalOutput / targetAmount) * 100).toFixed(1)}% of target, stopping (within tolerance)`);\n break;\n }\n\n // Calculate available balance, accounting for gas reserves on native tokens\n let availableBalance = parseFloat(option.from.balance);\n const isNative = isNativeToken(option.from.tokenAddress, option.from.tokenSymbol);\n \n if (isNative) {\n // Reserve gas for the transaction\n const gasReserve = getGasReserve(option.from.chainId);\n availableBalance = Math.max(0, availableBalance - gasReserve);\n \n console.log(`⛽ ${option.from.tokenSymbol} is native token on chain ${option.from.chainId}, reserving ${gasReserve} for gas. Available: ${availableBalance.toFixed(4)}`);\n \n // Skip if not enough balance after gas reserve\n if (availableBalance <= 0) {\n console.log(`⏭️ Skipping ${option.from.tokenSymbol}: not enough balance after gas reserve`);\n continue;\n }\n }\n \n // Calculate the max output we can get from this option (accounting for gas reserve)\n const originalBalance = parseFloat(option.from.balance);\n const availableFractionOfOriginal = availableBalance / originalBalance;\n const maxAvailableOutputUSD = availableFractionOfOriginal * option.estimatedOutputUSD;\n\n // Calculate how much more output we need\n const neededOutput = targetAmount - totalOutput;\n \n // Check if this is a stablecoin (needed for rounding decisions)\n const tokenSymbol = option.from.tokenSymbol.toUpperCase();\n const isStablecoin = ['USDC', 'USDT', 'DAI', 'BUSD', 'TUSD'].some(s => tokenSymbol.includes(s));\n \n let usedInputAmount: string;\n let usedTokenAmount: number;\n \n if (isStablecoin) {\n // SIMPLE LOGIC FOR STABLECOINS:\n // Stablecoins are ~$1 each, so just take the number of units we need\n // Account for ~1-2% bridge fees by adding 1 extra unit\n const unitsNeeded = Math.ceil(neededOutput) + 1; // +1 for fees\n const unitsToUse = Math.min(unitsNeeded, Math.floor(availableBalance));\n \n if (unitsToUse < 1) continue;\n \n usedTokenAmount = unitsToUse;\n usedInputAmount = Math.floor(unitsToUse * Math.pow(10, option.from.tokenDecimals)).toString();\n \n console.log(`� Stablecoin: need $${neededOutput.toFixed(2)}, using ${unitsToUse} ${option.from.tokenSymbol} (available: ${Math.floor(availableBalance)})`);\n } else {\n // For non-stablecoins: use fraction-based calculation\n if (maxAvailableOutputUSD <= neededOutput) {\n // This token alone won't reach target - use ALL of it\n usedTokenAmount = availableBalance;\n console.log(`💯 Using 100% of ${option.from.tokenSymbol} ($${maxAvailableOutputUSD.toFixed(2)}) - need $${neededOutput.toFixed(2)} more`);\n } else {\n // This token would exceed target - take only what we need\n const fractionNeeded = neededOutput / maxAvailableOutputUSD;\n usedTokenAmount = availableBalance * fractionNeeded;\n console.log(`📊 Using ${(fractionNeeded * 100).toFixed(1)}% of ${option.from.tokenSymbol} ($${(fractionNeeded * maxAvailableOutputUSD).toFixed(2)} of $${maxAvailableOutputUSD.toFixed(2)})`);\n }\n \n usedInputAmount = roundTokenAmount(usedTokenAmount, option.from.tokenDecimals, option.from.tokenSymbol);\n }\n \n // Skip if the amount is 0\n if (usedInputAmount === '0') continue;\n \n // Calculate the ACTUAL token amount after rounding (for accurate USD display)\n const actualTokenAmount = parseInt(usedInputAmount) / Math.pow(10, option.from.tokenDecimals);\n const actualFraction = actualTokenAmount / parseFloat(option.from.balance);\n \n // Calculate USD values based on the ACTUAL rounded amount, not the original fraction\n // This ensures display shows $12.00 not $12.05 for stablecoins\n const usedInputUSD = actualFraction * option.from.balanceUSD;\n const usedOutputUSD = actualFraction * option.estimatedOutputUSD;\n const usedFees = actualFraction * option.estimatedFeesUSD;\n \n // Skip if this bridge output is too small (less than $1)\n // This prevents adding tiny dust amounts like $0.02\n if (usedOutputUSD < MIN_BRIDGE_USD) {\n console.log(`⏭️ Skipping ${option.from.tokenSymbol} on ${option.from.chainName}: output $${usedOutputUSD.toFixed(2)} < $${MIN_BRIDGE_USD} minimum`);\n continue;\n }\n \n // Create a copy of the option with the used amounts\n const bridgeWithUsage: BridgeOption = {\n ...option,\n usedInputUSD,\n usedOutputUSD,\n usedInputAmount,\n };\n \n selectedBridges.push(bridgeWithUsage);\n totalOutput += usedOutputUSD;\n totalInput += usedInputUSD;\n totalFees += usedFees;\n totalTime += option.estimatedTimeSeconds;\n }\n\n if (selectedBridges.length === 0) {\n return null;\n }\n\n return {\n type: strategy,\n bridges: selectedBridges,\n totalInputUSD: totalInput,\n totalOutputUSD: totalOutput,\n totalTimeSeconds: totalTime,\n totalFeesUSD: totalFees,\n efficiency: totalInput > 0 ? totalOutput / totalInput : 0,\n };\n }\n\n /**\n * Main function: Calculate full deposit plan\n */\n async calculateDepositPlan(\n walletAddress: string,\n targetAmount: number,\n chains: ChainInfo[],\n onProgress?: (message: string, progress: number) => void\n ): Promise<DepositPlan> {\n onProgress?.('Starting deposit optimization...', 0);\n\n // Step 1: Scan all balances\n const allBalances = await this.scanAllBalances(walletAddress, chains, onProgress);\n \n const availableBalanceUSD = allBalances.reduce((sum, b) => sum + b.balanceUSD, 0);\n \n if (availableBalanceUSD < targetAmount) {\n onProgress?.('Insufficient funds across all chains', 100);\n return {\n targetAmount,\n availableBalanceUSD,\n fastest: null,\n cheapest: null,\n allBalances,\n insufficientFunds: true,\n };\n }\n\n // Step 2: Get bridge quotes\n const bridgeOptions = await this.getBridgeQuotes(walletAddress, allBalances, onProgress);\n\n if (bridgeOptions.length === 0) {\n onProgress?.('No bridge routes available', 100);\n return {\n targetAmount,\n availableBalanceUSD,\n fastest: null,\n cheapest: null,\n allBalances,\n insufficientFunds: false,\n };\n }\n\n // Step 3: Calculate strategies\n onProgress?.('Calculating optimal strategies...', 95);\n const { fastest, cheapest } = this.calculateStrategies(targetAmount, bridgeOptions);\n\n onProgress?.('Optimization complete!', 100);\n\n return {\n targetAmount,\n availableBalanceUSD,\n fastest,\n cheapest,\n allBalances,\n insufficientFunds: false,\n };\n }\n}\n","/**\n * Top 200 tokens by market cap (CoinGecko ranking as of 2024)\n * These tokens are shown by default when a user selects a chain.\n * The list is ordered by market cap rank.\n * \n * Format: Symbol -> Rank (lower = higher market cap)\n */\n\nexport const TOP_TOKENS_BY_MARKETCAP: Map<string, number> = new Map([\n // Top 10\n ['BTC', 1],\n ['ETH', 2],\n ['USDT', 3],\n ['XRP', 4],\n ['BNB', 5],\n ['SOL', 6],\n ['USDC', 7],\n ['DOGE', 8],\n ['ADA', 9],\n ['TRX', 10],\n \n // 11-20\n ['AVAX', 11],\n ['LINK', 12],\n ['TON', 13],\n ['SHIB', 14],\n ['SUI', 15],\n ['XLM', 16],\n ['DOT', 17],\n ['HBAR', 18],\n ['BCH', 19],\n ['LEO', 20],\n \n // 21-30\n ['LTC', 21],\n ['PEPE', 22],\n ['UNI', 23],\n ['NEAR', 24],\n ['APT', 25],\n ['DAI', 26],\n ['ICP', 27],\n ['AAVE', 28],\n ['ETC', 29],\n ['POL', 30], // Polygon\n ['MATIC', 30], // Polygon (old symbol)\n \n // 31-50\n ['CRO', 31],\n ['RENDER', 32],\n ['VET', 33],\n ['TAO', 34],\n ['FET', 35],\n ['OM', 36],\n ['MNT', 37],\n ['ARB', 38],\n ['FIL', 39],\n ['KAS', 40],\n ['ATOM', 41],\n ['OKB', 42],\n ['STX', 43],\n ['IMX', 44],\n ['WIF', 45],\n ['INJ', 46],\n ['OP', 47],\n ['GRT', 48],\n ['THETA', 49],\n ['FTM', 50],\n \n // 51-75\n ['BONK', 51],\n ['SEI', 52],\n ['FLOKI', 53],\n ['RUNE', 54],\n ['PYTH', 55],\n ['TIA', 56],\n ['LDO', 57],\n ['JUP', 58],\n ['ALGO', 59],\n ['JASMY', 60],\n ['GALA', 61],\n ['SAND', 62],\n ['BRETT', 63],\n ['BEAM', 64],\n ['CORE', 65],\n ['FLOW', 66],\n ['EOS', 67],\n ['BSV', 68],\n ['QNT', 69],\n ['EGLD', 70],\n ['AERO', 71],\n ['AXS', 72],\n ['NEO', 73],\n ['MANA', 74],\n ['XTZ', 75],\n \n // 76-100\n ['STRK', 76],\n ['KAIA', 77],\n ['IOTA', 78],\n ['AIOZ', 79],\n ['PENDLE', 80],\n ['VIRTUAL', 81],\n ['POPCAT', 82],\n ['WLD', 83],\n ['ENA', 84],\n ['DYDX', 85],\n ['CAKE', 86],\n ['CRV', 87],\n ['APE', 88],\n ['ORDI', 89],\n ['SUPER', 90],\n ['BTT', 91],\n ['CFX', 92],\n ['NOT', 93],\n ['MINA', 94],\n ['XDC', 95],\n ['ZEC', 96],\n ['NEXO', 97],\n ['1INCH', 98],\n ['COMP', 99],\n ['SNX', 100],\n \n // 101-125\n ['ENS', 101],\n ['MKR', 102],\n ['SUSHI', 103],\n ['RPL', 104],\n ['GMX', 105],\n ['ZRX', 106],\n ['BAT', 107],\n ['CELO', 108],\n ['ANKR', 109],\n ['SKL', 110],\n ['BLUR', 111],\n ['CHZ', 112],\n ['RNDR', 113],\n ['ROSE', 114],\n ['KAVA', 115],\n ['ZIL', 116],\n ['QTUM', 117],\n ['ONE', 118],\n ['ENJ', 119],\n ['AUDIO', 120],\n ['LRC', 121],\n ['MASK', 122],\n ['OCEAN', 123],\n ['GLM', 124],\n ['STORJ', 125],\n \n // 126-150\n ['YFI', 126],\n ['SPELL', 127],\n ['BICO', 128],\n ['API3', 129],\n ['CELR', 130],\n ['BAND', 131],\n ['RLC', 132],\n ['NMR', 133],\n ['PERP', 134],\n ['BADGER', 135],\n ['POND', 136],\n ['RAD', 137],\n ['LQTY', 138],\n ['POLS', 139],\n ['DODO', 140],\n ['ALPHA', 141],\n ['AUCTION', 142],\n ['ALCX', 143],\n ['FORTH', 144],\n ['TRIBE', 145],\n ['FARM', 146],\n ['QUICK', 147],\n ['GHST', 148],\n ['RARE', 149],\n ['HIGH', 150],\n \n // 151-175\n ['MAGIC', 151],\n ['RDNT', 152],\n ['VELO', 153],\n ['LOOM', 154],\n ['CTSI', 155],\n ['REQ', 156],\n ['POWR', 157],\n ['ARPA', 158],\n ['LEVER', 159],\n ['BOBA', 160],\n ['PUNDIX', 161],\n ['MTL', 162],\n ['DENT', 163],\n ['STMX', 164],\n ['OGN', 165],\n ['AERGO', 166],\n ['LINA', 167],\n ['CHESS', 168],\n ['BURGER', 169],\n ['TWT', 170],\n ['SFP', 171],\n ['ALPACA', 172],\n ['WING', 173],\n ['HARD', 174],\n ['FOR', 175],\n \n // 176-200\n ['UNFI', 176],\n ['REEF', 177],\n ['TORN', 178],\n ['BOND', 179],\n ['CREAM', 180],\n ['KP3R', 181],\n ['HEGIC', 182],\n ['ROOK', 183],\n ['COVER', 184],\n ['PICKLE', 185],\n ['SILO', 186],\n ['IDLE', 187],\n ['INDEX', 188],\n ['DPI', 189],\n ['MVI', 190],\n ['BED', 191],\n ['DATA', 192],\n ['GTC', 193],\n ['SAFE', 194],\n ['COW', 195],\n ['MPL', 196],\n ['FOLD', 197],\n ['FLOAT', 198],\n ['BANK', 199],\n ['FXS', 200],\n \n // Wrapped versions (same rank as underlying)\n ['WETH', 2],\n ['WBTC', 1],\n ['WBNB', 5],\n ['WAVAX', 11],\n ['WMATIC', 30],\n ['WPOL', 30],\n ['WFTM', 50],\n ['WSOL', 6],\n \n // Stablecoins (high priority)\n ['BUSD', 7],\n ['TUSD', 7],\n ['FRAX', 7],\n ['LUSD', 7],\n ['USDP', 7],\n ['GUSD', 7],\n ['USDD', 7],\n ['PYUSD', 7],\n ['FDUSD', 7],\n ['EURC', 7],\n ['EURT', 7],\n ['USDE', 7],\n ['CRVUSD', 7],\n ['GHO', 7],\n ['SUSD', 7],\n ['RAI', 7],\n ['MIM', 7],\n ['DOLA', 7],\n ['USDX', 7],\n \n // Liquid staking tokens\n ['STETH', 50],\n ['WSTETH', 50],\n ['RETH', 50],\n ['CBETH', 50],\n ['SFRXETH', 50],\n ['FRXETH', 50],\n ['METH', 50],\n ['EZETH', 50],\n ['WEETH', 50],\n ['RSETH', 50],\n ['MSOL', 50],\n ['JITOSOL', 50],\n ['BSOL', 50],\n]);\n\n/**\n * Set of top token symbols for O(1) lookup\n */\nexport const TOP_TOKENS_SET: Set<string> = new Set(TOP_TOKENS_BY_MARKETCAP.keys());\n\n/**\n * Check if a token is in the top tokens list\n */\nexport function isTopToken(symbol: string): boolean {\n return TOP_TOKENS_SET.has(symbol.toUpperCase());\n}\n\n/**\n * Get the market cap rank of a token (lower = higher market cap)\n * Returns Infinity if not in the list\n */\nexport function getTokenRank(symbol: string): number {\n return TOP_TOKENS_BY_MARKETCAP.get(symbol.toUpperCase()) ?? Infinity;\n}\n\n/**\n * Sort tokens by market cap rank\n */\nexport function sortByMarketCap<T extends { symbol: string }>(tokens: T[]): T[] {\n return [...tokens].sort((a, b) => {\n const rankA = getTokenRank(a.symbol);\n const rankB = getTokenRank(b.symbol);\n return rankA - rankB;\n });\n}\n","import { getToken, getTokens, ChainType } from '@lifi/sdk';\nimport type { Token } from '@lifi/sdk';\nimport { TOP_TOKENS_BY_MARKETCAP, isTopToken, getTokenRank } from './topTokens.js';\n\nexport interface SearchableToken {\n symbol: string;\n name: string;\n address: string;\n chainId: number;\n decimals: number;\n logoURI?: string;\n priceUSD?: string;\n}\n\n// Patterns to identify LP/vault/receipt tokens (not real tradeable tokens)\nconst JUNK_TOKEN_PATTERNS = [\n /^UNI-V2$/i,\n /^SLP$/i,\n /^PENDLE-LPT$/i,\n /^SPT-PT/i,\n /^eqb/i,\n /^voted-/i,\n /^bb[a-z]/i, // Balancer boosted tokens\n /^LAMINAR-V2$/i,\n /Uniswap V2/i,\n /Liquidity Pool/i,\n /Receipt/i,\n /Vault/i,\n /LP Token/i,\n /^LP$/i,\n];\n\nfunction isTradeableToken(token: Token): boolean {\n // Filter out junk tokens\n if (JUNK_TOKEN_PATTERNS.some(pattern => pattern.test(token.symbol))) {\n return false;\n }\n \n if (JUNK_TOKEN_PATTERNS.some(pattern => pattern.test(token.name))) {\n return false;\n }\n \n return true;\n}\n\n/**\n * Sort tokens by: 1) Has logo first, 2) Market cap rank, 3) Alphabetically\n * Tokens without logos ALWAYS go to the end, even if they're top tokens\n */\nfunction sortTokens(tokens: SearchableToken[]): SearchableToken[] {\n return tokens.sort((a, b) => {\n const aHasLogo = !!a.logoURI;\n const bHasLogo = !!b.logoURI;\n \n // 1. Tokens with logos ALWAYS come before tokens without\n if (aHasLogo !== bHasLogo) {\n return aHasLogo ? -1 : 1;\n }\n \n // 2. Sort by market cap rank (lower rank = higher market cap)\n const aRank = getTokenRank(a.symbol);\n const bRank = getTokenRank(b.symbol);\n \n if (aRank !== bRank) {\n return aRank - bRank;\n }\n \n // 3. Alphabetically by symbol\n return a.symbol.toUpperCase().localeCompare(b.symbol.toUpperCase());\n });\n}\n\nexport class TokenSearchService {\n private tokenCache: Map<number, Token[]> = new Map();\n private cacheTimestamp: Map<number, number> = new Map();\n private readonly CACHE_DURATION = 5 * 60 * 1000; // 5 minutes\n\n /**\n * Get all tradeable tokens for a specific chain\n */\n async getTokensForChain(chainId: number): Promise<SearchableToken[]> {\n // Check cache\n const cached = this.tokenCache.get(chainId);\n const cacheTime = this.cacheTimestamp.get(chainId);\n \n if (cached && cacheTime && Date.now() - cacheTime < this.CACHE_DURATION) {\n const mapped = cached.map((t: Token) => this.mapToSearchableToken(t, chainId));\n return sortTokens(mapped);\n }\n\n // Fetch from LI.FI - include all chain types (EVM, SVM, UTXO, MVM)\n const allTokens = await getTokens({\n chainTypes: [ChainType.EVM, ChainType.SVM, ChainType.UTXO, ChainType.MVM],\n });\n const tokensData = (allTokens as any).tokens || allTokens;\n const chainTokens = tokensData[chainId] || [];\n\n // Filter tradeable tokens\n const tradeableTokens = chainTokens.filter((token: Token) => isTradeableToken(token));\n\n // Update cache\n this.tokenCache.set(chainId, tradeableTokens);\n this.cacheTimestamp.set(chainId, Date.now());\n\n const mapped = tradeableTokens.map((t: Token) => this.mapToSearchableToken(t, chainId));\n return sortTokens(mapped);\n }\n\n /**\n * Get only popular/whitelisted tokens for a chain (for default display)\n * These are the top 200 tokens by market cap that exist on this chain\n * Tokens with logos appear first, sorted by market cap rank\n * Tokens without logos appear at the end\n */\n async getPopularTokensForChain(chainId: number): Promise<SearchableToken[]> {\n const allTokens = await this.getTokensForChain(chainId);\n \n // Filter to only include tokens in our whitelist\n const popularTokens = allTokens.filter(token => isTopToken(token.symbol));\n \n // Sort: 1) Has logo first, 2) By market cap rank\n return popularTokens.sort((a, b) => {\n const aHasLogo = !!a.logoURI;\n const bHasLogo = !!b.logoURI;\n \n // Tokens with logos come first\n if (aHasLogo !== bHasLogo) {\n return aHasLogo ? -1 : 1;\n }\n \n // Then sort by market cap rank\n const aRank = getTokenRank(a.symbol);\n const bRank = getTokenRank(b.symbol);\n return aRank - bRank;\n });\n }\n\n /**\n * Search tokens by name or symbol on a specific chain\n * This searches ALL tokens, not just popular ones\n */\n async searchTokens(chainId: number, query: string): Promise<SearchableToken[]> {\n const tokens = await this.getTokensForChain(chainId);\n const lowerQuery = query.toLowerCase().trim();\n\n if (!lowerQuery) {\n // Return popular tokens if no query (use whitelist)\n return this.getPopularTokensForChain(chainId);\n }\n\n // Search by symbol or name\n const results = tokens.filter(token => \n token.symbol.toLowerCase().includes(lowerQuery) ||\n token.name.toLowerCase().includes(lowerQuery)\n );\n\n // Sort: exact symbol match first, then symbol starts with, then by market cap rank\n return results.sort((a, b) => {\n const aSymbol = a.symbol.toLowerCase();\n const bSymbol = b.symbol.toLowerCase();\n \n // Exact match comes first\n if (aSymbol === lowerQuery) return -1;\n if (bSymbol === lowerQuery) return 1;\n \n // Starts with query comes next\n if (aSymbol.startsWith(lowerQuery) && !bSymbol.startsWith(lowerQuery)) return -1;\n if (!aSymbol.startsWith(lowerQuery) && bSymbol.startsWith(lowerQuery)) return 1;\n \n // Then by market cap rank\n const aRank = getTokenRank(a.symbol);\n const bRank = getTokenRank(b.symbol);\n if (aRank !== bRank) return aRank - bRank;\n \n // Then by logo presence\n const aHasLogo = a.logoURI ? 1 : 0;\n const bHasLogo = b.logoURI ? 1 : 0;\n if (aHasLogo !== bHasLogo) return bHasLogo - aHasLogo;\n \n return 0;\n });\n }\n\n /**\n * Get token by exact address on a specific chain\n */\n async getTokenByAddress(chainId: number, address: string): Promise<SearchableToken | null> {\n try {\n // First try to get from cache\n const tokens = await this.getTokensForChain(chainId);\n const found = tokens.find(t => t.address.toLowerCase() === address.toLowerCase());\n \n if (found) {\n return found;\n }\n\n // If not in cache, try fetching directly from LI.FI\n // Note: LI.FI SDK doesn't have a direct getTokenByAddress method,\n // so we search through all tokens\n return null;\n } catch (error) {\n console.error(`Failed to get token by address ${address} on chain ${chainId}:`, error);\n return null;\n }\n }\n\n /**\n * Get token by symbol on a specific chain\n */\n async getTokenBySymbol(chainId: number, symbol: string): Promise<SearchableToken | null> {\n try {\n const token = await getToken(chainId, symbol);\n \n if (token && isTradeableToken(token)) {\n return this.mapToSearchableToken(token, chainId);\n }\n \n return null;\n } catch (error) {\n console.error(`Failed to get token ${symbol} on chain ${chainId}:`, error);\n return null;\n }\n }\n\n /**\n * Get popular tokens for a chain (USDC, USDT, ETH, WBTC, etc.)\n */\n async getPopularTokens(chainId: number): Promise<SearchableToken[]> {\n const popularSymbols = ['USDC', 'USDT', 'DAI', 'ETH', 'WETH', 'WBTC', 'USDC.e', 'USDCe'];\n const tokens: SearchableToken[] = [];\n\n for (const symbol of popularSymbols) {\n try {\n const token = await this.getTokenBySymbol(chainId, symbol);\n if (token) {\n tokens.push(token);\n }\n } catch (error) {\n // Skip if token not found\n }\n }\n\n return tokens;\n }\n\n /**\n * Clear cache for a specific chain or all chains\n */\n clearCache(chainId?: number): void {\n if (chainId !== undefined) {\n this.tokenCache.delete(chainId);\n this.cacheTimestamp.delete(chainId);\n } else {\n this.tokenCache.clear();\n this.cacheTimestamp.clear();\n }\n }\n\n private mapToSearchableToken(token: Token, chainId: number): SearchableToken {\n return {\n symbol: token.symbol,\n name: token.name,\n address: token.address,\n chainId,\n decimals: token.decimals,\n logoURI: token.logoURI,\n priceUSD: token.priceUSD,\n };\n }\n}\n","import React, { useState, useRef } from 'react';\nimport { DepositOptimizer, DepositPlan, DepositStrategy, BridgeOption, HYPERLIQUID_BRIDGE_ADDRESS, MIN_HYPERLIQUID_DEPOSIT_USD } from '../depositOptimizer';\nimport { LiFiBridgeService, DetailedBridgeProgress } from '../bridge';\nimport type { ChainInfo } from '../../types/index';\n\n// Hyperliquid brand colors\nconst COLORS = {\n aquamarine: '#97FCE4',\n firefly: '#0F3933',\n ebony: '#04060C',\n foam: '#F5FEFD',\n};\n\n// Arbitrum USDC contract address\nconst ARBITRUM_USDC_ADDRESS = '0xaf88d065e77c8cC2239327C5EDb3A432268e5831';\nconst ARBITRUM_CHAIN_ID = 42161;\n\n// ERC-20 ABI (minimal for transfer and balanceOf)\nconst ERC20_ABI = [\n 'function transfer(address to, uint256 amount) returns (bool)',\n 'function balanceOf(address account) view returns (uint256)',\n 'function approve(address spender, uint256 amount) returns (bool)',\n];\n\ninterface DepositModalProps {\n chains: ChainInfo[];\n walletAddress: string;\n onClose: () => void;\n embedded?: boolean; // When true, renders only content without modal wrapper\n styles?: {\n modal?: React.CSSProperties;\n overlay?: React.CSSProperties;\n };\n}\n\ntype DepositStep = 'input' | 'scanning' | 'select' | 'executing' | 'depositing' | 'complete';\n\ninterface BridgeExecution {\n option: BridgeOption;\n status: 'pending' | 'executing' | 'completed' | 'failed';\n progress?: DetailedBridgeProgress;\n error?: string;\n}\n\ninterface HyperLiquidDepositStatus {\n status: 'pending' | 'executing' | 'completed' | 'failed';\n amountUSDC: number;\n txHash?: string;\n error?: string;\n}\n\nexport const DepositModal: React.FC<DepositModalProps> = ({\n chains,\n walletAddress,\n onClose,\n embedded = false,\n styles = {},\n}) => {\n const [step, setStep] = useState<DepositStep>('input');\n const [amount, setAmount] = useState('');\n const [scanProgress, setScanProgress] = useState({ message: '', progress: 0 });\n const [depositPlan, setDepositPlan] = useState<DepositPlan | null>(null);\n const [selectedStrategy, setSelectedStrategy] = useState<'fastest' | 'cheapest' | null>(null);\n const [executions, setExecutions] = useState<BridgeExecution[]>([]);\n const [currentExecutionIndex, setCurrentExecutionIndex] = useState(0);\n const [overallComplete, setOverallComplete] = useState(false);\n const [hyperLiquidDeposit, setHyperLiquidDeposit] = useState<HyperLiquidDepositStatus | null>(null);\n \n const optimizer = useRef(new DepositOptimizer());\n const bridgeService = useRef(new LiFiBridgeService());\n\n // Handle amount input and start scanning\n const handleCalculate = async () => {\n const rawAmount = parseFloat(amount);\n if (isNaN(rawAmount) || rawAmount <= 0) return;\n \n // Round to 2 decimal places (USD precision) to avoid floating-point issues\n // e.g., 1.894 becomes 1.89, 962.567 becomes 962.56\n const targetAmount = Math.floor(rawAmount * 100) / 100;\n\n setStep('scanning');\n \n try {\n const plan = await optimizer.current.calculateDepositPlan(\n walletAddress,\n targetAmount,\n chains,\n (message, progress) => {\n setScanProgress({ message, progress });\n }\n );\n \n setDepositPlan(plan);\n setStep('select');\n } catch (error) {\n console.error('Failed to calculate deposit plan:', error);\n setScanProgress({ message: 'Failed to calculate. Please try again.', progress: 0 });\n }\n };\n\n // Execute the selected strategy\n const handleExecute = async () => {\n if (!depositPlan) return;\n \n // Determine which strategy to use\n let strategyToUse = selectedStrategy;\n \n // If no strategy selected, check if one dominates and use that\n if (!strategyToUse && depositPlan.fastest && depositPlan.cheapest) {\n const fastest = depositPlan.fastest;\n const cheapest = depositPlan.cheapest;\n \n const cheapestIsFasterOrEqual = cheapest.totalTimeSeconds <= fastest.totalTimeSeconds;\n const cheapestIsCheaperOrEqual = cheapest.totalFeesUSD <= fastest.totalFeesUSD;\n const cheapestHasSimilarOutput = cheapest.totalOutputUSD >= fastest.totalOutputUSD * 0.95;\n \n const fastestIsFasterOrEqual = fastest.totalTimeSeconds <= cheapest.totalTimeSeconds;\n const fastestIsCheaperOrEqual = fastest.totalFeesUSD <= cheapest.totalFeesUSD;\n const fastestHasSimilarOutput = fastest.totalOutputUSD >= cheapest.totalOutputUSD * 0.95;\n \n const cheapestDominates = cheapestIsFasterOrEqual && cheapestIsCheaperOrEqual && cheapestHasSimilarOutput;\n const fastestDominates = fastestIsFasterOrEqual && fastestIsCheaperOrEqual && fastestHasSimilarOutput;\n \n // Special case: if \"cheapest\" is actually FASTER and cheaper, use it\n const cheapestIsActuallyFaster = cheapest.totalTimeSeconds < fastest.totalTimeSeconds;\n const fastestIsActuallyFaster = fastest.totalTimeSeconds < cheapest.totalTimeSeconds;\n \n if ((cheapestDominates && !fastestDominates) || (cheapestIsActuallyFaster && cheapestIsCheaperOrEqual)) {\n strategyToUse = 'cheapest';\n } else if ((fastestDominates && !cheapestDominates) || (fastestIsActuallyFaster && fastestIsCheaperOrEqual)) {\n strategyToUse = 'fastest';\n }\n }\n \n // If still no strategy and only one exists, use that\n if (!strategyToUse) {\n if (depositPlan.fastest && !depositPlan.cheapest) strategyToUse = 'fastest';\n else if (depositPlan.cheapest && !depositPlan.fastest) strategyToUse = 'cheapest';\n }\n \n if (!strategyToUse) return;\n \n const strategy = strategyToUse === 'fastest' \n ? depositPlan.fastest \n : depositPlan.cheapest;\n \n if (!strategy) return;\n\n // Initialize executions\n const initialExecutions: BridgeExecution[] = strategy.bridges.map(option => ({\n option,\n status: 'pending',\n }));\n \n setExecutions(initialExecutions);\n setCurrentExecutionIndex(0);\n setStep('executing');\n\n // Track successful bridges locally (can't rely on async state updates)\n let successfulBridgeCount = 0;\n let userRejected = false;\n\n // Execute bridges sequentially\n for (let i = 0; i < strategy.bridges.length; i++) {\n setCurrentExecutionIndex(i);\n const bridge = strategy.bridges[i];\n \n // Update status to executing (getting quote)\n setExecutions(prev => prev.map((exec, idx) => \n idx === i ? { ...exec, status: 'executing' } : exec\n ));\n\n try {\n // Get the EXACT amount to bridge (already calculated with precision in optimizer)\n // The usedInputAmount is pre-calculated with proper rounding to avoid SDK errors\n let amountToBridge = bridge.usedInputAmount;\n \n if (!amountToBridge) {\n // Fallback: calculate with precision-safe rounding\n const balance = parseFloat(bridge.from.balance);\n const symbol = bridge.from.tokenSymbol.toUpperCase();\n \n // Check if stablecoin - round to whole units\n const isStable = ['USDC', 'USDT', 'DAI', 'BUSD', 'TUSD'].some(s => symbol.includes(s));\n \n if (isStable) {\n // Round to whole units for stablecoins (e.g., 12.05 → 12)\n const wholeUnits = Math.floor(balance);\n amountToBridge = Math.floor(wholeUnits * Math.pow(10, bridge.from.tokenDecimals)).toString();\n } else {\n // Limit to 4 decimals of precision for other tokens\n const effectiveDecimals = Math.min(bridge.from.tokenDecimals, 4);\n const scaleFactor = Math.pow(10, effectiveDecimals);\n const roundedBalance = Math.floor(balance * scaleFactor) / scaleFactor;\n amountToBridge = Math.floor(roundedBalance * Math.pow(10, bridge.from.tokenDecimals)).toString();\n }\n }\n \n console.log(`🔄 Bridging ${bridge.from.tokenSymbol} on ${bridge.from.chainName}:`, {\n amount: amountToBridge,\n token: bridge.from.tokenAddress,\n usedInputUSD: bridge.usedInputUSD,\n });\n \n // Fetch fresh quote for the exact amount - destination is Arbitrum USDC\n const freshQuote = await bridgeService.current.getBridgeRouteWithTokens(\n bridge.from.chainId,\n ARBITRUM_CHAIN_ID,\n bridge.from.tokenAddress,\n ARBITRUM_USDC_ADDRESS,\n amountToBridge,\n walletAddress\n );\n \n console.log(`📋 Got fresh quote, fromAmount:`, freshQuote.action.fromAmount);\n \n // Execute with the fresh quote\n await bridgeService.current.executeBridgeWithDetailedProgress(\n freshQuote,\n (progress) => {\n setExecutions(prev => prev.map((exec, idx) => \n idx === i ? { ...exec, progress } : exec\n ));\n }\n );\n\n // Mark as completed and increment local counter\n successfulBridgeCount++;\n setExecutions(prev => prev.map((exec, idx) => \n idx === i ? { ...exec, status: 'completed' } : exec\n ));\n \n console.log(`✅ Bridge ${i + 1} completed. Total successful: ${successfulBridgeCount}`);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Bridge failed';\n const friendlyError = getDepositErrorMessage(errorMessage);\n \n console.error(`❌ Bridge ${i + 1} failed:`, errorMessage);\n \n // Mark as failed\n setExecutions(prev => prev.map((exec, idx) => \n idx === i ? { \n ...exec, \n status: 'failed',\n error: friendlyError\n } : exec\n ));\n \n // If user rejected, stop execution entirely\n if (isUserRejection(errorMessage)) {\n console.log('🛑 User rejected transaction, stopping execution');\n userRejected = true;\n break;\n }\n \n // Continue with next bridge for other errors\n }\n }\n\n console.log(`🏁 Bridge execution complete. Successful: ${successfulBridgeCount}, User rejected: ${userRejected}`);\n\n // Check if at least one bridge succeeded (use local counter, not stale state!)\n if (successfulBridgeCount > 0) {\n // Proceed to HyperLiquid deposit step\n console.log('➡️ Proceeding to HyperLiquid deposit...');\n setStep('depositing');\n await executeHyperLiquidDeposit();\n } else {\n // All bridges failed, go to complete with error state\n console.log('❌ All bridges failed, showing error state');\n setOverallComplete(true);\n setStep('complete');\n }\n };\n\n /**\n * Execute the final deposit to HyperLiquid bridge contract\n */\n const executeHyperLiquidDeposit = async () => {\n try {\n // Get USDC balance on Arbitrum\n const ethereum = (window as any).ethereum;\n if (!ethereum) {\n throw new Error('No wallet found');\n }\n\n // Switch to Arbitrum if needed\n try {\n await ethereum.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: '0xa4b1' }], // 42161 in hex\n });\n } catch (switchError: any) {\n // Chain not added, try to add it\n if (switchError.code === 4902) {\n await ethereum.request({\n method: 'wallet_addEthereumChain',\n params: [{\n chainId: '0xa4b1',\n chainName: 'Arbitrum One',\n nativeCurrency: { name: 'ETH', symbol: 'ETH', decimals: 18 },\n rpcUrls: ['https://arb1.arbitrum.io/rpc'],\n blockExplorerUrls: ['https://arbiscan.io'],\n }],\n });\n }\n }\n\n // Get USDC balance\n const { ethers } = await import('ethers');\n // Support both ethers v5 (Web3Provider) and v6 (BrowserProvider)\n const provider = 'BrowserProvider' in ethers \n ? new (ethers as any).BrowserProvider(ethereum)\n : new (ethers as any).providers.Web3Provider(ethereum);\n const signer = await provider.getSigner();\n \n const usdcContract = new ethers.Contract(\n ARBITRUM_USDC_ADDRESS,\n ERC20_ABI,\n signer\n );\n\n const balance = await usdcContract.balanceOf(walletAddress);\n const balanceUSDC = Number(balance) / 1e6; // USDC has 6 decimals\n \n console.log(`💰 USDC balance on Arbitrum: $${balanceUSDC.toFixed(2)}`);\n \n // Calculate the amount to deposit - use the REQUESTED amount, not the full balance\n const requestedAmount = parseFloat(amount);\n const depositAmount = Math.min(requestedAmount, balanceUSDC);\n \n console.log(`📊 Requested: $${requestedAmount.toFixed(2)}, Available: $${balanceUSDC.toFixed(2)}, Depositing: $${depositAmount.toFixed(2)}`);\n\n // Check minimum deposit requirement\n if (depositAmount < MIN_HYPERLIQUID_DEPOSIT_USD) {\n setHyperLiquidDeposit({\n status: 'failed',\n amountUSDC: depositAmount,\n error: `Minimum deposit is $${MIN_HYPERLIQUID_DEPOSIT_USD} USDC. Deposit amount: $${depositAmount.toFixed(2)} USDC.`\n });\n setOverallComplete(true);\n setStep('complete');\n return;\n }\n\n setHyperLiquidDeposit({\n status: 'executing',\n amountUSDC: depositAmount,\n });\n\n // Transfer ONLY the requested amount to HyperLiquid bridge contract\n // Convert to smallest units (USDC has 6 decimals)\n const depositAmountSmallestUnits = BigInt(Math.floor(depositAmount * 1e6));\n \n console.log(`🚀 Depositing $${depositAmount.toFixed(2)} USDC to HyperLiquid bridge...`);\n \n const tx = await usdcContract.transfer(HYPERLIQUID_BRIDGE_ADDRESS, depositAmountSmallestUnits);\n console.log(`📝 Transaction submitted: ${tx.hash}`);\n \n // Wait for confirmation\n const receipt = await tx.wait();\n console.log(`✅ Transaction confirmed: ${receipt.hash}`);\n\n setHyperLiquidDeposit({\n status: 'completed',\n amountUSDC: depositAmount,\n txHash: receipt.hash,\n });\n\n setOverallComplete(true);\n setStep('complete');\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Deposit failed';\n console.error('❌ HyperLiquid deposit failed:', errorMessage);\n \n setHyperLiquidDeposit(prev => ({\n status: 'failed',\n amountUSDC: prev?.amountUSDC || 0,\n error: isUserRejection(errorMessage) \n ? 'Transaction cancelled. You rejected the deposit.'\n : errorMessage,\n }));\n\n setOverallComplete(true);\n setStep('complete');\n }\n };\n\n /**\n * Check if error is a user rejection\n */\n const isUserRejection = (errorMessage: string): boolean => {\n const lowerMessage = errorMessage.toLowerCase();\n return (\n lowerMessage.includes('user rejected') ||\n lowerMessage.includes('user denied') ||\n lowerMessage.includes('user cancelled') ||\n lowerMessage.includes('user canceled') ||\n lowerMessage.includes('rejected the request') ||\n lowerMessage.includes('bundle id is unknown') || // This is the viem error for rejection\n lowerMessage.includes('has not been submitted') ||\n lowerMessage.includes('no matching bundle') ||\n lowerMessage.includes('action_rejected')\n );\n };\n\n /**\n * Get user-friendly error message for deposit errors\n */\n const getDepositErrorMessage = (errorMessage: string): string => {\n const lowerMessage = errorMessage.toLowerCase();\n \n // User rejection errors\n if (isUserRejection(errorMessage)) {\n return 'Transaction cancelled. You rejected the transaction in your wallet.';\n }\n \n // Amount validation errors\n if (lowerMessage.includes('fromamount must be equal to constant') || \n lowerMessage.includes('must be equal to constant')) {\n return 'Quote expired. The amount changed since the quote was fetched. Please try again.';\n }\n \n // Insufficient funds\n if (lowerMessage.includes('insufficient') || \n lowerMessage.includes('not enough') ||\n lowerMessage.includes('exceeds balance')) {\n return 'Insufficient funds. You may not have enough tokens or gas to complete this transaction.';\n }\n \n // Network/RPC errors\n if (lowerMessage.includes('network') || \n lowerMessage.includes('rpc') ||\n lowerMessage.includes('timeout') ||\n lowerMessage.includes('connection')) {\n return 'Network error. Please check your connection and try again.';\n }\n \n // Slippage errors\n if (lowerMessage.includes('slippage') || \n lowerMessage.includes('price impact')) {\n return 'Price changed too much. Please try again with a smaller amount.';\n }\n \n // Generic validation error\n if (lowerMessage.includes('validationerror') || lowerMessage.includes('validation')) {\n return 'Validation failed. Please go back and try again with a fresh quote.';\n }\n \n // Return original if no match (truncated if too long)\n if (errorMessage.length > 100) {\n return errorMessage.substring(0, 100) + '...';\n }\n return errorMessage;\n };\n\n // Format time display\n const formatTime = (seconds: number): string => {\n if (seconds < 60) return `~${seconds}s`;\n const minutes = Math.ceil(seconds / 60);\n return `~${minutes} min`;\n };\n\n // Format USD display\n const formatUSD = (value: number): string => {\n return `$${value.toFixed(2)}`;\n };\n\n // Render amount input step\n const renderInputStep = () => (\n <div style={{ padding: '24px' }}>\n <div style={{\n textAlign: 'center',\n marginBottom: '32px',\n }}>\n <div style={{\n fontSize: '48px',\n marginBottom: '8px',\n }}>💰</div>\n <h2 style={{\n fontSize: '20px',\n fontWeight: '600',\n color: COLORS.foam,\n marginBottom: '8px',\n }}>\n Deposit to HyperLiquid\n </h2>\n <p style={{\n fontSize: '14px',\n color: COLORS.foam + '80',\n }}>\n Enter the amount you want to deposit. We'll find the best routes from all your assets.\n </p>\n </div>\n\n <div style={{\n background: `linear-gradient(135deg, ${COLORS.firefly}80 0%, ${COLORS.ebony}90 100%)`,\n borderRadius: '20px',\n padding: '24px',\n border: `3px solid ${COLORS.aquamarine}30`,\n marginBottom: '24px',\n }}>\n <label style={{\n display: 'block',\n fontSize: '12px',\n color: COLORS.aquamarine + '80',\n marginBottom: '12px',\n fontWeight: '600',\n }}>\n AMOUNT TO DEPOSIT (USDC)\n </label>\n \n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n }}>\n <span style={{\n fontSize: '32px',\n fontWeight: '600',\n color: COLORS.aquamarine,\n }}>$</span>\n <input\n type=\"number\"\n value={amount}\n onChange={(e) => setAmount(e.target.value)}\n placeholder=\"0.00\"\n min={MIN_HYPERLIQUID_DEPOSIT_USD}\n style={{\n flex: 1,\n background: 'transparent',\n border: 'none',\n fontSize: '32px',\n fontWeight: '600',\n color: COLORS.foam,\n outline: 'none',\n }}\n autoFocus\n />\n </div>\n \n <div style={{\n marginTop: '12px',\n fontSize: '12px',\n color: COLORS.foam + '60',\n }}>\n Minimum deposit: ${MIN_HYPERLIQUID_DEPOSIT_USD} USDC\n </div>\n </div>\n\n <button\n onClick={handleCalculate}\n disabled={!amount || parseFloat(amount) < MIN_HYPERLIQUID_DEPOSIT_USD}\n style={{\n width: '100%',\n padding: '18px',\n fontSize: '18px',\n fontWeight: '600',\n border: 'none',\n borderRadius: '16px',\n cursor: amount && parseFloat(amount) >= MIN_HYPERLIQUID_DEPOSIT_USD ? 'pointer' : 'not-allowed',\n background: amount && parseFloat(amount) >= MIN_HYPERLIQUID_DEPOSIT_USD\n ? `linear-gradient(135deg, ${COLORS.aquamarine} 0%, ${COLORS.firefly} 150%)`\n : COLORS.firefly + '60',\n color: amount && parseFloat(amount) >= MIN_HYPERLIQUID_DEPOSIT_USD ? COLORS.ebony : COLORS.foam + '50',\n transition: 'all 0.3s ease',\n }}\n >\n Find Best Routes\n </button>\n </div>\n );\n\n // Render scanning progress step\n const renderScanningStep = () => (\n <div style={{ padding: '24px', textAlign: 'center' }}>\n <div style={{\n width: '80px',\n height: '80px',\n borderRadius: '50%',\n background: `linear-gradient(135deg, ${COLORS.aquamarine}20 0%, ${COLORS.firefly} 100%)`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n margin: '0 auto 24px',\n animation: 'pulse 2s infinite',\n }}>\n <span style={{ fontSize: '36px' }}>🔍</span>\n </div>\n \n <h3 style={{\n fontSize: '18px',\n fontWeight: '600',\n color: COLORS.foam,\n marginBottom: '8px',\n }}>\n Scanning Your Assets\n </h3>\n \n <p style={{\n fontSize: '14px',\n color: COLORS.foam + '80',\n marginBottom: '24px',\n }}>\n {scanProgress.message || 'Checking balances across all chains...'}\n </p>\n\n {/* Progress bar */}\n <div style={{\n width: '100%',\n height: '8px',\n background: COLORS.firefly,\n borderRadius: '4px',\n overflow: 'hidden',\n }}>\n <div style={{\n width: `${scanProgress.progress}%`,\n height: '100%',\n background: `linear-gradient(90deg, ${COLORS.aquamarine} 0%, ${COLORS.firefly} 200%)`,\n borderRadius: '4px',\n transition: 'width 0.3s ease',\n }} />\n </div>\n \n <p style={{\n fontSize: '12px',\n color: COLORS.foam + '60',\n marginTop: '8px',\n }}>\n {Math.round(scanProgress.progress)}%\n </p>\n </div>\n );\n\n // Render strategy card\n const renderStrategyCard = (\n strategy: DepositStrategy | null,\n type: 'fastest' | 'cheapest',\n icon: string,\n title: string\n ) => {\n if (!strategy) return null;\n \n const isSelected = selectedStrategy === type;\n \n return (\n <button\n onClick={() => setSelectedStrategy(type)}\n style={{\n width: '100%',\n padding: '20px',\n background: isSelected \n ? `linear-gradient(135deg, ${COLORS.aquamarine}30 0%, ${COLORS.firefly} 100%)`\n : `linear-gradient(135deg, ${COLORS.firefly}80 0%, ${COLORS.ebony}90 100%)`,\n border: `3px solid ${isSelected ? COLORS.aquamarine : COLORS.aquamarine + '30'}`,\n borderRadius: '16px',\n cursor: 'pointer',\n textAlign: 'left',\n transition: 'all 0.3s ease',\n marginBottom: '16px',\n }}\n >\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n marginBottom: '16px',\n }}>\n <span style={{ fontSize: '24px' }}>{icon}</span>\n <div>\n <div style={{\n fontSize: '16px',\n fontWeight: '600',\n color: COLORS.foam,\n }}>{title}</div>\n <div style={{\n fontSize: '12px',\n color: COLORS.foam + '70',\n }}>\n {strategy.bridges.length} bridge{strategy.bridges.length > 1 ? 's' : ''}\n </div>\n </div>\n {isSelected && (\n <div style={{\n marginLeft: 'auto',\n width: '24px',\n height: '24px',\n borderRadius: '50%',\n background: COLORS.aquamarine,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}>\n <span style={{ color: COLORS.ebony, fontSize: '14px' }}>✓</span>\n </div>\n )}\n </div>\n\n {/* Stats row */}\n <div style={{\n display: 'grid',\n gridTemplateColumns: '1fr 1fr 1fr',\n gap: '12px',\n }}>\n <div>\n <div style={{ fontSize: '11px', color: COLORS.foam + '60', marginBottom: '4px' }}>\n You'll receive\n </div>\n <div style={{ fontSize: '16px', fontWeight: '600', color: COLORS.aquamarine }}>\n {formatUSD(strategy.totalOutputUSD)}\n </div>\n </div>\n <div>\n <div style={{ fontSize: '11px', color: COLORS.foam + '60', marginBottom: '4px' }}>\n Est. Time\n </div>\n <div style={{ fontSize: '16px', fontWeight: '600', color: COLORS.foam }}>\n {formatTime(strategy.totalTimeSeconds)}\n </div>\n </div>\n <div>\n <div style={{ fontSize: '11px', color: COLORS.foam + '60', marginBottom: '4px' }}>\n Total Fees\n </div>\n <div style={{ fontSize: '16px', fontWeight: '600', color: '#fbbf24' }}>\n {formatUSD(strategy.totalFeesUSD)}\n </div>\n </div>\n </div>\n\n {/* Bridges list */}\n <div style={{\n marginTop: '16px',\n paddingTop: '16px',\n borderTop: `1px solid ${COLORS.aquamarine}20`,\n }}>\n {strategy.bridges.map((bridge, idx) => (\n <div key={idx} style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '8px 0',\n fontSize: '13px',\n }}>\n <span style={{ color: COLORS.foam + '80' }}>\n {bridge.from.tokenSymbol}\n </span>\n <span style={{ color: COLORS.foam + '50' }}>on</span>\n <span style={{ color: COLORS.foam }}>\n {bridge.from.chainName}\n </span>\n <span style={{ color: COLORS.aquamarine, marginLeft: 'auto' }}>\n {formatUSD(bridge.usedInputUSD ?? bridge.from.balanceUSD)} → {formatUSD(bridge.usedOutputUSD ?? bridge.estimatedOutputUSD)}\n </span>\n </div>\n ))}\n </div>\n </button>\n );\n };\n\n // Render strategy selection step\n const renderSelectStep = () => {\n if (!depositPlan) return null;\n\n if (depositPlan.insufficientFunds) {\n return (\n <div style={{ padding: '24px', textAlign: 'center' }}>\n <div style={{ fontSize: '48px', marginBottom: '16px' }}>😔</div>\n <h3 style={{\n fontSize: '18px',\n fontWeight: '600',\n color: COLORS.foam,\n marginBottom: '8px',\n }}>\n Insufficient Funds\n </h3>\n <p style={{\n fontSize: '14px',\n color: COLORS.foam + '80',\n marginBottom: '16px',\n }}>\n You have {formatUSD(depositPlan.availableBalanceUSD)} available across all chains,\n but you want to deposit {formatUSD(depositPlan.targetAmount)}.\n </p>\n <button\n onClick={() => setStep('input')}\n style={{\n padding: '12px 24px',\n background: COLORS.firefly,\n border: `2px solid ${COLORS.aquamarine}`,\n borderRadius: '12px',\n color: COLORS.aquamarine,\n fontSize: '14px',\n fontWeight: '600',\n cursor: 'pointer',\n }}\n >\n Try a smaller amount\n </button>\n </div>\n );\n }\n\n if (!depositPlan.fastest && !depositPlan.cheapest) {\n return (\n <div style={{ padding: '24px', textAlign: 'center' }}>\n <div style={{ fontSize: '48px', marginBottom: '16px' }}>🚫</div>\n <h3 style={{\n fontSize: '18px',\n fontWeight: '600',\n color: COLORS.foam,\n marginBottom: '8px',\n }}>\n No Routes Available\n </h3>\n <p style={{\n fontSize: '14px',\n color: COLORS.foam + '80',\n }}>\n We couldn't find any bridge routes for your assets. Please try again later.\n </p>\n </div>\n );\n }\n\n // Determine which strategies to show\n // If one strategy dominates the other (better or equal in ALL metrics), show only that one\n const fastest = depositPlan.fastest;\n const cheapest = depositPlan.cheapest;\n \n let showFastest = !!fastest;\n let showCheapest = !!cheapest;\n let singleBestStrategy: 'fastest' | 'cheapest' | null = null;\n \n if (fastest && cheapest) {\n // First, check if strategies are essentially IDENTICAL (same bridges, just different order)\n const areSameBridges = () => {\n if (fastest.bridges.length !== cheapest.bridges.length) return false;\n \n // Create a set of bridge identifiers for each strategy\n const fastestBridgeIds = new Set(\n fastest.bridges.map(b => `${b.from.chainId}-${b.from.tokenSymbol}-${b.usedInputAmount || b.from.balance}`)\n );\n const cheapestBridgeIds = new Set(\n cheapest.bridges.map(b => `${b.from.chainId}-${b.from.tokenSymbol}-${b.usedInputAmount || b.from.balance}`)\n );\n \n // Check if all bridges in fastest are also in cheapest\n for (const id of fastestBridgeIds) {\n if (!cheapestBridgeIds.has(id)) return false;\n }\n return true;\n };\n \n // Check if metrics are essentially the same (within 1%)\n const sameTime = Math.abs(fastest.totalTimeSeconds - cheapest.totalTimeSeconds) <= 1;\n const sameFees = Math.abs(fastest.totalFeesUSD - cheapest.totalFeesUSD) < 0.01;\n const sameOutput = Math.abs(fastest.totalOutputUSD - cheapest.totalOutputUSD) < 0.10;\n \n const strategiesAreIdentical = areSameBridges() && sameTime && sameFees && sameOutput;\n \n if (strategiesAreIdentical) {\n // Strategies are identical - show only one as \"Best Route\"\n showCheapest = false;\n singleBestStrategy = 'fastest';\n console.log('🔄 Strategies are identical (same bridges, different order) - showing only one');\n } else {\n // Check if cheapest dominates fastest\n // Dominates = better or equal in time AND fees, with similar output (within 5%)\n const cheapestIsFasterOrEqual = cheapest.totalTimeSeconds <= fastest.totalTimeSeconds;\n const cheapestIsCheaperOrEqual = cheapest.totalFeesUSD <= fastest.totalFeesUSD;\n const cheapestHasSimilarOutput = cheapest.totalOutputUSD >= fastest.totalOutputUSD * 0.95;\n \n const fastestIsFasterOrEqual = fastest.totalTimeSeconds <= cheapest.totalTimeSeconds;\n const fastestIsCheaperOrEqual = fastest.totalFeesUSD <= cheapest.totalFeesUSD;\n const fastestHasSimilarOutput = fastest.totalOutputUSD >= cheapest.totalOutputUSD * 0.95;\n \n // Cheapest dominates if it's both faster AND cheaper (or equal), with acceptable output\n const cheapestDominates = cheapestIsFasterOrEqual && cheapestIsCheaperOrEqual && cheapestHasSimilarOutput;\n \n // Fastest dominates if it's both faster AND cheaper (or equal), with acceptable output\n const fastestDominates = fastestIsFasterOrEqual && fastestIsCheaperOrEqual && fastestHasSimilarOutput;\n \n // Special case: if \"cheapest\" is actually FASTER, it's clearly better - show only that\n const cheapestIsActuallyFaster = cheapest.totalTimeSeconds < fastest.totalTimeSeconds;\n const fastestIsActuallyFaster = fastest.totalTimeSeconds < cheapest.totalTimeSeconds;\n \n if ((cheapestDominates && !fastestDominates) || (cheapestIsActuallyFaster && cheapestIsCheaperOrEqual)) {\n // Cheapest is better in every way - only show cheapest\n showFastest = false;\n singleBestStrategy = 'cheapest';\n console.log('💎 Cheapest strategy dominates - showing only cheapest', {\n time: `${cheapest.totalTimeSeconds}s vs ${fastest.totalTimeSeconds}s`,\n fees: `$${cheapest.totalFeesUSD.toFixed(2)} vs $${fastest.totalFeesUSD.toFixed(2)}`,\n output: `$${cheapest.totalOutputUSD.toFixed(2)} vs $${fastest.totalOutputUSD.toFixed(2)}`\n });\n } else if ((fastestDominates && !cheapestDominates) || (fastestIsActuallyFaster && fastestIsCheaperOrEqual)) {\n // Fastest is better in every way - only show fastest\n showCheapest = false;\n singleBestStrategy = 'fastest';\n console.log('⚡ Fastest strategy dominates - showing only fastest');\n }\n // If neither dominates (real tradeoff exists), show both options\n }\n }\n \n // Auto-select if only one option\n const effectiveSelectedStrategy = singleBestStrategy || selectedStrategy;\n\n return (\n <div style={{ padding: '24px' }}>\n <div style={{ textAlign: 'center', marginBottom: '24px' }}>\n <h3 style={{\n fontSize: '18px',\n fontWeight: '600',\n color: COLORS.foam,\n marginBottom: '4px',\n }}>\n {singleBestStrategy ? 'Optimal Route Found' : 'Choose Your Strategy'}\n </h3>\n <p style={{\n fontSize: '14px',\n color: COLORS.foam + '80',\n }}>\n Depositing {formatUSD(depositPlan.targetAmount)} to HyperLiquid\n </p>\n </div>\n\n {showFastest && renderStrategyCard(fastest, 'fastest', '⚡', singleBestStrategy === 'fastest' ? 'Best Route' : 'Fastest')}\n {showCheapest && renderStrategyCard(cheapest, 'cheapest', '💎', singleBestStrategy === 'cheapest' ? 'Best Route' : 'Cheapest')}\n\n <button\n onClick={() => {\n // Auto-select the single best strategy if not already selected\n if (singleBestStrategy && !selectedStrategy) {\n setSelectedStrategy(singleBestStrategy);\n }\n handleExecute();\n }}\n disabled={!effectiveSelectedStrategy && !singleBestStrategy}\n style={{\n width: '100%',\n padding: '18px',\n fontSize: '18px',\n fontWeight: '600',\n border: 'none',\n borderRadius: '16px',\n cursor: (effectiveSelectedStrategy || singleBestStrategy) ? 'pointer' : 'not-allowed',\n background: (effectiveSelectedStrategy || singleBestStrategy)\n ? `linear-gradient(135deg, ${COLORS.aquamarine} 0%, ${COLORS.firefly} 150%)`\n : COLORS.firefly + '60',\n color: (effectiveSelectedStrategy || singleBestStrategy) ? COLORS.ebony : COLORS.foam + '50',\n transition: 'all 0.3s ease',\n marginTop: '8px',\n }}\n >\n {singleBestStrategy \n ? 'Execute Best Route' \n : `Execute ${selectedStrategy === 'fastest' ? '⚡ Fastest' : selectedStrategy === 'cheapest' ? '💎 Cheapest' : ''} Strategy`}\n </button>\n </div>\n );\n };\n\n // Render execution step\n const renderExecutingStep = () => {\n const getHeaderText = () => {\n if (step === 'depositing') {\n return 'Depositing to HyperLiquid...';\n }\n if (overallComplete) {\n if (hyperLiquidDeposit?.status === 'completed') {\n return 'Deposit Complete!';\n }\n if (hyperLiquidDeposit?.status === 'failed') {\n return 'Deposit Failed';\n }\n if (executions.some(e => e.status === 'failed')) {\n return executions.some(e => e.status === 'completed') ? 'Partially Complete' : 'Bridges Failed';\n }\n return 'Deposit Complete!';\n }\n return 'Bridging to Arbitrum...';\n };\n\n const getSubText = () => {\n if (step === 'depositing') {\n return 'Transferring USDC to HyperLiquid trading account';\n }\n if (overallComplete) {\n if (hyperLiquidDeposit?.status === 'completed') {\n return `$${hyperLiquidDeposit.amountUSDC.toFixed(2)} USDC deposited to HyperLiquid`;\n }\n if (hyperLiquidDeposit?.status === 'failed') {\n return hyperLiquidDeposit.error || 'Failed to deposit to HyperLiquid';\n }\n if (executions.some(e => e.status === 'failed')) {\n return `${executions.filter(e => e.status === 'completed').length} of ${executions.length} bridges succeeded`;\n }\n return 'Your assets have been deposited to HyperLiquid';\n }\n return `Bridge ${currentExecutionIndex + 1} of ${executions.length}`;\n };\n\n return (\n <div style={{ padding: '24px' }}>\n <div style={{ textAlign: 'center', marginBottom: '24px' }}>\n <h3 style={{\n fontSize: '18px',\n fontWeight: '600',\n color: COLORS.foam,\n marginBottom: '4px',\n }}>\n {getHeaderText()}\n </h3>\n <p style={{\n fontSize: '14px',\n color: COLORS.foam + '80',\n }}>\n {getSubText()}\n </p>\n </div>\n\n {/* Execution list */}\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n }}>\n {executions.map((exec, idx) => (\n <div\n key={idx}\n style={{\n padding: '16px',\n background: `linear-gradient(135deg, ${COLORS.firefly}80 0%, ${COLORS.ebony}90 100%)`,\n border: `2px solid ${\n exec.status === 'completed' ? '#4ade80' :\n exec.status === 'failed' ? '#ef4444' :\n exec.status === 'executing' ? COLORS.aquamarine :\n COLORS.aquamarine + '30'\n }`,\n borderRadius: '12px',\n }}\n >\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n }}>\n {/* Status icon */}\n <div style={{\n width: '32px',\n height: '32px',\n borderRadius: '50%',\n background: exec.status === 'completed' ? '#4ade80' :\n exec.status === 'failed' ? '#ef4444' :\n exec.status === 'executing' ? COLORS.aquamarine :\n COLORS.firefly,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '16px',\n }}>\n {exec.status === 'completed' ? '✓' :\n exec.status === 'failed' ? '✗' :\n exec.status === 'executing' ? '⏳' : '○'}\n </div>\n\n {/* Bridge info */}\n <div style={{ flex: 1 }}>\n <div style={{\n fontSize: '14px',\n fontWeight: '600',\n color: COLORS.foam,\n }}>\n {exec.option.from.tokenSymbol} on {exec.option.from.chainName}\n </div>\n <div style={{\n fontSize: '12px',\n color: COLORS.foam + '70',\n }}>\n {formatUSD(exec.option.usedInputUSD ?? exec.option.from.balanceUSD)} → {formatUSD(exec.option.usedOutputUSD ?? exec.option.estimatedOutputUSD)} USDC\n </div>\n </div>\n\n {/* Status text */}\n <div style={{\n fontSize: '12px',\n fontWeight: '600',\n color: exec.status === 'completed' ? '#4ade80' :\n exec.status === 'failed' ? '#ef4444' :\n exec.status === 'executing' ? COLORS.aquamarine :\n COLORS.foam + '50',\n }}>\n {exec.status === 'completed' ? 'Done' :\n exec.status === 'failed' ? 'Failed' :\n exec.status === 'executing' ? 'In Progress' : 'Waiting'}\n </div>\n </div>\n\n {/* Progress details for executing bridge */}\n {exec.status === 'executing' && exec.progress && (\n <div style={{\n marginTop: '12px',\n paddingTop: '12px',\n borderTop: `1px solid ${COLORS.aquamarine}20`,\n fontSize: '13px',\n color: COLORS.foam + '80',\n }}>\n {exec.progress.message}\n </div>\n )}\n\n {/* Error message */}\n {exec.status === 'failed' && exec.error && (\n <div style={{\n marginTop: '12px',\n paddingTop: '12px',\n borderTop: `1px solid #ef444440`,\n fontSize: '13px',\n color: '#ef4444',\n }}>\n {exec.error}\n </div>\n )}\n </div>\n ))}\n\n {/* HyperLiquid Deposit Card */}\n {(step === 'depositing' || hyperLiquidDeposit) && (\n <div\n style={{\n padding: '16px',\n background: `linear-gradient(135deg, ${COLORS.firefly}80 0%, ${COLORS.ebony}90 100%)`,\n border: `2px solid ${\n hyperLiquidDeposit?.status === 'completed' ? '#4ade80' :\n hyperLiquidDeposit?.status === 'failed' ? '#ef4444' :\n COLORS.aquamarine\n }`,\n borderRadius: '12px',\n marginTop: '12px',\n }}\n >\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n }}>\n {/* Status icon */}\n <div style={{\n width: '32px',\n height: '32px',\n borderRadius: '50%',\n background: hyperLiquidDeposit?.status === 'completed' ? '#4ade80' :\n hyperLiquidDeposit?.status === 'failed' ? '#ef4444' :\n COLORS.aquamarine,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '16px',\n }}>\n {hyperLiquidDeposit?.status === 'completed' ? '✓' :\n hyperLiquidDeposit?.status === 'failed' ? '✗' : '⏳'}\n </div>\n\n {/* Deposit info */}\n <div style={{ flex: 1 }}>\n <div style={{\n fontSize: '14px',\n fontWeight: '600',\n color: COLORS.foam,\n }}>\n Deposit to HyperLiquid\n </div>\n <div style={{\n fontSize: '12px',\n color: COLORS.foam + '70',\n }}>\n {hyperLiquidDeposit?.amountUSDC \n ? `$${hyperLiquidDeposit.amountUSDC.toFixed(2)} USDC → Trading Account`\n : 'Checking USDC balance...'}\n </div>\n </div>\n\n {/* Status text */}\n <div style={{\n fontSize: '12px',\n fontWeight: '600',\n color: hyperLiquidDeposit?.status === 'completed' ? '#4ade80' :\n hyperLiquidDeposit?.status === 'failed' ? '#ef4444' :\n COLORS.aquamarine,\n }}>\n {hyperLiquidDeposit?.status === 'completed' ? 'Done' :\n hyperLiquidDeposit?.status === 'failed' ? 'Failed' : 'In Progress'}\n </div>\n </div>\n\n {/* Error message */}\n {hyperLiquidDeposit?.status === 'failed' && hyperLiquidDeposit.error && (\n <div style={{\n marginTop: '12px',\n paddingTop: '12px',\n borderTop: `1px solid #ef444440`,\n fontSize: '13px',\n color: '#ef4444',\n }}>\n {hyperLiquidDeposit.error}\n </div>\n )}\n\n {/* Transaction link */}\n {hyperLiquidDeposit?.txHash && (\n <div style={{\n marginTop: '12px',\n paddingTop: '12px',\n borderTop: `1px solid ${COLORS.aquamarine}20`,\n }}>\n <a\n href={`https://arbiscan.io/tx/${hyperLiquidDeposit.txHash}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n fontSize: '12px',\n color: COLORS.aquamarine,\n textDecoration: 'none',\n }}\n >\n View on Arbiscan →\n </a>\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Done button */}\n {overallComplete && (\n <button\n onClick={onClose}\n style={{\n width: '100%',\n padding: '18px',\n fontSize: '18px',\n fontWeight: '600',\n border: 'none',\n borderRadius: '16px',\n cursor: 'pointer',\n background: `linear-gradient(135deg, ${COLORS.aquamarine} 0%, ${COLORS.firefly} 150%)`,\n color: COLORS.ebony,\n marginTop: '24px',\n }}\n >\n Done\n </button>\n )}\n </div>\n );\n };\n\n // Embedded content (for rendering inside BridgeModal)\n const embeddedContent = (\n <div>\n {/* Back button for embedded mode */}\n {step !== 'input' && step !== 'executing' && step !== 'depositing' && (\n <div style={{ padding: '0 24px 12px' }}>\n <button\n onClick={() => {\n if (step === 'select') setStep('input');\n if (step === 'complete') {\n setStep('select');\n setOverallComplete(false);\n setHyperLiquidDeposit(null);\n }\n }}\n style={{\n background: 'transparent',\n border: 'none',\n color: COLORS.foam,\n fontSize: '14px',\n cursor: 'pointer',\n padding: '8px 0',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n }}\n >\n ← Back\n </button>\n </div>\n )}\n \n {/* Content */}\n {step === 'input' && renderInputStep()}\n {step === 'scanning' && renderScanningStep()}\n {step === 'select' && renderSelectStep()}\n {(step === 'executing' || step === 'depositing' || step === 'complete') && renderExecutingStep()}\n \n <style>{`\n @keyframes pulse {\n 0%, 100% { transform: scale(1); opacity: 1; }\n 50% { transform: scale(1.05); opacity: 0.8; }\n }\n `}</style>\n </div>\n );\n\n // Return embedded content if embedded mode\n if (embedded) {\n return embeddedContent;\n }\n\n // Full modal mode\n return (\n <div style={{\n position: 'fixed',\n inset: 0,\n zIndex: 1000,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n ...styles.overlay,\n }}>\n {/* Backdrop */}\n <div\n onClick={(step === 'executing' || step === 'depositing') ? undefined : onClose}\n style={{\n position: 'absolute',\n inset: 0,\n background: 'rgba(0, 0, 0, 0.8)',\n backdropFilter: 'blur(8px)',\n cursor: (step === 'executing' || step === 'depositing') ? 'not-allowed' : 'pointer',\n }}\n />\n\n {/* Modal */}\n <div style={{\n position: 'relative',\n width: '100%',\n maxWidth: '480px',\n maxHeight: '90vh',\n overflow: 'auto',\n background: `linear-gradient(180deg, ${COLORS.ebony} 0%, ${COLORS.firefly}40 100%)`,\n borderRadius: '24px',\n border: `3px solid ${COLORS.aquamarine}30`,\n boxShadow: `0 25px 50px -12px rgba(0, 0, 0, 0.5), 0 0 40px ${COLORS.aquamarine}20`,\n ...styles.modal,\n }}>\n {/* Header */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '20px 24px',\n borderBottom: `1px solid ${COLORS.aquamarine}20`,\n }}>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n }}>\n {step !== 'input' && step !== 'executing' && (\n <button\n onClick={() => {\n if (step === 'select') setStep('input');\n if (step === 'complete') {\n setStep('select');\n setOverallComplete(false);\n }\n }}\n style={{\n background: 'transparent',\n border: 'none',\n color: COLORS.foam,\n fontSize: '20px',\n cursor: 'pointer',\n padding: '4px',\n }}\n >\n ←\n </button>\n )}\n <h2 style={{\n fontSize: '18px',\n fontWeight: '600',\n color: COLORS.foam,\n margin: 0,\n }}>\n Deposit to HyperLiquid\n </h2>\n </div>\n \n {step !== 'executing' && (\n <button\n onClick={onClose}\n style={{\n background: 'transparent',\n border: `2px solid ${COLORS.aquamarine}40`,\n borderRadius: '10px',\n width: '36px',\n height: '36px',\n color: COLORS.foam,\n fontSize: '18px',\n cursor: 'pointer',\n }}\n >\n ✕\n </button>\n )}\n </div>\n\n {/* Content */}\n {step === 'input' && renderInputStep()}\n {step === 'scanning' && renderScanningStep()}\n {step === 'select' && renderSelectStep()}\n {(step === 'executing' || step === 'complete') && renderExecutingStep()}\n </div>\n\n <style>{`\n @keyframes pulse {\n 0%, 100% { transform: scale(1); opacity: 1; }\n 50% { transform: scale(1.05); opacity: 0.8; }\n }\n `}</style>\n </div>\n );\n};\n\nexport default DepositModal;\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { DepositModal } from './components/DepositModal';\nimport { LiFiBridgeService } from './bridge';\nimport type { ChainInfo } from '../types/index';\n\n// Hyperliquid brand colors\nconst COLORS = {\n aquamarine: '#97FCE4',\n firefly: '#0F3933',\n ebony: '#04060C',\n foam: '#F5FEFD',\n};\n\nexport interface HyperliquidDepositProps {\n /**\n * Wallet address to deposit from\n */\n walletAddress: string;\n \n /**\n * Optional: Custom chains to support. If not provided, uses LI.FI supported chains.\n */\n chains?: ChainInfo[];\n \n /**\n * Optional: Callback when deposit is completed\n */\n onDepositComplete?: (txHash: string, amountUSDC: number) => void;\n \n /**\n * Optional: Callback when deposit fails\n */\n onDepositError?: (error: string) => void;\n \n /**\n * Optional: Custom button render function. If not provided, uses default button.\n */\n renderButton?: (props: { onClick: () => void; disabled: boolean }) => React.ReactNode;\n \n /**\n * Optional: Button text (only used with default button)\n */\n buttonText?: string;\n \n /**\n * Optional: Custom styles for the button (only used with default button)\n */\n buttonStyle?: React.CSSProperties;\n \n /**\n * Optional: Custom class name for the button (only used with default button)\n */\n buttonClassName?: string;\n \n /**\n * Optional: Disable the button\n */\n disabled?: boolean;\n \n /**\n * Optional: Custom modal styles\n */\n modalStyles?: {\n modal?: React.CSSProperties;\n overlay?: React.CSSProperties;\n };\n}\n\n/**\n * HyperliquidDeposit - A one-click deposit button for HyperLiquid\n * \n * This component provides a button that opens a modal to deposit funds\n * from any supported chain to your HyperLiquid trading account.\n * \n * @example\n * ```tsx\n * import { HyperliquidDeposit } from '@aspect-build/hyperliquid-deposit';\n * \n * function App() {\n * return (\n * <HyperliquidDeposit\n * walletAddress=\"0x...\"\n * onDepositComplete={(txHash, amount) => {\n * console.log(`Deposited $${amount} USDC. Tx: ${txHash}`);\n * }}\n * />\n * );\n * }\n * ```\n */\nexport const HyperliquidDeposit: React.FC<HyperliquidDepositProps> = ({\n walletAddress,\n chains: customChains,\n onDepositComplete,\n onDepositError,\n renderButton,\n buttonText = 'Deposit to HyperLiquid',\n buttonStyle,\n buttonClassName,\n disabled = false,\n modalStyles,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [chains, setChains] = useState<ChainInfo[]>(customChains || []);\n const [isLoading, setIsLoading] = useState(!customChains);\n\n // Fetch chains if not provided\n useEffect(() => {\n if (customChains) {\n setChains(customChains);\n setIsLoading(false);\n return;\n }\n\n const fetchChains = async () => {\n try {\n const bridgeService = new LiFiBridgeService();\n const fetchedChains = await bridgeService.getAllChains();\n setChains(fetchedChains);\n } catch (error) {\n console.error('Failed to fetch chains:', error);\n // Use empty array, modal will show error\n setChains([]);\n } finally {\n setIsLoading(false);\n }\n };\n\n fetchChains();\n }, [customChains]);\n\n const handleOpen = useCallback(() => {\n if (!disabled && !isLoading && walletAddress) {\n setIsOpen(true);\n }\n }, [disabled, isLoading, walletAddress]);\n\n const handleClose = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n // Default button styles\n const defaultButtonStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n padding: '12px 24px',\n fontSize: '16px',\n fontWeight: '600',\n border: 'none',\n borderRadius: '12px',\n cursor: disabled || isLoading ? 'not-allowed' : 'pointer',\n background: disabled || isLoading\n ? '#333'\n : `linear-gradient(135deg, ${COLORS.aquamarine} 0%, ${COLORS.firefly} 150%)`,\n color: disabled || isLoading ? '#666' : COLORS.ebony,\n transition: 'all 0.3s ease',\n boxShadow: disabled || isLoading ? 'none' : `0 4px 20px ${COLORS.aquamarine}40`,\n opacity: disabled || isLoading ? 0.6 : 1,\n ...buttonStyle,\n };\n\n // Render custom button if provided\n if (renderButton) {\n return (\n <>\n {renderButton({ onClick: handleOpen, disabled: disabled || isLoading })}\n {isOpen && (\n <DepositModal\n chains={chains}\n walletAddress={walletAddress}\n onClose={handleClose}\n styles={modalStyles}\n />\n )}\n </>\n );\n }\n\n // Render default button\n return (\n <>\n <button\n onClick={handleOpen}\n disabled={disabled || isLoading}\n className={buttonClassName}\n style={defaultButtonStyle}\n onMouseEnter={(e) => {\n if (!disabled && !isLoading) {\n e.currentTarget.style.transform = 'translateY(-2px)';\n e.currentTarget.style.boxShadow = `0 8px 30px ${COLORS.aquamarine}50`;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'translateY(0)';\n if (!disabled && !isLoading) {\n e.currentTarget.style.boxShadow = `0 4px 20px ${COLORS.aquamarine}40`;\n }\n }}\n >\n {/* HyperLiquid-style icon */}\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 2L2 7L12 12L22 7L12 2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M2 17L12 22L22 17\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M2 12L12 17L22 12\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n {isLoading ? 'Loading...' : buttonText}\n </button>\n\n {isOpen && (\n <DepositModal\n chains={chains}\n walletAddress={walletAddress}\n onClose={handleClose}\n styles={modalStyles}\n />\n )}\n </>\n );\n};\n\n/**\n * useHyperliquidDeposit - Hook for programmatic control\n * \n * @example\n * ```tsx\n * const { openDeposit, DepositModal } = useHyperliquidDeposit({\n * walletAddress: '0x...',\n * });\n * \n * return (\n * <>\n * <button onClick={openDeposit}>Custom Button</button>\n * <DepositModal />\n * </>\n * );\n * ```\n */\nexport const useHyperliquidDeposit = (props: Omit<HyperliquidDepositProps, 'renderButton' | 'buttonText' | 'buttonStyle' | 'buttonClassName'>) => {\n const [isOpen, setIsOpen] = useState(false);\n const [chains, setChains] = useState<ChainInfo[]>(props.chains || []);\n\n useEffect(() => {\n if (props.chains) {\n setChains(props.chains);\n return;\n }\n\n const fetchChains = async () => {\n try {\n const bridgeService = new LiFiBridgeService();\n const fetchedChains = await bridgeService.getAllChains();\n setChains(fetchedChains);\n } catch (error) {\n console.error('Failed to fetch chains:', error);\n }\n };\n\n fetchChains();\n }, [props.chains]);\n\n const openDeposit = useCallback(() => {\n if (!props.disabled && props.walletAddress) {\n setIsOpen(true);\n }\n }, [props.disabled, props.walletAddress]);\n\n const closeDeposit = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n const DepositModalComponent = useCallback(() => {\n if (!isOpen) return null;\n \n return (\n <DepositModal\n chains={chains}\n walletAddress={props.walletAddress}\n onClose={closeDeposit}\n styles={props.modalStyles}\n />\n );\n }, [isOpen, chains, props.walletAddress, props.modalStyles, closeDeposit]);\n\n return {\n isOpen,\n openDeposit,\n closeDeposit,\n DepositModal: DepositModalComponent,\n };\n};\n\nexport default HyperliquidDeposit;\n","import React, { useState, useEffect, useRef } from 'react';\nimport { WalletManager } from './wallet';\nimport { LiFiBridgeService, type DetailedBridgeProgress } from './bridge';\nimport { ConnectView } from './components/ConnectView';\nimport { BridgeButton } from './components/BridgeButton';\nimport { BridgeModal, type BridgeParams } from './components/BridgeModal';\nimport type { WalletState, ChainBalance, ChainInfo } from '../types/index';\nimport type { BridgeWidgetStyles } from './styles/defaultStyles';\nimport type { LiFiStep } from '@lifi/sdk';\n\nexport interface HyprBridgeWidgetProps {\n styles?: BridgeWidgetStyles;\n}\n\nexport const HyprBridgeWidget: React.FC<HyprBridgeWidgetProps> = ({ styles }) => {\n const [walletManager] = useState(() => new WalletManager());\n const [bridgeService] = useState(() => new LiFiBridgeService());\n const [walletState, setWalletState] = useState<WalletState>({\n address: null,\n chainId: null,\n isConnected: false,\n });\n const [chains, setChains] = useState<ChainInfo[]>([]);\n const [balances, setBalances] = useState<ChainBalance[]>([]);\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [balancesLoaded, setBalancesLoaded] = useState(false);\n const [bridgeError, setBridgeError] = useState<string | null>(null);\n \n // Persist wallet address to survive temporary disconnects during chain switching\n const lastKnownAddressRef = useRef<string | null>(null);\n\n // Track wallet address changes - persist last known address\n useEffect(() => {\n if (walletState.address) {\n lastKnownAddressRef.current = walletState.address;\n }\n }, [walletState.address]);\n\n // Initialize wallet and load chains\n useEffect(() => {\n const initialize = async () => {\n const state = await walletManager.checkExistingConnection();\n setWalletState(state);\n if (state.address) {\n lastKnownAddressRef.current = state.address;\n }\n\n // Set up wallet state change listener\n walletManager.onStateChange(async (newState) => {\n // Update last known address if we have a valid one\n if (newState.address) {\n lastKnownAddressRef.current = newState.address;\n }\n setWalletState(newState);\n if (newState.isConnected && newState.address) {\n const chainList = chains.length === 0 ? await loadChains() : chains;\n await loadBalances(newState.address, chainList);\n }\n });\n\n // Load chains\n const chainList = await loadChains();\n\n // Load balances if already connected\n if (state.isConnected && state.address) {\n await loadBalances(state.address, chainList);\n }\n };\n\n initialize();\n }, []);\n\n const loadChains = async (): Promise<ChainInfo[]> => {\n try {\n const allChains = await bridgeService.getAllChains();\n // Show all chains - LI.FI handles both bridges and swaps\n console.log(`Loaded ${allChains.length} chains from LI.FI`);\n setChains(allChains);\n return allChains;\n } catch (error) {\n console.error('Failed to load chains:', error);\n return [];\n }\n };\n\n const loadBalances = async (address: string, chainList?: ChainInfo[]) => {\n if (balancesLoaded) {\n return;\n }\n\n let chainsToUse = chainList && chainList.length > 0 ? chainList : chains;\n if (chainsToUse.length === 0) {\n chainsToUse = await loadChains();\n if (chainsToUse.length === 0) {\n return;\n }\n }\n\n const newBalances: ChainBalance[] = [];\n\n // Only check balances for major EVM chains to avoid rate limiting\n // Other chains are still available for selection, just without pre-loaded balance\n const majorChainIds = [1, 42161, 10, 137, 8453, 43114, 56, 250, 324, 59144, 534352, 1337, 999];\n const chainsToCheck = chainsToUse.filter(c => \n majorChainIds.includes(c.id) || c.chainType === 'EVM'\n ).slice(0, 15); // Limit to 15 chains to avoid rate limiting\n\n for (const chain of chainsToCheck) {\n try {\n const tokenInfo = await bridgeService.getTokenInfo(chain.id, 'USDC');\n if (!tokenInfo) {\n // Token lookup already logged in bridge service\n continue;\n }\n\n const balance = await walletManager.getTokenBalance(\n address,\n tokenInfo,\n chain.name\n );\n\n newBalances.push({\n ...balance,\n chain,\n });\n } catch (error) {\n // Concise error message without dumping full error object\n console.warn(`⚠️ Failed to get USDC balance on ${chain.name} (chain ${chain.id})`);\n }\n }\n\n // Keep ALL chains available for selection, not just ones with USDC\n // setChains is not called here - chains remain as loaded from loadChains()\n setBalances(newBalances);\n setBalancesLoaded(true);\n };\n\n const handleConnect = async () => {\n try {\n await walletManager.connectWallet();\n } catch (error) {\n console.error('Connection failed:', error);\n alert('Failed to connect wallet. Please make sure MetaMask is installed.');\n }\n };\n\n const handleBridge = async (params: BridgeParams) => {\n if (!walletState.address) {\n setBridgeError('Please connect your wallet first');\n return;\n }\n\n const { fromChainId, toChainId, fromToken, toToken, amount } = params;\n\n // Calculate amount in smallest unit based on token decimals\n const amountInSmallestUnit = (parseFloat(amount) * Math.pow(10, fromToken.decimals)).toString();\n\n try {\n // Clear any previous errors\n setBridgeError(null);\n\n // Get fresh quote with actual user address for execution\n const route = await bridgeService.getBridgeRouteWithTokens(\n fromChainId,\n toChainId,\n fromToken.address,\n toToken.address,\n amountInSmallestUnit,\n walletState.address\n );\n\n // Log detailed route information\n console.log('🌉 BRIDGE ROUTE DETAILS:', {\n id: route.id,\n type: route.type,\n tool: route.tool,\n toolDetails: route.toolDetails?.name || 'N/A',\n fromChain: route.action.fromChainId,\n toChain: route.action.toChainId,\n fromToken: route.action.fromToken.symbol,\n toToken: route.action.toToken.symbol,\n fromAmount: route.action.fromAmount,\n toAmount: route.estimate.toAmount,\n executionTime: `${Math.ceil(route.estimate.executionDuration / 60)} minutes`,\n gasCosts: route.estimate.gasCosts,\n feeCosts: route.estimate.feeCosts,\n fullRoute: route,\n });\n\n // Check if this is a multi-step route\n const includedSteps = route.includedSteps || [];\n if (includedSteps.length > 0) {\n console.log(`📊 Route uses ${includedSteps.length + 1} step(s) (including intermediate swaps/bridges):`);\n console.log(` Main Step: ${route.toolDetails?.name || route.tool} (${route.type})`);\n includedSteps.forEach((step: any, index: number) => {\n console.log(` Intermediate Step ${index + 1}: ${step.toolDetails?.name || step.tool} (${step.type})`);\n });\n } else {\n console.log(`📊 Direct route using: ${route.toolDetails?.name || route.tool} (${route.type})`);\n }\n\n // Execute bridge directly - user already saw quote info in the modal\n await bridgeService.executeBridge(route, (progress) => {\n console.log('Bridge progress:', progress);\n \n if (progress.status === 'completed') {\n // Refresh balances after successful bridge\n setBalancesLoaded(false);\n if (walletState.address) {\n loadBalances(walletState.address);\n }\n }\n });\n } catch (error) {\n console.error('Bridge failed:', error);\n const errorMsg = error instanceof Error ? error.message : 'Unknown error';\n setBridgeError(`Bridge failed: ${errorMsg}`);\n }\n };\n\n // Handle bridge with detailed progress for status page\n const handleBridgeWithProgress = async (\n params: BridgeParams,\n onProgress: (progress: DetailedBridgeProgress) => void\n ) => {\n if (!walletState.address) {\n throw new Error('Please connect your wallet first');\n }\n\n const { fromChainId, toChainId, fromToken, toToken, amount } = params;\n \n // Convert amount to smallest unit using string manipulation to avoid floating point errors\n // Split the amount into integer and decimal parts\n const [intPart, decPart = ''] = amount.split('.');\n const paddedDecimal = decPart.padEnd(fromToken.decimals, '0').slice(0, fromToken.decimals);\n const amountInSmallestUnit = (intPart + paddedDecimal).replace(/^0+/, '') || '0';\n\n // Get fresh quote for execution - this quote will be used immediately\n const route = await bridgeService.getBridgeRouteWithTokens(\n fromChainId,\n toChainId,\n fromToken.address,\n toToken.address,\n amountInSmallestUnit,\n walletState.address\n );\n\n // Log route details\n console.log('🌉 BRIDGE ROUTE DETAILS:', {\n id: route.id,\n type: route.type,\n tool: route.tool,\n toolDetails: route.toolDetails?.name || 'N/A',\n fromChain: route.action.fromChainId,\n toChain: route.action.toChainId,\n fromToken: route.action.fromToken.symbol,\n toToken: route.action.toToken.symbol,\n });\n\n const includedSteps = (route as any).includedSteps || [];\n if (includedSteps.length > 0) {\n console.log(`📊 Route uses ${includedSteps.length + 1} step(s):`);\n console.log(` Main: ${route.toolDetails?.name || route.tool} (${route.type})`);\n includedSteps.forEach((step: any, index: number) => {\n console.log(` Step ${index + 1}: ${step.toolDetails?.name || step.tool} (${step.type})`);\n });\n } else {\n console.log(`📊 Direct route: ${route.toolDetails?.name || route.tool} (${route.type})`);\n }\n\n // Execute with detailed progress\n await bridgeService.executeBridgeWithDetailedProgress(route, (progress) => {\n onProgress(progress);\n \n if (progress.overallStatus === 'completed') {\n // Refresh balances after successful bridge\n setBalancesLoaded(false);\n if (walletState.address) {\n loadBalances(walletState.address);\n }\n }\n });\n };\n\n // Show connect view only if wallet is disconnected AND modal is not open\n // This prevents the modal from being unmounted during chain switching or transaction signing\n // when MetaMask might temporarily emit disconnect events\n if (!walletState.isConnected && !isModalOpen) {\n return (\n <ConnectView\n targetChainName=\"Any Chain\"\n onConnect={handleConnect}\n styles={styles}\n />\n );\n }\n\n // Store the wallet address - use the current one or the last known one for the modal\n // This ensures the modal stays functional even during temporary wallet disconnects\n const effectiveWalletAddress = walletState.address || lastKnownAddressRef.current || '';\n\n return (\n <>\n {/* Only show bridge button if wallet is connected */}\n {walletState.isConnected && (\n <BridgeButton\n address={walletState.address!}\n targetChainName=\"Bridge & Swap\"\n onOpenModal={() => setIsModalOpen(true)}\n styles={styles}\n />\n )}\n {/* Modal persists even during temporary wallet disconnects */}\n {isModalOpen && effectiveWalletAddress && (\n <BridgeModal\n targetChainName=\"Bridge & Swap\"\n balances={balances}\n chains={chains}\n walletAddress={effectiveWalletAddress}\n onClose={() => setIsModalOpen(false)}\n onBridge={handleBridge}\n onBridgeWithProgress={handleBridgeWithProgress}\n styles={styles}\n />\n )}\n </>\n );\n};\n","import { CSSProperties } from 'react';\n\nexport interface BridgeWidgetStyles {\n container?: CSSProperties;\n connectButton?: CSSProperties;\n bridgeButton?: CSSProperties;\n walletInfo?: CSSProperties;\n modal?: {\n overlay?: CSSProperties;\n content?: CSSProperties;\n header?: CSSProperties;\n closeButton?: CSSProperties;\n body?: CSSProperties;\n };\n balanceItem?: CSSProperties;\n chainInfo?: CSSProperties;\n bridgeFromButton?: CSSProperties;\n infoBox?: CSSProperties;\n}\n\nexport const defaultStyles: Required<BridgeWidgetStyles> = {\n container: {\n background: 'white',\n borderRadius: '20px',\n padding: '30px',\n boxShadow: '0 20px 60px rgba(0, 0, 0, 0.3)',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, sans-serif',\n },\n connectButton: {\n width: '100%',\n padding: '16px 24px',\n fontSize: '1.1rem',\n fontWeight: 600,\n border: 'none',\n borderRadius: '12px',\n cursor: 'pointer',\n background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n color: 'white',\n transition: 'all 0.3s ease',\n },\n bridgeButton: {\n width: '100%',\n padding: '16px 24px',\n fontSize: '1.1rem',\n fontWeight: 600,\n border: 'none',\n borderRadius: '12px',\n cursor: 'pointer',\n background: 'linear-gradient(135deg, #f093fb 0%, #f5576c 100%)',\n color: 'white',\n transition: 'all 0.3s ease',\n },\n walletInfo: {\n background: '#f7f7f7',\n padding: '12px 20px',\n borderRadius: '12px',\n fontSize: '0.9rem',\n marginBottom: '20px',\n textAlign: 'center',\n },\n modal: {\n overlay: {\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n background: 'rgba(0, 0, 0, 0.7)',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n zIndex: 10000,\n padding: '20px',\n },\n content: {\n background: 'white',\n borderRadius: '20px',\n maxWidth: '600px',\n width: '100%',\n maxHeight: '80vh',\n overflowY: 'auto',\n boxShadow: '0 20px 60px rgba(0, 0, 0, 0.5)',\n },\n header: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '25px 30px',\n borderBottom: '3px solid #e0e0e0',\n },\n closeButton: {\n background: 'none',\n border: 'none',\n fontSize: '1.5rem',\n cursor: 'pointer',\n color: '#666',\n padding: 0,\n width: '32px',\n height: '32px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '50%',\n transition: 'all 0.2s',\n },\n body: {\n padding: '30px',\n },\n },\n balanceItem: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '16px',\n background: '#f9f9f9',\n borderRadius: '12px',\n marginBottom: '12px',\n transition: 'all 0.2s',\n },\n chainInfo: {\n flex: 1,\n },\n bridgeFromButton: {\n padding: '10px 20px',\n background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n color: 'white',\n border: 'none',\n borderRadius: '8px',\n fontWeight: 600,\n cursor: 'pointer',\n transition: 'all 0.2s',\n },\n infoBox: {\n background: '#fff3cd',\n borderLeft: '4px solid #ffc107',\n padding: '15px',\n marginBottom: '20px',\n borderRadius: '4px',\n fontSize: '0.9rem',\n color: '#856404',\n },\n};\n","import React from 'react';\nimport { defaultStyles, BridgeWidgetStyles } from '../styles/defaultStyles';\n\ninterface ConnectViewProps {\n targetChainName: string;\n onConnect: () => void;\n styles?: BridgeWidgetStyles;\n}\n\nexport const ConnectView: React.FC<ConnectViewProps> = ({\n targetChainName,\n onConnect,\n styles = {},\n}) => {\n const mergedStyles = {\n container: { ...defaultStyles.container, ...styles.container },\n infoBox: { ...defaultStyles.infoBox, ...styles.infoBox },\n connectButton: { ...defaultStyles.connectButton, ...styles.connectButton },\n };\n\n return (\n <div style={mergedStyles.container}>\n <div style={mergedStyles.infoBox}>\n <strong style={{ display: 'block', marginBottom: '8px', fontSize: '1rem' }}>\n 👋 Welcome to HyprEVM Bridge\n </strong>\n <p style={{ margin: 0 }}>\n Connect your wallet to start bridging USDC to {targetChainName}\n </p>\n </div>\n <button\n style={mergedStyles.connectButton}\n onClick={onConnect}\n onMouseEnter={(e) => {\n e.currentTarget.style.transform = 'translateY(-2px)';\n e.currentTarget.style.boxShadow = '0 8px 20px rgba(102, 126, 234, 0.4)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'translateY(0)';\n e.currentTarget.style.boxShadow = 'none';\n }}\n >\n Connect Wallet\n </button>\n </div>\n );\n};\n","import React from 'react';\nimport { defaultStyles, BridgeWidgetStyles } from '../styles/defaultStyles';\n\ninterface BridgeButtonProps {\n address: string;\n targetChainName: string;\n onOpenModal: () => void;\n styles?: BridgeWidgetStyles;\n}\n\nexport const BridgeButton: React.FC<BridgeButtonProps> = ({\n address,\n targetChainName,\n onOpenModal,\n styles = {},\n}) => {\n const shortAddress = `${address.slice(0, 6)}...${address.slice(-4)}`;\n\n const mergedStyles = {\n container: { ...defaultStyles.container, ...styles.container },\n walletInfo: { ...defaultStyles.walletInfo, ...styles.walletInfo },\n bridgeButton: { ...defaultStyles.bridgeButton, ...styles.bridgeButton },\n };\n\n return (\n <div style={mergedStyles.container}>\n <div style={mergedStyles.walletInfo}>\n Connected:{' '}\n <span\n style={{\n color: '#667eea',\n fontWeight: 600,\n fontFamily: 'monospace',\n }}\n >\n {shortAddress}\n </span>\n </div>\n <button\n style={mergedStyles.bridgeButton}\n onClick={onOpenModal}\n onMouseEnter={(e) => {\n e.currentTarget.style.transform = 'translateY(-2px)';\n e.currentTarget.style.boxShadow = '0 8px 20px rgba(245, 87, 108, 0.4)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'translateY(0)';\n e.currentTarget.style.boxShadow = 'none';\n }}\n >\n 🌉 Bridge to {targetChainName}\n </button>\n </div>\n );\n};\n","import React, { useState, useEffect, useRef } from 'react';\nimport { TokenSearchService, type SearchableToken } from '../tokenSearch';\nimport { LiFiBridgeService } from '../bridge';\nimport { WalletManager } from '../wallet';\nimport type { ChainInfo } from '../../types/index';\n\n// Minimum balance threshold to consider as \"non-zero\" (to filter out dust)\nconst MIN_BALANCE_THRESHOLD = 0.000001;\n\ninterface TokenWithBalance extends SearchableToken {\n balance?: string;\n balanceUSD?: number;\n}\n\n// Hyperliquid brand colors - must match BridgeModal\nconst COLORS = {\n aquamarine: '#97FCE4',\n firefly: '#0F3933',\n ebony: '#04060C',\n foam: '#F5FEFD',\n};\n\ninterface ChainTokenSelectorProps {\n chains: ChainInfo[];\n onSelect: (chain: ChainInfo, token: SearchableToken) => void;\n onClose: () => void;\n initialChainId?: number; // Pre-select a chain when opening\n walletAddress?: string; // User's wallet address for balance fetching\n styles?: {\n modal?: React.CSSProperties;\n overlay?: React.CSSProperties;\n };\n}\n\nexport const ChainTokenSelector: React.FC<ChainTokenSelectorProps> = ({\n chains,\n onSelect,\n onClose,\n initialChainId,\n walletAddress,\n styles = {},\n}) => {\n const [chainSearch, setChainSearch] = useState('');\n const [tokenSearch, setTokenSearch] = useState('');\n const [selectedChain, setSelectedChain] = useState<ChainInfo | null>(null);\n const [tokens, setTokens] = useState<TokenWithBalance[]>([]);\n const [loadingTokens, setLoadingTokens] = useState(false);\n const [loadingBalances, setLoadingBalances] = useState(false);\n const [hoveredChain, setHoveredChain] = useState<number | null>(null);\n const [hoveredToken, setHoveredToken] = useState<string | null>(null);\n const searchService = useRef(new TokenSearchService());\n const bridgeService = useRef(new LiFiBridgeService());\n const walletManager = useRef(new WalletManager());\n\n // Initialize with the provided chain if available\n useEffect(() => {\n if (initialChainId && chains.length > 0 && !selectedChain) {\n const initialChain = chains.find(c => c.id === initialChainId);\n if (initialChain) {\n setSelectedChain(initialChain);\n }\n }\n }, [initialChainId, chains]);\n\n // Load tokens when chain is selected\n useEffect(() => {\n if (selectedChain) {\n loadTokens();\n }\n }, [selectedChain, tokenSearch]);\n\n const loadTokens = async () => {\n if (!selectedChain) return;\n \n setLoadingTokens(true);\n setLoadingBalances(false);\n try {\n let baseTokens: SearchableToken[];\n \n if (tokenSearch.trim()) {\n // When searching, search ALL tokens (not just popular ones)\n baseTokens = await searchService.current.searchTokens(selectedChain.id, tokenSearch);\n } else {\n // By default, show only popular/whitelisted tokens (top 200 by market cap)\n baseTokens = await searchService.current.getPopularTokensForChain(selectedChain.id);\n }\n \n // Set tokens immediately so user sees something\n setTokens(baseTokens);\n setLoadingTokens(false);\n \n // If we have a wallet address, fetch balances in the background\n if (walletAddress && baseTokens.length > 0) {\n setLoadingBalances(true);\n await fetchAndSortByBalances(baseTokens, selectedChain);\n setLoadingBalances(false);\n }\n } catch (error) {\n console.error('Failed to load tokens:', error);\n setTokens([]);\n setLoadingTokens(false);\n setLoadingBalances(false);\n }\n };\n \n const fetchAndSortByBalances = async (baseTokens: SearchableToken[], chain: ChainInfo) => {\n if (!walletAddress) return;\n \n try {\n // Fetch balances and prices in parallel for better performance\n // Limit to first 50 tokens to avoid too many requests\n const tokensToCheck = baseTokens.slice(0, 50);\n \n const balancePromises = tokensToCheck.map(async (token): Promise<TokenWithBalance> => {\n try {\n const tokenInfo = {\n address: token.address,\n symbol: token.symbol,\n decimals: token.decimals,\n chainId: token.chainId,\n name: token.name,\n logoURI: token.logoURI,\n };\n \n const balance = await walletManager.current.getTokenBalance(\n walletAddress,\n tokenInfo,\n chain.name\n );\n \n const balanceNum = parseFloat(balance.formattedBalance);\n \n // Get token price for USD value calculation\n let balanceUSD = 0;\n if (balanceNum > MIN_BALANCE_THRESHOLD) {\n const price = await bridgeService.current.getTokenPrice(chain.id, token.address);\n if (price) {\n balanceUSD = balanceNum * price;\n }\n }\n \n return {\n ...token,\n balance: balance.formattedBalance,\n balanceUSD,\n };\n } catch (error) {\n // If balance fetch fails, return token without balance\n return { ...token };\n }\n });\n \n const tokensWithBalances = await Promise.all(balancePromises);\n \n // Add remaining tokens (beyond first 50) without balance info\n const remainingTokens: TokenWithBalance[] = baseTokens.slice(50).map(t => ({ ...t }));\n \n // Sort: tokens with significant balances first (by USD value), then the rest\n const withBalance = tokensWithBalances.filter(\n t => t.balanceUSD && t.balanceUSD > 0.01 // Only show if worth more than $0.01\n ).sort((a, b) => (b.balanceUSD || 0) - (a.balanceUSD || 0));\n \n const withoutBalance = [\n ...tokensWithBalances.filter(t => !t.balanceUSD || t.balanceUSD <= 0.01),\n ...remainingTokens,\n ];\n \n setTokens([...withBalance, ...withoutBalance]);\n } catch (error) {\n console.error('Failed to fetch balances:', error);\n // Keep original tokens if balance fetch fails\n }\n };\n \n // Calculate summary for tokens with balances\n const getBalanceSummary = () => {\n const tokensWithBalance = tokens.filter(t => t.balanceUSD && t.balanceUSD > 0.01);\n if (tokensWithBalance.length === 0) return null;\n \n const totalUSD = tokensWithBalance.reduce((sum, t) => sum + (t.balanceUSD || 0), 0);\n return {\n count: tokensWithBalance.length,\n totalUSD,\n };\n };\n\n const handleSelectToken = (token: SearchableToken) => {\n if (selectedChain) {\n onSelect(selectedChain, token);\n }\n };\n\n // Filter chains based on search\n const filteredChains = chainSearch.trim()\n ? chains.filter(chain =>\n chain.name.toLowerCase().includes(chainSearch.toLowerCase())\n )\n : chains; // Show all chains when no search\n\n const defaultStyles = {\n // Opaque overlay to completely hide BridgeModal content behind\n overlay: {\n position: 'fixed' as const,\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(4, 6, 12, 0.95)', // Same as BridgeModal overlay\n backdropFilter: 'blur(10px)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 1001, // Above BridgeModal content\n ...styles.overlay,\n },\n // Match BridgeModal dimensions and styling exactly\n modal: {\n background: `linear-gradient(180deg, ${COLORS.ebony} 0%, ${COLORS.firefly}40 100%)`,\n borderRadius: '24px',\n padding: '0',\n maxWidth: '480px', // Same as BridgeModal\n width: '100%',\n height: 'auto',\n maxHeight: '85vh', // Match BridgeModal height\n minHeight: '500px', // Ensure consistent minimum height\n display: 'flex',\n flexDirection: 'column' as const,\n boxShadow: `0 0 60px ${COLORS.aquamarine}20, 0 25px 50px rgba(0,0,0,0.5)`,\n border: `3px solid ${COLORS.aquamarine}30`,\n overflow: 'hidden',\n ...styles.modal,\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n padding: '24px 28px 20px',\n borderBottom: `3px solid ${COLORS.aquamarine}15`,\n gap: '16px',\n },\n backButton: {\n width: '36px',\n height: '36px',\n borderRadius: '50%',\n border: `3px solid ${COLORS.aquamarine}30`,\n background: 'transparent',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n fontSize: '18px',\n color: COLORS.foam,\n transition: 'all 0.2s',\n },\n title: {\n flex: 1,\n fontSize: '1.4rem',\n fontWeight: '600',\n color: COLORS.foam,\n margin: 0,\n letterSpacing: '-0.02em',\n },\n searchContainer: {\n display: 'flex',\n gap: '0',\n padding: '20px 0',\n },\n chainSearchWrapper: {\n width: '40%',\n padding: '0 16px 0 28px',\n boxSizing: 'border-box' as const,\n },\n tokenSearchWrapper: {\n width: '60%',\n padding: '0 28px 0 16px',\n boxSizing: 'border-box' as const,\n },\n searchInput: {\n width: '100%',\n boxSizing: 'border-box' as const,\n padding: '14px 20px 14px 48px',\n border: `3px solid ${COLORS.aquamarine}30`,\n borderRadius: '16px',\n fontSize: '15px',\n outline: 'none',\n transition: 'border-color 0.2s, box-shadow 0.2s',\n background: `${COLORS.ebony}80`,\n color: COLORS.foam,\n backgroundImage: `url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%2397FCE4' stroke-width='2'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.35-4.35'/%3E%3C/svg%3E\")`,\n backgroundRepeat: 'no-repeat',\n backgroundPosition: '16px center',\n },\n content: {\n display: 'flex',\n gap: '0', // No gap, use border instead\n flex: 1,\n overflow: 'hidden',\n padding: '0 0 28px 0',\n },\n chainColumn: {\n width: '40%',\n flexShrink: 0,\n display: 'flex',\n flexDirection: 'column' as const,\n overflow: 'hidden',\n padding: '0 16px 0 28px',\n borderRight: `3px solid ${COLORS.aquamarine}20`,\n },\n tokenColumn: {\n width: '60%',\n flexShrink: 0,\n display: 'flex',\n flexDirection: 'column' as const,\n overflow: 'hidden',\n padding: '0 28px 0 16px',\n },\n sectionHeader: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '12px 16px',\n background: `${COLORS.firefly}80`,\n borderRadius: '12px',\n marginBottom: '12px',\n fontSize: '13px',\n fontWeight: '600',\n color: COLORS.aquamarine,\n border: `3px solid ${COLORS.aquamarine}20`,\n },\n list: {\n flex: 1,\n overflowY: 'auto' as const,\n display: 'flex',\n flexDirection: 'column' as const,\n gap: '4px',\n },\n chainItem: {\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '10px 14px',\n borderRadius: '12px',\n cursor: 'pointer',\n transition: 'all 0.2s',\n border: '3px solid transparent',\n },\n chainLogo: {\n width: '36px',\n height: '36px',\n borderRadius: '50%',\n flexShrink: 0,\n objectFit: 'cover' as const,\n },\n chainLogoFallback: {\n width: '36px',\n height: '36px',\n borderRadius: '50%',\n background: `linear-gradient(135deg, ${COLORS.aquamarine}30 0%, ${COLORS.firefly} 100%)`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: COLORS.aquamarine,\n fontWeight: 'bold',\n fontSize: '14px',\n flexShrink: 0,\n border: `3px solid ${COLORS.aquamarine}30`,\n },\n chainName: {\n fontSize: '15px',\n fontWeight: '500',\n color: COLORS.foam,\n },\n tokenItem: {\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '10px 14px',\n borderRadius: '12px',\n cursor: 'pointer',\n transition: 'all 0.2s',\n border: '3px solid transparent',\n },\n tokenLogoContainer: {\n position: 'relative' as const,\n width: '36px',\n height: '36px',\n flexShrink: 0,\n },\n tokenLogo: {\n width: '36px',\n height: '36px',\n borderRadius: '50%',\n objectFit: 'cover' as const,\n border: `3px solid ${COLORS.aquamarine}30`,\n },\n tokenLogoFallback: {\n width: '36px',\n height: '36px',\n borderRadius: '50%',\n background: `linear-gradient(135deg, ${COLORS.aquamarine}30 0%, ${COLORS.firefly} 100%)`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: COLORS.aquamarine,\n fontWeight: 'bold',\n fontSize: '12px',\n border: `3px solid ${COLORS.aquamarine}30`,\n },\n chainBadge: {\n position: 'absolute' as const,\n bottom: '-2px',\n right: '-4px',\n width: '16px',\n height: '16px',\n borderRadius: '50%',\n background: COLORS.ebony,\n border: `3px solid ${COLORS.firefly}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n },\n chainBadgeFallback: {\n position: 'absolute' as const,\n bottom: '-2px',\n right: '-4px',\n width: '16px',\n height: '16px',\n borderRadius: '50%',\n background: `linear-gradient(135deg, ${COLORS.aquamarine}30 0%, ${COLORS.firefly} 100%)`,\n border: `3px solid ${COLORS.firefly}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: COLORS.aquamarine,\n fontSize: '7px',\n fontWeight: 'bold',\n },\n tokenInfo: {\n flex: 1,\n },\n tokenSymbol: {\n fontSize: '15px',\n fontWeight: '600',\n color: COLORS.foam,\n marginBottom: '2px',\n },\n tokenName: {\n fontSize: '12px',\n color: `${COLORS.aquamarine}80`,\n },\n emptyState: {\n textAlign: 'center' as const,\n padding: '40px 20px',\n color: `${COLORS.aquamarine}60`,\n fontSize: '14px',\n },\n };\n\n return (\n <div style={defaultStyles.overlay} onClick={onClose}>\n <div style={defaultStyles.modal} onClick={(e) => e.stopPropagation()}>\n {/* Header */}\n <div style={defaultStyles.header}>\n <button\n style={defaultStyles.backButton}\n onClick={onClose}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = `${COLORS.aquamarine}20`;\n e.currentTarget.style.borderColor = COLORS.aquamarine;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n e.currentTarget.style.borderColor = `${COLORS.aquamarine}30`;\n }}\n >\n ←\n </button>\n <h2 style={defaultStyles.title}>Select <span style={{ color: COLORS.aquamarine }}>Token</span></h2>\n </div>\n\n {/* Search Inputs - 40/60 split */}\n <div style={defaultStyles.searchContainer}>\n <div style={defaultStyles.chainSearchWrapper}>\n <input\n type=\"text\"\n placeholder=\"Chain...\"\n value={chainSearch}\n onChange={(e) => setChainSearch(e.target.value)}\n style={{\n ...defaultStyles.searchInput,\n borderColor: chainSearch ? COLORS.aquamarine : `${COLORS.aquamarine}30`,\n boxShadow: chainSearch ? `0 0 10px ${COLORS.aquamarine}20` : 'none',\n }}\n />\n </div>\n <div style={defaultStyles.tokenSearchWrapper}>\n <input\n type=\"text\"\n placeholder=\"Token...\"\n value={tokenSearch}\n onChange={(e) => setTokenSearch(e.target.value)}\n style={{\n ...defaultStyles.searchInput,\n borderColor: tokenSearch || selectedChain ? COLORS.aquamarine : `${COLORS.aquamarine}30`,\n boxShadow: tokenSearch || selectedChain ? `0 0 10px ${COLORS.aquamarine}20` : 'none',\n }}\n />\n </div>\n </div>\n\n {/* Two Column Layout */}\n <div style={defaultStyles.content}>\n {/* Left Column - Chains (40%) */}\n <div style={defaultStyles.chainColumn}>\n <div style={defaultStyles.sectionHeader}>\n <span>🔗</span>\n {chainSearch ? 'Search Results' : 'All Chains'}\n </div>\n <div style={defaultStyles.list}>\n {filteredChains.map((chain) => (\n <div\n key={chain.id}\n style={{\n ...defaultStyles.chainItem,\n background: selectedChain?.id === chain.id \n ? `${COLORS.aquamarine}15` \n : hoveredChain === chain.id \n ? `${COLORS.firefly}80` \n : 'transparent',\n borderColor: selectedChain?.id === chain.id ? COLORS.aquamarine : 'transparent',\n }}\n onClick={() => setSelectedChain(chain)}\n onMouseEnter={() => setHoveredChain(chain.id)}\n onMouseLeave={() => setHoveredChain(null)}\n >\n {chain.logoURI ? (\n <img\n src={chain.logoURI}\n alt={chain.name}\n style={defaultStyles.chainLogo}\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = 'none';\n }}\n />\n ) : (\n <div style={defaultStyles.chainLogoFallback}>\n {chain.name[0]}\n </div>\n )}\n <div style={defaultStyles.chainName}>{chain.name}</div>\n </div>\n ))}\n </div>\n </div>\n\n {/* Right Column - Tokens (60%) */}\n <div style={defaultStyles.tokenColumn}>\n <div style={{\n ...defaultStyles.sectionHeader,\n justifyContent: 'space-between',\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <span>🪙</span>\n {tokenSearch ? 'Search Results' : 'Popular tokens'}\n {loadingBalances}\n </div>\n </div>\n <div style={defaultStyles.list}>\n {!selectedChain ? (\n <div style={defaultStyles.emptyState}>\n Select a chain to view tokens\n </div>\n ) : loadingTokens ? (\n <div style={defaultStyles.emptyState}>\n Loading tokens...\n </div>\n ) : tokens.length === 0 ? (\n <div style={defaultStyles.emptyState}>\n No tokens found\n </div>\n ) : (\n tokens.map((token) => (\n <div\n key={token.address}\n style={{\n ...defaultStyles.tokenItem,\n background: hoveredToken === token.address ? `${COLORS.aquamarine}15` : 'transparent',\n borderColor: hoveredToken === token.address ? COLORS.aquamarine : 'transparent',\n }}\n onClick={() => handleSelectToken(token)}\n onMouseEnter={() => setHoveredToken(token.address)}\n onMouseLeave={() => setHoveredToken(null)}\n >\n <div style={defaultStyles.tokenLogoContainer}>\n {token.logoURI ? (\n <img\n src={token.logoURI}\n alt={token.symbol}\n style={defaultStyles.tokenLogo}\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = 'none';\n }}\n />\n ) : (\n <div style={defaultStyles.tokenLogoFallback}>\n {token.symbol[0]}\n </div>\n )}\n {/* Chain badge */}\n {selectedChain?.logoURI ? (\n <img\n src={selectedChain.logoURI}\n alt={selectedChain.name}\n style={defaultStyles.chainBadge}\n />\n ) : selectedChain ? (\n <div style={defaultStyles.chainBadgeFallback}>\n {selectedChain.name[0]}\n </div>\n ) : null}\n </div>\n <div style={defaultStyles.tokenInfo}>\n <div style={defaultStyles.tokenSymbol}>{token.symbol}</div>\n <div style={defaultStyles.tokenName}>{token.name}</div>\n </div>\n {/* Balance display on the right */}\n {token.balanceUSD && token.balanceUSD > 0.01 && (\n <div style={{\n textAlign: 'right',\n marginLeft: 'auto',\n }}>\n <div style={{\n fontSize: '14px',\n fontWeight: '600',\n color: COLORS.foam,\n }}>\n {token.balance}\n </div>\n <div style={{\n fontSize: '12px',\n color: COLORS.aquamarine,\n }}>\n ${token.balanceUSD.toFixed(2)}\n </div>\n </div>\n )}\n </div>\n ))\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport { BridgeWidgetStyles } from '../styles/defaultStyles';\nimport type { ChainBalance, ChainInfo } from '../../types/index';\nimport { ChainTokenSelector } from './ChainTokenSelector';\nimport type { SearchableToken } from '../tokenSearch';\nimport { LiFiBridgeService, type DetailedBridgeProgress, type StepInfo } from '../bridge';\nimport { DepositModal } from './DepositModal';\n\n// Quote data for display\ninterface QuoteData {\n receiveAmount: string;\n receiveAmountFormatted: string;\n estimatedTime: number; // in minutes (0 if < 60 seconds)\n estimatedSeconds: number; // raw seconds value\n fromAmountUSD: number | null; // USD value of source amount\n toAmountUSD: number | null; // USD value of destination amount\n costUSD: number | null; // Cost in USD (fees + slippage)\n isLoading: boolean;\n error: string | null;\n}\n\n// Hyperliquid Brand Colors\nconst COLORS = {\n aquamarine: '#97FCE4',\n firefly: '#0F3933',\n ebony: '#04060C',\n foam: '#F5FEFD',\n};\n\n// Transaction Status Page Component\ninterface TransactionStatusPageProps {\n progress: DetailedBridgeProgress;\n onClose: () => void;\n onBack: () => void;\n}\n\n// Helper function to translate SDK error messages into user-friendly messages\nconst getUserFriendlyErrorMessage = (errorMessage: string): string => {\n const lowerMessage = errorMessage.toLowerCase();\n \n // User rejected/denied signature - check this FIRST before other transaction errors\n if (lowerMessage.includes('user rejected') || lowerMessage.includes('user denied') || \n lowerMessage.includes('denied transaction signature') || lowerMessage.includes('userrejectedrequesterror')) {\n return 'Signature denied. You cancelled the transaction in your wallet.';\n }\n \n // Bundle/batching errors (MetaMask smart transactions)\n if (lowerMessage.includes('bundle') || lowerMessage.includes('unknownbundleid') || lowerMessage.includes('no matching bundle')) {\n return 'Transaction tracking failed. This can happen with MetaMask Smart Transactions. Try disabling \"Smart Transactions\" in MetaMask settings (Settings → Advanced → Smart Transactions) and try again.';\n }\n \n // Transaction failed errors (often insufficient gas for the operation)\n if (lowerMessage.includes('transactionerror') || lowerMessage.includes('transaction failed')) {\n return 'Not enough tokens left for gas to execute the operation. Try decreasing the initial amount.';\n }\n \n // Slippage errors\n if (lowerMessage.includes('slippage') || lowerMessage.includes('price impact')) {\n return 'Price moved too much during the transaction. Try increasing slippage tolerance in settings or wait for less volatile market conditions.';\n }\n \n // fromAmount validation error - this happens when using MAX balance and not leaving enough for gas\n // The SDK expects exact amount from quote, but balance changed (gas was needed)\n if (lowerMessage.includes('fromamount') && lowerMessage.includes('must be equal to constant')) {\n return 'Not enough tokens left for gas to execute the operation. Try decreasing the initial amount.';\n }\n \n // Other validation errors with fromAmount (amount mismatch)\n if (lowerMessage.includes('fromamount') || lowerMessage.includes('must be equal to constant')) {\n return 'Not enough tokens left for gas to execute the operation. Try decreasing the initial amount.';\n }\n \n // Validation errors (400 status) - generic fallback\n if (lowerMessage.includes('status code 400') || lowerMessage.includes('validationerror')) {\n return 'Not enough tokens left for gas to execute the operation. Try decreasing the initial amount.';\n }\n \n // Insufficient funds\n if (lowerMessage.includes('insufficient') || lowerMessage.includes('not enough')) {\n return 'Insufficient funds to complete this transaction. Make sure you have enough tokens and gas fees.';\n }\n \n // Other user cancellations\n if (lowerMessage.includes('cancelled') || lowerMessage.includes('canceled')) {\n return 'Transaction was cancelled. You can try again when ready.';\n }\n \n // Gas estimation failed\n if (lowerMessage.includes('gas') || lowerMessage.includes('estimation')) {\n return 'Failed to estimate gas for this transaction. The route may not be available right now. Try a different amount or token pair.';\n }\n \n // Network errors\n if (lowerMessage.includes('network') || lowerMessage.includes('rpc') || lowerMessage.includes('timeout')) {\n return 'Network connection issue. Please check your internet connection and try again.';\n }\n \n // Allowance/approval errors\n if (lowerMessage.includes('allowance') || lowerMessage.includes('approval')) {\n return 'Token approval failed. Please try approving the token again.';\n }\n \n // Default: clean up the SDK error message\n // Remove SDK version info and technical prefixes\n let cleanMessage = errorMessage\n .replace(/\\[.*?\\]/g, '') // Remove [ErrorType] prefixes\n .replace(/LI\\.FI SDK version:.*$/i, '') // Remove SDK version\n .replace(/SDKError:/gi, '')\n .replace(/Version:.*$/gim, '') // Remove viem version info\n .replace(/Details:.*$/gim, '') // Remove details line\n .replace(/Caused by:.*$/gim, '') // Remove caused by lines\n .trim();\n \n if (cleanMessage.length < 10) {\n return 'An unexpected error occurred. Please try again or contact support if the issue persists.';\n }\n \n return cleanMessage;\n};\n\nconst TransactionStatusPage: React.FC<TransactionStatusPageProps> = ({ progress, onClose, onBack }) => {\n const isCompleted = progress.overallStatus === 'completed';\n const isFailed = progress.overallStatus === 'failed';\n \n // Get user-friendly error message if failed\n const displayMessage = isFailed \n ? getUserFriendlyErrorMessage(progress.message)\n : progress.message;\n\n return (\n <div style={{\n padding: '24px 28px 28px',\n minHeight: '400px',\n display: 'flex',\n flexDirection: 'column',\n background: `linear-gradient(180deg, ${COLORS.ebony} 0%, ${COLORS.firefly}40 100%)`,\n position: 'relative',\n zIndex: 2,\n }}>\n {/* Header */}\n <div style={{\n textAlign: 'center',\n marginBottom: '32px',\n }}>\n <h3 style={{\n margin: '0 0 8px',\n color: COLORS.foam,\n fontSize: '20px',\n fontWeight: '600',\n }}>\n {isCompleted ? '🎉 Transaction Complete!' : isFailed ? '❌ Transaction Failed' : '⏳ Processing Transaction'}\n </h3>\n <p style={{\n margin: 0,\n color: isFailed ? '#ef4444' + 'cc' : COLORS.aquamarine + '80',\n fontSize: '14px',\n lineHeight: '1.5',\n maxWidth: '400px',\n marginLeft: 'auto',\n marginRight: 'auto',\n }}>\n {displayMessage}\n </p>\n </div>\n\n {/* Steps Progress - Group consecutive same-tool steps */}\n <div style={{\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n gap: '20px',\n }}>\n {(() => {\n // Filter out feeCollection steps\n const filteredSteps = progress.steps.filter(step => step.tool !== 'feeCollection');\n \n // Group consecutive steps with the same tool\n const groupedSteps: { tool: string; toolName: string; toolLogo: string; steps: typeof filteredSteps }[] = [];\n \n filteredSteps.forEach((step) => {\n const lastGroup = groupedSteps[groupedSteps.length - 1];\n if (lastGroup && lastGroup.tool === step.tool) {\n // Add to existing group\n lastGroup.steps.push(step);\n } else {\n // Create new group\n groupedSteps.push({\n tool: step.tool,\n toolName: step.toolName,\n toolLogo: step.toolLogo,\n steps: [step],\n });\n }\n });\n \n return groupedSteps.map((group, index) => (\n <GroupedStepProgressBar key={`${group.tool}-${index}`} group={group} index={index} />\n ));\n })()}\n </div>\n\n {/* Transaction Link */}\n {progress.txLink && (\n <a\n href={progress.txLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n marginTop: '24px',\n padding: '12px 20px',\n background: COLORS.aquamarine + '15',\n borderRadius: '12px',\n color: COLORS.aquamarine,\n textDecoration: 'none',\n fontSize: '14px',\n fontWeight: '500',\n border: `3px solid ${COLORS.aquamarine}30`,\n transition: 'all 0.2s',\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/>\n <polyline points=\"15,3 21,3 21,9\"/>\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/>\n </svg>\n View on Explorer\n </a>\n )}\n\n {/* Action Buttons */}\n {(isCompleted || isFailed) && (\n <button\n onClick={onBack}\n style={{\n marginTop: '16px',\n padding: '16px',\n background: isCompleted \n ? `linear-gradient(135deg, ${COLORS.aquamarine} 0%, #7EECD3 100%)`\n : `linear-gradient(135deg, #ef4444 0%, #dc2626 100%)`,\n border: 'none',\n borderRadius: '14px',\n color: isCompleted ? COLORS.ebony : '#fff',\n fontSize: '16px',\n fontWeight: '600',\n cursor: 'pointer',\n transition: 'all 0.2s',\n }}\n >\n {isCompleted ? 'Done' : 'Try Again'}\n </button>\n )}\n </div>\n );\n};\n\n// Grouped Step Progress Bar Component - handles multiple consecutive steps with same tool\ninterface GroupedStep {\n tool: string;\n toolName: string;\n toolLogo: string;\n steps: StepInfo[];\n}\n\nconst GroupedStepProgressBar: React.FC<{ group: GroupedStep; index: number }> = ({ group, index }) => {\n // Calculate aggregate status from all steps in the group\n const getGroupStatus = (): StepInfo['status'] => {\n // If any step failed, group is failed\n if (group.steps.some(s => s.status === 'failed')) return 'failed';\n // If all steps are done, group is done\n if (group.steps.every(s => s.status === 'done')) return 'done';\n // If any step is pending, group is pending\n if (group.steps.some(s => s.status === 'pending')) return 'pending';\n // If any step requires action, group requires action\n if (group.steps.some(s => s.status === 'action_required')) return 'action_required';\n // Otherwise waiting\n return 'waiting';\n };\n\n // Calculate aggregate progress from all steps\n const getGroupProgress = (): number => {\n const totalSteps = group.steps.length;\n const completedSteps = group.steps.filter(s => s.status === 'done').length;\n const pendingSteps = group.steps.filter(s => s.status === 'pending').length;\n const actionRequiredSteps = group.steps.filter(s => s.status === 'action_required').length;\n \n // Each completed step contributes 100/totalSteps to progress\n // Pending steps contribute 50/totalSteps (halfway)\n // Action required steps contribute 25/totalSteps (just started)\n const progress = (completedSteps * 100 + pendingSteps * 50 + actionRequiredSteps * 25) / totalSteps;\n return Math.min(100, Math.round(progress));\n };\n\n const status = getGroupStatus();\n const progress = getGroupProgress();\n\n const getStatusColor = () => {\n switch (status) {\n case 'done': return '#4ade80';\n case 'failed': return '#ef4444';\n case 'pending': return COLORS.aquamarine;\n case 'action_required': return '#fbbf24';\n default: return COLORS.aquamarine + '40';\n }\n };\n\n return (\n <div style={{\n background: `linear-gradient(135deg, ${COLORS.firefly}80 0%, ${COLORS.ebony}90 100%)`,\n borderRadius: '16px',\n padding: '20px',\n border: `3px solid ${COLORS.aquamarine}20`,\n }}>\n {/* Tool Name & Status */}\n <div style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: '16px',\n }}>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '10px',\n }}>\n <span style={{\n width: '24px',\n height: '24px',\n borderRadius: '50%',\n background: COLORS.aquamarine + '20',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '12px',\n fontWeight: '600',\n color: COLORS.aquamarine,\n }}>\n {index + 1}\n </span>\n <span style={{ color: COLORS.foam, fontSize: '15px', fontWeight: '500' }}>\n {group.toolName}\n </span>\n\n </div>\n </div>\n\n {/* Progress Bar Container - removed overflow:hidden so logo is visible */}\n <div style={{\n position: 'relative',\n height: '8px',\n background: COLORS.ebony,\n borderRadius: '4px',\n }}>\n {/* Progress Fill */}\n <div style={{\n position: 'absolute',\n left: 0,\n top: 0,\n height: '100%',\n width: `${progress}%`,\n background: status === 'failed' \n ? 'linear-gradient(90deg, #ef4444 0%, #dc2626 100%)'\n : `linear-gradient(90deg, ${COLORS.aquamarine}60 0%, ${COLORS.aquamarine} 100%)`,\n borderRadius: '4px',\n transition: 'width 0.5s ease-out',\n boxShadow: progress > 0 ? `0 0 10px ${getStatusColor()}40` : 'none',\n overflow: 'hidden',\n }}>\n {/* Animated shimmer effect */}\n {status === 'pending' && (\n <div style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n background: 'linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.3) 50%, transparent 100%)',\n animation: 'shimmer 1.5s infinite',\n }} />\n )}\n </div>\n\n {/* Tool Logo in the middle - positioned above the bar */}\n <div style={{\n position: 'absolute',\n left: '50%',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n width: '45px',\n height: '46px',\n borderRadius: '50%',\n background: COLORS.ebony,\n border: `8px solid ${\n status === 'failed' ? '#ef4444' : \n status === 'done' ? '#4ade80' : \n '#fbbf24'\n }`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 10,\n transition: 'border-color 0.3s',\n boxShadow: status === 'done' ? `0 0 12px #4ade8040` : \n status === 'failed' ? `0 0 12px #ef444440` : \n `0 0 12px #fbbf2440`,\n }}>\n {group.toolLogo ? (\n <img \n src={group.toolLogo} \n alt={group.toolName}\n style={{ \n width: '40px', \n height: '40px', \n borderRadius: '50%',\n }}\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = 'none';\n }}\n />\n ) : (\n <span style={{ fontSize: '14px', color: COLORS.aquamarine }}>\n {group.toolName.charAt(0)}\n </span>\n )}\n </div>\n </div>\n\n {/* Progress Markers */}\n <div style={{\n display: 'flex',\n justifyContent: 'space-between',\n marginTop: '20px',\n fontSize: '11px',\n color: COLORS.aquamarine + '60',\n }}>\n <span style={{ color: progress >= 0 ? getStatusColor() : undefined }}>Start</span>\n <span style={{ color: progress >= 50 ? getStatusColor() : undefined, marginLeft: '24px' }}>Confirmed</span>\n <span style={{ color: progress >= 100 ? getStatusColor() : undefined }}>Complete</span>\n </div>\n\n {/* Shimmer animation keyframes */}\n <style>{`\n @keyframes shimmer {\n 0% { transform: translateX(-100%); }\n 100% { transform: translateX(100%); }\n }\n `}</style>\n </div>\n );\n};\n\nexport interface BridgeParams {\n fromChainId: number;\n toChainId: number;\n fromToken: SearchableToken;\n toToken: SearchableToken;\n amount: string;\n}\n\ninterface BridgeModalProps {\n targetChainName: string;\n balances: ChainBalance[];\n chains: ChainInfo[];\n walletAddress: string; // Required for fetching quotes\n onClose: () => void;\n onBridge: (params: BridgeParams) => void;\n onBridgeWithProgress?: (params: BridgeParams, onProgress: (progress: DetailedBridgeProgress) => void) => Promise<void>;\n onError?: (error: string) => void; // Optional error callback\n styles?: BridgeWidgetStyles;\n}\n\n// Animated Orbs Component - Two large galaxy-like orbs\nconst FloatingOrbs: React.FC = () => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n let width = canvas.offsetWidth;\n let height = canvas.offsetHeight;\n\n // Set canvas size with device pixel ratio for crisp rendering\n const resizeCanvas = () => {\n const dpr = window.devicePixelRatio || 1;\n width = canvas.offsetWidth;\n height = canvas.offsetHeight;\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n ctx.scale(dpr, dpr);\n };\n resizeCanvas();\n\n // Two galaxy orbs with smooth orbital motion\n const orbs = [\n {\n x: width * 0.3,\n y: height * 0.4,\n radius: 120,\n baseX: width * 0.35,\n baseY: height * 0.45,\n orbitRadius: 80,\n angle: 0,\n speed: 0.003,\n color: COLORS.aquamarine,\n opacity: 0.25,\n },\n {\n x: width * 0.7,\n y: height * 0.6,\n radius: 150,\n baseX: width * 0.65,\n baseY: height * 0.55,\n orbitRadius: 100,\n angle: Math.PI,\n speed: 0.002,\n color: COLORS.aquamarine,\n opacity: 0.2,\n },\n ];\n\n // Animation loop\n let animationId: number;\n const animate = () => {\n ctx.clearRect(0, 0, width, height);\n\n // Update orb positions with smooth orbital motion\n orbs.forEach(orb => {\n orb.angle += orb.speed;\n orb.x = orb.baseX + Math.cos(orb.angle) * orb.orbitRadius;\n orb.y = orb.baseY + Math.sin(orb.angle * 0.7) * orb.orbitRadius * 0.6;\n });\n\n // Check for collision and create interaction effect\n const dx = orbs[0].x - orbs[1].x;\n const dy = orbs[0].y - orbs[1].y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const minDist = orbs[0].radius + orbs[1].radius;\n const isColliding = dist < minDist * 0.8;\n\n // Draw orbs with soft glow\n orbs.forEach(orb => {\n // Outer glow\n const outerGlow = ctx.createRadialGradient(\n orb.x, orb.y, orb.radius * 0.3,\n orb.x, orb.y, orb.radius * 1.5\n );\n outerGlow.addColorStop(0, orb.color + '15');\n outerGlow.addColorStop(0.5, orb.color + '08');\n outerGlow.addColorStop(1, orb.color + '00');\n\n ctx.beginPath();\n ctx.arc(orb.x, orb.y, orb.radius * 1.5, 0, Math.PI * 2);\n ctx.fillStyle = outerGlow;\n ctx.fill();\n\n // Main orb gradient\n const gradient = ctx.createRadialGradient(\n orb.x - orb.radius * 0.2, orb.y - orb.radius * 0.2, 0,\n orb.x, orb.y, orb.radius\n );\n const opacityHex = Math.floor(orb.opacity * 255).toString(16).padStart(2, '0');\n gradient.addColorStop(0, orb.color + opacityHex);\n gradient.addColorStop(0.6, orb.color + Math.floor(orb.opacity * 0.5 * 255).toString(16).padStart(2, '0'));\n gradient.addColorStop(1, orb.color + '00');\n\n ctx.beginPath();\n ctx.arc(orb.x, orb.y, orb.radius, 0, Math.PI * 2);\n ctx.fillStyle = gradient;\n ctx.fill();\n });\n\n // Draw collision glow when orbs are close\n if (isColliding) {\n const midX = (orbs[0].x + orbs[1].x) / 2;\n const midY = (orbs[0].y + orbs[1].y) / 2;\n const intensity = 1 - (dist / (minDist * 0.8));\n const glowRadius = 60 + intensity * 40;\n\n const collisionGlow = ctx.createRadialGradient(\n midX, midY, 0,\n midX, midY, glowRadius\n );\n const glowOpacity = Math.floor(intensity * 80).toString(16).padStart(2, '0');\n collisionGlow.addColorStop(0, COLORS.aquamarine + glowOpacity);\n collisionGlow.addColorStop(0.5, COLORS.aquamarine + Math.floor(intensity * 30).toString(16).padStart(2, '0'));\n collisionGlow.addColorStop(1, COLORS.aquamarine + '00');\n\n ctx.beginPath();\n ctx.arc(midX, midY, glowRadius, 0, Math.PI * 2);\n ctx.fillStyle = collisionGlow;\n ctx.fill();\n }\n\n animationId = requestAnimationFrame(animate);\n };\n\n animate();\n\n // Handle resize\n const handleResize = () => {\n resizeCanvas();\n // Update orb base positions on resize\n orbs[0].baseX = width * 0.35;\n orbs[0].baseY = height * 0.45;\n orbs[1].baseX = width * 0.65;\n orbs[1].baseY = height * 0.55;\n };\n window.addEventListener('resize', handleResize);\n\n return () => {\n cancelAnimationFrame(animationId);\n window.removeEventListener('resize', handleResize);\n };\n }, []);\n\n return (\n <canvas\n ref={canvasRef}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n zIndex: 0,\n }}\n />\n );\n};\n\nexport const BridgeModal: React.FC<BridgeModalProps> = ({\n targetChainName,\n balances,\n chains,\n walletAddress,\n onClose,\n onBridge,\n onBridgeWithProgress,\n onError,\n styles = {},\n}) => {\n // Tab state: 'bridge' or 'deposit'\n const [activeTab, setActiveTab] = useState<'bridge' | 'deposit'>('bridge');\n\n // Source (FROM)\n const [selectedChain, setSelectedChain] = useState<ChainBalance | null>(null);\n const [selectedToken, setSelectedToken] = useState<SearchableToken | null>(null);\n const [showChainTokenSelector, setShowChainTokenSelector] = useState(false);\n const [amount, setAmount] = useState('');\n const [tokenBalance, setTokenBalance] = useState<string>('0');\n const [isLoadingBalance, setIsLoadingBalance] = useState(false);\n \n // Destination (TO)\n const [destChain, setDestChain] = useState<ChainInfo | null>(null);\n const [destToken, setDestToken] = useState<SearchableToken | null>(null);\n const [showDestSelector, setShowDestSelector] = useState(false);\n const [selectorMode, setSelectorMode] = useState<'source' | 'destination'>('source');\n\n // Error notification\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n\n // Transaction status page\n const [showStatusPage, setShowStatusPage] = useState(false);\n const [transactionProgress, setTransactionProgress] = useState<DetailedBridgeProgress | null>(null);\n const [isTransactionActive, setIsTransactionActive] = useState(false);\n \n // Use a ref for immediate synchronous checking (React state updates are async)\n const isTransactionActiveRef = useRef(false);\n \n // Balance refresh trigger - increment to force fresh balance fetch\n const [balanceRefreshTrigger, setBalanceRefreshTrigger] = useState(0);\n \n // Safe close handler - only allows closing when no transaction is active\n // Uses ref for immediate check since React state updates are batched/async\n const handleSafeClose = () => {\n if (isTransactionActiveRef.current) {\n console.log('🚫 Cannot close modal: transaction in progress');\n return;\n }\n onClose();\n };\n\n // Quote state for live updates\n const [quote, setQuote] = useState<QuoteData>({\n receiveAmount: '0',\n receiveAmountFormatted: '0.00',\n estimatedTime: 0,\n estimatedSeconds: 0,\n fromAmountUSD: null,\n toAmountUSD: null,\n costUSD: null,\n isLoading: false,\n error: null,\n });\n \n // Bridge service for fetching quotes\n const bridgeService = useRef(new LiFiBridgeService());\n const quoteDebounceTimer = useRef<NodeJS.Timeout | null>(null);\n\n // Track if defaults have been initialized\n const defaultsInitialized = useRef(false);\n \n // Handle escape key - prevent closing during active transaction\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n // Use ref for synchronous check to prevent race conditions\n if (isTransactionActiveRef.current) {\n console.log('🚫 Cannot close modal with Escape: transaction in progress');\n e.preventDefault();\n e.stopPropagation();\n } else {\n onClose();\n }\n }\n };\n \n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [onClose]); // Remove isTransactionActive from deps since we use ref\n\n // Set defaults ONCE: Source = USDC on Ethereum, Dest = USDC on HyperEVM\n useEffect(() => {\n // Only initialize once when chains are available\n if (defaultsInitialized.current || chains.length === 0) {\n return;\n }\n\n const initializeDefaults = () => {\n // SOURCE: Find Ethereum chain (chain ID 1)\n const ethereumChain = chains.find(c => c.id === 1 || (c.name.toLowerCase() === 'ethereum' && c.chainType === 'EVM'));\n if (ethereumChain) {\n const ethereumBalance = balances.find(b => b.chainId === ethereumChain.id);\n \n const usdcToken: SearchableToken = {\n symbol: 'USDC',\n name: 'USD Coin',\n address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n chainId: ethereumChain.id,\n decimals: 6,\n logoURI: 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png',\n };\n\n if (ethereumBalance) {\n setSelectedChain(ethereumBalance);\n } else {\n setSelectedChain({\n chainId: ethereumChain.id,\n chainName: ethereumChain.name,\n balance: '0',\n formattedBalance: '0',\n symbol: 'USDC',\n tokenAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n chain: ethereumChain,\n });\n }\n \n setSelectedToken(usdcToken);\n }\n\n // DESTINATION: Find HyperEVM chain (or Hyperliquid)\n const hyperevmChain = chains.find(c => \n c.name.toLowerCase().includes('hyperevm') || \n c.name.toLowerCase().includes('hyper evm') ||\n c.name.toLowerCase().includes('hyperliquid') ||\n c.id === 999 // HyperEVM chain ID\n );\n if (hyperevmChain) {\n setDestChain(hyperevmChain);\n \n // Set USDC as default destination token\n const usdcToken: SearchableToken = {\n symbol: 'USDC',\n name: 'USD Coin',\n address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', // Placeholder, will be chain-specific\n chainId: hyperevmChain.id,\n decimals: 6,\n logoURI: 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png',\n };\n \n setDestToken(usdcToken);\n }\n\n defaultsInitialized.current = true;\n };\n\n initializeDefaults();\n }, [chains]); // Only depend on chains, not balances - balances change shouldn't reset selections\n\n // Fetch balance when token or chain changes, or when refresh is triggered\n useEffect(() => {\n const fetchTokenBalance = async () => {\n if (!selectedToken || !selectedChain?.chain) return;\n\n setIsLoadingBalance(true);\n try {\n // If balanceRefreshTrigger > 0, always fetch fresh from wallet\n // This ensures we get updated balance after a transaction\n const shouldFetchFresh = balanceRefreshTrigger > 0;\n \n if (!shouldFetchFresh) {\n // Check if we have this balance in the balances array (for pre-loaded tokens)\n const existingBalance = balances.find(\n b => b.chainId === selectedChain.chainId && \n b.tokenAddress?.toLowerCase() === selectedToken.address?.toLowerCase()\n );\n\n if (existingBalance) {\n setTokenBalance(existingBalance.formattedBalance);\n setIsLoadingBalance(false);\n return;\n }\n }\n \n // Fetch balance directly from wallet\n const { WalletManager } = await import('../wallet');\n const walletManager = new WalletManager();\n \n const tokenInfo = {\n address: selectedToken.address,\n symbol: selectedToken.symbol,\n decimals: selectedToken.decimals,\n chainId: selectedToken.chainId,\n name: selectedToken.name,\n logoURI: selectedToken.logoURI,\n };\n \n const balance = await walletManager.getTokenBalance(\n walletAddress,\n tokenInfo,\n selectedChain.chain.name\n );\n \n console.log(`💰 Fetched fresh balance for ${selectedToken.symbol}: ${balance.formattedBalance}`);\n setTokenBalance(balance.formattedBalance);\n } catch (error) {\n console.error('Failed to fetch token balance:', error);\n setTokenBalance('0');\n } finally {\n setIsLoadingBalance(false);\n }\n };\n\n fetchTokenBalance();\n }, [selectedToken, selectedChain, balances, walletAddress, balanceRefreshTrigger]);\n\n // Fetch quote when amount, source, or destination changes (debounced)\n useEffect(() => {\n // Clear any existing timer\n if (quoteDebounceTimer.current) {\n clearTimeout(quoteDebounceTimer.current);\n }\n\n // Reset quote if missing required data\n if (!selectedChain || !selectedToken || !destChain || !destToken || !amount || parseFloat(amount) <= 0) {\n setQuote({\n receiveAmount: '0',\n receiveAmountFormatted: '0.00',\n estimatedTime: 0,\n estimatedSeconds: 0,\n fromAmountUSD: null,\n toAmountUSD: null,\n costUSD: null,\n isLoading: false,\n error: null,\n });\n return;\n }\n\n // Set loading state immediately\n setQuote(prev => ({ ...prev, isLoading: true, error: null }));\n\n // Debounce the quote fetch (500ms delay)\n quoteDebounceTimer.current = setTimeout(async () => {\n try {\n // Convert amount to smallest unit using string manipulation to avoid floating point errors\n const [intPart, decPart = ''] = amount.split('.');\n const paddedDecimal = decPart.padEnd(selectedToken.decimals, '0').slice(0, selectedToken.decimals);\n const amountInSmallestUnit = (intPart + paddedDecimal).replace(/^0+/, '') || '0';\n \n // Fetch quote and token prices in parallel\n const [quoteResult, fromTokenPrice, toTokenPrice] = await Promise.all([\n bridgeService.current.getBridgeRouteWithTokens(\n selectedChain.chainId,\n destChain.id,\n selectedToken.address,\n destToken.address,\n amountInSmallestUnit,\n walletAddress\n ),\n bridgeService.current.getTokenPrice(selectedChain.chainId, selectedToken.address),\n bridgeService.current.getTokenPrice(destChain.id, destToken.address),\n ]);\n\n console.log('📊 QUOTE RESPONSE:', {\n route: {\n fromChain: selectedChain.chainName,\n toChain: destChain.name,\n fromToken: selectedToken.symbol,\n toToken: destToken.symbol,\n fromAmount: amount,\n },\n estimate: {\n toAmount: quoteResult.estimate.toAmount,\n toAmountHumanReadable: parseInt(quoteResult.estimate.toAmount) / Math.pow(10, destToken.decimals),\n executionDuration: quoteResult.estimate.executionDuration,\n executionDurationMinutes: Math.ceil(quoteResult.estimate.executionDuration / 60),\n gasCosts: quoteResult.estimate.gasCosts,\n feeCosts: quoteResult.estimate.feeCosts,\n },\n prices: {\n fromTokenPrice,\n toTokenPrice,\n },\n fullQuoteObject: quoteResult,\n });\n\n const receiveAmountRaw = parseInt(quoteResult.estimate.toAmount) / Math.pow(10, destToken.decimals);\n // Handle ETA: 0 = immediate, < 60 = show seconds, >= 60 = show minutes\n const estimatedSeconds = quoteResult.estimate.executionDuration || 0;\n const estimatedMinutes = estimatedSeconds >= 60 ? Math.ceil(estimatedSeconds / 60) : 0;\n\n // Calculate USD values\n const fromAmountUSD = fromTokenPrice ? parseFloat(amount) * fromTokenPrice : null;\n const toAmountUSD = toTokenPrice ? receiveAmountRaw * toTokenPrice : null;\n // Positive = gain (receiving more), Negative = loss (receiving less)\n const costUSD = fromAmountUSD && toAmountUSD ? toAmountUSD - fromAmountUSD : null;\n\n console.log('💰 USD CALCULATIONS:', {\n fromAmountUSD: fromAmountUSD?.toFixed(2),\n toAmountUSD: toAmountUSD?.toFixed(2),\n costUSD: costUSD?.toFixed(2),\n interpretation: costUSD && costUSD > 0 ? 'GAIN' : costUSD && costUSD < 0 ? 'LOSS' : 'NEUTRAL',\n estimatedSeconds,\n estimatedMinutes,\n note: estimatedSeconds < 60 ? 'ETA less than 1 minute' : null,\n });\n\n setQuote({\n receiveAmount: quoteResult.estimate.toAmount,\n receiveAmountFormatted: receiveAmountRaw.toFixed(destToken.decimals > 6 ? 6 : destToken.decimals),\n estimatedTime: estimatedMinutes,\n estimatedSeconds,\n fromAmountUSD,\n toAmountUSD,\n costUSD,\n isLoading: false,\n error: null,\n });\n } catch (error) {\n console.error('Failed to fetch quote:', error);\n setQuote({\n receiveAmount: '0',\n receiveAmountFormatted: '0.00',\n estimatedTime: 0,\n estimatedSeconds: 0,\n fromAmountUSD: null,\n toAmountUSD: null,\n costUSD: null,\n isLoading: false,\n error: 'Failed to get quote',\n });\n }\n }, 500);\n\n // Cleanup on unmount or dependency change\n return () => {\n if (quoteDebounceTimer.current) {\n clearTimeout(quoteDebounceTimer.current);\n }\n };\n }, [amount, selectedChain, selectedToken, destChain, destToken, walletAddress]);\n\n return (\n <div\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n background: 'rgba(4, 6, 12, 0.95)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 1000,\n backdropFilter: 'blur(10px)',\n }}\n onClick={(e) => {\n if (e.target === e.currentTarget) handleSafeClose();\n }}\n >\n {/* Modal Container */}\n <div\n style={{\n position: 'relative',\n width: '100%',\n maxWidth: '480px',\n background: `linear-gradient(180deg, ${COLORS.ebony} 0%, ${COLORS.firefly}40 100%)`,\n borderRadius: '24px',\n border: `3px solid ${COLORS.aquamarine}30`,\n overflow: 'hidden',\n boxShadow: `0 0 60px ${COLORS.aquamarine}20, 0 25px 50px rgba(0,0,0,0.5)`,\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Animated Background Orbs */}\n <FloatingOrbs />\n\n {/* Content Layer */}\n <div style={{ position: 'relative', zIndex: 1 }}>\n {/* Header with Tabs */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '20px 28px 0',\n }}>\n {/* Tab Buttons */}\n <div style={{\n display: 'flex',\n gap: '4px',\n background: COLORS.firefly + '80',\n padding: '4px',\n borderRadius: '12px',\n border: `2px solid ${COLORS.aquamarine}20`,\n }}>\n <button\n onClick={() => setActiveTab('bridge')}\n style={{\n padding: '10px 16px',\n fontSize: '13px',\n fontWeight: '600',\n border: 'none',\n borderRadius: '8px',\n cursor: 'pointer',\n background: activeTab === 'bridge' \n ? `linear-gradient(135deg, ${COLORS.aquamarine} 0%, ${COLORS.aquamarine}80 100%)`\n : 'transparent',\n color: activeTab === 'bridge' ? COLORS.ebony : COLORS.foam + '80',\n transition: 'all 0.2s ease',\n whiteSpace: 'nowrap',\n }}\n >\n Bridge & Swap\n </button>\n <button\n onClick={() => setActiveTab('deposit')}\n style={{\n padding: '10px 16px',\n fontSize: '13px',\n fontWeight: '600',\n border: 'none',\n borderRadius: '8px',\n cursor: 'pointer',\n background: activeTab === 'deposit' \n ? `linear-gradient(135deg, ${COLORS.aquamarine} 0%, ${COLORS.aquamarine}80 100%)`\n : 'transparent',\n color: activeTab === 'deposit' ? COLORS.ebony : COLORS.foam + '80',\n transition: 'all 0.2s ease',\n whiteSpace: 'nowrap',\n }}\n >\n 💰 Deposit\n </button>\n </div>\n\n {/* Close Button */}\n <button\n onClick={handleSafeClose}\n style={{\n width: '36px',\n height: '36px',\n borderRadius: '50%',\n border: `3px solid ${COLORS.aquamarine}30`,\n background: 'transparent',\n color: COLORS.foam,\n fontSize: '18px',\n cursor: isTransactionActive ? 'not-allowed' : 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s',\n opacity: isTransactionActive ? 0.5 : 1,\n }}\n onMouseEnter={(e) => {\n if (!isTransactionActive) {\n e.currentTarget.style.background = COLORS.aquamarine + '20';\n e.currentTarget.style.borderColor = COLORS.aquamarine;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n e.currentTarget.style.borderColor = COLORS.aquamarine + '30';\n }}\n >\n ✕\n </button>\n </div>\n \n {/* Tab divider */}\n <div style={{\n height: '3px',\n background: `linear-gradient(90deg, transparent 0%, ${COLORS.aquamarine}30 50%, transparent 100%)`,\n margin: '16px 28px 0',\n }} />\n\n {/* Floating Error Toast - Above Modal */}\n {errorMessage && (\n <div style={{\n position: 'fixed',\n top: '20px',\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: 10000,\n maxWidth: '420px',\n width: 'calc(100% - 40px)',\n padding: '16px 20px',\n background: 'linear-gradient(135deg, rgba(220, 38, 38, 0.95) 0%, rgba(185, 28, 28, 0.95) 100%)',\n backdropFilter: 'blur(12px)',\n borderRadius: '16px',\n border: '3px solid rgba(255, 255, 255, 0.2)',\n boxShadow: '0 10px 40px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(220, 38, 38, 0.3)',\n display: 'flex',\n alignItems: 'center',\n gap: '14px',\n animation: 'slideInFromTop 0.4s cubic-bezier(0.16, 1, 0.3, 1)',\n }}>\n <style>{`\n @keyframes slideInFromTop {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(-20px);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n }\n `}</style>\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" strokeWidth=\"2.5\" style={{ flexShrink: 0 }}>\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/>\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/>\n </svg>\n <div style={{ flex: 1, color: '#fff' }}>\n <div style={{ fontSize: '15px', fontWeight: '700', marginBottom: '4px', letterSpacing: '-0.01em' }}>\n Transaction Error\n </div>\n <div style={{ fontSize: '13px', opacity: 0.95, lineHeight: '1.4' }}>\n {errorMessage}\n </div>\n </div>\n <button\n onClick={() => setErrorMessage(null)}\n style={{\n background: 'rgba(255, 255, 255, 0.15)',\n border: 'none',\n color: '#fff',\n cursor: 'pointer',\n padding: '8px',\n borderRadius: '8px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'background 0.2s',\n }}\n onMouseEnter={(e) => e.currentTarget.style.background = 'rgba(255, 255, 255, 0.25)'}\n onMouseLeave={(e) => e.currentTarget.style.background = 'rgba(255, 255, 255, 0.15)'}\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n )}\n\n {/* Body - Show Deposit tab or Bridge tab content */}\n {activeTab === 'deposit' ? (\n <DepositModal\n chains={chains}\n walletAddress={walletAddress}\n onClose={onClose}\n embedded={true}\n />\n ) : showStatusPage && transactionProgress ? (\n <TransactionStatusPage\n progress={transactionProgress}\n onClose={onClose}\n onBack={() => {\n // If transaction was successful, trigger balance refresh\n if (transactionProgress.overallStatus === 'completed') {\n setBalanceRefreshTrigger(prev => prev + 1);\n // Also clear the amount since it was used\n setAmount('');\n }\n // Always reset transaction active state when going back\n // This ensures the bridge button works after failed transactions\n isTransactionActiveRef.current = false;\n setIsTransactionActive(false);\n setShowStatusPage(false);\n setTransactionProgress(null);\n }}\n />\n ) : (\n <div style={{ padding: '24px 28px 28px' }}>\n {/* Source Token Input Card */}\n <div style={{\n background: `linear-gradient(135deg, ${COLORS.firefly}80 0%, ${COLORS.ebony}90 100%)`,\n borderRadius: '20px',\n padding: '20px',\n border: `3px solid ${COLORS.aquamarine}20`,\n marginBottom: '20px',\n }}>\n <div style={{ fontSize: '12px', color: COLORS.aquamarine + '80', marginBottom: '12px', fontWeight: '600' }}>\n FROM\n </div>\n \n {/* Token Selector Button */}\n <button\n onClick={() => setShowChainTokenSelector(true)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '10px 16px 10px 10px',\n background: `linear-gradient(135deg, ${COLORS.aquamarine}20 0%, ${COLORS.firefly} 100%)`,\n border: `3px solid ${COLORS.aquamarine}40`,\n borderRadius: '50px',\n cursor: 'pointer',\n marginBottom: '12px',\n transition: 'all 0.3s ease',\n width: '100%',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.borderColor = COLORS.aquamarine;\n e.currentTarget.style.boxShadow = `0 0 20px ${COLORS.aquamarine}30`;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = COLORS.aquamarine + '40';\n e.currentTarget.style.boxShadow = 'none';\n }}\n >\n {/* Token Logo with Chain Badge */}\n <div style={{ position: 'relative', width: '38px', height: '38px' }}>\n {selectedToken?.logoURI ? (\n <img\n src={selectedToken.logoURI}\n alt={selectedToken.symbol}\n style={{\n width: '38px',\n height: '38px',\n borderRadius: '50%',\n border: `3px solid ${COLORS.aquamarine}50`,\n }}\n />\n ) : (\n <div style={{\n width: '38px',\n height: '38px',\n borderRadius: '50%',\n background: `linear-gradient(135deg, ${COLORS.aquamarine}30 0%, ${COLORS.firefly} 100%)`,\n border: `3px solid ${COLORS.aquamarine}50`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: COLORS.aquamarine,\n fontSize: '16px',\n fontWeight: 'bold',\n }}>\n {selectedToken?.symbol?.[0] || '?'}\n </div>\n )}\n \n {/* Chain Badge */}\n <div style={{\n position: 'absolute',\n bottom: '-2px',\n right: '-4px',\n width: '18px',\n height: '18px',\n borderRadius: '50%',\n background: COLORS.ebony,\n border: `3px solid ${COLORS.firefly}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n }}>\n {selectedChain?.chain?.logoURI ? (\n <img\n src={selectedChain.chain.logoURI}\n alt={selectedChain.chainName}\n style={{ width: '14px', height: '14px', borderRadius: '50%' }}\n />\n ) : (\n <span style={{ fontSize: '8px', fontWeight: 'bold', color: COLORS.aquamarine }}>\n {selectedChain?.chainName?.[0] || '?'}\n </span>\n )}\n </div>\n </div>\n\n <span style={{\n color: COLORS.foam,\n fontSize: '17px',\n fontWeight: '600',\n }}>\n {selectedToken?.symbol || 'Select Token'}\n </span>\n\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" style={{ marginLeft: 'auto' }}>\n <path d=\"M3 4.5L6 7.5L9 4.5\" stroke={COLORS.aquamarine} strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n\n {/* Amount Input */}\n <input\n type=\"number\"\n placeholder=\"0.00\"\n value={amount}\n onChange={(e) => setAmount(e.target.value)}\n style={{\n width: '100%',\n padding: '8px 0',\n fontSize: '42px',\n fontWeight: '300',\n border: 'none',\n background: 'transparent',\n color: COLORS.foam,\n outline: 'none',\n fontFamily: 'inherit',\n letterSpacing: '-0.02em',\n MozAppearance: 'textfield', // Firefox\n }}\n onWheel={(e) => e.currentTarget.blur()} // Prevent scroll wheel changes\n />\n <style>{`\n input[type=\"number\"]::-webkit-inner-spin-button,\n input[type=\"number\"]::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n `}</style>\n\n {/* USD Value & Balance */}\n <div style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginTop: '8px',\n }}>\n <span style={{ color: COLORS.aquamarine + '80', fontSize: '14px' }}>\n ≈ ${quote.fromAmountUSD !== null ? quote.fromAmountUSD.toFixed(2) : \n (selectedToken?.priceUSD ? (parseFloat(amount || '0') * parseFloat(selectedToken.priceUSD)).toFixed(2) : '0.00')}\n </span>\n <button\n onClick={() => setAmount(tokenBalance)}\n style={{\n background: 'none',\n border: 'none',\n color: COLORS.aquamarine,\n fontSize: '14px',\n cursor: 'pointer',\n padding: '4px 8px',\n borderRadius: '8px',\n transition: 'background 0.2s',\n }}\n onMouseEnter={(e) => e.currentTarget.style.background = COLORS.aquamarine + '20'}\n onMouseLeave={(e) => e.currentTarget.style.background = 'none'}\n >\n Balance: {isLoadingBalance ? '...' : tokenBalance} <span style={{ opacity: 0.7 }}>MAX</span>\n </button>\n </div>\n </div>\n\n {/* Swap Arrow - Click to swap source and destination */}\n <div style={{\n display: 'flex',\n justifyContent: 'center',\n margin: '16px 0',\n }}>\n <button\n onClick={(e) => {\n // Only swap if both source and destination are selected\n if (selectedToken && destToken && selectedChain && destChain) {\n // Rotate the button on click\n const btn = e.currentTarget;\n const currentRotation = btn.dataset.rotation === '180' ? 0 : 180;\n btn.dataset.rotation = currentRotation.toString();\n btn.style.transform = `rotate(${currentRotation}deg)`;\n \n // Store current values\n const prevSourceChain = selectedChain;\n const prevSourceToken = selectedToken;\n const prevDestChain = destChain;\n const prevDestToken = destToken;\n \n // Swap source with destination\n // Set new source (previous destination)\n setSelectedChain({\n chainId: prevDestChain.id,\n chainName: prevDestChain.name,\n balance: '0',\n formattedBalance: '0',\n symbol: prevDestToken.symbol,\n tokenAddress: prevDestToken.address,\n chain: prevDestChain,\n });\n setSelectedToken(prevDestToken);\n \n // Set new destination (previous source)\n setDestChain(prevSourceChain.chain || chains.find(c => c.id === prevSourceChain.chainId) || null);\n setDestToken(prevSourceToken);\n \n // Clear amount and trigger balance refresh for new source token\n setAmount('');\n setBalanceRefreshTrigger(prev => prev + 1);\n \n console.log(`🔄 Swapped: ${prevSourceToken.symbol} on ${prevSourceChain.chainName} ↔ ${prevDestToken.symbol} on ${prevDestChain.name}`);\n }\n }}\n disabled={!selectedToken || !destToken}\n data-rotation=\"0\"\n style={{\n width: '40px',\n height: '40px',\n borderRadius: '50%',\n background: COLORS.firefly,\n border: `3px solid ${COLORS.aquamarine}30`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: COLORS.aquamarine,\n fontSize: '18px',\n cursor: selectedToken && destToken ? 'pointer' : 'not-allowed',\n transition: 'all 0.4s cubic-bezier(0.4, 0, 0.2, 1)',\n opacity: selectedToken && destToken ? 1 : 0.5,\n }}\n onMouseEnter={(e) => {\n if (selectedToken && destToken) {\n e.currentTarget.style.background = COLORS.aquamarine + '30';\n e.currentTarget.style.borderColor = COLORS.aquamarine;\n e.currentTarget.style.boxShadow = `0 0 15px ${COLORS.aquamarine}40`;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = COLORS.firefly;\n e.currentTarget.style.borderColor = COLORS.aquamarine + '30';\n e.currentTarget.style.boxShadow = 'none';\n }}\n title=\"Swap source and destination\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M7 16V4M7 4L3 8M7 4L11 8\"/>\n <path d=\"M17 8V20M17 20L21 16M17 20L13 16\"/>\n </svg>\n </button>\n </div>\n\n {/* Destination Token Card */}\n <div style={{\n background: `linear-gradient(135deg, ${COLORS.firefly}80 0%, ${COLORS.ebony}90 100%)`,\n borderRadius: '20px',\n padding: '20px',\n border: `3px solid ${COLORS.aquamarine}20`,\n marginBottom: '20px',\n }}>\n <div style={{ fontSize: '12px', color: COLORS.aquamarine + '80', marginBottom: '12px', fontWeight: '600' }}>\n TO\n </div>\n \n {/* Destination Token Selector Button */}\n <button\n onClick={() => {\n setSelectorMode('destination');\n setShowDestSelector(true);\n }}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '10px 16px 10px 10px',\n background: `linear-gradient(135deg, ${COLORS.aquamarine}20 0%, ${COLORS.firefly} 100%)`,\n border: `3px solid ${COLORS.aquamarine}40`,\n borderRadius: '50px',\n cursor: 'pointer',\n transition: 'all 0.3s ease',\n width: '100%',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.borderColor = COLORS.aquamarine;\n e.currentTarget.style.boxShadow = `0 0 20px ${COLORS.aquamarine}30`;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = COLORS.aquamarine + '40';\n e.currentTarget.style.boxShadow = 'none';\n }}\n >\n {/* Token Logo with Chain Badge */}\n <div style={{ position: 'relative', width: '38px', height: '38px' }}>\n {destToken?.logoURI ? (\n <img\n src={destToken.logoURI}\n alt={destToken.symbol}\n style={{\n width: '38px',\n height: '38px',\n borderRadius: '50%',\n border: `3px solid ${COLORS.aquamarine}50`,\n }}\n />\n ) : (\n <div style={{\n width: '38px',\n height: '38px',\n borderRadius: '50%',\n background: `linear-gradient(135deg, ${COLORS.aquamarine}30 0%, ${COLORS.firefly} 100%)`,\n border: `3px solid ${COLORS.aquamarine}50`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: COLORS.aquamarine,\n fontSize: '16px',\n fontWeight: 'bold',\n }}>\n {destToken?.symbol?.[0] || '?'}\n </div>\n )}\n \n {/* Chain Badge */}\n <div style={{\n position: 'absolute',\n bottom: '-2px',\n right: '-4px',\n width: '18px',\n height: '18px',\n borderRadius: '50%',\n background: COLORS.ebony,\n border: `3px solid ${COLORS.firefly}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n }}>\n {destChain?.logoURI ? (\n <img\n src={destChain.logoURI}\n alt={destChain.name}\n style={{ width: '14px', height: '14px', borderRadius: '50%' }}\n />\n ) : (\n <span style={{ fontSize: '8px', fontWeight: 'bold', color: COLORS.aquamarine }}>\n {destChain?.name?.[0] || '?'}\n </span>\n )}\n </div>\n </div>\n\n <span style={{\n color: COLORS.foam,\n fontSize: '17px',\n fontWeight: '600',\n }}>\n {destToken?.symbol || 'Select Token'}\n </span>\n\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" style={{ marginLeft: 'auto' }}>\n <path d=\"M3 4.5L6 7.5L9 4.5\" stroke={COLORS.aquamarine} strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n\n {/* Estimated Receive Amount */}\n <div style={{\n marginTop: '16px',\n padding: '12px',\n background: COLORS.ebony + '40',\n borderRadius: '12px',\n border: `3px solid ${COLORS.aquamarine}15`,\n }}>\n <div style={{ fontSize: '12px', color: COLORS.aquamarine + '60', marginBottom: '4px' }}>\n You'll receive (estimated)\n </div>\n <div style={{ \n fontSize: '24px', \n color: quote.error ? '#ff6b6b' : COLORS.foam, \n fontWeight: '300',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n }}>\n {quote.isLoading ? (\n <span style={{ color: COLORS.aquamarine + '80' }}>Loading...</span>\n ) : quote.error ? (\n <span style={{ fontSize: '14px' }}>{quote.error}</span>\n ) : (\n <>~{quote.receiveAmountFormatted} {destToken?.symbol || ''}</>\n )}\n </div>\n \n {/* USD Value for destination */}\n {quote.toAmountUSD !== null && !quote.isLoading && !quote.error && (\n <div style={{ \n marginTop: '6px',\n fontSize: '14px',\n color: COLORS.aquamarine + '80',\n }}>\n ≈ ${quote.toAmountUSD.toFixed(2)}\n </div>\n )}\n \n {/* Estimated Time & Cost */}\n {!quote.isLoading && !quote.error && (quote.estimatedSeconds >= 0 || (quote.costUSD !== null && Math.abs(quote.costUSD) > 0.01)) && (\n <div style={{ \n marginTop: '8px',\n paddingTop: '8px',\n borderTop: `3px solid ${COLORS.aquamarine}10`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n fontSize: '13px',\n color: COLORS.aquamarine + '80',\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <polyline points=\"12,6 12,12 16,14\"/>\n </svg>\n <span>\n {quote.estimatedSeconds === 0 \n ? 'Immediate' \n : quote.estimatedSeconds < 60 \n ? `~${quote.estimatedSeconds}s` \n : `~${quote.estimatedTime} min`}\n </span>\n </div>\n {quote.costUSD !== null && Math.abs(quote.costUSD) > 0.01 && (\n <div style={{ \n display: 'flex', \n alignItems: 'center', \n gap: '4px',\n color: quote.costUSD > 0 ? '#4ade80' : '#ff6b6b', // Green for gain, red for loss\n marginLeft: 'auto',\n }}>\n <span>{quote.costUSD > 0 ? '+' : ''}${quote.costUSD.toFixed(2)}</span>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n\n {/* Bridge Button */}\n <button\n onClick={async () => {\n // Check if transaction is already in progress\n if (isTransactionActiveRef.current) {\n console.log('🚫 Bridge button clicked but transaction already active');\n return;\n }\n \n if (selectedChain && selectedToken && destChain && destToken && amount) {\n console.log('🌉 Bridge button clicked', { \n from: `${selectedToken.symbol} on ${selectedChain.chainName}`,\n to: `${destToken.symbol} on ${destChain.name}`,\n amount \n });\n \n // Validate balance\n const amountNum = parseFloat(amount);\n const balanceNum = parseFloat(tokenBalance);\n \n if (amountNum > balanceNum) {\n setErrorMessage(`Insufficient ${selectedToken.symbol} balance. You have ${tokenBalance} but trying to bridge ${amount}.`);\n setTimeout(() => setErrorMessage(null), 5000); // Auto-dismiss after 5s\n return;\n }\n \n // Clear any previous errors\n setErrorMessage(null);\n \n const params = {\n fromChainId: selectedChain.chainId,\n toChainId: destChain.id,\n fromToken: selectedToken,\n toToken: destToken,\n amount: amount,\n };\n \n // If detailed progress callback is provided, show status page\n if (onBridgeWithProgress) {\n // Set ref immediately (synchronous) to prevent race conditions\n isTransactionActiveRef.current = true;\n setShowStatusPage(true);\n setIsTransactionActive(true);\n console.log('🚀 Starting bridge execution...');\n try {\n await onBridgeWithProgress(params, (progress) => {\n setTransactionProgress(progress);\n // Allow closing once transaction is completed or failed\n if (progress.overallStatus === 'completed' || progress.overallStatus === 'failed') {\n console.log(`✅ Bridge ${progress.overallStatus}, resetting transaction state`);\n isTransactionActiveRef.current = false;\n setIsTransactionActive(false);\n }\n });\n } catch (error) {\n // Error is handled in the progress callback\n console.error('❌ Bridge execution error:', error);\n isTransactionActiveRef.current = false;\n setIsTransactionActive(false);\n }\n } else {\n // Fallback to simple bridge\n console.log('⚠️ No onBridgeWithProgress callback, using simple bridge');\n onBridge(params);\n }\n } else {\n console.log('⚠️ Bridge button clicked but missing required fields', {\n selectedChain: !!selectedChain,\n selectedToken: !!selectedToken,\n destChain: !!destChain,\n destToken: !!destToken,\n amount: !!amount\n });\n }\n }}\n disabled={!selectedChain || !selectedToken || !destChain || !destToken || !amount || parseFloat(amount) <= 0 || isTransactionActive}\n style={{\n width: '100%',\n padding: '18px',\n fontSize: '18px',\n fontWeight: '600',\n border: 'none',\n borderRadius: '16px',\n cursor: selectedChain && amount && parseFloat(amount) > 0 && !isTransactionActive ? 'pointer' : 'not-allowed',\n background: selectedChain && amount && parseFloat(amount) > 0 && !isTransactionActive\n ? `linear-gradient(135deg, ${COLORS.aquamarine} 0%, ${COLORS.firefly} 150%)`\n : COLORS.firefly + '60',\n color: selectedChain && amount && parseFloat(amount) > 0 && !isTransactionActive ? COLORS.ebony : COLORS.foam + '50',\n transition: 'all 0.3s ease',\n boxShadow: selectedChain && amount && parseFloat(amount) > 0 && !isTransactionActive\n ? `0 4px 20px ${COLORS.aquamarine}40`\n : 'none',\n opacity: isTransactionActive ? 0.6 : 1,\n }}\n onMouseEnter={(e) => {\n if (selectedChain && amount && parseFloat(amount) > 0 && !isTransactionActive) {\n e.currentTarget.style.transform = 'translateY(-2px)';\n e.currentTarget.style.boxShadow = `0 8px 30px ${COLORS.aquamarine}50`;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'translateY(0)';\n if (selectedChain && amount && parseFloat(amount) > 0 && !isTransactionActive) {\n e.currentTarget.style.boxShadow = `0 4px 20px ${COLORS.aquamarine}40`;\n }\n }}\n >\n {isTransactionActive ? 'Processing...' : !selectedChain ? 'Select Token' : !amount || parseFloat(amount) <= 0 ? 'Enter Amount' : 'Bridge'}\n </button>\n </div>\n )}\n </div>\n\n {/* Source Chain + Token Selector Modal */}\n {showChainTokenSelector && (\n <ChainTokenSelector\n chains={chains}\n initialChainId={selectedChain?.chainId || 1} // Default to Ethereum\n walletAddress={walletAddress}\n onSelect={(chain, token) => {\n const chainBalance = balances.find(b => b.chainId === chain.id);\n if (chainBalance) {\n setSelectedChain(chainBalance);\n } else {\n setSelectedChain({\n chainId: chain.id,\n chainName: chain.name,\n balance: '0',\n formattedBalance: '0',\n symbol: token.symbol,\n tokenAddress: token.address,\n chain: chain,\n });\n }\n setSelectedToken(token);\n setShowChainTokenSelector(false);\n }}\n onClose={() => setShowChainTokenSelector(false)}\n />\n )}\n\n {/* Destination Chain + Token Selector Modal */}\n {showDestSelector && (\n <ChainTokenSelector\n chains={chains}\n initialChainId={destChain?.id} // Use currently selected dest chain\n walletAddress={walletAddress}\n onSelect={(chain, token) => {\n setDestChain(chain);\n setDestToken(token);\n setShowDestSelector(false);\n }}\n onClose={() => setShowDestSelector(false)}\n />\n )}\n </div>\n </div>\n );\n};\n"]}
|