@turtleclub/earn-widget 0.3.2-beta.0 → 0.3.2-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.
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -1
- package/dist/index.d.ts +10 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/styles.css +89 -17
- package/package.json +3 -3
package/dist/index.cjs.map
CHANGED
|
@@ -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/store/overlay-atom.ts","../src/utils/format.ts","../src/store/earn-route-atom.ts","../src/hooks/useMultiChainBalances.ts","../src/context/adapter-context.tsx","../src/utils/infoSection.ts","../src/utils/incentives.ts","../src/context/earn-data-context.tsx","../src/hooks/useAutoSelectDeal.ts","../src/components/deals.tsx","../src/hooks/useTokenAutoSelection.ts","../src/adapters/ui-molecule-adapters.tsx","../src/components/asset-selection.tsx","../src/components/ui/widget-container.tsx","../src/components/ui/widget-logo.tsx","../src/hooks/useEarnRouteSync.ts","../src/hooks/useWidgetLogo.ts","../src/hooks/useAuth.ts","../src/components/discover.tsx","../src/hooks/usePositionsData.ts","../src/components/positions/columns.tsx","../src/components/positions/Positions.tsx","../src/hooks/useSelectedOpportunity.ts","../src/hooks/useTokenSelectorOverlay.ts","../src/components/swap/swap-input-wrapper.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/swap-details-wrapper.tsx","../src/components/wallet-section/account-details.tsx","../src/components/wallet-section/chain-selector.tsx","../src/components/wallet-section/wallet-section.tsx","../src/components/swap/swap-skeleton.tsx","../src/components/swap/swap.tsx","../src/components/widget/earn-widget.tsx"],"names":["cn","inputs","clsx","defaultWidgetStyleConfig","widgetStyleConfigAtom","atom","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","overlayTypeAtom","showDealsOverlayAtom","showAssetsOverlayAtom","hideOverlayAtom","parseUnits","value","decimals","integer","fraction","paddedFraction","combinedValue","formatUnits","valueStr","paddedValue","integerPart","trimmedFractional","formatCurrency","defaultEarnRouteParams","earnRouteParamsAtom","earnRouteOptionsAtom","params","amountInWei","depositValueAtom","amount","selectedDealAtom","selectedOpportunity","selectedTokenAtom","selectedToken","slippageAtom","slippage","resetTriggerAtom","resetTrigger","useMultiChainBalances","chainIds","address","useConfig","queries","useQueries","chainId","earnWalletBalances","balances","useMemo","balanceMap","query","index","isLoading","error","AdapterContext","createContext","DistributorIdContext","AdapterProvider","adapter","distributorId","useAdapter","useContext","useDistributorId","useWalletConnection","useTransactionMethods","useNetworkMethods","formatValue","type","rounded","result","calculateCampaignYieldRange","campaign","aprs","vault","incentive","validAprs","apr","minApr","maxApr","getIncentivesFormatted","isKatanaRelated","isTacRelated","getKatanaIncentivesFormatted","campaignIncentives","aditionalCampaignIncentives","vaultIncentives","commonIncentivesFull","v","x","item","vaultIncentivesFull","a","b","KATANA_CAMPAIGN","EarnDataContext","useEarnData","context","CHAIN_ICONS","EarnDataProvider","opportunitySelected","setOpportunitySelected","useAtom","dealIds","campaignIds","useDefault","campaignsData","campaignsLoading","campaignsError","useEarnCampaigns","campaignItemMapper","incentivesIcons","additionalIncentivesIcons","rewardsIcons","chainsIcons","aprRange","opportunityItemMapper","incentivesFormatted","totalApr","sum","chainMapper","inc","opportunityDetailsMapper","opportunityTokenDetailsMapper","token","chain","getChainById","icon","chainLogo","campaigns","filteredCampaigns","opportunities","allOpportunities","firstOpportunityId","uniqueChainIds","supportedChains","chainMap","opportunityItem","chainOption","balancesLoading","balancesError","refetchBalances","useAutoSelectDeal","dealSelected","Deals","onSwitchToEarn","hideOverlay","setDealSelected","dealsFormatted","handleSelectDeal","deal","jsxs","Button","ArrowLeft","OpportunityList","opportunity","fullOpportunity","opp","DEFAULT_TOKENS","useTokenAutoSelection","currentNetwork","walletConnected","allChainBalances","setSelectedToken","currentChainBalances","highestBalance","aToken","bToken","aValue","formatToken","defaultToken","formatUSDValue","AssetSelection","onAssetSelect","isLoadingBalances","assets","balance","tokenData","formatNumber","handleAssetClick","asset","assetChainId","AssetList","paddingVariants","cva","WidgetContainer","className","variant","props","configPadding","configRounding","finalPadding","finalRounded","Card","sizeClasses","WidgetLogo","light","dark","fallback","size","imageError","setImageError","useState","logoUrl","useEarnRouteSync","selectedDeal","setEarnRouteParams","useWidgetLogo","PARTNERS_API_BASE","TOKEN_STORAGE_KEY","useAuth","authState","setAuthState","previousAddressRef","useRef","isAuthenticatingRef","hasCheckedStorageRef","getStoredAuth","stored","setStoredAuth","data","clearStoredAuth","currentAddress","storedAuth","handleAuthentication","prev","signatureMessageBody","signatureResponse","message","nonce","signature","authenticateBody","authResponse","authData","Discover","searchTerm","setSearchTerm","showDeals","CampaignItem","useUserCampaignPositions","campaignsV2","ALL_CAMPAIGN_NAMES","usePositionsData","userAddress","usePartnerCampaigns","acc","name","campaignWithVaults","c","tacPositions","tacTVL","tacLoading","tacError","katanaPositions","katanaTVL","katanaLoading","katanaError","positions","totalTVL","incentives","columns","row","Positions","openConnectionModal","allPositions","sortedPositions","handleConnectWallet","IconAnimation","TurtleIcon","Fragment","Separator","DataTable","useSelectedOpportunity","setSelectedOpportunity","needsChainSwitch","isChainSupported","useTokenSelectorOverlay","showAssetSelector","SwapInputWrapper","switchToOpportunityChain","setAmount","openTokenSelector","uiTokens","iconUrlToImg","selectedUIToken","handleMaxClick","maxAmount","formattedAmount","formattedBalance","amountNumber","balanceNumber","hasInsufficientBalance","usdValue","targetChain","SwapInput","useTransactionQueue","earnRoute","sendTransaction","onError","onSuccess","state","setState","network","memoizedEarnRoute","stepsKey","step","newSteps","stateRef","callbacksRef","executeCurrentTransaction","useCallback","currentState","currentUserAddress","currentSendTransaction","currentOnError","currentOnSuccess","currentStep","txHash","finalTxHash","updatedSteps","waitError","nextIndex","isLastStep","allCompleted","errorMessage","isUserRejection","resetQueue","canExecute","previousStepIndex","previousStepCompleted","currentStepNotStarted","hasNextStep","timer","useEarnRoute","options","enabled","useEarnRouteOriginal","useEarnRouteConsolidated","routeOptions","originalData","routeDetails","processRouteDetails","parseApproveStep","parseEnsoStep","kind","fromToken","toToken","tokens","approveStep","substep","useTokenDeposit","fetchedRoute","routeError","isLoadingRoute","SimpleConfirmButton","isExecuting","hasError","cancelled","totalSteps","completedSteps","showingTransactionStatus","geoCheckData","geoCheckLoading","useGeocheck","handleConfirm","Tooltip","TooltipTrigger","TooltipContent","TransactionStatusSection","steps","estimatedTime","tokenSymbol","setResetTrigger","setDepositValue","lastCompletedStep","currentStepWithHash","displayTxHash","txStatusProps","TxStatus","SwapDetailsWrapper","amountToDeposit","depositSymbol","amountToReceive","receiveSymbol","receiveDecimals","tokenPrice","defaultOpen","setSlippage","swapDetailsProps","formattedAmountToReceive","SwapDetails","shortenAddress","AccountDetails","disconnect","isHovered","setIsHovered","Wallet2Icon","ChainSelector","selectedChainId","onChainChange","currentChain","chainInList","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","WalletSection","handleChainChange","SwapSkeleton","Swap","depositValue","isEarnDataLoading","isBalancesLoading","showSwapDetails","opSectionData","OpportunitySection","RouteDetails","EarnWidgetInner","isAuthenticated","tab","setTab","tabButtons","overlayType","setOverlayType","hasCampaigns","hasDeals","SegmentControl","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","\"use client\";\nimport 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 text-foreground\",\n \"antialiased transition-all duration-700 ease-linear w-full overflow-hidden\",\n \"h-full flex items-center justify-center\",\n theme === \"dark\" ? \"dark\" : \"\"\n )}\n style={\n {\n ...coreTokenCSS,\n \"--font-primary\": fontPrimary,\n \"--font-secondary\": fontSecondary,\n fontFamily: fontPrimary,\n backgroundColor: \"transparent\",\n maxHeight: \"90vh\",\n } as React.CSSProperties\n }\n >\n <div\n className={cn(\n \"flex flex-col gap-2 h-full overflow-hidden\",\n widgetWidth === \"full\"\n ? \"w-full items-center\"\n : widgetWidth === \"custom\"\n ? \"items-stretch\"\n : \"items-center\"\n )}\n style={{\n ...(widgetWidth === \"custom\" && config.customWidth\n ? { width: config.customWidth }\n : widgetWidth === \"default\"\n ? { width: \"620px\" }\n : {}),\n }}\n >\n {children}\n </div>\n </div>\n );\n}\n","import { atom } from \"jotai\";\n\nexport type OverlayType = \"none\" | \"deals\" | \"assets\";\n\n// Atom to track which overlay is currently shown\nexport const overlayTypeAtom = atom<OverlayType>(\"none\");\n\n// Helper atoms for convenience\nexport const showDealsOverlayAtom = atom(\n (get) => get(overlayTypeAtom) === \"deals\",\n (get, set) => set(overlayTypeAtom, \"deals\")\n);\n\nexport const showAssetsOverlayAtom = atom(\n (get) => get(overlayTypeAtom) === \"assets\",\n (get, set) => set(overlayTypeAtom, \"assets\")\n);\n\nexport const hideOverlayAtom = atom(\n null,\n (get, set) => set(overlayTypeAtom, \"none\")\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}\n\n/**\n * Format a number as currency with proper decimals\n */\nexport function formatCurrency(value: number, decimals: number = 2): string {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(value);\n}\n\n/**\n * Format a number with specific decimal places\n */\nexport function formatNumber(value: number, decimals: number = 2): string {\n return new Intl.NumberFormat('en-US', {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(value);\n}\n\n/**\n * Compare two numbers for sorting\n */\nexport function compareNumbers(a: number, b: number): number {\n return a - b;\n}\n\n/**\n * Compare two strings for sorting\n */\nexport function compareStrings(a: string, b: string): number {\n return a.localeCompare(b);\n}","import { atom, useAtom } from \"jotai\";\nimport type { EarnRouteOptions } from \"@turtleclub/api\";\nimport type { Token } from \"../types/deals\";\nimport { parseUnits } from \"../utils/format\";\nimport { OpportunityItemValue } from \"@turtleclub/ui\";\n\n// Complete parameters needed for useEarnRoute\n// TODO: Delete this when after refactor to get rid of earn context\nexport type OpportunityValue = {\n id: string;\n tokenDetails: OpportunityTokenDetails;\n opportunityDetails: OpportunityDetails;\n opportunityItem: OpportunityItemValue;\n};\n\nexport interface OpportunityTokenDetails {\n tokenAddress: string;\n tokenName: string;\n tokenSymbol: string;\n tokenDecimals: number;\n iconToken: string;\n}\n\nexport interface OpportunityDetails {\n type: string;\n disclaimer: string[];\n tvl: string;\n}\n\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 id?: string;\n distributor_id?: string;\n referral_code?: string;\n\n // Additional widget-specific state\n selectedOpportunity: OpportunityValue | null;\n selectedToken: Token | null;\n resetTrigger: number;\n}\n\n// Default state for earn route parameters\nconst defaultEarnRouteParams: EarnRouteParams = {\n user: \"\",\n chain: 1,\n slippage: 0.001, // 0.1%\n tokenIn: \"\",\n tokenOut: \"\",\n amount: \"\",\n id: undefined,\n selectedOpportunity: null,\n selectedToken: null,\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 (\n !params.user ||\n !params.tokenIn ||\n !params.tokenOut ||\n !params.amount ||\n !params.selectedToken\n ) {\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,\n id: params.id,\n referral: \"\",\n distributor_id: params.distributor_id,\n referral_code: params.referral_code,\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).selectedOpportunity,\n (get, set, selectedOpportunity: OpportunityValue | null) => {\n const current = get(earnRouteParamsAtom);\n set(earnRouteParamsAtom, {\n ...current,\n selectedOpportunity,\n // Update tokenOut when opportunity changes\n tokenOut: selectedOpportunity?.tokenDetails.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\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 resetTrigger: current.resetTrigger + 1,\n });\n});\n","import { useMemo } from \"react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport { earnWalletBalances, type EarnWalletBalancesResponse, type Config } from \"@turtleclub/api\";\nimport { useConfig } from \"@turtleclub/hooks\";\n\ninterface MultiChainBalancesParams {\n chainIds: number[];\n address?: string;\n}\n\ninterface MultiChainBalancesResult {\n balances: Record<number, EarnWalletBalancesResponse[\"balances\"]>;\n isLoading: boolean;\n error: Error | null;\n refetchAll: () => void;\n}\n\nexport function useMultiChainBalances({\n chainIds,\n address,\n}: MultiChainBalancesParams): MultiChainBalancesResult {\n const config = useConfig();\n\n // Create query configurations for each chain\n const queries = useQueries({\n queries: chainIds.map((chainId) => ({\n queryKey: [\"earnWalletBalances\", chainId, address],\n queryFn: async () => {\n if (!address) return null;\n\n const response = await earnWalletBalances(\n {\n chain: chainId,\n user: address,\n },\n config\n );\n\n return response;\n },\n enabled: !!address,\n staleTime: 60 * 1000 * 5, // 5 minutes\n refetchInterval: 60 * 1000, // 1 minute\n refetchOnWindowFocus: false,\n })),\n });\n\n // Aggregate results\n const balances = useMemo(() => {\n const balanceMap: Record<number, EarnWalletBalancesResponse[\"balances\"]> = {};\n\n queries.forEach((query, index) => {\n const chainId = chainIds[index];\n if (query.data && chainId !== undefined) {\n balanceMap[chainId] = query.data.balances;\n }\n });\n\n return balanceMap;\n }, [queries, chainIds]);\n\n const isLoading = queries.some((query) => query.isLoading);\n const error = queries.find((query) => query.error)?.error || null;\n\n const refetchAll = () => {\n queries.forEach((query) => {\n query.refetch();\n });\n };\n\n return {\n balances,\n isLoading,\n error,\n refetchAll,\n };\n}\n","\"use client\";\n\nimport 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 { InfoSection, InfoCard } from \"../types/deals\";\nimport type { EarnCampaignWithVaults, earnTyped, Vault } from \"@turtleclub/api\";\nimport { IncentiveFormatted } from \"./incentives\";\n\ntype Deal = earnTyped.DefiToken;\n\n/**\n * Format numbers for display in info cards\n */\nexport function formatValue(\n value: number,\n type: \"currency\" | \"percentage\" | \"number\",\n rounded = 2\n): string {\n if (value === 0) {\n return \"0\";\n }\n\n if (value === null || value === undefined || isNaN(value)) {\n return \"0\";\n }\n\n let result: string;\n switch (type) {\n case \"currency\":\n if (value >= 1000000) result = `$${(value / 1000000).toFixed(2)}M`;\n else if (value >= 1000) result = `$${(value / 1000).toFixed(2)}K`;\n else result = `$${value.toFixed(2)}`;\n break;\n case \"percentage\":\n result = `${value.toFixed(rounded)}%`;\n break;\n case \"number\":\n if (value >= 1000) result = `${(value / 1000).toFixed(1)}K`;\n else result = value.toString();\n break;\n default:\n result = value.toString();\n }\n\n return result;\n}\n\n/**\n * Capitalize campaign names properly\n */\nexport function capitalizeName(name: string): string {\n return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\n}\n\n/**\n * Calculate yield range from campaign vaults\n */\nexport function calculateCampaignYieldRange(\n campaign: EarnCampaignWithVaults\n): [string, string] | null {\n const aprs: number[] = [];\n\n // Check vaults for APR data\n campaign.vaults.forEach((vault) => {\n // Check katanaCampaignConfig incentives\n if (vault.katanaCampaignConfig?.incentives) {\n vault.katanaCampaignConfig?.incentives.forEach((incentive) => {\n if (incentive.apr && incentive.apr > 0) {\n aprs.push(incentive.apr);\n }\n });\n }\n });\n\n // Check campaign-level additional incentives (these have direct APR values)\n\n // Process Katana additional incentives\n if (campaign.campaign.katanaConfig?.additionalIncentives) {\n campaign.campaign.katanaConfig.additionalIncentives.forEach((incentive) => {\n if (incentive.apr && incentive.apr > 0) {\n aprs.push(incentive.apr);\n }\n });\n }\n\n // Process TAC additional incentives\n if (campaign.campaign.tacConfig?.additionalIncentives) {\n campaign.campaign.tacConfig.additionalIncentives.forEach((incentive) => {\n if (incentive.apr && incentive.apr > 0) {\n aprs.push(incentive.apr);\n }\n });\n }\n\n if (aprs.length === 0) return null;\n\n // Filter out zero values and get min/max\n const validAprs = aprs.filter((apr) => apr > 1);\n if (validAprs.length === 0) return null;\n\n const minApr = Math.min(...validAprs);\n const maxApr = Math.max(...validAprs);\n\n return [formatValue(minApr, \"percentage\", 2), formatValue(maxApr, \"percentage\", 2)];\n}\n\n/**\n * Build info section for a campaign (vault)\n */\nexport function buildCampaignInfoSection(\n name: string,\n url: string,\n totalApr: number,\n tvlUsd: number,\n turtleUsers: number,\n iconUrl: string,\n incentivesFormatted: IncentiveFormatted[]\n): InfoSection | undefined {\n const topCards: InfoCard[] = [];\n\n // APR Range\n // const yieldRange = calculateCampaignYieldRange(campaign);\n if (totalApr) {\n const aprCard = {\n label: \"APR\",\n value: formatValue(totalApr, \"percentage\"),\n tooltip: \"Annual Percentage Rate range for this vault\",\n };\n topCards.push(aprCard);\n }\n\n // TVL\n if (tvlUsd > 0) {\n const tvlCard = {\n label: \"TVL\",\n value: formatValue(tvlUsd, \"currency\"),\n tooltip: \"Total Value Locked in this campaign\",\n };\n topCards.push(tvlCard);\n }\n\n const turtleUsersCard = {\n label: \"Turtle Users\",\n value: formatValue(turtleUsers, \"number\"),\n tooltip: \"Number of users participating in this campaign\",\n };\n topCards.push(turtleUsersCard);\n\n // Bottom Cards\n const bottomCards: InfoCard[] = [];\n let vaultIncentives: InfoCard[] = [];\n\n if (incentivesFormatted && incentivesFormatted.length > 0) {\n const filteredIncentives = incentivesFormatted.filter((x) => x.apr > 0);\n\n vaultIncentives = filteredIncentives.map((incentive) => ({\n label: incentive.label,\n value: `${incentive.description} ${incentive.apr > 0 ? `(${formatValue(incentive.apr, \"percentage\", 3)})` : \"\"}`,\n iconUrl: incentive.iconUrl,\n }));\n }\n bottomCards.push(...vaultIncentives);\n\n // Check validation\n const hasValidTopCards = topCards.length > 0;\n const hasNonZeroValues = topCards.some((card) => card.value !== \"0\");\n\n if (hasValidTopCards && hasNonZeroValues) {\n const result = {\n name,\n url,\n iconUrl: iconUrl,\n topCards,\n bottomCards,\n };\n return result;\n }\n\n return undefined;\n}\n\n/**\n * Build info section for a regular deal (non-vault)\n */\nexport function buildDealInfoSection(\n title: string,\n deal: Deal,\n partnerData?: {\n boostPercentage?: number;\n dealType?: string;\n tvl?: number;\n url?: string;\n description?: string;\n }\n): InfoSection | undefined {\n const topCards: InfoCard[] = [];\n if (!partnerData) return undefined;\n\n // Boost Percentage\n if (partnerData.boostPercentage && partnerData.boostPercentage > 0) {\n topCards.push({\n label: \"Boost\",\n value: formatValue(partnerData.boostPercentage, \"percentage\"),\n tooltip: \"Turtle boost percentage\",\n });\n }\n\n // TVL from indexer (when available) or fallback to deal TVL\n const tvlValue = partnerData.tvl || deal.data.tvl;\n if (tvlValue > 0) {\n topCards.push({\n label: \"TVL\",\n value: formatValue(tvlValue, \"currency\"),\n tooltip: \"Total Value Locked\",\n });\n }\n\n // Deal Type\n if (partnerData.dealType) {\n topCards.push({\n label: \"Type\",\n value: partnerData.dealType.charAt(0).toUpperCase() + partnerData.dealType.slice(1),\n tooltip: \"Deal type\",\n });\n }\n\n let bottomCards: InfoCard[] = [];\n if (partnerData.description) {\n bottomCards.push({ label: \"Description\", value: partnerData.description });\n }\n\n // Only include infoSection if we have data to show\n if (topCards.length > 0 && topCards.some((card) => card.value !== \"0\")) {\n return {\n name: title,\n iconUrl: deal.metadata.iconUrl,\n topCards,\n url: partnerData?.url || undefined,\n bottomCards,\n };\n }\n\n return undefined;\n}\n","import { EarnCampaignWithVaults, Vault } from \"@turtleclub/api\";\n\nexport type IncentiveFormatted = {\n name: string;\n apr: number;\n boost: boolean;\n description: string;\n iconUrl: string;\n};\n\nexport const getIncentivesFormatted = (\n campaign: EarnCampaignWithVaults,\n vault: Vault\n): IncentiveFormatted[] => {\n const isKatanaRelated = vault.katanaCampaignConfig !== null;\n const isTacRelated = vault.tacCampaignConfig !== null;\n\n if (isKatanaRelated) {\n const result = getKatanaIncentivesFormatted(campaign, vault);\n return result;\n }\n\n if (isTacRelated) {\n // return getTacIncentivesFormatted(campaign, vault);\n return [];\n }\n\n // Implement generic implementation\n return [];\n};\n\nconst getKatanaIncentivesFormatted = (\n campaign: EarnCampaignWithVaults,\n vault: Vault\n): IncentiveFormatted[] => {\n // Base data\n const campaignIncentives = campaign.campaign.katanaConfig?.incentives;\n const aditionalCampaignIncentives = campaign.campaign.katanaConfig?.additionalIncentives;\n const vaultIncentives = vault.katanaCampaignConfig?.incentives;\n\n // Fill campaign data info\n const commonIncentivesFull =\n vaultIncentives\n ?.map((v) => {\n const incentive = campaignIncentives?.find((x) => x.id === v.id);\n if (!incentive) {\n return null;\n }\n const result = {\n name: `Est. ${incentive.name}`,\n description: incentive.tooltip,\n apr: v.apr,\n boost: v.apr === undefined,\n iconUrl: incentive.iconUrl,\n };\n return result;\n })\n .filter((item): item is IncentiveFormatted => item !== null) || [];\n\n const vaultIncentivesFull =\n vaultIncentives\n ?.map((v) => {\n const incentive = aditionalCampaignIncentives?.find((x) => x.id === v.id);\n if (!incentive) {\n return null;\n }\n const apr = v.apr ?? incentive.apr;\n const result = {\n name: `${incentive.estApr ? \"Est. \" : \"\"}${incentive.name}`,\n description: incentive.tooltip,\n apr: apr,\n boost: apr === undefined,\n iconUrl: incentive.iconUrl,\n };\n return result;\n })\n .filter((item): item is IncentiveFormatted => item !== null) || [];\n\n const final = [...commonIncentivesFull, ...vaultIncentivesFull].sort((a, b) => b.apr - a.apr);\n\n return final;\n};\n\n// TODO: Implement\n// const getTacIncentivesFormatted = (\n// campaign: EarnCampaignWithVaults,\n// vault: Vault\n// ): IncentiveFormatted[] => {\n// return [];\n// };\n","\"use client\";\nimport { createContext, useContext, useEffect, useMemo, type ReactNode } from \"react\";\nimport { useEarnCampaigns } from \"@turtleclub/hooks\";\nimport { useAtomValue, useAtom } from \"jotai\";\nimport { widgetStyleConfigAtom } from \"../store/atoms\";\nimport { selectedDealAtom } from \"../store/earn-route-atom\";\nimport type { EarnCampaignWithVaults, EarnWalletBalancesResponse } from \"@turtleclub/api\";\nimport { useMultiChainBalances } from \"../hooks/useMultiChainBalances\";\nimport { useAdapter } from \"./adapter-context\";\nimport {\n // buildCampaignInfoSection,\n // buildDealInfoSection,\n calculateCampaignYieldRange,\n formatValue,\n} from \"../utils\";\nimport { getIncentivesFormatted } from \"../utils/incentives\";\n// import { getAddressExplorerUrl } from \"../utils/explorers\";\nimport { CampaignItemValue, OpportunityItemValue } from \"@turtleclub/ui\";\nimport { chainLogo, getChainById } from \"@turtleclub/chains\";\n\nconst KATANA_CAMPAIGN = \"2c86d3a1-cfe8-486d-915d-1b9ff5e924e9\";\n\ninterface OpportunityTokenDetails {\n tokenAddress: string;\n tokenName: string;\n tokenSymbol: string;\n tokenDecimals: number;\n iconToken: string;\n}\ninterface OpportunityDetails {\n type: string;\n disclaimer: string[];\n tvl: string;\n}\nexport type Opportunity = Record<\n string,\n {\n id: string;\n tokenDetails: OpportunityTokenDetails;\n opportunityDetails: OpportunityDetails;\n opportunityItem: OpportunityItemValue;\n }\n>;\n\nexport interface ChainOption {\n value: string;\n symbol: string;\n name: string;\n icon: string;\n chainId: number;\n}\n\ninterface EarnDataContextValue {\n isLoading: boolean;\n error: Error | null;\n campaigns: CampaignItemValue[];\n opportunities: Opportunity;\n balances: Record<number, EarnWalletBalancesResponse[\"balances\"]>; // Balances per chain\n balancesLoading: boolean;\n balancesError: Error | null;\n refetchBalances: () => void;\n supportedChains: ChainOption[];\n}\n\nconst EarnDataContext = createContext<EarnDataContextValue | undefined>(undefined);\n\nexport function useEarnData() {\n const context = useContext(EarnDataContext);\n if (!context) {\n throw new Error(\"useEarnData must be used within EarnDataProvider\");\n }\n return context;\n}\n\ninterface EarnDataProviderProps {\n children: ReactNode;\n}\n\nconst CHAIN_ICONS: Record<number, string> = {\n 1: \"https://storage.googleapis.com/turtle-assets/tokens/eth.png\",\n 747474: \"https://storage.googleapis.com/turtle-assets/partners/polygon/katana.svg\",\n};\n\nexport function EarnDataProvider({ children }: EarnDataProviderProps) {\n const config = useAtomValue(widgetStyleConfigAtom);\n const [opportunitySelected, setOpportunitySelected] = useAtom(selectedDealAtom);\n const adapter = useAdapter();\n\n // Use configuration arrays if provided, otherwise fall back to default campaign\n const dealIds = config.deals || [];\n const campaignIds = config.campaigns || [];\n\n // If no deals or campaigns specified, use default campaign\n const useDefault = dealIds.length === 0 && campaignIds.length === 0;\n\n // Fetch campaigns data\n const {\n data: campaignsData,\n isLoading: campaignsLoading,\n error: campaignsError,\n } = useEarnCampaigns();\n\n const campaignItemMapper = (campaign: EarnCampaignWithVaults): CampaignItemValue => {\n const incentivesIcons =\n campaign.campaign.katanaConfig?.incentives.map((incentive) => ({\n icon: incentive.iconUrl,\n name: incentive.name,\n })) ?? [];\n const additionalIncentivesIcons =\n campaign.campaign.katanaConfig?.additionalIncentives.map((incentive) => ({\n icon: incentive.iconUrl,\n name: incentive.name,\n })) ?? [];\n\n const rewardsIcons = [...incentivesIcons, ...additionalIncentivesIcons].filter(Boolean);\n const chainsIcons = campaign.vaults.map((vault) => ({\n icon: CHAIN_ICONS[vault.earnConfig?.tokens?.[0]?.chainId ?? 1],\n name: vault.earnConfig?.tokens?.[0]?.chain ?? \"Ethereum\",\n }));\n\n const aprRange = calculateCampaignYieldRange(campaign) ?? \"0% - 0%\";\n\n return {\n icon: campaign.campaign.iconUrl,\n name: campaign.campaign.description,\n aprRange: `${aprRange[0]} - ${aprRange[1]}`,\n tvl: formatValue(campaign.campaign.katanaConfig?.totalTvlUSD ?? 0, \"currency\"),\n participants: campaign.campaign.totalUsers.toString(),\n rewards: rewardsIcons,\n chains: chainsIcons,\n };\n };\n\n const opportunityItemMapper = (\n vault: EarnCampaignWithVaults[\"vaults\"][number],\n campaign: EarnCampaignWithVaults\n ): OpportunityItemValue => {\n const incentivesFormatted = getIncentivesFormatted(campaign, vault) ?? [];\n\n const totalApr = incentivesFormatted.reduce((sum, incentive) => {\n return sum + (incentive.apr || 0);\n }, 0);\n\n return {\n icon: vault.iconUrl,\n name: vault.name,\n tvl: formatValue(vault.tvlUSD, \"currency\"),\n apr: totalApr.toFixed(2) + \"%\",\n chain: chainMapper(vault.earnConfig?.tokens?.[0]?.chainId ?? 1), //CHAIN_ICONS[vault.earnConfig?.tokens?.[0]?.chainId ?? 1],\n incentives: incentivesFormatted.map((inc) => ({\n icon: inc.iconUrl,\n name: inc.label,\n })),\n aprBreakdown: incentivesFormatted,\n turtleBoost: null,\n partner: {\n icon: campaign.campaign.iconUrl,\n name: campaign.campaign.description,\n },\n };\n };\n\n const opportunityDetailsMapper = (campaign: EarnCampaignWithVaults): OpportunityDetails => {\n return {\n type: \"Turtle Campaign\",\n disclaimer: [],\n tvl: campaign.campaign.katanaConfig?.totalTvlUSD?.toString() ?? \"0\",\n };\n };\n\n const opportunityTokenDetailsMapper = (\n vault: EarnCampaignWithVaults[\"vaults\"][number]\n ): OpportunityTokenDetails => {\n const token = vault.earnConfig?.tokens[0];\n if (!token) {\n return {\n tokenAddress: \"\",\n tokenName: \"\",\n tokenSymbol: \"\",\n tokenDecimals: 0,\n iconToken: \"\",\n };\n }\n return {\n tokenAddress: token.address,\n tokenName: token.symbol,\n tokenSymbol: token.symbol,\n tokenDecimals: token.decimals,\n iconToken: vault.iconUrl,\n };\n };\n\n const chainMapper = (chainId: number): ChainOption => {\n const chain = getChainById(chainId);\n const icon = chainLogo(chainId);\n\n if (chain) {\n return {\n value: chain.name.toLowerCase().replace(/\\s+/g, \"-\"),\n symbol: chain.nativeCurrency.symbol,\n name: chain.name,\n icon,\n chainId: chainId,\n };\n } else {\n return {\n value: `chain-${chainId}`,\n symbol: \"ETH\",\n name: `Chain ${chainId}`,\n icon: chainLogo(chainId),\n chainId: chainId,\n };\n }\n };\n\n const campaigns: CampaignItemValue[] = useMemo(() => {\n if (!campaignsData) return [];\n\n // Filter campaigns based on configuration\n let filteredCampaigns = campaignsData;\n\n if (campaignIds.length > 0) {\n filteredCampaigns = campaignsData.filter((campaign) =>\n campaignIds.includes(campaign.campaign.id)\n );\n } else if (useDefault) {\n filteredCampaigns = campaignsData.filter(\n (campaign) => campaign.campaign.id === KATANA_CAMPAIGN\n );\n }\n\n return filteredCampaigns.map((campaign) => campaignItemMapper(campaign));\n }, [campaignsData, campaignIds, useDefault]);\n\n const opportunities: Opportunity = useMemo(() => {\n if (!campaignsData) return {};\n\n const allOpportunities: Opportunity = {};\n\n // Filter campaigns based on configuration\n let filteredCampaigns = campaignsData;\n\n if (campaignIds.length > 0) {\n filteredCampaigns = campaignsData.filter((campaign) =>\n campaignIds.includes(campaign.campaign.id)\n );\n } else if (useDefault) {\n filteredCampaigns = campaignsData.filter(\n (campaign) => campaign.campaign.id === KATANA_CAMPAIGN\n );\n }\n\n // Extract all vaults from filtered campaigns\n filteredCampaigns.forEach((campaign) => {\n campaign.vaults.forEach((vault) => {\n if (vault.earnConfig?.tokens && vault.earnConfig?.tokens.length === 0) {\n return;\n }\n allOpportunities[vault.id] = {\n id: vault.id,\n tokenDetails: opportunityTokenDetailsMapper(vault),\n opportunityDetails: opportunityDetailsMapper(campaign),\n opportunityItem: opportunityItemMapper(vault, campaign),\n };\n });\n });\n\n return allOpportunities;\n }, [campaignsData, campaignIds, dealIds, useDefault]);\n\n // Select the first opportunity if no opportunity is selected\n useEffect(() => {\n if (Object.keys(opportunities).length > 0 && !opportunitySelected) {\n const firstOpportunityId = Object.keys(opportunities)[0];\n setOpportunitySelected(opportunities[firstOpportunityId]);\n }\n }, [opportunities, opportunitySelected, setOpportunitySelected]);\n\n // Extract unique chain IDs and create supported chains\n const { uniqueChainIds, supportedChains } = useMemo(() => {\n const chainMap = new Map<number, ChainOption>();\n\n // Iterate through opportunities and build unique chains\n Object.values(opportunities).forEach(({ opportunityItem }) => {\n const chainOption = opportunityItem.chain;\n if (chainOption && chainOption.chainId) {\n chainMap.set(chainOption.chainId, chainOption);\n }\n });\n\n // Extract unique chain IDs and chain options\n const uniqueChainIds = Array.from(chainMap.keys());\n const supportedChains = Array.from(chainMap.values()).sort((a, b) =>\n a.name.localeCompare(b.name)\n );\n\n return { uniqueChainIds, supportedChains };\n }, [opportunities]);\n\n // Use the multi-chain balance hook\n const {\n balances,\n isLoading: balancesLoading,\n error: balancesError,\n refetchAll: refetchBalances,\n } = useMultiChainBalances({\n chainIds: uniqueChainIds,\n address: adapter.user || undefined,\n });\n\n const value: EarnDataContextValue = {\n isLoading: campaignsLoading,\n error: campaignsError,\n campaigns,\n opportunities,\n balances,\n supportedChains,\n balancesLoading,\n balancesError,\n refetchBalances,\n };\n\n return <EarnDataContext.Provider value={value}>{children}</EarnDataContext.Provider>;\n}\n","import { useAtomValue } from \"jotai\";\nimport { selectedDealAtom } from \"../store/earn-route-atom\";\nimport { useEarnData } from \"../context/earn-data-context\";\n\nexport function useAutoSelectDeal() {\n const dealSelected = useAtomValue(selectedDealAtom);\n const { opportunities, isLoading, error } = useEarnData();\n\n return {\n deals: opportunities,\n dealsFormatted: opportunities, // For backward compatibility\n isLoading,\n error,\n selectedDeal: dealSelected,\n };\n}\n","\"use client\";\nimport { type JSX } from \"react\";\nimport { useSetAtom } from \"jotai\";\nimport { ArrowLeft } from \"lucide-react\";\nimport { useAutoSelectDeal } from \"../hooks/useAutoSelectDeal\";\nimport { hideOverlayAtom } from \"../store/overlay-atom\";\nimport { OpportunityValue, selectedDealAtom } from \"../store/earn-route-atom\";\nimport { Button, OpportunityList } from \"@turtleclub/ui\";\n\nexport function Deals({ onSwitchToEarn }: { onSwitchToEarn: () => void }): JSX.Element {\n const hideOverlay = useSetAtom(hideOverlayAtom);\n const setDealSelected = useSetAtom(selectedDealAtom);\n const { dealsFormatted, isLoading, error } = useAutoSelectDeal();\n\n const handleSelectDeal = (deal: OpportunityValue): void => {\n setDealSelected(deal);\n onSwitchToEarn();\n hideOverlay();\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={() => hideOverlay()} variant=\"default\" className=\"mt-2\">\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-transparent\">\n {/* Header */}\n <div className=\"flex items-center justify-start p-3 flex-shrink-0\">\n <button\n onClick={() => hideOverlay()}\n className=\"text-primary hover:text-primary/80 transition-colors\"\n >\n <ArrowLeft className=\"w-5 h-5\" />\n </button>\n </div>\n\n {/* Content */}\n <OpportunityList\n opportunities={Object.values(dealsFormatted).map(\n (opportunity) => opportunity.opportunityItem\n )}\n onOpportunityClick={(opportunityItem) => {\n // TODO: Improve this\n // Find the full opportunity data by matching the opportunityItem\n const fullOpportunity = Object.values(dealsFormatted).find(\n (opp) => opp.opportunityItem === opportunityItem\n );\n if (fullOpportunity) {\n handleSelectDeal(fullOpportunity);\n }\n }}\n groupBy=\"partner\"\n filterVariant=\"navigation\"\n className=\"h-full\"\n />\n </div>\n );\n}\n","import { useEffect } from \"react\";\nimport { useAtom, useAtomValue } from \"jotai\";\nimport { selectedTokenAtom, resetTriggerAtom } from \"../store/earn-route-atom\";\nimport { useAdapter } from \"../context/adapter-context\";\nimport { useEarnData } from \"../context/earn-data-context\";\nimport { formatToken } from \"@turtleclub/utils\";\nimport type { Token } from \"../types/deals\";\n\n// Default tokens when no wallet is connected\nconst DEFAULT_TOKENS: Record<number, Token> = {\n 1: {\n address: \"0x0000000000000000000000000000000000000000\",\n name: \"Ethereum\",\n symbol: \"ETH\",\n decimals: 18,\n logo: undefined,\n balance: \"0\",\n price: 0,\n chainId: 1,\n },\n // Add more default tokens for other chains as needed\n};\n\nexport function useTokenAutoSelection() {\n const adapter = useAdapter();\n const currentNetwork = adapter.network;\n const walletConnected = !!adapter.user;\n \n const { balances: allChainBalances, balancesLoading } = useEarnData();\n const [selectedToken, setSelectedToken] = useAtom(selectedTokenAtom);\n const resetTrigger = useAtomValue(resetTriggerAtom);\n\n // Get balances for current network\n const currentChainBalances = currentNetwork ? allChainBalances[currentNetwork] : undefined;\n\n // Clear selected token when chain changes\n useEffect(() => {\n if (selectedToken && currentNetwork && selectedToken.chainId !== currentNetwork) {\n setSelectedToken(null);\n }\n }, [currentNetwork, selectedToken, setSelectedToken]);\n\n // Auto-select token with highest balance when balances load or chain changes\n useEffect(() => {\n // Skip if we already have a valid token for current chain\n if (selectedToken && currentNetwork && selectedToken.chainId === currentNetwork) {\n return;\n }\n\n // Skip if still loading balances\n if (walletConnected && balancesLoading) {\n return;\n }\n\n // Select token with highest USD balance\n if (currentChainBalances && currentChainBalances.length > 0) {\n // Sort balances by USD value (descending)\n const sortedBalances = [...currentChainBalances].sort((a, b) => {\n // Create token objects for formatToken\n const aToken = { ...a.token, balance: a.amount, decimals: a.token.decimals };\n const bToken = { ...b.token, balance: b.amount, decimals: b.token.decimals };\n \n const aValue = parseFloat(formatToken(a.amount, aToken)) * (a.token.price || 0);\n const bValue = parseFloat(formatToken(b.amount, bToken)) * (b.token.price || 0);\n return bValue - aValue;\n });\n \n // Use token with highest balance\n const highestBalance = sortedBalances[0];\n setSelectedToken({\n address: highestBalance.token.address,\n name: highestBalance.token.name,\n symbol: highestBalance.token.symbol,\n decimals: highestBalance.token.decimals,\n logo: highestBalance.token.logos?.[0],\n balance: highestBalance.amount,\n price: highestBalance.token.price ?? undefined,\n chainId: highestBalance.token.chain,\n });\n } else if (!walletConnected && currentNetwork) {\n // Use default token when no wallet connected\n const defaultToken = DEFAULT_TOKENS[currentNetwork] || DEFAULT_TOKENS[1];\n setSelectedToken({\n ...defaultToken,\n chainId: currentNetwork,\n });\n }\n }, [currentChainBalances, currentNetwork, selectedToken, setSelectedToken, walletConnected, balancesLoading]);\n\n // Reset amount when token changes\n useEffect(() => {\n // This is handled in the atom now, but keeping for any additional logic\n }, [selectedToken]);\n\n // Reset selection on reset trigger\n useEffect(() => {\n if (resetTrigger > 0) {\n setSelectedToken(null);\n }\n }, [resetTrigger, setSelectedToken]);\n\n return {\n selectedToken,\n setSelectedToken,\n currentChainBalances,\n isLoadingBalances: balancesLoading,\n };\n}","\"use client\";\n\nimport { formatValue } from \"../utils\";\nimport 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 // Convert balance using BigInt for precision, then to number for calculations\n const balanceBigInt = BigInt(token.balance);\n const decimalsMultiplier = BigInt(10 ** token.decimals);\n const balanceNumber = Number(balanceBigInt) / Number(decimalsMultiplier);\n const balanceInUsd = balanceNumber * (token.price || 0);\n\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 balance: formatUSDValue(balanceInUsd),\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(\n deal: DealFormatted,\n isCampaign = false\n): OpportunityItemProps {\n // Only show yield for deals that belong to a campaign (vaults)\n const showYield = (deal.isVault || isCampaign) && deal.yieldPercentage > 0;\n\n let tvlDisplay = deal.tvl > 0 ? formatValue(deal.tvl, \"currency\") : undefined;\n let turtleBoostDisplay = deal.boostPercentage ? `${deal.boostPercentage}%` : undefined;\n\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.title,\n tvl: tvlDisplay,\n turtleBoost: turtleBoostDisplay,\n yield: showYield ? `${deal.yieldPercentage.toFixed(2)}%` : undefined,\n };\n}\n\n/**\n * Converts array of deals to opportunity items\n */\nexport function dealsToOpportunityItems(deals: DealFormatted[]): OpportunityItemProps[] {\n return deals.map((deal) => dealToOpportunityItem(deal));\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}\n","\"use client\";\nimport { type JSX } from \"react\";\nimport { useSetAtom } from \"jotai\";\nimport { ArrowLeft } from \"lucide-react\";\nimport { AssetList, type Asset } from \"@turtleclub/ui\";\nimport { hideOverlayAtom } from \"../store/overlay-atom\";\nimport { useTokenAutoSelection } from \"../hooks/useTokenAutoSelection\";\nimport { useAdapter } from \"../context/adapter-context\";\nimport { useEarnData } from \"../context/earn-data-context\";\nimport { formatNumber, formatToken } from \"@turtleclub/utils\";\nimport { formatUSDValue } from \"../adapters\";\nimport { getChainById } from \"@turtleclub/chains\";\n\ninterface AssetSelectionProps {\n onAssetSelect?: (tokenAddress: string) => void;\n}\n\nexport function AssetSelection({ onAssetSelect }: AssetSelectionProps): JSX.Element {\n const hideOverlay = useSetAtom(hideOverlayAtom);\n const adapter = useAdapter();\n const { isLoadingBalances, setSelectedToken } = useTokenAutoSelection();\n const { balances: allChainBalances } = useEarnData();\n\n // Convert all chain token balances to Asset format\n const assets: Asset[] = [];\n\n // Iterate through all chains\n Object.entries(allChainBalances).forEach(([chainId, balances]) => {\n balances.forEach((balance) => {\n const tokenData = {\n address: balance.token.address,\n name: balance.token.name,\n symbol: balance.token.symbol,\n decimals: balance.token.decimals,\n balance: balance.amount,\n price: balance.token.price ?? undefined,\n chainId: balance.token.chain,\n logo: balance.token.logos?.[0],\n };\n\n const chain = getChainById(Number(chainId));\n\n assets.push({\n id: `${chainId}-${tokenData.address}`, // Unique ID combining chain and address\n symbol: tokenData.symbol,\n name: tokenData.name,\n icon: tokenData.logo ? (\n <img src={tokenData.logo} alt={tokenData.symbol} 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-xs\">\n {tokenData.symbol?.charAt(0) || \"?\"}\n </div>\n ),\n balance: formatNumber(formatToken(tokenData.balance, tokenData), 5, false, false),\n balanceUSD: formatUSDValue(\n parseFloat(formatToken(tokenData.balance, tokenData)) * (tokenData.price || 0)\n ),\n chainId: String(chainId),\n chainName: chain?.name || \"Unknown\",\n address: tokenData.address,\n decimals: tokenData.decimals,\n });\n });\n });\n\n const handleAssetClick = async (asset: Asset) => {\n // Check if we need to switch chains\n const assetChainId = Number(asset.chainId);\n const currentChainId = adapter.network;\n\n if (currentChainId !== assetChainId) {\n // Switch to the asset's chain\n try {\n await adapter.changeNetwork(assetChainId);\n } catch (error) {\n console.error(\"Failed to switch network:\", error);\n return;\n }\n }\n\n // Find the token in the specific chain's balances\n const chainBalances = allChainBalances[assetChainId];\n const balance = chainBalances?.find((b) => b.token.address === asset.address);\n\n if (balance) {\n setSelectedToken({\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 chainId: balance.token.chain,\n });\n onAssetSelect?.(asset.address || \"\");\n hideOverlay();\n }\n };\n\n if (isLoadingBalances) {\n return (\n <div className=\"w-full h-full flex items-center justify-center bg-background\">\n <p className=\"text-muted-foreground\">Loading balances...</p>\n </div>\n );\n }\n\n return (\n <div className=\"w-full h-full flex flex-col bg-transparent\">\n {/* Header */}\n <div className=\"flex items-center justify-between p-3 flex-shrink-0\">\n <button\n onClick={() => hideOverlay()}\n className=\"text-primary hover:text-primary/80 transition-colors\"\n >\n <ArrowLeft className=\"w-5 h-5\" />\n </button>\n <h3 className=\"text-lg font-medium\">Select Token</h3>\n <div className=\"w-5 h-5\" /> {/* Spacer for alignment */}\n </div>\n\n {/* Content */}\n <AssetList\n assets={assets}\n onAssetClick={handleAssetClick}\n groupByChain={true}\n showChainIcon={true}\n filterVariant=\"navigation\"\n className=\"h-full\"\n />\n </div>\n );\n}\n","\"use client\";\nimport React, { useMemo } from \"react\";\nimport type { JSX } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { useWidgetStyles } from \"../../hooks/useWidgetStyles\";\nimport { Card } from \"@turtleclub/ui\";\nimport { cva } from \"class-variance-authority\";\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: \"default\" | \"border\" | \"shadow\";\n asChild?: boolean;\n}\n\nconst paddingVariants = cva(\"p-0\", {\n variants: {\n padding: {\n none: \"p-0\",\n sm: \"p-3\",\n default: \"p-4\",\n md: \"p-6\",\n lg: \"p-7\",\n },\n },\n defaultVariants: {\n padding: \"default\",\n },\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 = paddingVariants({ padding: padding ?? configPadding });\n const finalRounded = rounding ?? configRounding;\n\n return (\n <Card\n className={cn(className, finalPadding)}\n {...props}\n variant={variant}\n gradientBorder=\"white\"\n rounded={finalRounded}\n >\n {children}\n </Card>\n );\n}\n","\"use client\";\nimport 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?: \"xxs\" | \"xs\" | \"sm\" | \"md\" | \"lg\";\n}\n\nconst sizeClasses = {\n xxs: \"h-4 text-xs\",\n xs: \"h-6 text-sm\",\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])}>{fallback}</span>\n </div>\n );\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 { useEffect, useRef, useState } from \"react\";\nimport { useAdapter } from \"../context/adapter-context\";\n\ninterface GetWalletSignatureMessageBody {\n address: string;\n walletEcosystem: \"evm\" | \"solana\";\n url: string;\n}\n\ninterface GetWalletSignatureMessageResponse {\n message: string;\n nonce: string;\n}\n\ninterface AuthenticateBody {\n method: \"wallet\";\n walletInput: {\n address: string;\n ecosystem: \"evm\";\n signature: string;\n nonce: string;\n };\n}\n\ninterface AuthenticateResponse {\n user: {\n id: string;\n email: string | null;\n role: string;\n firstName: string;\n lastName: string;\n avatarUrl: string;\n telegramHandle: string;\n username: string;\n permissions: {\n id: string;\n name: string;\n description: string;\n }[];\n xUsername: string;\n };\n authTokens: {\n accessToken: string;\n refreshToken: string;\n };\n}\n\ninterface AuthState {\n isAuthenticated: boolean;\n isLoading: boolean;\n error: string | null;\n user: AuthenticateResponse[\"user\"] | null;\n tokens: AuthenticateResponse[\"authTokens\"] | null;\n}\n\nconst PARTNERS_API_BASE = \"https://api.turtle.xyz\";\nconst TOKEN_STORAGE_KEY = \"turtle_earn_widget_auth\";\n\ninterface StoredAuthData {\n address: string;\n tokens: AuthenticateResponse[\"authTokens\"];\n user: AuthenticateResponse[\"user\"];\n}\n\nexport const useAuth = () => {\n const adapter = useAdapter();\n const [authState, setAuthState] = useState<AuthState>({\n isAuthenticated: false,\n isLoading: false,\n error: null,\n user: null,\n tokens: null,\n });\n\n const previousAddressRef = useRef<string | undefined>(undefined);\n const isAuthenticatingRef = useRef(false);\n const hasCheckedStorageRef = useRef(false);\n\n // Helper functions for localStorage\n const getStoredAuth = (): StoredAuthData | null => {\n try {\n const stored = localStorage.getItem(TOKEN_STORAGE_KEY);\n if (stored) {\n return JSON.parse(stored);\n }\n } catch (error) {\n console.error(\"Error reading stored auth:\", error);\n }\n return null;\n };\n\n const setStoredAuth = (data: StoredAuthData) => {\n try {\n localStorage.setItem(TOKEN_STORAGE_KEY, JSON.stringify(data));\n } catch (error) {\n console.error(\"Error storing auth:\", error);\n }\n };\n\n const clearStoredAuth = () => {\n try {\n localStorage.removeItem(TOKEN_STORAGE_KEY);\n } catch (error) {\n console.error(\"Error clearing stored auth:\", error);\n }\n };\n\n useEffect(() => {\n const currentAddress = adapter?.user;\n\n // Check for stored auth on initial load for the current address\n if (currentAddress && !hasCheckedStorageRef.current && !isAuthenticatingRef.current) {\n hasCheckedStorageRef.current = true;\n const storedAuth = getStoredAuth();\n\n if (storedAuth && storedAuth.address.toLowerCase() === currentAddress.toLowerCase()) {\n // Validate token is still valid (you might want to check expiry here)\n setAuthState({\n isAuthenticated: true,\n isLoading: false,\n error: null,\n user: storedAuth.user,\n tokens: storedAuth.tokens,\n });\n previousAddressRef.current = currentAddress;\n return;\n }\n }\n\n // Check if address changed and is not undefined\n if (\n currentAddress !== previousAddressRef.current &&\n currentAddress !== undefined &&\n !isAuthenticatingRef.current\n ) {\n previousAddressRef.current = currentAddress;\n hasCheckedStorageRef.current = true;\n\n // Check if we have stored auth for this address\n const storedAuth = getStoredAuth();\n if (storedAuth && storedAuth.address.toLowerCase() === currentAddress.toLowerCase()) {\n setAuthState({\n isAuthenticated: true,\n isLoading: false,\n error: null,\n user: storedAuth.user,\n tokens: storedAuth.tokens,\n });\n } else {\n handleAuthentication(currentAddress);\n }\n } else if (currentAddress === undefined && previousAddressRef.current !== undefined) {\n previousAddressRef.current = undefined;\n hasCheckedStorageRef.current = false;\n // Clear stored auth when wallet disconnects\n clearStoredAuth();\n // Reset auth state when wallet disconnects\n setAuthState({\n isAuthenticated: false,\n isLoading: false,\n error: null,\n user: null,\n tokens: null,\n });\n }\n }, [adapter?.user]);\n\n const handleAuthentication = async (address: string) => {\n if (isAuthenticatingRef.current) return;\n isAuthenticatingRef.current = true;\n\n setAuthState((prev) => ({ ...prev, isLoading: true, error: null }));\n\n try {\n // Step 1: Get signature message\n const signatureMessageBody: GetWalletSignatureMessageBody = {\n address,\n walletEcosystem: \"evm\",\n url: window.location.href,\n };\n\n const signatureResponse = await fetch(\n `${PARTNERS_API_BASE}/auth/get-wallet-signature-message`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(signatureMessageBody),\n }\n );\n\n if (!signatureResponse.ok) {\n throw new Error(\"Failed to get signature message\");\n }\n\n const { message, nonce }: GetWalletSignatureMessageResponse = await signatureResponse.json();\n\n // Step 2: Sign message with adapter\n if (!adapter?.signMessage) {\n throw new Error(\"Wallet adapter does not support message signing\");\n }\n\n const signature = await adapter.signMessage(message);\n\n // Step 3: Authenticate with signature\n const authenticateBody: AuthenticateBody = {\n method: \"wallet\",\n walletInput: {\n address,\n ecosystem: \"evm\",\n signature,\n nonce,\n },\n };\n\n const authResponse = await fetch(`${PARTNERS_API_BASE}/auth/authenticate`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(authenticateBody),\n });\n\n if (!authResponse.ok) {\n throw new Error(\"Failed to authenticate\");\n }\n\n const authData: AuthenticateResponse = await authResponse.json();\n\n // Store auth data in localStorage\n setStoredAuth({\n address,\n tokens: authData.authTokens,\n user: authData.user,\n });\n\n setAuthState({\n isAuthenticated: true,\n isLoading: false,\n error: null,\n user: authData.user,\n tokens: authData.authTokens,\n });\n } catch (error) {\n console.error(\"Authentication error:\", error);\n setAuthState((prev) => ({\n ...prev,\n isLoading: false,\n error: error instanceof Error ? error.message : \"Authentication failed\",\n }));\n } finally {\n isAuthenticatingRef.current = false;\n }\n };\n\n const logout = () => {\n clearStoredAuth();\n setAuthState({\n isAuthenticated: false,\n isLoading: false,\n error: null,\n user: null,\n tokens: null,\n });\n };\n\n return { ...authState, logout };\n};\n","\"use client\";\nimport { type JSX, useState } from \"react\";\nimport { useEarnData } from \"../context/earn-data-context\";\nimport { CampaignItem, SearchBar } from \"@turtleclub/ui\";\nimport { useSetAtom } from \"jotai\";\nimport { showDealsOverlayAtom } from \"../store/overlay-atom\";\n\nexport function Discover(): JSX.Element {\n const [searchTerm, setSearchTerm] = useState(\"\");\n const showDeals = useSetAtom(showDealsOverlayAtom);\n\n // Get widget configuration\n\n // Get data from context\n const { campaigns, isLoading, error } = useEarnData();\n\n if (error) {\n return (\n <div className=\"w-full h-full flex items-center justify-center bg-background\">\n <p className=\"text-muted-foreground\">Error loading discover content</p>\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 discover content...</p>\n </div>\n );\n }\n\n return (\n <div className=\"w-full h-full flex flex-col min-h-0\">\n {/* Search Filters */}\n <div className=\"p-3 space-y-3 flex-shrink-0\">\n <h2 className=\"text-sm text-foreground font-medium\">\n Deposit directly into Turtle's boosted deals and liquidity campaign opportunities.\n </h2>\n\n {/* Search Input */}\n {/* <SearchBar searchTerm={searchTerm} setSearchTerm={setSearchTerm} placeholder=\"Search\" /> */}\n </div>\n\n {/* Content */}\n\n <div>\n {/* Campaigns Section */}\n {campaigns.map((campaign) => (\n <CampaignItem key={campaign.name} value={campaign} onSelect={() => showDeals()} />\n ))}\n\n {/* Partner Deals Section */}\n </div>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { usePartnerCampaigns, campaignsV2 } from \"@turtleclub/hooks\";\nimport { useWalletConnection } from \"../context/adapter-context\";\nimport type { CampaignPositionsData } from \"../types/positions\";\n\nconst { useUserCampaignPositions } = campaignsV2;\n\n// Campaign names - should match backend\nconst ALL_CAMPAIGN_NAMES = [\"tac\", \"katana\"] as const;\ntype CampaignName = (typeof ALL_CAMPAIGN_NAMES)[number];\n\ninterface UsePositionsDataResult {\n campaigns: Record<CampaignName, any>;\n positions: Record<CampaignName, CampaignPositionsData>;\n totalTVL: number;\n incentives: Record<CampaignName, any[]>;\n isLoading: boolean;\n error: Error | null;\n}\n\n/**\n * Consolidated hook for positions data\n * This replaces multiple separate hooks with a single efficient solution\n */\nexport function usePositionsData(): UsePositionsDataResult {\n const { user: userAddress } = useWalletConnection();\n\n // Fetch all campaigns using existing @turtleclub/hooks\n const {\n data: campaignsData,\n isLoading: campaignsLoading,\n error: campaignsError,\n } = usePartnerCampaigns({\n idFilter: ALL_CAMPAIGN_NAMES.join(\",\"),\n });\n\n // Process campaigns data\n const campaigns = useMemo(() => {\n if (!campaignsData) return {} as Record<CampaignName, any>;\n\n return ALL_CAMPAIGN_NAMES.reduce(\n (acc, name) => {\n const campaignWithVaults = campaignsData.find(\n (c) => c.campaign.name.toLowerCase() === name\n );\n if (campaignWithVaults) {\n // Store the entire CampaignWithVaults object, not just the campaign\n acc[name] = campaignWithVaults;\n\n // TODO: Remove this mock data once vaults are available from API\n if (campaignWithVaults.vaults.length === 0) {\n console.warn(`⚠️ Campaign ${name} has no vaults from API`);\n }\n }\n return acc;\n },\n {} as Record<CampaignName, any>\n );\n }, [campaignsData]);\n\n\n const {\n userPositions: tacPositions,\n userTotalTVL: tacTVL,\n isLoading: tacLoading,\n error: tacError,\n } = useUserCampaignPositions({\n campaignName: \"tac\",\n userAddress,\n });\n\n // Fetch positions for Katana campaign\n const {\n userPositions: katanaPositions,\n userTotalTVL: katanaTVL,\n isLoading: katanaLoading,\n error: katanaError,\n } = useUserCampaignPositions({\n campaignName: \"katana\",\n userAddress,\n });\n\n // Combine positions from both campaigns\n const positions = useMemo(\n () =>\n ({\n tac: {\n userPositions: tacPositions || [],\n userTotalTVL: tacTVL || 0,\n },\n katana: {\n userPositions: katanaPositions || [],\n userTotalTVL: katanaTVL || 0,\n },\n }) as Record<CampaignName, CampaignPositionsData>,\n [tacPositions, tacTVL, katanaPositions, katanaTVL]\n );\n\n const totalTVL = (tacTVL || 0) + (katanaTVL || 0);\n\n // TODO: Implement incentives hook\n const incentives = useMemo(\n () =>\n ALL_CAMPAIGN_NAMES.reduce(\n (acc, name) => {\n acc[name] = [];\n return acc;\n },\n {} as Record<CampaignName, any[]>\n ),\n []\n );\n\n const isLoading = campaignsLoading || tacLoading || katanaLoading;\n const error = campaignsError || tacError || katanaError;\n\n return {\n campaigns,\n positions,\n totalTVL,\n incentives,\n isLoading,\n error,\n };\n}\n","import { Position } from \"@/types\";\nimport { formatCurrency } from \"@/utils/format\";\nimport { ColumnDef } from \"@tanstack/react-table\";\n\nexport const columns: ColumnDef<Position>[] = [\n {\n id: \"vault.id\",\n header: \"Position\",\n accessorKey: \"vault.id\",\n cell: ({ row }) => {\n return (\n <div className=\"flex justify-start gap-0.5\">\n <a\n href={`https://app.turtle.club/campaigns/${row.original.vault.campaign}`}\n className=\"flex max-w-[120px] items-center gap-[5px] text-foreground hover:text-primary transition-colors\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <img\n src={row.original.vault.iconUrl}\n alt={row.original.vault.name}\n className=\"size-5 shrink-0 rounded-full\"\n />\n <span className=\"truncate\">{row.original.vault.name}</span>\n </a>\n </div>\n );\n },\n },\n {\n id: \"tvl\",\n header: \"TVL\",\n accessorKey: \"tvl\",\n cell: ({ row }) => {\n return formatCurrency(row.original.userTVL ?? 0, 2);\n },\n },\n];\n","\"use client\";\nimport { useMemo } from \"react\";\nimport { useWalletConnection } from \"../../context/adapter-context\";\nimport { usePositionsData } from \"../../hooks/usePositionsData\";\nimport { Button, DataTable, IconAnimation, Separator } from \"@turtleclub/ui\";\nimport { formatCurrency } from \"../../utils/format\";\nimport { columns } from \"./columns\";\nimport { TurtleIcon } from \"lucide-react\";\n// Campaign names are hardcoded for now since we only have two campaigns\nconst ALL_CAMPAIGN_NAMES = [\"katana\"] as const;\n\nexport function Positions() {\n const { user: userAddress, openConnectionModal } = useWalletConnection();\n\n const { positions: allPositions, totalTVL, isLoading } = usePositionsData();\n\n const sortedPositions = useMemo(() => {\n const combined = ALL_CAMPAIGN_NAMES.flatMap((name) => allPositions[name].userPositions);\n return combined.sort((a, b) => b.userTVL - a.userTVL);\n }, [allPositions]);\n\n const handleConnectWallet = () => {\n if (openConnectionModal) {\n openConnectionModal();\n }\n };\n\n if (isLoading || sortedPositions.length === 0) {\n return (\n <div className=\"sm:min-h-[690px] -mt-8 flex flex-col justify-center items-center gap-4\">\n <IconAnimation spinning={true}>\n <TurtleIcon className=\"w-6 h-6 text-primary\" />\n </IconAnimation>\n Loading...\n </div>\n );\n }\n\n return (\n <div className=\"sm:min-h-[690px] p-4\">\n {/*<ManagedTable\n items={sortedPositions.filter((position) => position)}\n itemKey={({ vault }) => vault.id}\n columns={[\n {\n name: \"Position\",\n comparator: { value: ({ vault }) => vault.name, cmp: compareStrings },\n },\n {\n name: \"Your TVL\",\n comparator: { value: ({ userTVL }) => userTVL, cmp: compareNumbers },\n },\n {\n name: \"Est Earnings\",\n },\n {\n name: \"Est APR\",\n comparator: {\n value: ({ vault }) => {\n const campaignData = campaigns[vault.campaign as CampaignName];\n const campaign = campaignData?.campaign || campaignData;\n return Number(getVaultEstApr(campaign, vault) || 0);\n },\n cmp: compareNumbers,\n },\n },\n ]}\n defaultComparator=\"Your TVL\"\n hasScrollableContainer\n render={(item) => {\n const vault = item.vault;\n const campaignId = vault.campaign as CampaignName;\n const campaign = campaigns[campaignId]?.campaign || campaigns[campaignId];\n\n const vaultEarnings = (allIncentives[campaignId] ?? [])\n .filter((earning: any) => earning.vaultId === vault.id)\n .reduce((acc: number, curr: any) => acc + curr.valueUSD, 0);\n\n return (\n <Fragment key={vault.id}>\n <TableCell data-name=\"Position\">\n <div className=\"flex justify-end gap-0.5 lg:justify-start\">\n <a\n href={`https://app.turtle.club/campaigns/${campaignId}`}\n className=\"flex max-w-[120px] items-center gap-[5px] text-foreground hover:text-primary transition-colors\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <img\n src={vault.iconUrl}\n alt={vault.name}\n className=\"size-5 shrink-0 rounded-full\"\n />\n <span className=\"truncate\">{vault.name}</span>\n </a>\n </div>\n </TableCell>\n <TableCell data-name=\"Your TVL\">{formatCurrency(item.userTVL ?? 0, 2)}</TableCell>\n <TableCell data-name=\"Est Earnings\">{formatCurrency(vaultEarnings, 2)}</TableCell>\n <TableCell data-name=\"Est APR\">\n {formatNumber(Number(getVaultEstApr(campaign, vault) || 0), 2)}%\n </TableCell>\n </Fragment>\n );\n }}\n />*/}\n\n {!isLoading && userAddress === undefined ? (\n <Button variant=\"default\" border=\"plain\" onClick={handleConnectWallet}>\n Connect wallet\n </Button>\n ) : (\n <>\n <div className=\"text-right text-sm mr-2\">\n <span className=\"text-muted-foreground\">Your TVL: </span>\n <span className=\"text-foreground font-semibold\">{formatCurrency(totalTVL, 2)}</span>\n </div>\n <Separator className=\"my-2\" />\n <DataTable columns={columns} data={sortedPositions} />\n </>\n )}\n </div>\n );\n}\n","\"use client\";\nimport { useAtom } from \"jotai\";\nimport { selectedDealAtom, type OpportunityValue } from \"../store/earn-route-atom\";\nimport { useAdapter } from \"../context/adapter-context\";\nimport { isChainSupported } from \"@turtleclub/chains\";\n\ninterface UseSelectedOpportunityReturn {\n selectedOpportunity: OpportunityValue | null;\n setSelectedOpportunity: (opportunity: OpportunityValue | null) => void;\n chainId: number | undefined;\n needsChainSwitch: boolean;\n isCorrectChain: boolean;\n switchToOpportunityChain: () => Promise<void>;\n getTokenAddress: () => string | undefined;\n getTokenSymbol: () => string | undefined;\n getVaultId: () => string | undefined;\n}\n\nexport function useSelectedOpportunity(): UseSelectedOpportunityReturn {\n const [selectedOpportunity, setSelectedOpportunity] = useAtom(selectedDealAtom);\n const adapter = useAdapter();\n const currentNetwork = adapter.network;\n\n // Extract chainId from the opportunity\n const chainId = selectedOpportunity?.opportunityItem?.chain?.chainId;\n\n // Check if user needs to switch chains\n const needsChainSwitch = !!(\n selectedOpportunity &&\n currentNetwork !== undefined &&\n chainId !== undefined &&\n chainId !== currentNetwork &&\n isChainSupported(chainId)\n );\n\n // Check if user is on the correct chain\n const isCorrectChain = !!(\n selectedOpportunity &&\n currentNetwork !== undefined &&\n chainId !== undefined &&\n chainId === currentNetwork\n );\n\n // Function to switch to the opportunity's chain\n const switchToOpportunityChain = async () => {\n if (chainId && needsChainSwitch) {\n try {\n await adapter.changeNetwork(chainId);\n } catch (error) {\n console.error(\"Failed to switch network:\", error);\n throw error;\n }\n }\n };\n\n // Utility function to get token address\n const getTokenAddress = () => {\n return selectedOpportunity?.tokenDetails?.tokenAddress;\n };\n\n // Utility function to get token symbol\n const getTokenSymbol = () => {\n return selectedOpportunity?.tokenDetails?.tokenSymbol;\n };\n\n // Utility function to get vault ID\n const getVaultId = () => {\n return selectedOpportunity?.id;\n };\n\n return {\n selectedOpportunity,\n setSelectedOpportunity,\n chainId,\n needsChainSwitch,\n isCorrectChain,\n switchToOpportunityChain,\n getTokenAddress,\n getTokenSymbol,\n getVaultId,\n };\n}","\"use client\";\nimport { useSetAtom } from \"jotai\";\nimport { showAssetsOverlayAtom } from \"../store/overlay-atom\";\n\nexport function useTokenSelectorOverlay() {\n const showAssetSelector = useSetAtom(showAssetsOverlayAtom);\n\n const openTokenSelector = () => {\n showAssetSelector();\n };\n\n return {\n openTokenSelector,\n };\n}","\"use client\";\nimport type { JSX } from \"react\";\nimport { useAtom, useAtomValue } from \"jotai\";\nimport { useEffect } from \"react\";\nimport { formatNumber, formatToken } from \"@turtleclub/utils\";\nimport { depositValueAtom, resetTriggerAtom } from \"../../store/earn-route-atom\";\nimport { formatUSDValue } from \"../../adapters\";\nimport { useAdapter } from \"../../context/adapter-context\";\nimport { getChainById } from \"@turtleclub/chains\";\nimport { useTokenAutoSelection } from \"../../hooks/useTokenAutoSelection\";\nimport { useSelectedOpportunity } from \"../../hooks/useSelectedOpportunity\";\nimport { useTokenSelectorOverlay } from \"../../hooks/useTokenSelectorOverlay\";\nimport { SwapInput, iconUrlToImg } from \"@turtleclub/ui\";\nimport type { Token as UIToken } from \"@turtleclub/ui\";\n\nexport function SwapInputWrapper(): JSX.Element {\n const adapter = useAdapter();\n const walletConnected = !!adapter.user;\n\n const { chainId, needsChainSwitch, switchToOpportunityChain } = useSelectedOpportunity();\n const [amount, setAmount] = useAtom(depositValueAtom);\n const resetTrigger = useAtomValue(resetTriggerAtom);\n\n // Use custom hooks for token management\n const { selectedToken, currentChainBalances, isLoadingBalances } = useTokenAutoSelection();\n const { openTokenSelector } = useTokenSelectorOverlay();\n\n // Map earn widget tokens to UI tokens format\n const uiTokens: UIToken[] =\n currentChainBalances?.map((balance) => ({\n icon: balance.token.logos?.[0]\n ? iconUrlToImg(balance.token.logos[0], balance.token.symbol)\n : null,\n symbol: balance.token.symbol,\n address: balance.token.address,\n balance: balance.amount,\n })) || [];\n\n // Map selected token to UI token format if needed\n const selectedUIToken: UIToken | null = selectedToken\n ? {\n icon: selectedToken.logo ? iconUrlToImg(selectedToken.logo, selectedToken.symbol) : null,\n symbol: selectedToken.symbol,\n address: selectedToken.address,\n balance: selectedToken.balance,\n }\n : null;\n\n // Reset amount when token changes\n useEffect(() => {\n setAmount(\"\");\n }, [selectedToken, setAmount]);\n\n // Reset amount when reset trigger changes\n useEffect(() => {\n if (resetTrigger > 0) {\n setAmount(\"\");\n }\n }, [resetTrigger, setAmount]);\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(formatToken(selectedToken.balance, selectedToken), 5, false, false)\n : \"0\";\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 // Get target chain info if we need to switch\n const targetChain = needsChainSwitch && chainId ? getChainById(chainId) : null;\n\n // Show chain switch message if deal is from different chain\n if (needsChainSwitch && targetChain && walletConnected) {\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 p-4 border border-muted rounded-lg bg-muted/10\">\n <p className=\"text-sm text-muted-foreground text-center\">\n Please{\" \"}\n <button\n onClick={switchToOpportunityChain}\n className=\"text-primary hover:text-primary/80 underline font-medium cursor-pointer transition-colors\"\n >\n switch\n </button>{\" \"}\n to <strong>{targetChain.name}</strong> to continue with this opportunity\n </p>\n </div>\n </div>\n );\n }\n\n // Show loading state\n if (isLoadingBalances && walletConnected) {\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 p-4 border border-muted rounded-lg bg-muted/10\">\n <p className=\"text-sm text-muted-foreground text-center\">Loading tokens...</p>\n </div>\n </div>\n );\n }\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 usdValue={hasInsufficientBalance ? undefined : usdValue}\n balance={formattedBalance}\n onMaxClick={handleMaxClick}\n isWalletConnected={walletConnected}\n className={`w-full [&_button]:w-32 [&_button]:min-w-32 p-6 ${hasInsufficientBalance ? \"border-destructive/50\" : \"\"}`}\n // Use custom token selector\n useCustomTokenSelector={true}\n selectedTokenData={selectedUIToken}\n onCustomTokenSelectorClick={openTokenSelector}\n />\n \n </div>\n </div>\n );\n}\n","import { useState, useCallback, useEffect, useRef, useMemo } from \"react\";\nimport type { EarnRouteResponse, EarnRouteStep } from \"../types/earn-route\";\nimport { useWalletConnection } from \"..\";\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 { network } = useWalletConnection();\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: network,\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 // 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 =\n previousStepIndex >= 0 && state.steps[previousStepIndex]?.completed;\n const currentStepNotStarted =\n state.currentIndex < state.steps.length && !state.steps[state.currentIndex]?.completed;\n const hasNextStep = state.currentIndex < state.steps.length;\n\n const shouldAutoExecute =\n previousStepCompleted &&\n currentStepNotStarted &&\n hasNextStep &&\n !state.isExecuting &&\n !state.allCompleted &&\n !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 }, [\n state.steps,\n state.currentIndex,\n state.isExecuting,\n state.allCompleted,\n state.cancelled,\n executeCurrentTransaction,\n ]);\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 id: options!.id || \"\",\n distributor_id: options!.distributor_id || \"\",\n referral_code: options!.referral_code || \"\",\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, selectedDealAtom } from \"../store/earn-route-atom\";\nimport { useEarnRoute as useEarnRouteOriginal } from \"@turtleclub/hooks\";\nimport type { earnTyped } from \"@turtleclub/api\";\nimport { useDistributorId } from \"../context/adapter-context\";\nimport { TokenStep } from \"@turtleclub/ui\";\nimport { formatUnits } from \"@/utils/format\";\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 const selectedDeal = useAtomValue(selectedDealAtom);\n const distributorId = useDistributorId();\n\n // Call the original useEarnRoute hook with the consolidated options and distributor_id\n const result = useEarnRoute(\n routeOptions && {\n ...routeOptions,\n distributor_id: distributorId,\n id: routeOptions.id || \"\",\n }\n );\n\n // Also get the original data for route processing\n const enabled =\n routeOptions !== undefined &&\n !!routeOptions.user &&\n !!routeOptions.amount &&\n parseFloat(routeOptions.amount) > 0;\n\n const { data: originalData } = useEarnRouteOriginal(\n enabled\n ? {\n user: routeOptions!.user,\n chain: routeOptions!.chain || 1,\n tokenIn: routeOptions!.tokenIn,\n tokenOut: routeOptions!.tokenOut,\n amount: routeOptions!.amount,\n slippage: routeOptions!.slippage || 0.1,\n distributor_id: distributorId || \"\",\n referral_code: routeOptions!.referral_code || \"\",\n id: routeOptions!.id || \"\",\n }\n : undefined\n );\n\n // Process route details from original data\n const routeDetails = processRouteDetails(originalData, selectedDeal);\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 routeDetails,\n };\n}\n\n/**\n * Process the route steps to extract token flow for RouteDetails component\n */\nfunction processRouteDetails(data: any, selectedDeal: any): TokenStep[] {\n if (!data?.steps) return [];\n\n const parseApproveStep = (token: earnTyped.Token, amount: string): TokenStep => {\n return {\n in: {\n icon: token.logos[0],\n symbol: token.symbol,\n },\n out: null,\n amount: formatUnits(BigInt(amount), token.decimals),\n type: \"approve\",\n };\n };\n\n const parseEnsoStep = (\n kind: \"swap\" | \"deposit\",\n fromToken: earnTyped.Token,\n toToken: earnTyped.Token\n ): TokenStep => {\n return {\n in: {\n icon: fromToken.logos[0],\n symbol: fromToken.symbol,\n },\n out: {\n icon: toToken.logos[0] || selectedDeal?.iconToken || selectedDeal?.iconDeal || undefined,\n symbol: toToken.symbol,\n },\n amount: undefined,\n type: kind,\n };\n };\n\n const tokens: TokenStep[] = [];\n data.steps.forEach((step: earnTyped.RouterStep) => {\n // Approve steps\n if (step.kind === \"approve\" && step.token) {\n const approveStep = parseApproveStep(step.token, step.amount);\n tokens.push(approveStep);\n }\n\n // Enso steps (swaps)\n if (step.kind === \"enso\" && step.substeps) {\n step.substeps.forEach((substep: earnTyped.RouterSubstep) => {\n const fromToken = substep.from[0];\n const toToken = substep.to[0];\n const step: TokenStep = parseEnsoStep(substep.kind, fromToken, toToken);\n tokens.push(step);\n });\n }\n });\n\n return tokens;\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}","\"use client\";\nimport { Button, Tooltip, TooltipContent, TooltipTrigger } from \"@turtleclub/ui\";\nimport { useAdapter } from \"../../context/adapter-context\";\nimport { useGeocheck } from \"@turtleclub/hooks\";\n\ninterface SimpleConfirmButtonProps {\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 const { data: geoCheckData, isLoading: geoCheckLoading } = useGeocheck();\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 null;\n }\n\n // Geo restriction check\n if (geoCheckLoading) {\n return (\n <Button disabled className={className} size=\"lg\" fullWidth>\n Checking availability...\n </Button>\n );\n }\n\n if (geoCheckData && !geoCheckData.canInteract) {\n return (\n <Tooltip>\n <TooltipTrigger className=\"w-full cursor-default space-y-2\">\n <Button disabled variant=\"default\" className={className} size=\"lg\" fullWidth>\n Geo Restricted\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\" sideOffset={6} className=\"text-xs\">\n Due to geographical restrictions you can't use this vault.\n </TooltipContent>\n </Tooltip>\n );\n }\n\n // Connect wallet button\n if (!userAddress || !walletConnected) {\n return (\n <Button\n onClick={() => openConnectionModal()}\n className={\"cursor-pointer w-full\"}\n variant=\"green\"\n border=\"interactive\"\n size=\"lg\"\n fullWidth\n >\n Connect Wallet\n </Button>\n );\n }\n\n // Loading state\n if (isLoadingRoute) {\n return (\n <Button disabled className={className} size=\"lg\" fullWidth>\n Loading route...\n </Button>\n );\n }\n\n // Error state\n if (routeError) {\n return (\n <Button disabled variant=\"default\" className={className} size=\"lg\" fullWidth>\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=\"default\" className={className} size=\"lg\" fullWidth>\n Enter amount to continue\n </Button>\n );\n }\n\n // Insufficient balance\n if (hasInsufficientBalance) {\n return (\n <Button disabled variant=\"default\" className={className} size=\"lg\" fullWidth>\n Insufficient Balance\n </Button>\n );\n }\n\n // Render confirm button\n return (\n <Button\n variant=\"green\"\n border=\"interactive\"\n onClick={handleConfirm}\n disabled={!canExecute || isExecuting}\n size=\"lg\"\n className={\"cursor-pointer w-full\"}\n fullWidth\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}\n","\"use client\";\nimport { 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","\"use client\";\nimport { SwapDetails } from \"@turtleclub/ui\";\nimport { useMemo } from \"react\";\nimport { useAtom } from \"jotai\";\nimport { formatNumber, formatToken } from \"@turtleclub/utils\";\nimport { slippageAtom } from \"../../store/earn-route-atom\";\n\ninterface SwapDetailsWrapperProps {\n amountToDeposit: string;\n depositSymbol: string;\n amountToReceive: string;\n receiveSymbol: string;\n receiveDecimals: number;\n tokenPrice: number;\n defaultOpen?: boolean;\n}\nexport function SwapDetailsWrapper({\n amountToDeposit,\n depositSymbol,\n amountToReceive,\n receiveSymbol,\n receiveDecimals,\n tokenPrice,\n defaultOpen = false,\n}: SwapDetailsWrapperProps) {\n const [slippage, setSlippage] = useAtom(slippageAtom);\n // Calculate swap details based on current state\n const swapDetailsProps = useMemo(() => {\n // Format amount to max 6 decimals\n const formattedAmount = amountToDeposit ? formatNumber(amountToDeposit, 6, false, false) : \"0\";\n\n const formattedAmountToReceive = amountToReceive\n ? formatToken(amountToReceive, { decimals: receiveDecimals }, true, false)\n : \"0\";\n\n return {\n deposit: amountToDeposit ? `${formattedAmount} ${depositSymbol || \"ETH\"}` : \"0 ETH\",\n receive: amountToReceive ? `${formattedAmountToReceive} ${receiveSymbol || \"ETH\"}` : \"0 ETH\",\n equivalentInUsd:\n amountToDeposit && tokenPrice\n ? (parseFloat(amountToDeposit) * tokenPrice).toFixed(2)\n : \"0.00\",\n defaultOpen: defaultOpen,\n slippage: slippage,\n setSlippage: setSlippage,\n };\n }, [amountToDeposit, depositSymbol, amountToReceive, receiveSymbol, tokenPrice, defaultOpen]);\n return <SwapDetails details={swapDetailsProps} />;\n}\n","\"use client\";\nimport { Wallet2Icon } from \"lucide-react\";\nimport type { JSX } from \"react\";\nimport { useState } from \"react\";\n\ninterface AccountDetailsProps {\n userAddress?: string;\n disconnect: () => Promise<void>;\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, disconnect }: AccountDetailsProps): JSX.Element {\n const [isHovered, setIsHovered] = useState(false);\n\n const handleMouseEnter = () => {\n setIsHovered(true);\n };\n\n const handleMouseLeave = () => {\n setIsHovered(false);\n };\n\n return (\n <button\n type=\"button\"\n onClick={() => disconnect()}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n className=\"relative rounded-full bg-secondary px-3 py-1.5 border border-border cursor-pointer transition-colors hover:border-primary min-w-[140px] h-9 overflow-hidden\"\n >\n {/* Address - visible by default, hidden on hover */}\n <div \n className=\"flex items-center gap-2 transition-opacity duration-150\"\n style={{ opacity: isHovered ? 0 : 1 }}\n >\n <Wallet2Icon className=\"w-4 h-4\" />\n <span className=\"text-foreground font-medium text-xs\">{shortenAddress(userAddress)}</span>\n </div>\n\n {/* Disconnect - hidden by default, visible on hover */}\n <div \n className=\"absolute inset-0 flex items-center justify-center gap-2 transition-opacity duration-150\"\n style={{ opacity: isHovered ? 1 : 0 }}\n >\n <span className=\"text-primary font-medium text-xs\">Log out</span>\n </div>\n </button>\n );\n}\n\nexport default AccountDetails;\n","\"use client\";\nimport type { JSX } from \"react\";\nimport { useMemo } from \"react\";\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n} from \"@turtleclub/ui\";\nimport { chainLogo, getChainById } from \"@turtleclub/chains\";\nimport { useEarnData } from \"../../context/earn-data-context\";\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 { supportedChains, isLoading } = useEarnData();\n\n // Always use the selectedChainId from props (context) as the source of truth\n const currentChain = useMemo(() => {\n // First try to find the chain in available chains\n const chainInList = supportedChains.find((chain) => chain.chainId === selectedChainId);\n if (chainInList) return chainInList;\n\n // If not in list but we have a selectedChainId, create a temporary entry\n if (selectedChainId) {\n const chain = getChainById(selectedChainId);\n const icon = chainLogo(selectedChainId);\n\n if (chain) {\n return {\n value: chain.name.toLowerCase().replace(/\\s+/g, \"-\"),\n symbol: chain.nativeCurrency.symbol,\n name: chain.name,\n icon,\n chainId: selectedChainId,\n };\n }\n }\n\n // Fallback to first available\n return supportedChains[0];\n }, [selectedChainId, supportedChains]);\n\n // Show skeleton while loading\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-between rounded-full rounded-l-none bg-card py-2 pr-4 h-9 animate-pulse\">\n <div className=\"w-8 h-8 -translate-x-2.5\">\n <div className=\"w-8 h-8 rounded-full bg-muted\" />\n </div>\n <div className=\"flex items-center gap-3\">\n <div className=\"h-4 w-20 bg-muted rounded\" />\n </div>\n </div>\n );\n }\n\n // Safeguard if no chains are available after loading\n if (!currentChain || supportedChains.length === 0) {\n return null;\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger src={currentChain.icon}>{currentChain.name}</DropdownMenuTrigger>\n\n <DropdownMenuContent>\n {supportedChains.map((chain) => (\n <DropdownMenuItem key={chain.value} onClick={() => onChainChange?.(chain.chainId)}>\n <img src={chain.icon} alt={chain.name} className=\"size-6 rounded-full -ml-1\" />\n {chain.name}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","\"use client\";\nimport 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-2\">\n {/* Wallet Address Display - Only show when connected */}\n {walletConnected && userAddress && <AccountDetails userAddress={userAddress} disconnect={adapter.disconnect} />}\n\n {/* Chain Selector - Only show when connected */}\n {walletConnected && <ChainSelector selectedChainId={selectedChainId} onChainChange={handleChainChange} />}\n </div>\n );\n}\n","\"use client\";\nimport type { JSX } from \"react\";\n\nexport function SwapSkeleton(): JSX.Element {\n return (\n <div className=\"w-full flex flex-col gap-4 flex-1 min-h-0 h-full overflow-hidden\">\n {/* Wallet Section Skeleton */}\n <div className=\"flex-shrink-0\">\n <div className=\"flex w-full items-center justify-between gap-2\">\n {/* Account Details Skeleton */}\n <div className=\"rounded-full bg-secondary px-3 py-1.5 border border-border min-w-[140px] h-9\">\n <div className=\"animate-pulse\">\n <div className=\"h-4 w-24 bg-muted rounded\" />\n </div>\n </div>\n \n {/* Chain Selector Skeleton */}\n <div className=\"flex items-center justify-between rounded-full rounded-l-none bg-card py-2 pr-4 h-9 animate-pulse\">\n <div className=\"w-8 h-8 -translate-x-2.5\">\n <div className=\"w-8 h-8 rounded-full bg-muted\" />\n </div>\n <div className=\"flex items-center gap-3\">\n <div className=\"h-4 w-20 bg-muted rounded\" />\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"flex-shrink-0 space-y-2\">\n {/* Swap Input Wrapper Skeleton */}\n <div className=\"rounded-lg bg-secondary p-4 space-y-3 animate-pulse\">\n {/* Amount Input Skeleton */}\n <div className=\"flex justify-between items-center\">\n <div className=\"h-8 w-32 bg-muted rounded\" />\n <div className=\"flex items-center gap-2\">\n <div className=\"w-8 h-8 rounded-full bg-muted\" />\n <div className=\"h-6 w-16 bg-muted rounded\" />\n </div>\n </div>\n \n {/* Balance Skeleton */}\n <div className=\"flex justify-between text-sm\">\n <div className=\"h-4 w-24 bg-muted rounded\" />\n <div className=\"h-4 w-20 bg-muted rounded\" />\n </div>\n </div>\n\n {/* Opportunity Section Loading State */}\n <div className=\"p-6 border border-border rounded-lg space-y-4 animate-pulse\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-full bg-muted\" />\n <div className=\"space-y-2\">\n <div className=\"h-5 w-32 bg-muted rounded\" />\n <div className=\"h-4 w-24 bg-muted rounded\" />\n </div>\n </div>\n \n <div className=\"space-y-2\">\n <div className=\"flex justify-between\">\n <div className=\"h-4 w-16 bg-muted rounded\" />\n <div className=\"h-4 w-20 bg-muted rounded\" />\n </div>\n <div className=\"flex justify-between\">\n <div className=\"h-4 w-16 bg-muted rounded\" />\n <div className=\"h-4 w-24 bg-muted rounded\" />\n </div>\n </div>\n\n <div className=\"pt-2\">\n <div className=\"h-10 w-full bg-muted rounded-lg\" />\n </div>\n </div>\n </div>\n\n {/* Empty scrollable area */}\n <div className=\"flex-1 min-h-0\" />\n\n {/* Confirm button skeleton */}\n <div className=\"sticky bottom-0 pb-2 w-full\">\n <div className=\"h-12 w-full bg-muted rounded-lg animate-pulse\" />\n </div>\n </div>\n );\n}","\"use client\";\nimport { useEffect, useMemo, type JSX } from \"react\";\nimport { SwapInputWrapper } from \"./swap-input-wrapper\";\nimport { useAtomValue, useSetAtom } from \"jotai\";\nimport { useTransactionQueue } from \"../../hooks/useTransactionQueue\";\nimport { useTokenDeposit } from \"../../hooks/useTokenDeposit\";\nimport { useEarnRouteConsolidated } from \"../../hooks/useEarnRouteConsolidated\";\nimport { selectedTokenAtom, selectedDealAtom, depositValueAtom } from \"../../store/earn-route-atom\";\nimport { useAdapter } from \"../../context/adapter-context\";\nimport { SimpleConfirmButton } from \"./simple-confirm-button\";\nimport { TransactionStatusSection } from \"./transaction-status\";\nimport { SwapDetailsWrapper } from \"./swap-details-wrapper\";\nimport { formatToken } from \"@turtleclub/utils\";\nimport { OpportunitySection, RouteDetails } from \"@turtleclub/ui\";\nimport { WalletSection } from \"../wallet-section\";\nimport { showDealsOverlayAtom } from \"@/store/overlay-atom\";\nimport { useEarnData } from \"../../context/earn-data-context\";\nimport { SwapSkeleton } from \"./swap-skeleton\";\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 const showDeals = useSetAtom(showDealsOverlayAtom);\n\n // Get adapter methods from context\n const adapter = useAdapter();\n const { sendTransaction, openConnectionModal, user: userAddress } = adapter;\n\n // Get loading state from earn data context\n const { isLoading: isEarnDataLoading, balancesLoading: isBalancesLoading } = useEarnData();\n\n // Get transaction state from hooks\n const { fetchedRoute, routeError, isLoadingRoute } = useTokenDeposit();\n // Get route details for RouteDetails component\n const { routeDetails } = useEarnRouteConsolidated();\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 const opSectionData = useMemo(() => {\n return {\n name: dealSelected?.opportunityItem.name ?? \"N/A\",\n vaultSymbol: dealSelected?.tokenDetails?.tokenSymbol ?? \"N/A\",\n icon: dealSelected?.opportunityItem.icon ?? \"N/A\",\n totalApr: dealSelected?.opportunityItem.apr ?? \"N/A\",\n aprBreakdown:\n dealSelected?.opportunityItem.aprBreakdown.map((incentive) => ({\n name: incentive.name,\n iconUrl: incentive.iconUrl,\n apr: incentive.apr?.toString() ?? \"0\",\n description: incentive.description,\n boost: incentive.boost,\n })) ?? [],\n tvlUsd: dealSelected?.opportunityItem.tvl ?? \"N/A\",\n depositDetails: {\n symbol: selectedToken?.symbol ?? \"N/A\",\n price: selectedToken?.price ?? 0,\n depositAmount: parseFloat(!depositValue ? \"0\" : depositValue) ?? 0,\n apr: parseFloat(dealSelected?.opportunityItem.apr ?? \"0\") / 100,\n },\n type: \"Turtle Campaign\" as const,\n };\n }, [dealSelected, depositValue, selectedToken]);\n\n // Show skeleton while loading earn data\n if (isEarnDataLoading || isBalancesLoading) {\n return <SwapSkeleton />;\n }\n\n return (\n <div className=\"w-full flex flex-col gap-4 flex-1 min-h-0 h-full overflow-hidden\">\n <div className=\"flex-shrink-0\">\n <WalletSection />\n </div>\n\n <div className=\"flex-shrink-0 space-y-2\">\n <SwapInputWrapper />\n <OpportunitySection\n className=\"p-6\"\n value={opSectionData}\n opportunitySelector=\"old\"\n onOpportunityClick={() => showDeals()}\n hideDisclaimer={\n // (showSwapDetails && fetchedRoute && !isLoadingRoute) || showingTransactionStatus\n true\n }\n />\n </div>\n\n {/* 4. Info section - Only this section is scrollable */}\n <div className=\"flex-1 min-h-0 overflow-y-auto\">\n {/* 3. Transaction details - Fixed when shown */}\n {showSwapDetails && fetchedRoute && !isLoadingRoute && (\n <div className=\"flex-shrink-0 space-y-2\">\n <SwapDetailsWrapper\n amountToDeposit={depositValue}\n depositSymbol={selectedToken?.symbol || \"\"}\n amountToReceive={fetchedRoute?.outputAmount || \"0\"}\n receiveSymbol={dealSelected?.tokenDetails?.tokenSymbol || \"\"}\n receiveDecimals={dealSelected?.tokenDetails?.tokenDecimals || 0}\n tokenPrice={selectedToken?.price || 0}\n defaultOpen={true}\n />\n\n {/* Route Details - Show the token swap route */}\n {routeDetails && routeDetails.length > 0 && (\n <RouteDetails value={{ steps: routeDetails }} />\n )}\n </div>\n )}\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 </div>\n\n {/* 5. Confirm button - Sticky at bottom */}\n <div className=\"sticky bottom-0 pb-2 w-full\">\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","\"use client\";\nimport React, { useMemo, useState } from \"react\";\nimport type { EarnWidgetProps } from \"../../types\";\nimport { WidgetRoot } from \"./widget-root\";\nimport { useAtomValue, useSetAtom } from \"jotai\";\nimport { overlayTypeAtom } from \"../../store/overlay-atom\";\nimport { Deals } from \"../deals\";\nimport { AssetSelection } from \"../asset-selection\";\nimport { WidgetContainer, WidgetLogo } from \"../ui\";\nimport { SegmentControl } from \"@turtleclub/ui\";\nimport { AdapterProvider } from \"../../context/adapter-context\";\nimport { EarnDataProvider } from \"../../context/earn-data-context\";\nimport { useEarnRouteSync } from \"../../hooks/useEarnRouteSync\";\nimport { useWidgetLogo } from \"../../hooks/useWidgetLogo\";\nimport { useWidgetStyles } from \"../../hooks/useWidgetStyles\";\nimport { useAuth } from \"../../hooks/useAuth\";\nimport { Discover } from \"../discover\";\nimport { Positions } from \"../positions\";\nimport { Swap } from \"../swap/swap\";\n\nfunction EarnWidgetInner({ config }: { config: EarnWidgetProps[\"config\"] }): React.ReactElement {\n // Sync adapter data needed for earn route validation\n useEarnRouteSync();\n\n // Handle authentication flow\n const { isAuthenticated } = useAuth();\n\n const [tab, setTab] = useState<\"earn\" | \"positions\" | \"discover\">(\"earn\");\n const tabButtons = useMemo(\n () => [\n ...(isAuthenticated ? [{ value: \"positions\", label: \"Your Positions\" }] : []),\n { value: \"earn\", label: \"Earn\" },\n { value: \"discover\", label: \"Discover\" },\n ],\n [isAuthenticated]\n );\n\n const overlayType = useAtomValue(overlayTypeAtom);\n const setOverlayType = useSetAtom(overlayTypeAtom);\n const { light, dark, fallback } = useWidgetLogo();\n const { showNavigation } = useWidgetStyles();\n\n // Check if widget is misconfigured (both campaigns and deals are empty/undefined)\n const hasCampaigns = config?.campaigns && config.campaigns.length > 0;\n const hasDeals = config?.deals && config.deals.length > 0;\n const isMisconfigured = !hasCampaigns && !hasDeals;\n\n return (\n <WidgetRoot config={config}>\n <EarnDataProvider>\n <div className=\"w-full max-w-md h-full flex flex-col gap-2 overflow-hidden\">\n {isMisconfigured ? (\n // Show error message when widget is misconfigured\n <WidgetContainer\n variant=\"border\"\n className=\"w-full h-full flex items-center justify-center\"\n >\n <div className=\"text-center p-6\">\n <h3 className=\"text-lg font-semibold text-foreground mb-2\">\n Widget Configuration Error\n </h3>\n <p className=\"text-sm text-muted-foreground\">\n No campaigns or deals are configured for this widget.\n </p>\n <p className=\"text-sm text-muted-foreground mt-1\">\n Please check your widget configuration.\n </p>\n </div>\n </WidgetContainer>\n ) : (\n <>\n {showNavigation && (\n <SegmentControl\n cursorPointer\n variant=\"segment\"\n value={tab}\n onChange={(v) => {\n setTab(v as \"earn\" | \"positions\" | \"discover\");\n setOverlayType(\"none\");\n }}\n items={tabButtons}\n className=\"!bg-background\"\n />\n )}\n\n {/* Content wrapper with transparent background */}\n <div className={`flex-1 min-h-0 overflow-hidden flex flex-col gap-2 bg-transparent`}>\n {overlayType !== \"none\" ? (\n // Overlay mode: Show overlay content in full container\n <WidgetContainer\n variant=\"border\"\n className=\"w-full h-full min-h-0 flex flex-col overflow-hidden\"\n >\n {overlayType === \"deals\" && <Deals onSwitchToEarn={() => setTab(\"earn\")} />}\n {overlayType === \"assets\" && <AssetSelection />}\n </WidgetContainer>\n ) : (\n <>\n {/* Main content in container */}\n <WidgetContainer\n variant=\"border\"\n className=\"flex-1 min-h-0 w-full flex flex-col overflow-hidden\"\n >\n <div className=\"flex-shrink-0 py-2\">\n <WidgetLogo light={light} dark={dark} fallback={fallback} size=\"xs\" />\n </div>\n\n <div className=\"flex-1 min-h-0 overflow-hidden\">\n {tab === \"positions\" && <Positions />}\n {tab === \"earn\" && <Swap />}\n {tab === \"discover\" && <Discover />}\n </div>\n </WidgetContainer>\n </>\n )}\n </div>\n </>\n )}\n </div>\n </EarnDataProvider>\n </WidgetRoot>\n );\n}\n\nexport function EarnWidget({\n adapter,\n config,\n distributorId,\n}: 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/store/overlay-atom.ts","../src/utils/format.ts","../src/store/earn-route-atom.ts","../src/hooks/useMultiChainBalances.ts","../src/context/adapter-context.tsx","../src/utils/infoSection.ts","../src/utils/incentives.ts","../src/context/earn-data-context.tsx","../src/hooks/useAutoSelectDeal.ts","../src/components/deals.tsx","../src/hooks/useTokenAutoSelection.ts","../src/adapters/ui-molecule-adapters.tsx","../src/components/asset-selection.tsx","../src/components/ui/widget-container.tsx","../src/components/ui/widget-logo.tsx","../src/hooks/useEarnRouteSync.ts","../src/hooks/useWidgetLogo.ts","../src/hooks/useAuth.ts","../src/components/discover.tsx","../src/hooks/usePositionsData.ts","../src/components/positions/columns.tsx","../src/components/positions/Positions.tsx","../src/hooks/useSelectedOpportunity.ts","../src/hooks/useTokenSelectorOverlay.ts","../src/components/swap/swap-input-wrapper.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/swap-details-wrapper.tsx","../src/components/wallet-section/account-details.tsx","../src/components/wallet-section/chain-selector.tsx","../src/components/wallet-section/wallet-section.tsx","../src/components/swap/swap-skeleton.tsx","../src/components/swap/swap.tsx","../src/components/widget/earn-widget.tsx"],"names":["cn","inputs","clsx","defaultWidgetStyleConfig","widgetStyleConfigAtom","atom","transactionAtom","get","set","status","current","hash","invertColor","color","darkenColor","amount","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","overlayTypeAtom","showDealsOverlayAtom","showAssetsOverlayAtom","hideOverlayAtom","parseUnits","value","decimals","integer","fraction","paddedFraction","combinedValue","formatUnits","valueStr","paddedValue","integerPart","trimmedFractional","formatCurrency","defaultEarnRouteParams","earnRouteParamsAtom","earnRouteOptionsAtom","params","amountInWei","depositValueAtom","selectedDealAtom","selectedOpportunity","selectedTokenAtom","selectedToken","slippageAtom","slippage","resetTriggerAtom","resetTrigger","useMultiChainBalances","chainIds","address","useConfig","queries","useQueries","chainId","earnWalletBalances","balances","useMemo","balanceMap","query","index","isLoading","error","AdapterContext","createContext","DistributorIdContext","AdapterProvider","adapter","distributorId","useAdapter","useContext","useDistributorId","useWalletConnection","useTransactionMethods","useNetworkMethods","formatValue","type","rounded","result","calculateCampaignYieldRange","campaign","aprs","vault","incentive","validAprs","apr","minApr","maxApr","getIncentivesFormatted","isKatanaRelated","isTacRelated","getKatanaIncentivesFormatted","campaignIncentives","aditionalCampaignIncentives","vaultIncentives","commonIncentivesFull","v","x","item","vaultIncentivesFull","a","b","KATANA_CAMPAIGN","EarnDataContext","useEarnData","context","CHAIN_ICONS","EarnDataProvider","opportunitySelected","setOpportunitySelected","useAtom","dealIds","campaignIds","useDefault","campaignsData","campaignsLoading","campaignsError","useEarnCampaigns","campaignItemMapper","incentivesIcons","additionalIncentivesIcons","rewardsIcons","chainsIcons","aprRange","opportunityItemMapper","incentivesFormatted","totalApr","sum","chainMapper","inc","opportunityDetailsMapper","opportunityTokenDetailsMapper","token","chain","getChainById","icon","chainLogo","campaigns","filteredCampaigns","opportunities","allOpportunities","firstOpportunityId","uniqueChainIds","supportedChains","chainMap","opportunityItem","chainOption","balancesLoading","balancesError","refetchBalances","useAutoSelectDeal","dealSelected","Deals","onSwitchToEarn","hideOverlay","setDealSelected","dealsFormatted","handleSelectDeal","deal","jsxs","Button","ArrowLeft","OpportunityList","opportunity","fullOpportunity","opp","DEFAULT_TOKENS","useTokenAutoSelection","currentNetwork","walletConnected","allChainBalances","setSelectedToken","currentChainBalances","highestBalance","aToken","bToken","aValue","formatToken","defaultToken","formatUSDValue","AssetSelection","onAssetSelect","isLoadingBalances","assets","balance","tokenData","formatNumber","handleAssetClick","asset","assetChainId","AssetList","paddingVariants","cva","WidgetContainer","className","variant","props","configPadding","configRounding","finalPadding","finalRounded","Card","sizeClasses","WidgetLogo","light","dark","fallback","size","imageError","setImageError","useState","logoUrl","useEarnRouteSync","selectedDeal","setEarnRouteParams","useWidgetLogo","PARTNERS_API_BASE","TOKEN_STORAGE_KEY","useAuth","authState","setAuthState","previousAddressRef","useRef","isAuthenticatingRef","hasCheckedStorageRef","getStoredAuth","stored","setStoredAuth","data","clearStoredAuth","currentAddress","storedAuth","handleAuthentication","prev","signatureMessageBody","signatureResponse","message","nonce","signature","authenticateBody","authResponse","authData","Discover","searchTerm","setSearchTerm","showDeals","CampaignItem","useUserCampaignPositions","campaignsV2","ALL_CAMPAIGN_NAMES","usePositionsData","userAddress","usePartnerCampaigns","acc","name","campaignWithVaults","c","tacPositions","tacTVL","tacLoading","tacError","katanaPositions","katanaTVL","katanaLoading","katanaError","positions","totalTVL","incentives","columns","row","Positions","openConnectionModal","allPositions","sortedPositions","handleConnectWallet","IconAnimation","TurtleIcon","Fragment","Separator","DataTable","useSelectedOpportunity","setSelectedOpportunity","needsChainSwitch","isChainSupported","useTokenSelectorOverlay","showAssetSelector","SwapInputWrapper","switchToOpportunityChain","setAmount","openTokenSelector","uiTokens","iconUrlToImg","selectedUIToken","handleMaxClick","maxAmount","formattedAmount","formattedBalance","amountNumber","balanceNumber","hasInsufficientBalance","usdValue","targetChain","SwapInput","useTransactionQueue","earnRoute","sendTransaction","onError","onSuccess","state","setState","network","memoizedEarnRoute","stepsKey","step","newSteps","stateRef","callbacksRef","executeCurrentTransaction","useCallback","currentState","currentUserAddress","currentSendTransaction","currentOnError","currentOnSuccess","currentStep","txHash","finalTxHash","updatedSteps","waitError","nextIndex","isLastStep","allCompleted","errorMessage","isUserRejection","resetQueue","canExecute","previousStepIndex","previousStepCompleted","currentStepNotStarted","hasNextStep","timer","useEarnRoute","options","enabled","useEarnRouteOriginal","useEarnRouteConsolidated","routeOptions","originalData","routeDetails","processRouteDetails","parseApproveStep","parseEnsoStep","kind","fromToken","toToken","tokens","approveStep","substep","useTokenDeposit","fetchedRoute","routeError","isLoadingRoute","SimpleConfirmButton","isExecuting","hasError","cancelled","totalSteps","completedSteps","showingTransactionStatus","geoCheckData","geoCheckLoading","useGeocheck","handleConfirm","Tooltip","TooltipTrigger","TooltipContent","TransactionStatusSection","steps","estimatedTime","tokenSymbol","setResetTrigger","setDepositValue","lastCompletedStep","currentStepWithHash","displayTxHash","txStatusProps","TxStatus","SwapDetailsWrapper","amountToDeposit","depositSymbol","amountToReceive","receiveSymbol","receiveDecimals","tokenPrice","defaultOpen","setSlippage","swapDetailsProps","formattedAmountToReceive","SwapDetails","shortenAddress","AccountDetails","disconnect","isHovered","setIsHovered","Wallet2Icon","ChainSelector","selectedChainId","onChainChange","currentChain","chainInList","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","WalletSection","handleChainChange","SwapSkeleton","Swap","depositValue","isEarnDataLoading","isBalancesLoading","showSwapDetails","opSectionData","OpportunitySection","RouteDetails","EarnWidgetInner","isAuthenticated","tab","setTab","tabButtons","overlayType","setOverlayType","SegmentControl","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 * Inverts a color using CSS relative color syntax\n * Converts hex/rgb/oklch to rgb and inverts each channel\n * Example: #000000 -> rgb(255 255 255), #FFFFFF -> rgb(0 0 0)\n */\nfunction invertColor(color: string): string {\n // Use relative color syntax to invert RGB channels\n return `rgb(from ${color} calc(255 - r) calc(255 - g) calc(255 - b))`;\n}\n\n/**\n * Darkens a color by mixing it with black\n * @param color - The color to darken (any CSS color format)\n * @param amount - Percentage to darken (0-100). Default: 10\n * Example: darkenColor('#73F36C', 10) -> slightly darker green\n */\nfunction darkenColor(color: string, amount: number = 10): string {\n return `color-mix(in srgb, ${color} ${100 - amount}%, black)`;\n}\n\n/**\n * Lightens a color by mixing it with white\n * @param color - The color to lighten (any CSS color format)\n * @param amount - Percentage to lighten (0-100). Default: 10\n * Example: lightenColor('#73F36C', 10) -> slightly lighter green\n */\nfunction lightenColor(color: string, amount: number = 10): string {\n return `color-mix(in srgb, ${color} ${100 - amount}%, white)`;\n}\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 : invertColor(styles.background_dark),\n \"--color-brand-white\": isDark ? styles.foreground_dark : invertColor(styles.foreground_dark),\n \"--color-brand-green\": isDark ? styles.primary_dark : darkenColor(styles.primary_dark),\n\n // Border color - use muted foreground if available, otherwise foreground with 70% opacity\n // \"--border\": styles.muted_foreground_dark\n // ? styles.muted_foreground_dark\n // : `color-mix(in srgb, ${styles.foreground_dark} 30%, transparent)`,\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 : invertColor(styles.card_dark ?? styles.background_dark);\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 : invertColor(\n styles.muted_foreground_dark ?? styles.muted_foreground_dark ?? styles.foreground_dark\n );\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 background: \"#F9F9F9\",\n foreground: \"#2A2B2A\",\n primary: \"#3CBF38\",\n card: \"#F7F7F7\",\n muted_foreground: \"#9CA3AF\",\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;\n","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","\"use client\";\nimport 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 text-foreground\",\n \"antialiased transition-all duration-700 ease-linear w-full overflow-hidden\",\n \"h-full flex items-center justify-center\",\n theme === \"dark\" ? \"dark\" : \"\"\n )}\n style={\n {\n ...coreTokenCSS,\n \"--font-primary\": fontPrimary,\n \"--font-secondary\": fontSecondary,\n fontFamily: fontPrimary,\n backgroundColor: \"transparent\",\n maxHeight: \"90vh\",\n } as React.CSSProperties\n }\n >\n <div\n className={cn(\n \"flex flex-col gap-2 h-full overflow-hidden\",\n widgetWidth === \"full\"\n ? \"w-full items-center\"\n : widgetWidth === \"custom\"\n ? \"items-stretch\"\n : \"items-center\"\n )}\n style={{\n ...(widgetWidth === \"custom\" && config.customWidth\n ? { width: config.customWidth }\n : widgetWidth === \"default\"\n ? { width: \"620px\" }\n : {}),\n }}\n >\n {children}\n </div>\n </div>\n );\n}\n","import { atom } from \"jotai\";\n\nexport type OverlayType = \"none\" | \"deals\" | \"assets\";\n\n// Atom to track which overlay is currently shown\nexport const overlayTypeAtom = atom<OverlayType>(\"none\");\n\n// Helper atoms for convenience\nexport const showDealsOverlayAtom = atom(\n (get) => get(overlayTypeAtom) === \"deals\",\n (get, set) => set(overlayTypeAtom, \"deals\")\n);\n\nexport const showAssetsOverlayAtom = atom(\n (get) => get(overlayTypeAtom) === \"assets\",\n (get, set) => set(overlayTypeAtom, \"assets\")\n);\n\nexport const hideOverlayAtom = atom(\n null,\n (get, set) => set(overlayTypeAtom, \"none\")\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}\n\n/**\n * Format a number as currency with proper decimals\n */\nexport function formatCurrency(value: number, decimals: number = 2): string {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(value);\n}\n\n/**\n * Format a number with specific decimal places\n */\nexport function formatNumber(value: number, decimals: number = 2): string {\n return new Intl.NumberFormat('en-US', {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(value);\n}\n\n/**\n * Compare two numbers for sorting\n */\nexport function compareNumbers(a: number, b: number): number {\n return a - b;\n}\n\n/**\n * Compare two strings for sorting\n */\nexport function compareStrings(a: string, b: string): number {\n return a.localeCompare(b);\n}","import { atom, useAtom } from \"jotai\";\nimport type { EarnRouteOptions } from \"@turtleclub/api\";\nimport type { Token } from \"../types/deals\";\nimport { parseUnits } from \"../utils/format\";\nimport { OpportunityItemValue } from \"@turtleclub/ui\";\n\n// Complete parameters needed for useEarnRoute\n// TODO: Delete this when after refactor to get rid of earn context\nexport type OpportunityValue = {\n id: string;\n tokenDetails: OpportunityTokenDetails;\n opportunityDetails: OpportunityDetails;\n opportunityItem: OpportunityItemValue;\n};\n\nexport interface OpportunityTokenDetails {\n tokenAddress: string;\n tokenName: string;\n tokenSymbol: string;\n tokenDecimals: number;\n iconToken: string;\n}\n\nexport interface OpportunityDetails {\n type: string;\n disclaimer: string[];\n tvl: string;\n}\n\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 id?: string;\n distributor_id?: string;\n referral_code?: string;\n\n // Additional widget-specific state\n selectedOpportunity: OpportunityValue | null;\n selectedToken: Token | null;\n resetTrigger: number;\n}\n\n// Default state for earn route parameters\nconst defaultEarnRouteParams: EarnRouteParams = {\n user: \"\",\n chain: 1,\n slippage: 0.001, // 0.1%\n tokenIn: \"\",\n tokenOut: \"\",\n amount: \"\",\n id: undefined,\n selectedOpportunity: null,\n selectedToken: null,\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 (\n !params.user ||\n !params.tokenIn ||\n !params.tokenOut ||\n !params.amount ||\n !params.selectedToken\n ) {\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,\n id: params.id,\n referral: \"\",\n distributor_id: params.distributor_id,\n referral_code: params.referral_code,\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).selectedOpportunity,\n (get, set, selectedOpportunity: OpportunityValue | null) => {\n const current = get(earnRouteParamsAtom);\n set(earnRouteParamsAtom, {\n ...current,\n selectedOpportunity,\n // Update tokenOut when opportunity changes\n tokenOut: selectedOpportunity?.tokenDetails.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\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 resetTrigger: current.resetTrigger + 1,\n });\n});\n","import { useMemo } from \"react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport { earnWalletBalances, type EarnWalletBalancesResponse, type Config } from \"@turtleclub/api\";\nimport { useConfig } from \"@turtleclub/hooks\";\n\ninterface MultiChainBalancesParams {\n chainIds: number[];\n address?: string;\n}\n\ninterface MultiChainBalancesResult {\n balances: Record<number, EarnWalletBalancesResponse[\"balances\"]>;\n isLoading: boolean;\n error: Error | null;\n refetchAll: () => void;\n}\n\nexport function useMultiChainBalances({\n chainIds,\n address,\n}: MultiChainBalancesParams): MultiChainBalancesResult {\n const config = useConfig();\n\n // Create query configurations for each chain\n const queries = useQueries({\n queries: chainIds.map((chainId) => ({\n queryKey: [\"earnWalletBalances\", chainId, address],\n queryFn: async () => {\n if (!address) return null;\n\n const response = await earnWalletBalances(\n {\n chain: chainId,\n user: address,\n },\n config\n );\n\n return response;\n },\n enabled: !!address,\n staleTime: 60 * 1000 * 5, // 5 minutes\n refetchInterval: 60 * 1000, // 1 minute\n refetchOnWindowFocus: false,\n })),\n });\n\n // Aggregate results\n const balances = useMemo(() => {\n const balanceMap: Record<number, EarnWalletBalancesResponse[\"balances\"]> = {};\n\n queries.forEach((query, index) => {\n const chainId = chainIds[index];\n if (query.data && chainId !== undefined) {\n balanceMap[chainId] = query.data.balances;\n }\n });\n\n return balanceMap;\n }, [queries, chainIds]);\n\n const isLoading = queries.some((query) => query.isLoading);\n const error = queries.find((query) => query.error)?.error || null;\n\n const refetchAll = () => {\n queries.forEach((query) => {\n query.refetch();\n });\n };\n\n return {\n balances,\n isLoading,\n error,\n refetchAll,\n };\n}\n","\"use client\";\n\nimport 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 { InfoSection, InfoCard } from \"../types/deals\";\nimport type { EarnCampaignWithVaults, earnTyped, Vault } from \"@turtleclub/api\";\nimport { IncentiveFormatted } from \"./incentives\";\n\ntype Deal = earnTyped.DefiToken;\n\n/**\n * Format numbers for display in info cards\n */\nexport function formatValue(\n value: number,\n type: \"currency\" | \"percentage\" | \"number\",\n rounded = 2\n): string {\n if (value === 0) {\n return \"0\";\n }\n\n if (value === null || value === undefined || isNaN(value)) {\n return \"0\";\n }\n\n let result: string;\n switch (type) {\n case \"currency\":\n if (value >= 1000000) result = `$${(value / 1000000).toFixed(2)}M`;\n else if (value >= 1000) result = `$${(value / 1000).toFixed(2)}K`;\n else result = `$${value.toFixed(2)}`;\n break;\n case \"percentage\":\n result = `${value.toFixed(rounded)}%`;\n break;\n case \"number\":\n if (value >= 1000) result = `${(value / 1000).toFixed(1)}K`;\n else result = value.toString();\n break;\n default:\n result = value.toString();\n }\n\n return result;\n}\n\n/**\n * Capitalize campaign names properly\n */\nexport function capitalizeName(name: string): string {\n return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\n}\n\n/**\n * Calculate yield range from campaign vaults\n */\nexport function calculateCampaignYieldRange(\n campaign: EarnCampaignWithVaults\n): [string, string] | null {\n const aprs: number[] = [];\n\n // Check vaults for APR data\n campaign.vaults.forEach((vault) => {\n // Check katanaCampaignConfig incentives\n if (vault.katanaCampaignConfig?.incentives) {\n vault.katanaCampaignConfig?.incentives.forEach((incentive) => {\n if (incentive.apr && incentive.apr > 0) {\n aprs.push(incentive.apr);\n }\n });\n }\n });\n\n // Check campaign-level additional incentives (these have direct APR values)\n\n // Process Katana additional incentives\n if (campaign.campaign.katanaConfig?.additionalIncentives) {\n campaign.campaign.katanaConfig.additionalIncentives.forEach((incentive) => {\n if (incentive.apr && incentive.apr > 0) {\n aprs.push(incentive.apr);\n }\n });\n }\n\n // Process TAC additional incentives\n if (campaign.campaign.tacConfig?.additionalIncentives) {\n campaign.campaign.tacConfig.additionalIncentives.forEach((incentive) => {\n if (incentive.apr && incentive.apr > 0) {\n aprs.push(incentive.apr);\n }\n });\n }\n\n if (aprs.length === 0) return null;\n\n // Filter out zero values and get min/max\n const validAprs = aprs.filter((apr) => apr > 1);\n if (validAprs.length === 0) return null;\n\n const minApr = Math.min(...validAprs);\n const maxApr = Math.max(...validAprs);\n\n return [formatValue(minApr, \"percentage\", 2), formatValue(maxApr, \"percentage\", 2)];\n}\n\n/**\n * Build info section for a campaign (vault)\n */\nexport function buildCampaignInfoSection(\n name: string,\n url: string,\n totalApr: number,\n tvlUsd: number,\n turtleUsers: number,\n iconUrl: string,\n incentivesFormatted: IncentiveFormatted[]\n): InfoSection | undefined {\n const topCards: InfoCard[] = [];\n\n // APR Range\n // const yieldRange = calculateCampaignYieldRange(campaign);\n if (totalApr) {\n const aprCard = {\n label: \"APR\",\n value: formatValue(totalApr, \"percentage\"),\n tooltip: \"Annual Percentage Rate range for this vault\",\n };\n topCards.push(aprCard);\n }\n\n // TVL\n if (tvlUsd > 0) {\n const tvlCard = {\n label: \"TVL\",\n value: formatValue(tvlUsd, \"currency\"),\n tooltip: \"Total Value Locked in this campaign\",\n };\n topCards.push(tvlCard);\n }\n\n const turtleUsersCard = {\n label: \"Turtle Users\",\n value: formatValue(turtleUsers, \"number\"),\n tooltip: \"Number of users participating in this campaign\",\n };\n topCards.push(turtleUsersCard);\n\n // Bottom Cards\n const bottomCards: InfoCard[] = [];\n let vaultIncentives: InfoCard[] = [];\n\n if (incentivesFormatted && incentivesFormatted.length > 0) {\n const filteredIncentives = incentivesFormatted.filter((x) => x.apr > 0);\n\n vaultIncentives = filteredIncentives.map((incentive) => ({\n label: incentive.label,\n value: `${incentive.description} ${incentive.apr > 0 ? `(${formatValue(incentive.apr, \"percentage\", 3)})` : \"\"}`,\n iconUrl: incentive.iconUrl,\n }));\n }\n bottomCards.push(...vaultIncentives);\n\n // Check validation\n const hasValidTopCards = topCards.length > 0;\n const hasNonZeroValues = topCards.some((card) => card.value !== \"0\");\n\n if (hasValidTopCards && hasNonZeroValues) {\n const result = {\n name,\n url,\n iconUrl: iconUrl,\n topCards,\n bottomCards,\n };\n return result;\n }\n\n return undefined;\n}\n\n/**\n * Build info section for a regular deal (non-vault)\n */\nexport function buildDealInfoSection(\n title: string,\n deal: Deal,\n partnerData?: {\n boostPercentage?: number;\n dealType?: string;\n tvl?: number;\n url?: string;\n description?: string;\n }\n): InfoSection | undefined {\n const topCards: InfoCard[] = [];\n if (!partnerData) return undefined;\n\n // Boost Percentage\n if (partnerData.boostPercentage && partnerData.boostPercentage > 0) {\n topCards.push({\n label: \"Boost\",\n value: formatValue(partnerData.boostPercentage, \"percentage\"),\n tooltip: \"Turtle boost percentage\",\n });\n }\n\n // TVL from indexer (when available) or fallback to deal TVL\n const tvlValue = partnerData.tvl || deal.data.tvl;\n if (tvlValue > 0) {\n topCards.push({\n label: \"TVL\",\n value: formatValue(tvlValue, \"currency\"),\n tooltip: \"Total Value Locked\",\n });\n }\n\n // Deal Type\n if (partnerData.dealType) {\n topCards.push({\n label: \"Type\",\n value: partnerData.dealType.charAt(0).toUpperCase() + partnerData.dealType.slice(1),\n tooltip: \"Deal type\",\n });\n }\n\n let bottomCards: InfoCard[] = [];\n if (partnerData.description) {\n bottomCards.push({ label: \"Description\", value: partnerData.description });\n }\n\n // Only include infoSection if we have data to show\n if (topCards.length > 0 && topCards.some((card) => card.value !== \"0\")) {\n return {\n name: title,\n iconUrl: deal.metadata.iconUrl,\n topCards,\n url: partnerData?.url || undefined,\n bottomCards,\n };\n }\n\n return undefined;\n}\n","import { EarnCampaignWithVaults, Vault } from \"@turtleclub/api\";\n\nexport type IncentiveFormatted = {\n name: string;\n apr: number;\n boost: boolean;\n description: string;\n iconUrl: string;\n};\n\nexport const getIncentivesFormatted = (\n campaign: EarnCampaignWithVaults,\n vault: Vault\n): IncentiveFormatted[] => {\n const isKatanaRelated = vault.katanaCampaignConfig !== null;\n const isTacRelated = vault.tacCampaignConfig !== null;\n\n if (isKatanaRelated) {\n const result = getKatanaIncentivesFormatted(campaign, vault);\n return result;\n }\n\n if (isTacRelated) {\n // return getTacIncentivesFormatted(campaign, vault);\n return [];\n }\n\n // Implement generic implementation\n return [];\n};\n\nconst getKatanaIncentivesFormatted = (\n campaign: EarnCampaignWithVaults,\n vault: Vault\n): IncentiveFormatted[] => {\n // Base data\n const campaignIncentives = campaign.campaign.katanaConfig?.incentives;\n const aditionalCampaignIncentives = campaign.campaign.katanaConfig?.additionalIncentives;\n const vaultIncentives = vault.katanaCampaignConfig?.incentives;\n\n // Fill campaign data info\n const commonIncentivesFull =\n vaultIncentives\n ?.map((v) => {\n const incentive = campaignIncentives?.find((x) => x.id === v.id);\n if (!incentive) {\n return null;\n }\n const result = {\n name: `Est. ${incentive.name}`,\n description: incentive.tooltip,\n apr: v.apr,\n boost: v.apr === undefined,\n iconUrl: incentive.iconUrl,\n };\n return result;\n })\n .filter((item): item is IncentiveFormatted => item !== null) || [];\n\n const vaultIncentivesFull =\n vaultIncentives\n ?.map((v) => {\n const incentive = aditionalCampaignIncentives?.find((x) => x.id === v.id);\n if (!incentive) {\n return null;\n }\n const apr = v.apr ?? incentive.apr;\n const result = {\n name: `${incentive.estApr ? \"Est. \" : \"\"}${incentive.name}`,\n description: incentive.tooltip,\n apr: apr,\n boost: apr === undefined,\n iconUrl: incentive.iconUrl,\n };\n return result;\n })\n .filter((item): item is IncentiveFormatted => item !== null) || [];\n\n const final = [...commonIncentivesFull, ...vaultIncentivesFull].sort((a, b) => b.apr - a.apr);\n\n return final;\n};\n\n// TODO: Implement\n// const getTacIncentivesFormatted = (\n// campaign: EarnCampaignWithVaults,\n// vault: Vault\n// ): IncentiveFormatted[] => {\n// return [];\n// };\n","\"use client\";\nimport { createContext, useContext, useEffect, useMemo, type ReactNode } from \"react\";\nimport { useEarnCampaigns } from \"@turtleclub/hooks\";\nimport { useAtom } from \"jotai\";\nimport { selectedDealAtom } from \"../store/earn-route-atom\";\nimport type { EarnCampaignWithVaults, EarnWalletBalancesResponse } from \"@turtleclub/api\";\nimport { useMultiChainBalances } from \"../hooks/useMultiChainBalances\";\nimport { useAdapter } from \"./adapter-context\";\nimport {\n // buildCampaignInfoSection,\n // buildDealInfoSection,\n calculateCampaignYieldRange,\n formatValue,\n} from \"../utils\";\nimport { getIncentivesFormatted } from \"../utils/incentives\";\n// import { getAddressExplorerUrl } from \"../utils/explorers\";\nimport { CampaignItemValue, OpportunityItemValue } from \"@turtleclub/ui\";\nimport { chainLogo, getChainById } from \"@turtleclub/chains\";\n\nconst KATANA_CAMPAIGN = \"2c86d3a1-cfe8-486d-915d-1b9ff5e924e9\";\n\ninterface OpportunityTokenDetails {\n tokenAddress: string;\n tokenName: string;\n tokenSymbol: string;\n tokenDecimals: number;\n iconToken: string;\n}\ninterface OpportunityDetails {\n type: string;\n disclaimer: string[];\n tvl: string;\n}\nexport type Opportunity = Record<\n string,\n {\n id: string;\n tokenDetails: OpportunityTokenDetails;\n opportunityDetails: OpportunityDetails;\n opportunityItem: OpportunityItemValue;\n }\n>;\n\nexport interface ChainOption {\n value: string;\n symbol: string;\n name: string;\n icon: string;\n chainId: number;\n}\n\ninterface EarnDataContextValue {\n isLoading: boolean;\n error: Error | null;\n campaigns: CampaignItemValue[];\n opportunities: Opportunity;\n balances: Record<number, EarnWalletBalancesResponse[\"balances\"]>; // Balances per chain\n balancesLoading: boolean;\n balancesError: Error | null;\n refetchBalances: () => void;\n supportedChains: ChainOption[];\n}\n\nconst EarnDataContext = createContext<EarnDataContextValue | undefined>(undefined);\n\nexport function useEarnData() {\n const context = useContext(EarnDataContext);\n if (!context) {\n throw new Error(\"useEarnData must be used within EarnDataProvider\");\n }\n return context;\n}\n\ninterface EarnDataProviderProps {\n children: ReactNode;\n}\n\nconst CHAIN_ICONS: Record<number, string> = {\n 1: \"https://storage.googleapis.com/turtle-assets/tokens/eth.png\",\n 747474: \"https://storage.googleapis.com/turtle-assets/partners/polygon/katana.svg\",\n};\n\nexport function EarnDataProvider({ children }: EarnDataProviderProps) {\n // const config = useAtomValue(widgetStyleConfigAtom);\n const [opportunitySelected, setOpportunitySelected] = useAtom(selectedDealAtom);\n const adapter = useAdapter();\n\n // Use configuration arrays if provided, otherwise fall back to default campaign\n const dealIds = [] as unknown as string[]; //config.deals || [];\n const campaignIds = [KATANA_CAMPAIGN]; //config.campaigns || [];\n\n // If no deals or campaigns specified, use default campaign\n // const useDefault = dealIds.length === 0 && campaignIds.length === 0;\n const useDefault = false;\n\n // Fetch campaigns data\n const {\n data: campaignsData,\n isLoading: campaignsLoading,\n error: campaignsError,\n } = useEarnCampaigns();\n\n const campaignItemMapper = (campaign: EarnCampaignWithVaults): CampaignItemValue => {\n const incentivesIcons =\n campaign.campaign.katanaConfig?.incentives.map((incentive) => ({\n icon: incentive.iconUrl,\n name: incentive.name,\n })) ?? [];\n const additionalIncentivesIcons =\n campaign.campaign.katanaConfig?.additionalIncentives.map((incentive) => ({\n icon: incentive.iconUrl,\n name: incentive.name,\n })) ?? [];\n\n const rewardsIcons = [...incentivesIcons, ...additionalIncentivesIcons].filter(Boolean);\n const chainsIcons = campaign.vaults.map((vault) => ({\n icon: CHAIN_ICONS[vault.earnConfig?.tokens?.[0]?.chainId ?? 1],\n name: vault.earnConfig?.tokens?.[0]?.chain ?? \"Ethereum\",\n }));\n\n const aprRange = calculateCampaignYieldRange(campaign) ?? \"0% - 0%\";\n\n return {\n icon: campaign.campaign.iconUrl,\n name: campaign.campaign.description,\n aprRange: `${aprRange[0]} - ${aprRange[1]}`,\n tvl: formatValue(campaign.campaign.katanaConfig?.totalTvlUSD ?? 0, \"currency\"),\n participants: campaign.campaign.totalUsers.toString(),\n rewards: rewardsIcons,\n chains: chainsIcons,\n };\n };\n\n const opportunityItemMapper = (\n vault: EarnCampaignWithVaults[\"vaults\"][number],\n campaign: EarnCampaignWithVaults\n ): OpportunityItemValue => {\n const incentivesFormatted = getIncentivesFormatted(campaign, vault) ?? [];\n\n const totalApr = incentivesFormatted.reduce((sum, incentive) => {\n return sum + (incentive.apr || 0);\n }, 0);\n\n return {\n icon: vault.iconUrl,\n name: vault.name,\n tvl: formatValue(vault.tvlUSD, \"currency\"),\n apr: totalApr.toFixed(2) + \"%\",\n chain: chainMapper(vault.earnConfig?.tokens?.[0]?.chainId ?? 1), //CHAIN_ICONS[vault.earnConfig?.tokens?.[0]?.chainId ?? 1],\n incentives: incentivesFormatted.map((inc) => ({\n icon: inc.iconUrl,\n name: inc.label,\n })),\n aprBreakdown: incentivesFormatted,\n turtleBoost: null,\n partner: {\n icon: campaign.campaign.iconUrl,\n name: campaign.campaign.description,\n },\n };\n };\n\n const opportunityDetailsMapper = (campaign: EarnCampaignWithVaults): OpportunityDetails => {\n return {\n type: \"Turtle Campaign\",\n disclaimer: [],\n tvl: campaign.campaign.katanaConfig?.totalTvlUSD?.toString() ?? \"0\",\n };\n };\n\n const opportunityTokenDetailsMapper = (\n vault: EarnCampaignWithVaults[\"vaults\"][number]\n ): OpportunityTokenDetails => {\n const token = vault.earnConfig?.tokens[0];\n if (!token) {\n return {\n tokenAddress: \"\",\n tokenName: \"\",\n tokenSymbol: \"\",\n tokenDecimals: 0,\n iconToken: \"\",\n };\n }\n return {\n tokenAddress: token.address,\n tokenName: token.symbol,\n tokenSymbol: token.symbol,\n tokenDecimals: token.decimals,\n iconToken: vault.iconUrl,\n };\n };\n\n const chainMapper = (chainId: number): ChainOption => {\n const chain = getChainById(chainId);\n const icon = chainLogo(chainId);\n\n if (chain) {\n return {\n value: chain.name.toLowerCase().replace(/\\s+/g, \"-\"),\n symbol: chain.nativeCurrency.symbol,\n name: chain.name,\n icon,\n chainId: chainId,\n };\n } else {\n return {\n value: `chain-${chainId}`,\n symbol: \"ETH\",\n name: `Chain ${chainId}`,\n icon: chainLogo(chainId),\n chainId: chainId,\n };\n }\n };\n\n const campaigns: CampaignItemValue[] = useMemo(() => {\n if (!campaignsData) return [];\n\n // Filter campaigns based on configuration\n let filteredCampaigns = campaignsData;\n\n if (campaignIds.length > 0) {\n filteredCampaigns = campaignsData.filter((campaign) =>\n campaignIds.includes(campaign.campaign.id)\n );\n } else if (useDefault) {\n filteredCampaigns = campaignsData.filter(\n (campaign) => campaign.campaign.id === KATANA_CAMPAIGN\n );\n }\n\n return filteredCampaigns.map((campaign) => campaignItemMapper(campaign));\n }, [campaignsData, campaignIds, useDefault]);\n\n const opportunities: Opportunity = useMemo(() => {\n if (!campaignsData) return {};\n\n const allOpportunities: Opportunity = {};\n\n // Filter campaigns based on configuration\n let filteredCampaigns = campaignsData;\n\n if (campaignIds.length > 0) {\n filteredCampaigns = campaignsData.filter((campaign) =>\n campaignIds.includes(campaign.campaign.id)\n );\n } else if (useDefault) {\n filteredCampaigns = campaignsData.filter(\n (campaign) => campaign.campaign.id === KATANA_CAMPAIGN\n );\n }\n\n // Extract all vaults from filtered campaigns\n filteredCampaigns.forEach((campaign) => {\n campaign.vaults.forEach((vault) => {\n if (vault.earnConfig?.tokens && vault.earnConfig?.tokens.length === 0) {\n return;\n }\n allOpportunities[vault.id] = {\n id: vault.id,\n tokenDetails: opportunityTokenDetailsMapper(vault),\n opportunityDetails: opportunityDetailsMapper(campaign),\n opportunityItem: opportunityItemMapper(vault, campaign),\n };\n });\n });\n\n return allOpportunities;\n }, [campaignsData, campaignIds, dealIds, useDefault]);\n\n // Select the first opportunity if no opportunity is selected\n useEffect(() => {\n if (Object.keys(opportunities).length > 0 && !opportunitySelected) {\n const firstOpportunityId = Object.keys(opportunities)[0];\n setOpportunitySelected(opportunities[firstOpportunityId]);\n }\n }, [opportunities, opportunitySelected, setOpportunitySelected]);\n\n // Extract unique chain IDs and create supported chains\n const { uniqueChainIds, supportedChains } = useMemo(() => {\n const chainMap = new Map<number, ChainOption>();\n\n // Iterate through opportunities and build unique chains\n Object.values(opportunities).forEach(({ opportunityItem }) => {\n const chainOption = opportunityItem.chain;\n if (chainOption && chainOption.chainId) {\n chainMap.set(chainOption.chainId, chainOption);\n }\n });\n\n // Extract unique chain IDs and chain options\n const uniqueChainIds = Array.from(chainMap.keys());\n const supportedChains = Array.from(chainMap.values()).sort((a, b) =>\n a.name.localeCompare(b.name)\n );\n\n return { uniqueChainIds, supportedChains };\n }, [opportunities]);\n\n // Use the multi-chain balance hook\n const {\n balances,\n isLoading: balancesLoading,\n error: balancesError,\n refetchAll: refetchBalances,\n } = useMultiChainBalances({\n chainIds: uniqueChainIds,\n address: adapter.user || undefined,\n });\n\n const value: EarnDataContextValue = {\n isLoading: campaignsLoading,\n error: campaignsError,\n campaigns,\n opportunities,\n balances,\n supportedChains,\n balancesLoading,\n balancesError,\n refetchBalances,\n };\n\n return <EarnDataContext.Provider value={value}>{children}</EarnDataContext.Provider>;\n}\n","import { useAtomValue } from \"jotai\";\nimport { selectedDealAtom } from \"../store/earn-route-atom\";\nimport { useEarnData } from \"../context/earn-data-context\";\n\nexport function useAutoSelectDeal() {\n const dealSelected = useAtomValue(selectedDealAtom);\n const { opportunities, isLoading, error } = useEarnData();\n\n return {\n deals: opportunities,\n dealsFormatted: opportunities, // For backward compatibility\n isLoading,\n error,\n selectedDeal: dealSelected,\n };\n}\n","\"use client\";\nimport { type JSX } from \"react\";\nimport { useSetAtom } from \"jotai\";\nimport { ArrowLeft } from \"lucide-react\";\nimport { useAutoSelectDeal } from \"../hooks/useAutoSelectDeal\";\nimport { hideOverlayAtom } from \"../store/overlay-atom\";\nimport { OpportunityValue, selectedDealAtom } from \"../store/earn-route-atom\";\nimport { Button, OpportunityList } from \"@turtleclub/ui\";\n\nexport function Deals({ onSwitchToEarn }: { onSwitchToEarn: () => void }): JSX.Element {\n const hideOverlay = useSetAtom(hideOverlayAtom);\n const setDealSelected = useSetAtom(selectedDealAtom);\n const { dealsFormatted, isLoading, error } = useAutoSelectDeal();\n\n const handleSelectDeal = (deal: OpportunityValue): void => {\n setDealSelected(deal);\n onSwitchToEarn();\n hideOverlay();\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={() => hideOverlay()} variant=\"default\" className=\"mt-2\">\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-transparent\">\n {/* Header */}\n <div className=\"flex items-center justify-start p-3 flex-shrink-0\">\n <button\n onClick={() => hideOverlay()}\n className=\"text-primary hover:text-primary/80 transition-colors\"\n >\n <ArrowLeft className=\"w-5 h-5\" />\n </button>\n </div>\n\n {/* Content */}\n <OpportunityList\n opportunities={Object.values(dealsFormatted).map(\n (opportunity) => opportunity.opportunityItem\n )}\n onOpportunityClick={(opportunityItem) => {\n // TODO: Improve this\n // Find the full opportunity data by matching the opportunityItem\n const fullOpportunity = Object.values(dealsFormatted).find(\n (opp) => opp.opportunityItem === opportunityItem\n );\n if (fullOpportunity) {\n handleSelectDeal(fullOpportunity);\n }\n }}\n groupBy=\"partner\"\n filterVariant=\"navigation\"\n className=\"h-full\"\n />\n </div>\n );\n}\n","import { useEffect } from \"react\";\nimport { useAtom, useAtomValue } from \"jotai\";\nimport { selectedTokenAtom, resetTriggerAtom } from \"../store/earn-route-atom\";\nimport { useAdapter } from \"../context/adapter-context\";\nimport { useEarnData } from \"../context/earn-data-context\";\nimport { formatToken } from \"@turtleclub/utils\";\nimport type { Token } from \"../types/deals\";\n\n// Default tokens when no wallet is connected\nconst DEFAULT_TOKENS: Record<number, Token> = {\n 1: {\n address: \"0x0000000000000000000000000000000000000000\",\n name: \"Ethereum\",\n symbol: \"ETH\",\n decimals: 18,\n logo: undefined,\n balance: \"0\",\n price: 0,\n chainId: 1,\n },\n // Add more default tokens for other chains as needed\n};\n\nexport function useTokenAutoSelection() {\n const adapter = useAdapter();\n const currentNetwork = adapter.network;\n const walletConnected = !!adapter.user;\n \n const { balances: allChainBalances, balancesLoading } = useEarnData();\n const [selectedToken, setSelectedToken] = useAtom(selectedTokenAtom);\n const resetTrigger = useAtomValue(resetTriggerAtom);\n\n // Get balances for current network\n const currentChainBalances = currentNetwork ? allChainBalances[currentNetwork] : undefined;\n\n // Clear selected token when chain changes\n useEffect(() => {\n if (selectedToken && currentNetwork && selectedToken.chainId !== currentNetwork) {\n setSelectedToken(null);\n }\n }, [currentNetwork, selectedToken, setSelectedToken]);\n\n // Auto-select token with highest balance when balances load or chain changes\n useEffect(() => {\n // Skip if we already have a valid token for current chain\n if (selectedToken && currentNetwork && selectedToken.chainId === currentNetwork) {\n return;\n }\n\n // Skip if still loading balances\n if (walletConnected && balancesLoading) {\n return;\n }\n\n // Select token with highest USD balance\n if (currentChainBalances && currentChainBalances.length > 0) {\n // Sort balances by USD value (descending)\n const sortedBalances = [...currentChainBalances].sort((a, b) => {\n // Create token objects for formatToken\n const aToken = { ...a.token, balance: a.amount, decimals: a.token.decimals };\n const bToken = { ...b.token, balance: b.amount, decimals: b.token.decimals };\n \n const aValue = parseFloat(formatToken(a.amount, aToken)) * (a.token.price || 0);\n const bValue = parseFloat(formatToken(b.amount, bToken)) * (b.token.price || 0);\n return bValue - aValue;\n });\n \n // Use token with highest balance\n const highestBalance = sortedBalances[0];\n setSelectedToken({\n address: highestBalance.token.address,\n name: highestBalance.token.name,\n symbol: highestBalance.token.symbol,\n decimals: highestBalance.token.decimals,\n logo: highestBalance.token.logos?.[0],\n balance: highestBalance.amount,\n price: highestBalance.token.price ?? undefined,\n chainId: highestBalance.token.chain,\n });\n } else if (!walletConnected && currentNetwork) {\n // Use default token when no wallet connected\n const defaultToken = DEFAULT_TOKENS[currentNetwork] || DEFAULT_TOKENS[1];\n setSelectedToken({\n ...defaultToken,\n chainId: currentNetwork,\n });\n }\n }, [currentChainBalances, currentNetwork, selectedToken, setSelectedToken, walletConnected, balancesLoading]);\n\n // Reset amount when token changes\n useEffect(() => {\n // This is handled in the atom now, but keeping for any additional logic\n }, [selectedToken]);\n\n // Reset selection on reset trigger\n useEffect(() => {\n if (resetTrigger > 0) {\n setSelectedToken(null);\n }\n }, [resetTrigger, setSelectedToken]);\n\n return {\n selectedToken,\n setSelectedToken,\n currentChainBalances,\n isLoadingBalances: balancesLoading,\n };\n}","\"use client\";\n\nimport { formatValue } from \"../utils\";\nimport 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 // Convert balance using BigInt for precision, then to number for calculations\n const balanceBigInt = BigInt(token.balance);\n const decimalsMultiplier = BigInt(10 ** token.decimals);\n const balanceNumber = Number(balanceBigInt) / Number(decimalsMultiplier);\n const balanceInUsd = balanceNumber * (token.price || 0);\n\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 balance: formatUSDValue(balanceInUsd),\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(\n deal: DealFormatted,\n isCampaign = false\n): OpportunityItemProps {\n // Only show yield for deals that belong to a campaign (vaults)\n const showYield = (deal.isVault || isCampaign) && deal.yieldPercentage > 0;\n\n let tvlDisplay = deal.tvl > 0 ? formatValue(deal.tvl, \"currency\") : undefined;\n let turtleBoostDisplay = deal.boostPercentage ? `${deal.boostPercentage}%` : undefined;\n\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.title,\n tvl: tvlDisplay,\n turtleBoost: turtleBoostDisplay,\n yield: showYield ? `${deal.yieldPercentage.toFixed(2)}%` : undefined,\n };\n}\n\n/**\n * Converts array of deals to opportunity items\n */\nexport function dealsToOpportunityItems(deals: DealFormatted[]): OpportunityItemProps[] {\n return deals.map((deal) => dealToOpportunityItem(deal));\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}\n","\"use client\";\nimport { type JSX } from \"react\";\nimport { useSetAtom } from \"jotai\";\nimport { ArrowLeft } from \"lucide-react\";\nimport { AssetList, type Asset } from \"@turtleclub/ui\";\nimport { hideOverlayAtom } from \"../store/overlay-atom\";\nimport { useTokenAutoSelection } from \"../hooks/useTokenAutoSelection\";\nimport { useAdapter } from \"../context/adapter-context\";\nimport { useEarnData } from \"../context/earn-data-context\";\nimport { formatNumber, formatToken } from \"@turtleclub/utils\";\nimport { formatUSDValue } from \"../adapters\";\nimport { getChainById } from \"@turtleclub/chains\";\n\ninterface AssetSelectionProps {\n onAssetSelect?: (tokenAddress: string) => void;\n}\n\nexport function AssetSelection({ onAssetSelect }: AssetSelectionProps): JSX.Element {\n const hideOverlay = useSetAtom(hideOverlayAtom);\n const adapter = useAdapter();\n const { isLoadingBalances, setSelectedToken } = useTokenAutoSelection();\n const { balances: allChainBalances } = useEarnData();\n\n // Convert all chain token balances to Asset format\n const assets: Asset[] = [];\n\n // Iterate through all chains\n Object.entries(allChainBalances).forEach(([chainId, balances]) => {\n balances.forEach((balance) => {\n const tokenData = {\n address: balance.token.address,\n name: balance.token.name,\n symbol: balance.token.symbol,\n decimals: balance.token.decimals,\n balance: balance.amount,\n price: balance.token.price ?? undefined,\n chainId: balance.token.chain,\n logo: balance.token.logos?.[0],\n };\n\n const chain = getChainById(Number(chainId));\n\n assets.push({\n id: `${chainId}-${tokenData.address}`, // Unique ID combining chain and address\n symbol: tokenData.symbol,\n name: tokenData.name,\n icon: tokenData.logo ? (\n <img src={tokenData.logo} alt={tokenData.symbol} 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-xs\">\n {tokenData.symbol?.charAt(0) || \"?\"}\n </div>\n ),\n balance: formatNumber(formatToken(tokenData.balance, tokenData), 5, false, false),\n balanceUSD: formatUSDValue(\n parseFloat(formatToken(tokenData.balance, tokenData)) * (tokenData.price || 0)\n ),\n chainId: String(chainId),\n chainName: chain?.name || \"Unknown\",\n address: tokenData.address,\n decimals: tokenData.decimals,\n });\n });\n });\n\n const handleAssetClick = async (asset: Asset) => {\n // Check if we need to switch chains\n const assetChainId = Number(asset.chainId);\n const currentChainId = adapter.network;\n\n if (currentChainId !== assetChainId) {\n // Switch to the asset's chain\n try {\n await adapter.changeNetwork(assetChainId);\n } catch (error) {\n console.error(\"Failed to switch network:\", error);\n return;\n }\n }\n\n // Find the token in the specific chain's balances\n const chainBalances = allChainBalances[assetChainId];\n const balance = chainBalances?.find((b) => b.token.address === asset.address);\n\n if (balance) {\n setSelectedToken({\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 chainId: balance.token.chain,\n });\n onAssetSelect?.(asset.address || \"\");\n hideOverlay();\n }\n };\n\n if (isLoadingBalances) {\n return (\n <div className=\"w-full h-full flex items-center justify-center bg-background\">\n <p className=\"text-muted-foreground\">Loading balances...</p>\n </div>\n );\n }\n\n return (\n <div className=\"w-full h-full flex flex-col bg-transparent text-foreground\">\n {/* Header */}\n <div className=\"flex items-center justify-between p-3 flex-shrink-0\">\n <button\n onClick={() => hideOverlay()}\n className=\"text-primary hover:text-primary/80 transition-colors\"\n >\n <ArrowLeft className=\"w-5 h-5\" />\n </button>\n <h3 className=\"text-lg font-medium\">Select Token</h3>\n <div className=\"w-5 h-5\" /> {/* Spacer for alignment */}\n </div>\n\n {/* Content */}\n <AssetList\n assets={assets}\n onAssetClick={handleAssetClick}\n groupByChain={true}\n showChainIcon={true}\n filterVariant=\"navigation\"\n className=\"h-full\"\n />\n </div>\n );\n}\n","\"use client\";\nimport React, { useMemo } from \"react\";\nimport type { JSX } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { useWidgetStyles } from \"../../hooks/useWidgetStyles\";\nimport { Card } from \"@turtleclub/ui\";\nimport { cva } from \"class-variance-authority\";\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: \"default\" | \"border\" | \"shadow\";\n asChild?: boolean;\n}\n\nconst paddingVariants = cva(\"p-0\", {\n variants: {\n padding: {\n none: \"p-0\",\n sm: \"p-3\",\n default: \"p-4\",\n md: \"p-6\",\n lg: \"p-7\",\n },\n },\n defaultVariants: {\n padding: \"default\",\n },\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 = paddingVariants({ padding: padding ?? configPadding });\n const finalRounded = rounding ?? configRounding;\n\n return (\n <Card\n className={cn(className, finalPadding)}\n {...props}\n variant={variant}\n gradient=\"white\"\n rounded={finalRounded}\n >\n {children}\n </Card>\n );\n}\n","\"use client\";\nimport 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?: \"xxs\" | \"xs\" | \"sm\" | \"md\" | \"lg\";\n}\n\nconst sizeClasses = {\n xxs: \"h-4 text-xs\",\n xs: \"h-6 text-sm\",\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])}>{fallback}</span>\n </div>\n );\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 { useEffect, useRef, useState } from \"react\";\nimport { useAdapter } from \"../context/adapter-context\";\n\ninterface GetWalletSignatureMessageBody {\n address: string;\n walletEcosystem: \"evm\" | \"solana\";\n url: string;\n}\n\ninterface GetWalletSignatureMessageResponse {\n message: string;\n nonce: string;\n}\n\ninterface AuthenticateBody {\n method: \"wallet\";\n walletInput: {\n address: string;\n ecosystem: \"evm\";\n signature: string;\n nonce: string;\n };\n}\n\ninterface AuthenticateResponse {\n user: {\n id: string;\n email: string | null;\n role: string;\n firstName: string;\n lastName: string;\n avatarUrl: string;\n telegramHandle: string;\n username: string;\n permissions: {\n id: string;\n name: string;\n description: string;\n }[];\n xUsername: string;\n };\n authTokens: {\n accessToken: string;\n refreshToken: string;\n };\n}\n\ninterface AuthState {\n isAuthenticated: boolean;\n isLoading: boolean;\n error: string | null;\n user: AuthenticateResponse[\"user\"] | null;\n tokens: AuthenticateResponse[\"authTokens\"] | null;\n}\n\nconst PARTNERS_API_BASE = \"https://api.turtle.xyz\";\nconst TOKEN_STORAGE_KEY = \"turtle_earn_widget_auth\";\n\ninterface StoredAuthData {\n address: string;\n tokens: AuthenticateResponse[\"authTokens\"];\n user: AuthenticateResponse[\"user\"];\n}\n\nexport const useAuth = () => {\n const adapter = useAdapter();\n const [authState, setAuthState] = useState<AuthState>({\n isAuthenticated: false,\n isLoading: false,\n error: null,\n user: null,\n tokens: null,\n });\n\n const previousAddressRef = useRef<string | undefined>(undefined);\n const isAuthenticatingRef = useRef(false);\n const hasCheckedStorageRef = useRef(false);\n\n // Helper functions for localStorage\n const getStoredAuth = (): StoredAuthData | null => {\n try {\n const stored = localStorage.getItem(TOKEN_STORAGE_KEY);\n if (stored) {\n return JSON.parse(stored);\n }\n } catch (error) {\n console.error(\"Error reading stored auth:\", error);\n }\n return null;\n };\n\n const setStoredAuth = (data: StoredAuthData) => {\n try {\n localStorage.setItem(TOKEN_STORAGE_KEY, JSON.stringify(data));\n } catch (error) {\n console.error(\"Error storing auth:\", error);\n }\n };\n\n const clearStoredAuth = () => {\n try {\n localStorage.removeItem(TOKEN_STORAGE_KEY);\n } catch (error) {\n console.error(\"Error clearing stored auth:\", error);\n }\n };\n\n useEffect(() => {\n const currentAddress = adapter?.user;\n\n // Check for stored auth on initial load for the current address\n if (currentAddress && !hasCheckedStorageRef.current && !isAuthenticatingRef.current) {\n hasCheckedStorageRef.current = true;\n const storedAuth = getStoredAuth();\n\n if (storedAuth && storedAuth.address.toLowerCase() === currentAddress.toLowerCase()) {\n // Validate token is still valid (you might want to check expiry here)\n setAuthState({\n isAuthenticated: true,\n isLoading: false,\n error: null,\n user: storedAuth.user,\n tokens: storedAuth.tokens,\n });\n previousAddressRef.current = currentAddress;\n return;\n }\n }\n\n // Check if address changed and is not undefined\n if (\n currentAddress !== previousAddressRef.current &&\n currentAddress !== undefined &&\n !isAuthenticatingRef.current\n ) {\n previousAddressRef.current = currentAddress;\n hasCheckedStorageRef.current = true;\n\n // Check if we have stored auth for this address\n const storedAuth = getStoredAuth();\n if (storedAuth && storedAuth.address.toLowerCase() === currentAddress.toLowerCase()) {\n setAuthState({\n isAuthenticated: true,\n isLoading: false,\n error: null,\n user: storedAuth.user,\n tokens: storedAuth.tokens,\n });\n } else {\n handleAuthentication(currentAddress);\n }\n } else if (currentAddress === undefined && previousAddressRef.current !== undefined) {\n previousAddressRef.current = undefined;\n hasCheckedStorageRef.current = false;\n // Clear stored auth when wallet disconnects\n clearStoredAuth();\n // Reset auth state when wallet disconnects\n setAuthState({\n isAuthenticated: false,\n isLoading: false,\n error: null,\n user: null,\n tokens: null,\n });\n }\n }, [adapter?.user]);\n\n const handleAuthentication = async (address: string) => {\n if (isAuthenticatingRef.current) return;\n isAuthenticatingRef.current = true;\n\n setAuthState((prev) => ({ ...prev, isLoading: true, error: null }));\n\n try {\n // Step 1: Get signature message\n const signatureMessageBody: GetWalletSignatureMessageBody = {\n address,\n walletEcosystem: \"evm\",\n url: window.location.href,\n };\n\n const signatureResponse = await fetch(\n `${PARTNERS_API_BASE}/auth/get-wallet-signature-message`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(signatureMessageBody),\n }\n );\n\n if (!signatureResponse.ok) {\n throw new Error(\"Failed to get signature message\");\n }\n\n const { message, nonce }: GetWalletSignatureMessageResponse = await signatureResponse.json();\n\n // Step 2: Sign message with adapter\n if (!adapter?.signMessage) {\n throw new Error(\"Wallet adapter does not support message signing\");\n }\n\n const signature = await adapter.signMessage(message);\n\n // Step 3: Authenticate with signature\n const authenticateBody: AuthenticateBody = {\n method: \"wallet\",\n walletInput: {\n address,\n ecosystem: \"evm\",\n signature,\n nonce,\n },\n };\n\n const authResponse = await fetch(`${PARTNERS_API_BASE}/auth/authenticate`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(authenticateBody),\n });\n\n if (!authResponse.ok) {\n throw new Error(\"Failed to authenticate\");\n }\n\n const authData: AuthenticateResponse = await authResponse.json();\n\n // Store auth data in localStorage\n setStoredAuth({\n address,\n tokens: authData.authTokens,\n user: authData.user,\n });\n\n setAuthState({\n isAuthenticated: true,\n isLoading: false,\n error: null,\n user: authData.user,\n tokens: authData.authTokens,\n });\n } catch (error) {\n console.error(\"Authentication error:\", error);\n setAuthState((prev) => ({\n ...prev,\n isLoading: false,\n error: error instanceof Error ? error.message : \"Authentication failed\",\n }));\n } finally {\n isAuthenticatingRef.current = false;\n }\n };\n\n const logout = () => {\n clearStoredAuth();\n setAuthState({\n isAuthenticated: false,\n isLoading: false,\n error: null,\n user: null,\n tokens: null,\n });\n };\n\n return { ...authState, logout };\n};\n","\"use client\";\nimport { type JSX, useState } from \"react\";\nimport { useEarnData } from \"../context/earn-data-context\";\nimport { CampaignItem, SearchBar } from \"@turtleclub/ui\";\nimport { useSetAtom } from \"jotai\";\nimport { showDealsOverlayAtom } from \"../store/overlay-atom\";\n\nexport function Discover(): JSX.Element {\n const [searchTerm, setSearchTerm] = useState(\"\");\n const showDeals = useSetAtom(showDealsOverlayAtom);\n\n // Get widget configuration\n\n // Get data from context\n const { campaigns, isLoading, error } = useEarnData();\n\n if (error) {\n return (\n <div className=\"w-full h-full flex items-center justify-center bg-background\">\n <p className=\"text-muted-foreground\">Error loading discover content</p>\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 discover content...</p>\n </div>\n );\n }\n\n return (\n <div className=\"w-full h-full flex flex-col min-h-0\">\n {/* Search Filters */}\n <div className=\"p-3 space-y-3 flex-shrink-0\">\n <h2 className=\"text-sm text-foreground font-medium\">\n Deposit directly into Turtle's boosted deals and liquidity campaign opportunities.\n </h2>\n\n {/* Search Input */}\n {/* <SearchBar searchTerm={searchTerm} setSearchTerm={setSearchTerm} placeholder=\"Search\" /> */}\n </div>\n\n {/* Content */}\n\n <div>\n {/* Campaigns Section */}\n {campaigns.map((campaign) => (\n <CampaignItem key={campaign.name} value={campaign} onSelect={() => showDeals()} />\n ))}\n\n {/* Partner Deals Section */}\n </div>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { usePartnerCampaigns, campaignsV2 } from \"@turtleclub/hooks\";\nimport { useWalletConnection } from \"../context/adapter-context\";\nimport type { CampaignPositionsData } from \"../types/positions\";\n\nconst { useUserCampaignPositions } = campaignsV2;\n\n// Campaign names - should match backend\nconst ALL_CAMPAIGN_NAMES = [\"tac\", \"katana\"] as const;\ntype CampaignName = (typeof ALL_CAMPAIGN_NAMES)[number];\n\ninterface UsePositionsDataResult {\n campaigns: Record<CampaignName, any>;\n positions: Record<CampaignName, CampaignPositionsData>;\n totalTVL: number;\n incentives: Record<CampaignName, any[]>;\n isLoading: boolean;\n error: Error | null;\n}\n\n/**\n * Consolidated hook for positions data\n * This replaces multiple separate hooks with a single efficient solution\n */\nexport function usePositionsData(): UsePositionsDataResult {\n const { user: userAddress } = useWalletConnection();\n\n // Fetch all campaigns using existing @turtleclub/hooks\n const {\n data: campaignsData,\n isLoading: campaignsLoading,\n error: campaignsError,\n } = usePartnerCampaigns({\n idFilter: ALL_CAMPAIGN_NAMES.join(\",\"),\n });\n\n // Process campaigns data\n const campaigns = useMemo(() => {\n if (!campaignsData) return {} as Record<CampaignName, any>;\n\n return ALL_CAMPAIGN_NAMES.reduce(\n (acc, name) => {\n const campaignWithVaults = campaignsData.find(\n (c) => c.campaign.name.toLowerCase() === name\n );\n if (campaignWithVaults) {\n // Store the entire CampaignWithVaults object, not just the campaign\n acc[name] = campaignWithVaults;\n\n // TODO: Remove this mock data once vaults are available from API\n if (campaignWithVaults.vaults.length === 0) {\n console.warn(`⚠️ Campaign ${name} has no vaults from API`);\n }\n }\n return acc;\n },\n {} as Record<CampaignName, any>\n );\n }, [campaignsData]);\n\n\n const {\n userPositions: tacPositions,\n userTotalTVL: tacTVL,\n isLoading: tacLoading,\n error: tacError,\n } = useUserCampaignPositions({\n campaignName: \"tac\",\n userAddress,\n });\n\n // Fetch positions for Katana campaign\n const {\n userPositions: katanaPositions,\n userTotalTVL: katanaTVL,\n isLoading: katanaLoading,\n error: katanaError,\n } = useUserCampaignPositions({\n campaignName: \"katana\",\n userAddress,\n });\n\n // Combine positions from both campaigns\n const positions = useMemo(\n () =>\n ({\n tac: {\n userPositions: tacPositions || [],\n userTotalTVL: tacTVL || 0,\n },\n katana: {\n userPositions: katanaPositions || [],\n userTotalTVL: katanaTVL || 0,\n },\n }) as Record<CampaignName, CampaignPositionsData>,\n [tacPositions, tacTVL, katanaPositions, katanaTVL]\n );\n\n const totalTVL = (tacTVL || 0) + (katanaTVL || 0);\n\n // TODO: Implement incentives hook\n const incentives = useMemo(\n () =>\n ALL_CAMPAIGN_NAMES.reduce(\n (acc, name) => {\n acc[name] = [];\n return acc;\n },\n {} as Record<CampaignName, any[]>\n ),\n []\n );\n\n const isLoading = campaignsLoading || tacLoading || katanaLoading;\n const error = campaignsError || tacError || katanaError;\n\n return {\n campaigns,\n positions,\n totalTVL,\n incentives,\n isLoading,\n error,\n };\n}\n","import { Position } from \"@/types\";\nimport { formatCurrency } from \"@/utils/format\";\nimport { ColumnDef } from \"@tanstack/react-table\";\n\nexport const columns: ColumnDef<Position>[] = [\n {\n id: \"vault.id\",\n header: \"Position\",\n accessorKey: \"vault.id\",\n cell: ({ row }) => {\n return (\n <div className=\"flex justify-start gap-0.5\">\n <a\n href={`https://app.turtle.club/campaigns/${row.original.vault.campaign}`}\n className=\"flex max-w-[120px] items-center gap-[5px] text-foreground hover:text-primary transition-colors\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <img\n src={row.original.vault.iconUrl}\n alt={row.original.vault.name}\n className=\"size-5 shrink-0 rounded-full\"\n />\n <span className=\"truncate\">{row.original.vault.name}</span>\n </a>\n </div>\n );\n },\n },\n {\n id: \"tvl\",\n header: \"TVL\",\n accessorKey: \"tvl\",\n cell: ({ row }) => {\n return (\n <span className=\"text-foreground\">{formatCurrency(row.original.userTVL ?? 0, 2)}</span>\n );\n },\n },\n];\n","\"use client\";\nimport { useMemo } from \"react\";\nimport { useWalletConnection } from \"../../context/adapter-context\";\nimport { usePositionsData } from \"../../hooks/usePositionsData\";\nimport { Button, DataTable, IconAnimation, Separator } from \"@turtleclub/ui\";\nimport { formatCurrency } from \"../../utils/format\";\nimport { columns } from \"./columns\";\nimport { TurtleIcon } from \"lucide-react\";\n// Campaign names are hardcoded for now since we only have two campaigns\nconst ALL_CAMPAIGN_NAMES = [\"katana\"] as const;\n\nexport function Positions() {\n const { user: userAddress, openConnectionModal } = useWalletConnection();\n\n const { positions: allPositions, totalTVL, isLoading } = usePositionsData();\n\n const sortedPositions = useMemo(() => {\n const combined = ALL_CAMPAIGN_NAMES.flatMap((name) => allPositions[name].userPositions);\n return combined.sort((a, b) => b.userTVL - a.userTVL);\n }, [allPositions]);\n\n const handleConnectWallet = () => {\n if (openConnectionModal) {\n openConnectionModal();\n }\n };\n\n if (isLoading || sortedPositions.length === 0) {\n return (\n <div className=\"sm:min-h-[690px] -mt-8 flex flex-col justify-center items-center gap-4 text-foreground\">\n <IconAnimation spinning={true}>\n <TurtleIcon className=\"w-6 h-6 text-primary\" />\n </IconAnimation>\n Loading...\n </div>\n );\n }\n\n return (\n <div className=\"sm:min-h-[690px] p-4\">\n {!isLoading && userAddress === undefined ? (\n <Button variant=\"default\" border=\"plain\" onClick={handleConnectWallet}>\n Connect wallet\n </Button>\n ) : (\n <>\n <div className=\"text-right text-sm mr-2\">\n <span className=\"text-foreground/60\">Your TVL: </span>\n <span className=\"text-foreground font-semibold\">{formatCurrency(totalTVL, 2)}</span>\n </div>\n <Separator className=\"my-2\" />\n <DataTable columns={columns} data={sortedPositions} />\n </>\n )}\n </div>\n );\n}\n","\"use client\";\nimport { useAtom } from \"jotai\";\nimport { selectedDealAtom, type OpportunityValue } from \"../store/earn-route-atom\";\nimport { useAdapter } from \"../context/adapter-context\";\nimport { isChainSupported } from \"@turtleclub/chains\";\n\ninterface UseSelectedOpportunityReturn {\n selectedOpportunity: OpportunityValue | null;\n setSelectedOpportunity: (opportunity: OpportunityValue | null) => void;\n chainId: number | undefined;\n needsChainSwitch: boolean;\n isCorrectChain: boolean;\n switchToOpportunityChain: () => Promise<void>;\n getTokenAddress: () => string | undefined;\n getTokenSymbol: () => string | undefined;\n getVaultId: () => string | undefined;\n}\n\nexport function useSelectedOpportunity(): UseSelectedOpportunityReturn {\n const [selectedOpportunity, setSelectedOpportunity] = useAtom(selectedDealAtom);\n const adapter = useAdapter();\n const currentNetwork = adapter.network;\n\n // Extract chainId from the opportunity\n const chainId = selectedOpportunity?.opportunityItem?.chain?.chainId;\n\n // Check if user needs to switch chains\n const needsChainSwitch = !!(\n selectedOpportunity &&\n currentNetwork !== undefined &&\n chainId !== undefined &&\n chainId !== currentNetwork &&\n isChainSupported(chainId)\n );\n\n // Check if user is on the correct chain\n const isCorrectChain = !!(\n selectedOpportunity &&\n currentNetwork !== undefined &&\n chainId !== undefined &&\n chainId === currentNetwork\n );\n\n // Function to switch to the opportunity's chain\n const switchToOpportunityChain = async () => {\n if (chainId && needsChainSwitch) {\n try {\n await adapter.changeNetwork(chainId);\n } catch (error) {\n console.error(\"Failed to switch network:\", error);\n throw error;\n }\n }\n };\n\n // Utility function to get token address\n const getTokenAddress = () => {\n return selectedOpportunity?.tokenDetails?.tokenAddress;\n };\n\n // Utility function to get token symbol\n const getTokenSymbol = () => {\n return selectedOpportunity?.tokenDetails?.tokenSymbol;\n };\n\n // Utility function to get vault ID\n const getVaultId = () => {\n return selectedOpportunity?.id;\n };\n\n return {\n selectedOpportunity,\n setSelectedOpportunity,\n chainId,\n needsChainSwitch,\n isCorrectChain,\n switchToOpportunityChain,\n getTokenAddress,\n getTokenSymbol,\n getVaultId,\n };\n}","\"use client\";\nimport { useSetAtom } from \"jotai\";\nimport { showAssetsOverlayAtom } from \"../store/overlay-atom\";\n\nexport function useTokenSelectorOverlay() {\n const showAssetSelector = useSetAtom(showAssetsOverlayAtom);\n\n const openTokenSelector = () => {\n showAssetSelector();\n };\n\n return {\n openTokenSelector,\n };\n}","\"use client\";\nimport type { JSX } from \"react\";\nimport { useAtom, useAtomValue } from \"jotai\";\nimport { useEffect } from \"react\";\nimport { formatNumber, formatToken } from \"@turtleclub/utils\";\nimport { depositValueAtom, resetTriggerAtom } from \"../../store/earn-route-atom\";\nimport { formatUSDValue } from \"../../adapters\";\nimport { useAdapter } from \"../../context/adapter-context\";\nimport { getChainById } from \"@turtleclub/chains\";\nimport { useTokenAutoSelection } from \"../../hooks/useTokenAutoSelection\";\nimport { useSelectedOpportunity } from \"../../hooks/useSelectedOpportunity\";\nimport { useTokenSelectorOverlay } from \"../../hooks/useTokenSelectorOverlay\";\nimport { SwapInput, iconUrlToImg } from \"@turtleclub/ui\";\nimport type { Token as UIToken } from \"@turtleclub/ui\";\n\nexport function SwapInputWrapper(): JSX.Element {\n const adapter = useAdapter();\n const walletConnected = !!adapter.user;\n\n const { chainId, needsChainSwitch, switchToOpportunityChain } = useSelectedOpportunity();\n const [amount, setAmount] = useAtom(depositValueAtom);\n const resetTrigger = useAtomValue(resetTriggerAtom);\n\n // Use custom hooks for token management\n const { selectedToken, currentChainBalances, isLoadingBalances } = useTokenAutoSelection();\n const { openTokenSelector } = useTokenSelectorOverlay();\n\n // Map earn widget tokens to UI tokens format\n const uiTokens: UIToken[] =\n currentChainBalances?.map((balance) => ({\n icon: balance.token.logos?.[0]\n ? iconUrlToImg(balance.token.logos[0], balance.token.symbol)\n : null,\n symbol: balance.token.symbol,\n address: balance.token.address,\n balance: balance.amount,\n })) || [];\n\n // Map selected token to UI token format if needed\n const selectedUIToken: UIToken | null = selectedToken\n ? {\n icon: selectedToken.logo ? iconUrlToImg(selectedToken.logo, selectedToken.symbol) : null,\n symbol: selectedToken.symbol,\n address: selectedToken.address,\n balance: selectedToken.balance,\n }\n : null;\n\n // Reset amount when token changes\n useEffect(() => {\n setAmount(\"\");\n }, [selectedToken, setAmount]);\n\n // Reset amount when reset trigger changes\n useEffect(() => {\n if (resetTrigger > 0) {\n setAmount(\"\");\n }\n }, [resetTrigger, setAmount]);\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(formatToken(selectedToken.balance, selectedToken), 5, false, false)\n : \"0\";\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 // Get target chain info if we need to switch\n const targetChain = needsChainSwitch && chainId ? getChainById(chainId) : null;\n\n // Show chain switch message if deal is from different chain\n if (needsChainSwitch && targetChain && walletConnected) {\n return (\n <div className=\"w-full flex flex-col gap-2 items-start justify-start\">\n <h3 className=\"text-md text-foreground font-medium\">Deposit</h3>\n <div className=\"w-full p-4 border border-muted rounded-lg bg-muted/10\">\n <p className=\"text-sm text-muted-foreground text-center\">\n Please{\" \"}\n <button\n onClick={switchToOpportunityChain}\n className=\"text-primary hover:text-primary/80 underline font-medium cursor-pointer transition-colors\"\n >\n switch\n </button>{\" \"}\n to <strong>{targetChain.name}</strong> to continue with this opportunity\n </p>\n </div>\n </div>\n );\n }\n\n // Show loading state\n if (isLoadingBalances && walletConnected) {\n return (\n <div className=\"w-full flex flex-col gap-2 items-start justify-start\">\n <h3 className=\"text-md text-foreground font-medium\">Deposit</h3>\n <div className=\"w-full p-4 border border-muted rounded-lg bg-muted/10\">\n <p className=\"text-sm text-muted-foreground text-center\">Loading tokens...</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"w-full flex flex-col gap-2 items-start justify-start\">\n <h3 className=\"text-md text-foreground font-medium\">Deposit</h3>\n <div className=\"w-full relative\">\n <SwapInput\n value={amount}\n onChange={setAmount}\n tokens={uiTokens}\n usdValue={hasInsufficientBalance ? undefined : usdValue}\n balance={formattedBalance}\n onMaxClick={handleMaxClick}\n isWalletConnected={walletConnected}\n className={`w-full [&_button]:w-32 [&_button]:min-w-32 p-6 ${hasInsufficientBalance ? \"border-destructive/50\" : \"\"}`}\n // Use custom token selector\n useCustomTokenSelector={true}\n selectedTokenData={selectedUIToken}\n onCustomTokenSelectorClick={openTokenSelector}\n />\n </div>\n </div>\n );\n}\n","import { useState, useCallback, useEffect, useRef, useMemo } from \"react\";\nimport type { EarnRouteResponse, EarnRouteStep } from \"../types/earn-route\";\nimport { useWalletConnection } from \"..\";\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 { network } = useWalletConnection();\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: network,\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 // 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 =\n previousStepIndex >= 0 && state.steps[previousStepIndex]?.completed;\n const currentStepNotStarted =\n state.currentIndex < state.steps.length && !state.steps[state.currentIndex]?.completed;\n const hasNextStep = state.currentIndex < state.steps.length;\n\n const shouldAutoExecute =\n previousStepCompleted &&\n currentStepNotStarted &&\n hasNextStep &&\n !state.isExecuting &&\n !state.allCompleted &&\n !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 }, [\n state.steps,\n state.currentIndex,\n state.isExecuting,\n state.allCompleted,\n state.cancelled,\n executeCurrentTransaction,\n ]);\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 id: options!.id || \"\",\n distributor_id: options!.distributor_id || \"\",\n referral_code: options!.referral_code || \"\",\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, selectedDealAtom } from \"../store/earn-route-atom\";\nimport { useEarnRoute as useEarnRouteOriginal } from \"@turtleclub/hooks\";\nimport type { earnTyped } from \"@turtleclub/api\";\nimport { useDistributorId } from \"../context/adapter-context\";\nimport { TokenStep } from \"@turtleclub/ui\";\nimport { formatUnits } from \"@/utils/format\";\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 const selectedDeal = useAtomValue(selectedDealAtom);\n const distributorId = useDistributorId();\n\n // Call the original useEarnRoute hook with the consolidated options and distributor_id\n const result = useEarnRoute(\n routeOptions && {\n ...routeOptions,\n distributor_id: distributorId,\n id: routeOptions.id || \"\",\n }\n );\n\n // Also get the original data for route processing\n const enabled =\n routeOptions !== undefined &&\n !!routeOptions.user &&\n !!routeOptions.amount &&\n parseFloat(routeOptions.amount) > 0;\n\n const { data: originalData } = useEarnRouteOriginal(\n enabled\n ? {\n user: routeOptions!.user,\n chain: routeOptions!.chain || 1,\n tokenIn: routeOptions!.tokenIn,\n tokenOut: routeOptions!.tokenOut,\n amount: routeOptions!.amount,\n slippage: routeOptions!.slippage || 0.1,\n distributor_id: distributorId || \"\",\n referral_code: routeOptions!.referral_code || \"\",\n id: routeOptions!.id || \"\",\n }\n : undefined\n );\n\n // Process route details from original data\n const routeDetails = processRouteDetails(originalData, selectedDeal);\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 routeDetails,\n };\n}\n\n/**\n * Process the route steps to extract token flow for RouteDetails component\n */\nfunction processRouteDetails(data: any, selectedDeal: any): TokenStep[] {\n if (!data?.steps) return [];\n\n const parseApproveStep = (token: earnTyped.Token, amount: string): TokenStep => {\n return {\n in: {\n icon: token.logos[0],\n symbol: token.symbol,\n },\n out: null,\n amount: formatUnits(BigInt(amount), token.decimals),\n type: \"approve\",\n };\n };\n\n const parseEnsoStep = (\n kind: \"swap\" | \"deposit\",\n fromToken: earnTyped.Token,\n toToken: earnTyped.Token\n ): TokenStep => {\n return {\n in: {\n icon: fromToken.logos[0],\n symbol: fromToken.symbol,\n },\n out: {\n icon: toToken.logos[0] || selectedDeal?.iconToken || selectedDeal?.iconDeal || undefined,\n symbol: toToken.symbol,\n },\n amount: undefined,\n type: kind,\n };\n };\n\n const tokens: TokenStep[] = [];\n data.steps.forEach((step: earnTyped.RouterStep) => {\n // Approve steps\n if (step.kind === \"approve\" && step.token) {\n const approveStep = parseApproveStep(step.token, step.amount);\n tokens.push(approveStep);\n }\n\n // Enso steps (swaps)\n if (step.kind === \"enso\" && step.substeps) {\n step.substeps.forEach((substep: earnTyped.RouterSubstep) => {\n const fromToken = substep.from[0];\n const toToken = substep.to[0];\n const step: TokenStep = parseEnsoStep(substep.kind, fromToken, toToken);\n tokens.push(step);\n });\n }\n });\n\n return tokens;\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}","\"use client\";\nimport { Button, Tooltip, TooltipContent, TooltipTrigger } from \"@turtleclub/ui\";\nimport { useAdapter } from \"../../context/adapter-context\";\nimport { useGeocheck } from \"@turtleclub/hooks\";\n\ninterface SimpleConfirmButtonProps {\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 const { data: geoCheckData, isLoading: geoCheckLoading } = useGeocheck();\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 null;\n }\n\n // Geo restriction check\n if (geoCheckLoading) {\n return (\n <Button\n disabled\n className={`w-full border-foreground/60 border ${className || \"\"}`}\n size=\"lg\"\n >\n Checking availability...\n </Button>\n );\n }\n\n if (geoCheckData && !geoCheckData.canInteract) {\n return (\n <Tooltip>\n <TooltipTrigger className=\"w-full cursor-default space-y-2\">\n <Button\n disabled\n variant=\"default\"\n className={`w-full border-foreground/60 border ${className || \"\"}`}\n size=\"lg\"\n >\n Geo Restricted\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\" sideOffset={6} className=\"text-xs\">\n Due to geographical restrictions you can't use this vault.\n </TooltipContent>\n </Tooltip>\n );\n }\n\n // Connect wallet button\n if (!userAddress || !walletConnected) {\n return (\n <Button\n onClick={() => openConnectionModal()}\n className=\"cursor-pointer w-full border-foreground/60 border\"\n variant=\"green\"\n border=\"interactive\"\n size=\"lg\"\n >\n Connect Wallet\n </Button>\n );\n }\n\n // Loading state\n if (isLoadingRoute) {\n return (\n <Button\n disabled\n className={`w-full border-foreground/60 border ${className || \"\"}`}\n size=\"lg\"\n >\n Loading route...\n </Button>\n );\n }\n\n // Error state\n if (routeError) {\n return (\n <Button\n disabled\n variant=\"default\"\n className={`w-full border-foreground/60 border ${className || \"\"}`}\n size=\"lg\"\n >\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\n disabled\n variant=\"default\"\n className={`w-full border-foreground/60 border ${className || \"\"}`}\n size=\"lg\"\n >\n Enter amount to continue\n </Button>\n );\n }\n\n // Insufficient balance\n if (hasInsufficientBalance) {\n return (\n <Button\n disabled\n variant=\"default\"\n className={`w-full border-foreground/60 border ${className || \"\"}`}\n size=\"lg\"\n >\n Insufficient Balance\n </Button>\n );\n }\n\n // Render confirm button\n return (\n <Button\n variant=\"green\"\n border=\"interactive\"\n onClick={handleConfirm}\n disabled={!canExecute || isExecuting}\n size=\"lg\"\n className=\"cursor-pointer w-full border border-foreground/60\"\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}\n","\"use client\";\nimport { 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","\"use client\";\nimport { SwapDetails } from \"@turtleclub/ui\";\nimport { useMemo } from \"react\";\nimport { useAtom } from \"jotai\";\nimport { formatNumber, formatToken } from \"@turtleclub/utils\";\nimport { slippageAtom } from \"../../store/earn-route-atom\";\n\ninterface SwapDetailsWrapperProps {\n amountToDeposit: string;\n depositSymbol: string;\n amountToReceive: string;\n receiveSymbol: string;\n receiveDecimals: number;\n tokenPrice: number;\n defaultOpen?: boolean;\n}\nexport function SwapDetailsWrapper({\n amountToDeposit,\n depositSymbol,\n amountToReceive,\n receiveSymbol,\n receiveDecimals,\n tokenPrice,\n defaultOpen = false,\n}: SwapDetailsWrapperProps) {\n const [slippage, setSlippage] = useAtom(slippageAtom);\n // Calculate swap details based on current state\n const swapDetailsProps = useMemo(() => {\n // Format amount to max 6 decimals\n const formattedAmount = amountToDeposit ? formatNumber(amountToDeposit, 6, false, false) : \"0\";\n\n const formattedAmountToReceive = amountToReceive\n ? formatToken(amountToReceive, { decimals: receiveDecimals }, true, false)\n : \"0\";\n\n return {\n deposit: amountToDeposit ? `${formattedAmount} ${depositSymbol || \"ETH\"}` : \"0 ETH\",\n receive: amountToReceive ? `${formattedAmountToReceive} ${receiveSymbol || \"ETH\"}` : \"0 ETH\",\n equivalentInUsd:\n amountToDeposit && tokenPrice\n ? (parseFloat(amountToDeposit) * tokenPrice).toFixed(2)\n : \"0.00\",\n defaultOpen: defaultOpen,\n slippage: slippage,\n setSlippage: setSlippage,\n };\n }, [amountToDeposit, depositSymbol, amountToReceive, receiveSymbol, tokenPrice, defaultOpen]);\n return <SwapDetails details={swapDetailsProps} />;\n}\n","\"use client\";\nimport { Wallet2Icon } from \"lucide-react\";\nimport type { JSX } from \"react\";\nimport { useState } from \"react\";\n\ninterface AccountDetailsProps {\n userAddress?: string;\n disconnect: () => Promise<void>;\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, disconnect }: AccountDetailsProps): JSX.Element {\n const [isHovered, setIsHovered] = useState(false);\n\n const handleMouseEnter = () => {\n setIsHovered(true);\n };\n\n const handleMouseLeave = () => {\n setIsHovered(false);\n };\n\n return (\n <button\n type=\"button\"\n onClick={() => disconnect()}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n className=\"relative rounded-full bg-background px-3 py-1.5 border border-muted-foreground/60 cursor-pointer transition-colors hover:border-primary min-w-[140px] h-9 overflow-hidden\"\n >\n {/* Address - visible by default, hidden on hover */}\n <div\n className=\"flex items-center gap-2 transition-opacity duration-150\"\n style={{ opacity: isHovered ? 0 : 1 }}\n >\n <Wallet2Icon className=\"w-4 h-4\" />\n <span className=\"text-foreground font-medium text-xs\">{shortenAddress(userAddress)}</span>\n </div>\n\n {/* Disconnect - hidden by default, visible on hover */}\n <div\n className=\"absolute inset-0 flex items-center justify-center gap-2 transition-opacity duration-150\"\n style={{ opacity: isHovered ? 1 : 0 }}\n >\n <span className=\"text-primary font-medium text-xs\">Log out</span>\n </div>\n </button>\n );\n}\n\nexport default AccountDetails;\n","\"use client\";\nimport type { JSX } from \"react\";\nimport { useMemo } from \"react\";\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n} from \"@turtleclub/ui\";\nimport { chainLogo, getChainById } from \"@turtleclub/chains\";\nimport { useEarnData } from \"../../context/earn-data-context\";\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 { supportedChains, isLoading } = useEarnData();\n\n // Always use the selectedChainId from props (context) as the source of truth\n const currentChain = useMemo(() => {\n // First try to find the chain in available chains\n const chainInList = supportedChains.find((chain) => chain.chainId === selectedChainId);\n if (chainInList) return chainInList;\n\n // If not in list but we have a selectedChainId, create a temporary entry\n if (selectedChainId) {\n const chain = getChainById(selectedChainId);\n const icon = chainLogo(selectedChainId);\n\n if (chain) {\n return {\n value: chain.name.toLowerCase().replace(/\\s+/g, \"-\"),\n symbol: chain.nativeCurrency.symbol,\n name: chain.name,\n icon,\n chainId: selectedChainId,\n };\n }\n }\n\n // Fallback to first available\n return supportedChains[0];\n }, [selectedChainId, supportedChains]);\n\n // Show skeleton while loading\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-between rounded-full rounded-l-none bg-background py-2 pr-4 h-9 animate-pulse\">\n <div className=\"w-8 h-8 -translate-x-2.5\">\n <div className=\"w-8 h-8 rounded-full bg-muted\" />\n </div>\n <div className=\"flex items-center gap-3\">\n <div className=\"h-4 w-20 bg-muted rounded\" />\n </div>\n </div>\n );\n }\n\n // Safeguard if no chains are available after loading\n if (!currentChain || supportedChains.length === 0) {\n return null;\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger className=\"border border-muted-foreground/60\" src={currentChain.icon}>\n {currentChain.name}\n </DropdownMenuTrigger>\n\n <DropdownMenuContent>\n {supportedChains.map((chain) => (\n <DropdownMenuItem\n key={chain.value}\n onClick={() => onChainChange?.(chain.chainId)}\n className=\"hover:bg-accent/70 hover:text-foreground\"\n >\n <img\n src={chain.icon}\n alt={chain.name}\n className=\"size-6 rounded-full -ml-1 text-foreground\"\n />\n {chain.name}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","\"use client\";\nimport 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-2 text-foreground\">\n {/* Wallet Address Display - Only show when connected */}\n {walletConnected && userAddress && (\n <AccountDetails userAddress={userAddress} disconnect={adapter.disconnect} />\n )}\n\n {/* Chain Selector - Only show when connected */}\n {walletConnected && (\n <ChainSelector selectedChainId={selectedChainId} onChainChange={handleChainChange} />\n )}\n </div>\n );\n}\n","\"use client\";\nimport type { JSX } from \"react\";\n\nexport function SwapSkeleton(): JSX.Element {\n return (\n <div className=\"w-full flex flex-col gap-4 flex-1 min-h-0 h-full overflow-hidden\">\n {/* Wallet Section Skeleton */}\n <div className=\"flex-shrink-0\">\n <div className=\"flex w-full items-center justify-between gap-2\">\n {/* Account Details Skeleton */}\n <div className=\"rounded-full bg-secondary px-3 py-1.5 border border-border min-w-[140px] h-9\">\n <div className=\"animate-pulse\">\n <div className=\"h-4 w-24 bg-muted rounded\" />\n </div>\n </div>\n \n {/* Chain Selector Skeleton */}\n <div className=\"flex items-center justify-between rounded-full rounded-l-none bg-card py-2 pr-4 h-9 animate-pulse\">\n <div className=\"w-8 h-8 -translate-x-2.5\">\n <div className=\"w-8 h-8 rounded-full bg-muted\" />\n </div>\n <div className=\"flex items-center gap-3\">\n <div className=\"h-4 w-20 bg-muted rounded\" />\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"flex-shrink-0 space-y-2\">\n {/* Swap Input Wrapper Skeleton */}\n <div className=\"rounded-lg bg-secondary p-4 space-y-3 animate-pulse\">\n {/* Amount Input Skeleton */}\n <div className=\"flex justify-between items-center\">\n <div className=\"h-8 w-32 bg-muted rounded\" />\n <div className=\"flex items-center gap-2\">\n <div className=\"w-8 h-8 rounded-full bg-muted\" />\n <div className=\"h-6 w-16 bg-muted rounded\" />\n </div>\n </div>\n \n {/* Balance Skeleton */}\n <div className=\"flex justify-between text-sm\">\n <div className=\"h-4 w-24 bg-muted rounded\" />\n <div className=\"h-4 w-20 bg-muted rounded\" />\n </div>\n </div>\n\n {/* Opportunity Section Loading State */}\n <div className=\"p-6 border border-border rounded-lg space-y-4 animate-pulse\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-full bg-muted\" />\n <div className=\"space-y-2\">\n <div className=\"h-5 w-32 bg-muted rounded\" />\n <div className=\"h-4 w-24 bg-muted rounded\" />\n </div>\n </div>\n \n <div className=\"space-y-2\">\n <div className=\"flex justify-between\">\n <div className=\"h-4 w-16 bg-muted rounded\" />\n <div className=\"h-4 w-20 bg-muted rounded\" />\n </div>\n <div className=\"flex justify-between\">\n <div className=\"h-4 w-16 bg-muted rounded\" />\n <div className=\"h-4 w-24 bg-muted rounded\" />\n </div>\n </div>\n\n <div className=\"pt-2\">\n <div className=\"h-10 w-full bg-muted rounded-lg\" />\n </div>\n </div>\n </div>\n\n {/* Empty scrollable area */}\n <div className=\"flex-1 min-h-0\" />\n\n {/* Confirm button skeleton */}\n <div className=\"sticky bottom-0 pb-2 w-full\">\n <div className=\"h-12 w-full bg-muted rounded-lg animate-pulse\" />\n </div>\n </div>\n );\n}","\"use client\";\nimport { useEffect, useMemo, type JSX } from \"react\";\nimport { SwapInputWrapper } from \"./swap-input-wrapper\";\nimport { useAtomValue, useSetAtom } from \"jotai\";\nimport { useTransactionQueue } from \"../../hooks/useTransactionQueue\";\nimport { useTokenDeposit } from \"../../hooks/useTokenDeposit\";\nimport { useEarnRouteConsolidated } from \"../../hooks/useEarnRouteConsolidated\";\nimport { selectedTokenAtom, selectedDealAtom, depositValueAtom } from \"../../store/earn-route-atom\";\nimport { useAdapter } from \"../../context/adapter-context\";\nimport { SimpleConfirmButton } from \"./simple-confirm-button\";\nimport { TransactionStatusSection } from \"./transaction-status\";\nimport { SwapDetailsWrapper } from \"./swap-details-wrapper\";\nimport { formatToken } from \"@turtleclub/utils\";\nimport { OpportunitySection, RouteDetails } from \"@turtleclub/ui\";\nimport { WalletSection } from \"../wallet-section\";\nimport { showDealsOverlayAtom } from \"@/store/overlay-atom\";\nimport { useEarnData } from \"../../context/earn-data-context\";\nimport { SwapSkeleton } from \"./swap-skeleton\";\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 const showDeals = useSetAtom(showDealsOverlayAtom);\n\n // Get adapter methods from context\n const adapter = useAdapter();\n const { sendTransaction, openConnectionModal, user: userAddress } = adapter;\n\n // Get loading state from earn data context\n const { isLoading: isEarnDataLoading, balancesLoading: isBalancesLoading } = useEarnData();\n\n // Get transaction state from hooks\n const { fetchedRoute, routeError, isLoadingRoute } = useTokenDeposit();\n // Get route details for RouteDetails component\n const { routeDetails } = useEarnRouteConsolidated();\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 const opSectionData = useMemo(() => {\n return {\n name: dealSelected?.opportunityItem.name ?? \"N/A\",\n vaultSymbol: dealSelected?.tokenDetails?.tokenSymbol ?? \"N/A\",\n icon: dealSelected?.opportunityItem.icon ?? \"N/A\",\n totalApr: dealSelected?.opportunityItem.apr ?? \"N/A\",\n aprBreakdown:\n dealSelected?.opportunityItem.aprBreakdown.map((incentive) => ({\n name: incentive.name,\n iconUrl: incentive.iconUrl,\n apr: incentive.apr?.toString() ?? \"0\",\n description: incentive.description,\n boost: incentive.boost,\n })) ?? [],\n tvlUsd: dealSelected?.opportunityItem.tvl ?? \"N/A\",\n depositDetails: {\n symbol: selectedToken?.symbol ?? \"N/A\",\n price: selectedToken?.price ?? 0,\n depositAmount: parseFloat(!depositValue ? \"0\" : depositValue) ?? 0,\n apr: parseFloat(dealSelected?.opportunityItem.apr ?? \"0\") / 100,\n },\n type: \"Turtle Campaign\" as const,\n };\n }, [dealSelected, depositValue, selectedToken]);\n\n // Show skeleton while loading earn data\n if (isEarnDataLoading || isBalancesLoading) {\n return <SwapSkeleton />;\n }\n\n return (\n <div className=\"w-full flex flex-col gap-4 flex-1 min-h-0 h-full overflow-hidden\">\n <div className=\"flex-shrink-0\">\n <WalletSection />\n </div>\n\n <div className=\"flex-shrink-0 space-y-2\">\n <SwapInputWrapper />\n <OpportunitySection\n className=\"p-6\"\n value={opSectionData}\n opportunitySelector=\"old\"\n onOpportunityClick={() => showDeals()}\n hideDisclaimer={\n // (showSwapDetails && fetchedRoute && !isLoadingRoute) || showingTransactionStatus\n true\n }\n />\n </div>\n\n {/* 4. Info section - Only this section is scrollable */}\n <div className=\"flex-1 min-h-0 overflow-y-auto\">\n {/* 3. Transaction details - Fixed when shown */}\n {showSwapDetails && fetchedRoute && !isLoadingRoute && (\n <div className=\"flex-shrink-0 space-y-2\">\n <SwapDetailsWrapper\n amountToDeposit={depositValue}\n depositSymbol={selectedToken?.symbol || \"\"}\n amountToReceive={fetchedRoute?.outputAmount || \"0\"}\n receiveSymbol={dealSelected?.tokenDetails?.tokenSymbol || \"\"}\n receiveDecimals={dealSelected?.tokenDetails?.tokenDecimals || 0}\n tokenPrice={selectedToken?.price || 0}\n defaultOpen={true}\n />\n\n {/* Route Details - Show the token swap route */}\n {routeDetails && routeDetails.length > 0 && (\n <RouteDetails value={{ steps: routeDetails }} />\n )}\n </div>\n )}\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 </div>\n\n {/* 5. Confirm button - Sticky at bottom */}\n <div className=\"sticky bottom-0 pb-2 w-full\">\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","\"use client\";\nimport React, { useMemo, useState } from \"react\";\nimport type { EarnWidgetProps } from \"../../types\";\nimport { WidgetRoot } from \"./widget-root\";\nimport { useAtomValue, useSetAtom } from \"jotai\";\nimport { overlayTypeAtom } from \"../../store/overlay-atom\";\nimport { Deals } from \"../deals\";\nimport { AssetSelection } from \"../asset-selection\";\nimport { WidgetContainer, WidgetLogo } from \"../ui\";\nimport { SegmentControl } from \"@turtleclub/ui\";\nimport { AdapterProvider } from \"../../context/adapter-context\";\nimport { EarnDataProvider } from \"../../context/earn-data-context\";\nimport { useEarnRouteSync } from \"../../hooks/useEarnRouteSync\";\nimport { useWidgetLogo } from \"../../hooks/useWidgetLogo\";\nimport { useWidgetStyles } from \"../../hooks/useWidgetStyles\";\nimport { useAuth } from \"../../hooks/useAuth\";\nimport { Discover } from \"../discover\";\nimport { Positions } from \"../positions\";\nimport { Swap } from \"../swap/swap\";\n\nfunction EarnWidgetInner({ config }: { config: EarnWidgetProps[\"config\"] }): React.ReactElement {\n // Sync adapter data needed for earn route validation\n useEarnRouteSync();\n\n // Handle authentication flow\n const { isAuthenticated } = useAuth();\n\n const [tab, setTab] = useState<\"earn\" | \"positions\" | \"discover\">(\"earn\");\n const tabButtons = useMemo(\n () => [\n ...(isAuthenticated ? [{ value: \"positions\", label: \"Your Positions\" }] : []),\n { value: \"earn\", label: \"Earn\" },\n { value: \"discover\", label: \"Discover\" },\n ],\n [isAuthenticated]\n );\n\n const overlayType = useAtomValue(overlayTypeAtom);\n const setOverlayType = useSetAtom(overlayTypeAtom);\n const { light, dark, fallback } = useWidgetLogo();\n const { showNavigation } = useWidgetStyles();\n\n // Check if widget is misconfigured (both campaigns and deals are empty/undefined)\n\n return (\n <WidgetRoot config={config}>\n <EarnDataProvider>\n <div className=\"w-full max-w-md h-full flex flex-col gap-2 overflow-hidden\">\n <>\n {showNavigation && (\n <SegmentControl\n cursorPointer\n variant=\"segment\"\n value={tab}\n onChange={(v) => {\n setTab(v as \"earn\" | \"positions\" | \"discover\");\n setOverlayType(\"none\");\n }}\n items={tabButtons}\n className=\"!bg-background\"\n />\n )}\n\n {/* Content wrapper with transparent background */}\n <div className={`flex-1 min-h-0 overflow-hidden flex flex-col gap-2 bg-transparent`}>\n {overlayType !== \"none\" ? (\n // Overlay mode: Show overlay content in full container\n <WidgetContainer\n variant=\"border\"\n className=\"w-full h-full min-h-0 flex flex-col overflow-hidden\"\n >\n {overlayType === \"deals\" && <Deals onSwitchToEarn={() => setTab(\"earn\")} />}\n {overlayType === \"assets\" && <AssetSelection />}\n </WidgetContainer>\n ) : (\n <>\n {/* Main content in container */}\n <WidgetContainer\n variant=\"border\"\n className=\"flex-1 min-h-0 w-full flex flex-col overflow-hidden\"\n >\n <div className=\"flex-shrink-0 py-2\">\n <WidgetLogo light={light} dark={dark} fallback={fallback} size=\"xs\" />\n </div>\n\n <div className=\"flex-1 min-h-0 overflow-hidden\">\n {tab === \"positions\" && <Positions />}\n {tab === \"earn\" && <Swap />}\n {tab === \"discover\" && <Discover />}\n </div>\n </WidgetContainer>\n </>\n )}\n </div>\n </>\n </div>\n </EarnDataProvider>\n </WidgetRoot>\n );\n}\n\nexport function EarnWidget({\n adapter,\n config,\n distributorId,\n}: EarnWidgetProps): React.ReactElement {\n return (\n <AdapterProvider adapter={adapter} distributorId={distributorId}>\n <EarnWidgetInner config={config} />\n </AdapterProvider>\n );\n}\n"]}
|