@turtleclub/earn-widget 0.0.6 → 0.1.0-beta.1

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/utils.ts","../src/store/widget-style-config.ts","../src/store/atoms.ts","../src/lib/css-variables.ts","../src/lib/widget-styles.constants.ts","../src/hooks/useWidgetStyles.ts","../src/components/widget/widget-root.tsx","../src/components/wallet-section/account-details.tsx","../src/components/wallet-section/chain-selector.tsx","../src/context/adapter-context.tsx","../src/components/wallet-section/wallet-section.tsx","../src/utils/format.ts","../src/store/earn-route-atom.ts","../src/hooks/useEarnDeals.ts","../src/hooks/useAutoSelectDeal.ts","../../utils/src/number.ts","../../utils/src/format.ts","../src/adapters/ui-molecule-adapters.tsx","../src/components/swap/swap-input-wrapper.tsx","../src/components/ui/opportunity.tsx","../src/components/ui/widget-container.tsx","../src/components/swap/earn.tsx","../src/hooks/useTransactionQueue.ts","../src/hooks/useEarnRoute.ts","../src/hooks/useEarnRouteConsolidated.ts","../src/hooks/useTokenDeposit.ts","../src/components/swap/simple-confirm-button.tsx","../src/components/swap/transaction-status.tsx","../src/components/swap/info-section.tsx","../src/components/swap/swap-details-wrapper.tsx","../src/components/swap/swap.tsx","../src/components/widget/widget-content.tsx","../src/components/deals.tsx","../src/components/ui/widget-logo.tsx","../src/hooks/useEarnRouteSync.ts","../src/hooks/useWidgetLogo.ts","../src/components/widget/earn-widget.tsx"],"names":["cn","inputs","clsx","defaultWidgetStyleConfig","widgetStyleConfigAtom","atom","showPanelAtom","transactionAtom","get","set","status","current","hash","generateCoreTokenCSS","styles","theme","isDark","coreTokens","DEFAULT_WIDGET_STYLES","DEFAULT_THEME","DEFAULT_FONT","DEFAULT_FONT_SECONDARY","useWidgetStyles","config","useAtomValue","fontPrimary","fontSecondary","widgetWidth","customWidth","padding","rounding","widgetStyles","coreTokenCSS","WidgetRoot","children","setWidgetConfig","useSetAtom","useEffect","jsx","shortenAddress","address","AccountDetails","userAddress","CHAINS","ChainSelector","selectedChainId","onChainChange","selectedChain","setSelectedChain","useState","chain","currentChain","handleChainChange","value","c","jsxs","Select","SelectTrigger","SelectContent","SelectItem","AdapterContext","createContext","DistributorIdContext","AdapterProvider","adapter","distributorId","useAdapter","useContext","useDistributorId","useWalletConnection","useTransactionMethods","useNetworkMethods","WalletSection","walletConnected","chainId","error","parseUnits","decimals","integer","fraction","paddedFraction","combinedValue","defaultEarnRouteParams","earnRouteParamsAtom","earnRouteOptionsAtom","params","amountInWei","depositValueAtom","amount","selectedDealAtom","selectedDeal","selectedTokenAtom","selectedToken","slippage","resetTriggerAtom","resetTrigger","KATANA_CAMPAIGN","useEarnDeals","data","isLoading","useEarnDealsOriginal","deal","useAutoSelectDeal","setDealSelected","dealSelected","deals","toNumber","def","val","min","vals","smallest","removeZeros","str","parts","start","depth","newDecimals","magnitudeMap","numberScale","num","magnitude","formatNumber","doScale","zeros","suffix","new_value","result","formatToken","token","amountBigInt","stringAmount","formatUnits","widgetTokenToUIToken","widgetTokensToUITokens","tokens","dealToOpportunityItem","formatTVL","tvl","formatUSDValue","SwapInputWrapper","balances","useEarnWalletBalances","setSelectedToken","useAtom","setAmount","firstBalance","firstDefault","defaultTokens","handleMaxClick","balance","maxAmount","formattedAmount","formattedBalance","availableTokens","uiTokens","amountNumber","balanceNumber","hasInsufficientBalance","usdValue","SwapInput","tokenAddress","tokenBalance","b","defaultToken","t","Opportunity","tokenName","iconToken","yieldPercentage","iconDeal","id","showPanelOnClick","onAnimatedClose","className","setShowPanel","handleClick","opportunityItemProps","OpportunityItem","WidgetContainer","variant","props","configPadding","configRounding","finalPadding","finalRounded","Card","Earn","OpportunitySkeleton","useTransactionQueue","earnRoute","sendTransaction","onError","onSuccess","state","setState","memoizedEarnRoute","useMemo","stepsKey","step","newSteps","index","stateRef","useRef","callbacksRef","executeCurrentTransaction","useCallback","currentState","currentUserAddress","currentSendTransaction","currentOnError","currentOnSuccess","currentStep","prev","txHash","finalTxHash","updatedSteps","waitError","nextIndex","isLastStep","allCompleted","errorMessage","isUserRejection","resetQueue","canExecute","previousStepIndex","previousStepCompleted","currentStepNotStarted","hasNextStep","timer","useEarnRoute","options","enabled","useEarnRouteOriginal","useEarnRouteConsolidated","routeOptions","useTokenDeposit","fetchedRoute","routeError","isLoadingRoute","SimpleConfirmButton","openConnectionModal","isExecuting","hasError","cancelled","totalSteps","completedSteps","showingTransactionStatus","handleConfirm","Button","TransactionStatusSection","steps","estimatedTime","tokenSymbol","setResetTrigger","setDepositValue","lastCompletedStep","currentStepWithHash","displayTxHash","txStatusProps","TxStatus","InfoSection","opportunityDetailsProps","OpportunityDetailsV1","SwapDetailsWrapper","amountToDeposit","symbol","tokenPrice","networkFee","networkFeeInUsd","showFree","defaultOpen","swapDetailsProps","SwapDetails","Swap","depositValue","showSwapDetails","WidgetContent","Deals","setShowDeals","dealsFormatted","handleClose","handleSelectDeal","ArrowLeft","X","opportunityProps","sizeClasses","WidgetLogo","light","dark","fallback","size","imageError","setImageError","logoUrl","useEarnRouteSync","setEarnRouteParams","useWidgetLogo","tabButtons","EarnWidgetInner","tab","setTab","showPanel","NavigationBar","button","NavigationItem","EarnWidget"],"mappings":"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","file":"index.cjs","sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return clsx(inputs);\n}","import type { WidgetStyleConfig } from \"../types/style-config\";\n\nexport const defaultWidgetStyleConfig: WidgetStyleConfig = {\n // Theme\n theme: \"dark\",\n\n // Widget Width\n widgetWidth: \"default\",\n customWidth: \"100%\",\n\n // Layout\n padding: \"default\",\n rounding: \"default\",\n\n // Typography - Based on Turtle Design System\n fontFamily: \"Montserrat\", // Font Primary: Montserrat Medium\n fontSecondary: \"DM Sans\", // Font Secondary: DM Sans Regular\n\n // Deals\n deals: [],\n campaigns: [],\n\n // Colors - Based on Turtle Design System\n styles: {\n background: \"#141514\", // Ninja Black\n background_dark: \"#F9F9F9\", // Wise White (inverted for dark theme)\n foreground: \"#F9F9F9\", // Wise White\n foreground_dark: \"#141514\", // Ninja Black (inverted for dark theme)\n card: \"#141514\", // Ninja Black (cards use same as background)\n card_dark: \"#F9F9F9\", // Wise White (inverted for dark theme)\n muted_foreground: \"#FFFFFF80\", // Wise White Alpha (50%)\n muted_foreground_dark: \"#14151480\", // Ninja Black Alpha (50%)\n primary: \"#73F36C\", // Neon Green\n primary_dark: \"#73F36C\", // Neon Green (same for both themes)\n },\n};\n","import { atom } from \"jotai\";\nimport type { WidgetStyleConfig } from \"../types/style-config\";\nimport type { DepositDetails } from \"../types/deals\";\nimport { defaultWidgetStyleConfig } from \"./widget-style-config\";\n\n// Widget style configuration atom\nexport const widgetStyleConfigAtom = atom<WidgetStyleConfig>(defaultWidgetStyleConfig);\n\n// UI state atoms\nexport const showPanelAtom = atom<boolean>(false);\nexport const widgetLoadingAtom = atom<boolean>(false);\nexport const widgetErrorAtom = atom<Error | null>(null);\n\n// Deposit details atom\nexport const depositDetailsAtom = atom<DepositDetails>({\n amount: \"\",\n tokenAddress: \"\",\n tokenDecimals: 0,\n chain: \"\",\n});\n\n// Transaction state (consolidated)\nexport interface TransactionState {\n status: \"idle\" | \"pending\" | \"success\" | \"error\";\n hash?: string;\n error?: Error;\n}\n\nexport const transactionAtom = atom<TransactionState>({\n status: \"idle\",\n hash: undefined,\n error: undefined,\n});\n\n// Backward compatibility derived atoms (can be removed later)\nexport const transactionStateAtom = atom(\n (get) => get(transactionAtom).status,\n (get, set, status: \"idle\" | \"pending\" | \"success\" | \"error\") => {\n const current = get(transactionAtom);\n set(transactionAtom, { ...current, status });\n }\n);\n\nexport const transactionHashAtom = atom(\n (get) => get(transactionAtom).hash,\n (get, set, hash: string | undefined) => {\n const current = get(transactionAtom);\n set(transactionAtom, { ...current, hash });\n }\n);\n","import type { WidgetStyles } from \"../types/style-config\";\n\n// Type for CSS custom properties\nexport type CSSCustomProperties = Record<`--${string}`, string>;\n\n/**\n * Generates core token CSS variables for dynamic theming\n * Only injects the color tokens that need to be customizable\n * This allows the design system semantic mapping to work automatically\n */\nexport function generateCoreTokenCSS(\n styles: WidgetStyles,\n theme: \"light\" | \"dark\"\n): CSSCustomProperties {\n const isDark = theme === \"dark\";\n\n const coreTokens: CSSCustomProperties = {\n // Core brand colors that can be customized - always inject these\n \"--color-brand-black\": isDark ? styles.background_dark : styles.background,\n \"--color-brand-white\": isDark ? styles.foreground_dark : styles.foreground,\n \"--color-brand-green\": isDark ? styles.primary_dark : styles.primary,\n };\n\n // Optional surface colors - only inject if provided to allow design system defaults\n if (styles.card !== undefined || styles.card_dark !== undefined) {\n coreTokens[\"--color-surface-primary\"] = isDark ? \n (styles.card_dark ?? styles.card ?? styles.background_dark) : \n (styles.card ?? styles.card_dark ?? styles.background);\n }\n\n // Override muted foreground color if provided\n if (styles.muted_foreground !== undefined || styles.muted_foreground_dark !== undefined) {\n coreTokens[\"--muted-foreground\"] = isDark ? \n (styles.muted_foreground_dark ?? styles.muted_foreground ?? styles.foreground_dark) : \n (styles.muted_foreground ?? styles.muted_foreground_dark ?? styles.foreground);\n }\n\n return coreTokens;\n}\n","import type { WidgetStyles } from '../types/style-config';\n\n/**\n * Default widget styles based on Turtle Design System core tokens\n * These values serve as fallbacks when no custom styles are provided\n */\nexport const DEFAULT_WIDGET_STYLES: WidgetStyles = {\n // Core brand colors - required\n background: \"#F9F9F9\", // Wise White (light theme bg)\n background_dark: \"#141514\", // Ninja Black (dark theme bg)\n foreground: \"#141514\", // Ninja Black (light theme text)\n foreground_dark: \"#F9F9F9\", // Wise White (dark theme text)\n primary: \"#73F36C\", // Neon Green (light theme primary)\n primary_dark: \"#73F36C\", // Neon Green (dark theme primary)\n \n // Optional surface colors - have defaults in design system if not provided\n card: \"#F9F9F9\", // Light theme surface\n card_dark: \"#141514\", // Dark theme surface\n muted_foreground: \"#14151480\", // Light theme muted text (50% opacity)\n muted_foreground_dark: \"#FFFFFF80\", // Dark theme muted text (50% opacity)\n} as const;\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_THEME = 'dark' as const;\nexport const DEFAULT_FONT = 'Montserrat, sans-serif' as const;\nexport const DEFAULT_FONT_SECONDARY = 'DM Sans, sans-serif' as const;","import { useAtomValue } from \"jotai\";\nimport { widgetStyleConfigAtom } from \"../store/atoms\";\nimport { generateCoreTokenCSS } from \"../lib/css-variables\";\nimport {\n DEFAULT_WIDGET_STYLES,\n DEFAULT_THEME,\n DEFAULT_FONT,\n DEFAULT_FONT_SECONDARY,\n} from \"../lib/widget-styles.constants\";\nimport type { UseWidgetStylesReturn } from \"../types/widget-styles\";\n\n/**\n * Custom hook to generate widget styles and CSS variables from configuration\n *\n * @returns Widget styles, CSS variables, and configuration data\n */\nexport function useWidgetStyles(): UseWidgetStylesReturn {\n const config = useAtomValue(widgetStyleConfigAtom);\n\n // Extract configuration with defaults\n const theme = config?.theme ?? DEFAULT_THEME;\n const fontPrimary = config?.fontFamily ?? DEFAULT_FONT;\n const fontSecondary = config?.fontSecondary ?? DEFAULT_FONT_SECONDARY;\n const widgetWidth = config?.widgetWidth ?? \"default\";\n const customWidth = config?.customWidth ?? \"100%\";\n\n // Extract layout options\n const padding = config?.padding ?? \"default\";\n const rounding = config?.rounding ?? \"default\";\n\n // Use widget styles or defaults\n const widgetStyles = config?.styles ?? DEFAULT_WIDGET_STYLES;\n\n // Generate CSS custom properties - use new core token approach\n // Handle \"auto\" theme by defaulting to \"dark\" for now\n const resolvedTheme = theme === \"auto\" ? \"dark\" : theme;\n const coreTokenCSS = generateCoreTokenCSS(widgetStyles, resolvedTheme);\n\n return {\n theme,\n coreTokenCSS,\n fontPrimary,\n fontSecondary,\n widgetWidth,\n customWidth,\n padding,\n rounding,\n config,\n widgetStyles,\n };\n}\n","import React, { useEffect } from \"react\";\nimport { useSetAtom } from \"jotai\";\nimport type { WidgetStyleConfig } from \"../../types/style-config\";\nimport { cn } from \"../../lib/utils\";\nimport { useWidgetStyles } from \"../../hooks/useWidgetStyles\";\nimport { widgetStyleConfigAtom } from \"../../store/atoms\";\n\ninterface WidgetRootProps {\n config: WidgetStyleConfig;\n children: React.ReactNode;\n}\n\nexport function WidgetRoot({ config, children }: WidgetRootProps): React.ReactElement {\n const setWidgetConfig = useSetAtom(widgetStyleConfigAtom);\n const { theme, coreTokenCSS, fontPrimary, fontSecondary, widgetWidth } = useWidgetStyles();\n\n useEffect(() => {\n setWidgetConfig(config);\n }, [config, setWidgetConfig]);\n\n return (\n <div\n className={cn(\n \"turtle-widget-root\",\n \"antialiased transition-all duration-700 ease-linear h-full w-full\",\n theme === \"dark\" ? \"dark\" : \"\"\n )}\n style={\n {\n ...coreTokenCSS,\n \"--font-primary\": fontPrimary,\n \"--font-secondary\": fontSecondary,\n fontFamily: fontPrimary,\n } as React.CSSProperties\n }\n >\n <div\n className={cn(\n \"flex flex-col items-center gap-2 h-full\",\n widgetWidth === \"full\" ? \"w-full\" : \n widgetWidth === \"custom\" ? \"\" : \"max-w-[450px]\"\n )}\n style={{\n ...(widgetWidth === \"custom\" && config.customWidth ? { width: config.customWidth } : {}),\n }}\n >\n {children}\n </div>\n </div>\n );\n}\n","import type { JSX } from \"react\";\n\ninterface AccountDetailsProps {\n userAddress?: string;\n}\n\nfunction shortenAddress(address?: string): string {\n if (!address) return \"Connect Wallet\";\n return `${address.slice(0, 10)}...${address.slice(-4)}`;\n}\n\nexport function AccountDetails({ userAddress }: AccountDetailsProps): JSX.Element {\n return (\n <div className=\"flex items-center justify-between rounded-full bg-secondary px-4 py-2 gap-3 border border-border cursor-pointer transition-colors hover:border-primary\">\n <span className=\"text-foreground font-medium text-sm\">{shortenAddress(userAddress)}</span>\n </div>\n );\n}\n\nexport default AccountDetails;\n","import type { JSX } from \"react\";\nimport { useState } from \"react\";\nimport { Select, SelectContent, SelectItem, SelectTrigger } from \"@turtleclub/ui\";\n\ninterface ChainOption {\n value: string;\n symbol: string;\n name: string;\n icon: string;\n chainId: number;\n}\n\nconst CHAINS: ChainOption[] = [\n {\n value: \"ethereum\",\n symbol: \"ETH\",\n name: \"Ethereum\",\n icon: \"https://assets.coingecko.com/coins/images/279/large/ethereum.png?1746019748\",\n chainId: 1,\n },\n {\n value: \"bitcoin\",\n symbol: \"BTC\",\n name: \"Bitcoin\",\n icon: \"https://assets.coingecko.com/coins/images/1/large/bitcoin.png?1747033579\",\n chainId: 0, // Bitcoin doesn't have a traditional chainId\n },\n {\n value: \"solana\",\n symbol: \"SOL\",\n name: \"Solana\",\n icon: \"https://assets.coingecko.com/coins/images/4128/large/solana.png?1640133422\",\n chainId: 0, // Solana doesn't use EVM chainIds\n },\n {\n value: \"polygon\",\n symbol: \"MATIC\",\n name: \"Polygon\",\n icon: \"https://assets.coingecko.com/coins/images/4713/large/polygon.png?1698233745\",\n chainId: 137,\n },\n {\n value: \"arbitrum\",\n symbol: \"ARB\",\n name: \"Arbitrum\",\n icon: \"https://assets.coingecko.com/coins/images/16547/large/photo_2023-03-29_21.47.00.jpeg?1680097313\",\n chainId: 42161,\n },\n];\n\ninterface ChainSelectorProps {\n selectedChainId?: number;\n onChainChange?: (chainId: number) => void;\n}\n\nexport function ChainSelector({\n selectedChainId = 1,\n onChainChange,\n}: ChainSelectorProps): JSX.Element {\n const [selectedChain, setSelectedChain] = useState<string>(\n CHAINS.find((chain) => chain.chainId === selectedChainId)?.value || CHAINS[0].value\n );\n const currentChain = CHAINS.find((chain) => chain.value === selectedChain) || CHAINS[0];\n\n const handleChainChange = (value: string) => {\n setSelectedChain(value);\n const chain = CHAINS.find((c) => c.value === value);\n if (chain) {\n onChainChange?.(chain.chainId);\n }\n };\n\n return (\n <div className=\"relative flex items-center h-10\">\n {/* Overlapped Chain Icon */}\n <span className=\"absolute left-0 top-1/2 -translate-y-1/2 z-10 flex items-center justify-center h-11 w-11 rounded-full ring-1 ring-primary/60 bg-background\">\n <img src={currentChain.icon} alt={currentChain.name} className=\"w-8 h-8 rounded-full\" />\n </span>\n\n {/* Select Component */}\n <Select value={selectedChain} onValueChange={handleChainChange}>\n <SelectTrigger className=\"flex items-center justify-between rounded-full bg-card pl-14 pr-3 gap-3 border border-border w-auto h-10 cursor-pointer transition-colors hover:border-primary focus:border-primary focus:ring-0\">\n <div className=\"flex items-center justify-end gap-2\">\n <span className=\"text-foreground font-medium text-sm\">{currentChain.symbol}</span>\n </div>\n </SelectTrigger>\n\n <SelectContent className=\"bg-card border-border rounded-lg w-[82%]\">\n {CHAINS.map((chain) => (\n <SelectItem\n key={chain.value}\n value={chain.value}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-secondary rounded-md transition-colors data-[state=checked]:bg-secondary data-[state=checked]:text-primary\"\n >\n <div className=\"flex items-center gap-2 w-full\">\n <img src={chain.icon} alt={chain.name} className=\"w-8 h-8 rounded-full\" />\n <div className=\"flex flex-col\">\n <span className=\"text-foreground font-medium text-sm\">{chain.symbol}</span>\n <span className=\"text-muted-foreground text-xs\">{chain.name}</span>\n </div>\n </div>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n );\n}\n","import React, { createContext, useContext } from \"react\";\nimport { Adapter } from \"../types\";\n\n// Crear el contexto\nconst AdapterContext = createContext<Adapter | null>(null);\n\n// Props del provider\ninterface AdapterProviderProps {\n adapter: Adapter;\n distributorId: string;\n children: React.ReactNode;\n}\n\n// Context para distributorId\nconst DistributorIdContext = createContext<string>(\"\");\n\n// Provider component\nexport const AdapterProvider: React.FC<AdapterProviderProps> = ({ adapter, distributorId, children }) => {\n return (\n <AdapterContext.Provider value={adapter}>\n <DistributorIdContext.Provider value={distributorId}>\n {children}\n </DistributorIdContext.Provider>\n </AdapterContext.Provider>\n );\n};\n\n// Hook principal para usar el adapter completo\nexport const useAdapter = (): Adapter => {\n const adapter = useContext(AdapterContext);\n if (!adapter) {\n throw new Error(\"useAdapter must be used within an AdapterProvider\");\n }\n return adapter;\n};\n\n// Hook para acceder al distributorId\nexport const useDistributorId = (): string => {\n const distributorId = useContext(DistributorIdContext);\n return distributorId; // Allow empty string, just ensure it's provided in context\n};\n\n// Hooks granulares para funcionalidades específicas\n\n// Wallet connection related\nexport const useWalletConnection = () => {\n const adapter = useAdapter();\n return {\n user: adapter.user,\n network: adapter.network,\n isConnected: !!adapter.user,\n openConnectionModal: adapter.openConnectionModal,\n };\n};\n\n// Transaction related methods\nexport const useTransactionMethods = () => {\n const adapter = useAdapter();\n return {\n sendTransaction: adapter.sendTransaction,\n signMessage: adapter.signMessage,\n changeNetwork: adapter.changeNetwork,\n };\n};\n\n// Network operations\nexport const useNetworkMethods = () => {\n const adapter = useAdapter();\n return {\n network: adapter.network,\n changeNetwork: adapter.changeNetwork,\n };\n};","import type { JSX } from \"react\";\nimport { AccountDetails } from \"./account-details\";\nimport { ChainSelector } from \"./chain-selector\";\nimport { useAdapter } from \"../../context/adapter-context\";\n\nexport function WalletSection(): JSX.Element {\n // Get state directly from adapter\n const adapter = useAdapter();\n const userAddress = adapter.user;\n const walletConnected = !!adapter.user;\n const selectedChainId = adapter.network;\n\n const handleChainChange = async (chainId: number): Promise<void> => {\n try {\n await adapter.changeNetwork(chainId);\n } catch (error) {\n console.error(\"Failed to change network:\", error);\n }\n };\n\n return (\n <div className=\"flex w-full items-center justify-between gap-4\">\n {/* Wallet Address Display - Only show when connected */}\n {walletConnected && userAddress && <AccountDetails userAddress={userAddress} />}\n\n {/* Chain Selector */}\n <ChainSelector selectedChainId={selectedChainId} onChainChange={handleChainChange} />\n </div>\n );\n}\n","/**\n * Parse a string amount to a BigInt given decimals\n * Equivalent to viem's parseUnits but without the dependency\n */\nexport function parseUnits(value: string, decimals: number): bigint {\n const [integer, fraction = ''] = value.split('.');\n \n // Pad fraction to match decimals\n const paddedFraction = fraction.padEnd(decimals, '0').slice(0, decimals);\n \n // Combine integer and fraction\n const combinedValue = integer + paddedFraction;\n \n return BigInt(combinedValue);\n}\n\n/**\n * Format a BigInt to a string given decimals\n * Equivalent to viem's formatUnits but without the dependency\n */\nexport function formatUnits(value: bigint, decimals: number): string {\n const valueStr = value.toString();\n \n if (decimals === 0) {\n return valueStr;\n }\n \n // If the value is smaller than the decimal places, pad with zeros\n const paddedValue = valueStr.padStart(decimals + 1, '0');\n \n const integerPart = paddedValue.slice(0, -decimals) || '0';\n const fractionalPart = paddedValue.slice(-decimals);\n \n // Remove trailing zeros from fractional part\n const trimmedFractional = fractionalPart.replace(/0+$/, '');\n \n if (trimmedFractional === '') {\n return integerPart;\n }\n \n return `${integerPart}.${trimmedFractional}`;\n}","import { atom, useAtom } from \"jotai\";\nimport type { EarnRouteOptions } from \"@turtleclub/api\";\nimport type { DealFormatted, Token } from \"../types/deals\";\nimport { parseUnits } from \"../utils/format\";\n\n// Complete parameters needed for useEarnRoute\nexport interface EarnRouteParams {\n // Core EarnRouteOptions parameters\n user: string;\n chain: number;\n slippage: number;\n tokenIn: string;\n tokenOut: string;\n amount: string;\n distributor_id: string;\n id?: string;\n \n // Additional widget-specific state\n selectedDeal: DealFormatted | null;\n selectedToken: Token | null;\n distributorId: string;\n resetTrigger: number;\n}\n\n// Default state for earn route parameters\nconst defaultEarnRouteParams: EarnRouteParams = {\n user: \"\",\n chain: 1,\n slippage: 0.5, // 0.5%\n tokenIn: \"\",\n tokenOut: \"\",\n amount: \"\",\n distributor_id: \"\",\n id: undefined,\n selectedDeal: null,\n selectedToken: null,\n distributorId: \"2c86d3a1-cfe8-486d-915d-1b9ff5e924e9\", // TODO: Update with turtle distributor id\n resetTrigger: 0,\n};\n\n// Main consolidated atom for all earn route parameters\nexport const earnRouteParamsAtom = atom<EarnRouteParams>(defaultEarnRouteParams);\n\n// Derived atom that provides parameters in the format expected by useEarnRoute\nexport const earnRouteOptionsAtom = atom<EarnRouteOptions | undefined>((get) => {\n const params = get(earnRouteParamsAtom);\n \n // Only return options if we have the minimum required parameters including selectedToken for decimals\n if (!params.user || !params.tokenIn || !params.tokenOut || !params.amount || !params.selectedToken) {\n return undefined;\n }\n \n // Convert amount from user format to wei\n const amountInWei = parseUnits(params.amount, params.selectedToken.decimals).toString();\n \n return {\n user: params.user,\n chain: params.chain,\n slippage: params.slippage,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amount: amountInWei, // Send in wei format\n referral: params.distributor_id,\n id: params.id,\n };\n});\n\n// Granular derived atoms for individual parameter access and updates\nexport const depositValueAtom = atom(\n (get) => get(earnRouteParamsAtom).amount,\n (get, set, amount: string) => {\n const current = get(earnRouteParamsAtom);\n set(earnRouteParamsAtom, { ...current, amount });\n }\n);\n\nexport const selectedDealAtom = atom(\n (get) => get(earnRouteParamsAtom).selectedDeal,\n (get, set, selectedDeal: DealFormatted | null) => {\n const current = get(earnRouteParamsAtom);\n set(earnRouteParamsAtom, { \n ...current, \n selectedDeal,\n // Update tokenOut when deal changes\n tokenOut: selectedDeal?.tokenAddress || \"\",\n });\n }\n);\n\nexport const selectedTokenAtom = atom(\n (get) => get(earnRouteParamsAtom).selectedToken,\n (get, set, selectedToken: Token | null) => {\n const current = get(earnRouteParamsAtom);\n set(earnRouteParamsAtom, { \n ...current, \n selectedToken,\n // Update tokenIn when token changes\n tokenIn: selectedToken?.address || \"\",\n });\n }\n);\n\nexport const slippageAtom = atom(\n (get) => get(earnRouteParamsAtom).slippage,\n (get, set, slippage: number) => {\n const current = get(earnRouteParamsAtom);\n set(earnRouteParamsAtom, { ...current, slippage });\n }\n);\n\nexport const resetTriggerAtom = atom(\n (get) => get(earnRouteParamsAtom).resetTrigger,\n (get, set, resetTrigger: number) => {\n const current = get(earnRouteParamsAtom);\n set(earnRouteParamsAtom, { ...current, resetTrigger });\n }\n);\n\nexport const distributorIdAtom = atom(\n (get) => get(earnRouteParamsAtom).distributorId,\n (get, set, distributorId: string) => {\n const current = get(earnRouteParamsAtom);\n set(earnRouteParamsAtom, { ...current, distributorId, distributor_id: distributorId });\n }\n);\n\n// Computed atoms for validation and state\nexport const isRouteReadyAtom = atom((get) => {\n const params = get(earnRouteParamsAtom);\n return !!(\n params.user &&\n params.tokenIn &&\n params.tokenOut &&\n params.amount &&\n params.selectedToken &&\n parseFloat(params.amount) > 0\n );\n});\n\n// Hook to update multiple parameters at once \nexport const useEarnRouteParamsUpdate = () => {\n const [, setParams] = useAtom(earnRouteParamsAtom);\n \n return (updates: Partial<EarnRouteParams>) => {\n setParams((current: EarnRouteParams) => ({ ...current, ...updates }));\n };\n};\n\n// Reset function for clearing state\nexport const resetEarnRouteParamsAtom = atom(null, (get, set) => {\n const current = get(earnRouteParamsAtom);\n set(earnRouteParamsAtom, {\n ...defaultEarnRouteParams,\n // Preserve user and chain when resetting\n user: current.user,\n chain: current.chain,\n distributorId: current.distributorId,\n distributor_id: current.distributor_id,\n resetTrigger: current.resetTrigger + 1,\n });\n});","import { useEarnDeals as useEarnDealsOriginal } from \"@turtleclub/hooks\";\nimport type { DealFormatted } from \"../types/deals\";\n\ninterface UseEarnDealsResult {\n deals: DealFormatted[];\n isLoading: boolean;\n error: Error | null;\n}\n\nconst KATANA_CAMPAIGN = \"2c86d3a1-cfe8-486d-915d-1b9ff5e924e9\";\n\n/**\n * Wrapper hook for @turtleclub/hooks useEarnDeals\n * Provides compatibility with widget's expected interface\n */\nexport function useEarnDeals(): UseEarnDealsResult {\n // TODO: Implement campaign and deals filtering\n const { data, isLoading, error } = useEarnDealsOriginal({ campaignId: KATANA_CAMPAIGN });\n\n // Transform real API data to match widget's expected format\n const deals: DealFormatted[] =\n data?.deals?.map((deal) => ({\n id: deal.metadata.id,\n tokenAddress: deal.token.address,\n tokenName: deal.token.symbol,\n tvl: deal.data.tvl,\n iconToken: deal.token.logos[0] || \"\",\n iconDeal: deal.metadata.iconUrl,\n yieldPercentage: deal.data.apy,\n })) || [];\n\n return {\n deals,\n isLoading,\n error: error as Error | null,\n };\n}\n","import { useAtomValue, useSetAtom } from \"jotai\";\nimport { useEffect } from \"react\";\nimport { selectedDealAtom } from \"../store/earn-route-atom\";\nimport { useEarnDeals } from \"./useEarnDeals\";\n\nexport function useAutoSelectDeal() {\n const setDealSelected = useSetAtom(selectedDealAtom);\n const dealSelected = useAtomValue(selectedDealAtom);\n\n const { deals, isLoading, error } = useEarnDeals();\n\n // Auto-select the first deal when deals are loaded\n useEffect(() => {\n if (deals.length > 0 && !dealSelected) {\n setDealSelected(deals[0]);\n }\n }, [deals, dealSelected, setDealSelected]);\n\n return {\n deals,\n dealsFormatted: deals, // For backward compatibility\n isLoading,\n error,\n selectedDeal: dealSelected,\n };\n}\n","export function toNumber(value?: string | number, def = 0): number {\n if (value === undefined) {\n return def;\n }\n\n try {\n const val = Number.parseFloat(value.toString());\n\n if (Number.isNaN(val)) {\n return def;\n }\n\n return val;\n } catch (e: unknown) {\n // eslint-disable-next-line unused-imports/no-unused-vars\n return def;\n }\n}\n\nexport function min(...vals: number[]): number {\n let smallest = Number.MAX_VALUE;\n\n for (const val of vals) {\n if (val >= smallest) {\n continue;\n }\n\n smallest = val;\n }\n\n return smallest;\n}\n\nexport function max(...vals: number[]): number {\n let biggest = -Number.MAX_VALUE;\n\n for (const val of vals) {\n if (val <= biggest) {\n continue;\n }\n\n biggest = val;\n }\n\n return biggest;\n}\n","import { formatUnits } from \"viem\";\nimport { min, toNumber } from \"./number\";\n\nexport function removeZeros(val: string | number): string {\n const str = val.toString();\n const parts = str.split(\".\");\n\n if (parts.length < 2) return str;\n\n const [start, decimals] = parts;\n\n let depth = decimals.length;\n\n for (let i = decimals.length - 1; i >= 0; i--) {\n if (decimals[i] !== \"0\") break;\n\n depth--;\n }\n\n const newDecimals = decimals.slice(0, depth);\n\n return `${start}${newDecimals.length > 0 ? `.${newDecimals}` : \"\"}`;\n}\n\nconst magnitudeMap = [\n \"k\",\n \"m\",\n \"b\",\n \"t\",\n \"q\",\n \"qq\",\n \"qqq\",\n \"qqqq\",\n \"qqqqq\",\n \"qqqqqq\",\n \"qqqqqqq\",\n \"qqqqqqqq\",\n];\n\nexport function numberScale(val: string | number, decimals: number): [number, string] {\n const num = toNumber(val);\n const magnitude = Math.floor(min(Math.log10(num) / 3, magnitudeMap.length));\n if (magnitude < 1) {\n return [num, \"\"] as const;\n }\n return [\n Number.parseFloat((num / 10 ** (magnitude * 3)).toFixed(decimals)),\n magnitudeMap[magnitude - 1],\n ] as const;\n}\n\nexport function formatNumber(\n val: string | number,\n decimals = 2,\n doScale = false,\n zeros = true\n): string {\n if (typeof val === \"string\") {\n val = toNumber(val);\n }\n\n val = val.toFixed(decimals);\n\n let [value, suffix] = [val, \"\"];\n\n if (doScale) {\n let new_value;\n [new_value, suffix] = numberScale(val, decimals);\n value = new_value.toString();\n }\n\n let result = `${value.replace(/\\B(?<!\\.\\d*)(?=(\\d{3})+(?!\\d))/g, \",\")}${suffix}`;\n\n if (!zeros) {\n result = removeZeros(result);\n }\n\n return result;\n}\n\nexport function formatToken(\n amount: string,\n token: { decimals: number },\n doScale = false,\n zeros = false,\n decimals = 9\n): string {\n const amountBigInt = BigInt(amount);\n const stringAmount = formatUnits(amountBigInt, token.decimals);\n\n return `${formatNumber(stringAmount, decimals ?? token.decimals / 2, doScale, zeros)}`;\n}\n\nexport function formatAddress(address: string): string {\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n","import type { Token as WidgetToken, DealFormatted } from '../types';\nimport type { Token as UIToken, OpportunityItemProps } from '@turtleclub/ui';\n\n/**\n * Converts widget Token to UI molecule Token\n */\nexport function widgetTokenToUIToken(token: WidgetToken): UIToken {\n return {\n icon: token.logo ? (\n <img src={token.logo} alt={token.symbol} className=\"w-4 h-4 rounded-full\" />\n ) : (\n <div className=\"w-4 h-4 rounded-full bg-muted flex items-center justify-center text-xs\">\n {token.symbol.charAt(0)}\n </div>\n ),\n symbol: token.symbol,\n address: token.address,\n };\n}\n\n/**\n * Converts array of widget tokens to UI molecule tokens\n */\nexport function widgetTokensToUITokens(tokens: WidgetToken[]): UIToken[] {\n return tokens.map(widgetTokenToUIToken);\n}\n\n/**\n * Converts widget DealFormatted to UI molecule OpportunityItemProps\n */\nexport function dealToOpportunityItem(deal: DealFormatted): OpportunityItemProps {\n return {\n icon: deal.iconDeal ? (\n <img src={deal.iconDeal} alt={deal.tokenName} className=\"w-8 h-8 rounded-full\" />\n ) : (\n <div className=\"w-8 h-8 rounded-full bg-muted flex items-center justify-center text-sm\">\n {deal.tokenName.charAt(0)}\n </div>\n ),\n name: deal.tokenName,\n tvl: formatTVL(deal.tvl),\n yield: `${deal.yieldPercentage}%`,\n };\n}\n\n/**\n * Converts array of deals to opportunity items\n */\nexport function dealsToOpportunityItems(deals: DealFormatted[]): OpportunityItemProps[] {\n return deals.map(dealToOpportunityItem);\n}\n\n/**\n * Formats TVL number to readable string\n */\nfunction formatTVL(tvl: number): string {\n if (tvl >= 1e9) {\n return `$${(tvl / 1e9).toFixed(1)}B`;\n } else if (tvl >= 1e6) {\n return `$${(tvl / 1e6).toFixed(1)}M`;\n } else if (tvl >= 1e3) {\n return `$${(tvl / 1e3).toFixed(1)}K`;\n }\n return `$${tvl.toFixed(0)}`;\n}\n\n/**\n * Formats number to USD string\n */\nexport function formatUSDValue(value: number): string {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(value);\n}\n\n/**\n * Formats balance string with proper decimals\n */\nexport function formatBalance(balance: string, decimals: number = 4): string {\n const num = parseFloat(balance);\n if (isNaN(num)) return \"0\";\n \n if (num >= 1e6) {\n return `${(num / 1e6).toFixed(1)}M`;\n } else if (num >= 1e3) {\n return `${(num / 1e3).toFixed(1)}K`;\n }\n \n return num.toFixed(decimals);\n}","import type { JSX } from \"react\";\nimport { useAtom, useAtomValue } from \"jotai\";\nimport { useEffect } from \"react\";\nimport { formatNumber, formatToken } from \"@turtleclub/utils\";\nimport { useEarnWalletBalances } from \"@turtleclub/hooks\";\nimport {\n selectedTokenAtom,\n depositValueAtom,\n resetTriggerAtom,\n} from \"../../store/earn-route-atom\";\nimport { SwapInput } from \"@turtleclub/ui\";\nimport { widgetTokensToUITokens, formatUSDValue } from \"../../adapters\";\nimport { useAdapter } from \"../../context/adapter-context\";\n\nexport function SwapInputWrapper(): JSX.Element {\n // Get state directly from adapter\n const adapter = useAdapter();\n const userAddress = adapter.user;\n const walletConnected = !!adapter.user;\n\n const { data: balances } = useEarnWalletBalances(\n userAddress && walletConnected\n ? {\n chain: 1,\n user: userAddress,\n }\n : undefined\n );\n\n const [selectedToken, setSelectedToken] = useAtom(selectedTokenAtom);\n const [amount, setAmount] = useAtom(depositValueAtom);\n const resetTrigger = useAtomValue(resetTriggerAtom);\n\n // Auto-select first token when balances load or when component mounts\n useEffect(() => {\n if (!selectedToken) {\n if (balances?.balances && balances.balances.length > 0) {\n // Use real token from wallet\n const firstBalance = balances.balances[0];\n setSelectedToken({\n address: firstBalance.token.address,\n name: firstBalance.token.name,\n symbol: firstBalance.token.symbol,\n decimals: firstBalance.token.decimals,\n logo: firstBalance.token.logos?.[0],\n balance: firstBalance.amount,\n price: firstBalance.token.price ?? undefined,\n });\n } else {\n // Use default token when no wallet or loading\n const firstDefault = defaultTokens[0];\n setSelectedToken({\n address: firstDefault.address,\n name: firstDefault.name,\n symbol: firstDefault.symbol,\n decimals: firstDefault.decimals,\n logo: firstDefault.logo,\n balance: firstDefault.balance,\n price: firstDefault.price,\n });\n }\n }\n }, [balances, selectedToken, setSelectedToken]);\n\n // Reset amount when token changes\n useEffect(() => {\n setAmount(\"\");\n }, [selectedToken]);\n\n // Reset amount when reset trigger changes\n useEffect(() => {\n if (resetTrigger > 0) {\n setAmount(\"\");\n }\n }, [resetTrigger]);\n\n const handleMaxClick = (): void => {\n if (selectedToken) {\n // If no real balance, use \"0\" but still allow interaction\n const balance = selectedToken.balance === \"0\" ? \"0\" : selectedToken.balance;\n const maxAmount = formatToken(balance, selectedToken);\n // Format to max 5 decimals using utils\n const formattedAmount = formatNumber(maxAmount, 5, false, false);\n setAmount(formattedAmount);\n }\n };\n\n const formattedBalance = selectedToken\n ? formatNumber(\n formatToken(selectedToken.balance, selectedToken),\n 5,\n false,\n false\n )\n : \"0\";\n\n // Default tokens to show when no wallet is connected or loading\n const defaultTokens = [\n {\n address: \"0x0000000000000000000000000000000000000000\",\n name: \"Ethereum\",\n symbol: \"ETH\",\n decimals: 18,\n logo: undefined,\n balance: \"0\",\n price: 0, // Realistic ETH price\n },\n ];\n\n // Convert wallet balances to UI tokens or use defaults\n const availableTokens = balances?.balances\n ? balances.balances.map((balance) => ({\n address: balance.token.address,\n name: balance.token.name,\n symbol: balance.token.symbol,\n decimals: balance.token.decimals,\n logo: balance.token.logos?.[0],\n balance: balance.amount,\n price: balance.token.price ?? undefined,\n }))\n : defaultTokens;\n\n const uiTokens = widgetTokensToUITokens(availableTokens);\n\n // Check if amount exceeds balance\n const amountNumber = parseFloat(amount) || 0;\n const balanceNumber = selectedToken\n ? parseFloat(formatToken(selectedToken.balance, selectedToken))\n : 0;\n const hasInsufficientBalance = amountNumber > balanceNumber && walletConnected;\n\n // Calculate USD value or show insufficient balance message\n const usdValue =\n selectedToken && amount\n ? hasInsufficientBalance\n ? \"Insufficient balance\"\n : formatUSDValue(parseFloat(amount) * (selectedToken.price || 0))\n : undefined;\n\n return (\n <div className=\"flex flex-col gap-2 items-start justify-start\">\n <h3 className=\"text-md font-medium\">Deposit</h3>\n <div className=\"relative\">\n <SwapInput\n value={amount}\n onChange={setAmount}\n tokens={uiTokens}\n selectedToken={selectedToken?.address}\n onTokenChange={(tokenAddress) => {\n // Try to find in real balances first\n const tokenBalance = balances?.balances?.find((b) => b.token.address === tokenAddress);\n if (tokenBalance) {\n setSelectedToken({\n address: tokenBalance.token.address,\n name: tokenBalance.token.name,\n symbol: tokenBalance.token.symbol,\n decimals: tokenBalance.token.decimals,\n logo: tokenBalance.token.logos?.[0],\n balance: tokenBalance.amount,\n price: tokenBalance.token.price ?? undefined,\n });\n } else {\n // Fallback to default tokens\n const defaultToken = defaultTokens.find((t) => t.address === tokenAddress);\n if (defaultToken) {\n setSelectedToken({\n address: defaultToken.address,\n name: defaultToken.name,\n symbol: defaultToken.symbol,\n decimals: defaultToken.decimals,\n logo: defaultToken.logo,\n balance: defaultToken.balance,\n price: defaultToken.price,\n });\n }\n }\n }}\n usdValue={hasInsufficientBalance ? undefined : usdValue}\n balance={formattedBalance}\n onMaxClick={handleMaxClick}\n placeholder={walletConnected ? \"0\" : \"Connect wallet to continue\"}\n disabled={!walletConnected}\n className={`w-full [&_button]:w-32 [&_button]:min-w-32 ${hasInsufficientBalance ? \"border-destructive/50\" : \"\"}`}\n />\n {/* Custom error message overlay for insufficient balance */}\n {hasInsufficientBalance && (\n <div className=\"absolute bottom-3 left-4 text-sm text-destructive\">\n Insufficient balance\n </div>\n )}\n </div>\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport { useSetAtom } from \"jotai\";\nimport type { DealFormatted } from \"../../types/deals\";\nimport { showPanelAtom } from \"../../store/atoms\";\nimport { selectedDealAtom } from \"../../store/earn-route-atom\";\nimport { OpportunityItem } from \"@turtleclub/ui\";\nimport { dealToOpportunityItem } from \"../../adapters\";\n\ninterface OpportunityProps extends DealFormatted {\n showPanelOnClick?: boolean;\n onAnimatedClose?: () => void;\n className?: string;\n}\n\nexport function Opportunity({\n tokenName,\n tvl,\n iconToken,\n yieldPercentage,\n iconDeal,\n id,\n tokenAddress,\n showPanelOnClick = false,\n onAnimatedClose,\n className,\n}: OpportunityProps): JSX.Element {\n const setShowPanel = useSetAtom(showPanelAtom);\n const setDealSelected = useSetAtom(selectedDealAtom);\n\n const handleClick = (): void => {\n setDealSelected({\n tokenName,\n tvl,\n iconToken,\n yieldPercentage,\n iconDeal,\n id,\n tokenAddress,\n });\n\n if (showPanelOnClick) {\n setShowPanel(true);\n } else if (onAnimatedClose) {\n onAnimatedClose();\n } else {\n setShowPanel(false);\n }\n };\n\n // Convert DealFormatted to OpportunityItemProps\n const opportunityItemProps = dealToOpportunityItem({\n tokenName,\n tvl,\n iconToken,\n yieldPercentage,\n iconDeal,\n id,\n tokenAddress,\n });\n\n return (\n <OpportunityItem\n {...opportunityItemProps}\n onSelect={handleClick}\n className={className}\n />\n );\n}\n","import React from \"react\";\nimport type { JSX } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { useWidgetStyles } from \"../../hooks/useWidgetStyles\";\nimport { Card } from \"@turtleclub/ui\";\n\n// eslint-disable-next-line no-undef\nexport interface WidgetContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n className?: string;\n padding?: \"none\" | \"sm\" | \"default\" | \"md\" | \"lg\";\n rounding?: \"none\" | \"sm\" | \"default\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n variant: \"container\" | \"simple\" | \"item\";\n asChild?: boolean;\n}\n\nexport function WidgetContainer({\n children,\n className,\n variant,\n padding,\n rounding,\n ...props\n}: WidgetContainerProps): JSX.Element {\n const { padding: configPadding, rounding: configRounding } = useWidgetStyles();\n\n // Use config values if not explicitly provided via props\n const finalPadding = padding ?? configPadding;\n const finalRounded = rounding ?? configRounding;\n\n return (\n <Card\n className={cn(className)}\n {...props}\n variant={variant}\n padding={finalPadding}\n rounded={finalRounded}\n >\n {children}\n </Card>\n );\n}\n","import type { JSX } from \"react\";\nimport { useAtomValue } from \"jotai\";\nimport { selectedDealAtom } from \"../../store/earn-route-atom\";\nimport { Opportunity } from \"../ui/opportunity\";\nimport { WidgetContainer } from \"../ui/widget-container\";\n\nexport function Earn(): JSX.Element {\n const dealSelected = useAtomValue(selectedDealAtom);\n\n return (\n <div className=\"flex flex-col gap-2 items-start justify-start\">\n <h3 className=\"text-sm font-medium text-foreground\">Earn</h3>\n\n {/* Fixed OpportunityItem */}\n {dealSelected ? (\n <Opportunity {...dealSelected} showPanelOnClick={true} />\n ) : (\n <OpportunitySkeleton />\n )}\n </div>\n );\n}\n\nfunction OpportunitySkeleton(): JSX.Element {\n return (\n <WidgetContainer variant=\"simple\" className=\"w-full animate-pulse\">\n <div className=\"flex justify-between items-center p-1\">\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex gap-2 items-center justify-start\">\n <div className=\"w-7 h-7 bg-muted rounded-full\"></div>\n <div className=\"w-24 h-5 bg-muted rounded\"></div>\n </div>\n <div className=\"w-32 h-4 bg-muted rounded\"></div>\n </div>\n <div className=\"w-16 h-8 bg-muted rounded\"></div>\n </div>\n </WidgetContainer>\n );\n}\n\n","import { useState, useCallback, useEffect, useRef, useMemo } from \"react\";\nimport type { EarnRouteResponse, EarnRouteStep } from \"../types/earn-route\";\n\n/**\n * useTransactionQueue Hook\n * \n * Manages the execution of multiple blockchain transactions in sequence.\n * Key features:\n * - Maintains a queue of transaction steps from an EarnRoute\n * - Executes transactions one by one with proper state management\n * - Auto-triggers the next transaction after the previous one completes\n * - Handles errors, user cancellations, and retry logic\n * \n * Auto-trigger logic:\n * 1. After a transaction completes, the hook updates currentIndex to point to the next step\n * 2. A useEffect monitors state changes and checks if:\n * - The previous step (currentIndex - 1) is completed\n * - The current step hasn't been executed yet\n * - There are no ongoing executions\n * 3. If conditions are met, it automatically triggers the next transaction after a 1s delay\n * 4. This continues until all transactions in the queue are completed\n */\n\nexport interface TransactionStep {\n id: string;\n label: string;\n description: string;\n txData: {\n to: string;\n data: string;\n value?: string;\n gasLimit?: string;\n };\n completed: boolean;\n current: boolean;\n txHash?: string;\n error?: string;\n}\n\nexport interface TransactionQueueState {\n steps: TransactionStep[];\n currentIndex: number;\n isExecuting: boolean;\n allCompleted: boolean;\n hasError: boolean;\n cancelled: boolean;\n error?: string;\n}\n\ninterface UseTransactionQueueProps {\n earnRoute: EarnRouteResponse | null;\n userAddress?: string;\n sendTransaction: (transaction: any) => Promise<string>;\n onError?: (error: Error) => void;\n onSuccess?: (txHash: string) => void;\n}\n\nexport function useTransactionQueue({\n earnRoute,\n userAddress,\n sendTransaction,\n onError = () => {},\n onSuccess = () => {},\n}: UseTransactionQueueProps) {\n const [state, setState] = useState<TransactionQueueState>({\n steps: [],\n currentIndex: 0,\n isExecuting: false,\n allCompleted: false,\n hasError: false,\n cancelled: false,\n });\n\n const memoizedEarnRoute = useMemo(() => {\n if (!earnRoute) return null;\n\n // Create a stable reference by serializing and checking key properties\n const stepsKey =\n earnRoute.steps?.map((step) => `${step.id}-${step.to}-${step.data}`).join(\"|\") || \"\";\n return {\n ...earnRoute,\n _stepsKey: stepsKey, // Add internal key for comparison\n };\n }, [\n earnRoute?.success,\n earnRoute?.estimatedGas,\n earnRoute?.estimatedTime,\n earnRoute?.outputAmount,\n // Serialize steps to create stable dependency\n earnRoute?.steps?.map((step) => `${step.id}-${step.to}-${step.data}`).join(\"|\"),\n ]);\n\n // Initialize steps when earnRoute changes\n useEffect(() => {\n if (memoizedEarnRoute && memoizedEarnRoute.success && memoizedEarnRoute.steps.length > 0) {\n const newSteps = memoizedEarnRoute.steps.map((step: EarnRouteStep, index: number) => ({\n id: step.id,\n label: step.title,\n description: step.description,\n txData: {\n to: step.to,\n data: step.data,\n value: step.value,\n gasLimit: step.gasLimit,\n },\n completed: false,\n current: index === 0, // First step is current initially\n }));\n\n setState({\n steps: newSteps,\n currentIndex: 0,\n isExecuting: false,\n allCompleted: false,\n hasError: false,\n cancelled: false,\n });\n } else {\n setState({\n steps: [],\n currentIndex: 0,\n isExecuting: false,\n allCompleted: false,\n hasError: false,\n cancelled: false,\n });\n }\n }, [memoizedEarnRoute]);\n\n // Keep refs for stable access to current values\n const stateRef = useRef(state);\n const callbacksRef = useRef({ userAddress, sendTransaction, onError, onSuccess });\n\n // Update refs when values change\n useEffect(() => {\n stateRef.current = state;\n }, [state]);\n\n useEffect(() => {\n callbacksRef.current = { userAddress, sendTransaction, onError, onSuccess };\n }, [userAddress, sendTransaction, onError, onSuccess]);\n\n // Execute current transaction\n const executeCurrentTransaction = useCallback(async () => {\n const currentState = stateRef.current;\n const {\n userAddress: currentUserAddress,\n sendTransaction: currentSendTransaction,\n onError: currentOnError,\n onSuccess: currentOnSuccess,\n } = callbacksRef.current;\n\n if (!currentUserAddress || !currentSendTransaction || currentState.isExecuting) {\n return;\n }\n\n const currentStep = currentState.steps[currentState.currentIndex];\n if (!currentStep || currentStep.completed) {\n return;\n }\n\n setState((prev) => ({\n ...prev,\n isExecuting: true,\n hasError: false,\n cancelled: false,\n error: undefined,\n }));\n\n try {\n const txHash = await currentSendTransaction({\n to: currentStep.txData.to as `0x${string}`,\n data: currentStep.txData.data as `0x${string}`,\n value: currentStep.txData.value ? BigInt(currentStep.txData.value) : undefined,\n chainId: 1, // TODO: Get from context\n });\n\n // Extract final hash immediately\n const finalTxHash =\n typeof txHash === \"object\" && \"hash\" in txHash ? txHash.hash : String(txHash);\n\n // Update step with txHash immediately (before waiting for confirmation)\n setState((prev) => {\n const updatedSteps = [...prev.steps];\n updatedSteps[prev.currentIndex] = {\n ...updatedSteps[prev.currentIndex],\n txHash: finalTxHash,\n };\n return {\n ...prev,\n steps: updatedSteps,\n };\n });\n\n // Wait for transaction confirmation on-chain\n try {\n if (typeof txHash === \"object\" && \"wait\" in txHash) {\n await txHash.wait();\n }\n } catch (waitError) {\n console.warn(\"Could not wait for transaction confirmation, proceeding anyway:\", waitError);\n }\n\n // Update current step as completed\n setState((prev) => {\n const updatedSteps = [...prev.steps];\n\n updatedSteps[prev.currentIndex] = {\n ...updatedSteps[prev.currentIndex],\n completed: true,\n current: false,\n };\n\n const nextIndex = prev.currentIndex + 1;\n const isLastStep = nextIndex >= updatedSteps.length;\n\n // Mark next step as current if exists\n if (!isLastStep) {\n updatedSteps[nextIndex] = {\n ...updatedSteps[nextIndex],\n current: true,\n };\n }\n\n const allCompleted = isLastStep;\n\n // Call success callback if all completed\n if (allCompleted && currentOnSuccess) {\n currentOnSuccess();\n }\n\n const newState = {\n ...prev,\n steps: updatedSteps,\n currentIndex: isLastStep ? prev.currentIndex : nextIndex,\n isExecuting: false,\n allCompleted,\n };\n \n return newState;\n });\n } catch (error) {\n\n // Check if error is user rejection/cancellation\n const errorMessage = error instanceof Error ? error.message : String(error);\n const isUserRejection =\n errorMessage.toLowerCase().includes(\"user rejected\") ||\n errorMessage.toLowerCase().includes(\"user denied\") ||\n errorMessage.toLowerCase().includes(\"user cancelled\") ||\n errorMessage.toLowerCase().includes(\"cancelled by user\") ||\n errorMessage.toLowerCase().includes(\"transaction rejected\") ||\n errorMessage.includes(\"4001\"); // MetaMask user rejection code\n\n setState((prev) => ({\n ...prev,\n isExecuting: false,\n hasError: !isUserRejection,\n cancelled: isUserRejection,\n error: isUserRejection\n ? \"Transaction cancelled by user\"\n : error instanceof Error\n ? error.message\n : \"Transaction failed\",\n }));\n\n if (currentOnError && !isUserRejection) {\n currentOnError(error instanceof Error ? error : new Error(\"Transaction failed\"));\n }\n }\n }, []);\n\n // Reset queue to initial state\n const resetQueue = useCallback(() => {\n if (memoizedEarnRoute && memoizedEarnRoute.success && memoizedEarnRoute.steps.length > 0) {\n const newSteps = memoizedEarnRoute.steps.map((step: EarnRouteStep, index: number) => ({\n id: step.id,\n label: step.title,\n description: step.description,\n txData: {\n to: step.to,\n data: step.data,\n value: step.value,\n gasLimit: step.gasLimit,\n },\n completed: false,\n current: index === 0, // First step is current initially\n }));\n\n setState({\n steps: newSteps,\n currentIndex: 0,\n isExecuting: false,\n allCompleted: false,\n hasError: false,\n cancelled: false,\n });\n }\n }, [memoizedEarnRoute]);\n\n // Get current step\n const currentStep = state.steps[state.currentIndex] || null;\n\n // Check if ready to execute (has steps and user connected)\n const canExecute = !!(\n userAddress &&\n state.steps.length > 0 &&\n !state.isExecuting &&\n !state.allCompleted &&\n !state.cancelled\n );\n\n // Auto-execute next transaction when current one completes (only for multi-step transactions)\n useEffect(() => {\n // Only proceed if we have multiple steps\n if (state.steps.length <= 1) return;\n \n // Check if we should auto-execute the next transaction:\n // 1. Previous step must be completed (we just finished a transaction)\n // 2. Current step must not be started yet (we haven't executed it)\n // 3. We must not be currently executing another transaction\n // 4. The entire queue must not be completed or cancelled\n const previousStepIndex = state.currentIndex - 1;\n const previousStepCompleted = previousStepIndex >= 0 && state.steps[previousStepIndex]?.completed;\n const currentStepNotStarted = state.currentIndex < state.steps.length && !state.steps[state.currentIndex]?.completed;\n const hasNextStep = state.currentIndex < state.steps.length;\n \n const shouldAutoExecute = previousStepCompleted && currentStepNotStarted && hasNextStep && !state.isExecuting && !state.allCompleted && !state.cancelled;\n \n if (shouldAutoExecute) {\n // Delay execution to allow UI to update and show transaction status\n const timer = setTimeout(() => {\n executeCurrentTransaction();\n }, 1000);\n return () => clearTimeout(timer);\n }\n }, [state.steps, state.currentIndex, state.isExecuting, state.allCompleted, state.cancelled, executeCurrentTransaction]);\n\n return {\n ...state,\n currentStep,\n canExecute,\n executeCurrentTransaction,\n resetQueue,\n totalSteps: state.steps.length,\n completedSteps: state.steps.filter((step) => step.completed).length,\n progress:\n state.steps.length > 0\n ? (state.steps.filter((step) => step.completed).length / state.steps.length) * 100\n : 0,\n };\n}\n","import { useEarnRoute as useEarnRouteOriginal } from \"@turtleclub/hooks\";\nimport type { EarnRouteOptions, EarnRouteResponse } from \"../types/earn-route\";\n\n/**\n * Wrapper hook for @turtleclub/hooks useEarnRoute\n * Provides compatibility with widget's expected interface\n */\nexport function useEarnRoute(options?: EarnRouteOptions) {\n const enabled =\n options !== undefined && !!options.user && !!options.amount && parseFloat(options.amount) > 0;\n\n const { data, isLoading, error } = useEarnRouteOriginal(\n enabled\n ? {\n user: options!.user,\n chain: options!.chain || 1,\n tokenIn: options!.tokenIn,\n tokenOut: options!.tokenOut,\n amount: options!.amount,\n slippage: options!.slippage || 0.1,\n referral: options!.distributor_id || \"\",\n id: options!.id || \"\",\n }\n : undefined\n );\n\n // Transform data to match widget's expected format\n const transformedData: EarnRouteResponse | null = data\n ? {\n success: true,\n steps:\n data.steps?.map((step, index) => ({\n id: `step-${index}`,\n type: step.kind === \"approve\" ? \"approval\" : \"deposit\",\n title: step.kind === \"approve\" ? \"Approve Token\" : \"Execute Transaction\",\n description:\n step.kind === \"approve\" && \"token\" in step\n ? `Approve ${step.token.symbol}`\n : \"Execute routing transaction\",\n to: step.tx.to,\n data: step.tx.data,\n value: step.tx.value,\n gasLimit: step.tx.gas.toString(),\n })) || [],\n estimatedGas: \"0\", // Not provided in current API\n estimatedTime: undefined, // Default estimate\n outputAmount: data.amount_out,\n metadata: undefined, // Not provided in current API\n }\n : null;\n\n return {\n data: transformedData,\n isLoading,\n error,\n };\n}\n","import { useAtomValue } from \"jotai\";\nimport { useEarnRoute } from \"./useEarnRoute\"; // Use our wrapper, not the original\nimport { earnRouteOptionsAtom } from \"../store/earn-route-atom\";\n\n/**\n * Simplified hook that uses the consolidated earn route parameters atom\n * to call the original useEarnRoute hook\n */\nexport function useEarnRouteConsolidated() {\n // Get consolidated route options from atom\n const routeOptions = useAtomValue(earnRouteOptionsAtom);\n\n // Call the original useEarnRoute hook with the consolidated options\n const result = useEarnRoute(routeOptions);\n\n return {\n ...result,\n // Additional computed properties\n isReady: !!routeOptions,\n hasRequiredParams: !!(\n routeOptions?.user &&\n routeOptions?.tokenIn &&\n routeOptions?.tokenOut &&\n routeOptions?.amount\n ),\n };\n}\n","import type { EarnRouteResponse } from \"../types/earn-route\";\nimport { useEarnRouteConsolidated } from \"./useEarnRouteConsolidated\";\n\ninterface UseTokenDepositResult {\n fetchedRoute: EarnRouteResponse | null;\n routeError: Error | null;\n isLoadingRoute: boolean;\n}\n\nexport function useTokenDeposit(): UseTokenDepositResult {\n // Use the new consolidated hook\n const { data: fetchedRoute, error: routeError, isLoading: isLoadingRoute } = useEarnRouteConsolidated();\n\n return { \n fetchedRoute: fetchedRoute ?? null, \n routeError: routeError as Error | null,\n isLoadingRoute,\n };\n}","import { Button } from \"@turtleclub/ui\";\nimport { useAdapter } from \"../../context/adapter-context\";\n\ninterface SimpleConfirmButtonProps {\n\n userAddress: string;\n openConnectionModal: () => void;\n fetchedRoute: any;\n routeError: any;\n isLoadingRoute: boolean;\n canExecute: boolean;\n isExecuting: boolean;\n hasError: boolean;\n cancelled: boolean;\n error: any;\n executeCurrentTransaction: () => Promise<void>;\n totalSteps: number;\n completedSteps: number;\n showingTransactionStatus: boolean;\n hasInsufficientBalance: boolean;\n className: string;\n}\n\n// Simple Confirm Button - Only handles button logic, no TxStatus\nexport function SimpleConfirmButton({\n userAddress,\n openConnectionModal,\n fetchedRoute,\n routeError,\n isLoadingRoute,\n canExecute,\n isExecuting,\n hasError,\n cancelled,\n error,\n executeCurrentTransaction,\n totalSteps,\n completedSteps,\n showingTransactionStatus,\n hasInsufficientBalance,\n className,\n}: SimpleConfirmButtonProps) {\n const adapter = useAdapter();\n const walletConnected = !!adapter.user;\n\n const handleConfirm = async (): Promise<void> => {\n if (!canExecute) return;\n await executeCurrentTransaction();\n };\n\n // If showing transaction status, don't show any button\n if (showingTransactionStatus) {\n return <div className={className}></div>;\n }\n\n // Connect wallet button\n if (!userAddress || !walletConnected) {\n return (\n <Button onClick={() => openConnectionModal()} className={className} variant=\"green\" size=\"lg\">\n Connect Wallet\n </Button>\n );\n }\n\n // Loading state\n if (isLoadingRoute) {\n return (\n <Button disabled className={className} size=\"lg\">\n Loading route...\n </Button>\n );\n }\n\n // Error state\n if (routeError) {\n return (\n <Button disabled variant=\"transparentWhite\" className={className} size=\"lg\">\n Route Error\n </Button>\n );\n }\n\n // No route available\n if (!fetchedRoute || !fetchedRoute.steps || fetchedRoute.steps.length === 0) {\n return (\n <Button disabled variant=\"transparentWhite\" className={className} size=\"lg\">\n Enter amount to continue\n </Button>\n );\n }\n\n // Insufficient balance\n if (hasInsufficientBalance) {\n return (\n <Button disabled variant=\"transparentWhite\" className={className} size=\"lg\">\n Insufficient Balance\n </Button>\n );\n }\n\n // Render confirm button\n return (\n <div className={`space-y-2 ${className || \"\"}`}>\n <Button\n onClick={handleConfirm}\n disabled={!canExecute || isExecuting}\n size=\"lg\"\n className=\"w-full\"\n >\n {isExecuting && \"Executing...\"}\n {hasError && \"Retry Transaction\"}\n {cancelled && \"Try Again\"}\n {!isExecuting &&\n !hasError &&\n !cancelled &&\n (totalSteps > 1\n ? `Confirm Transaction (${completedSteps}/${totalSteps})`\n : \"Confirm Transaction\")}\n </Button>\n\n {/* Error message */}\n {hasError && error && <div className=\"text-sm text-destructive text-center\">{error}</div>}\n </div>\n );\n}\n","import { TransactionStep } from \"@/hooks/useTransactionQueue\";\nimport { resetTriggerAtom, depositValueAtom } from \"@/store/earn-route-atom\";\nimport { TxStatus } from \"@turtleclub/ui\";\nimport { formatNumber } from \"@turtleclub/utils\";\nimport { useAtom, useSetAtom } from \"jotai\";\nimport { useMemo } from \"react\";\n\ninterface TransactionStatusSectionProps {\n steps: TransactionStep[];\n currentStep: TransactionStep;\n allCompleted: boolean;\n cancelled: boolean;\n estimatedTime: number;\n tokenSymbol: string;\n amount: string;\n resetQueue: () => void;\n}\n\n// Transaction Status Section - Shows TxStatus in the info area\nexport function TransactionStatusSection({\n steps,\n currentStep,\n allCompleted,\n cancelled,\n estimatedTime,\n tokenSymbol,\n amount,\n resetQueue,\n}: TransactionStatusSectionProps) {\n const [, setResetTrigger] = useAtom(resetTriggerAtom);\n const setDepositValue = useSetAtom(depositValueAtom);\n\n // For completed transactions, use the last completed transaction hash\n // For ongoing transactions, use the current step hash\n const lastCompletedStep = steps.filter((step: any) => step.completed && step.txHash).pop();\n const currentStepWithHash = currentStep?.txHash ? currentStep : null;\n const displayTxHash = allCompleted\n ? lastCompletedStep?.txHash\n : currentStepWithHash?.txHash || lastCompletedStep?.txHash;\n\n const txStatusProps = useMemo(\n () => ({\n title: cancelled\n ? \"Transaction Cancelled\"\n : allCompleted\n ? \"Transaction Completed!\"\n : \"Processing Transaction\",\n description: cancelled\n ? \"Transaction was cancelled by user\"\n : allCompleted\n ? \"Your deposit has been successfully processed.\"\n : \"Please wait while your transaction is being confirmed...\",\n txHash: displayTxHash,\n explorerUrl: \"https://etherscan.io\", // TODO: Get from config\n estimatedTime: undefined,\n amount: `${amount ? formatNumber(amount, 5, false, false) : \"0\"}`,\n token: tokenSymbol,\n protocol: \"Turtle Protocol\",\n completed: allCompleted,\n cancelled: cancelled,\n onViewDetails: undefined, // Don't show View Details button for now\n onClose: () => {\n resetQueue();\n // Reset swap input and clear deposit details\n setDepositValue(\"\");\n setResetTrigger(0);\n },\n steps: steps.map((step: any) => ({\n label: step.label,\n completed: step.completed,\n current: step.current,\n txHash: step.txHash,\n })),\n }),\n [steps, currentStep, allCompleted, cancelled, estimatedTime, tokenSymbol, amount, resetQueue]\n );\n\n return (\n <div className=\"h-full overflow-hidden\">\n <TxStatus {...txStatusProps} className=\"h-full bg-background border-border text-foreground\" />\n </div>\n );\n}\n","import { DealFormatted } from \"@/types\";\nimport { OpportunityDetailsV1 } from \"@turtleclub/ui\";\nimport { useMemo } from \"react\";\n\n// Info Section Component - Shows opportunity details in scrollable area (simplified)\nexport function InfoSection({ dealSelected }: { dealSelected: DealFormatted | null }) {\n if (!dealSelected) {\n return (\n <div className=\"h-full overflow-hidden\">\n <div className=\"text-sm text-muted-foreground p-4 h-full overflow-y-auto\">\n <p>Loading opportunity details...</p>\n </div>\n </div>\n );\n }\n\n // Create details for OpportunityDetailsV1 molecule\n const opportunityDetailsProps = useMemo(\n () => ({\n title: `${dealSelected.tokenName} Vault`,\n titleIcon: dealSelected.iconDeal ? (\n <img\n src={dealSelected.iconDeal}\n alt={dealSelected.tokenName}\n className=\"w-8 h-8 rounded-full\"\n />\n ) : (\n <div className=\"w-8 h-8 rounded-full bg-primary/20 flex items-center justify-center\">\n <span className=\"text-sm font-bold text-primary\">{dealSelected.tokenName.charAt(0)}</span>\n </div>\n ),\n topCards: [\n {\n title: \"Native Yield\",\n value: `${dealSelected.yieldPercentage.toFixed(2)}%`,\n color: \"primary\" as const,\n },\n {\n title: \"Total Yield\",\n value: `${(dealSelected.yieldPercentage * 1.2).toFixed(2)}%`,\n color: \"accent\" as const,\n },\n {\n title: \"Net Fees\",\n value: \"0.5%\",\n color: \"secondary\" as const,\n },\n ] as const,\n bottomCards: [\n {\n title: \"TVL\",\n value: `$${(dealSelected.tvl / 1000000).toFixed(2)}M`,\n color: \"primary\" as const,\n },\n {\n title: \"Yield Source\",\n value: \"Multi-chain\",\n color: \"secondary\" as const,\n },\n {\n title: \"Rewards\",\n value: \"Deposit Bonus\",\n color: \"accent\" as const,\n },\n {\n title: \"Lock Period\",\n value: \"Flexible\",\n color: \"success\" as const,\n },\n ] as const,\n }),\n [dealSelected]\n );\n\n return (\n <div className=\"h-full overflow-hidden\">\n <OpportunityDetailsV1\n {...opportunityDetailsProps}\n className=\"h-full w-full overflow-y-auto\"\n />\n </div>\n );\n}\n","import { SwapDetails } from \"@turtleclub/ui\";\nimport { useMemo } from \"react\";\nimport { formatNumber } from \"@turtleclub/utils\";\n\nexport function SwapDetailsWrapper({\n amountToDeposit,\n symbol,\n tokenPrice,\n networkFee = undefined,\n networkFeeInUsd = undefined,\n showFree = false,\n defaultOpen = false,\n}: {\n amountToDeposit: string;\n symbol: string;\n tokenPrice: number;\n networkFee?: string;\n networkFeeInUsd?: string;\n showFree?: boolean;\n defaultOpen?: boolean;\n}) {\n // Calculate swap details based on current state\n const swapDetailsProps = useMemo(\n () => {\n // Format amount to max 6 decimals\n const formattedAmount = amountToDeposit \n ? formatNumber(parseFloat(amountToDeposit), 6, false, false)\n : \"0\";\n \n return {\n swapFee: undefined, // TODO: Add swap fee\n slippageInUsd: \"0.05\", // TODO: Add slippage\n deposit: amountToDeposit ? `${formattedAmount} ${symbol || \"ETH\"}` : \"0 ETH\",\n receive: amountToDeposit ? `${formattedAmount} ${symbol || \"ETH\"}` : \"0 ETH\",\n equivalentInUsd:\n amountToDeposit && tokenPrice\n ? (parseFloat(amountToDeposit) * tokenPrice).toFixed(2)\n : \"0.00\",\n networkFee: networkFee ?? \"0.002 ETH\", // TODO: Add network fee\n networkFeeInUsd: networkFeeInUsd ?? \"5.65\", // TODO: Add network fee in USD\n showFree: showFree,\n defaultOpen: defaultOpen,\n };\n },\n [amountToDeposit, symbol, tokenPrice, networkFee, networkFeeInUsd, showFree, defaultOpen]\n );\n return <SwapDetails {...swapDetailsProps} />;\n}\n","import { useMemo, type JSX } from \"react\";\nimport { SwapInputWrapper } from \"./swap-input-wrapper\";\nimport { Earn } from \"./earn\";\nimport { useAtomValue } from \"jotai\";\nimport { useTransactionQueue } from \"../../hooks/useTransactionQueue\";\nimport { useTokenDeposit } from \"../../hooks/useTokenDeposit\";\nimport {\n selectedTokenAtom,\n selectedDealAtom,\n depositValueAtom,\n} from \"../../store/earn-route-atom\";\nimport { useAdapter } from \"../../context/adapter-context\";\nimport { SimpleConfirmButton } from \"./simple-confirm-button\";\nimport { TransactionStatusSection } from \"./transaction-status\";\nimport { InfoSection } from \"./info-section\";\nimport { SwapDetailsWrapper } from \"./swap-details-wrapper\";\nimport { formatToken } from \"@turtleclub/utils\";\n\nexport function Swap(): JSX.Element {\n // Get state from atoms\n const selectedToken = useAtomValue(selectedTokenAtom);\n const depositValue = useAtomValue(depositValueAtom);\n const dealSelected = useAtomValue(selectedDealAtom);\n\n // Get adapter methods from context\n const adapter = useAdapter();\n const { sendTransaction, openConnectionModal, user: userAddress } = adapter;\n\n // Get transaction state from hooks\n const { fetchedRoute, routeError, isLoadingRoute } = useTokenDeposit();\n // Initialize transaction queue\n const {\n steps,\n currentStep,\n canExecute,\n isExecuting,\n allCompleted,\n hasError,\n cancelled,\n error,\n executeCurrentTransaction,\n resetQueue,\n totalSteps,\n completedSteps,\n } = useTransactionQueue({\n earnRoute: fetchedRoute,\n userAddress,\n sendTransaction,\n });\n\n // TODO:Extract to a separate hook later\n // Determine if we should show transaction status instead of opportunity details\n const showingTransactionStatus = useMemo(\n () => isExecuting || allCompleted || cancelled || (steps.length > 0 && completedSteps > 0),\n [isExecuting, allCompleted, cancelled, steps.length, completedSteps]\n );\n const walletConnected = !!adapter.user;\n const balanceNumber = selectedToken\n ? parseFloat(formatToken(selectedToken.balance, selectedToken))\n : 0;\n\n const hasInsufficientBalance = useMemo(() => {\n const amountNumber = parseFloat(depositValue) || 0;\n return amountNumber > balanceNumber && walletConnected;\n }, [depositValue, selectedToken, walletConnected]);\n\n // Only show SwapDetails if there's an amount entered\n const showSwapDetails = useMemo(\n () => depositValue && parseFloat(depositValue) > 0,\n [depositValue]\n );\n\n return (\n <div className=\"flex flex-col gap-4 flex-1 min-h-0 h-full\">\n {/* 1. Opportunity selector - Fixed */}\n <div className=\"flex-shrink-0\">\n <Earn />\n </div>\n\n {/* 2. Swap input - Fixed */}\n <div className=\"flex-shrink-0\">\n <SwapInputWrapper />\n </div>\n\n {/* 3. Transaction details - Fixed when shown */}\n {showSwapDetails && (\n <div className=\"flex-shrink-0\">\n <SwapDetailsWrapper\n amountToDeposit={depositValue}\n symbol={selectedToken?.symbol || \"\"}\n tokenPrice={selectedToken?.price || 0}\n />\n </div>\n )}\n\n {/* 4. Info section - Share space with the transaction status section */}\n <div className=\"flex-1 min-h-0\">\n {showingTransactionStatus ? (\n // Show transaction status when transaction is active\n <TransactionStatusSection\n steps={steps}\n currentStep={currentStep}\n allCompleted={allCompleted}\n cancelled={cancelled}\n estimatedTime={fetchedRoute?.estimatedTime || 0}\n tokenSymbol={selectedToken?.symbol || \"\"}\n amount={depositValue}\n resetQueue={resetQueue}\n />\n ) : (\n // Show opportunity details when no transaction is active\n <InfoSection dealSelected={dealSelected} />\n )}\n </div>\n\n {/* 5. Confirm button - Fixed at bottom */}\n <div className=\"flex-shrink-0\">\n <SimpleConfirmButton\n userAddress={userAddress || \"\"}\n openConnectionModal={openConnectionModal}\n fetchedRoute={fetchedRoute}\n routeError={routeError}\n isLoadingRoute={isLoadingRoute}\n canExecute={canExecute && !hasInsufficientBalance}\n isExecuting={isExecuting}\n hasError={hasError}\n cancelled={cancelled}\n error={error}\n executeCurrentTransaction={executeCurrentTransaction}\n totalSteps={totalSteps}\n completedSteps={completedSteps}\n showingTransactionStatus={showingTransactionStatus}\n hasInsufficientBalance={hasInsufficientBalance}\n className=\"w-full\"\n />\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { WalletSection } from \"../wallet-section\";\nimport { useAutoSelectDeal } from \"../../hooks/useAutoSelectDeal\";\nimport { Swap } from \"../swap/swap\";\n\nexport function WidgetContent(): React.ReactElement {\n // Auto-select deal when component mounts\n useAutoSelectDeal();\n\n return (\n <div className=\"w-full h-full flex flex-col gap-4\">\n {/* Fixed Wallet Section - wallet address + chain selector */}\n <div className=\"flex-shrink-0\">\n <WalletSection />\n </div>\n\n {/* Flexible Swap Section with proper order - Uses remaining height */}\n <div className=\"flex-1 min-h-0\">\n <Swap />\n </div>\n </div>\n );\n}\n","import { type JSX } from \"react\";\nimport { useSetAtom } from \"jotai\";\nimport { ArrowLeft, X } from \"lucide-react\";\nimport { useAutoSelectDeal } from \"../hooks/useAutoSelectDeal\";\nimport { showPanelAtom } from \"../store/atoms\";\nimport { selectedDealAtom } from \"../store/earn-route-atom\";\nimport { OpportunityItem } from \"@turtleclub/ui\";\nimport { Button } from \"@turtleclub/ui\";\nimport { dealToOpportunityItem } from \"../adapters\";\n\nexport function Deals(): JSX.Element {\n const setShowDeals = useSetAtom(showPanelAtom);\n const setDealSelected = useSetAtom(selectedDealAtom);\n const { dealsFormatted, isLoading, error } = useAutoSelectDeal();\n const handleClose = (): void => {\n setShowDeals(false);\n };\n\n const handleSelectDeal = (deal: (typeof dealsFormatted)[0]): void => {\n setDealSelected(deal);\n handleClose();\n };\n\n if (error) {\n return (\n <div className=\"w-full h-full flex flex-col items-center justify-center bg-background\">\n <p className=\"text-muted-foreground\">Error loading deals</p>\n <Button onClick={handleClose} variant=\"transparentWhite\" className=\"mt-2\">\n {/* @ts-expect-error - React 19 compatibility with lucide-react */}\n <ArrowLeft className=\"w-4 h-4 mr-2\" />\n Back\n </Button>\n </div>\n );\n }\n\n if (isLoading) {\n return (\n <div className=\"w-full h-full flex items-center justify-center bg-background\">\n <p className=\"text-muted-foreground\">Loading deals...</p>\n </div>\n );\n }\n\n return (\n <div className=\"w-full h-full flex flex-col bg-background\">\n {/* Header */}\n <div className=\"flex items-center justify-between p-4 border-b border-border\">\n <h2 className=\"text-lg font-semibold text-foreground\">Choose Opportunity</h2>\n <Button\n onClick={handleClose}\n variant=\"transparentWhite\"\n size=\"icon\"\n className=\"text-foreground hover:text-primary\"\n >\n {/* @ts-expect-error - React 19 compatibility with lucide-react */}\n <X className=\"w-5 h-5\" />\n </Button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 p-4 space-y-3 overflow-y-auto\">\n {dealsFormatted.map((deal) => {\n const opportunityProps = dealToOpportunityItem(deal);\n return (\n <OpportunityItem\n key={deal.tokenAddress}\n {...opportunityProps}\n onSelect={() => handleSelectDeal(deal)}\n className=\"w-full cursor-pointer hover:bg-accent/50 transition-colors\"\n />\n );\n })}\n </div>\n </div>\n );\n}\n","import React, { useState } from \"react\";\nimport { cn } from \"@turtleclub/ui\";\nimport { useWidgetStyles } from \"../../hooks/useWidgetStyles\";\n\ninterface WidgetLogoProps {\n light?: string;\n dark?: string;\n fallback?: string;\n className?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst sizeClasses = {\n sm: \"h-8 text-2xl\",\n md: \"h-12 text-4xl\", \n lg: \"h-16 text-6xl\",\n};\n\nexport function WidgetLogo({ \n light, \n dark, \n fallback = \"Turtle Club\", \n className,\n size = \"lg\"\n}: WidgetLogoProps): React.ReactElement {\n const [imageError, setImageError] = useState(false);\n const { theme } = useWidgetStyles();\n \n // Determine which logo URL to use based on theme\n const isDarkMode = theme === \"dark\";\n const logoUrl = isDarkMode ? (dark || light) : (light || dark);\n \n // If we have a logo URL and it hasn't failed to load, show image\n if (logoUrl && !imageError) {\n return (\n <div className={cn(\"flex justify-center items-center\", className)}>\n <img\n src={logoUrl}\n alt={fallback}\n className={cn(\"object-contain\", sizeClasses[size])}\n onError={() => setImageError(true)}\n onLoad={() => setImageError(false)}\n />\n </div>\n );\n }\n \n // Fallback to text logo\n return (\n <div className={cn(\"flex justify-center items-center\", className)}>\n <span className={cn(\"font-bold text-primary\", sizeClasses[size])}>\n {fallback}\n </span>\n </div>\n );\n}","import { useEffect } from \"react\";\nimport { useSetAtom, useAtomValue } from \"jotai\";\nimport { earnRouteParamsAtom, selectedDealAtom } from \"../store/earn-route-atom\";\nimport { useAdapter, useDistributorId } from \"../context/adapter-context\";\n\n/**\n * Hook to sync only the essential adapter data needed for earn route validation\n * This is a minimal sync that only updates the user field in earnRouteParamsAtom\n * to keep isRouteReadyAtom working properly\n */\nexport function useEarnRouteSync() {\n const adapter = useAdapter();\n const distributorId = useDistributorId();\n const selectedDeal = useAtomValue(selectedDealAtom);\n const setEarnRouteParams = useSetAtom(earnRouteParamsAtom);\n\n useEffect(() => {\n setEarnRouteParams((current) => ({\n ...current,\n user: adapter.user || \"\",\n chain: adapter.network || 1,\n distributorId: distributorId,\n distributor_id: distributorId,\n id: selectedDeal?.id || \"\",\n }));\n }, [adapter.user, adapter.network, distributorId, selectedDeal?.id, setEarnRouteParams]);\n}","import { useAtomValue } from \"jotai\";\nimport { widgetStyleConfigAtom } from \"../store/atoms\";\n\nexport function useWidgetLogo() {\n const config = useAtomValue(widgetStyleConfigAtom);\n \n return {\n light: config?.logo?.light,\n dark: config?.logo?.dark,\n fallback: config?.logo?.fallback || \"Turtle Club\",\n };\n}","import React, { useState } from \"react\";\nimport type { EarnWidgetProps } from \"../../types\";\nimport { WidgetRoot } from \"./widget-root\";\nimport { WidgetContent } from \"./widget-content\";\nimport { useAtomValue } from \"jotai\";\nimport { showPanelAtom } from \"../../store/atoms\";\nimport { Deals } from \"../deals\";\nimport { WidgetContainer, WidgetLogo } from \"../ui\";\nimport { NavigationBar, NavigationItem } from \"@turtleclub/ui\";\nimport { AdapterProvider } from \"../../context/adapter-context\";\nimport { useEarnRouteSync } from \"../../hooks/useEarnRouteSync\";\nimport { useWidgetLogo } from \"../../hooks/useWidgetLogo\";\n\nconst tabButtons = [\n { value: \"portfolio\", label: \"Portfolio\" },\n { value: \"earn\", label: \"Earn\" },\n { value: \"discover\", label: \"Discover\" },\n];\n\nfunction EarnWidgetInner({ config }: { config: EarnWidgetProps['config'] }): React.ReactElement {\n // Sync adapter data needed for earn route validation\n useEarnRouteSync();\n \n const [tab, setTab] = useState<\"earn\" | \"portfolio\" | \"discover\">(\"earn\");\n const showPanel = useAtomValue(showPanelAtom);\n const { light, dark, fallback } = useWidgetLogo();\n\n return (\n <WidgetRoot config={config}>\n <div className=\"max-w-md w-full h-full flex flex-col\">\n {/* Fixed Navigation Bar */}\n <div className=\"flex-shrink-0\">\n <NavigationBar activeValue={tab} variant=\"menuBar\">\n {tabButtons.map((button) => {\n return (\n <NavigationItem\n key={button.value}\n active={tab === button.value}\n onClick={() => setTab(button.value as \"earn\" | \"portfolio\" | \"discover\")}\n value={button.value}\n variant=\"menuBarDefault\"\n >\n {button.label}\n </NavigationItem>\n );\n })}\n </NavigationBar>\n </div>\n\n <div className=\"flex-1 min-h-0 mt-5\">\n {tab === \"earn\" && showPanel ? (\n // Panel mode: occupies full height without logo\n <div className=\"w-full h-full overflow-hidden\">\n <Deals />\n </div>\n ) : (\n <WidgetContainer variant=\"container\" className=\"w-full h-full flex flex-col\">\n {/* Fixed logo */}\n <div className=\"flex-shrink-0 py-4\">\n <WidgetLogo \n light={light}\n dark={dark}\n fallback={fallback}\n size=\"lg\"\n />\n </div>\n\n {/* Flexible main content */}\n <div className=\"flex-1 min-h-0 w-full\">\n <div className=\"h-full\">\n {tab === \"earn\" && <WidgetContent />}\n {tab === \"portfolio\" && (\n <div className=\"p-6 bg-background rounded-xl\">\n <p className=\"text-foreground\">Portfolio Coming Soon...</p>\n </div>\n )}\n {tab === \"discover\" && (\n <div className=\"p-6 bg-background rounded-xl\">\n <p className=\"text-foreground\">Discover Coming Soon...</p>\n </div>\n )}\n </div>\n </div>\n </WidgetContainer>\n )}\n </div>\n </div>\n </WidgetRoot>\n );\n}\n\nexport function EarnWidget({ adapter, config, distributorId }: EarnWidgetProps): React.ReactElement {\n return (\n <AdapterProvider adapter={adapter} distributorId={distributorId}>\n <EarnWidgetInner config={config} />\n </AdapterProvider>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/lib/utils.ts","../src/store/widget-style-config.ts","../src/store/atoms.ts","../src/lib/css-variables.ts","../src/lib/widget-styles.constants.ts","../src/hooks/useWidgetStyles.ts","../src/components/widget/widget-root.tsx","../src/components/wallet-section/account-details.tsx","../src/components/wallet-section/chain-selector.tsx","../src/context/adapter-context.tsx","../src/components/wallet-section/wallet-section.tsx","../src/utils/format.ts","../src/store/earn-route-atom.ts","../src/hooks/useEarnDeals.ts","../src/hooks/useAutoSelectDeal.ts","../../utils/src/number.ts","../../utils/src/format.ts","../src/adapters/ui-molecule-adapters.tsx","../src/components/swap/swap-input-wrapper.tsx","../src/components/ui/opportunity.tsx","../src/components/ui/widget-container.tsx","../src/components/swap/earn.tsx","../src/hooks/useTransactionQueue.ts","../src/hooks/useEarnRoute.ts","../src/hooks/useEarnRouteConsolidated.ts","../src/hooks/useTokenDeposit.ts","../src/components/swap/simple-confirm-button.tsx","../src/components/swap/transaction-status.tsx","../src/components/swap/info-section.tsx","../src/components/swap/swap-details-wrapper.tsx","../src/components/swap/swap.tsx","../src/components/widget/widget-content.tsx","../src/components/deals.tsx","../src/components/ui/widget-logo.tsx","../src/hooks/useEarnRouteSync.ts","../src/hooks/useWidgetLogo.ts","../src/components/widget/earn-widget.tsx"],"names":["cn","inputs","clsx","defaultWidgetStyleConfig","widgetStyleConfigAtom","atom","showPanelAtom","transactionAtom","get","set","status","current","hash","generateCoreTokenCSS","styles","theme","isDark","coreTokens","DEFAULT_WIDGET_STYLES","DEFAULT_THEME","DEFAULT_FONT","DEFAULT_FONT_SECONDARY","useWidgetStyles","config","useAtomValue","fontPrimary","fontSecondary","widgetWidth","customWidth","showNavigation","padding","rounding","widgetStyles","coreTokenCSS","WidgetRoot","children","setWidgetConfig","useSetAtom","useEffect","jsx","shortenAddress","address","AccountDetails","userAddress","CHAINS","ChainSelector","selectedChainId","onChainChange","selectedChain","setSelectedChain","useState","chain","currentChain","handleChainChange","value","c","jsxs","Select","SelectTrigger","SelectContent","SelectItem","AdapterContext","createContext","DistributorIdContext","AdapterProvider","adapter","distributorId","useAdapter","useContext","useDistributorId","useWalletConnection","useTransactionMethods","useNetworkMethods","WalletSection","walletConnected","chainId","error","parseUnits","decimals","integer","fraction","paddedFraction","combinedValue","defaultEarnRouteParams","earnRouteParamsAtom","earnRouteOptionsAtom","params","amountInWei","depositValueAtom","amount","selectedDealAtom","selectedDeal","selectedTokenAtom","selectedToken","slippage","resetTriggerAtom","resetTrigger","KATANA_CAMPAIGN","useEarnDeals","data","isLoading","useEarnDealsOriginal","deal","useAutoSelectDeal","setDealSelected","dealSelected","deals","toNumber","def","val","min","vals","smallest","removeZeros","str","parts","start","depth","newDecimals","magnitudeMap","numberScale","num","magnitude","formatNumber","doScale","zeros","suffix","new_value","result","formatToken","token","amountBigInt","stringAmount","formatUnits","widgetTokenToUIToken","widgetTokensToUITokens","tokens","dealToOpportunityItem","formatTVL","tvl","formatUSDValue","SwapInputWrapper","balances","useEarnWalletBalances","setSelectedToken","useAtom","setAmount","firstBalance","firstDefault","defaultTokens","handleMaxClick","balance","maxAmount","formattedAmount","formattedBalance","availableTokens","uiTokens","amountNumber","balanceNumber","hasInsufficientBalance","usdValue","SwapInput","tokenAddress","tokenBalance","b","defaultToken","t","Opportunity","tokenName","iconToken","yieldPercentage","iconDeal","id","showPanelOnClick","onAnimatedClose","className","setShowPanel","handleClick","opportunityItemProps","OpportunityItem","WidgetContainer","variant","props","configPadding","configRounding","finalPadding","finalRounded","Card","Earn","OpportunitySkeleton","useTransactionQueue","earnRoute","sendTransaction","onError","onSuccess","state","setState","memoizedEarnRoute","useMemo","stepsKey","step","newSteps","index","stateRef","useRef","callbacksRef","executeCurrentTransaction","useCallback","currentState","currentUserAddress","currentSendTransaction","currentOnError","currentOnSuccess","currentStep","prev","txHash","finalTxHash","updatedSteps","waitError","nextIndex","isLastStep","allCompleted","errorMessage","isUserRejection","resetQueue","canExecute","previousStepIndex","previousStepCompleted","currentStepNotStarted","hasNextStep","timer","useEarnRoute","options","enabled","useEarnRouteOriginal","useEarnRouteConsolidated","routeOptions","useTokenDeposit","fetchedRoute","routeError","isLoadingRoute","SimpleConfirmButton","openConnectionModal","isExecuting","hasError","cancelled","totalSteps","completedSteps","showingTransactionStatus","handleConfirm","Button","TransactionStatusSection","steps","estimatedTime","tokenSymbol","setResetTrigger","setDepositValue","lastCompletedStep","currentStepWithHash","displayTxHash","txStatusProps","TxStatus","InfoSection","opportunityDetailsProps","OpportunityDetailsV1","SwapDetailsWrapper","amountToDeposit","symbol","tokenPrice","networkFee","networkFeeInUsd","showFree","defaultOpen","swapDetailsProps","SwapDetails","Swap","depositValue","showSwapDetails","WidgetContent","Deals","setShowDeals","dealsFormatted","handleClose","handleSelectDeal","ArrowLeft","X","opportunityProps","sizeClasses","WidgetLogo","light","dark","fallback","size","imageError","setImageError","logoUrl","useEarnRouteSync","setEarnRouteParams","useWidgetLogo","tabButtons","EarnWidgetInner","tab","setTab","showPanel","NavigationBar","button","NavigationItem","EarnWidget"],"mappings":"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","file":"index.cjs","sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return clsx(inputs);\n}","import type { WidgetStyleConfig } from \"../types/style-config\";\n\nexport const defaultWidgetStyleConfig: WidgetStyleConfig = {\n // Theme\n theme: \"dark\",\n\n // Widget Width\n widgetWidth: \"default\",\n customWidth: \"100%\",\n\n // Layout\n padding: \"default\",\n rounding: \"default\",\n\n // Typography - Based on Turtle Design System\n fontFamily: \"Montserrat\", // Font Primary: Montserrat Medium\n fontSecondary: \"DM Sans\", // Font Secondary: DM Sans Regular\n\n // Deals\n deals: [],\n campaigns: [],\n\n // Colors - Based on Turtle Design System\n styles: {\n background: \"#141514\", // Ninja Black\n background_dark: \"#F9F9F9\", // Wise White (inverted for dark theme)\n foreground: \"#F9F9F9\", // Wise White\n foreground_dark: \"#141514\", // Ninja Black (inverted for dark theme)\n card: \"#141514\", // Ninja Black (cards use same as background)\n card_dark: \"#F9F9F9\", // Wise White (inverted for dark theme)\n muted_foreground: \"#FFFFFF80\", // Wise White Alpha (50%)\n muted_foreground_dark: \"#14151480\", // Ninja Black Alpha (50%)\n primary: \"#73F36C\", // Neon Green\n primary_dark: \"#73F36C\", // Neon Green (same for both themes)\n },\n};\n","import { atom } from \"jotai\";\nimport type { WidgetStyleConfig } from \"../types/style-config\";\nimport type { DepositDetails } from \"../types/deals\";\nimport { defaultWidgetStyleConfig } from \"./widget-style-config\";\n\n// Widget style configuration atom\nexport const widgetStyleConfigAtom = atom<WidgetStyleConfig>(defaultWidgetStyleConfig);\n\n// UI state atoms\nexport const showPanelAtom = atom<boolean>(false);\nexport const widgetLoadingAtom = atom<boolean>(false);\nexport const widgetErrorAtom = atom<Error | null>(null);\n\n// Deposit details atom\nexport const depositDetailsAtom = atom<DepositDetails>({\n amount: \"\",\n tokenAddress: \"\",\n tokenDecimals: 0,\n chain: \"\",\n});\n\n// Transaction state (consolidated)\nexport interface TransactionState {\n status: \"idle\" | \"pending\" | \"success\" | \"error\";\n hash?: string;\n error?: Error;\n}\n\nexport const transactionAtom = atom<TransactionState>({\n status: \"idle\",\n hash: undefined,\n error: undefined,\n});\n\n// Backward compatibility derived atoms (can be removed later)\nexport const transactionStateAtom = atom(\n (get) => get(transactionAtom).status,\n (get, set, status: \"idle\" | \"pending\" | \"success\" | \"error\") => {\n const current = get(transactionAtom);\n set(transactionAtom, { ...current, status });\n }\n);\n\nexport const transactionHashAtom = atom(\n (get) => get(transactionAtom).hash,\n (get, set, hash: string | undefined) => {\n const current = get(transactionAtom);\n set(transactionAtom, { ...current, hash });\n }\n);\n","import type { WidgetStyles } from \"../types/style-config\";\n\n// Type for CSS custom properties\nexport type CSSCustomProperties = Record<`--${string}`, string>;\n\n/**\n * Generates core token CSS variables for dynamic theming\n * Only injects the color tokens that need to be customizable\n * This allows the design system semantic mapping to work automatically\n */\nexport function generateCoreTokenCSS(\n styles: WidgetStyles,\n theme: \"light\" | \"dark\"\n): CSSCustomProperties {\n const isDark = theme === \"dark\";\n\n const coreTokens: CSSCustomProperties = {\n // Core brand colors that can be customized - always inject these\n \"--color-brand-black\": isDark ? styles.background_dark : styles.background,\n \"--color-brand-white\": isDark ? styles.foreground_dark : styles.foreground,\n \"--color-brand-green\": isDark ? styles.primary_dark : styles.primary,\n };\n\n // Optional surface colors - only inject if provided to allow design system defaults\n if (styles.card !== undefined || styles.card_dark !== undefined) {\n coreTokens[\"--color-surface-primary\"] = isDark ? \n (styles.card_dark ?? styles.card ?? styles.background_dark) : \n (styles.card ?? styles.card_dark ?? styles.background);\n }\n\n // Override muted foreground color if provided\n if (styles.muted_foreground !== undefined || styles.muted_foreground_dark !== undefined) {\n coreTokens[\"--muted-foreground\"] = isDark ? \n (styles.muted_foreground_dark ?? styles.muted_foreground ?? styles.foreground_dark) : \n (styles.muted_foreground ?? styles.muted_foreground_dark ?? styles.foreground);\n }\n\n return coreTokens;\n}\n","import type { WidgetStyles } from '../types/style-config';\n\n/**\n * Default widget styles based on Turtle Design System core tokens\n * These values serve as fallbacks when no custom styles are provided\n */\nexport const DEFAULT_WIDGET_STYLES: WidgetStyles = {\n // Core brand colors - required\n background: \"#F9F9F9\", // Wise White (light theme bg)\n background_dark: \"#141514\", // Ninja Black (dark theme bg)\n foreground: \"#141514\", // Ninja Black (light theme text)\n foreground_dark: \"#F9F9F9\", // Wise White (dark theme text)\n primary: \"#73F36C\", // Neon Green (light theme primary)\n primary_dark: \"#73F36C\", // Neon Green (dark theme primary)\n \n // Optional surface colors - have defaults in design system if not provided\n card: \"#F9F9F9\", // Light theme surface\n card_dark: \"#141514\", // Dark theme surface\n muted_foreground: \"#14151480\", // Light theme muted text (50% opacity)\n muted_foreground_dark: \"#FFFFFF80\", // Dark theme muted text (50% opacity)\n} as const;\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_THEME = 'dark' as const;\nexport const DEFAULT_FONT = 'Montserrat, sans-serif' as const;\nexport const DEFAULT_FONT_SECONDARY = 'DM Sans, sans-serif' as const;","import { useAtomValue } from \"jotai\";\nimport { widgetStyleConfigAtom } from \"../store/atoms\";\nimport { generateCoreTokenCSS } from \"../lib/css-variables\";\nimport {\n DEFAULT_WIDGET_STYLES,\n DEFAULT_THEME,\n DEFAULT_FONT,\n DEFAULT_FONT_SECONDARY,\n} from \"../lib/widget-styles.constants\";\nimport type { UseWidgetStylesReturn } from \"../types/widget-styles\";\n\n/**\n * Custom hook to generate widget styles and CSS variables from configuration\n *\n * @returns Widget styles, CSS variables, and configuration data\n */\nexport function useWidgetStyles(): UseWidgetStylesReturn {\n const config = useAtomValue(widgetStyleConfigAtom);\n\n // Extract configuration with defaults\n const theme = config?.theme ?? DEFAULT_THEME;\n const fontPrimary = config?.fontFamily ?? DEFAULT_FONT;\n const fontSecondary = config?.fontSecondary ?? DEFAULT_FONT_SECONDARY;\n const widgetWidth = config?.widgetWidth ?? \"default\";\n const customWidth = config?.customWidth ?? \"100%\";\n const showNavigation = config?.showNavigation ?? true;\n\n // Extract layout options\n const padding = config?.padding ?? \"default\";\n const rounding = config?.rounding ?? \"default\";\n\n // Use widget styles or defaults\n const widgetStyles = config?.styles ?? DEFAULT_WIDGET_STYLES;\n\n // Generate CSS custom properties - use new core token approach\n // Handle \"auto\" theme by defaulting to \"dark\" for now\n const resolvedTheme = theme === \"auto\" ? \"dark\" : theme;\n const coreTokenCSS = generateCoreTokenCSS(widgetStyles, resolvedTheme);\n\n return {\n theme,\n coreTokenCSS,\n fontPrimary,\n fontSecondary,\n widgetWidth,\n customWidth,\n showNavigation,\n padding,\n rounding,\n config,\n widgetStyles,\n };\n}\n","import React, { useEffect } from \"react\";\nimport { useSetAtom } from \"jotai\";\nimport type { WidgetStyleConfig } from \"../../types/style-config\";\nimport { cn } from \"../../lib/utils\";\nimport { useWidgetStyles } from \"../../hooks/useWidgetStyles\";\nimport { widgetStyleConfigAtom } from \"../../store/atoms\";\n\ninterface WidgetRootProps {\n config: WidgetStyleConfig;\n children: React.ReactNode;\n}\n\nexport function WidgetRoot({ config, children }: WidgetRootProps): React.ReactElement {\n const setWidgetConfig = useSetAtom(widgetStyleConfigAtom);\n const { theme, coreTokenCSS, fontPrimary, fontSecondary, widgetWidth } = useWidgetStyles();\n\n useEffect(() => {\n setWidgetConfig(config);\n }, [config, setWidgetConfig]);\n\n return (\n <div\n className={cn(\n \"turtle-widget-root\",\n \"antialiased transition-all duration-700 ease-linear h-full w-full\",\n theme === \"dark\" ? \"dark\" : \"\"\n )}\n style={\n {\n ...coreTokenCSS,\n \"--font-primary\": fontPrimary,\n \"--font-secondary\": fontSecondary,\n fontFamily: fontPrimary,\n } as React.CSSProperties\n }\n >\n <div\n className={cn(\n \"flex flex-col gap-2 h-full\",\n widgetWidth === \"full\"\n ? \"w-full items-center\"\n : widgetWidth === \"custom\"\n ? \"w-full items-stretch\"\n : \"w-full max-w-[600px] items-center\"\n )}\n style={{\n ...(widgetWidth === \"custom\" && config.customWidth ? { width: config.customWidth } : {}),\n }}\n >\n {children}\n </div>\n </div>\n );\n}\n","import type { JSX } from \"react\";\n\ninterface AccountDetailsProps {\n userAddress?: string;\n}\n\nfunction shortenAddress(address?: string): string {\n if (!address) return \"Connect Wallet\";\n return `${address.slice(0, 10)}...${address.slice(-4)}`;\n}\n\nexport function AccountDetails({ userAddress }: AccountDetailsProps): JSX.Element {\n return (\n <div className=\"flex items-center justify-between rounded-full bg-secondary px-4 py-2 gap-3 border border-border cursor-pointer transition-colors hover:border-primary\">\n <span className=\"text-foreground font-medium text-sm\">{shortenAddress(userAddress)}</span>\n </div>\n );\n}\n\nexport default AccountDetails;\n","import type { JSX } from \"react\";\nimport { useState } from \"react\";\nimport { Select, SelectContent, SelectItem, SelectTrigger } from \"@turtleclub/ui\";\n\ninterface ChainOption {\n value: string;\n symbol: string;\n name: string;\n icon: string;\n chainId: number;\n}\n\nconst CHAINS: ChainOption[] = [\n {\n value: \"ethereum\",\n symbol: \"ETH\",\n name: \"Ethereum\",\n icon: \"https://assets.coingecko.com/coins/images/279/large/ethereum.png?1746019748\",\n chainId: 1,\n },\n {\n value: \"bitcoin\",\n symbol: \"BTC\",\n name: \"Bitcoin\",\n icon: \"https://assets.coingecko.com/coins/images/1/large/bitcoin.png?1747033579\",\n chainId: 0, // Bitcoin doesn't have a traditional chainId\n },\n {\n value: \"solana\",\n symbol: \"SOL\",\n name: \"Solana\",\n icon: \"https://assets.coingecko.com/coins/images/4128/large/solana.png?1640133422\",\n chainId: 0, // Solana doesn't use EVM chainIds\n },\n {\n value: \"polygon\",\n symbol: \"MATIC\",\n name: \"Polygon\",\n icon: \"https://assets.coingecko.com/coins/images/4713/large/polygon.png?1698233745\",\n chainId: 137,\n },\n {\n value: \"arbitrum\",\n symbol: \"ARB\",\n name: \"Arbitrum\",\n icon: \"https://assets.coingecko.com/coins/images/16547/large/photo_2023-03-29_21.47.00.jpeg?1680097313\",\n chainId: 42161,\n },\n];\n\ninterface ChainSelectorProps {\n selectedChainId?: number;\n onChainChange?: (chainId: number) => void;\n}\n\nexport function ChainSelector({\n selectedChainId = 1,\n onChainChange,\n}: ChainSelectorProps): JSX.Element {\n const [selectedChain, setSelectedChain] = useState<string>(\n CHAINS.find((chain) => chain.chainId === selectedChainId)?.value || CHAINS[0].value\n );\n const currentChain = CHAINS.find((chain) => chain.value === selectedChain) || CHAINS[0];\n\n const handleChainChange = (value: string) => {\n setSelectedChain(value);\n const chain = CHAINS.find((c) => c.value === value);\n if (chain) {\n onChainChange?.(chain.chainId);\n }\n };\n\n return (\n <div className=\"relative flex items-center h-10\">\n {/* Overlapped Chain Icon */}\n <span className=\"absolute left-0 top-1/2 -translate-y-1/2 z-10 flex items-center justify-center h-11 w-11 rounded-full ring-1 ring-primary/60 bg-background\">\n <img src={currentChain.icon} alt={currentChain.name} className=\"w-8 h-8 rounded-full\" />\n </span>\n\n {/* Select Component */}\n <Select value={selectedChain} onValueChange={handleChainChange}>\n <SelectTrigger className=\"flex items-center justify-between rounded-full bg-card pl-14 pr-3 gap-3 border border-border w-auto h-10 cursor-pointer transition-colors hover:border-primary focus:border-primary focus:ring-0\">\n <div className=\"flex items-center justify-end gap-2\">\n <span className=\"text-foreground font-medium text-sm\">{currentChain.symbol}</span>\n </div>\n </SelectTrigger>\n\n <SelectContent className=\"bg-card border-border rounded-lg w-[82%]\">\n {CHAINS.map((chain) => (\n <SelectItem\n key={chain.value}\n value={chain.value}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-secondary rounded-md transition-colors data-[state=checked]:bg-secondary data-[state=checked]:text-primary\"\n >\n <div className=\"flex items-center gap-2 w-full\">\n <img src={chain.icon} alt={chain.name} className=\"w-8 h-8 rounded-full\" />\n <div className=\"flex flex-col\">\n <span className=\"text-foreground font-medium text-sm\">{chain.symbol}</span>\n <span className=\"text-muted-foreground text-xs\">{chain.name}</span>\n </div>\n </div>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n );\n}\n","import React, { createContext, useContext } from \"react\";\nimport { Adapter } from \"../types\";\n\n// Crear el contexto\nconst AdapterContext = createContext<Adapter | null>(null);\n\n// Props del provider\ninterface AdapterProviderProps {\n adapter: Adapter;\n distributorId: string;\n children: React.ReactNode;\n}\n\n// Context para distributorId\nconst DistributorIdContext = createContext<string>(\"\");\n\n// Provider component\nexport const AdapterProvider: React.FC<AdapterProviderProps> = ({ adapter, distributorId, children }) => {\n return (\n <AdapterContext.Provider value={adapter}>\n <DistributorIdContext.Provider value={distributorId}>\n {children}\n </DistributorIdContext.Provider>\n </AdapterContext.Provider>\n );\n};\n\n// Hook principal para usar el adapter completo\nexport const useAdapter = (): Adapter => {\n const adapter = useContext(AdapterContext);\n if (!adapter) {\n throw new Error(\"useAdapter must be used within an AdapterProvider\");\n }\n return adapter;\n};\n\n// Hook para acceder al distributorId\nexport const useDistributorId = (): string => {\n const distributorId = useContext(DistributorIdContext);\n return distributorId; // Allow empty string, just ensure it's provided in context\n};\n\n// Hooks granulares para funcionalidades específicas\n\n// Wallet connection related\nexport const useWalletConnection = () => {\n const adapter = useAdapter();\n return {\n user: adapter.user,\n network: adapter.network,\n isConnected: !!adapter.user,\n openConnectionModal: adapter.openConnectionModal,\n };\n};\n\n// Transaction related methods\nexport const useTransactionMethods = () => {\n const adapter = useAdapter();\n return {\n sendTransaction: adapter.sendTransaction,\n signMessage: adapter.signMessage,\n changeNetwork: adapter.changeNetwork,\n };\n};\n\n// Network operations\nexport const useNetworkMethods = () => {\n const adapter = useAdapter();\n return {\n network: adapter.network,\n changeNetwork: adapter.changeNetwork,\n };\n};","import type { JSX } from \"react\";\nimport { AccountDetails } from \"./account-details\";\nimport { ChainSelector } from \"./chain-selector\";\nimport { useAdapter } from \"../../context/adapter-context\";\n\nexport function WalletSection(): JSX.Element {\n // Get state directly from adapter\n const adapter = useAdapter();\n const userAddress = adapter.user;\n const walletConnected = !!adapter.user;\n const selectedChainId = adapter.network;\n\n const handleChainChange = async (chainId: number): Promise<void> => {\n try {\n await adapter.changeNetwork(chainId);\n } catch (error) {\n console.error(\"Failed to change network:\", error);\n }\n };\n\n return (\n <div className=\"flex w-full items-center justify-between gap-4\">\n {/* Wallet Address Display - Only show when connected */}\n {walletConnected && userAddress && <AccountDetails userAddress={userAddress} />}\n\n {/* Chain Selector */}\n <ChainSelector selectedChainId={selectedChainId} onChainChange={handleChainChange} />\n </div>\n );\n}\n","/**\n * Parse a string amount to a BigInt given decimals\n * Equivalent to viem's parseUnits but without the dependency\n */\nexport function parseUnits(value: string, decimals: number): bigint {\n const [integer, fraction = ''] = value.split('.');\n \n // Pad fraction to match decimals\n const paddedFraction = fraction.padEnd(decimals, '0').slice(0, decimals);\n \n // Combine integer and fraction\n const combinedValue = integer + paddedFraction;\n \n return BigInt(combinedValue);\n}\n\n/**\n * Format a BigInt to a string given decimals\n * Equivalent to viem's formatUnits but without the dependency\n */\nexport function formatUnits(value: bigint, decimals: number): string {\n const valueStr = value.toString();\n \n if (decimals === 0) {\n return valueStr;\n }\n \n // If the value is smaller than the decimal places, pad with zeros\n const paddedValue = valueStr.padStart(decimals + 1, '0');\n \n const integerPart = paddedValue.slice(0, -decimals) || '0';\n const fractionalPart = paddedValue.slice(-decimals);\n \n // Remove trailing zeros from fractional part\n const trimmedFractional = fractionalPart.replace(/0+$/, '');\n \n if (trimmedFractional === '') {\n return integerPart;\n }\n \n return `${integerPart}.${trimmedFractional}`;\n}","import { atom, useAtom } from \"jotai\";\nimport type { EarnRouteOptions } from \"@turtleclub/api\";\nimport type { DealFormatted, Token } from \"../types/deals\";\nimport { parseUnits } from \"../utils/format\";\n\n// Complete parameters needed for useEarnRoute\nexport interface EarnRouteParams {\n // Core EarnRouteOptions parameters\n user: string;\n chain: number;\n slippage: number;\n tokenIn: string;\n tokenOut: string;\n amount: string;\n distributor_id: string;\n id?: string;\n \n // Additional widget-specific state\n selectedDeal: DealFormatted | null;\n selectedToken: Token | null;\n distributorId: string;\n resetTrigger: number;\n}\n\n// Default state for earn route parameters\nconst defaultEarnRouteParams: EarnRouteParams = {\n user: \"\",\n chain: 1,\n slippage: 0.5, // 0.5%\n tokenIn: \"\",\n tokenOut: \"\",\n amount: \"\",\n distributor_id: \"\",\n id: undefined,\n selectedDeal: null,\n selectedToken: null,\n distributorId: \"2c86d3a1-cfe8-486d-915d-1b9ff5e924e9\", // TODO: Update with turtle distributor id\n resetTrigger: 0,\n};\n\n// Main consolidated atom for all earn route parameters\nexport const earnRouteParamsAtom = atom<EarnRouteParams>(defaultEarnRouteParams);\n\n// Derived atom that provides parameters in the format expected by useEarnRoute\nexport const earnRouteOptionsAtom = atom<EarnRouteOptions | undefined>((get) => {\n const params = get(earnRouteParamsAtom);\n \n // Only return options if we have the minimum required parameters including selectedToken for decimals\n if (!params.user || !params.tokenIn || !params.tokenOut || !params.amount || !params.selectedToken) {\n return undefined;\n }\n \n // Convert amount from user format to wei\n const amountInWei = parseUnits(params.amount, params.selectedToken.decimals).toString();\n \n return {\n user: params.user,\n chain: params.chain,\n slippage: params.slippage,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amount: amountInWei, // Send in wei format\n referral: params.distributor_id,\n id: params.id,\n };\n});\n\n// Granular derived atoms for individual parameter access and updates\nexport const depositValueAtom = atom(\n (get) => get(earnRouteParamsAtom).amount,\n (get, set, amount: string) => {\n const current = get(earnRouteParamsAtom);\n set(earnRouteParamsAtom, { ...current, amount });\n }\n);\n\nexport const selectedDealAtom = atom(\n (get) => get(earnRouteParamsAtom).selectedDeal,\n (get, set, selectedDeal: DealFormatted | null) => {\n const current = get(earnRouteParamsAtom);\n set(earnRouteParamsAtom, { \n ...current, \n selectedDeal,\n // Update tokenOut when deal changes\n tokenOut: selectedDeal?.tokenAddress || \"\",\n });\n }\n);\n\nexport const selectedTokenAtom = atom(\n (get) => get(earnRouteParamsAtom).selectedToken,\n (get, set, selectedToken: Token | null) => {\n const current = get(earnRouteParamsAtom);\n set(earnRouteParamsAtom, { \n ...current, \n selectedToken,\n // Update tokenIn when token changes\n tokenIn: selectedToken?.address || \"\",\n });\n }\n);\n\nexport const slippageAtom = atom(\n (get) => get(earnRouteParamsAtom).slippage,\n (get, set, slippage: number) => {\n const current = get(earnRouteParamsAtom);\n set(earnRouteParamsAtom, { ...current, slippage });\n }\n);\n\nexport const resetTriggerAtom = atom(\n (get) => get(earnRouteParamsAtom).resetTrigger,\n (get, set, resetTrigger: number) => {\n const current = get(earnRouteParamsAtom);\n set(earnRouteParamsAtom, { ...current, resetTrigger });\n }\n);\n\nexport const distributorIdAtom = atom(\n (get) => get(earnRouteParamsAtom).distributorId,\n (get, set, distributorId: string) => {\n const current = get(earnRouteParamsAtom);\n set(earnRouteParamsAtom, { ...current, distributorId, distributor_id: distributorId });\n }\n);\n\n// Computed atoms for validation and state\nexport const isRouteReadyAtom = atom((get) => {\n const params = get(earnRouteParamsAtom);\n return !!(\n params.user &&\n params.tokenIn &&\n params.tokenOut &&\n params.amount &&\n params.selectedToken &&\n parseFloat(params.amount) > 0\n );\n});\n\n// Hook to update multiple parameters at once \nexport const useEarnRouteParamsUpdate = () => {\n const [, setParams] = useAtom(earnRouteParamsAtom);\n \n return (updates: Partial<EarnRouteParams>) => {\n setParams((current: EarnRouteParams) => ({ ...current, ...updates }));\n };\n};\n\n// Reset function for clearing state\nexport const resetEarnRouteParamsAtom = atom(null, (get, set) => {\n const current = get(earnRouteParamsAtom);\n set(earnRouteParamsAtom, {\n ...defaultEarnRouteParams,\n // Preserve user and chain when resetting\n user: current.user,\n chain: current.chain,\n distributorId: current.distributorId,\n distributor_id: current.distributor_id,\n resetTrigger: current.resetTrigger + 1,\n });\n});","import { useEarnDeals as useEarnDealsOriginal } from \"@turtleclub/hooks\";\nimport type { DealFormatted } from \"../types/deals\";\n\ninterface UseEarnDealsResult {\n deals: DealFormatted[];\n isLoading: boolean;\n error: Error | null;\n}\n\nconst KATANA_CAMPAIGN = \"2c86d3a1-cfe8-486d-915d-1b9ff5e924e9\";\n\n/**\n * Wrapper hook for @turtleclub/hooks useEarnDeals\n * Provides compatibility with widget's expected interface\n */\nexport function useEarnDeals(): UseEarnDealsResult {\n // TODO: Implement campaign and deals filtering\n const { data, isLoading, error } = useEarnDealsOriginal({ campaignId: KATANA_CAMPAIGN });\n\n // Transform real API data to match widget's expected format\n const deals: DealFormatted[] =\n data?.deals?.map((deal) => ({\n id: deal.metadata.id,\n tokenAddress: deal.token.address,\n tokenName: deal.token.symbol,\n tvl: deal.data.tvl,\n iconToken: deal.token.logos[0] || \"\",\n iconDeal: deal.metadata.iconUrl,\n yieldPercentage: deal.data.apy,\n })) || [];\n\n return {\n deals,\n isLoading,\n error: error as Error | null,\n };\n}\n","import { useAtomValue, useSetAtom } from \"jotai\";\nimport { useEffect } from \"react\";\nimport { selectedDealAtom } from \"../store/earn-route-atom\";\nimport { useEarnDeals } from \"./useEarnDeals\";\n\nexport function useAutoSelectDeal() {\n const setDealSelected = useSetAtom(selectedDealAtom);\n const dealSelected = useAtomValue(selectedDealAtom);\n\n const { deals, isLoading, error } = useEarnDeals();\n\n // Auto-select the first deal when deals are loaded\n useEffect(() => {\n if (deals.length > 0 && !dealSelected) {\n setDealSelected(deals[0]);\n }\n }, [deals, dealSelected, setDealSelected]);\n\n return {\n deals,\n dealsFormatted: deals, // For backward compatibility\n isLoading,\n error,\n selectedDeal: dealSelected,\n };\n}\n","export function toNumber(value?: string | number, def = 0): number {\n if (value === undefined) {\n return def;\n }\n\n try {\n const val = Number.parseFloat(value.toString());\n\n if (Number.isNaN(val)) {\n return def;\n }\n\n return val;\n } catch (e: unknown) {\n // eslint-disable-next-line unused-imports/no-unused-vars\n return def;\n }\n}\n\nexport function min(...vals: number[]): number {\n let smallest = Number.MAX_VALUE;\n\n for (const val of vals) {\n if (val >= smallest) {\n continue;\n }\n\n smallest = val;\n }\n\n return smallest;\n}\n\nexport function max(...vals: number[]): number {\n let biggest = -Number.MAX_VALUE;\n\n for (const val of vals) {\n if (val <= biggest) {\n continue;\n }\n\n biggest = val;\n }\n\n return biggest;\n}\n","import { formatUnits } from \"viem\";\nimport { min, toNumber } from \"./number\";\n\nexport function removeZeros(val: string | number): string {\n const str = val.toString();\n const parts = str.split(\".\");\n\n if (parts.length < 2) return str;\n\n const [start, decimals] = parts;\n\n let depth = decimals.length;\n\n for (let i = decimals.length - 1; i >= 0; i--) {\n if (decimals[i] !== \"0\") break;\n\n depth--;\n }\n\n const newDecimals = decimals.slice(0, depth);\n\n return `${start}${newDecimals.length > 0 ? `.${newDecimals}` : \"\"}`;\n}\n\nconst magnitudeMap = [\n \"k\",\n \"m\",\n \"b\",\n \"t\",\n \"q\",\n \"qq\",\n \"qqq\",\n \"qqqq\",\n \"qqqqq\",\n \"qqqqqq\",\n \"qqqqqqq\",\n \"qqqqqqqq\",\n];\n\nexport function numberScale(val: string | number, decimals: number): [number, string] {\n const num = toNumber(val);\n const magnitude = Math.floor(min(Math.log10(num) / 3, magnitudeMap.length));\n if (magnitude < 1) {\n return [num, \"\"] as const;\n }\n return [\n Number.parseFloat((num / 10 ** (magnitude * 3)).toFixed(decimals)),\n magnitudeMap[magnitude - 1],\n ] as const;\n}\n\nexport function formatNumber(\n val: string | number,\n decimals = 2,\n doScale = false,\n zeros = true\n): string {\n if (typeof val === \"string\") {\n val = toNumber(val);\n }\n\n val = val.toFixed(decimals);\n\n let [value, suffix] = [val, \"\"];\n\n if (doScale) {\n let new_value;\n [new_value, suffix] = numberScale(val, decimals);\n value = new_value.toString();\n }\n\n let result = `${value.replace(/\\B(?<!\\.\\d*)(?=(\\d{3})+(?!\\d))/g, \",\")}${suffix}`;\n\n if (!zeros) {\n result = removeZeros(result);\n }\n\n return result;\n}\n\nexport function formatToken(\n amount: string,\n token: { decimals: number },\n doScale = false,\n zeros = false,\n decimals = 9\n): string {\n const amountBigInt = BigInt(amount);\n const stringAmount = formatUnits(amountBigInt, token.decimals);\n\n return `${formatNumber(stringAmount, decimals ?? token.decimals / 2, doScale, zeros)}`;\n}\n\nexport function formatAddress(address: string): string {\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n","import type { Token as WidgetToken, DealFormatted } from '../types';\nimport type { Token as UIToken, OpportunityItemProps } from '@turtleclub/ui';\n\n/**\n * Converts widget Token to UI molecule Token\n */\nexport function widgetTokenToUIToken(token: WidgetToken): UIToken {\n return {\n icon: token.logo ? (\n <img src={token.logo} alt={token.symbol} className=\"w-4 h-4 rounded-full\" />\n ) : (\n <div className=\"w-4 h-4 rounded-full bg-muted flex items-center justify-center text-xs\">\n {token.symbol.charAt(0)}\n </div>\n ),\n symbol: token.symbol,\n address: token.address,\n };\n}\n\n/**\n * Converts array of widget tokens to UI molecule tokens\n */\nexport function widgetTokensToUITokens(tokens: WidgetToken[]): UIToken[] {\n return tokens.map(widgetTokenToUIToken);\n}\n\n/**\n * Converts widget DealFormatted to UI molecule OpportunityItemProps\n */\nexport function dealToOpportunityItem(deal: DealFormatted): OpportunityItemProps {\n return {\n icon: deal.iconDeal ? (\n <img src={deal.iconDeal} alt={deal.tokenName} className=\"w-8 h-8 rounded-full\" />\n ) : (\n <div className=\"w-8 h-8 rounded-full bg-muted flex items-center justify-center text-sm\">\n {deal.tokenName.charAt(0)}\n </div>\n ),\n name: deal.tokenName,\n tvl: formatTVL(deal.tvl),\n yield: `${deal.yieldPercentage}%`,\n };\n}\n\n/**\n * Converts array of deals to opportunity items\n */\nexport function dealsToOpportunityItems(deals: DealFormatted[]): OpportunityItemProps[] {\n return deals.map(dealToOpportunityItem);\n}\n\n/**\n * Formats TVL number to readable string\n */\nfunction formatTVL(tvl: number): string {\n if (tvl >= 1e9) {\n return `$${(tvl / 1e9).toFixed(1)}B`;\n } else if (tvl >= 1e6) {\n return `$${(tvl / 1e6).toFixed(1)}M`;\n } else if (tvl >= 1e3) {\n return `$${(tvl / 1e3).toFixed(1)}K`;\n }\n return `$${tvl.toFixed(0)}`;\n}\n\n/**\n * Formats number to USD string\n */\nexport function formatUSDValue(value: number): string {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(value);\n}\n\n/**\n * Formats balance string with proper decimals\n */\nexport function formatBalance(balance: string, decimals: number = 4): string {\n const num = parseFloat(balance);\n if (isNaN(num)) return \"0\";\n \n if (num >= 1e6) {\n return `${(num / 1e6).toFixed(1)}M`;\n } else if (num >= 1e3) {\n return `${(num / 1e3).toFixed(1)}K`;\n }\n \n return num.toFixed(decimals);\n}","import type { JSX } from \"react\";\nimport { useAtom, useAtomValue } from \"jotai\";\nimport { useEffect } from \"react\";\nimport { formatNumber, formatToken } from \"@turtleclub/utils\";\nimport { useEarnWalletBalances } from \"@turtleclub/hooks\";\nimport {\n selectedTokenAtom,\n depositValueAtom,\n resetTriggerAtom,\n} from \"../../store/earn-route-atom\";\nimport { SwapInput } from \"@turtleclub/ui\";\nimport { widgetTokensToUITokens, formatUSDValue } from \"../../adapters\";\nimport { useAdapter } from \"../../context/adapter-context\";\n\nexport function SwapInputWrapper(): JSX.Element {\n // Get state directly from adapter\n const adapter = useAdapter();\n const userAddress = adapter.user;\n const walletConnected = !!adapter.user;\n\n const { data: balances } = useEarnWalletBalances(\n userAddress && walletConnected\n ? {\n chain: 1,\n user: userAddress,\n }\n : undefined\n );\n\n const [selectedToken, setSelectedToken] = useAtom(selectedTokenAtom);\n const [amount, setAmount] = useAtom(depositValueAtom);\n const resetTrigger = useAtomValue(resetTriggerAtom);\n\n // Auto-select first token when balances load or when component mounts\n useEffect(() => {\n if (!selectedToken) {\n if (balances?.balances && balances.balances.length > 0) {\n // Use real token from wallet\n const firstBalance = balances.balances[0];\n setSelectedToken({\n address: firstBalance.token.address,\n name: firstBalance.token.name,\n symbol: firstBalance.token.symbol,\n decimals: firstBalance.token.decimals,\n logo: firstBalance.token.logos?.[0],\n balance: firstBalance.amount,\n price: firstBalance.token.price ?? undefined,\n });\n } else {\n // Use default token when no wallet or loading\n const firstDefault = defaultTokens[0];\n setSelectedToken({\n address: firstDefault.address,\n name: firstDefault.name,\n symbol: firstDefault.symbol,\n decimals: firstDefault.decimals,\n logo: firstDefault.logo,\n balance: firstDefault.balance,\n price: firstDefault.price,\n });\n }\n }\n }, [balances, selectedToken, setSelectedToken]);\n\n // Reset amount when token changes\n useEffect(() => {\n setAmount(\"\");\n }, [selectedToken]);\n\n // Reset amount when reset trigger changes\n useEffect(() => {\n if (resetTrigger > 0) {\n setAmount(\"\");\n }\n }, [resetTrigger]);\n\n const handleMaxClick = (): void => {\n if (selectedToken) {\n // If no real balance, use \"0\" but still allow interaction\n const balance = selectedToken.balance === \"0\" ? \"0\" : selectedToken.balance;\n const maxAmount = formatToken(balance, selectedToken);\n // Format to max 5 decimals using utils\n const formattedAmount = formatNumber(maxAmount, 5, false, false);\n setAmount(formattedAmount);\n }\n };\n\n const formattedBalance = selectedToken\n ? formatNumber(\n formatToken(selectedToken.balance, selectedToken),\n 5,\n false,\n false\n )\n : \"0\";\n\n // Default tokens to show when no wallet is connected or loading\n const defaultTokens = [\n {\n address: \"0x0000000000000000000000000000000000000000\",\n name: \"Ethereum\",\n symbol: \"ETH\",\n decimals: 18,\n logo: undefined,\n balance: \"0\",\n price: 0, // Realistic ETH price\n },\n ];\n\n // Convert wallet balances to UI tokens or use defaults\n const availableTokens = balances?.balances\n ? balances.balances.map((balance) => ({\n address: balance.token.address,\n name: balance.token.name,\n symbol: balance.token.symbol,\n decimals: balance.token.decimals,\n logo: balance.token.logos?.[0],\n balance: balance.amount,\n price: balance.token.price ?? undefined,\n }))\n : defaultTokens;\n\n const uiTokens = widgetTokensToUITokens(availableTokens);\n\n // Check if amount exceeds balance\n const amountNumber = parseFloat(amount) || 0;\n const balanceNumber = selectedToken\n ? parseFloat(formatToken(selectedToken.balance, selectedToken))\n : 0;\n const hasInsufficientBalance = amountNumber > balanceNumber && walletConnected;\n\n // Calculate USD value or show insufficient balance message\n const usdValue =\n selectedToken && amount\n ? hasInsufficientBalance\n ? \"Insufficient balance\"\n : formatUSDValue(parseFloat(amount) * (selectedToken.price || 0))\n : undefined;\n\n return (\n <div className=\"w-full flex flex-col gap-2 items-start justify-start\">\n <h3 className=\"text-md font-medium\">Deposit</h3>\n <div className=\"w-full relative\">\n <SwapInput\n value={amount}\n onChange={setAmount}\n tokens={uiTokens}\n selectedToken={selectedToken?.address}\n onTokenChange={(tokenAddress) => {\n // Try to find in real balances first\n const tokenBalance = balances?.balances?.find((b) => b.token.address === tokenAddress);\n if (tokenBalance) {\n setSelectedToken({\n address: tokenBalance.token.address,\n name: tokenBalance.token.name,\n symbol: tokenBalance.token.symbol,\n decimals: tokenBalance.token.decimals,\n logo: tokenBalance.token.logos?.[0],\n balance: tokenBalance.amount,\n price: tokenBalance.token.price ?? undefined,\n });\n } else {\n // Fallback to default tokens\n const defaultToken = defaultTokens.find((t) => t.address === tokenAddress);\n if (defaultToken) {\n setSelectedToken({\n address: defaultToken.address,\n name: defaultToken.name,\n symbol: defaultToken.symbol,\n decimals: defaultToken.decimals,\n logo: defaultToken.logo,\n balance: defaultToken.balance,\n price: defaultToken.price,\n });\n }\n }\n }}\n usdValue={hasInsufficientBalance ? undefined : usdValue}\n balance={formattedBalance}\n onMaxClick={handleMaxClick}\n placeholder={walletConnected ? \"0\" : \"Connect wallet to continue\"}\n disabled={!walletConnected}\n className={`w-full [&_button]:w-32 [&_button]:min-w-32 ${hasInsufficientBalance ? \"border-destructive/50\" : \"\"}`}\n />\n {/* Custom error message overlay for insufficient balance */}\n {hasInsufficientBalance && (\n <div className=\"absolute bottom-3 left-4 text-sm text-destructive\">\n Insufficient balance\n </div>\n )}\n </div>\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport { useSetAtom } from \"jotai\";\nimport type { DealFormatted } from \"../../types/deals\";\nimport { showPanelAtom } from \"../../store/atoms\";\nimport { selectedDealAtom } from \"../../store/earn-route-atom\";\nimport { OpportunityItem } from \"@turtleclub/ui\";\nimport { dealToOpportunityItem } from \"../../adapters\";\n\ninterface OpportunityProps extends DealFormatted {\n showPanelOnClick?: boolean;\n onAnimatedClose?: () => void;\n className?: string;\n}\n\nexport function Opportunity({\n tokenName,\n tvl,\n iconToken,\n yieldPercentage,\n iconDeal,\n id,\n tokenAddress,\n showPanelOnClick = false,\n onAnimatedClose,\n className,\n}: OpportunityProps): JSX.Element {\n const setShowPanel = useSetAtom(showPanelAtom);\n const setDealSelected = useSetAtom(selectedDealAtom);\n\n const handleClick = (): void => {\n setDealSelected({\n tokenName,\n tvl,\n iconToken,\n yieldPercentage,\n iconDeal,\n id,\n tokenAddress,\n });\n\n if (showPanelOnClick) {\n setShowPanel(true);\n } else if (onAnimatedClose) {\n onAnimatedClose();\n } else {\n setShowPanel(false);\n }\n };\n\n // Convert DealFormatted to OpportunityItemProps\n const opportunityItemProps = dealToOpportunityItem({\n tokenName,\n tvl,\n iconToken,\n yieldPercentage,\n iconDeal,\n id,\n tokenAddress,\n });\n\n return (\n <OpportunityItem\n {...opportunityItemProps}\n onSelect={handleClick}\n className={className}\n />\n );\n}\n","import React from \"react\";\nimport type { JSX } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { useWidgetStyles } from \"../../hooks/useWidgetStyles\";\nimport { Card } from \"@turtleclub/ui\";\n\n// eslint-disable-next-line no-undef\nexport interface WidgetContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n className?: string;\n padding?: \"none\" | \"sm\" | \"default\" | \"md\" | \"lg\";\n rounding?: \"none\" | \"sm\" | \"default\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n variant: \"container\" | \"simple\" | \"item\";\n asChild?: boolean;\n}\n\nexport function WidgetContainer({\n children,\n className,\n variant,\n padding,\n rounding,\n ...props\n}: WidgetContainerProps): JSX.Element {\n const { padding: configPadding, rounding: configRounding } = useWidgetStyles();\n\n // Use config values if not explicitly provided via props\n const finalPadding = padding ?? configPadding;\n const finalRounded = rounding ?? configRounding;\n\n return (\n <Card\n className={cn(className)}\n {...props}\n variant={variant}\n padding={finalPadding}\n rounded={finalRounded}\n >\n {children}\n </Card>\n );\n}\n","import type { JSX } from \"react\";\nimport { useAtomValue } from \"jotai\";\nimport { selectedDealAtom } from \"../../store/earn-route-atom\";\nimport { Opportunity } from \"../ui/opportunity\";\nimport { WidgetContainer } from \"../ui/widget-container\";\n\nexport function Earn(): JSX.Element {\n const dealSelected = useAtomValue(selectedDealAtom);\n\n return (\n <div className=\"w-full flex flex-col gap-2 items-start justify-start\">\n <h3 className=\"text-sm font-medium text-foreground\">Earn</h3>\n\n {/* Fixed OpportunityItem */}\n {dealSelected ? (\n <Opportunity {...dealSelected} showPanelOnClick={true} />\n ) : (\n <OpportunitySkeleton />\n )}\n </div>\n );\n}\n\nfunction OpportunitySkeleton(): JSX.Element {\n return (\n <WidgetContainer variant=\"simple\" className=\"w-full animate-pulse\">\n <div className=\"flex justify-between items-center p-1\">\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex gap-2 items-center justify-start\">\n <div className=\"w-7 h-7 bg-muted rounded-full\"></div>\n <div className=\"w-24 h-5 bg-muted rounded\"></div>\n </div>\n <div className=\"w-32 h-4 bg-muted rounded\"></div>\n </div>\n <div className=\"w-16 h-8 bg-muted rounded\"></div>\n </div>\n </WidgetContainer>\n );\n}\n\n","import { useState, useCallback, useEffect, useRef, useMemo } from \"react\";\nimport type { EarnRouteResponse, EarnRouteStep } from \"../types/earn-route\";\n\n/**\n * useTransactionQueue Hook\n * \n * Manages the execution of multiple blockchain transactions in sequence.\n * Key features:\n * - Maintains a queue of transaction steps from an EarnRoute\n * - Executes transactions one by one with proper state management\n * - Auto-triggers the next transaction after the previous one completes\n * - Handles errors, user cancellations, and retry logic\n * \n * Auto-trigger logic:\n * 1. After a transaction completes, the hook updates currentIndex to point to the next step\n * 2. A useEffect monitors state changes and checks if:\n * - The previous step (currentIndex - 1) is completed\n * - The current step hasn't been executed yet\n * - There are no ongoing executions\n * 3. If conditions are met, it automatically triggers the next transaction after a 1s delay\n * 4. This continues until all transactions in the queue are completed\n */\n\nexport interface TransactionStep {\n id: string;\n label: string;\n description: string;\n txData: {\n to: string;\n data: string;\n value?: string;\n gasLimit?: string;\n };\n completed: boolean;\n current: boolean;\n txHash?: string;\n error?: string;\n}\n\nexport interface TransactionQueueState {\n steps: TransactionStep[];\n currentIndex: number;\n isExecuting: boolean;\n allCompleted: boolean;\n hasError: boolean;\n cancelled: boolean;\n error?: string;\n}\n\ninterface UseTransactionQueueProps {\n earnRoute: EarnRouteResponse | null;\n userAddress?: string;\n sendTransaction: (transaction: any) => Promise<string>;\n onError?: (error: Error) => void;\n onSuccess?: (txHash: string) => void;\n}\n\nexport function useTransactionQueue({\n earnRoute,\n userAddress,\n sendTransaction,\n onError = () => {},\n onSuccess = () => {},\n}: UseTransactionQueueProps) {\n const [state, setState] = useState<TransactionQueueState>({\n steps: [],\n currentIndex: 0,\n isExecuting: false,\n allCompleted: false,\n hasError: false,\n cancelled: false,\n });\n\n const memoizedEarnRoute = useMemo(() => {\n if (!earnRoute) return null;\n\n // Create a stable reference by serializing and checking key properties\n const stepsKey =\n earnRoute.steps?.map((step) => `${step.id}-${step.to}-${step.data}`).join(\"|\") || \"\";\n return {\n ...earnRoute,\n _stepsKey: stepsKey, // Add internal key for comparison\n };\n }, [\n earnRoute?.success,\n earnRoute?.estimatedGas,\n earnRoute?.estimatedTime,\n earnRoute?.outputAmount,\n // Serialize steps to create stable dependency\n earnRoute?.steps?.map((step) => `${step.id}-${step.to}-${step.data}`).join(\"|\"),\n ]);\n\n // Initialize steps when earnRoute changes\n useEffect(() => {\n if (memoizedEarnRoute && memoizedEarnRoute.success && memoizedEarnRoute.steps.length > 0) {\n const newSteps = memoizedEarnRoute.steps.map((step: EarnRouteStep, index: number) => ({\n id: step.id,\n label: step.title,\n description: step.description,\n txData: {\n to: step.to,\n data: step.data,\n value: step.value,\n gasLimit: step.gasLimit,\n },\n completed: false,\n current: index === 0, // First step is current initially\n }));\n\n setState({\n steps: newSteps,\n currentIndex: 0,\n isExecuting: false,\n allCompleted: false,\n hasError: false,\n cancelled: false,\n });\n } else {\n setState({\n steps: [],\n currentIndex: 0,\n isExecuting: false,\n allCompleted: false,\n hasError: false,\n cancelled: false,\n });\n }\n }, [memoizedEarnRoute]);\n\n // Keep refs for stable access to current values\n const stateRef = useRef(state);\n const callbacksRef = useRef({ userAddress, sendTransaction, onError, onSuccess });\n\n // Update refs when values change\n useEffect(() => {\n stateRef.current = state;\n }, [state]);\n\n useEffect(() => {\n callbacksRef.current = { userAddress, sendTransaction, onError, onSuccess };\n }, [userAddress, sendTransaction, onError, onSuccess]);\n\n // Execute current transaction\n const executeCurrentTransaction = useCallback(async () => {\n const currentState = stateRef.current;\n const {\n userAddress: currentUserAddress,\n sendTransaction: currentSendTransaction,\n onError: currentOnError,\n onSuccess: currentOnSuccess,\n } = callbacksRef.current;\n\n if (!currentUserAddress || !currentSendTransaction || currentState.isExecuting) {\n return;\n }\n\n const currentStep = currentState.steps[currentState.currentIndex];\n if (!currentStep || currentStep.completed) {\n return;\n }\n\n setState((prev) => ({\n ...prev,\n isExecuting: true,\n hasError: false,\n cancelled: false,\n error: undefined,\n }));\n\n try {\n const txHash = await currentSendTransaction({\n to: currentStep.txData.to as `0x${string}`,\n data: currentStep.txData.data as `0x${string}`,\n value: currentStep.txData.value ? BigInt(currentStep.txData.value) : undefined,\n chainId: 1, // TODO: Get from context\n });\n\n // Extract final hash immediately\n const finalTxHash =\n typeof txHash === \"object\" && \"hash\" in txHash ? txHash.hash : String(txHash);\n\n // Update step with txHash immediately (before waiting for confirmation)\n setState((prev) => {\n const updatedSteps = [...prev.steps];\n updatedSteps[prev.currentIndex] = {\n ...updatedSteps[prev.currentIndex],\n txHash: finalTxHash,\n };\n return {\n ...prev,\n steps: updatedSteps,\n };\n });\n\n // Wait for transaction confirmation on-chain\n try {\n if (typeof txHash === \"object\" && \"wait\" in txHash) {\n await txHash.wait();\n }\n } catch (waitError) {\n console.warn(\"Could not wait for transaction confirmation, proceeding anyway:\", waitError);\n }\n\n // Update current step as completed\n setState((prev) => {\n const updatedSteps = [...prev.steps];\n\n updatedSteps[prev.currentIndex] = {\n ...updatedSteps[prev.currentIndex],\n completed: true,\n current: false,\n };\n\n const nextIndex = prev.currentIndex + 1;\n const isLastStep = nextIndex >= updatedSteps.length;\n\n // Mark next step as current if exists\n if (!isLastStep) {\n updatedSteps[nextIndex] = {\n ...updatedSteps[nextIndex],\n current: true,\n };\n }\n\n const allCompleted = isLastStep;\n\n // Call success callback if all completed\n if (allCompleted && currentOnSuccess) {\n currentOnSuccess();\n }\n\n const newState = {\n ...prev,\n steps: updatedSteps,\n currentIndex: isLastStep ? prev.currentIndex : nextIndex,\n isExecuting: false,\n allCompleted,\n };\n \n return newState;\n });\n } catch (error) {\n\n // Check if error is user rejection/cancellation\n const errorMessage = error instanceof Error ? error.message : String(error);\n const isUserRejection =\n errorMessage.toLowerCase().includes(\"user rejected\") ||\n errorMessage.toLowerCase().includes(\"user denied\") ||\n errorMessage.toLowerCase().includes(\"user cancelled\") ||\n errorMessage.toLowerCase().includes(\"cancelled by user\") ||\n errorMessage.toLowerCase().includes(\"transaction rejected\") ||\n errorMessage.includes(\"4001\"); // MetaMask user rejection code\n\n setState((prev) => ({\n ...prev,\n isExecuting: false,\n hasError: !isUserRejection,\n cancelled: isUserRejection,\n error: isUserRejection\n ? \"Transaction cancelled by user\"\n : error instanceof Error\n ? error.message\n : \"Transaction failed\",\n }));\n\n if (currentOnError && !isUserRejection) {\n currentOnError(error instanceof Error ? error : new Error(\"Transaction failed\"));\n }\n }\n }, []);\n\n // Reset queue to initial state\n const resetQueue = useCallback(() => {\n if (memoizedEarnRoute && memoizedEarnRoute.success && memoizedEarnRoute.steps.length > 0) {\n const newSteps = memoizedEarnRoute.steps.map((step: EarnRouteStep, index: number) => ({\n id: step.id,\n label: step.title,\n description: step.description,\n txData: {\n to: step.to,\n data: step.data,\n value: step.value,\n gasLimit: step.gasLimit,\n },\n completed: false,\n current: index === 0, // First step is current initially\n }));\n\n setState({\n steps: newSteps,\n currentIndex: 0,\n isExecuting: false,\n allCompleted: false,\n hasError: false,\n cancelled: false,\n });\n }\n }, [memoizedEarnRoute]);\n\n // Get current step\n const currentStep = state.steps[state.currentIndex] || null;\n\n // Check if ready to execute (has steps and user connected)\n const canExecute = !!(\n userAddress &&\n state.steps.length > 0 &&\n !state.isExecuting &&\n !state.allCompleted &&\n !state.cancelled\n );\n\n // Auto-execute next transaction when current one completes (only for multi-step transactions)\n useEffect(() => {\n // Only proceed if we have multiple steps\n if (state.steps.length <= 1) return;\n \n // Check if we should auto-execute the next transaction:\n // 1. Previous step must be completed (we just finished a transaction)\n // 2. Current step must not be started yet (we haven't executed it)\n // 3. We must not be currently executing another transaction\n // 4. The entire queue must not be completed or cancelled\n const previousStepIndex = state.currentIndex - 1;\n const previousStepCompleted = previousStepIndex >= 0 && state.steps[previousStepIndex]?.completed;\n const currentStepNotStarted = state.currentIndex < state.steps.length && !state.steps[state.currentIndex]?.completed;\n const hasNextStep = state.currentIndex < state.steps.length;\n \n const shouldAutoExecute = previousStepCompleted && currentStepNotStarted && hasNextStep && !state.isExecuting && !state.allCompleted && !state.cancelled;\n \n if (shouldAutoExecute) {\n // Delay execution to allow UI to update and show transaction status\n const timer = setTimeout(() => {\n executeCurrentTransaction();\n }, 1000);\n return () => clearTimeout(timer);\n }\n }, [state.steps, state.currentIndex, state.isExecuting, state.allCompleted, state.cancelled, executeCurrentTransaction]);\n\n return {\n ...state,\n currentStep,\n canExecute,\n executeCurrentTransaction,\n resetQueue,\n totalSteps: state.steps.length,\n completedSteps: state.steps.filter((step) => step.completed).length,\n progress:\n state.steps.length > 0\n ? (state.steps.filter((step) => step.completed).length / state.steps.length) * 100\n : 0,\n };\n}\n","import { useEarnRoute as useEarnRouteOriginal } from \"@turtleclub/hooks\";\nimport type { EarnRouteOptions, EarnRouteResponse } from \"../types/earn-route\";\n\n/**\n * Wrapper hook for @turtleclub/hooks useEarnRoute\n * Provides compatibility with widget's expected interface\n */\nexport function useEarnRoute(options?: EarnRouteOptions) {\n const enabled =\n options !== undefined && !!options.user && !!options.amount && parseFloat(options.amount) > 0;\n\n const { data, isLoading, error } = useEarnRouteOriginal(\n enabled\n ? {\n user: options!.user,\n chain: options!.chain || 1,\n tokenIn: options!.tokenIn,\n tokenOut: options!.tokenOut,\n amount: options!.amount,\n slippage: options!.slippage || 0.1,\n referral: options!.distributor_id || \"\",\n id: options!.id || \"\",\n }\n : undefined\n );\n\n // Transform data to match widget's expected format\n const transformedData: EarnRouteResponse | null = data\n ? {\n success: true,\n steps:\n data.steps?.map((step, index) => ({\n id: `step-${index}`,\n type: step.kind === \"approve\" ? \"approval\" : \"deposit\",\n title: step.kind === \"approve\" ? \"Approve Token\" : \"Execute Transaction\",\n description:\n step.kind === \"approve\" && \"token\" in step\n ? `Approve ${step.token.symbol}`\n : \"Execute routing transaction\",\n to: step.tx.to,\n data: step.tx.data,\n value: step.tx.value,\n gasLimit: step.tx.gas.toString(),\n })) || [],\n estimatedGas: \"0\", // Not provided in current API\n estimatedTime: undefined, // Default estimate\n outputAmount: data.amount_out,\n metadata: undefined, // Not provided in current API\n }\n : null;\n\n return {\n data: transformedData,\n isLoading,\n error,\n };\n}\n","import { useAtomValue } from \"jotai\";\nimport { useEarnRoute } from \"./useEarnRoute\"; // Use our wrapper, not the original\nimport { earnRouteOptionsAtom } from \"../store/earn-route-atom\";\n\n/**\n * Simplified hook that uses the consolidated earn route parameters atom\n * to call the original useEarnRoute hook\n */\nexport function useEarnRouteConsolidated() {\n // Get consolidated route options from atom\n const routeOptions = useAtomValue(earnRouteOptionsAtom);\n\n // Call the original useEarnRoute hook with the consolidated options\n const result = useEarnRoute(routeOptions);\n\n return {\n ...result,\n // Additional computed properties\n isReady: !!routeOptions,\n hasRequiredParams: !!(\n routeOptions?.user &&\n routeOptions?.tokenIn &&\n routeOptions?.tokenOut &&\n routeOptions?.amount\n ),\n };\n}\n","import type { EarnRouteResponse } from \"../types/earn-route\";\nimport { useEarnRouteConsolidated } from \"./useEarnRouteConsolidated\";\n\ninterface UseTokenDepositResult {\n fetchedRoute: EarnRouteResponse | null;\n routeError: Error | null;\n isLoadingRoute: boolean;\n}\n\nexport function useTokenDeposit(): UseTokenDepositResult {\n // Use the new consolidated hook\n const { data: fetchedRoute, error: routeError, isLoading: isLoadingRoute } = useEarnRouteConsolidated();\n\n return { \n fetchedRoute: fetchedRoute ?? null, \n routeError: routeError as Error | null,\n isLoadingRoute,\n };\n}","import { Button } from \"@turtleclub/ui\";\nimport { useAdapter } from \"../../context/adapter-context\";\n\ninterface SimpleConfirmButtonProps {\n\n userAddress: string;\n openConnectionModal: () => void;\n fetchedRoute: any;\n routeError: any;\n isLoadingRoute: boolean;\n canExecute: boolean;\n isExecuting: boolean;\n hasError: boolean;\n cancelled: boolean;\n error: any;\n executeCurrentTransaction: () => Promise<void>;\n totalSteps: number;\n completedSteps: number;\n showingTransactionStatus: boolean;\n hasInsufficientBalance: boolean;\n className: string;\n}\n\n// Simple Confirm Button - Only handles button logic, no TxStatus\nexport function SimpleConfirmButton({\n userAddress,\n openConnectionModal,\n fetchedRoute,\n routeError,\n isLoadingRoute,\n canExecute,\n isExecuting,\n hasError,\n cancelled,\n error,\n executeCurrentTransaction,\n totalSteps,\n completedSteps,\n showingTransactionStatus,\n hasInsufficientBalance,\n className,\n}: SimpleConfirmButtonProps) {\n const adapter = useAdapter();\n const walletConnected = !!adapter.user;\n\n const handleConfirm = async (): Promise<void> => {\n if (!canExecute) return;\n await executeCurrentTransaction();\n };\n\n // If showing transaction status, don't show any button\n if (showingTransactionStatus) {\n return <div className={className}></div>;\n }\n\n // Connect wallet button\n if (!userAddress || !walletConnected) {\n return (\n <Button onClick={() => openConnectionModal()} className={className} variant=\"green\" size=\"lg\">\n Connect Wallet\n </Button>\n );\n }\n\n // Loading state\n if (isLoadingRoute) {\n return (\n <Button disabled className={className} size=\"lg\">\n Loading route...\n </Button>\n );\n }\n\n // Error state\n if (routeError) {\n return (\n <Button disabled variant=\"transparentWhite\" className={className} size=\"lg\">\n Route Error\n </Button>\n );\n }\n\n // No route available\n if (!fetchedRoute || !fetchedRoute.steps || fetchedRoute.steps.length === 0) {\n return (\n <Button disabled variant=\"transparentWhite\" className={className} size=\"lg\">\n Enter amount to continue\n </Button>\n );\n }\n\n // Insufficient balance\n if (hasInsufficientBalance) {\n return (\n <Button disabled variant=\"transparentWhite\" className={className} size=\"lg\">\n Insufficient Balance\n </Button>\n );\n }\n\n // Render confirm button\n return (\n <div className={`space-y-2 ${className || \"\"}`}>\n <Button\n onClick={handleConfirm}\n disabled={!canExecute || isExecuting}\n size=\"lg\"\n className=\"w-full\"\n >\n {isExecuting && \"Executing...\"}\n {hasError && \"Retry Transaction\"}\n {cancelled && \"Try Again\"}\n {!isExecuting &&\n !hasError &&\n !cancelled &&\n (totalSteps > 1\n ? `Confirm Transaction (${completedSteps}/${totalSteps})`\n : \"Confirm Transaction\")}\n </Button>\n\n {/* Error message */}\n {hasError && error && <div className=\"text-sm text-destructive text-center\">{error}</div>}\n </div>\n );\n}\n","import { TransactionStep } from \"@/hooks/useTransactionQueue\";\nimport { resetTriggerAtom, depositValueAtom } from \"@/store/earn-route-atom\";\nimport { TxStatus } from \"@turtleclub/ui\";\nimport { formatNumber } from \"@turtleclub/utils\";\nimport { useAtom, useSetAtom } from \"jotai\";\nimport { useMemo } from \"react\";\n\ninterface TransactionStatusSectionProps {\n steps: TransactionStep[];\n currentStep: TransactionStep;\n allCompleted: boolean;\n cancelled: boolean;\n estimatedTime: number;\n tokenSymbol: string;\n amount: string;\n resetQueue: () => void;\n}\n\n// Transaction Status Section - Shows TxStatus in the info area\nexport function TransactionStatusSection({\n steps,\n currentStep,\n allCompleted,\n cancelled,\n estimatedTime,\n tokenSymbol,\n amount,\n resetQueue,\n}: TransactionStatusSectionProps) {\n const [, setResetTrigger] = useAtom(resetTriggerAtom);\n const setDepositValue = useSetAtom(depositValueAtom);\n\n // For completed transactions, use the last completed transaction hash\n // For ongoing transactions, use the current step hash\n const lastCompletedStep = steps.filter((step: any) => step.completed && step.txHash).pop();\n const currentStepWithHash = currentStep?.txHash ? currentStep : null;\n const displayTxHash = allCompleted\n ? lastCompletedStep?.txHash\n : currentStepWithHash?.txHash || lastCompletedStep?.txHash;\n\n const txStatusProps = useMemo(\n () => ({\n title: cancelled\n ? \"Transaction Cancelled\"\n : allCompleted\n ? \"Transaction Completed!\"\n : \"Processing Transaction\",\n description: cancelled\n ? \"Transaction was cancelled by user\"\n : allCompleted\n ? \"Your deposit has been successfully processed.\"\n : \"Please wait while your transaction is being confirmed...\",\n txHash: displayTxHash,\n explorerUrl: \"https://etherscan.io\", // TODO: Get from config\n estimatedTime: undefined,\n amount: `${amount ? formatNumber(amount, 5, false, false) : \"0\"}`,\n token: tokenSymbol,\n protocol: \"Turtle Protocol\",\n completed: allCompleted,\n cancelled: cancelled,\n onViewDetails: undefined, // Don't show View Details button for now\n onClose: () => {\n resetQueue();\n // Reset swap input and clear deposit details\n setDepositValue(\"\");\n setResetTrigger(0);\n },\n steps: steps.map((step: any) => ({\n label: step.label,\n completed: step.completed,\n current: step.current,\n txHash: step.txHash,\n })),\n }),\n [steps, currentStep, allCompleted, cancelled, estimatedTime, tokenSymbol, amount, resetQueue]\n );\n\n return (\n <div className=\"h-full overflow-hidden\">\n <TxStatus {...txStatusProps} className=\"h-full bg-background border-border text-foreground\" />\n </div>\n );\n}\n","import { DealFormatted } from \"@/types\";\nimport { OpportunityDetailsV1 } from \"@turtleclub/ui\";\nimport { useMemo } from \"react\";\n\n// Info Section Component - Shows opportunity details in scrollable area (simplified)\nexport function InfoSection({ dealSelected }: { dealSelected: DealFormatted | null }) {\n if (!dealSelected) {\n return (\n <div className=\"h-full overflow-hidden\">\n <div className=\"text-sm text-muted-foreground p-4 h-full overflow-y-auto\">\n <p>Loading opportunity details...</p>\n </div>\n </div>\n );\n }\n\n // Create details for OpportunityDetailsV1 molecule\n const opportunityDetailsProps = useMemo(\n () => ({\n title: `${dealSelected.tokenName} Vault`,\n titleIcon: dealSelected.iconDeal ? (\n <img\n src={dealSelected.iconDeal}\n alt={dealSelected.tokenName}\n className=\"w-8 h-8 rounded-full\"\n />\n ) : (\n <div className=\"w-8 h-8 rounded-full bg-primary/20 flex items-center justify-center\">\n <span className=\"text-sm font-bold text-primary\">{dealSelected.tokenName.charAt(0)}</span>\n </div>\n ),\n topCards: [\n {\n title: \"Native Yield\",\n value: `${dealSelected.yieldPercentage.toFixed(2)}%`,\n color: \"primary\" as const,\n },\n {\n title: \"Total Yield\",\n value: `${(dealSelected.yieldPercentage * 1.2).toFixed(2)}%`,\n color: \"accent\" as const,\n },\n {\n title: \"Net Fees\",\n value: \"0.5%\",\n color: \"secondary\" as const,\n },\n ] as const,\n bottomCards: [\n {\n title: \"TVL\",\n value: `$${(dealSelected.tvl / 1000000).toFixed(2)}M`,\n color: \"primary\" as const,\n },\n {\n title: \"Yield Source\",\n value: \"Multi-chain\",\n color: \"secondary\" as const,\n },\n {\n title: \"Rewards\",\n value: \"Deposit Bonus\",\n color: \"accent\" as const,\n },\n {\n title: \"Lock Period\",\n value: \"Flexible\",\n color: \"success\" as const,\n },\n ] as const,\n }),\n [dealSelected]\n );\n\n return (\n <div className=\"h-full overflow-hidden\">\n <OpportunityDetailsV1\n {...opportunityDetailsProps}\n className=\"h-full w-full overflow-y-auto\"\n />\n </div>\n );\n}\n","import { SwapDetails } from \"@turtleclub/ui\";\nimport { useMemo } from \"react\";\nimport { formatNumber } from \"@turtleclub/utils\";\n\nexport function SwapDetailsWrapper({\n amountToDeposit,\n symbol,\n tokenPrice,\n networkFee = undefined,\n networkFeeInUsd = undefined,\n showFree = false,\n defaultOpen = false,\n}: {\n amountToDeposit: string;\n symbol: string;\n tokenPrice: number;\n networkFee?: string;\n networkFeeInUsd?: string;\n showFree?: boolean;\n defaultOpen?: boolean;\n}) {\n // Calculate swap details based on current state\n const swapDetailsProps = useMemo(\n () => {\n // Format amount to max 6 decimals\n const formattedAmount = amountToDeposit \n ? formatNumber(parseFloat(amountToDeposit), 6, false, false)\n : \"0\";\n \n return {\n swapFee: undefined, // TODO: Add swap fee\n slippageInUsd: \"0.05\", // TODO: Add slippage\n deposit: amountToDeposit ? `${formattedAmount} ${symbol || \"ETH\"}` : \"0 ETH\",\n receive: amountToDeposit ? `${formattedAmount} ${symbol || \"ETH\"}` : \"0 ETH\",\n equivalentInUsd:\n amountToDeposit && tokenPrice\n ? (parseFloat(amountToDeposit) * tokenPrice).toFixed(2)\n : \"0.00\",\n networkFee: networkFee ?? \"0.002 ETH\", // TODO: Add network fee\n networkFeeInUsd: networkFeeInUsd ?? \"5.65\", // TODO: Add network fee in USD\n showFree: showFree,\n defaultOpen: defaultOpen,\n };\n },\n [amountToDeposit, symbol, tokenPrice, networkFee, networkFeeInUsd, showFree, defaultOpen]\n );\n return <SwapDetails {...swapDetailsProps} />;\n}\n","import { useMemo, type JSX } from \"react\";\nimport { SwapInputWrapper } from \"./swap-input-wrapper\";\nimport { Earn } from \"./earn\";\nimport { useAtomValue } from \"jotai\";\nimport { useTransactionQueue } from \"../../hooks/useTransactionQueue\";\nimport { useTokenDeposit } from \"../../hooks/useTokenDeposit\";\nimport {\n selectedTokenAtom,\n selectedDealAtom,\n depositValueAtom,\n} from \"../../store/earn-route-atom\";\nimport { useAdapter } from \"../../context/adapter-context\";\nimport { SimpleConfirmButton } from \"./simple-confirm-button\";\nimport { TransactionStatusSection } from \"./transaction-status\";\nimport { InfoSection } from \"./info-section\";\nimport { SwapDetailsWrapper } from \"./swap-details-wrapper\";\nimport { formatToken } from \"@turtleclub/utils\";\n\nexport function Swap(): JSX.Element {\n // Get state from atoms\n const selectedToken = useAtomValue(selectedTokenAtom);\n const depositValue = useAtomValue(depositValueAtom);\n const dealSelected = useAtomValue(selectedDealAtom);\n\n // Get adapter methods from context\n const adapter = useAdapter();\n const { sendTransaction, openConnectionModal, user: userAddress } = adapter;\n\n // Get transaction state from hooks\n const { fetchedRoute, routeError, isLoadingRoute } = useTokenDeposit();\n // Initialize transaction queue\n const {\n steps,\n currentStep,\n canExecute,\n isExecuting,\n allCompleted,\n hasError,\n cancelled,\n error,\n executeCurrentTransaction,\n resetQueue,\n totalSteps,\n completedSteps,\n } = useTransactionQueue({\n earnRoute: fetchedRoute,\n userAddress,\n sendTransaction,\n });\n\n // TODO:Extract to a separate hook later\n // Determine if we should show transaction status instead of opportunity details\n const showingTransactionStatus = useMemo(\n () => isExecuting || allCompleted || cancelled || (steps.length > 0 && completedSteps > 0),\n [isExecuting, allCompleted, cancelled, steps.length, completedSteps]\n );\n const walletConnected = !!adapter.user;\n const balanceNumber = selectedToken\n ? parseFloat(formatToken(selectedToken.balance, selectedToken))\n : 0;\n\n const hasInsufficientBalance = useMemo(() => {\n const amountNumber = parseFloat(depositValue) || 0;\n return amountNumber > balanceNumber && walletConnected;\n }, [depositValue, selectedToken, walletConnected]);\n\n // Only show SwapDetails if there's an amount entered\n const showSwapDetails = useMemo(\n () => depositValue && parseFloat(depositValue) > 0,\n [depositValue]\n );\n\n return (\n <div className=\"w-full flex flex-col gap-4 flex-1 min-h-0 h-full\">\n {/* 1. Opportunity selector - Fixed */}\n <div className=\"flex-shrink-0\">\n <Earn />\n </div>\n\n {/* 2. Swap input - Fixed */}\n <div className=\"flex-shrink-0\">\n <SwapInputWrapper />\n </div>\n\n {/* 3. Transaction details - Fixed when shown */}\n {showSwapDetails && (\n <div className=\"flex-shrink-0\">\n <SwapDetailsWrapper\n amountToDeposit={depositValue}\n symbol={selectedToken?.symbol || \"\"}\n tokenPrice={selectedToken?.price || 0}\n />\n </div>\n )}\n\n {/* 4. Info section - Share space with the transaction status section */}\n <div className=\"flex-1 min-h-0\">\n {showingTransactionStatus ? (\n // Show transaction status when transaction is active\n <TransactionStatusSection\n steps={steps}\n currentStep={currentStep}\n allCompleted={allCompleted}\n cancelled={cancelled}\n estimatedTime={fetchedRoute?.estimatedTime || 0}\n tokenSymbol={selectedToken?.symbol || \"\"}\n amount={depositValue}\n resetQueue={resetQueue}\n />\n ) : (\n // Show opportunity details when no transaction is active\n <InfoSection dealSelected={dealSelected} />\n )}\n </div>\n\n {/* 5. Confirm button - Fixed at bottom */}\n <div className=\"flex-shrink-0\">\n <SimpleConfirmButton\n userAddress={userAddress || \"\"}\n openConnectionModal={openConnectionModal}\n fetchedRoute={fetchedRoute}\n routeError={routeError}\n isLoadingRoute={isLoadingRoute}\n canExecute={canExecute && !hasInsufficientBalance}\n isExecuting={isExecuting}\n hasError={hasError}\n cancelled={cancelled}\n error={error}\n executeCurrentTransaction={executeCurrentTransaction}\n totalSteps={totalSteps}\n completedSteps={completedSteps}\n showingTransactionStatus={showingTransactionStatus}\n hasInsufficientBalance={hasInsufficientBalance}\n className=\"w-full\"\n />\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { WalletSection } from \"../wallet-section\";\nimport { useAutoSelectDeal } from \"../../hooks/useAutoSelectDeal\";\nimport { Swap } from \"../swap/swap\";\n\nexport function WidgetContent(): React.ReactElement {\n // Auto-select deal when component mounts\n useAutoSelectDeal();\n\n return (\n <div className=\"w-full h-full flex flex-col gap-4\">\n {/* Fixed Wallet Section - wallet address + chain selector */}\n <div className=\"flex-shrink-0\">\n <WalletSection />\n </div>\n\n {/* Flexible Swap Section with proper order - Uses remaining height */}\n <div className=\"flex-1 min-h-0\">\n <Swap />\n </div>\n </div>\n );\n}\n","import { type JSX } from \"react\";\nimport { useSetAtom } from \"jotai\";\nimport { ArrowLeft, X } from \"lucide-react\";\nimport { useAutoSelectDeal } from \"../hooks/useAutoSelectDeal\";\nimport { showPanelAtom } from \"../store/atoms\";\nimport { selectedDealAtom } from \"../store/earn-route-atom\";\nimport { OpportunityItem } from \"@turtleclub/ui\";\nimport { Button } from \"@turtleclub/ui\";\nimport { dealToOpportunityItem } from \"../adapters\";\n\nexport function Deals(): JSX.Element {\n const setShowDeals = useSetAtom(showPanelAtom);\n const setDealSelected = useSetAtom(selectedDealAtom);\n const { dealsFormatted, isLoading, error } = useAutoSelectDeal();\n const handleClose = (): void => {\n setShowDeals(false);\n };\n\n const handleSelectDeal = (deal: (typeof dealsFormatted)[0]): void => {\n setDealSelected(deal);\n handleClose();\n };\n\n if (error) {\n return (\n <div className=\"w-full h-full flex flex-col items-center justify-center bg-background\">\n <p className=\"text-muted-foreground\">Error loading deals</p>\n <Button onClick={handleClose} variant=\"transparentWhite\" className=\"mt-2\">\n {/* @ts-expect-error - React 19 compatibility with lucide-react */}\n <ArrowLeft className=\"w-4 h-4 mr-2\" />\n Back\n </Button>\n </div>\n );\n }\n\n if (isLoading) {\n return (\n <div className=\"w-full h-full flex items-center justify-center bg-background\">\n <p className=\"text-muted-foreground\">Loading deals...</p>\n </div>\n );\n }\n\n return (\n <div className=\"w-full h-full flex flex-col bg-background\">\n {/* Header */}\n <div className=\"flex items-center justify-between p-4 border-b border-border\">\n <h2 className=\"text-lg font-semibold text-foreground\">Choose Opportunity</h2>\n <Button\n onClick={handleClose}\n variant=\"transparentWhite\"\n size=\"icon\"\n className=\"text-foreground hover:text-primary\"\n >\n {/* @ts-expect-error - React 19 compatibility with lucide-react */}\n <X className=\"w-5 h-5\" />\n </Button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 p-4 space-y-3 overflow-y-auto\">\n {dealsFormatted.map((deal) => {\n const opportunityProps = dealToOpportunityItem(deal);\n return (\n <OpportunityItem\n key={deal.tokenAddress}\n {...opportunityProps}\n onSelect={() => handleSelectDeal(deal)}\n className=\"w-full cursor-pointer hover:bg-accent/50 transition-colors\"\n />\n );\n })}\n </div>\n </div>\n );\n}\n","import React, { useState } from \"react\";\nimport { cn } from \"@turtleclub/ui\";\nimport { useWidgetStyles } from \"../../hooks/useWidgetStyles\";\n\ninterface WidgetLogoProps {\n light?: string;\n dark?: string;\n fallback?: string;\n className?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst sizeClasses = {\n sm: \"h-8 text-2xl\",\n md: \"h-12 text-4xl\", \n lg: \"h-16 text-6xl\",\n};\n\nexport function WidgetLogo({ \n light, \n dark, \n fallback = \"Turtle Club\", \n className,\n size = \"lg\"\n}: WidgetLogoProps): React.ReactElement {\n const [imageError, setImageError] = useState(false);\n const { theme } = useWidgetStyles();\n \n // Determine which logo URL to use based on theme\n const isDarkMode = theme === \"dark\";\n const logoUrl = isDarkMode ? (dark || light) : (light || dark);\n \n // If we have a logo URL and it hasn't failed to load, show image\n if (logoUrl && !imageError) {\n return (\n <div className={cn(\"flex justify-center items-center\", className)}>\n <img\n src={logoUrl}\n alt={fallback}\n className={cn(\"object-contain\", sizeClasses[size])}\n onError={() => setImageError(true)}\n onLoad={() => setImageError(false)}\n />\n </div>\n );\n }\n \n // Fallback to text logo\n return (\n <div className={cn(\"flex justify-center items-center\", className)}>\n <span className={cn(\"font-bold text-primary\", sizeClasses[size])}>\n {fallback}\n </span>\n </div>\n );\n}","import { useEffect } from \"react\";\nimport { useSetAtom, useAtomValue } from \"jotai\";\nimport { earnRouteParamsAtom, selectedDealAtom } from \"../store/earn-route-atom\";\nimport { useAdapter, useDistributorId } from \"../context/adapter-context\";\n\n/**\n * Hook to sync only the essential adapter data needed for earn route validation\n * This is a minimal sync that only updates the user field in earnRouteParamsAtom\n * to keep isRouteReadyAtom working properly\n */\nexport function useEarnRouteSync() {\n const adapter = useAdapter();\n const distributorId = useDistributorId();\n const selectedDeal = useAtomValue(selectedDealAtom);\n const setEarnRouteParams = useSetAtom(earnRouteParamsAtom);\n\n useEffect(() => {\n setEarnRouteParams((current) => ({\n ...current,\n user: adapter.user || \"\",\n chain: adapter.network || 1,\n distributorId: distributorId,\n distributor_id: distributorId,\n id: selectedDeal?.id || \"\",\n }));\n }, [adapter.user, adapter.network, distributorId, selectedDeal?.id, setEarnRouteParams]);\n}","import { useAtomValue } from \"jotai\";\nimport { widgetStyleConfigAtom } from \"../store/atoms\";\n\nexport function useWidgetLogo() {\n const config = useAtomValue(widgetStyleConfigAtom);\n \n return {\n light: config?.logo?.light,\n dark: config?.logo?.dark,\n fallback: config?.logo?.fallback || \"Turtle Club\",\n };\n}","import React, { useState } from \"react\";\nimport type { EarnWidgetProps } from \"../../types\";\nimport { WidgetRoot } from \"./widget-root\";\nimport { WidgetContent } from \"./widget-content\";\nimport { useAtomValue } from \"jotai\";\nimport { showPanelAtom } from \"../../store/atoms\";\nimport { Deals } from \"../deals\";\nimport { WidgetContainer, WidgetLogo } from \"../ui\";\nimport { NavigationBar, NavigationItem } from \"@turtleclub/ui\";\nimport { AdapterProvider } from \"../../context/adapter-context\";\nimport { useEarnRouteSync } from \"../../hooks/useEarnRouteSync\";\nimport { useWidgetLogo } from \"../../hooks/useWidgetLogo\";\nimport { useWidgetStyles } from \"../../hooks/useWidgetStyles\";\n\nconst tabButtons = [\n { value: \"portfolio\", label: \"Portfolio\" },\n { value: \"earn\", label: \"Earn\" },\n { value: \"discover\", label: \"Discover\" },\n];\n\nfunction EarnWidgetInner({ config }: { config: EarnWidgetProps['config'] }): React.ReactElement {\n // Sync adapter data needed for earn route validation\n useEarnRouteSync();\n \n const [tab, setTab] = useState<\"earn\" | \"portfolio\" | \"discover\">(\"earn\");\n const showPanel = useAtomValue(showPanelAtom);\n const { light, dark, fallback } = useWidgetLogo();\n const { showNavigation } = useWidgetStyles();\n\n return (\n <WidgetRoot config={config}>\n <div className=\"w-full h-full flex flex-col\">\n {/* Conditional Navigation Bar */}\n {showNavigation && (\n <div className=\"flex-shrink-0\">\n <NavigationBar activeValue={tab} variant=\"menuBar\">\n {tabButtons.map((button) => {\n return (\n <NavigationItem\n key={button.value}\n active={tab === button.value}\n onClick={() => setTab(button.value as \"earn\" | \"portfolio\" | \"discover\")}\n value={button.value}\n variant=\"menuBarDefault\"\n >\n {button.label}\n </NavigationItem>\n );\n })}\n </NavigationBar>\n </div>\n )}\n\n <div className={`flex-1 min-h-0 ${showNavigation ? 'mt-5' : ''}`}>\n {tab === \"earn\" && showPanel ? (\n // Panel mode: occupies full height without logo\n <div className=\"w-full h-full overflow-hidden\">\n <Deals />\n </div>\n ) : (\n <WidgetContainer variant=\"container\" className=\"w-full h-full flex flex-col\">\n {/* Fixed logo */}\n <div className=\"flex-shrink-0 py-4\">\n <WidgetLogo \n light={light}\n dark={dark}\n fallback={fallback}\n size=\"lg\"\n />\n </div>\n\n {/* Flexible main content */}\n <div className=\"flex-1 min-h-0 w-full\">\n <div className=\"h-full\">\n {tab === \"earn\" && <WidgetContent />}\n {tab === \"portfolio\" && (\n <div className=\"p-6 bg-background rounded-xl\">\n <p className=\"text-foreground\">Portfolio Coming Soon...</p>\n </div>\n )}\n {tab === \"discover\" && (\n <div className=\"p-6 bg-background rounded-xl\">\n <p className=\"text-foreground\">Discover Coming Soon...</p>\n </div>\n )}\n </div>\n </div>\n </WidgetContainer>\n )}\n </div>\n </div>\n </WidgetRoot>\n );\n}\n\nexport function EarnWidget({ adapter, config, distributorId }: EarnWidgetProps): React.ReactElement {\n return (\n <AdapterProvider adapter={adapter} distributorId={distributorId}>\n <EarnWidgetInner config={config} />\n </AdapterProvider>\n );\n}\n"]}