@turtleclub/earn-widget 0.4.0 → 0.5.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.js.map CHANGED
@@ -1 +1 @@
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/geo-check-blocker.tsx","../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","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","a","opportunityChainId","OpportunityOverlay","useWidgetOpportunities","PositionsTab","DiscoverTab","TransactionStatusSection","steps","currentStep","allCompleted","cancelled","tokenSymbol","resetQueue","resetForm","refetchBalances","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","GeoCheckBlocker","geoCheckData","geoCheckLoading","useGeocheck","Tooltip","TooltipTrigger","TooltipContent","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","tokenChainId","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.js","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 // Don't reset opportunity - user might want to make another deposit to the same opportunity\n setToken(null);\n setAmount(\"\");\n setSlippage(SLIPPAGE_DEFAULT);\n }, [setToken, setAmount, setSlippage]);\n\n // Reset amount and slippage when token changes (e.g., user selects a different token)\n useEffect(() => {\n // Only reset if there's a token (don't reset when token becomes null during form reset)\n if (token) {\n setAmount(\"\");\n setSlippage(SLIPPAGE_DEFAULT);\n }\n }, [token, setAmount, setSlippage]);\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.receiptToken.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\n src={row.original.receiptToken.logoUrl}\n className=\"size-6 rounded-full\"\n loading=\"lazy\"\n />\n {row.original.name || row.original.receiptToken.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.receiptToken.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 refetchBalances?: () => 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 refetchBalances,\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 refetchBalances?.();\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, refetchBalances, 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 { useGeocheck } from \"@turtleclub/hooks\";\nimport { Button, Tooltip, TooltipContent, TooltipTrigger } from \"@turtleclub/ui\";\nimport type { ReactNode } from \"react\";\n\ninterface GeoCheckButtonProps {\n children: ReactNode;\n className?: string;\n}\n\nexport function GeoCheckBlocker({ children, className }: GeoCheckButtonProps) {\n const { data: geoCheckData, isLoading: geoCheckLoading } = useGeocheck();\n\n // Geo restriction check - loading state\n if (geoCheckLoading) {\n return (\n <Button disabled className={className} size=\"lg\" fullWidth>\n Checking availability...\n </Button>\n );\n }\n\n // Geo restriction check - blocked state\n if (geoCheckData && !geoCheckData.canInteract) {\n return (\n <Tooltip>\n <TooltipTrigger className=\"w-full cursor-default space-y-2\">\n <Button disabled variant=\"default\" className={className} size=\"lg\" fullWidth>\n Geo Restricted\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\" sideOffset={6} className=\"text-xs\">\n Due to geographical restrictions you can't use this vault.\n </TooltipContent>\n </Tooltip>\n );\n }\n\n // Geo check passed - render children\n return <>{children}</>;\n}\n","import { Button } from \"@turtleclub/ui\";\nimport { useCallback, useMemo } from \"react\";\nimport type { EarnRouteResponse } from \"@turtleclub/hooks\";\nimport { GeoCheckBlocker } from \"./geo-check-blocker\";\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 <GeoCheckBlocker>\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 </GeoCheckBlocker>\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 refetchBalances,\n stickyButton = false,\n}: {\n opportunity: Opportunity;\n address: string;\n distributorId: string;\n executeTransaction: (transaction: AdapterTransaction) => Promise<string | undefined>;\n refetchBalances: () => void;\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, reset } = 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 onSuccess: () => {\n refetchBalances();\n },\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={reset}\n refetchBalances={refetchBalances}\n />\n )}\n\n {/* Button inside scroll when stickyButton = false */}\n {!stickyButton && !showTxStatus && (\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 && !showTxStatus && (\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, refetchAll: refetchBalances } = 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 when:\n // 1. No token is selected, OR\n // 2. Selected token is from a different chain than the current opportunity\n useEffect(() => {\n const opportunityChainId = Number(opportunity?.receiptToken?.chain.chainId) ?? mainnet.id;\n const tokenChainId = token?.chainId;\n const shouldSelectNewToken = !token || tokenChainId !== opportunityChainId;\n\n if (shouldSelectNewToken && 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, opportunity]); // Trigger when balances, token, or opportunity 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 refetchBalances,\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, refetchBalances } = 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 refetchBalances={refetchBalances}\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"]}
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/state/deposit-atoms.ts","../src/hooks/useDepositForm.ts","../src/features/overlays/components/opportunity-overlay.tsx","../src/features/tabs/components/positions.tsx","../src/features/tabs/components/discover.tsx","../src/utils/opportunity.ts","../src/features/deposit/deposit-section.tsx","../src/features/tabs/hooks/useInitWidget.tsx","../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/overlays/components/balances-overlay.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","selectedOpportunityAtom","tokenInAmountAtom","slippageAtom","SLIPPAGE_DEFAULT","selectedTokenBalanceAtom","depositFormAtom","get","opportunity","tokenBalance","slippage","amountGreaterThanZero","isValid","options","parseUnits","useDepositForm","setOpportunity","setTokenBalance","setAmount","setSlippage","formState","useAtomValue","reset","OpportunityOverlay","useWidgetOpportunities","changeNetwork","network","selectOpportunity","selectTokenBalance","OpportunitiesTable","PositionsTab","DiscoverTab","getOpportunityTokenDetails","mainnet","DepositSection","executeTransaction","refetchBalances","refreshSelectedToken","stickyButton","chainId","symbol","decimals","usdValue","hasInsufficientBalance","handleMaxClick","useTokenBalance","routeDetails","isReady","outputAmount","fetchedRoute","routeError","isLoadingRoute","useSwapRoute","sendTransaction","transaction","adapterTx","steps","currentStep","canExecute","isExecuting","allCompleted","hasError","cancelled","executeCurrentTransaction","resetQueue","totalSteps","completedSteps","showTxStatus","useTransactionQueue","swapDetailsProps","formattedAmount","formatNumber","formattedAmountToReceive","formatToken","SwapInput","SwapDetails","RouteDetails","TransactionStatusSection","ConfirmButton","selectFirstAvailableToken","balances","balancesInChain","b","useInitWidget","lastOpportunityChainIdRef","lastNetworkRef","isBalancesLoading","useBalance","isWidgetOpportunitiesLoading","walletChainId","selectedOpportunity","opp","currentNetwork","opportunityOnNewChain","opportunityChainId","tokenChainId","chainChanged","shouldSelectNewToken","firstTokenBalance","updatedToken","shortenAddress","chars","WalletDropdown","isMember","isConnected","disconnect","Wallet2Icon","LogOutIcon","ChainsDropdown","widgetOpportunities","chains","currentChainId","currentChain","chain","handleChainChange","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","WalletSection","EarnTabSkeleton","Skeleton","EarnTab","connect","getTotalYield","incentives","i","acc","incentive","APRBreakdownTooltip","BaseSelector","iconUrlToImg","OpportunityRateEstimator","BalancesOverlay","user","filteredBalances","balance","onBalanceSelect","BalancesDataTable","WidgetMain","EarnWidget","defaultWidgetStyleConfig"],"mappings":"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","file":"index.js","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 { atom } from \"jotai\";\nimport type { Opportunity, TokenBalance } from \"@turtleclub/hooks\";\nimport { parseUnits } from \"viem\";\nimport { SLIPPAGE_DEFAULT } from \"@turtleclub/opportunities\";\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// Selected token with balance information\nexport const selectedTokenBalanceAtom = atom<TokenBalance | null>(null);\n\n// Derived atom (computed)\nexport const depositFormAtom = atom((get) => {\n const opportunity = get(selectedOpportunityAtom);\n const tokenBalance = get(selectedTokenBalanceAtom);\n const amount = get(tokenInAmountAtom);\n const slippage = get(slippageAtom);\n\n const amountGreaterThanZero = Boolean(amount && Number.parseFloat(amount) > 0);\n const isValid = !!opportunity && !!tokenBalance && amountGreaterThanZero && !!slippage;\n\n const options = isValid\n ? {\n chain: Number(opportunity?.receiptToken?.chain.chainId) ?? 1,\n token_in: tokenBalance?.token.address ?? \"\",\n token_out: opportunity?.receiptToken?.address ?? \"\",\n amount: parseUnits(amount ?? \"0\", tokenBalance?.token.decimals ?? 18).toString(),\n slippage,\n }\n : undefined;\n\n return {\n opportunity,\n tokenBalance,\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 selectedTokenBalanceAtom,\n tokenInAmountAtom,\n slippageAtom,\n} from \"../state/deposit-atoms\";\nimport { SLIPPAGE_DEFAULT } from \"@turtleclub/opportunities\";\n\n\nexport function useDepositForm() {\n const [opportunity, setOpportunity] = useAtom(selectedOpportunityAtom);\n const [tokenBalance, setTokenBalance] = useAtom(selectedTokenBalanceAtom);\n const [amount, setAmount] = useAtom(tokenInAmountAtom);\n const [slippage, setSlippage] = useAtom(slippageAtom);\n\n const formState = useAtomValue(depositFormAtom);\n\n const reset = useCallback(() => {\n // Don't reset opportunity - user might want to make another deposit to the same opportunity\n setTokenBalance(null);\n setAmount(\"\");\n setSlippage(SLIPPAGE_DEFAULT);\n }, [setTokenBalance, setAmount, setSlippage]);\n\n // Reset amount and slippage when token changes (e.g., user selects a different token)\n useEffect(() => {\n // Only reset if there's a token (don't reset when token becomes null during form reset)\n if (tokenBalance) {\n setAmount(\"\");\n setSlippage(SLIPPAGE_DEFAULT);\n }\n }, [tokenBalance, setAmount, setSlippage]);\n\n return {\n opportunity,\n tokenBalance,\n amount,\n slippage,\n isValid: formState.isValid,\n options: formState.options,\n selectOpportunity: setOpportunity,\n selectTokenBalance: setTokenBalance,\n setAmount,\n setSlippage,\n reset,\n };\n}\n","import { OverlayLayout, useWidgetOverlay } from \"../../navigation\";\nimport { useWidgetOpportunities } from \"@turtleclub/hooks\";\nimport { OpportunitiesTable } from \"@turtleclub/opportunities\";\nimport { useAdapter, useDistributorId } from \"@/features/layout/contexts/adapter-context\";\nimport { useDepositForm } from \"@/hooks/useDepositForm\";\n\nexport function OpportunityOverlay() {\n const distributorId = useDistributorId();\n const { data, isLoading, error } = useWidgetOpportunities(distributorId);\n const { changeNetwork, network } = useAdapter();\n const { selectOpportunity, selectTokenBalance } = useDepositForm();\n const { closeOverlay } = useWidgetOverlay();\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\n opportunities={data.opportunities || []}\n currentNetwork={network}\n onSelectOpportunity={selectOpportunity}\n onChangeNetwork={changeNetwork}\n onResetToken={() => selectTokenBalance(null)}\n onClose={closeOverlay}\n isWidget\n />\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 type { Opportunity } from \"@turtleclub/hooks\";\nimport { mainnet } from \"viem/chains\";\n\n/**\n * Extract token details from an opportunity\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 { SwapDetails, SwapInput, cn } from \"@turtleclub/ui\";\nimport { useCallback, useMemo } from \"react\";\nimport { useTokenBalance, useSwapRoute } from \"@turtleclub/hooks\";\nimport { formatNumber, formatToken } from \"@turtleclub/utils\";\nimport { getOpportunityTokenDetails } from \"@/utils/opportunity\";\nimport {\n RouteDetails,\n TransactionStatusSection,\n useTransactionQueue,\n ConfirmButton,\n} from \"@turtleclub/opportunities\";\nimport type { Opportunity, StepTx } from \"@turtleclub/hooks\";\nimport { useDepositForm } from \"@/hooks/useDepositForm\";\nimport { useWidgetOverlay, OverlayEnum } from \"../navigation\";\nimport type { Transaction as AdapterTransaction } from \"@/features/layout/types/adapter\";\n\nexport function DepositSection({\n opportunity,\n address,\n distributorId,\n executeTransaction,\n refetchBalances,\n refreshSelectedToken,\n stickyButton = false,\n}: {\n opportunity: Opportunity;\n address: string;\n distributorId: string;\n executeTransaction: (transaction: AdapterTransaction) => Promise<string | undefined>;\n refetchBalances: () => void;\n refreshSelectedToken: () => void;\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, tokenBalance, amount, slippage, options, isValid, reset } =\n useDepositForm();\n\n // Use shared hook for balance logic (only when tokenBalance exists)\n const { usdValue, hasInsufficientBalance, handleMaxClick } = useTokenBalance({\n tokenBalance: tokenBalance,\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 onSuccess: () => {\n refetchBalances();\n // Sync Jotai atom with fresh React Query cache\n refreshSelectedToken();\n },\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} ${tokenBalance?.token.symbol || \"ETH\"}` : \"0 ETH\",\n receive:\n outputAmount && decimals ? `${formattedAmountToReceive} ${symbol || \"ETH\"}` : \"0 ETH\",\n equivalentInUsd:\n amount && tokenBalance?.token.priceUsd\n ? (Number.parseFloat(amount) * tokenBalance.token.priceUsd).toFixed(2)\n : \"0.00\",\n defaultOpen: true,\n slippage,\n setSlippage,\n };\n }, [amount, outputAmount, decimals, symbol, tokenBalance, 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={tokenBalance?.token}\n onCustomTokenSelectorClick={() => openOverlay(OverlayEnum.BALANCES)}\n value={amount ?? undefined}\n onChange={setAmount}\n usdValue={hasInsufficientBalance ? undefined : usdValue}\n balance={\n tokenBalance ? formatToken(tokenBalance.amount, tokenBalance.token, true, false, 5) : \"0\"\n }\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={tokenBalance?.token.symbol || \"\"}\n amount={amount}\n resetQueue={resetQueue}\n resetForm={reset}\n refetchBalances={refetchBalances}\n />\n )}\n\n {/* Button inside scroll when stickyButton = false */}\n {!stickyButton && !showTxStatus && (\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 && !showTxStatus && (\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 { useAdapter, useDistributorId } from \"@/features/layout/contexts/adapter-context\";\nimport { useWidgetOverlay } from \"@/features/navigation\";\nimport { useDepositForm } from \"@/hooks/useDepositForm\";\nimport { useBalance, useWidgetOpportunities, type TokenBalance } from \"@turtleclub/hooks\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { mainnet } from \"viem/chains\";\n\nconst selectFirstAvailableToken = (\n balances: TokenBalance[],\n chainId: number\n): TokenBalance | null => {\n // 1. Filter balances from the connected chain\n const balancesInChain = balances.filter(\n (b) => Number(b.token.chain.chainId) === chainId\n );\n\n // 2. Filter balances with amount > 0\n const balancesWithAmount = balancesInChain.filter((b) => {\n const amount = typeof b.amount === \"bigint\" ? b.amount : BigInt(b.amount);\n return amount > 0n;\n });\n\n // 3. Return first balance with amount, or first balance from the chain, or null\n return balancesWithAmount[0] ?? balancesInChain[0] ?? null;\n};\n\nexport function useInitWidget() {\n const { user: address, network, sendTransaction } = useAdapter();\n const distributorId = useDistributorId();\n const { openOverlay } = useWidgetOverlay();\n const { tokenBalance, selectOpportunity, selectTokenBalance, opportunity } = useDepositForm();\n const lastOpportunityChainIdRef = useRef<number | null>(null);\n const lastNetworkRef = useRef<number | null>(null);\n\n const {\n balances,\n isLoading: isBalancesLoading,\n refetchAll: refetchBalances,\n } = useBalance({\n chainIds: [Number(opportunity?.receiptToken?.chain.chainId) ?? mainnet.id],\n address,\n depositOpportunity: opportunity,\n });\n const { data, isLoading: isWidgetOpportunitiesLoading } = useWidgetOpportunities(distributorId);\n\n // Initial opportunity selection (only when no opportunity is selected)\n useEffect(() => {\n // Only auto-select if opportunity is null/undefined\n if (data && data.opportunities && data.opportunities.length > 0 && !opportunity) {\n const walletChainId = network ?? mainnet.id;\n\n // Try to find an opportunity that matches the wallet's chain\n const opportunityOnWalletChain = data.opportunities.find(\n (opp) => Number(opp.receiptToken?.chain.chainId) === walletChainId\n );\n\n // Select matching opportunity or fallback to first one\n const selectedOpportunity = opportunityOnWalletChain || data.opportunities[0];\n selectOpportunity(selectedOpportunity);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [data, opportunity, network]); // Trigger when data, opportunity, or network changes\n\n // Auto-select opportunity and token when user manually changes chain\n useEffect(() => {\n const currentNetwork = network ?? mainnet.id;\n\n // Detect if network changed (user manually changed chain)\n const networkChanged = lastNetworkRef.current !== null && lastNetworkRef.current !== currentNetwork;\n\n if (networkChanged && data?.opportunities && data.opportunities.length > 0) {\n // Find opportunity matching the new chain\n const opportunityOnNewChain = data.opportunities.find(\n (opp) => Number(opp.receiptToken?.chain.chainId) === currentNetwork\n );\n\n if (opportunityOnNewChain) {\n // Select new opportunity (this will trigger token auto-selection via the other effect)\n selectOpportunity(opportunityOnNewChain);\n }\n }\n\n // Update ref\n lastNetworkRef.current = currentNetwork;\n }, [network, data, selectOpportunity]);\n\n // Auto-select the first available token when:\n // 1. No token is selected, OR\n // 2. Selected token is from a different chain than the current opportunity\n useEffect(() => {\n const opportunityChainId = Number(opportunity?.receiptToken?.chain.chainId) ?? mainnet.id;\n const tokenChainId = tokenBalance?.token.chain.chainId;\n\n // Only auto-select if:\n // 1. Opportunity chain changed (not just balances updated)\n // 2. AND (no token selected OR token is from different chain)\n const chainChanged = lastOpportunityChainIdRef.current !== opportunityChainId;\n const shouldSelectNewToken = !tokenBalance || Number(tokenChainId) !== opportunityChainId;\n\n if (chainChanged && shouldSelectNewToken && balances.length > 0) {\n const firstTokenBalance = selectFirstAvailableToken(balances, opportunityChainId);\n if (firstTokenBalance) {\n selectTokenBalance(firstTokenBalance);\n lastOpportunityChainIdRef.current = opportunityChainId;\n }\n } else if (!chainChanged) {\n // Update ref if chain didn't change but this is initial render\n lastOpportunityChainIdRef.current = opportunityChainId;\n }\n }, [opportunity, tokenBalance, balances, selectTokenBalance]); // Properly track all dependencies\n\n const isLoading = useMemo(() => {\n return isBalancesLoading || isWidgetOpportunitiesLoading;\n }, [isBalancesLoading, isWidgetOpportunitiesLoading]);\n\n // Refresh selected token with updated balance after transaction\n const refreshSelectedToken = useCallback(() => {\n if (!tokenBalance) return;\n\n // Find updated token in fresh balances\n const updatedToken = balances.find(\n (b) =>\n b.token.address.toLowerCase() === tokenBalance.token.address.toLowerCase() &&\n Number(b.token.chain.chainId) === Number(tokenBalance.token.chain.chainId)\n );\n\n if (updatedToken) {\n selectTokenBalance(updatedToken);\n }\n }, [balances, tokenBalance, selectTokenBalance]);\n\n return {\n address,\n network,\n distributorId,\n openOverlay,\n sendTransaction,\n isLoading,\n refetchBalances,\n refreshSelectedToken,\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/deposit/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 \"@turtleclub/opportunities\";\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 {\n address,\n distributorId,\n openOverlay,\n sendTransaction,\n isLoading,\n refetchBalances,\n refreshSelectedToken,\n } = useInitWidget();\n const { opportunity, amount, tokenBalance } = 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 vaultConfig={opportunity?.vaultConfig ?? undefined}\n incentives={opportunity?.incentives || []}\n isWidget\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:\n Number(Number(amount ?? 0) * Number(tokenBalance?.token.priceUsd ?? 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 refetchBalances={refetchBalances}\n refreshSelectedToken={refreshSelectedToken}\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","import { useBalance, type TokenBalance } from \"@turtleclub/hooks\";\nimport { OverlayLayout, useWidgetOverlay } from \"../../navigation\";\nimport { BalancesDataTable } from \"@turtleclub/opportunities\";\nimport { useAdapter } from \"@/features/layout/contexts/adapter-context\";\nimport { useCallback, useMemo } from \"react\";\nimport { useDepositForm } from \"@/hooks/useDepositForm\";\nimport { mainnet } from \"viem/chains\";\n\nexport function BalancesOverlay() {\n const { selectTokenBalance, opportunity } = useDepositForm();\n const { closeOverlay } = useWidgetOverlay();\n const { user } = useAdapter();\n const opportunityChainId = Number(opportunity?.receiptToken?.chain.chainId) ?? mainnet.id;\n\n const { balances, isLoading, error } = useBalance({\n chainIds: [opportunityChainId],\n address: user || \"\",\n depositOpportunity: opportunity,\n });\n\n // Filter balances to only show tokens from the opportunity's chain\n const filteredBalances = useMemo(() => {\n return balances.filter((balance) => {\n const tokenChainId = Number(balance.token.chain.chainId);\n return tokenChainId === opportunityChainId;\n });\n }, [balances, opportunityChainId]);\n\n const onBalanceSelect = useCallback(\n (balance: TokenBalance) => {\n selectTokenBalance(balance);\n closeOverlay();\n },\n [selectTokenBalance, closeOverlay]\n );\n\n if (error) return <div>Error: {error.message}</div>;\n\n return (\n <OverlayLayout>\n <BalancesDataTable\n balances={filteredBalances}\n isLoading={isLoading}\n onBalanceSelect={onBalanceSelect}\n emptyStateMessage=\"No balances found\"\n />\n </OverlayLayout>\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"]}