@turtleclub/earn-widget 0.3.3-beta.9 → 0.4.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -26
- package/dist/index.d.ts +3 -26
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/styles.css +260 -212
- package/package.json +5 -5
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","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"]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/utils/cn.ts","../src/features/layout/contexts/widget-config-context.tsx","../src/features/layout/utils/theme.ts","../src/features/layout/constants/theme.ts","../src/features/layout/hooks/useWidgetStyles.ts","../src/features/widget-logo/components/widget-logo.tsx","../src/features/widget-logo/hooks/useWidgetLogo.ts","../src/features/layout/components/widget-container.tsx","../src/features/layout/contexts/adapter-context.tsx","../src/features/layout/components/widget-theme.tsx","../src/features/auth/hooks/useWidgetAuth.ts","../src/features/navigation/hooks/use-widget-tabs.ts","../src/features/navigation/hooks/use-widget-overlay.ts","../src/features/navigation/components/navigation-root.tsx","../src/features/navigation/components/overlay-layout.tsx","../src/features/opportunities/opportunity-table/hooks/useTotalYield.ts","../src/features/opportunities/opportunity-table/components/apr-breakdown-tooltip.tsx","../src/features/opportunities/opportunity-table/components/chain-list.tsx","../src/state/deposit-atoms.ts","../src/hooks/useDepositForm.ts","../src/features/opportunities/opportunity-table/components/opportunities-table.tsx","../src/features/overlays/components/opportunity-overlay.tsx","../src/features/tabs/components/positions.tsx","../src/features/tabs/components/discover.tsx","../src/features/opportunities/transaction-status/components/TransactionStatusSection.tsx","../src/features/opportunities/transaction-status/utils/index.ts","../src/features/opportunities/transaction-status/hooks/useTransactionQueue.ts","../src/features/opportunities/deposit/utils/index.ts","../src/features/opportunities/deposit/hooks/useSwapRoute.ts","../src/features/opportunities/deposit/components/confirm-button.tsx","../src/features/opportunities/deposit/components/deposit-section.tsx","../src/features/overlays/components/balances-overlay.tsx","../src/features/tabs/hooks/useInitWidget.ts","../src/features/wallet/components/wallet-dropdown.tsx","../src/features/wallet/components/chains-dropdown.tsx","../src/features/wallet/components/wallet-section.tsx","../src/features/tabs/components/earn-skeleton.tsx","../src/features/tabs/components/earn.tsx","../src/features/layout/components/widget-main.tsx","../src/features/layout/components/earn-widget.tsx","../src/shared/constants.ts"],"names":["cn","inputs","clsx","WidgetConfigContext","createContext","WidgetConfigProvider","config","children","jsx","useWidgetConfig","context","useContext","invertColor","color","darkenColor","amount","generateCoreTokenCSS","styles","theme","isDark","coreTokens","DEFAULT_WIDGET_STYLES","DEFAULT_THEME","DEFAULT_FONT","DEFAULT_FONT_SECONDARY","useWidgetStyles","fontPrimary","fontSecondary","widgetWidth","customWidth","showNavigation","padding","rounding","widgetStyles","coreTokenCSS","sizeClasses","WidgetLogo","light","dark","fallback","className","size","imageError","setImageError","useState","logoUrl","useWidgetLogo","paddingVariants","cva","WidgetContainer","variant","showLogo","logoSize","props","configPadding","finalPadding","jsxs","Card","AdapterContext","DistributorIdContext","AdapterProvider","adapter","distributorId","useAdapter","useDistributorId","WidgetThemeWrapper","useWidgetAuth","previousAddressRef","useRef","isProcessingRef","membershipData","isCheckingMembership","refetchMembership","useCheckMembership","createAgreement","isCreatingAgreement","agreementError","useCreateMembershipAgreement","createMembership","isCreatingMembership","membershipError","useCreateMembership","useEffect","currentAddress","handleMembershipFlow","address","checkResult","agreementResult","signature","membershipResult","error","isLoading","useWidgetTabs","defaultTab","currentTab","setCurrentTab","setTab","useCallback","tab","overlayAtom","atom","useWidgetOverlay","overlayState","setOverlayState","useAtom","openOverlay","overlayId","data","closeOverlay","NavigationRoot","tabs","overlays","currentOverlay","overlayData","useMemo","_","id","ActiveTab","ActiveOverlay","Fragment","OverlayLayout","onBack","Button","ChevronLeft","getTotalYield","incentives","i","acc","incentive","useTotalYield","APRBreakdownTooltip","isPill","totalYield","sortedIncentives","a","b","TurtleTooltip","formatNumber","InfoIcon","Chain","chain","triggerClassName","network","getNetworkById","getNetworkBackgroundColor","selectedOpportunityAtom","tokenInAmountAtom","slippageAtom","selectedTokenAtom","depositFormAtom","get","opportunity","token","slippage","amountGreaterThanZero","isValid","options","parseUnits","useDepositForm","setOpportunity","setToken","setAmount","setSlippage","formState","useAtomValue","reset","OpportunitiesTable","opportunities","changeNetwork","selectOpportunity","selectToken","DataTable","row","APIStatus","formatCurrency","rowA","rowB","opportunityChainId","OpportunityOverlay","useWidgetOpportunities","PositionsTab","DiscoverTab","TransactionStatusSection","steps","currentStep","allCompleted","cancelled","tokenSymbol","resetQueue","resetForm","lastCompletedStep","step","currentStepWithHash","displayTxHash","txStatusProps","TxStatus","getStepLabel","getStepDescription","index","isUserRejection","errorMessage","pattern","shouldAutoExecuteNextStep","state","previousStep","AUTO_EXECUTE_DELAY","createTransactionStep","queueReducer","action","idx","updatedSteps","nextIndex","useTransactionQueue","earnRoute","userAddress","chainId","sendTransaction","onError","onSuccess","initialState","dispatch","useReducer","executeCurrentTransaction","txHash","isCancellation","isExecuting","hasError","completedSteps","totalSteps","progress","showTxStatus","canExecute","timer","parseEnsoStep","kind","fromToken","toToken","parseApproveStep","formatToken","processRouteDetails","tokens","approveStep","substep","getOpportunityTokenDetails","mainnet","useSwapRoute","isEnabled","referralCode","params","hasRequiredParams","useEarnRoute","routeDetails","ConfirmButton","fetchedRoute","routeError","isLoadingRoute","showingTransactionStatus","hasInsufficientBalance","handleConfirm","buttonState","DepositSection","executeTransaction","stickyButton","symbol","decimals","usdValue","handleMaxClick","useTokenBalance","isReady","outputAmount","transaction","adapterTx","swapDetailsProps","formattedAmount","formattedAmountToReceive","SwapInput","SwapDetails","RouteDetails","mapBalanceToAsset","balance","tokenData","getNetworkByChainId","formatCurrencyWithCommas","mapBalancesToAssets","balances","assetsList","chainBalances","formatSelectedToken","BalancesOverlay","user","useMultiChainBalances","onAssetSelect","asset","assets","AssetList","selectFirstAvailableToken","firstAsset","useInitWidget","isBalancesLoading","isWidgetOpportunitiesLoading","firstOpportunity","firstToken","shortenAddress","chars","WalletDropdown","isMember","isConnected","disconnect","Wallet2Icon","LogOutIcon","ChainsDropdown","widgetOpportunities","chains","currentChainId","currentChain","handleChainChange","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","WalletSection","EarnTabSkeleton","Skeleton","EarnTab","connect","BaseSelector","iconUrlToImg","OpportunityRateEstimator","WidgetMain","EarnWidget","defaultWidgetStyleConfig"],"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}","\"use client\";\n\nimport { createContext, useContext, type ReactNode } from \"react\";\nimport type { WidgetStyleConfig } from \"../types/style-config\";\n\nconst WidgetConfigContext = createContext<WidgetStyleConfig | null>(null);\n\nexport function WidgetConfigProvider({\n config,\n children,\n}: {\n config: WidgetStyleConfig;\n children: ReactNode;\n}) {\n return (\n <WidgetConfigContext.Provider value={config}>\n {children}\n </WidgetConfigContext.Provider>\n );\n}\n\nexport function useWidgetConfig() {\n const context = useContext(WidgetConfigContext);\n if (!context) {\n throw new Error(\"useWidgetConfig must be used within WidgetConfigProvider\");\n }\n return context;\n}\n","import { CSSCustomProperties, WidgetStyles } from \"../types/style-config\";\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 { 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;\n","import { useWidgetConfig } from \"../contexts/widget-config-context\";\nimport { generateCoreTokenCSS } from \"../utils/theme\";\nimport {\n DEFAULT_WIDGET_STYLES,\n DEFAULT_THEME,\n DEFAULT_FONT,\n DEFAULT_FONT_SECONDARY,\n} from \"../constants/theme\";\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 = useWidgetConfig();\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, { useState } from \"react\";\nimport { cn } from \"@turtleclub/ui\";\nimport { useWidgetStyles } from \"../../layout/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 { useWidgetConfig } from \"../../layout/contexts/widget-config-context\";\n\nexport function useWidgetLogo() {\n const config = useWidgetConfig();\n\n return {\n light: config?.logo?.light,\n dark: config?.logo?.dark,\n fallback: config?.logo?.fallback || \"Turtle Club\",\n };\n}\n","\"use client\";\nimport React from \"react\";\nimport type { JSX } from \"react\";\nimport { cn } from \"../../../shared/utils/cn\";\nimport { useWidgetStyles } from \"../hooks/useWidgetStyles\";\nimport { Card } from \"@turtleclub/ui\";\nimport { cva } from \"class-variance-authority\";\nimport { WidgetLogo } from \"../../widget-logo/components/widget-logo\";\nimport { useWidgetLogo } from \"../../widget-logo/hooks/useWidgetLogo\";\n\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 /** Whether to show the widget logo at the top (default: true) */\n showLogo?: boolean;\n /** Size of the logo when shown (default: \"xs\") */\n logoSize?: \"xxs\" | \"xs\" | \"sm\" | \"md\" | \"lg\";\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 showLogo = true,\n logoSize = \"xs\",\n ...props\n}: WidgetContainerProps): JSX.Element {\n const { padding: configPadding } = useWidgetStyles();\n const { light, dark, fallback } = useWidgetLogo();\n\n // Use config values if not explicitly provided via props\n const finalPadding = paddingVariants({ padding: padding ?? configPadding });\n\n return (\n <Card className={cn(className, finalPadding)} {...props} variant={variant} gradient=\"white\">\n {showLogo && (\n <div className=\"flex-shrink-0 py-2\">\n <WidgetLogo light={light} dark={dark} fallback={fallback} size={logoSize} />\n </div>\n )}\n {children}\n </Card>\n );\n}\n","\"use client\";\n\nimport React, { createContext, useContext } from \"react\";\nimport { Adapter } from \"../types/adapter\";\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> = ({\n adapter,\n distributorId,\n children,\n}) => {\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};\n","\"use client\";\nimport React from \"react\";\nimport { cn } from \"../../../shared/utils/cn\";\nimport { useWidgetStyles } from \"../hooks/useWidgetStyles\";\nimport { useWidgetConfig } from \"../contexts/widget-config-context\";\n\ninterface WidgetThemeWrapperProps {\n children: React.ReactNode;\n}\n\nexport function WidgetThemeWrapper({ children }: WidgetThemeWrapperProps): React.ReactElement {\n const config = useWidgetConfig();\n const { theme, coreTokenCSS, fontPrimary, fontSecondary, widgetWidth } = useWidgetStyles();\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 {/* Temporal wrapper to limit the width of the widget */}\n <div className=\"w-full max-w-md h-full flex flex-col gap-2 overflow-hidden\">{children}</div>\n </div>\n </div>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport { useAdapter } from \"../../layout/contexts/adapter-context\";\nimport {\n useCheckMembership,\n useCreateMembershipAgreement,\n useCreateMembership,\n} from \"@turtleclub/hooks\";\n\ninterface WidgetAuthState {\n address: string | undefined;\n isConnected: boolean;\n isMember: boolean | undefined;\n isLoading: boolean;\n error: string | null;\n currentChain: number | undefined;\n connect: () => void;\n disconnect: () => Promise<void>;\n changeNetwork: (network: number) => Promise<void>;\n}\n\n/**\n * Hook to orchestrate the membership flow for the widget.\n * When a wallet address changes, it:\n * 1. Checks if the user is already a member\n * 2. If not, creates a membership agreement (gets message and nonce)\n * 3. Signs the message using the adapter\n * 4. Creates the membership with the signature\n */\nexport const useWidgetAuth = (): WidgetAuthState => {\n const adapter = useAdapter();\n const previousAddressRef = useRef<string | undefined>(undefined);\n const isProcessingRef = useRef(false);\n\n // Check membership query - only enabled when user address exists\n const {\n data: membershipData,\n isLoading: isCheckingMembership,\n refetch: refetchMembership,\n } = useCheckMembership({\n params: {\n address: adapter.user || \"\",\n walletEcosystem: \"evm\",\n },\n enabled: !!adapter.user,\n });\n\n // Create agreement mutation\n const {\n mutateAsync: createAgreement,\n isPending: isCreatingAgreement,\n error: agreementError,\n } = useCreateMembershipAgreement();\n\n // Create membership mutation\n const {\n mutateAsync: createMembership,\n isPending: isCreatingMembership,\n error: membershipError,\n } = useCreateMembership();\n\n // Watch for any address changes - only when wallet is connected\n useEffect(() => {\n const currentAddress = adapter.user;\n\n // Only proceed if wallet is connected (address exists)\n if (!currentAddress) {\n // Reset when wallet disconnects\n if (previousAddressRef.current !== undefined) {\n previousAddressRef.current = undefined;\n }\n return;\n }\n\n // If address changed to a new value (including from one address to another)\n if (currentAddress !== previousAddressRef.current) {\n previousAddressRef.current = currentAddress;\n handleMembershipFlow(currentAddress);\n }\n }, [adapter.user]);\n\n const handleMembershipFlow = async (address: string) => {\n if (isProcessingRef.current) return;\n isProcessingRef.current = true;\n\n try {\n // Step 1: Check membership\n const { data: checkResult } = await refetchMembership();\n\n if (checkResult?.isMember) {\n console.log(\"[useWidgetAuth] User is already a member\");\n return;\n }\n\n console.log(\"[useWidgetAuth] User is not a member, starting membership flow...\");\n\n // Step 2: Create agreement to get message and nonce\n console.log(\"[useWidgetAuth] Creating membership agreement...\");\n const agreementResult = await createAgreement({\n address,\n walletEcosystem: \"evm\",\n url: window.location.href,\n chainId: String(adapter.network || 1),\n });\n\n // Step 3: Sign the message using the adapter\n console.log(\"[useWidgetAuth] Requesting signature from wallet...\");\n const signature = await adapter.signMessage(agreementResult.message);\n\n // Step 4: Create membership with signature\n console.log(\"[useWidgetAuth] Creating membership with signature...\");\n const membershipResult = await createMembership({\n address,\n walletEcosystem: \"evm\",\n signature,\n nonce: agreementResult.nonce,\n });\n\n if (membershipResult.isMember) {\n console.log(\"[useWidgetAuth] Membership created successfully!\");\n } else {\n console.error(\"[useWidgetAuth] Failed to create membership:\", membershipResult.error);\n }\n } catch (error) {\n console.error(\"[useWidgetAuth] Membership flow error:\", error);\n } finally {\n isProcessingRef.current = false;\n }\n };\n\n const isLoading = isCheckingMembership || isCreatingAgreement || isCreatingMembership;\n const error = agreementError?.message || membershipError?.message || null;\n\n return {\n address: adapter.user,\n isConnected: Boolean(adapter.user),\n isMember: membershipData?.isMember,\n currentChain: adapter.network,\n connect: adapter.openConnectionModal,\n disconnect: adapter.disconnect,\n changeNetwork: adapter.changeNetwork,\n isLoading,\n error,\n };\n};\n","\"use client\";\n\nimport { useState, useCallback } from \"react\";\nimport type { TabEnum } from \"../types/navigation\";\n\nexport interface UseWidgetTabsReturn {\n /** Current active tab */\n currentTab: TabEnum;\n /** Set the active tab */\n setTab: (tab: TabEnum) => void;\n}\n\nexport function useWidgetTabs(defaultTab: TabEnum): UseWidgetTabsReturn {\n const [currentTab, setCurrentTab] = useState<TabEnum>(defaultTab);\n\n const setTab = useCallback((tab: TabEnum) => {\n setCurrentTab(tab);\n }, []);\n\n return {\n currentTab,\n setTab,\n };\n}\n","\"use client\";\n\nimport { useAtom } from \"jotai\";\nimport { atom } from \"jotai\";\nimport { useCallback } from \"react\";\nimport { OverlayEnum, type OverlayData } from \"../types/navigation\";\n\ninterface OverlayState {\n id: OverlayEnum;\n data?: OverlayData;\n}\n\n// Jotai atom to store the overlay state\nconst overlayAtom = atom<OverlayState>({\n id: OverlayEnum.NONE,\n});\n\nexport interface UseWidgetOverlayReturn {\n currentOverlay: OverlayEnum;\n overlayData?: OverlayData;\n isOverlayOpen: boolean;\n openOverlay: (overlayId: OverlayEnum, data?: OverlayData) => void;\n closeOverlay: () => void;\n}\n\nexport function useWidgetOverlay(): UseWidgetOverlayReturn {\n const [overlayState, setOverlayState] = useAtom(overlayAtom);\n\n const openOverlay = useCallback(\n (overlayId: OverlayEnum, data?: OverlayData) => {\n setOverlayState({ id: overlayId, data });\n },\n [setOverlayState]\n );\n\n const closeOverlay = useCallback(() => {\n setOverlayState({ id: OverlayEnum.NONE });\n }, [setOverlayState]);\n\n return {\n currentOverlay: overlayState.id,\n overlayData: overlayState.data,\n isOverlayOpen: overlayState.id !== OverlayEnum.NONE,\n openOverlay,\n closeOverlay,\n };\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { SegmentControl } from \"@turtleclub/ui\";\nimport { WidgetContainer } from \"../../layout\";\nimport { useWidgetStyles } from \"../../layout/hooks/useWidgetStyles\";\nimport { useWidgetTabs } from \"../hooks/use-widget-tabs\";\nimport { useWidgetOverlay } from \"../hooks/use-widget-overlay\";\nimport {\n type TabsConfig,\n type OverlaysConfig,\n type TabConfig,\n type TabEnum,\n OverlayEnum,\n} from \"../types/navigation\";\n\nexport interface NavigationRootProps {\n tabs: TabsConfig;\n overlays: OverlaysConfig;\n defaultTab: TabEnum;\n}\n\nconst DISABLE_SEGMENT_CONTROL = true;\n\nexport function NavigationRoot({ tabs, overlays, defaultTab }: NavigationRootProps) {\n const { showNavigation } = useWidgetStyles();\n const { currentTab, setTab } = useWidgetTabs(defaultTab);\n const { currentOverlay, overlayData, closeOverlay } = useWidgetOverlay();\n\n // Convert Record to array for SegmentControl\n const tabButtons = useMemo(() => {\n return (Object.entries(tabs) as Array<[TabEnum, TabConfig]>)\n .filter(([_, config]) => config.visible !== false)\n .map(([id, config]) => ({\n value: id,\n label: config.label,\n }));\n }, [tabs]);\n\n const ActiveTab = useMemo(() => {\n return tabs[currentTab].component;\n }, [currentTab, tabs]);\n\n const ActiveOverlay = useMemo(() => {\n if (currentOverlay === OverlayEnum.NONE) return null;\n return overlays[currentOverlay].component;\n }, [currentOverlay, overlays]);\n\n const handleTabChange = (value: string) => {\n setTab(value as TabEnum);\n closeOverlay();\n };\n\n return (\n <>\n {/* Tab Navigation */}\n {showNavigation && !DISABLE_SEGMENT_CONTROL && (\n <SegmentControl\n cursorPointer\n variant=\"pill\"\n value={currentTab}\n onChange={handleTabChange}\n items={tabButtons}\n className=\"!bg-background\"\n />\n )}\n\n {/* Content area - Single WidgetContainer */}\n <div className=\"flex-1 min-h-0 overflow-hidden flex flex-col gap-2 bg-transparent\">\n <WidgetContainer\n variant=\"border\"\n className=\"flex-1 min-h-0 w-full flex flex-col overflow-hidden\"\n >\n <div className=\"flex-1 min-h-0 overflow-hidden\">\n {ActiveOverlay ? <ActiveOverlay data={overlayData} /> : <ActiveTab />}\n </div>\n </WidgetContainer>\n </div>\n </>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { ChevronLeft } from \"lucide-react\";\nimport { Button } from \"@turtleclub/ui\";\nimport { useWidgetOverlay } from \"../hooks/use-widget-overlay\";\n\nexport interface OverlayLayoutProps {\n children: React.ReactNode;\n onBack?: () => void;\n className?: string;\n}\n\nexport function OverlayLayout({ onBack, children, className }: OverlayLayoutProps) {\n const { closeOverlay } = useWidgetOverlay();\n return (\n <div className={`flex flex-col h-full ${className || \"\"}`}>\n {/* Header with back button */}\n <div className=\"flex items-center gap-2 pb-3\">\n <Button\n variant=\"green\"\n border=\"interactive\"\n size=\"icon\"\n onClick={onBack ?? closeOverlay}\n className=\"h-8 w-8 shrink-0\"\n aria-label=\"Go back\"\n >\n <ChevronLeft className=\"h-5 w-5\" />\n </Button>\n </div>\n\n {/* Overlay content */}\n <div className=\"flex-1 min-h-0 overflow-auto pt-4\">{children}</div>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport type { Incentive } from \"@turtleclub/hooks\";\n\nexport const getTotalYield = (incentives: Incentive[]) =>\n incentives\n .filter((i) => i.rewardType !== \"points\")\n .reduce((acc, incentive) => acc + (incentive.yield ?? 0), 0);\n\nexport const useTotalYield = (incentives: Incentive[]) => {\n const totalYield = useMemo(() => getTotalYield(incentives), [incentives]);\n return { totalYield };\n};\n","import { TurtleTooltip, cn } from \"@turtleclub/ui\";\nimport { InfoIcon } from \"lucide-react\";\nimport { useMemo } from \"react\";\nimport type { Incentive } from \"@turtleclub/hooks\";\nimport { formatNumber } from \"@turtleclub/utils\";\nimport { useTotalYield } from \"../hooks/useTotalYield\";\n\nexport function APRBreakdownTooltip({\n incentives,\n isPill,\n className,\n}: {\n incentives: Incentive[];\n isPill?: boolean;\n className?: string;\n}) {\n const { totalYield } = useTotalYield(incentives);\n\n const sortedIncentives = useMemo(() => {\n return incentives\n .filter(\n (incentive): incentive is Incentive & { yield: number } =>\n incentive.rewardType !== \"points\" &&\n incentive.yield !== null &&\n incentive.yield !== undefined\n )\n .sort((a, b) => b.yield - a.yield);\n }, [incentives]);\n\n return (\n <TurtleTooltip\n trigger={\n <div\n className={cn(\n \"group flex items-center gap-1\",\n className,\n isPill &&\n \"hover:bg-neutral-alpha-5 border-border bg-neutral-alpha-2 hover:border-gradient-white rounded-full border px-3 py-1.5 text-xs\"\n )}\n >\n {formatNumber(totalYield, 1, false, false)}%{\" \"}\n <InfoIcon className=\"text-primary/70 group-hover:text-primary size-2.5\" />\n </div>\n }\n content={\n <div>\n <div className=\"text-sm\">APR Breakdown</div>\n <div>\n {sortedIncentives.map((incentive) => (\n <div key={incentive.id} className=\"my-1 flex justify-between gap-2 text-xs\">\n <div className=\"flex items-center gap-1\">\n {incentive.iconUrl && (\n <img\n src={incentive.iconUrl}\n alt={incentive.name || incentive.id}\n className=\"size-4 rounded-full\"\n loading=\"lazy\"\n />\n )}\n <div>{incentive.name}</div>\n </div>\n <div>{formatNumber(incentive.yield, 1, false, false)}%</div>\n </div>\n ))}\n </div>\n <div className=\"text-primary flex justify-between gap-2 text-sm\">\n <span>Total</span>\n <span>{formatNumber(totalYield, 1, false, false)}%</span>\n </div>\n </div>\n }\n side=\"bottom\"\n contentClassName=\"p-5 backdrop-blur-xl\"\n />\n );\n}\n","import { Chain } from \"@turtleclub/hooks\";\nimport { cn } from \"@turtleclub/ui\";\nimport { getNetworkBackgroundColor, getNetworkById } from \"@turtleclub/utils\";\n\ninterface ChainProps {\n chain: Chain;\n className?: string;\n triggerClassName?: string;\n}\n\nexport function Chain({ chain, triggerClassName }: ChainProps) {\n const network = getNetworkById(chain.slug);\n return (\n <div\n className={cn(\n \"bg-foreground -mr-1 flex size-5 items-center justify-center overflow-hidden rounded-full ring-1 ring-white last:mr-0 lg:-mr-4 lg:size-6\",\n getNetworkBackgroundColor(network),\n triggerClassName\n )}\n >\n <img\n src={chain.logoUrl}\n className=\"size-5 rounded-full object-contain lg:size-6\"\n alt={chain.name}\n />\n </div>\n );\n}\n","import { atom } from \"jotai\";\nimport type { Opportunity } from \"@turtleclub/hooks\";\n\n// TODO!: Also delete this after position api implementation\nimport type { DepositToken } from \"@/features/overlays/components/balances-overlay\";\nimport { parseUnits } from \"viem\";\nimport { SLIPPAGE_DEFAULT } from \"../features/opportunities/constants\";\n\n// Atoms atómicos (primitivos)\nexport const selectedOpportunityAtom = atom<Opportunity | null>(null);\nexport const tokenInAmountAtom = atom<string | null>(null);\nexport const slippageAtom = atom<number>(SLIPPAGE_DEFAULT);\n\n// TODO: Change type to portfolio api type.\nexport const selectedTokenAtom = atom<DepositToken | null>(null);\n\n// Derived atom (computed)\nexport const depositFormAtom = atom((get) => {\n const opportunity = get(selectedOpportunityAtom);\n const token = get(selectedTokenAtom);\n const amount = get(tokenInAmountAtom);\n const slippage = get(slippageAtom);\n\n const amountGreaterThanZero = Boolean(amount && Number.parseFloat(amount) > 0);\n const isValid = !!opportunity && !!token && amountGreaterThanZero && !!slippage;\n\n const options = isValid\n ? {\n chain: Number(opportunity?.receiptToken?.chain.chainId) ?? 1,\n token_in: token?.address ?? \"\",\n token_out: opportunity?.receiptToken?.address ?? \"\",\n amount: parseUnits(amount ?? \"0\", token?.decimals ?? 18).toString(),\n slippage,\n }\n : undefined;\n\n return {\n opportunity,\n token,\n amount,\n options,\n isValid,\n };\n});\n","import { useCallback, useEffect } from \"react\";\nimport { useAtom, useAtomValue } from \"jotai\";\nimport {\n selectedOpportunityAtom,\n depositFormAtom,\n selectedTokenAtom,\n tokenInAmountAtom,\n slippageAtom,\n} from \"../state/deposit-atoms\";\nimport { SLIPPAGE_DEFAULT } from \"../features/opportunities/constants\";\n\n\nexport function useDepositForm() {\n const [opportunity, setOpportunity] = useAtom(selectedOpportunityAtom);\n const [token, setToken] = useAtom(selectedTokenAtom);\n const [amount, setAmount] = useAtom(tokenInAmountAtom);\n const [slippage, setSlippage] = useAtom(slippageAtom);\n\n const formState = useAtomValue(depositFormAtom);\n\n const reset = useCallback(() => {\n setOpportunity(null);\n setToken(null);\n setAmount(null);\n setSlippage(SLIPPAGE_DEFAULT);\n }, [setOpportunity, setToken, setAmount]);\n\n // Reset on token change\n useEffect(() => {\n setAmount(\"\");\n setSlippage(SLIPPAGE_DEFAULT);\n }, [token]);\n\n return {\n opportunity,\n token,\n amount,\n slippage,\n isValid: formState.isValid,\n options: formState.options,\n selectOpportunity: setOpportunity,\n selectToken: setToken,\n setAmount,\n setSlippage,\n reset,\n };\n}\n","import type { Opportunity } from \"@turtleclub/hooks\";\nimport { APIStatus, DataTable } from \"@turtleclub/ui\";\nimport type { ColumnDef } from \"@tanstack/react-table\";\nimport { formatCurrency } from \"@turtleclub/utils\";\nimport { getTotalYield } from \"../hooks/useTotalYield\";\nimport { APRBreakdownTooltip } from \"./apr-breakdown-tooltip\";\nimport { Chain } from \"./chain-list\";\nimport { useDepositForm } from \"../../../../hooks/useDepositForm\";\nimport { useWidgetOverlay } from \"../../../navigation\";\nimport { useAdapter } from \"@/features/layout/contexts/adapter-context\";\n\ninterface OpportunitiesTableProps {\n opportunities: Opportunity[];\n}\n\nexport function OpportunitiesTable({ opportunities }: OpportunitiesTableProps) {\n const { changeNetwork, network } = useAdapter();\n const { selectOpportunity, selectToken } = useDepositForm();\n const { closeOverlay } = useWidgetOverlay();\n\n const handleSelectOpportunity = (opportunity: Opportunity) => {\n selectOpportunity(opportunity);\n const opportunityChainId = Number(opportunity.token.chain.chainId);\n if (opportunityChainId !== network) {\n changeNetwork(opportunityChainId);\n // Reset token to trigger auto-selection of first token in new chain\n selectToken(null);\n }\n closeOverlay();\n };\n\n const columns: ColumnDef<Opportunity>[] = [\n {\n accessorKey: \"name\",\n header: () => <div>Opportunity</div>,\n cell: ({ row }) => (\n <div className=\"flex items-center gap-2 px-1\">\n <APIStatus warning={false} />\n <img src={row.original.token.logoUrl} className=\"size-6 rounded-full\" loading=\"lazy\" />\n {row.original.name || row.original.token.name}\n </div>\n ),\n enableSorting: true,\n },\n {\n accessorKey: \"chain\",\n header: () => <div className=\"flex w-full justify-end\">Chain</div>,\n cell: ({ row }) => <Chain chain={row.original.token.chain} />,\n },\n {\n id: \"organization\",\n accessorFn: (row) => (row.products.length ? row.products[0].organization.name : \"-\"),\n header: () => <div>Partner</div>,\n cell: ({ row }) =>\n row.original.products.length ? (\n <div className=\"flex items-center gap-2\">\n <img\n src={row.original.products[0].organization.iconUrl || \"\"}\n className=\"size-6 rounded-full\"\n loading=\"lazy\"\n />\n {row.original.products[0].organization.name}\n </div>\n ) : (\n \"-\"\n ),\n enableSorting: true,\n },\n {\n accessorKey: \"tvl\",\n header: () => <div className=\"flex w-full justify-end\">TVL</div>,\n cell: ({ row }) => (\n <div className=\"text-end\">{formatCurrency(row.original.tvl, 0, true)}</div>\n ),\n enableSorting: true,\n },\n {\n accessorKey: \"totalYield\",\n header: () => <div className=\"flex w-full justify-end\">Estimated APR</div>,\n cell: ({ row }) => (\n <div className=\"flex flex-row-reverse\">\n <APRBreakdownTooltip incentives={row.original.incentives} />\n </div>\n ),\n enableSorting: true,\n sortingFn: (rowA, rowB) => {\n const a = getTotalYield(rowA.original.incentives);\n const b = getTotalYield(rowB.original.incentives);\n return a - b;\n },\n },\n ];\n\n return (\n <DataTable\n columns={columns}\n onRowClick={handleSelectOpportunity}\n data={opportunities}\n enableSearch\n grid={{\n displayAsGrid: true,\n headerSlot: \"name\",\n rightSlot: \"totalYield\",\n excludeColumns: [],\n className: \"grid-cols-1 gap-2.5\",\n }}\n />\n );\n}\n","import { OverlayLayout } from \"../../navigation\";\nimport { useWidgetOpportunities } from \"@turtleclub/hooks\";\nimport { OpportunitiesTable } from \"../../opportunities\";\nimport { useDistributorId } from \"@/features/layout/contexts/adapter-context\";\n\nexport function OpportunityOverlay() {\n const distributorId = useDistributorId();\n const { data, isLoading, error } = useWidgetOpportunities(distributorId);\n\n if (isLoading) return <div>Loading...</div>;\n if (error) return <div>Error: {error.message}</div>;\n if (data === undefined) return <div>No data</div>;\n if (data.opportunities && data.opportunities.length === 0) return <div>No opportunities</div>;\n\n return (\n <OverlayLayout>\n <OpportunitiesTable opportunities={data.opportunities || []} />\n </OverlayLayout>\n );\n}\n","import { OverlayEnum, useWidgetOverlay } from \"@/features/navigation\";\n\nexport const PositionsTab = () => {\n const { openOverlay } = useWidgetOverlay();\n\n return (\n <button\n onClick={() => {\n openOverlay(OverlayEnum.BALANCES);\n console.log(\"Positions Content Click\");\n }}\n >\n Positions Content Click\n </button>\n );\n};\n","export const DiscoverTab = () => <div>Discover Content</div>;\n","import { TxStatus } from \"@turtleclub/ui\";\nimport { useMemo } from \"react\";\nimport type { TransactionStep } from \"../types\";\nimport { formatNumber } from \"@turtleclub/utils\";\n\ninterface TransactionStatusSectionProps {\n steps: TransactionStep[];\n currentStep: TransactionStep;\n allCompleted: boolean;\n cancelled: boolean;\n tokenSymbol: string;\n amount: string;\n resetQueue: () => void;\n resetForm: () => 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 tokenSymbol,\n amount,\n resetQueue,\n resetForm,\n}: TransactionStatusSectionProps) {\n // For completed transactions, use the last completed transaction hash\n // For ongoing transactions, use the current step hash\n const lastCompletedStep = steps\n .filter((step) => step.status === \"completed\" && step.txHash)\n .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,\n onViewDetails: undefined, // Don't show View Details button for now\n onClose: () => {\n resetQueue();\n resetForm();\n },\n steps: steps.map((step) => ({\n label: step.label,\n completed: step.status === \"completed\",\n current: step.status === \"executing\",\n txHash: step.txHash,\n })),\n }),\n [steps, allCompleted, cancelled, tokenSymbol, amount, resetQueue, resetForm, displayTxHash]\n );\n\n return (\n <div className=\"h-full overflow-hidden\">\n <TxStatus {...txStatusProps} className=\"bg-background border-border text-foreground h-full\" />\n </div>\n );\n}\n","import type { RouterStep } from \"@turtleclub/hooks\";\nimport type { TransactionQueueState } from \"../types\";\n\n/**\n * Generate a user-friendly label for a transaction step\n * @param step - The router step from the API\n * @returns A formatted label string\n */\nexport function getStepLabel(step: RouterStep): string {\n if (step.kind === \"approve\" && step.token) {\n return `Approve ${step.token.symbol}`;\n }\n if (step.kind === \"enso\") {\n return `Execute Deposit`;\n }\n return `Execute ${step.kind}`;\n}\n\n/**\n * Generate a user-friendly description for a transaction step\n * @param step - The router step from the API\n * @param index - The step index in the queue\n * @returns A formatted description string\n */\nexport function getStepDescription(step: RouterStep, index: number): string {\n if (step.kind === \"approve\" && step.token) {\n return `Allow contract to spend ${step.token.symbol}`;\n }\n return `Transaction step ${index + 1}`;\n}\n\n/**\n * Check if an error is a user rejection (e.g., cancelled transaction in wallet)\n * @param error - The error to check\n * @returns True if the error indicates user rejection\n */\nexport function isUserRejection(error: Error | unknown): boolean {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const rejectionPatterns = [\n \"user rejected\",\n \"user denied\",\n \"user cancelled\",\n \"cancelled by user\",\n \"transaction rejected\",\n \"4001\", // MetaMask user rejection code\n ];\n\n return rejectionPatterns.some((pattern) =>\n errorMessage.toLowerCase().includes(pattern.toLowerCase())\n );\n}\n\n/**\n * Determine if the next transaction step should be auto-executed\n * This is used for multi-step transaction flows where steps need to be executed sequentially\n *\n * @param state - The current transaction queue state\n * @returns True if the next step should be automatically executed\n */\nexport function shouldAutoExecuteNextStep(state: TransactionQueueState): boolean {\n // No auto-execute for single step transactions\n if (state.steps.length <= 1 || state.queueStatus !== \"idle\") {\n return false;\n }\n\n const previousStep = state.steps[state.currentIndex - 1];\n const currentStep = state.steps[state.currentIndex];\n\n // Auto-execute if:\n // - We've already executed at least one transaction\n // - Previous step is completed\n // - Current step is pending\n // - There are more steps to execute\n return (\n state.currentIndex > 0 &&\n state.currentIndex < state.steps.length &&\n previousStep?.status === \"completed\" &&\n currentStep?.status === \"pending\"\n );\n}\n","import { useCallback, useEffect, useMemo, useReducer } from \"react\";\nimport type { EarnRouteResponse, RouterStep, StepTx } from \"@turtleclub/hooks\";\nimport {\n TransactionStep,\n TransactionQueueState,\n TransactionStepStatus,\n QueueStatus,\n} from \"../types\";\nimport { getStepLabel, getStepDescription, isUserRejection, shouldAutoExecuteNextStep } from \"../utils\";\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 conditions are met for auto-execution\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\n// Constants\nconst AUTO_EXECUTE_DELAY = 1000; // ms\n\ninterface UseTransactionQueueProps {\n earnRoute: EarnRouteResponse | null;\n userAddress?: string;\n chainId?: number;\n sendTransaction: (transaction: StepTx) => Promise<`0x${string}` | undefined>;\n onError?: (error: Error) => void;\n onSuccess?: () => void;\n}\n\n// Reducer action types\ntype QueueAction =\n | { type: \"INITIALIZE_QUEUE\"; steps: TransactionStep[] }\n | { type: \"START_EXECUTION\"; index: number }\n | { type: \"COMPLETE_STEP\"; index: number; txHash: string }\n | { type: \"FAIL_STEP\"; index: number; error: string; isCancellation: boolean }\n | { type: \"RESET_QUEUE\"; steps: TransactionStep[] };\n\n// Helper functions\nfunction createTransactionStep(step: RouterStep, index: number): TransactionStep | null {\n // Only process steps that have transaction data\n if (!step.tx) {\n return null;\n }\n\n const newStep: TransactionStep = {\n id: index,\n label: getStepLabel(step),\n description: getStepDescription(step, index),\n txData: step.tx,\n status: \"pending\",\n };\n return newStep;\n}\n\n// Reducer function\nfunction queueReducer(state: TransactionQueueState, action: QueueAction): TransactionQueueState {\n switch (action.type) {\n case \"INITIALIZE_QUEUE\":\n return {\n steps: action.steps,\n currentIndex: 0,\n queueStatus: \"idle\" satisfies QueueStatus,\n lastError: undefined,\n };\n\n case \"START_EXECUTION\":\n return {\n ...state,\n steps: state.steps.map((step, idx) => {\n if (idx === action.index) {\n const updatedStep: TransactionStep = { ...step, status: \"executing\" };\n return updatedStep;\n }\n return step;\n }),\n queueStatus: \"executing\" satisfies QueueStatus,\n lastError: undefined,\n };\n\n case \"COMPLETE_STEP\": {\n const updatedSteps = state.steps.map((step, idx) => {\n if (idx === action.index) {\n const completedStep: TransactionStep = { ...step, status: \"completed\", txHash: action.txHash };\n return completedStep;\n }\n return step;\n });\n const nextIndex = action.index + 1;\n const allCompleted = nextIndex >= updatedSteps.length;\n\n return {\n ...state,\n steps: updatedSteps,\n currentIndex: allCompleted ? state.currentIndex : nextIndex,\n queueStatus: (allCompleted ? \"completed\" : \"idle\") satisfies QueueStatus,\n };\n }\n\n case \"FAIL_STEP\":\n return {\n ...state,\n steps: state.steps.map((step, idx) => {\n if (idx === action.index) {\n const failedStep: TransactionStep = { ...step, status: \"failed\", error: action.error };\n return failedStep;\n }\n return step;\n }),\n queueStatus: (action.isCancellation ? \"cancelled\" : \"error\") satisfies QueueStatus,\n lastError: action.error,\n };\n\n case \"RESET_QUEUE\":\n return {\n steps: action.steps,\n currentIndex: 0,\n queueStatus: \"idle\" satisfies QueueStatus,\n lastError: undefined,\n };\n\n default:\n return state;\n }\n}\n\nexport function useTransactionQueue({\n earnRoute,\n userAddress,\n chainId,\n sendTransaction,\n onError = () => {},\n onSuccess = () => {},\n}: UseTransactionQueueProps) {\n // Initialize state with reducer\n const initialState: TransactionQueueState = {\n steps: [],\n currentIndex: 0,\n queueStatus: \"idle\",\n };\n const [state, dispatch] = useReducer(queueReducer, initialState);\n\n // Initialize queue when earnRoute changes\n useEffect(() => {\n if (!earnRoute?.steps?.length) {\n dispatch({ type: \"INITIALIZE_QUEUE\", steps: [] });\n return;\n }\n\n const steps = earnRoute.steps\n .map((step: RouterStep, index: number) => createTransactionStep(step, index))\n .filter((step): step is TransactionStep => step !== null);\n\n dispatch({ type: \"INITIALIZE_QUEUE\", steps });\n }, [earnRoute]);\n\n // Execute current transaction\n const executeCurrentTransaction = useCallback(async () => {\n // Validation checks\n if (!userAddress || !chainId || !sendTransaction || state.queueStatus === \"executing\") {\n return;\n }\n\n const currentStep = state.steps[state.currentIndex];\n if (!currentStep || (currentStep.status !== \"pending\" && currentStep.status !== \"failed\")) {\n return;\n }\n\n // Security validation: verify transaction 'from' matches connected wallet\n const txFrom = currentStep.txData.from as `0x${string}`;\n if (txFrom.toLowerCase() !== userAddress.toLowerCase()) {\n const error = new Error(\"Transaction 'from' address doesn't match connected wallet\");\n dispatch({\n type: \"FAIL_STEP\",\n index: state.currentIndex,\n error: error.message,\n isCancellation: false,\n });\n if (onError) {\n onError(error);\n }\n return;\n }\n\n // Start execution\n dispatch({ type: \"START_EXECUTION\", index: state.currentIndex });\n\n try {\n // Send transaction with chainId\n const txHash = await sendTransaction({\n ...currentStep.txData,\n chainId,\n });\n\n // Transaction is already confirmed at this point because executeTransaction waits for confirmation\n // Mark as completed\n dispatch({ type: \"COMPLETE_STEP\", index: state.currentIndex, txHash: txHash ?? \"\" });\n\n // Check if all completed and trigger success callback\n const isLastStep = state.currentIndex + 1 >= state.steps.length;\n if (isLastStep && onSuccess) {\n onSuccess();\n }\n } catch (error) {\n // Handle error\n const errorMessage = error instanceof Error ? error.message : \"Transaction failed\";\n const isCancellation = isUserRejection(error);\n\n dispatch({\n type: \"FAIL_STEP\",\n index: state.currentIndex,\n error: isCancellation ? \"Transaction cancelled by user\" : errorMessage,\n isCancellation,\n });\n\n // Call error callback if not a cancellation\n if (!isCancellation && onError) {\n onError(error instanceof Error ? error : new Error(errorMessage));\n }\n }\n }, [\n userAddress,\n chainId,\n sendTransaction,\n state.queueStatus,\n state.steps,\n state.currentIndex,\n onSuccess,\n onError,\n ]);\n\n // Reset queue to initial state\n const resetQueue = useCallback(() => {\n if (!earnRoute?.steps?.length) {\n return;\n }\n\n const steps = earnRoute.steps\n .map((step: RouterStep, index: number) => createTransactionStep(step, index))\n .filter((step): step is TransactionStep => step !== null);\n\n dispatch({ type: \"RESET_QUEUE\", steps });\n }, [earnRoute]);\n\n // Computed values\n const currentStep = state.steps[state.currentIndex] || null;\n const isExecuting = state.queueStatus === \"executing\";\n const allCompleted = state.queueStatus === \"completed\";\n const hasError = state.queueStatus === \"error\";\n const cancelled = state.queueStatus === \"cancelled\";\n const completedSteps = state.steps.filter((step) => step.status === \"completed\").length;\n const totalSteps = state.steps.length;\n const progress = totalSteps > 0 ? (completedSteps / totalSteps) * 100 : 0;\n\n const showTxStatus = useMemo(() => {\n if (!currentStep) return false;\n if (allCompleted) return true;\n if (isExecuting && currentStep.id === 0) return true;\n if (currentStep.id > 0) return true;\n return false;\n }, [currentStep, allCompleted, isExecuting]);\n\n // Check if ready to execute\n const canExecute = !!(\n userAddress &&\n chainId &&\n state.steps.length > 0 &&\n state.queueStatus !== \"executing\" &&\n state.queueStatus !== \"completed\"\n );\n\n // Auto-execute next transaction when current one completes (only for multi-step transactions)\n useEffect(() => {\n if (shouldAutoExecuteNextStep(state)) {\n // Delay execution to allow UI to update\n const timer = setTimeout(() => {\n executeCurrentTransaction();\n }, AUTO_EXECUTE_DELAY);\n\n // Cleanup timeout on unmount or dependency change\n return () => clearTimeout(timer);\n }\n }, [state, executeCurrentTransaction]);\n\n // Return value maintaining the same signature\n return {\n steps: state.steps.map((step, index) => ({\n ...step,\n completed: step.status === \"completed\",\n current: index === state.currentIndex,\n })),\n currentIndex: state.currentIndex,\n isExecuting,\n allCompleted,\n hasError,\n cancelled,\n error: state.lastError,\n currentStep: currentStep\n ? {\n ...currentStep,\n completed: currentStep.status === \"completed\",\n current: true,\n }\n : null,\n canExecute,\n executeCurrentTransaction,\n resetQueue,\n totalSteps,\n completedSteps,\n progress,\n showTxStatus,\n };\n}\n","import {\n EarnRouteResponse,\n Opportunity,\n RouterStep,\n RouterSubstep,\n RouteToken,\n} from \"@turtleclub/hooks\";\nimport { TokenStep } from \"@turtleclub/ui\";\nimport { formatToken } from \"@turtleclub/utils\";\nimport { mainnet } from \"viem/chains\";\n\nconst parseEnsoStep = (\n kind: \"swap\" | \"deposit\",\n fromToken: RouteToken,\n toToken: RouteToken\n): TokenStep => {\n return {\n in: {\n icon: fromToken.logos[0],\n symbol: fromToken.symbol,\n },\n out: {\n icon: toToken.logos[0],\n symbol: toToken.symbol,\n },\n amount: undefined,\n type: kind,\n };\n};\n\nconst parseApproveStep = (token: RouteToken, amount: string): TokenStep => {\n return {\n in: {\n icon: token.logos[0],\n symbol: token.symbol,\n },\n out: null,\n amount: formatToken(amount, { decimals: token.decimals }, true, false, 4),\n type: \"approve\",\n };\n};\n\n// Process the route steps to extract token flow for RouteDetails component\nexport function processRouteDetails(data: EarnRouteResponse | null): TokenStep[] {\n if (!data) return [];\n\n const tokens: TokenStep[] = [];\n data.steps.forEach((step: 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: 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\nexport function getOpportunityTokenDetails(opportunity: Opportunity): {\n chainId: number;\n address: string;\n symbol: string;\n decimals: number;\n} {\n return {\n chainId: Number(opportunity.receiptToken?.chain.chainId) ?? mainnet.id,\n address: opportunity.receiptToken?.address ?? \"\",\n symbol: opportunity.receiptToken?.symbol ?? \"\",\n decimals: opportunity.receiptToken?.decimals ?? 18,\n };\n}\n","import { EarnRouteParams, useEarnRoute } from \"@turtleclub/hooks\";\nimport { useMemo } from \"react\";\nimport { processRouteDetails } from \"../utils\";\n\n// Simplified options type to inject context data from outside\nexport type UseSwapRouteProps = Omit<\n EarnRouteParams,\n \"user\" | \"id\" | \"distributor_id\" | \"referral_code\"\n>;\n\nexport function useSwapRoute(\n isEnabled: boolean,\n userAddress: string,\n distributorId: string,\n options: UseSwapRouteProps | undefined,\n referralCode?: string\n) {\n const params: EarnRouteParams | undefined = useMemo(() => {\n if (!options || !isEnabled) return undefined;\n\n return {\n ...options,\n user: userAddress,\n distributor_id: distributorId,\n referral_code: referralCode,\n };\n }, [options, userAddress, distributorId, referralCode]);\n\n // Validate required parameters\n const hasRequiredParams = useMemo(() => {\n return !!(\n userAddress &&\n params?.token_in &&\n params?.token_out &&\n params?.amount &&\n params?.chain &&\n params?.slippage &&\n params?.distributor_id\n );\n }, [options]);\n\n // Get the route\n const { data, isLoading, error } = useEarnRoute({\n params,\n enabled: hasRequiredParams && isEnabled,\n });\n\n // Parse route details\n const routeDetails = useMemo(() => processRouteDetails(data ?? null), [data]);\n\n return {\n fetchedRoute: data ?? null,\n outputAmount: data?.amount_out ?? undefined,\n isReady: hasRequiredParams && data && !isLoading,\n hasRequiredParams,\n routeDetails,\n routeError: error,\n isLoadingRoute: isLoading,\n };\n}\n","import { Button } from \"@turtleclub/ui\";\nimport { useCallback, useMemo } from \"react\";\nimport type { EarnRouteResponse } from \"@turtleclub/hooks\";\n\ninterface ConfirmButtonProps {\n fetchedRoute: EarnRouteResponse | null;\n routeError: Error | null;\n isLoadingRoute: boolean;\n canExecute: boolean;\n isExecuting: boolean;\n hasError: boolean;\n cancelled: boolean;\n executeCurrentTransaction: () => Promise<void>;\n totalSteps: number;\n completedSteps: number;\n showingTransactionStatus: boolean;\n hasInsufficientBalance: boolean;\n}\n\ninterface ButtonState {\n text: string;\n disabled: boolean;\n onClick?: () => Promise<void>;\n className?: string;\n}\n\n// Simple Confirm Button - Only handles button logic, no TxStatus\nexport function ConfirmButton({\n fetchedRoute,\n routeError,\n isLoadingRoute,\n canExecute,\n isExecuting,\n hasError,\n cancelled,\n executeCurrentTransaction,\n totalSteps,\n completedSteps,\n showingTransactionStatus,\n hasInsufficientBalance,\n}: ConfirmButtonProps) {\n const handleConfirm = useCallback(async (): Promise<void> => {\n if (!canExecute) return;\n await executeCurrentTransaction();\n }, [canExecute, executeCurrentTransaction]);\n\n // Calculate button state based on all conditions\n const buttonState = useMemo<ButtonState | null>(() => {\n // Don't render button if showing transaction status\n if (showingTransactionStatus) {\n return null;\n }\n\n // Loading state\n if (isLoadingRoute) {\n return { text: \"Loading route...\", disabled: true, className: \"cursor-not-allowed\" };\n }\n\n // Error state\n if (routeError) {\n return { text: \"Route Error\", disabled: true, className: \"cursor-not-allowed\" };\n }\n\n // No route available\n if (!fetchedRoute || !fetchedRoute.steps || fetchedRoute.steps.length === 0) {\n return { text: \"Enter amount to continue\", disabled: true, className: \"cursor-not-allowed\" };\n }\n\n // Insufficient balance\n if (hasInsufficientBalance) {\n return { text: \"Insufficient Balance\", disabled: true, className: \"cursor-not-allowed\" };\n }\n\n // Execution states\n if (isExecuting) {\n return { text: \"Executing...\", disabled: true, className: \"cursor-not-allowed\" };\n }\n\n if (hasError) {\n return {\n text: \"Retry Transaction\",\n disabled: !canExecute,\n onClick: handleConfirm,\n className: \"cursor-pointer\",\n };\n }\n\n if (cancelled) {\n return {\n text: \"Try Again\",\n disabled: !canExecute,\n onClick: handleConfirm,\n className: \"cursor-pointer\",\n };\n }\n\n // Default confirm state\n const text =\n totalSteps > 1 && completedSteps !== totalSteps\n ? `Confirm Transaction (${completedSteps}/${totalSteps})`\n : \"Confirm Transaction\";\n\n return { text, disabled: false, onClick: handleConfirm, className: \"cursor-pointer\" };\n }, [\n showingTransactionStatus,\n isLoadingRoute,\n routeError,\n fetchedRoute,\n hasInsufficientBalance,\n isExecuting,\n hasError,\n cancelled,\n canExecute,\n totalSteps,\n completedSteps,\n handleConfirm,\n ]);\n\n // Don't render if buttonState is null\n if (!buttonState) {\n return null;\n }\n\n return (\n <Button\n border=\"plain\"\n onClick={() => buttonState.onClick?.()}\n disabled={buttonState.disabled}\n className={buttonState.className + \" w-full\"}\n >\n {buttonState.text}\n </Button>\n );\n}\n","import { RouteDetails, SwapDetails, SwapInput } from \"@turtleclub/ui\";\nimport { useCallback, useMemo } from \"react\";\nimport { useTokenBalance } from \"@turtleclub/hooks\";\nimport { cn } from \"@turtleclub/ui\";\nimport { formatNumber, formatToken } from \"@turtleclub/utils\";\nimport { TransactionStatusSection, useTransactionQueue } from \"../../transaction-status\";\nimport type { Opportunity, StepTx } from \"@turtleclub/hooks\";\nimport { useDepositForm } from \"@/hooks/useDepositForm\";\nimport { useSwapRoute } from \"../hooks/useSwapRoute\";\nimport { useWidgetOverlay, OverlayEnum } from \"../../../navigation\";\nimport { ConfirmButton } from \"./confirm-button\";\nimport { getOpportunityTokenDetails } from \"../utils\";\nimport type { Transaction as AdapterTransaction } from \"@/features/layout/types/adapter\";\n\nexport function DepositSection({\n opportunity,\n address,\n distributorId,\n executeTransaction,\n stickyButton = false,\n}: {\n opportunity: Opportunity;\n address: string;\n distributorId: string;\n executeTransaction: (transaction: AdapterTransaction) => Promise<string | undefined>;\n stickyButton?: boolean;\n}) {\n const { openOverlay } = useWidgetOverlay();\n const { chainId, symbol, decimals } = useMemo(\n () => getOpportunityTokenDetails(opportunity),\n [opportunity]\n );\n\n const { setAmount, setSlippage, token, amount, slippage, options, isValid } = useDepositForm();\n\n // Use shared hook for balance logic\n const { usdValue, hasInsufficientBalance, handleMaxClick } = useTokenBalance({\n token,\n amount: amount ?? undefined,\n setAmount: (amount) => setAmount(amount ?? null),\n });\n\n const { routeDetails, isReady, outputAmount, fetchedRoute, routeError, isLoadingRoute } =\n useSwapRoute(isValid, address, distributorId, options);\n\n // Transaction queue logic\n const sendTransaction = useCallback(\n async (transaction: StepTx) => {\n const adapterTx: AdapterTransaction = {\n from: transaction.from,\n to: transaction.to,\n data: transaction.data,\n value: BigInt(transaction.value),\n chainId: chainId ?? 1,\n };\n return await executeTransaction(adapterTx);\n },\n [executeTransaction, chainId]\n );\n\n const {\n steps,\n currentStep,\n canExecute,\n isExecuting,\n allCompleted,\n hasError,\n cancelled,\n executeCurrentTransaction,\n resetQueue,\n totalSteps,\n completedSteps,\n showTxStatus,\n } = useTransactionQueue({\n earnRoute: fetchedRoute,\n userAddress: address,\n chainId,\n sendTransaction,\n });\n\n // Swap details\n const swapDetailsProps = useMemo(() => {\n const formattedAmount = amount ? formatNumber(amount, 6, true, false) : \"0\";\n const formattedAmountToReceive =\n outputAmount && decimals\n ? formatToken(outputAmount, { decimals: decimals }, true, false, 6)\n : \"0\";\n\n return {\n deposit: amount ? `${formattedAmount} ${token?.symbol || \"ETH\"}` : \"0 ETH\",\n receive:\n outputAmount && decimals ? `${formattedAmountToReceive} ${symbol || \"ETH\"}` : \"0 ETH\",\n equivalentInUsd:\n amount && token?.price ? (Number.parseFloat(amount) * token.price).toFixed(2) : \"0.00\",\n defaultOpen: true,\n slippage,\n setSlippage,\n };\n }, [amount, outputAmount, decimals, symbol, token, slippage]);\n\n return (\n <div\n className={cn(\n \"grid gap-3 flex-1 min-h-0\",\n stickyButton ? \"grid-rows-[auto_1fr_auto] pb-6\" : \"grid-rows-[auto_1fr]\"\n )}\n >\n {/* Row 1: Input (auto height) */}\n <SwapInput\n tokens={[]}\n useCustomTokenSelector\n selectedTokenData={token}\n onCustomTokenSelectorClick={() => openOverlay(OverlayEnum.BALANCES)}\n value={amount ?? undefined}\n onChange={setAmount}\n usdValue={hasInsufficientBalance ? undefined : usdValue}\n balance={token ? formatToken(token.balance, token, true, false, 5) : \"0\"}\n onMaxClick={handleMaxClick}\n className={cn(\n \"p-5\",\n hasInsufficientBalance ? \"border-destructive/50 border\" : \"border-border border\"\n )}\n />\n\n {/* Row 2: Scrollable content (1fr = takes remaining space) */}\n <div className=\"overflow-auto min-h-0 space-y-3\">\n {isReady && routeDetails && <SwapDetails details={swapDetailsProps} />}\n {routeDetails && routeDetails.length > 0 && (\n <RouteDetails value={{ steps: routeDetails }} />\n )}\n\n {currentStep && amount && showTxStatus && (\n <TransactionStatusSection\n steps={steps}\n currentStep={currentStep}\n allCompleted={allCompleted}\n cancelled={cancelled}\n tokenSymbol={token?.symbol || \"\"}\n amount={amount}\n resetQueue={resetQueue}\n resetForm={resetQueue}\n />\n )}\n\n {/* Button inside scroll when stickyButton = false */}\n {!stickyButton && (!isExecuting || allCompleted) && (\n <div className=\"pt-3\">\n <ConfirmButton\n fetchedRoute={fetchedRoute}\n routeError={routeError}\n isLoadingRoute={isLoadingRoute}\n canExecute={canExecute}\n isExecuting={isExecuting}\n hasError={hasError}\n cancelled={cancelled}\n executeCurrentTransaction={executeCurrentTransaction}\n totalSteps={totalSteps}\n completedSteps={completedSteps}\n showingTransactionStatus={isExecuting}\n hasInsufficientBalance={hasInsufficientBalance}\n />\n </div>\n )}\n </div>\n\n {/* Row 3: Button outside scroll when stickyButton = true */}\n {stickyButton && (!isExecuting || allCompleted) && (\n <div className=\"w-full\">\n <ConfirmButton\n fetchedRoute={fetchedRoute}\n routeError={routeError}\n isLoadingRoute={isLoadingRoute}\n canExecute={canExecute}\n isExecuting={isExecuting}\n hasError={hasError}\n cancelled={cancelled}\n executeCurrentTransaction={executeCurrentTransaction}\n totalSteps={totalSteps}\n completedSteps={completedSteps}\n showingTransactionStatus={isExecuting}\n hasInsufficientBalance={hasInsufficientBalance}\n />\n </div>\n )}\n </div>\n );\n}\n","import { useMultiChainBalances, WalletBalance } from \"@turtleclub/hooks\";\nimport { OverlayLayout, useWidgetOverlay } from \"../../navigation\";\nimport { Asset, AssetList } from \"@turtleclub/ui\";\nimport { useAdapter } from \"@/features/layout/contexts/adapter-context\";\nimport { ReactNode, useCallback, useMemo } from \"react\";\nimport { formatCurrencyWithCommas, formatToken, getNetworkByChainId } from \"@turtleclub/utils\";\nimport { useDepositForm } from \"@/hooks/useDepositForm\";\nimport { mainnet } from \"viem/chains\";\n\n// !DELETE after position api implementation.\nexport interface DepositToken {\n address: string;\n name: string;\n symbol: string;\n decimals: number;\n logo?: string;\n icon: ReactNode;\n balance: string;\n price?: number;\n chainId: number | undefined;\n}\n\nexport function mapBalanceToAsset(balance: WalletBalance, chainId: number | string): Asset {\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 = getNetworkByChainId(Number(chainId));\n\n return {\n id: `${chainId}-${tokenData.address}`,\n symbol: tokenData.symbol,\n name: tokenData.name,\n icon: tokenData.logo ? (\n <img src={tokenData.logo} alt={tokenData.symbol} className=\"h-8 w-8 rounded-full\" />\n ) : (\n <div className=\"bg-muted flex h-8 w-8 items-center justify-center rounded-full text-xs\">\n {tokenData.symbol?.charAt(0) || \"?\"}\n </div>\n ),\n balance: formatToken(tokenData.balance, tokenData),\n balanceUSD: formatCurrencyWithCommas(\n Number.parseFloat(formatToken(tokenData.balance, tokenData)) * (tokenData.price || 0),\n 2\n ),\n chainId: String(chainId),\n chainName: chain?.name || \"Unknown\",\n address: tokenData.address,\n decimals: tokenData.decimals,\n };\n}\n\nexport function mapBalancesToAssets(balances: Record<number, WalletBalance[]>): Asset[] {\n const assetsList: Asset[] = [];\n\n Object.entries(balances).forEach(([chainId, chainBalances]) => {\n chainBalances.forEach((balance) => {\n assetsList.push(mapBalanceToAsset(balance, chainId));\n });\n });\n\n return assetsList;\n}\n\nexport function formatSelectedToken(\n balances: Record<number, WalletBalance[]>,\n chainId: number | string,\n address: string | undefined\n): DepositToken | null {\n const chainBalances = balances[Number(chainId)];\n const balance = chainBalances?.find((b) => b.token.address === address);\n\n if (!balance) return null;\n\n return {\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 icon: (\n <img\n src={balance.token.logos?.[0]}\n alt={balance.token.symbol}\n className=\"size-4 rounded-full\"\n />\n ),\n balance: balance.amount,\n price: balance.token.price ?? undefined,\n chainId: balance.token.chain,\n };\n}\n\nexport function BalancesOverlay() {\n const { selectToken, opportunity } = useDepositForm();\n const { closeOverlay } = useWidgetOverlay();\n const { user } = useAdapter();\n const { balances, isLoading, error } = useMultiChainBalances({\n chainIds: [Number(opportunity?.receiptToken?.chain.chainId) ?? mainnet.id],\n address: user || \"\",\n });\n\n const onAssetSelect = useCallback(\n (asset: Asset) => {\n const token = formatSelectedToken(balances, asset.chainId, asset.address);\n\n selectToken(token);\n closeOverlay();\n },\n [selectToken, closeOverlay, balances]\n );\n\n //TODO!: Simplify this assets mapping with portfolio api schema and data.\n const assets = useMemo(() => mapBalancesToAssets(balances), [balances]);\n\n if (isLoading) return <div>Loading...</div>;\n if (error) return <div>Error: {error.message}</div>;\n\n return (\n <OverlayLayout>\n <AssetList\n assets={assets}\n onAssetClick={onAssetSelect}\n groupByChain\n showChainIcon\n filterVariant=\"navigation\"\n className=\"h-full\"\n itemClassName=\"!rounded-full\"\n />\n </OverlayLayout>\n );\n}\n","import { useAdapter, useDistributorId } from \"@/features/layout/contexts/adapter-context\";\nimport { useWidgetOverlay } from \"@/features/navigation\";\nimport {\n formatSelectedToken,\n mapBalancesToAssets,\n} from \"@/features/overlays/components/balances-overlay\";\nimport { useDepositForm } from \"@/hooks/useDepositForm\";\nimport { useMultiChainBalances, useWidgetOpportunities, WalletBalance } from \"@turtleclub/hooks\";\nimport { useEffect, useMemo } from \"react\";\nimport { mainnet } from \"viem/chains\";\n\nconst selectFirstAvailableToken = (balances: Record<number, WalletBalance[]>) => {\n const assets = mapBalancesToAssets(balances);\n const firstAsset = assets[0];\n\n if (!firstAsset) {\n return null;\n }\n\n const formattedAsset = formatSelectedToken(balances, firstAsset.chainId, firstAsset.address);\n return formattedAsset;\n};\n\nexport function useInitWidget() {\n const { user: address, network, sendTransaction } = useAdapter();\n const distributorId = useDistributorId();\n const { openOverlay } = useWidgetOverlay();\n const { token, selectOpportunity, selectToken, opportunity } = useDepositForm();\n\n const { balances, isLoading: isBalancesLoading } = useMultiChainBalances({\n chainIds: [Number(opportunity?.receiptToken?.chain.chainId) ?? mainnet.id],\n address,\n });\n const { data, isLoading: isWidgetOpportunitiesLoading } = useWidgetOpportunities(distributorId);\n\n useEffect(() => {\n // Only auto-select if opportunity is null/undefined\n if (data && data.opportunities && data.opportunities.length > 0 && !opportunity) {\n const firstOpportunity = data.opportunities[0];\n selectOpportunity(firstOpportunity);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [data, opportunity]); // Trigger when data OR opportunity changes\n\n // Auto-select the first available token\n useEffect(() => {\n if (!token && Object.keys(balances).length > 0) {\n const firstToken = selectFirstAvailableToken(balances);\n if (firstToken) {\n selectToken(firstToken);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [balances, token]); // Only trigger when balances or token changes, not when selectToken changes\n\n const isLoading = useMemo(() => {\n return isBalancesLoading || isWidgetOpportunitiesLoading;\n }, [isBalancesLoading, isWidgetOpportunitiesLoading]);\n\n return {\n address,\n network,\n distributorId,\n openOverlay,\n sendTransaction,\n isLoading,\n };\n}\n","\"use client\";\n\nimport { LogOutIcon, Wallet2Icon } from \"lucide-react\";\nimport { useWidgetAuth } from \"../../auth/hooks/useWidgetAuth\";\nimport { Button } from \"@turtleclub/ui\";\n\nfunction shortenAddress(address?: string, chars = 4): string {\n if (!address) return \"\";\n return `${address.slice(0, chars + 2)}...${address.slice(-chars)}`;\n}\n\nexport function WalletDropdown() {\n const { isMember, isLoading, address, isConnected, disconnect } = useWidgetAuth();\n\n if (isLoading) {\n return <div className=\"h-10 w-[133px] animate-pulse rounded-full bg-neutral-alpha-10\" />;\n }\n\n if (!isConnected) {\n return null;\n }\n\n if (isConnected && isMember) {\n return (\n <Button\n variant=\"ghost\"\n border=\"bordered\"\n onClick={disconnect}\n className=\"group min-w-[140px] transition-colors\"\n >\n <div className=\"gap-2 flex text-md items-center justify-between\">\n <Wallet2Icon className=\"size-6 stroke-accent group-hover:hidden\" />\n <LogOutIcon className=\"hidden size-6 stroke-destructive group-hover:block\" />\n <span className=\"group-hover:hidden\">{shortenAddress(address)}</span>\n <span className=\"hidden group-hover:block text-foreground\">Disconnect</span>\n </div>\n </Button>\n );\n }\n}\n","\"use client\";\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n} from \"@turtleclub/ui\";\nimport { useWidgetAuth } from \"@/features/auth/hooks/useWidgetAuth\";\nimport { useMemo } from \"react\";\nimport { useDistributorId } from \"@/features/layout/contexts/adapter-context\";\nimport { useWidgetOpportunities } from \"@turtleclub/hooks\";\n\nexport function ChainsDropdown() {\n const distributorId = useDistributorId();\n const { data: widgetOpportunities } = useWidgetOpportunities(distributorId);\n const chains = widgetOpportunities?.chains || [];\n const { changeNetwork, currentChain: currentChainId, isConnected } = useWidgetAuth();\n\n const currentChain = useMemo(() => {\n return chains.find((chain) => Number(chain.chainId) === currentChainId) || chains[0];\n }, [chains, currentChainId]);\n\n const handleChainChange = async (chainId: number) => {\n try {\n await changeNetwork(chainId);\n } catch (error) {\n console.error(\"Failed to change network:\", error);\n }\n };\n\n if (!isConnected) {\n return null;\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger src={currentChain?.logoUrl}>{currentChain?.name}</DropdownMenuTrigger>\n\n <DropdownMenuContent>\n {chains.map((chain) => (\n <DropdownMenuItem key={chain.id} onClick={() => handleChainChange(Number(chain.chainId))}>\n <img src={chain.logoUrl} alt={chain.name} className=\"size-6 rounded-full\" />\n {chain.name}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","import { WalletDropdown } from \"./wallet-dropdown\";\nimport { ChainsDropdown } from \"./chains-dropdown\";\n\nexport function WalletSection() {\n return (\n <div className=\"flex justify-between items-center gap-2\">\n <WalletDropdown />\n <ChainsDropdown />\n </div>\n );\n}\n","import { Card, Skeleton } from \"@turtleclub/ui\";\n\nexport const EarnTabSkeleton = () => {\n return (\n <div className=\"mt-5 flex flex-col gap-4 h-full\">\n {/* Wallet Section Skeleton */}\n <div className=\"space-y-3\">\n <div className=\"flex gap-3\">\n {/* Address Skeleton */}\n <Skeleton className=\"h-12 flex-1 rounded-turtle\" />\n\n {/* Chain Selector Skeleton */}\n <Skeleton className=\"h-12 w-48 rounded-turtle\" />\n </div>\n\n {/* APR Card Skeleton */}\n <Card variant=\"shadow\" gradient=\"white\" className=\"rounded-turtle space-y-2\">\n <div className=\"flex justify-between p-4\">\n {/* APR Skeleton */}\n <Skeleton className=\"h-8 w-24\" />\n\n {/* Opportunity Selector Skeleton */}\n <Skeleton className=\"h-8 w-56 rounded-full\" />\n </div>\n\n {/* Rate Estimator Skeleton */}\n <div className=\"mx-4 mb-4 space-y-1\">\n <div className=\"flex justify-between\">\n <Skeleton className=\"h-4 w-16\" />\n <Skeleton className=\"h-4 w-40\" />\n </div>\n <div className=\"flex justify-between\">\n <Skeleton className=\"h-4 w-16\" />\n <Skeleton className=\"h-4 w-40\" />\n </div>\n </div>\n </Card>\n\n {/* Deposit Card Skeleton */}\n <Card variant=\"shadow\" className=\"rounded-turtle p-4\">\n {/* Amount Input Skeleton */}\n <div className=\"mb-4\">\n <Skeleton className=\"h-20 w-full rounded-turtle\" />\n </div>\n\n {/* Token Selector and Balance Skeleton */}\n <div className=\"flex justify-between items-center mb-4\">\n <Skeleton className=\"h-10 w-40 rounded-full\" />\n <Skeleton className=\"h-5 w-32\" />\n </div>\n </Card>\n\n {/* Action Button Skeleton */}\n <Skeleton className=\"h-14 w-full rounded-turtle\" />\n </div>\n </div>\n );\n};\n","import { OverlayEnum } from \"@/features/navigation\";\nimport { DepositSection } from \"@/features/opportunities/deposit/components/deposit-section\";\nimport { useInitWidget } from \"../hooks/useInitWidget\";\nimport { useDepositForm } from \"@/hooks/useDepositForm\";\nimport {\n BaseSelector,\n Button,\n Card,\n cn,\n iconUrlToImg,\n OpportunityRateEstimator,\n} from \"@turtleclub/ui\";\nimport { APRBreakdownTooltip } from \"@/features/opportunities/opportunity-table/components/apr-breakdown-tooltip\";\nimport { WalletSection } from \"@/features/wallet\";\nimport { useWidgetAuth } from \"@/features/auth/hooks/useWidgetAuth\";\nimport { EarnTabSkeleton } from \"./earn-skeleton\";\n\nexport const EarnTab = () => {\n const { isConnected, connect } = useWidgetAuth();\n const { address, distributorId, openOverlay, sendTransaction, isLoading } = useInitWidget();\n const { opportunity, amount, token } = useDepositForm();\n\n const getTotalYield = (incentives: any[]) =>\n incentives\n .filter((i) => i.rewardType !== \"points\")\n .reduce((acc, incentive) => acc + (incentive.yield ?? 0), 0);\n\n if (isLoading) {\n return <EarnTabSkeleton />;\n }\n\n return (\n <div className=\"mt-5 flex flex-col gap-4 h-full\">\n <div className=\"text-foreground space-y-3\">\n <WalletSection />\n <Card variant=\"shadow\" gradient=\"white\" className={cn(\"rounded-turtle space-y-2\")}>\n <div className=\"flex justify-between p-4\">\n <APRBreakdownTooltip\n incentives={opportunity?.incentives || []}\n className=\"text-xl text-primary\"\n />\n <BaseSelector\n icon={iconUrlToImg(\n opportunity?.receiptToken?.logoUrl || \"\",\n opportunity?.receiptToken?.symbol || \"\"\n )}\n text={opportunity?.name || \"\"}\n onClick={() => openOverlay(OverlayEnum.OPPORTUNITIES)}\n size=\"sm\"\n />\n </div>\n <OpportunityRateEstimator\n value={{\n symbol: opportunity?.baseTokens?.symbol || \"\",\n price: opportunity?.baseTokens?.priceUsd || 0,\n depositedAmountUsd: Number(Number(amount ?? 0) * Number(token?.price ?? 0)) || 0,\n apr: getTotalYield(opportunity?.incentives || []),\n }}\n />\n </Card>\n </div>\n {opportunity && address && distributorId && (\n <DepositSection\n opportunity={opportunity}\n address={address}\n distributorId={distributorId}\n stickyButton\n executeTransaction={async (transaction: any) => {\n return await sendTransaction(transaction);\n }}\n />\n )}\n {!isConnected && (\n <div className=\"mt-auto sticky bottom-0\">\n <Button\n variant=\"green\"\n border=\"interactive\"\n size=\"lg\"\n onClick={connect}\n className=\"w-full\"\n >\n Connect Wallet\n </Button>\n </div>\n )}\n </div>\n );\n};\n","\"use client\";\nimport { useMemo } from \"react\";\nimport { WidgetThemeWrapper } from \"./widget-theme\";\nimport { useWidgetAuth } from \"../../auth/hooks/useWidgetAuth\";\nimport { useWalletConnection } from \"../contexts/adapter-context\";\nimport { Button } from \"@turtleclub/ui\";\nimport {\n NavigationRoot,\n TabEnum,\n OverlayEnum,\n type TabsConfig,\n type OverlaysConfig,\n} from \"../../navigation\";\nimport { OpportunityOverlay } from \"@/features/overlays/components/opportunity-overlay\";\nimport { PositionsTab } from \"@/features/tabs/components/positions\";\nimport { DiscoverTab } from \"@/features/tabs/components/discover\";\nimport { EarnTab } from \"@/features/tabs/components/earn\";\nimport { BalancesOverlay } from \"@/features/overlays/components/balances-overlay\";\n\n// Overlay components (placeholders)\nexport function WidgetMain() {\n const { isMember } = useWidgetAuth();\n\n const tabs = useMemo(\n (): TabsConfig => ({\n [TabEnum.POSITIONS]: {\n label: \"Your Positions\",\n component: PositionsTab,\n visible: isMember,\n },\n [TabEnum.EARN]: {\n label: \"Earn\",\n component: EarnTab,\n },\n [TabEnum.DISCOVER]: {\n label: \"Discover\",\n component: DiscoverTab,\n },\n }),\n [isMember]\n );\n\n const overlays: OverlaysConfig = useMemo(\n () => ({\n [OverlayEnum.OPPORTUNITIES]: { component: OpportunityOverlay },\n [OverlayEnum.BALANCES]: { component: BalancesOverlay },\n }),\n []\n );\n\n return (\n <WidgetThemeWrapper>\n <NavigationRoot tabs={tabs} overlays={overlays} defaultTab={TabEnum.EARN} />\n </WidgetThemeWrapper>\n );\n}\n","import { AdapterProvider } from \"../contexts/adapter-context\";\nimport { WidgetConfigProvider } from \"../contexts/widget-config-context\";\nimport { WidgetMain } from \"./widget-main\";\nimport { EarnWidgetProps } from \"../types\";\nimport React from \"react\";\n\nexport function EarnWidget({\n adapter,\n config,\n distributorId,\n}: EarnWidgetProps): React.ReactElement {\n return (\n <WidgetConfigProvider config={config}>\n <AdapterProvider adapter={adapter} distributorId={distributorId}>\n <WidgetMain />\n </AdapterProvider>\n </WidgetConfigProvider>\n );\n}\n","import type { WidgetStyleConfig } from \"../features/layout/types/style-config\";\n\n//! Will be deprecated when just use distributorId to fetch everything from the API\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"]}
|