@surf_liquid/surf-widget 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +230 -0
- package/dist/Base.svg +10 -0
- package/dist/Polygon.png +0 -0
- package/dist/SurfToken.png +0 -0
- package/dist/USDC.svg +23 -0
- package/dist/index.css +1 -0
- package/dist/index.d.ts +431 -0
- package/dist/index.esm.js +2443 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/context/SurfContext.tsx","../src/hooks/useVault.ts","../src/assets/cdn.ts","../src/components/ui/TokenIcon.tsx","../src/components/ui/Button.tsx","../src/components/VaultCard/ManageDropdown.tsx","../src/components/VaultCard/index.tsx","../src/hooks/useAgentMessages.ts","../src/components/ui/Modal.tsx","../src/components/ui/Tabs.tsx","../src/components/VaultActivity/index.tsx","../src/hooks/useDeposit.ts","../src/hooks/useWithdraw.ts","../src/hooks/useBalance.ts","../src/components/ui/StepProgress.tsx","../src/components/TransactionModal.tsx","../src/components/SurfWidget.tsx","../src/components/RegistrationForm.tsx","../src/components/DepositModal/index.tsx","../src/components/WithdrawModal/index.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useMemo,\n useEffect,\n type ReactNode,\n} from 'react';\nimport type { SurfConfig, SurfTheme, ISurfClient } from '../types';\n\n// ─── Context Shape ────────────────────────────────────────────────────────────\n\nexport interface SurfContextValue {\n walletAddress: string;\n chainId: number;\n surfClient: ISurfClient;\n theme: SurfTheme;\n onSuccess?: SurfConfig['onSuccess'];\n onError?: SurfConfig['onError'];\n}\n\nconst SurfContext = createContext<SurfContextValue | null>(null);\n\n// ─── Theme → CSS Variables ────────────────────────────────────────────────────\n\nfunction applyTheme(el: HTMLElement, theme: SurfTheme): void {\n const c = theme.colors ?? {};\n const vars: Record<string, string | undefined> = {\n '--surf-primary': c.primary,\n '--surf-primary-text': c.primaryText,\n '--surf-background': c.background,\n '--surf-card-background': c.cardBackground,\n '--surf-text': c.text,\n '--surf-text-secondary': c.textSecondary,\n '--surf-apy': c.apy,\n '--surf-border': c.border,\n '--surf-success': c.success,\n '--surf-border-radius': theme.borderRadius,\n '--surf-font-family': theme.fontFamily,\n };\n\n for (const [key, value] of Object.entries(vars)) {\n if (value !== undefined && value !== null) {\n el.style.setProperty(key, value);\n }\n }\n}\n\n// ─── Provider ─────────────────────────────────────────────────────────────────\n\nexport interface SurfProviderProps {\n config: SurfConfig;\n containerRef: React.RefObject<HTMLDivElement | null>;\n children: ReactNode;\n}\n\nexport function SurfProvider({ config, containerRef, children }: SurfProviderProps) {\n const { client: surfClient, walletAddress, chainId = 8453, theme = {}, onSuccess, onError } = config;\n\n useEffect(() => {\n if (containerRef.current) {\n applyTheme(containerRef.current, theme);\n }\n }, [theme, containerRef]);\n\n const value = useMemo<SurfContextValue>(\n () => ({ walletAddress, chainId, surfClient, theme, onSuccess, onError }),\n [walletAddress, chainId, surfClient, theme, onSuccess, onError]\n );\n\n return <SurfContext.Provider value={value}>{children}</SurfContext.Provider>;\n}\n\n// ─── Hook ─────────────────────────────────────────────────────────────────────\n\nexport function useSurf(): SurfContextValue {\n const ctx = useContext(SurfContext);\n if (!ctx) throw new Error('useSurf must be used within a SurfProvider');\n return ctx;\n}\n\nexport { SurfContext };\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSurf } from '../context/SurfContext';\nimport type { VaultInfo, SurfVaultInfo } from '../types';\n\nconst CHAIN_NAMES: Record<number, string> = {\n 8453: 'Base',\n 137: 'Polygon',\n 84532: 'Base Sepolia',\n};\n\nfunction mapVault(raw: SurfVaultInfo, contextChainId: number): VaultInfo {\n // Use contextChainId (from SurfWidget prop) as the source of truth for chain.\n // Fall back to homeChainId from the API only if context didn't specify.\n const resolvedChainId = contextChainId || raw.homeChainId || 8453;\n const chain = {\n name: CHAIN_NAMES[resolvedChainId] ?? `Chain ${resolvedChainId}`,\n id: resolvedChainId,\n };\n\n // New user — vault not deployed yet, still show live market APY\n if (!raw.exists || raw.assets.length === 0) {\n return {\n token: { symbol: 'USDC', name: 'USD Coin', decimals: 6, address: '' },\n chain,\n balance: '0.00',\n earnings: '0.00',\n apy: raw.apyBreakdown?.currentAPY ?? 0,\n withdrawalType: 'instant',\n availableBalance: '0.00',\n userVaultAddress: raw.userVaultAddress ?? undefined,\n assets: [],\n };\n }\n\n // Only consider assets on the resolved chain — falls back to all assets if none match\n const chainAssets = raw.assets.filter(a => a.chainId === resolvedChainId);\n const relevantAssets = chainAssets.length > 0 ? chainAssets : raw.assets;\n\n const primary = relevantAssets.reduce(\n (best, a) => (a.currentValueUSD > best.currentValueUSD ? a : best),\n relevantAssets[0]\n );\n\n // Balance / earnings for the resolved chain only\n const chainBalance = relevantAssets.reduce((sum, a) => sum + a.currentValueUSD, 0);\n const chainEarnings = relevantAssets.reduce((sum, a) => sum + a.totalEarningsUSD, 0);\n\n return {\n token: {\n symbol: primary.assetSymbol,\n name: primary.assetSymbol === 'USDC' ? 'USD Coin' : primary.assetSymbol,\n decimals: primary.assetDecimals ?? 6,\n address: primary.assetAddress,\n },\n chain,\n balance: chainBalance.toFixed(2),\n earnings: chainEarnings.toFixed(2),\n apy: raw.apyBreakdown.currentAPY,\n withdrawalType: 'instant',\n availableBalance: chainBalance.toFixed(2),\n userVaultAddress: raw.userVaultAddress ?? undefined,\n assets: chainAssets.length > 0 ? chainAssets : raw.assets,\n };\n}\n\nexport interface UseVaultReturn {\n vault: VaultInfo | null;\n isLoading: boolean;\n error: Error | null;\n refetch: () => void;\n}\n\nexport function useVault(): UseVaultReturn {\n const { walletAddress, surfClient, chainId } = useSurf();\n const [vault, setVault] = useState<VaultInfo | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const [fetchTick, setFetchTick] = useState(0);\n\n useEffect(() => {\n let cancelled = false;\n\n async function load() {\n setIsLoading(true);\n setError(null);\n try {\n const raw = await surfClient.getVault(walletAddress);\n if (!cancelled) setVault(mapVault(raw, chainId));\n } catch (err) {\n if (!cancelled) setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n if (!cancelled) setIsLoading(false);\n }\n }\n\n load();\n return () => { cancelled = true; };\n }, [walletAddress, surfClient, chainId, fetchTick]);\n\n const refetch = useCallback(() => setFetchTick(t => t + 1), []);\n\n return { vault, isLoading, error, refetch };\n}\n","const BASE_URL = 'https://cdn.jsdelivr.net/npm/@aanchal16/surf-widget-sdk/dist';\n\nexport const CDN_IMAGES = {\n USDC: `${BASE_URL}/USDC.svg`,\n BASE_CHAIN: `${BASE_URL}/Base.svg`,\n POLYGON: `${BASE_URL}/Polygon.png`,\n SURF_TOKEN: `${BASE_URL}/SurfToken.png`,\n} as const;\n","import React from 'react';\nimport { CDN_IMAGES } from '../../assets/cdn';\n\nexport interface TokenIconProps {\n symbol: string;\n icon?: string;\n size?: number;\n className?: string;\n}\n\nfunction symbolToColor(symbol: string): string {\n const colors = [\n '#3B82F6', '#8B5CF6', '#10B981', '#F59E0B',\n '#EF4444', '#06B6D4', '#EC4899', '#6366F1',\n ];\n let hash = 0;\n for (let i = 0; i < symbol.length; i++) {\n hash = symbol.charCodeAt(i) + ((hash << 5) - hash);\n }\n return colors[Math.abs(hash) % colors.length];\n}\n\nexport function TokenIcon({ symbol, icon, size = 32, className }: TokenIconProps) {\n const cls = ['surf-token-icon', className].filter(Boolean).join(' ');\n\n if (icon) {\n return (\n <img\n src={icon}\n alt={symbol}\n className={cls}\n style={{ width: size, height: size }}\n />\n );\n }\n\n if (symbol.toUpperCase() === 'USDC') {\n return <img src={CDN_IMAGES.USDC} alt=\"USDC\" className={cls} style={{ width: size, height: size }} />;\n }\n\n const bg = symbolToColor(symbol);\n const initials = symbol.slice(0, 2).toUpperCase();\n const fontSize = Math.floor(size * 0.38);\n\n return (\n <div\n className={cls}\n style={{ width: size, height: size, backgroundColor: bg, fontSize }}\n aria-label={symbol}\n >\n {initials}\n </div>\n );\n}\n","import React from 'react';\n\nexport type ButtonVariant = 'primary' | 'outline' | 'ghost' | 'soft';\nexport type ButtonSize = 'sm' | 'md' | 'lg';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n isLoading?: boolean;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n fullWidth?: boolean;\n}\n\nexport function Button({\n variant = 'primary',\n size = 'md',\n isLoading = false,\n leftIcon,\n rightIcon,\n fullWidth = false,\n children,\n className,\n disabled,\n style,\n ...props\n}: ButtonProps) {\n const classes = [\n 'surf-btn',\n `surf-btn--${variant}`,\n `surf-btn--${size}`,\n fullWidth ? 'surf-btn--full' : '',\n className ?? '',\n ].filter(Boolean).join(' ');\n\n return (\n <button\n className={classes}\n disabled={disabled || isLoading}\n style={style}\n {...props}\n >\n {isLoading ? (\n <span className=\"surf-btn-spinner\" />\n ) : (\n leftIcon && <span style={{ flexShrink: 0, display: 'flex' }}>{leftIcon}</span>\n )}\n {children}\n {!isLoading && rightIcon && (\n <span style={{ flexShrink: 0, display: 'flex' }}>{rightIcon}</span>\n )}\n </button>\n );\n}\n","import React, { useEffect, useRef } from 'react';\n\nexport interface ManageDropdownProps {\n isOpen: boolean;\n onClose: () => void;\n onWithdraw: () => void;\n onViewDeposits: () => void;\n onViewActivities: () => void;\n}\n\nexport function ManageDropdown({ isOpen, onClose, onWithdraw, onViewDeposits, onViewActivities }: ManageDropdownProps) {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!isOpen) return;\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [isOpen, onClose]);\n\n if (!isOpen) return null;\n\n return (\n <div ref={ref} className=\"surf-dropdown surf-fade-in\">\n <button className=\"surf-dropdown-item\" onClick={() => { onWithdraw(); onClose(); }}>\n Withdraw\n </button>\n <button className=\"surf-dropdown-item\" onClick={() => { onViewDeposits(); onClose(); }}>\n View Deposits\n </button>\n <button className=\"surf-dropdown-item\" onClick={() => { onViewActivities(); onClose(); }}>\n Vault Activities\n </button>\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport type { VaultInfo } from '../../types';\nimport { CDN_IMAGES } from '../../assets/cdn';\nimport { TokenIcon } from '../ui/TokenIcon';\nimport { Button } from '../ui/Button';\nimport { ManageDropdown } from './ManageDropdown';\nexport interface VaultCardProps {\n vault: VaultInfo;\n onDeposit: () => void;\n onWithdraw: () => void;\n onViewDeposits: () => void;\n onViewActivities: () => void;\n isSelected?: boolean;\n isLoading?: boolean;\n className?: string;\n}\n\nfunction ChainIcon({ chainId }: { chainId: number }) {\n const src = chainId === 137 ? CDN_IMAGES.POLYGON : CDN_IMAGES.BASE_CHAIN;\n return <img src={src} alt={`chain-${chainId}`} width={14} height={14} className=\"surf-chain-icon\" />;\n}\n\nfunction StatBlock({ label, value, apy = false }: {\n label: string;\n value: React.ReactNode;\n apy?: boolean;\n}) {\n return (\n <div className=\"surf-stat\">\n <span className=\"surf-stat-label\">{label}</span>\n <span className={['surf-stat-value', apy ? 'surf-stat-value--apy' : ''].filter(Boolean).join(' ')}>\n {value}\n </span>\n </div>\n );\n}\n\nexport function VaultCard({\n vault,\n onDeposit,\n onWithdraw,\n onViewDeposits,\n onViewActivities,\n isSelected = false,\n isLoading = false,\n className,\n}: VaultCardProps) {\n const [manageOpen, setManageOpen] = useState(false);\n\n if (isLoading) {\n return (\n <div className={['surf-skeleton-card', className].filter(Boolean).join(' ')}>\n <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 18 }}>\n <div style={{ display: 'flex', gap: 10, alignItems: 'center' }}>\n <div className=\"surf-skeleton\" style={{ width: 44, height: 44, borderRadius: '50%' }} />\n <div>\n <div className=\"surf-skeleton\" style={{ height: 14, width: 120, marginBottom: 6 }} />\n <div className=\"surf-skeleton\" style={{ height: 11, width: 60 }} />\n </div>\n </div>\n <div className=\"surf-skeleton\" style={{ height: 26, width: 110, borderRadius: 6 }} />\n </div>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <div style={{ display: 'flex', gap: 16, alignItems: 'center' }}>\n <div className=\"surf-skeleton\" style={{ height: 32, width: 80 }} />\n <div className=\"surf-skeleton\" style={{ height: 32, width: 60 }} />\n <div className=\"surf-skeleton\" style={{ height: 32, width: 80 }} />\n </div>\n <div style={{ display: 'flex', gap: 8 }}>\n <div className=\"surf-skeleton\" style={{ height: 34, width: 80, borderRadius: 22 }} />\n <div className=\"surf-skeleton\" style={{ height: 34, width: 100, borderRadius: 22 }} />\n </div>\n </div>\n </div>\n );\n }\n\n const balanceFormatted = parseFloat(vault.balance).toLocaleString('en-US', {\n style: 'currency', currency: 'USD',\n });\n const earningsFormatted = parseFloat(vault.earnings).toLocaleString('en-US', {\n style: 'currency', currency: 'USD',\n });\n\n return (\n <div className={['surf-card', isSelected ? 'surf-card--selected' : '', className].filter(Boolean).join(' ')}>\n\n {/* ── TOP ROW: Token left, Balance right ── */}\n <div className=\"surf-card-header\">\n {/* Token info */}\n <div className=\"surf-token-meta\">\n <TokenIcon symbol={vault.token.symbol} icon={vault.token.icon} size={44} />\n <div>\n <p className=\"surf-token-name\">\n {vault.token.name}{' '}\n <span className=\"surf-token-symbol\">{vault.token.symbol}</span>\n </p>\n <div className=\"surf-chain-badge\">\n <ChainIcon chainId={vault.chain.id} />\n <span className=\"surf-chain-name\">{vault.chain.name}</span>\n </div>\n </div>\n </div>\n\n {/* Balance — top right */}\n <p className=\"surf-balance-amount\">{balanceFormatted}</p>\n </div>\n\n {/* ── BOTTOM ROW: Stats left, Buttons right ── */}\n <div className=\"surf-card-bottom\">\n {/* Stats */}\n <div className=\"surf-stats-row\">\n <StatBlock label=\"Earnings\" value={earningsFormatted} />\n <div className=\"surf-stat-divider\" />\n <StatBlock label=\"APY\" value={vault.apy.toFixed(2) + '%'} apy />\n <div className=\"surf-stat-divider\" />\n <StatBlock\n label=\"Withdrawal\"\n value={\n vault.withdrawalType === 'instant'\n ? <span style={{ display: 'inline-flex', alignItems: 'center', gap: 2 }}>Instant <span style={{ fontSize: 13 }}>⚡</span></span>\n : 'Standard'\n }\n />\n </div>\n\n {/* Buttons */}\n <div className=\"surf-actions\">\n <Button variant=\"outline\" size=\"md\" onClick={onDeposit}>\n Deposit\n </Button>\n\n <div className=\"surf-dropdown-wrap\">\n <Button\n variant=\"primary\"\n size=\"md\"\n onClick={() => setManageOpen(v => !v)}\n rightIcon={\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" strokeWidth=\"2.5\"\n style={{ transition: 'transform 0.2s', transform: manageOpen ? 'rotate(180deg)' : 'none' }}>\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n }\n >\n Manage\n </Button>\n <ManageDropdown\n isOpen={manageOpen}\n onClose={() => setManageOpen(false)}\n onWithdraw={onWithdraw}\n onViewDeposits={onViewDeposits}\n onViewActivities={onViewActivities}\n />\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSurf } from '../context/SurfContext';\nimport type { VaultActivity, AgentMessage } from '../types';\n\nfunction mapMessage(msg: AgentMessage): VaultActivity {\n const isWithdraw = msg.transactionType?.toUpperCase().includes('WITHDRAWAL') ||\n msg.transactionType?.toUpperCase().includes('WITHDRAW');\n const version = msg.vaultVersion ? ` ${msg.vaultVersion.toUpperCase()}` : '';\n const protocol = msg.executedBy === 'AGENT' ? `Surf Agent${version}` : `Surf${version}`;\n return {\n id: msg.txHash,\n type: isWithdraw ? 'withdraw' : 'deposit',\n description: msg.message,\n protocol,\n timestamp: new Date(msg.timestamp).getTime(),\n txHash: msg.txHash,\n };\n}\n\nexport interface UseAgentMessagesReturn {\n activities: VaultActivity[];\n isLoading: boolean;\n refetch: () => void;\n}\n\nexport function useAgentMessages(): UseAgentMessagesReturn {\n const { surfClient, walletAddress } = useSurf();\n const [activities, setActivities] = useState<VaultActivity[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [tick, setTick] = useState(0);\n\n useEffect(() => {\n let cancelled = false;\n setIsLoading(true);\n surfClient\n .getAgentMessages(walletAddress)\n .then(result => {\n if (cancelled) return;\n // Handle both: direct array or paginated { messages: [...] }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const msgs: AgentMessage[] = Array.isArray(result) ? result : ((result as any).messages ?? []);\n setActivities(msgs.map(mapMessage));\n })\n .catch(() => { if (!cancelled) setActivities([]); })\n .finally(() => { if (!cancelled) setIsLoading(false); });\n return () => { cancelled = true; };\n }, [surfClient, walletAddress, tick]);\n\n const refetch = useCallback(() => setTick(t => t + 1), []);\n return { activities, isLoading, refetch };\n}\n","import React, { useEffect, useRef } from 'react';\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n children: React.ReactNode;\n className?: string;\n}\n\nexport function Modal({ isOpen, onClose, children, className }: ModalProps) {\n const overlayRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!isOpen) return;\n const handleKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [isOpen, onClose]);\n\n if (!isOpen) return null;\n\n return (\n <div\n ref={overlayRef}\n className=\"surf-modal-overlay surf-fade-in\"\n onClick={(e) => { if (e.target === overlayRef.current) onClose(); }}\n >\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n className={['surf-modal', className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nexport interface Tab {\n id: string;\n label: string;\n}\n\nexport interface TabsProps {\n tabs: Tab[];\n activeTab: string;\n onChange: (id: string) => void;\n className?: string;\n variant?: 'pill' | 'underline';\n}\n\nexport function Tabs({ tabs, activeTab, onChange, className, variant = 'underline' }: TabsProps) {\n const wrapClass = [\n 'surf-tabs',\n variant === 'pill' ? 'surf-tabs--pill' : 'surf-tabs--underline',\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <div className={wrapClass}>\n {tabs.map((tab) => (\n <button\n key={tab.id}\n onClick={() => onChange(tab.id)}\n className={['surf-tab', tab.id === activeTab ? 'surf-tab--active' : ''].filter(Boolean).join(' ')}\n >\n {tab.label}\n </button>\n ))}\n </div>\n );\n}\n","import React, { useState, useEffect } from \"react\";\nimport { CDN_IMAGES } from '../../assets/cdn';\nimport { useSurf } from \"../../context/SurfContext\";\nimport { useAgentMessages } from \"../../hooks/useAgentMessages\";\nimport type { VaultActivity, VaultDeposit, VaultInfo } from \"../../types\";\nimport { Modal } from \"../ui/Modal\";\nimport { Tabs } from \"../ui/Tabs\";\nimport { Button } from \"../ui/Button\";\nimport { TokenIcon } from \"../ui/TokenIcon\";\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nconst CHAIN_NAMES: Record<number, string> = {\n 8453: \"Base\",\n 137: \"Polygon\",\n 84532: \"Base Sepolia\",\n};\n\nfunction TimeAgo({ timestamp }: { timestamp: number }) {\n const diff = Date.now() - timestamp;\n const days = Math.floor(diff / 86400000);\n const hours = Math.floor(diff / 3600000);\n const minutes = Math.floor(diff / 60000);\n if (days >= 1)\n return (\n <span>\n {days} day{days === 1 ? \"\" : \"s\"} ago\n </span>\n );\n if (hours >= 1)\n return (\n <span>\n {hours} hour{hours === 1 ? \"\" : \"s\"} ago\n </span>\n );\n return <span>{Math.max(minutes, 1)} min ago</span>;\n}\n\nfunction ChainLogo({\n chainId,\n size = 16,\n}: {\n chainId?: number;\n size?: number;\n}) {\n return (\n <img\n src={chainId === 137 ? CDN_IMAGES.POLYGON : CDN_IMAGES.BASE_CHAIN}\n alt={CHAIN_NAMES[chainId ?? 8453] ?? \"Base\"}\n width={size}\n height={size}\n />\n );\n}\n\n// ─── Activity Row ─────────────────────────────────────────────────────────────\n\nfunction ActivityRow({ activity }: { activity: VaultActivity }) {\n const isIn = activity.type === \"deposit\";\n return (\n <div className=\"surf-activity-item\">\n <div\n className={[\n \"surf-activity-icon\",\n isIn ? \"surf-activity-icon--in\" : \"surf-activity-icon--out\",\n ].join(\" \")}\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={isIn ? \"#10B981\" : \"#EF4444\"}\n strokeWidth=\"2.5\"\n >\n {isIn ? (\n <>\n <path d=\"M7 7l10 10M17 7v10H7\" />\n </>\n ) : (\n <>\n <path d=\"M17 17L7 7M7 17V7h10\" />\n </>\n )}\n </svg>\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <p className=\"surf-activity-desc\">{activity.description}</p>\n <div className=\"surf-activity-meta\">\n <span className=\"surf-activity-protocol\">\n <img src={CDN_IMAGES.SURF_TOKEN} alt=\"Surf\" width={16} height={16} />{\" \"}\n {activity.protocol} · <TimeAgo timestamp={activity.timestamp} />\n </span>\n {activity.txHash && (\n <a\n href={`https://basescan.org/tx/${activity.txHash}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"surf-activity-link\"\n >\n View Transaction\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M5 12h14M12 5l7 7-7 7\" />\n </svg>\n </a>\n )}\n </div>\n </div>\n </div>\n );\n}\n\n// ─── Deposits Table ───────────────────────────────────────────────────────────\n\nfunction DepositRow({\n deposit,\n onWithdraw,\n onDeposit,\n}: {\n deposit: VaultDeposit;\n onWithdraw: () => void;\n onDeposit: () => void;\n}) {\n return (\n <tr className=\"surf-deposits-tr\">\n <td className=\"surf-deposits-td\">\n <div className=\"surf-deposits-token\">\n <TokenIcon\n symbol={deposit.token.symbol}\n icon={deposit.token.icon}\n size={22}\n />\n {deposit.token.symbol}\n </div>\n </td>\n <td className=\"surf-deposits-td\">\n <div className=\"surf-deposits-chain\">\n <ChainLogo chainId={deposit.chain.id} size={16} />\n {deposit.chain.name}\n </div>\n </td>\n <td className=\"surf-deposits-td\">{deposit.amount}</td>\n <td className=\"surf-deposits-td\">{deposit.earned}</td>\n <td className=\"surf-deposits-td\">\n <div className=\"surf-deposits-actions\">\n <button className=\"surf-link-btn\" onClick={onWithdraw}>\n Withdraw\n </button>\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={onDeposit}\n style={{ borderRadius: 50 }}\n >\n Deposit\n </Button>\n {deposit.vaultUrl && (\n <a\n href={deposit.vaultUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"surf-ext-link\"\n >\n Vault\n <svg\n width=\"11\"\n height=\"11\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6M15 3h6v6M10 14 21 3\" />\n </svg>\n </a>\n )}\n </div>\n </td>\n </tr>\n );\n}\n\n// ─── Main Component ───────────────────────────────────────────────────────────\n\nexport interface VaultActivityModalProps {\n isOpen: boolean;\n onClose: () => void;\n initialTab?: \"activities\" | \"deposits\";\n vault?: VaultInfo | null;\n onWithdraw?: () => void;\n onDeposit?: () => void;\n}\n\nconst TABS = [\n { id: \"activities\", label: \"Activities\" },\n { id: \"deposits\", label: \"Deposits\" },\n];\n\nexport function VaultActivityModal({\n isOpen,\n onClose,\n initialTab = \"activities\",\n vault,\n onWithdraw,\n onDeposit,\n}: VaultActivityModalProps) {\n const [activeTab, setActiveTab] = useState<string>(initialTab);\n const { activities, isLoading: loadingAct } = useAgentMessages();\n\n // Show a single row for the primary token on the user's chain\n const deposits: VaultDeposit[] =\n vault && parseFloat(vault.balance) > 0\n ? [\n {\n id: vault.token.address || vault.token.symbol,\n token: { symbol: vault.token.symbol, icon: vault.token.icon },\n chain: { name: vault.chain.name, id: vault.chain.id },\n amount: `${parseFloat(vault.balance).toLocaleString(\"en-US\", { minimumFractionDigits: 2 })} ${vault.token.symbol}`,\n earned: `${parseFloat(vault.earnings).toLocaleString(\"en-US\", { minimumFractionDigits: 2 })} ${vault.token.symbol}`,\n },\n ]\n : [];\n const loadingDep = false;\n\n useEffect(() => {\n setActiveTab(initialTab);\n }, [initialTab]);\n\n return (\n <Modal isOpen={isOpen} onClose={onClose} className=\"surf-modal--wide\">\n {/* Close */}\n <button className=\"surf-modal-close\" onClick={onClose} aria-label=\"Close\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n >\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </button>\n\n {/* Tabs */}\n <div style={{ padding: \"20px 20px 0\" }}>\n <Tabs\n tabs={TABS}\n activeTab={activeTab}\n onChange={setActiveTab}\n variant=\"pill\"\n />\n </div>\n\n {/* Activities */}\n {activeTab === \"activities\" && (\n <div className=\"surf-modal-body\">\n {loadingAct ? (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 10 }}>\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"surf-skeleton\"\n style={{ height: 72, borderRadius: 12 }}\n />\n ))}\n </div>\n ) : activities.length === 0 ? (\n <div className=\"surf-empty\">No activities yet</div>\n ) : (\n <div className=\"surf-activity-list\">\n {activities.map((a) => (\n <ActivityRow key={a.id} activity={a} />\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* Deposits */}\n {activeTab === \"deposits\" && (\n <div className=\"surf-modal-body\" style={{ overflowX: \"auto\" }}>\n {loadingDep ? (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 10 }}>\n {[1, 2].map((i) => (\n <div key={i} className=\"surf-skeleton\" style={{ height: 44 }} />\n ))}\n </div>\n ) : deposits.length === 0 ? (\n <div className=\"surf-empty\">No open deposits</div>\n ) : (\n <table className=\"surf-deposits-table\">\n <thead>\n <tr>\n <th className=\"surf-deposits-th\">Token</th>\n <th className=\"surf-deposits-th\">Blockchain</th>\n <th className=\"surf-deposits-th\">Amount</th>\n <th className=\"surf-deposits-th\">Earned</th>\n <th\n className=\"surf-deposits-th\"\n style={{ textAlign: \"right\" }}\n >\n Actions\n </th>\n </tr>\n </thead>\n <tbody>\n {deposits.map((d) => (\n <DepositRow\n key={d.id}\n deposit={d}\n onWithdraw={() => {\n onClose();\n onWithdraw?.();\n }}\n onDeposit={() => {\n onClose();\n onDeposit?.();\n }}\n />\n ))}\n </tbody>\n </table>\n )}\n </div>\n )}\n </Modal>\n );\n}\n","import { useState, useCallback, useEffect, useRef } from 'react';\nimport { useSurf } from '../context/SurfContext';\nimport type { DepositStep, VaultInfo } from '../types';\n\nexport interface UseDepositReturn {\n step: DepositStep;\n isProcessing: boolean;\n execute: (amount: string, vault: VaultInfo) => Promise<void>;\n reset: () => void;\n}\n\nconst IDLE: DepositStep = { id: 'idle' };\n\nexport function useDeposit(): UseDepositReturn {\n const { surfClient, walletAddress, onSuccess, onError } = useSurf();\n const [step, setStep] = useState<DepositStep>(IDLE);\n const stepRef = useRef(step);\n stepRef.current = step;\n\n const isProcessing =\n step.id !== 'idle' && step.id !== 'success' && step.id !== 'error';\n\n // Listen for approve tx hash emitted by the SDK\n useEffect(() => {\n const handler = ({ txHash }: { txHash: string }) => {\n setStep({ id: 'approving', txHash });\n };\n surfClient.on('deposit:approved', handler);\n return () => surfClient.off('deposit:approved', handler);\n }, [surfClient]);\n\n const execute = useCallback(\n async (amount: string, vault: VaultInfo) => {\n try {\n // ── Step 1: Create vault if it doesn't exist yet ─────────────────────\n if (!vault.userVaultAddress) {\n setStep({ id: 'creating_contract' });\n const deployed = await surfClient.deployVault();\n setStep({ id: 'creating_contract', txHash: deployed.transactionHash });\n }\n\n // ── Step 2: Approve (SDK fires 'deposit:approved' event with txHash) ─\n setStep({ id: 'approving' });\n\n // ── Step 3: Deposit ──────────────────────────────────────────────────\n const assetAddress = vault.token.address;\n const tx = await surfClient.deposit({ asset: assetAddress, amount });\n\n setStep({ id: 'depositing', txHash: tx.hash });\n await tx.wait();\n\n setStep({ id: 'success', txHash: tx.hash, amount });\n if (onSuccess) onSuccess('deposit', tx.hash);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setStep({ id: 'error', error });\n if (onError) onError('deposit', error);\n }\n },\n [surfClient, walletAddress, onSuccess, onError]\n );\n\n const reset = useCallback(() => setStep(IDLE), []);\n\n return { step, isProcessing, execute, reset };\n}\n","import { useState, useCallback } from 'react';\nimport { useSurf } from '../context/SurfContext';\nimport type { WithdrawStep, VaultInfo } from '../types';\n\nexport interface UseWithdrawReturn {\n step: WithdrawStep;\n isProcessing: boolean;\n execute: (amount: string, vault: VaultInfo) => Promise<void>;\n reset: () => void;\n}\n\nconst IDLE: WithdrawStep = { id: 'idle' };\n\nexport function useWithdraw(): UseWithdrawReturn {\n const { surfClient, onSuccess, onError } = useSurf();\n const [step, setStep] = useState<WithdrawStep>(IDLE);\n\n const isProcessing =\n step.id !== 'idle' && step.id !== 'success' && step.id !== 'error';\n\n const execute = useCallback(\n async (amount: string, vault: VaultInfo) => {\n try {\n setStep({ id: 'closing_position' });\n\n const tx = await surfClient.withdraw({\n asset: vault.token.address,\n amount: amount || undefined,\n });\n\n setStep({ id: 'closing_position', txHash: tx.hash });\n setStep({ id: 'redeeming_reward' });\n\n await tx.wait();\n\n setStep({ id: 'redeeming_reward', txHash: tx.hash });\n setStep({ id: 'success', txHash: tx.hash, amount });\n if (onSuccess) onSuccess('withdraw', tx.hash);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setStep({ id: 'error', error });\n if (onError) onError('withdraw', error);\n }\n },\n [surfClient, onSuccess, onError]\n );\n\n const reset = useCallback(() => setStep(IDLE), []);\n\n return { step, isProcessing, execute, reset };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSurf } from '../context/SurfContext';\n\nexport interface UseBalanceReturn {\n balance: string;\n isLoading: boolean;\n refetch: () => void;\n}\n\n/** Convert raw on-chain wei (bigint or string) to a human-readable decimal string */\nexport function fromWei(raw: bigint | string, decimals: number = 6): string {\n const safeDecimals = decimals || 6;\n const n = typeof raw === 'bigint' ? raw : BigInt(Math.round(parseFloat(String(raw))));\n const divisor = BigInt(10 ** safeDecimals);\n const whole = n / divisor;\n const remainder = n % divisor;\n if (remainder === 0n) return whole.toString();\n const frac = remainder.toString().padStart(safeDecimals, '0').replace(/0+$/, '');\n return `${whole}.${frac}`;\n}\n\n/**\n * Convert a human-readable decimal amount to a raw on-chain integer string.\n * e.g. toWei(\"1.42\", 6) → \"1420000\"\n */\nexport function toWei(amount: string, decimals: number): string {\n const [whole, frac = ''] = amount.split('.');\n const fracPadded = frac.padEnd(decimals, '0').slice(0, decimals);\n return (BigInt(whole || '0') * BigInt(10 ** decimals) + BigInt(fracPadded || '0')).toString();\n}\n\n/**\n * Fetch the wallet's spendable token balance — used in the Deposit form.\n * getTokenBalance returns a raw bigint (uint256 wei) from ERC20 balanceOf.\n */\nexport function useDepositBalance(tokenAddress: string, decimals = 6): UseBalanceReturn {\n const { surfClient, walletAddress } = useSurf();\n const [balance, setBalance] = useState('0');\n const [isLoading, setIsLoading] = useState(false);\n const [tick, setTick] = useState(0);\n\n useEffect(() => {\n if (!tokenAddress) return;\n let cancelled = false;\n setIsLoading(true);\n surfClient\n .getTokenBalance(tokenAddress, walletAddress)\n .then(raw => {\n console.log('[useDepositBalance] raw:', raw, '| type:', typeof raw, '| token:', tokenAddress);\n if (!cancelled) setBalance(fromWei(raw as bigint, decimals));\n })\n .catch(err => {\n console.error('[useDepositBalance] error:', err);\n if (!cancelled) setBalance('0');\n })\n .finally(() => { if (!cancelled) setIsLoading(false); });\n return () => { cancelled = true; };\n }, [surfClient, walletAddress, tokenAddress, decimals, tick]);\n\n const refetch = useCallback(() => setTick(t => t + 1), []);\n return { balance, isLoading, refetch };\n}\n\n/**\n * Fetch the max withdrawable amount from the vault — used in the Withdraw form.\n * getWithdrawableAmount returns a raw bigint (uint256 wei) from the vault contract.\n */\nexport function useWithdrawableBalance(assetAddress: string, vaultAddress?: string, decimals = 6): UseBalanceReturn {\n const { surfClient } = useSurf();\n const [balance, setBalance] = useState('0');\n const [isLoading, setIsLoading] = useState(false);\n const [tick, setTick] = useState(0);\n\n useEffect(() => {\n if (!assetAddress) return;\n let cancelled = false;\n setIsLoading(true);\n surfClient\n .getWithdrawableAmount(assetAddress, vaultAddress)\n .then(raw => {\n console.log('[useWithdrawableBalance] raw:', raw, '| type:', typeof raw, '| asset:', assetAddress);\n if (!cancelled) setBalance(fromWei(raw as bigint, decimals));\n })\n .catch(err => {\n console.error('[useWithdrawableBalance] error:', err);\n if (!cancelled) setBalance('0');\n })\n .finally(() => { if (!cancelled) setIsLoading(false); });\n return () => { cancelled = true; };\n }, [surfClient, assetAddress, vaultAddress, decimals, tick]);\n\n const refetch = useCallback(() => setTick(t => t + 1), []);\n return { balance, isLoading, refetch };\n}\n","import React from 'react';\n\nexport type StepStatus = 'pending' | 'active' | 'completed' | 'error';\n\nexport interface Step {\n id: string;\n title: string;\n description: string;\n status: StepStatus;\n txHash?: string;\n}\n\nexport interface StepProgressProps {\n steps: Step[];\n className?: string;\n baseExplorerUrl?: string;\n}\n\nfunction StatusIcon({ status }: { status: StepStatus }) {\n if (status === 'completed') {\n return (\n <div className=\"surf-step-icon surf-step-icon--completed\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"3\">\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n </div>\n );\n }\n if (status === 'active') {\n return (\n <div className=\"surf-step-icon surf-step-icon--active\">\n <span className=\"surf-step-active-dot\" />\n </div>\n );\n }\n if (status === 'error') {\n return (\n <div className=\"surf-step-icon surf-step-icon--error\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#ef4444\" strokeWidth=\"3\">\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </div>\n );\n }\n return <div className=\"surf-step-icon surf-step-icon--pending\" />;\n}\n\nconst ExternalIcon = () => (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6M15 3h6v6M10 14 21 3\" />\n </svg>\n);\n\nexport function StepProgress({ steps, className, baseExplorerUrl = 'https://basescan.org/tx/' }: StepProgressProps) {\n return (\n <div className={['surf-steps', className].filter(Boolean).join(' ')}>\n {steps.map((step, i) => (\n <div key={step.id} className={['surf-step', `surf-step--${step.status}`].join(' ')}>\n\n {/* Icon + connecting line */}\n <div className=\"surf-step-icon-col\">\n <StatusIcon status={step.status} />\n {i < steps.length - 1 && (\n <div className={[\n 'surf-step-line',\n step.status === 'completed' ? 'surf-step-line--done' : '',\n step.status === 'active' ? 'surf-step-line--active' : '',\n ].filter(Boolean).join(' ')} />\n )}\n </div>\n\n {/* Title + description */}\n <div className=\"surf-step-body\">\n <p className=\"surf-step-title\">{step.title}</p>\n <p className=\"surf-step-desc\">{step.description}</p>\n </div>\n\n {/* Explore link — always visible, only active with txHash */}\n <div className=\"surf-step-explore\">\n {step.txHash ? (\n <a\n href={`${baseExplorerUrl}${step.txHash}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"surf-step-link\"\n >\n Explore <ExternalIcon />\n </a>\n ) : (\n <span className=\"surf-step-link surf-step-link--ghost\">\n Explore <ExternalIcon />\n </span>\n )}\n </div>\n\n </div>\n ))}\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { CDN_IMAGES } from '../assets/cdn';\nimport { useSurf } from \"../context/SurfContext\";\nimport { useDeposit } from \"../hooks/useDeposit\";\nimport { useWithdraw } from \"../hooks/useWithdraw\";\nimport { useDepositBalance, useWithdrawableBalance } from \"../hooks/useBalance\";\nimport type { VaultInfo, DepositStep, WithdrawStep } from \"../types\";\nimport { Modal } from \"./ui/Modal\";\nimport { Button } from \"./ui/Button\";\nimport { Tabs } from \"./ui/Tabs\";\nimport { StepProgress } from \"./ui/StepProgress\";\nimport { TokenIcon } from \"./ui/TokenIcon\";\nimport type { Step } from \"./ui/StepProgress\";\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nconst PCTS = [10, 25, 50, 100];\n\nfunction truncate(addr: string) {\n return addr.length < 10 ? addr : `${addr.slice(0, 6)}...${addr.slice(-4)}`;\n}\n\nfunction floor2(n: number): string {\n return (Math.floor(n * 100) / 100).toFixed(2);\n}\n\nfunction cleanError(err: { message?: string } | string): string {\n const raw = typeof err === 'string' ? err : (err?.message ?? '');\n if (!raw) return 'Transaction failed. Please try again.';\n const lower = raw.toLowerCase();\n if (lower.includes('user rejected') || lower.includes('user denied')) return 'Transaction rejected by wallet.';\n if (lower.includes('insufficient funds')) return 'Insufficient funds for transaction.';\n if (lower.includes('execution reverted')) return 'Transaction reverted by contract.';\n if (lower.includes('nonce')) return 'Nonce error — please reset your wallet and retry.';\n if (lower.includes('network') || lower.includes('disconnected')) return 'Network error. Check your connection.';\n const sentence = raw.split(/[.(]/)[0].trim();\n return sentence.length > 0 && sentence.length <= 100 ? sentence : 'Transaction failed. Please try again.';\n}\n\nconst CheckIcon = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"2.5\">\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n);\n\nconst ExploreIcon = () => (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6M15 3h6v6M10 14 21 3\" />\n </svg>\n);\n\nconst RefreshIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\">\n <path d=\"M1 4v6h6M23 20v-6h-6\" />\n <path d=\"M20.49 9A9 9 0 005.64 5.64L1 10M23 14l-4.64 4.36A9 9 0 013.51 15\" />\n </svg>\n);\n\n// ─── Deposit form ─────────────────────────────────────────────────────────────\n\nfunction DepositForm({\n vault, amount, availableBalance, isBalanceLoading,\n onAmountChange, onSubmit, onRefreshBalance, onSwitchTab,\n}: {\n vault: VaultInfo; amount: string; availableBalance: string;\n isBalanceLoading: boolean; onAmountChange: (v: string) => void;\n onSubmit: () => void; onRefreshBalance: () => void;\n onSwitchTab: (tab: string) => void;\n}) {\n const available = parseFloat(availableBalance) || 0;\n const amountNum = parseFloat(amount) || 0;\n const isValid = amountNum > 0 && amountNum <= available;\n\n return (\n <div className=\"surf-modal-body\">\n <Tabs\n tabs={[{ id: \"deposit\", label: \"Deposit\" }, { id: \"withdraw\", label: \"Withdraw\" }]}\n activeTab=\"deposit\"\n onChange={onSwitchTab}\n variant=\"pill\"\n />\n <p className=\"surf-modal-subtitle\" style={{ marginTop: 14, textAlign: \"center\" }}>\n Your surf is ready! Enter your deposit to activate\n </p>\n <div style={{ display: \"flex\", gap: 12, marginBottom: 16 }}>\n <div className=\"surf-field\" style={{ flex: 1, marginBottom: 0 }}>\n <span className=\"surf-label\">Token</span>\n <div className=\"surf-select-box\">\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 2 }}>\n <TokenIcon symbol={vault.token.symbol} icon={vault.token.icon} size={26} />\n <span style={{ fontSize: 14, fontWeight: 600 }}>{vault.token.symbol}</span>\n </div>\n <span className=\"surf-select-box--apy\">{vault.apy.toFixed(2)}% APY</span>\n </div>\n </div>\n <div className=\"surf-field\" style={{ flex: 1, marginBottom: 0 }}>\n <span className=\"surf-label\">Blockchain</span>\n <div className=\"surf-select-box\">\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 7 }}>\n <img src={vault.chain.id === 137 ? CDN_IMAGES.POLYGON : CDN_IMAGES.BASE_CHAIN} alt={vault.chain.name} width={18} height={18} />\n <span style={{ fontSize: 13, fontWeight: 500 }}>{vault.chain.name}</span>\n </div>\n </div>\n </div>\n </div>\n <div className=\"surf-amount-box\">\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", marginBottom: 8 }}>\n <span className=\"surf-label\" style={{ margin: 0 }}>Enter Amount</span>\n <div style={{ display: \"flex\", gap: 10 }}>\n {PCTS.map((p) => (\n <button key={p} className=\"surf-pct-link\" onClick={() => onAmountChange(((available * p) / 100).toFixed(2))}>\n {p}%\n </button>\n ))}\n </div>\n </div>\n <input type=\"number\" value={amount} onChange={(e) => onAmountChange(e.target.value)} placeholder=\"0\" min=\"0\" step=\"any\" className=\"surf-amount-input\" />\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", marginTop: 8 }}>\n <span className=\"surf-amount-hint\">Min 100 {vault.token.symbol}</span>\n <span className=\"surf-amount-hint\">\n Available: {isBalanceLoading ? \"...\" : available.toLocaleString(\"en-US\", { minimumFractionDigits: 2 })} {vault.token.symbol}\n <button className=\"surf-refresh-btn\" onClick={onRefreshBalance} title=\"Refresh balance\"><RefreshIcon /></button>\n </span>\n </div>\n </div>\n <Button variant=\"primary\" size=\"lg\" fullWidth disabled={!isValid} onClick={onSubmit} style={{ borderRadius: 50, marginTop: 16 }}>\n Deposit {vault.token.symbol}\n </Button>\n <p className=\"surf-disclaimer\" style={{ marginTop: 10 }}>\n You'll need Base-bridged ETH to deposit. After activation, all agent fees are covered. By activating Surf, you agree to the{\" \"}\n <a href=\"https://surfliquid.com/terms\" target=\"_blank\" rel=\"noopener noreferrer\">platform terms</a>{\" \"}\n and <a href=\"https://surfliquid.com/privacy\" target=\"_blank\" rel=\"noopener noreferrer\">privacy policy</a>,\n and acknowledge that returns may vary according to market conditions and selected strategy\n </p>\n </div>\n );\n}\n\n// ─── Withdraw form ────────────────────────────────────────────────────────────\n\nfunction WithdrawForm({\n vault, amount, walletAddress, withdrawableBalance, isBalanceLoading,\n onAmountChange, onSubmit, onRefreshBalance, onSwitchTab,\n}: {\n vault: VaultInfo; amount: string; walletAddress: string;\n withdrawableBalance: string; isBalanceLoading: boolean;\n onAmountChange: (v: string) => void; onSubmit: () => void;\n onRefreshBalance: () => void; onSwitchTab: (tab: string) => void;\n}) {\n const available =\n parseFloat(withdrawableBalance) > 0\n ? parseFloat(withdrawableBalance)\n : parseFloat(vault.availableBalance) || parseFloat(vault.balance) || 0;\n const amountNum = parseFloat(amount) || 0;\n const isValid = amountNum > 0 && amountNum <= available;\n\n return (\n <div className=\"surf-modal-body\">\n <Tabs\n tabs={[{ id: \"deposit\", label: \"Deposit\" }, { id: \"withdraw\", label: \"Withdraw\" }]}\n activeTab=\"withdraw\"\n onChange={onSwitchTab}\n variant=\"pill\"\n />\n <p className=\"surf-modal-subtitle\" style={{ marginTop: 14, textAlign: \"center\" }}>\n Surf will withdraw to your connected wallet{\" \"}\n <span style={{ fontWeight: 600, color: \"var(--surf-text)\" }}>{truncate(walletAddress)}</span>\n </p>\n <div style={{ display: \"flex\", gap: 12, marginBottom: 16 }}>\n <div className=\"surf-field\" style={{ flex: 1, marginBottom: 0 }}>\n <span className=\"surf-label\">Token</span>\n <div className=\"surf-select-box\">\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <TokenIcon symbol={vault.token.symbol} icon={vault.token.icon} size={26} />\n <span style={{ fontSize: 14, fontWeight: 600 }}>{vault.token.symbol}</span>\n </div>\n </div>\n </div>\n <div className=\"surf-field\" style={{ flex: 1, marginBottom: 0 }}>\n <span className=\"surf-label\">Blockchain</span>\n <div className=\"surf-select-box\">\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 7 }}>\n <img src={vault.chain.id === 137 ? CDN_IMAGES.POLYGON : CDN_IMAGES.BASE_CHAIN} alt={vault.chain.name} width={18} height={18} />\n <span style={{ fontSize: 13, fontWeight: 500 }}>{vault.chain.name}</span>\n </div>\n </div>\n </div>\n </div>\n <div className=\"surf-amount-box\">\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", marginBottom: 8 }}>\n <span className=\"surf-label\" style={{ margin: 0 }}>Enter Amount</span>\n <div style={{ display: \"flex\", gap: 10 }}>\n {PCTS.map((p) => (\n <button key={p} className=\"surf-pct-link\" onClick={() => onAmountChange(floor2((available * p) / 100))}>\n {p}%\n </button>\n ))}\n </div>\n </div>\n <input type=\"number\" value={amount} onChange={(e) => onAmountChange(e.target.value)} placeholder=\"0\" min=\"0\" step=\"any\" className=\"surf-amount-input\" />\n <div style={{ display: \"flex\", alignItems: \"flex-end\", justifyContent: \"flex-end\", marginTop: 8 }}>\n <span className=\"surf-amount-hint\">\n Available: {isBalanceLoading ? \"...\" : available.toLocaleString(\"en-US\", { minimumFractionDigits: 2 })} {vault.token.symbol}\n <button className=\"surf-refresh-btn\" onClick={onRefreshBalance} title=\"Refresh balance\"><RefreshIcon /></button>\n </span>\n </div>\n </div>\n <Button variant=\"primary\" size=\"lg\" fullWidth disabled={!isValid} onClick={onSubmit} style={{ borderRadius: 50, marginTop: 16 }}>\n Withdraw funds\n </Button>\n <p className=\"surf-disclaimer\" style={{ marginTop: 10 }}>\n Rewards will also be withdrawn by default\n </p>\n </div>\n );\n}\n\n// ─── Deposit processing / success ─────────────────────────────────────────────\n\nfunction buildDepositSteps(current: DepositStep, vaultExists: boolean): Step[] {\n const order = [\"creating_contract\", \"approving\", \"depositing\"];\n function status(id: string): Step[\"status\"] {\n if (id === \"creating_contract\" && vaultExists) return \"completed\";\n const ci = order.indexOf(current.id);\n const ti = order.indexOf(id);\n if (current.id === \"success\") return \"completed\";\n if (ci === -1) return \"pending\";\n if (ti < ci) return \"completed\";\n if (ti === ci) return \"active\";\n return \"pending\";\n }\n function tx(id: string) { return current.id === id && \"txHash\" in current ? current.txHash : undefined; }\n return [\n { id: \"creating_contract\", title: \"Surf Account Creation\", description: \"Deploy your self-custodial smart contract\", status: status(\"creating_contract\"), txHash: tx(\"creating_contract\") },\n { id: \"approving\", title: \"Approve USDC\", description: \"Grant access for automated strategies\", status: status(\"approving\"), txHash: tx(\"approving\") },\n { id: \"depositing\", title: \"Deposit USDC\", description: \"Fund your Surf Account by depositing\", status: status(\"depositing\"), txHash: tx(\"depositing\") },\n ];\n}\n\nfunction DepositProcessingView({ step, vaultExists, onDashboard, onSwitchTab }: { step: DepositStep; vaultExists: boolean; onDashboard: () => void; onSwitchTab: (tab: string) => void }) {\n const depositDone = step.id === \"depositing\" && \"txHash\" in step && !!step.txHash;\n const isSpinning = !depositDone && step.id !== \"success\" && step.id !== \"error\" && step.id !== \"idle\";\n const label = step.id === \"creating_contract\" ? \"Creating contract\" : step.id === \"approving\" ? \"Approve USDC\" : step.id === \"depositing\" ? \"Access Dashboard\" : \"Processing...\";\n return (\n <div className=\"surf-modal-body\">\n <Tabs\n tabs={[{ id: \"deposit\", label: \"Deposit\" }, { id: \"withdraw\", label: \"Withdraw\" }]}\n activeTab=\"deposit\"\n onChange={onSwitchTab}\n variant=\"pill\"\n />\n <p className=\"surf-modal-subtitle\" style={{ marginTop: 14, textAlign: \"center\" }}>\n Confirm wallet requests to finish agent activation\n </p>\n <StepProgress steps={buildDepositSteps(step, vaultExists)} />\n <div style={{ marginTop: 20 }}>\n <Button variant={depositDone ? \"primary\" : \"soft\"} size=\"lg\" fullWidth isLoading={isSpinning} disabled={!depositDone && step.id !== \"error\"} onClick={depositDone ? onDashboard : undefined} style={{ borderRadius: 50 }}>\n {label}\n </Button>\n </div>\n {step.id === \"error\" && <div className=\"surf-error-box\">⚠ {cleanError(step.error)}</div>}\n </div>\n );\n}\n\n// ─── Withdraw processing / success ────────────────────────────────────────────\n\nfunction buildWithdrawSteps(current: WithdrawStep, amount: string, symbol: string): Step[] {\n const order = [\"closing_position\", \"redeeming_reward\"];\n function status(id: string): Step[\"status\"] {\n const ci = order.indexOf(current.id);\n const ti = order.indexOf(id);\n if (current.id === \"success\") return \"completed\";\n if (ci === -1) return \"pending\";\n if (ti < ci) return \"completed\";\n if (ti === ci) return \"active\";\n return \"pending\";\n }\n function tx(id: string) { return current.id === id && \"txHash\" in current ? current.txHash : undefined; }\n return [\n { id: \"closing_position\", title: \"Close current position\", description: `Withdraw ${parseFloat(amount || \"0\").toFixed(2)} ${symbol} from Vault`, status: status(\"closing_position\"), txHash: tx(\"closing_position\") },\n { id: \"redeeming_reward\", title: \"Redeem Reward\", description: \"Transferring to your wallet\", status: status(\"redeeming_reward\"), txHash: tx(\"redeeming_reward\") },\n ];\n}\n\nfunction WithdrawProcessingView({ step, amount, tokenSymbol, walletAddress, onSwitchTab }: { step: WithdrawStep; amount: string; tokenSymbol: string; walletAddress: string; onSwitchTab: (tab: string) => void }) {\n const isSpinning = step.id !== \"success\" && step.id !== \"error\" && step.id !== \"idle\";\n const label = step.id === \"closing_position\" ? \"Withdrawing Funds...\" : step.id === \"redeeming_reward\" ? \"Redeeming Reward...\" : \"Processing...\";\n return (\n <div className=\"surf-modal-body\">\n <Tabs\n tabs={[{ id: \"deposit\", label: \"Deposit\" }, { id: \"withdraw\", label: \"Withdraw\" }]}\n activeTab=\"withdraw\"\n onChange={onSwitchTab}\n variant=\"pill\"\n />\n <p className=\"surf-modal-subtitle\" style={{ marginTop: 14, textAlign: \"center\" }}>\n Surf is resolving all your positions and withdrawing to your connected wallet <strong>{truncate(walletAddress)}</strong>\n </p>\n <StepProgress steps={buildWithdrawSteps(step, amount, tokenSymbol)} />\n <div style={{ marginTop: 20 }}>\n <Button variant=\"soft\" size=\"lg\" fullWidth isLoading={isSpinning} disabled={step.id !== \"error\"} style={{ borderRadius: 50 }}>\n {label}\n </Button>\n </div>\n {step.id === \"error\" && <div className=\"surf-error-box\">⚠ {cleanError(step.error)}</div>}\n </div>\n );\n}\n\n// ─── Shared success view ──────────────────────────────────────────────────────\n\nfunction SuccessView({ action, amount, tokenSymbol, walletAddress, txHash, onExplore, onBack }: {\n action: 'deposit' | 'withdraw'; amount: string; tokenSymbol: string;\n walletAddress: string; txHash: string; onExplore: () => void; onBack: () => void;\n}) {\n return (\n <div className=\"surf-success\">\n <div className=\"surf-success-icon\">\n <div className=\"surf-success-icon-inner\"><CheckIcon /></div>\n </div>\n <p className=\"surf-success-title\">You're all done!</p>\n <p className=\"surf-success-desc\">\n Successfully {action === 'deposit' ? 'deposited' : 'withdrew'}{\" \"}\n <strong>{parseFloat(amount).toLocaleString(\"en-US\", { minimumFractionDigits: 2 })} {tokenSymbol}</strong>{\" \"}\n to your wallet <strong>{truncate(walletAddress)}</strong>\n </p>\n <div className=\"surf-success-actions\">\n <Button variant=\"outline\" size=\"md\" style={{ flex: 1 }} onClick={onExplore} rightIcon={<ExploreIcon />}>Explore</Button>\n <Button variant=\"primary\" size=\"md\" style={{ flex: 1 }} onClick={onBack}>Back to dashboard</Button>\n </div>\n </div>\n );\n}\n\n// ─── TransactionModal ─────────────────────────────────────────────────────────\n\nexport interface TransactionModalProps {\n isOpen: boolean;\n initialTab: 'deposit' | 'withdraw';\n onClose: () => void;\n vault: VaultInfo | null;\n}\n\nconst DEFAULT_VAULT: VaultInfo = {\n token: { symbol: \"USDC\", name: \"USD Coin\", decimals: 6, address: \"\" },\n chain: { name: \"Base\", id: 8453 },\n balance: \"0.00\", earnings: \"0.00\", apy: 0,\n withdrawalType: \"instant\", availableBalance: \"0.00\",\n};\n\nexport function TransactionModal({ isOpen, initialTab, onClose, vault }: TransactionModalProps) {\n const { walletAddress } = useSurf();\n const activeVault = vault ?? DEFAULT_VAULT;\n\n const [activeTab, setActiveTab] = useState<'deposit' | 'withdraw'>(initialTab);\n const [depositAmount, setDepositAmount] = useState(\"\");\n const [withdrawAmount, setWithdrawAmount] = useState(\"\");\n\n const { step: depositStep, execute: executeDeposit, reset: resetDeposit } = useDeposit();\n const { step: withdrawStep, execute: executeWithdraw, reset: resetWithdraw } = useWithdraw();\n\n const { balance: availableBalance, isLoading: isDepositBalanceLoading, refetch: refetchDepositBalance } =\n useDepositBalance(activeVault.token.address, activeVault.token.decimals ?? 6);\n\n const { balance: withdrawableBalance, isLoading: isWithdrawBalanceLoading, refetch: refetchWithdrawBalance } =\n useWithdrawableBalance(activeVault.token.address, activeVault.userVaultAddress, activeVault.token.decimals ?? 6);\n\n // Keep activeTab in sync when initialTab changes (e.g. opened via Deposit vs Withdraw button)\n const prevInitialTab = useState(initialTab)[0];\n if (isOpen && initialTab !== prevInitialTab) {\n setActiveTab(initialTab);\n }\n\n function switchTab(tab: string) {\n if (tab === activeTab) return;\n if (tab === 'deposit') { resetWithdraw(); setWithdrawAmount(''); }\n else { resetDeposit(); setDepositAmount(''); }\n setActiveTab(tab as 'deposit' | 'withdraw');\n }\n\n function handleClose() {\n resetDeposit();\n resetWithdraw();\n setDepositAmount('');\n setWithdrawAmount('');\n onClose();\n }\n\n const depositIdle = depositStep.id === 'idle';\n const depositSuccess = depositStep.id === 'success';\n const withdrawIdle = withdrawStep.id === 'idle';\n const withdrawSuccess = withdrawStep.id === 'success';\n\n function renderContent() {\n if (activeTab === 'deposit') {\n if (depositSuccess && depositStep.id === 'success') {\n return (\n <SuccessView\n action=\"deposit\"\n amount={depositStep.amount}\n tokenSymbol={activeVault.token.symbol}\n walletAddress={walletAddress}\n txHash={depositStep.txHash}\n onExplore={() => window.open(`https://basescan.org/tx/${depositStep.txHash}`, \"_blank\")}\n onBack={handleClose}\n />\n );\n }\n if (!depositIdle) {\n return (\n <DepositProcessingView\n step={depositStep}\n vaultExists={!!activeVault.userVaultAddress}\n onDashboard={handleClose}\n onSwitchTab={switchTab}\n />\n );\n }\n return (\n <DepositForm\n vault={activeVault}\n amount={depositAmount}\n availableBalance={availableBalance}\n isBalanceLoading={isDepositBalanceLoading}\n onAmountChange={setDepositAmount}\n onSubmit={() => depositAmount && executeDeposit(depositAmount, activeVault)}\n onRefreshBalance={refetchDepositBalance}\n onSwitchTab={switchTab}\n />\n );\n }\n\n // withdraw tab\n if (withdrawSuccess && withdrawStep.id === 'success') {\n return (\n <SuccessView\n action=\"withdraw\"\n amount={withdrawStep.amount}\n tokenSymbol={activeVault.token.symbol}\n walletAddress={walletAddress}\n txHash={withdrawStep.txHash}\n onExplore={() => window.open(`https://basescan.org/tx/${withdrawStep.txHash}`, \"_blank\")}\n onBack={handleClose}\n />\n );\n }\n if (!withdrawIdle) {\n return (\n <WithdrawProcessingView\n step={withdrawStep}\n amount={withdrawAmount}\n tokenSymbol={activeVault.token.symbol}\n walletAddress={walletAddress}\n onSwitchTab={switchTab}\n />\n );\n }\n return (\n <WithdrawForm\n vault={activeVault}\n amount={withdrawAmount}\n walletAddress={walletAddress}\n withdrawableBalance={withdrawableBalance}\n isBalanceLoading={isWithdrawBalanceLoading}\n onAmountChange={setWithdrawAmount}\n onSubmit={() => withdrawAmount && executeWithdraw(withdrawAmount, activeVault)}\n onRefreshBalance={refetchWithdrawBalance}\n onSwitchTab={switchTab}\n />\n );\n }\n\n return (\n <Modal isOpen={isOpen} onClose={handleClose}>\n <button className=\"surf-modal-close\" onClick={handleClose} aria-label=\"Close\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\">\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </button>\n {renderContent()}\n </Modal>\n );\n}\n","import { useRef, useState } from 'react';\nimport { SurfProvider, useSurf } from '../context/SurfContext';\nimport { useVault } from '../hooks/useVault';\nimport { VaultCard } from './VaultCard';\nimport { VaultActivityModal } from './VaultActivity';\nimport { TransactionModal } from './TransactionModal';\nimport type { SurfWidgetProps, VaultInfo } from '../types';\nimport '../styles/widget.css';\n\n// ─── Inner (needs context) ────────────────────────────────────────────────────\n\nfunction WidgetInner() {\n const { vault, isLoading, refetch } = useVault();\n const { chainId } = useSurf();\n\n // Keep the last successfully loaded vault so modals never block after first load\n const lastVaultRef = useRef<VaultInfo | null>(null);\n if (vault) lastVaultRef.current = vault;\n const stableVault = vault ?? lastVaultRef.current;\n\n const [txTab, setTxTab] = useState<'deposit' | 'withdraw' | null>(null);\n const [activityOpen, setActivityOpen] = useState(false);\n const [activityTab, setActivityTab] = useState<'activities' | 'deposits'>('activities');\n\n function openDeposit() { setActivityOpen(false); setTxTab('deposit'); }\n function openWithdraw() { setActivityOpen(false); setTxTab('withdraw'); }\n function openActivity(tab: 'activities' | 'deposits' = 'activities') {\n setTxTab(null);\n setActivityTab(tab); setActivityOpen(true);\n }\n\n const CHAIN_NAMES: Record<number, string> = { 8453: 'Base', 137: 'Polygon' };\n const defaultVault: VaultInfo = {\n token: { symbol: 'USDC', name: 'USD Coin', decimals: 6, address: '' },\n chain: { name: CHAIN_NAMES[chainId] ?? 'Base', id: chainId },\n balance: '0.00', earnings: '0.00', apy: 0,\n withdrawalType: 'instant', availableBalance: '0.00',\n };\n\n return (\n <>\n <VaultCard\n vault={stableVault ?? defaultVault}\n isLoading={isLoading && !stableVault}\n onDeposit={openDeposit}\n onWithdraw={openWithdraw}\n onViewDeposits={() => openActivity('deposits')}\n onViewActivities={() => openActivity('activities')}\n />\n <TransactionModal\n isOpen={txTab !== null}\n initialTab={txTab ?? 'deposit'}\n onClose={() => { setTxTab(null); refetch(); }}\n vault={stableVault}\n />\n <VaultActivityModal\n isOpen={activityOpen}\n onClose={() => setActivityOpen(false)}\n initialTab={activityTab}\n vault={stableVault}\n onWithdraw={openWithdraw}\n onDeposit={openDeposit}\n />\n </>\n );\n}\n\n// ─── SurfWidget (public API) ──────────────────────────────────────────────────\n\n/**\n * Drop-in DeFi yield widget.\n * Pass a SurfClient (from surfliquid) + walletAddress and get the full UI.\n *\n * @example\n * const client = SurfClient.create({ appId: '...', chainId: 8453 });\n * await client.connectWallet('metamask');\n * await client.authenticate();\n *\n * <SurfWidget client={client} walletAddress={address} />\n */\nexport function SurfWidget({ client, walletAddress, chainId, theme, onSuccess, onError, className }: SurfWidgetProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n return (\n <div\n ref={containerRef}\n className={['surf-widget-root', className].filter(Boolean).join(' ')}\n data-surf-widget\n >\n <div className=\"surf-widget-shell\">\n <SurfProvider\n config={{ client, walletAddress, chainId, theme, onSuccess, onError }}\n containerRef={containerRef}\n >\n <WidgetInner />\n </SurfProvider>\n </div>\n </div>\n );\n}\n","import React, { useState } from 'react';\n\nconst API_BASE = 'https://e609-106-219-158-226.ngrok-free.app';\n\ntype Step = 'register' | 'verify' | 'done';\n\ninterface Credentials {\n appId: string;\n apiSecret: string;\n}\n\nfunction CopyButton({ value }: { value: string }) {\n const [copied, setCopied] = useState(false);\n\n function handleCopy() {\n navigator.clipboard.writeText(value).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n }\n\n return (\n <button\n onClick={handleCopy}\n title=\"Copy to clipboard\"\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: '2px 6px',\n borderRadius: 4,\n color: copied ? '#22c55e' : '#6b7280',\n fontSize: 12,\n fontWeight: 600,\n flexShrink: 0,\n }}\n >\n {copied ? '✓ Copied' : 'Copy'}\n </button>\n );\n}\n\nfunction Field({\n label,\n value,\n masked,\n}: {\n label: string;\n value: string;\n masked?: boolean;\n}) {\n const [reveal, setReveal] = useState(false);\n const display = masked && !reveal ? '•'.repeat(Math.min(value.length, 36)) : value;\n\n return (\n <div style={{ marginBottom: 12 }}>\n <div style={{ fontSize: 11, fontWeight: 600, color: '#6b7280', marginBottom: 4, textTransform: 'uppercase', letterSpacing: '0.05em' }}>\n {label}\n </div>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n background: '#f9fafb',\n border: '1px solid #e5e7eb',\n borderRadius: 8,\n padding: '8px 12px',\n }}>\n <span style={{ fontFamily: 'monospace', fontSize: 13, color: '#1a2540', flex: 1, wordBreak: 'break-all' }}>\n {display}\n </span>\n {masked && (\n <button\n onClick={() => setReveal(r => !r)}\n style={{ background: 'none', border: 'none', cursor: 'pointer', fontSize: 11, color: '#6b7280', flexShrink: 0, padding: '2px 4px' }}\n >\n {reveal ? 'Hide' : 'Show'}\n </button>\n )}\n <CopyButton value={value} />\n </div>\n </div>\n );\n}\n\nexport interface RegistrationFormProps {\n /** Pre-fill the wallet address field (e.g. from connected wallet) */\n walletAddress?: string;\n /** Called when registration completes successfully */\n onSuccess?: (credentials: Credentials) => void;\n}\n\nexport function RegistrationForm({ walletAddress = '', onSuccess }: RegistrationFormProps) {\n const [step, setStep] = useState<Step>('register');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n\n // Step 1 fields\n const [wallet, setWallet] = useState(walletAddress);\n const [email, setEmail] = useState('');\n const [appName, setAppName] = useState('');\n\n // Step 2 field\n const [otp, setOtp] = useState('');\n\n // Result\n const [credentials, setCredentials] = useState<Credentials | null>(null);\n\n async function handleRegister(e: React.FormEvent) {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n const res = await fetch(`${API_BASE}/api/sdk/register`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'ngrok-skip-browser-warning': '1' },\n body: JSON.stringify({ walletAddress: wallet, email, appName }),\n });\n const data = await res.json();\n if (!res.ok) throw new Error(data?.message || `Error ${res.status}`);\n setStep('verify');\n } catch (err: any) {\n setError(err.message ?? 'Registration failed');\n } finally {\n setLoading(false);\n }\n }\n\n async function handleVerify(e: React.FormEvent) {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n const res = await fetch(`${API_BASE}/api/sdk/verify-email`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'ngrok-skip-browser-warning': '1' },\n body: JSON.stringify({ email, otp }),\n });\n const data = await res.json();\n if (!res.ok) throw new Error(data?.message || `Error ${res.status}`);\n const creds: Credentials = { appId: data.appId, apiSecret: data.apiSecret };\n setCredentials(creds);\n setStep('done');\n onSuccess?.(creds);\n } catch (err: any) {\n setError(err.message ?? 'Verification failed');\n } finally {\n setLoading(false);\n }\n }\n\n const containerStyle: React.CSSProperties = {\n background: 'white',\n border: '1px solid #e5e7eb',\n borderRadius: 16,\n padding: 28,\n maxWidth: 420,\n width: '100%',\n boxShadow: '0 1px 4px rgba(0,0,0,0.06)',\n };\n\n const labelStyle: React.CSSProperties = {\n display: 'block',\n fontSize: 13,\n fontWeight: 600,\n color: '#374151',\n marginBottom: 6,\n };\n\n const inputStyle: React.CSSProperties = {\n width: '100%',\n padding: '10px 12px',\n borderRadius: 8,\n border: '1px solid #d1d5db',\n fontSize: 14,\n color: '#1a2540',\n outline: 'none',\n boxSizing: 'border-box',\n fontFamily: 'inherit',\n transition: 'border-color 0.15s',\n };\n\n const btnStyle: React.CSSProperties = {\n width: '100%',\n padding: '11px 16px',\n borderRadius: 10,\n border: 'none',\n background: '#2563eb',\n color: 'white',\n fontWeight: 700,\n fontSize: 14,\n cursor: loading ? 'not-allowed' : 'pointer',\n opacity: loading ? 0.7 : 1,\n marginTop: 4,\n };\n\n const headingStyle: React.CSSProperties = {\n fontWeight: 700,\n fontSize: 18,\n color: '#1a2540',\n marginBottom: 4,\n };\n\n const subStyle: React.CSSProperties = {\n fontSize: 13,\n color: '#6b7280',\n marginBottom: 20,\n };\n\n // ── Step indicator ────────────────────────────────────────────────────────────\n const steps = ['Register', 'Verify OTP', 'Done'];\n const stepIndex = step === 'register' ? 0 : step === 'verify' ? 1 : 2;\n\n return (\n <div style={containerStyle}>\n {/* Step pills */}\n <div style={{ display: 'flex', gap: 6, marginBottom: 24 }}>\n {steps.map((s, i) => (\n <div\n key={s}\n style={{\n flex: 1,\n textAlign: 'center',\n fontSize: 11,\n fontWeight: 600,\n padding: '4px 0',\n borderRadius: 20,\n background: i <= stepIndex ? '#2563eb' : '#f3f4f6',\n color: i <= stepIndex ? 'white' : '#9ca3af',\n transition: 'all 0.2s',\n }}\n >\n {s}\n </div>\n ))}\n </div>\n\n {/* ── Step 1: Register ── */}\n {step === 'register' && (\n <>\n <div style={headingStyle}>Register your app</div>\n <div style={subStyle}>Get an <code>appId</code> and <code>apiSecret</code> to start integrating SurfLiquid SDK.</div>\n <form onSubmit={handleRegister} style={{ display: 'flex', flexDirection: 'column', gap: 14 }}>\n <div>\n <label style={labelStyle}>Wallet address</label>\n <input\n style={inputStyle}\n type=\"text\"\n placeholder=\"0x...\"\n value={wallet}\n onChange={e => setWallet(e.target.value)}\n required\n spellCheck={false}\n />\n </div>\n <div>\n <label style={labelStyle}>Email</label>\n <input\n style={inputStyle}\n type=\"email\"\n placeholder=\"you@yourplatform.com\"\n value={email}\n onChange={e => setEmail(e.target.value)}\n required\n />\n </div>\n <div>\n <label style={labelStyle}>App name</label>\n <input\n style={inputStyle}\n type=\"text\"\n placeholder=\"My DeFi App\"\n value={appName}\n onChange={e => setAppName(e.target.value)}\n required\n />\n </div>\n {error && <p style={{ margin: 0, color: '#ef4444', fontSize: 13 }}>{error}</p>}\n <button type=\"submit\" style={btnStyle} disabled={loading}>\n {loading ? 'Sending OTP…' : 'Register →'}\n </button>\n </form>\n </>\n )}\n\n {/* ── Step 2: Verify OTP ── */}\n {step === 'verify' && (\n <>\n <div style={headingStyle}>Check your email</div>\n <div style={subStyle}>\n We sent a 6-digit OTP to <strong>{email}</strong>. Enter it below to complete registration.\n </div>\n <form onSubmit={handleVerify} style={{ display: 'flex', flexDirection: 'column', gap: 14 }}>\n <div>\n <label style={labelStyle}>OTP code</label>\n <input\n style={{ ...inputStyle, fontSize: 22, letterSpacing: '0.3em', textAlign: 'center', fontFamily: 'monospace' }}\n type=\"text\"\n inputMode=\"numeric\"\n placeholder=\"------\"\n maxLength={6}\n value={otp}\n onChange={e => setOtp(e.target.value.replace(/\\D/g, ''))}\n required\n autoFocus\n />\n </div>\n {error && <p style={{ margin: 0, color: '#ef4444', fontSize: 13 }}>{error}</p>}\n <button type=\"submit\" style={btnStyle} disabled={loading || otp.length < 6}>\n {loading ? 'Verifying…' : 'Verify →'}\n </button>\n <button\n type=\"button\"\n style={{ ...btnStyle, background: 'transparent', color: '#6b7280', border: '1px solid #e5e7eb', marginTop: 0 }}\n onClick={() => { setStep('register'); setError(''); setOtp(''); }}\n disabled={loading}\n >\n ← Back\n </button>\n </form>\n </>\n )}\n\n {/* ── Step 3: Done ── */}\n {step === 'done' && credentials && (\n <>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 4 }}>\n <span style={{ fontSize: 22 }}>🎉</span>\n <div style={headingStyle}>App registered!</div>\n </div>\n <div style={subStyle}>\n Save your credentials below. <strong>apiSecret is shown only once</strong> and cannot be recovered.\n </div>\n <Field label=\"App ID (public)\" value={credentials.appId} />\n <Field label=\"API Secret (keep secret!)\" value={credentials.apiSecret} masked />\n <div style={{\n marginTop: 16,\n padding: '10px 14px',\n background: '#fefce8',\n border: '1px solid #fde68a',\n borderRadius: 8,\n fontSize: 12,\n color: '#92400e',\n lineHeight: 1.5,\n }}>\n Store <strong>apiSecret</strong> securely (env var, secret manager). Embed <strong>appId</strong> freely in your frontend.\n </div>\n <button\n style={{ ...btnStyle, marginTop: 16, background: '#f3f4f6', color: '#374151', border: '1px solid #e5e7eb' }}\n onClick={() => { setStep('register'); setWallet(walletAddress); setEmail(''); setAppName(''); setOtp(''); setCredentials(null); setError(''); }}\n >\n Register another app\n </button>\n </>\n )}\n </div>\n );\n}\n","import React, { useState } from \"react\";\nimport { CDN_IMAGES } from '../../assets/cdn';\nimport { useSurf } from \"../../context/SurfContext\";\nimport { useDeposit } from \"../../hooks/useDeposit\";\nimport { useDepositBalance } from \"../../hooks/useBalance\";\nimport type { VaultInfo, DepositStep } from \"../../types\";\nimport { Modal } from \"../ui/Modal\";\nimport { Button } from \"../ui/Button\";\nimport { Tabs } from \"../ui/Tabs\";\nimport { StepProgress } from \"../ui/StepProgress\";\nimport { TokenIcon } from \"../ui/TokenIcon\";\n\nimport type { Step } from \"../ui/StepProgress\";\n\nconst PCTS = [10, 25, 50, 100];\n\nfunction truncate(addr: string) {\n return addr.length < 10 ? addr : `${addr.slice(0, 6)}...${addr.slice(-4)}`;\n}\n\nfunction cleanError(err: { message?: string } | string): string {\n const raw = typeof err === 'string' ? err : (err?.message ?? '');\n if (!raw) return 'Transaction failed. Please try again.';\n const lower = raw.toLowerCase();\n if (lower.includes('user rejected') || lower.includes('user denied')) return 'Transaction rejected by wallet.';\n if (lower.includes('insufficient funds')) return 'Insufficient funds for transaction.';\n if (lower.includes('execution reverted')) return 'Transaction reverted by contract.';\n if (lower.includes('nonce')) return 'Nonce error — please reset your wallet and retry.';\n if (lower.includes('network') || lower.includes('disconnected')) return 'Network error. Check your connection.';\n const sentence = raw.split(/[.(]/)[0].trim();\n return sentence.length > 0 && sentence.length <= 100 ? sentence : 'Transaction failed. Please try again.';\n}\n\n// ─── Form ─────────────────────────────────────────────────────────────────────\n\nfunction DepositForm({\n vault,\n amount,\n availableBalance,\n isBalanceLoading,\n onAmountChange,\n onSubmit,\n onRefreshBalance,\n onSwitchToWithdraw,\n}: {\n vault: VaultInfo;\n amount: string;\n availableBalance: string;\n isBalanceLoading: boolean;\n onAmountChange: (v: string) => void;\n onSubmit: () => void;\n onRefreshBalance: () => void;\n onSwitchToWithdraw: () => void;\n}) {\n const available = parseFloat(availableBalance) || 0;\n const amountNum = parseFloat(amount) || 0;\n const isValid = amountNum > 0 && amountNum <= available;\n\n return (\n <div className=\"surf-modal-body\">\n <Tabs\n tabs={[\n { id: \"deposit\", label: \"Deposit\" },\n { id: \"withdraw\", label: \"Withdraw\" },\n ]}\n activeTab=\"deposit\"\n onChange={(id) => {\n if (id === \"withdraw\") onSwitchToWithdraw();\n }}\n variant=\"pill\"\n />\n <p\n className=\"surf-modal-subtitle\"\n style={{ marginTop: 14, textAlign: \"center\" }}\n >\n Your surf is ready! Enter your deposit to activate\n </p>\n\n {/* Token + Blockchain row */}\n <div style={{ display: \"flex\", gap: 12, marginBottom: 16 }}>\n <div className=\"surf-field\" style={{ flex: 1, marginBottom: 0 }}>\n <span className=\"surf-label\">Token</span>\n <div className=\"surf-select-box\">\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 2,\n }}\n >\n <TokenIcon\n symbol={vault.token.symbol}\n icon={vault.token.icon}\n size={26}\n />\n <span style={{ fontSize: 14, fontWeight: 600 }}>\n {vault.token.symbol}\n </span>\n </div>\n <span className=\"surf-select-box--apy\">\n {vault.apy.toFixed(2)}% APY\n </span>\n </div>\n </div>\n <div className=\"surf-field\" style={{ flex: 1, marginBottom: 0 }}>\n <span className=\"surf-label\">Blockchain</span>\n <div className=\"surf-select-box\">\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 7 }}>\n <img\n src={vault.chain.id === 137 ? CDN_IMAGES.POLYGON : CDN_IMAGES.BASE_CHAIN}\n alt={vault.chain.name}\n width={18}\n height={18}\n />\n <span style={{ fontSize: 13, fontWeight: 500 }}>\n {vault.chain.name}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Amount box */}\n <div className=\"surf-amount-box\">\n {/* Label row: \"Enter Amount\" left, % buttons right */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n marginBottom: 8,\n }}\n >\n <span className=\"surf-label\" style={{ margin: 0 }}>\n Enter Amount\n </span>\n <div style={{ display: \"flex\", gap: 10 }}>\n {PCTS.map((p) => (\n <button\n key={p}\n className=\"surf-pct-link\"\n onClick={() =>\n onAmountChange(((available * p) / 100).toFixed(2))\n }\n >\n {p}%\n </button>\n ))}\n </div>\n </div>\n\n {/* Large number input */}\n <input\n type=\"number\"\n value={amount}\n onChange={(e) => onAmountChange(e.target.value)}\n placeholder=\"0\"\n min=\"0\"\n step=\"any\"\n className=\"surf-amount-input\"\n />\n\n {/* Min / Available row */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n marginTop: 8,\n }}\n >\n <span className=\"surf-amount-hint\">Min 100 {vault.token.symbol}</span>\n <span className=\"surf-amount-hint\">\n Available:{\" \"}\n {isBalanceLoading\n ? \"...\"\n : available.toLocaleString(\"en-US\", { minimumFractionDigits: 2 })}{\" \"}\n {vault.token.symbol}\n <button\n className=\"surf-refresh-btn\"\n onClick={onRefreshBalance}\n title=\"Refresh balance\"\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n >\n <path d=\"M1 4v6h6M23 20v-6h-6\" />\n <path d=\"M20.49 9A9 9 0 005.64 5.64L1 10M23 14l-4.64 4.36A9 9 0 013.51 15\" />\n </svg>\n </button>\n </span>\n </div>\n </div>\n\n <Button\n variant=\"primary\"\n size=\"lg\"\n fullWidth\n disabled={!isValid}\n onClick={onSubmit}\n style={{ borderRadius: 50, marginTop: 16 }}\n >\n Deposit {vault.token.symbol}\n </Button>\n\n <p className=\"surf-disclaimer\" style={{ marginTop: 10 }}>\n You'll need Base-bridged ETH to deposit. After activation, all agent\n fees are covered. By activating Surf, you agree to the{\" \"}\n <a\n href=\"https://surfliquid.com/terms\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n platform terms\n </a>{\" \"}\n and{\" \"}\n <a\n href=\"https://surfliquid.com/privacy\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n privacy policy\n </a>\n , and acknowledge that returns may vary according to market conditions\n and selected strategy\n </p>\n </div>\n );\n}\n\n// ─── Processing ───────────────────────────────────────────────────────────────\n\nfunction buildSteps(current: DepositStep, vaultExists: boolean): Step[] {\n const order = [\"creating_contract\", \"approving\", \"depositing\"];\n function status(id: string): Step[\"status\"] {\n // If vault already exists, skip the creating_contract step\n if (id === \"creating_contract\" && vaultExists) return \"completed\";\n const ci = order.indexOf(current.id);\n const ti = order.indexOf(id);\n if (current.id === \"success\") return \"completed\";\n if (ci === -1) return \"pending\";\n if (ti < ci) return \"completed\";\n if (ti === ci) return \"active\";\n return \"pending\";\n }\n function tx(id: string): string | undefined {\n return current.id === id && \"txHash\" in current\n ? current.txHash\n : undefined;\n }\n return [\n {\n id: \"creating_contract\",\n title: \"Surf Account Creation\",\n description: \"Deploy your self-custodial smart contract\",\n status: status(\"creating_contract\"),\n txHash: tx(\"creating_contract\"),\n },\n {\n id: \"approving\",\n title: \"Approve USDC\",\n description: \"Grant access for automated strategies\",\n status: status(\"approving\"),\n txHash: tx(\"approving\"),\n },\n {\n id: \"depositing\",\n title: \"Deposit USDC\",\n description: \"Fund your Surf Account by depositing\",\n status: status(\"depositing\"),\n txHash: tx(\"depositing\"),\n },\n ];\n}\n\nfunction processingLabel(step: DepositStep): string {\n switch (step.id) {\n case \"creating_contract\":\n return \"Creating contract\";\n case \"approving\":\n return \"Approve USDC\";\n case \"depositing\":\n return \"Access Dashboard\";\n default:\n return \"Processing...\";\n }\n}\n\nfunction isDepositTxSubmitted(step: DepositStep): boolean {\n return step.id === \"depositing\" && \"txHash\" in step && !!step.txHash;\n}\n\nfunction ProcessingView({\n step,\n tokenSymbol,\n vaultExists,\n onDashboard,\n onSwitchToWithdraw,\n}: {\n step: DepositStep;\n tokenSymbol: string;\n vaultExists: boolean;\n onDashboard: () => void;\n onSwitchToWithdraw: () => void;\n}) {\n const depositDone = isDepositTxSubmitted(step);\n const isSpinning =\n !depositDone &&\n step.id !== \"success\" &&\n step.id !== \"error\" &&\n step.id !== \"idle\";\n\n return (\n <div className=\"surf-modal-body\">\n <Tabs\n tabs={[\n { id: \"deposit\", label: \"Deposit\" },\n { id: \"withdraw\", label: \"Withdraw\" },\n ]}\n activeTab=\"deposit\"\n onChange={(id) => {\n if (id === \"withdraw\") onSwitchToWithdraw();\n }}\n variant=\"pill\"\n />\n <p\n className=\"surf-modal-subtitle\"\n style={{ marginTop: 14, textAlign: \"center\" }}\n >\n Confirm wallet requests to finish agent activation\n </p>\n <StepProgress steps={buildSteps(step, vaultExists)} />\n <div style={{ marginTop: 20 }}>\n <Button\n variant={depositDone ? \"primary\" : \"soft\"}\n size=\"lg\"\n fullWidth\n isLoading={isSpinning}\n disabled={!depositDone && step.id !== \"error\"}\n onClick={depositDone ? onDashboard : undefined}\n style={{ borderRadius: 50 }}\n >\n {processingLabel(step)}\n </Button>\n </div>\n {step.id === \"error\" && (\n <div className=\"surf-error-box\">⚠ {cleanError(step.error)}</div>\n )}\n </div>\n );\n}\n\n// ─── Success ──────────────────────────────────────────────────────────────────\n\nfunction SuccessView({\n txHash,\n amount,\n tokenSymbol,\n walletAddress,\n onExplore,\n onBack,\n}: {\n txHash: string;\n amount: string;\n tokenSymbol: string;\n walletAddress: string;\n onExplore: () => void;\n onBack: () => void;\n}) {\n return (\n <div className=\"surf-success\">\n <div className=\"surf-success-icon\">\n <div className=\"surf-success-icon-inner\">\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"white\"\n strokeWidth=\"2.5\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n </div>\n </div>\n <p className=\"surf-success-title\">You're all done!</p>\n <p className=\"surf-success-desc\">\n Successfully deposited{\" \"}\n <strong>\n {parseFloat(amount).toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n })}{\" \"}\n {tokenSymbol}\n </strong>{\" \"}\n to your wallet <strong>{truncate(walletAddress)}</strong>\n </p>\n <div className=\"surf-success-actions\">\n <Button\n variant=\"outline\"\n size=\"md\"\n style={{ flex: 1 }}\n onClick={onExplore}\n rightIcon={\n <svg\n width=\"13\"\n height=\"13\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6M15 3h6v6M10 14 21 3\" />\n </svg>\n }\n >\n Explore\n </Button>\n <Button\n variant=\"primary\"\n size=\"md\"\n style={{ flex: 1 }}\n onClick={onBack}\n >\n Back to dashboard\n </Button>\n </div>\n </div>\n );\n}\n\n// ─── Root ─────────────────────────────────────────────────────────────────────\n\nconst DEFAULT_VAULT: VaultInfo = {\n token: { symbol: \"USDC\", name: \"USD Coin\", decimals: 6, address: \"\" },\n chain: { name: \"Base\", id: 8453 },\n balance: \"0.00\",\n earnings: \"0.00\",\n apy: 0,\n withdrawalType: \"instant\",\n availableBalance: \"0.00\",\n};\n\nexport interface DepositModalProps {\n isOpen: boolean;\n onClose: () => void;\n vault: VaultInfo | null;\n onSwitchToWithdraw?: () => void;\n}\n\nexport function DepositModal({\n isOpen,\n onClose,\n vault,\n onSwitchToWithdraw,\n}: DepositModalProps) {\n const { walletAddress } = useSurf();\n const { step, execute, reset } = useDeposit();\n const [amount, setAmount] = useState(\"\");\n\n const activeVault = vault ?? DEFAULT_VAULT;\n\n // Fetch live wallet balance via surfClient.getTokenBalance()\n const { balance: availableBalance, isLoading: isBalanceLoading, refetch: refetchBalance } =\n useDepositBalance(activeVault.token.address, activeVault.token.decimals ?? 6);\n\n const isIdle = step.id === \"idle\";\n const isSuccess = step.id === \"success\";\n\n function handleClose() {\n reset();\n setAmount(\"\");\n onClose();\n }\n\n return (\n <Modal isOpen={isOpen} onClose={handleClose}>\n <button\n className=\"surf-modal-close\"\n onClick={handleClose}\n aria-label=\"Close\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n >\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </button>\n\n {isIdle && (\n <DepositForm\n vault={activeVault}\n amount={amount}\n availableBalance={availableBalance}\n isBalanceLoading={isBalanceLoading}\n onAmountChange={setAmount}\n onSubmit={() => amount && execute(amount, activeVault)}\n onRefreshBalance={refetchBalance}\n onSwitchToWithdraw={() => { reset(); setAmount(''); onSwitchToWithdraw?.(); }}\n />\n )}\n\n {!isIdle && !isSuccess && (\n <ProcessingView\n step={step}\n tokenSymbol={activeVault.token.symbol}\n vaultExists={!!activeVault.userVaultAddress}\n onDashboard={handleClose}\n onSwitchToWithdraw={() => {\n reset();\n setAmount(\"\");\n onSwitchToWithdraw?.();\n }}\n />\n )}\n\n {isSuccess && step.id === \"success\" && (\n <SuccessView\n txHash={step.txHash}\n amount={step.amount}\n tokenSymbol={activeVault.token.symbol}\n walletAddress={walletAddress}\n onExplore={() =>\n window.open(`https://basescan.org/tx/${step.txHash}`, \"_blank\")\n }\n onBack={handleClose}\n />\n )}\n </Modal>\n );\n}\n","import { useState } from \"react\";\nimport { CDN_IMAGES } from '../../assets/cdn';\nimport { useSurf } from \"../../context/SurfContext\";\nimport { useWithdraw } from \"../../hooks/useWithdraw\";\nimport { useWithdrawableBalance } from \"../../hooks/useBalance\";\nimport type { VaultInfo, WithdrawStep } from \"../../types\";\nimport { Modal } from \"../ui/Modal\";\nimport { Button } from \"../ui/Button\";\nimport { Tabs } from \"../ui/Tabs\";\nimport { StepProgress } from \"../ui/StepProgress\";\nimport { TokenIcon } from \"../ui/TokenIcon\";\nimport type { Step } from \"../ui/StepProgress\";\n\nconst PCTS = [10, 25, 50, 100];\n\nfunction truncate(addr: string) {\n return addr.length < 10 ? addr : `${addr.slice(0, 6)}...${addr.slice(-4)}`;\n}\n\n/** Truncate to 2 decimal places without rounding */\nfunction floor2(n: number): string {\n return (Math.floor(n * 100) / 100).toFixed(2);\n}\n\n/** Extract a single human-readable sentence from a raw Web3/ethers error */\nfunction cleanError(err: { message?: string } | string): string {\n const raw = typeof err === 'string' ? err : (err?.message ?? '');\n if (!raw) return 'Transaction failed. Please try again.';\n const lower = raw.toLowerCase();\n if (lower.includes('user rejected') || lower.includes('user denied')) return 'Transaction rejected by wallet.';\n if (lower.includes('insufficient funds')) return 'Insufficient funds for transaction.';\n if (lower.includes('execution reverted')) return 'Transaction reverted by contract.';\n if (lower.includes('nonce')) return 'Nonce error — please reset your wallet and retry.';\n if (lower.includes('network') || lower.includes('disconnected')) return 'Network error. Check your connection.';\n // Take only the first sentence (up to first '.', '(', or 80 chars)\n const sentence = raw.split(/[.(]/)[0].trim();\n return sentence.length > 0 && sentence.length <= 100 ? sentence : 'Transaction failed. Please try again.';\n}\n\n// ─── Form ─────────────────────────────────────────────────────────────────────\n\nfunction WithdrawForm({\n vault,\n amount,\n walletAddress,\n withdrawableBalance,\n isBalanceLoading,\n onAmountChange,\n onSubmit,\n onRefreshBalance,\n onSwitchToDeposit,\n}: {\n vault: VaultInfo;\n amount: string;\n walletAddress: string;\n withdrawableBalance: string;\n isBalanceLoading: boolean;\n onAmountChange: (v: string) => void;\n onSubmit: () => void;\n onRefreshBalance: () => void;\n onSwitchToDeposit: () => void;\n}) {\n // Fall back to vault balance if withdrawable amount isn't available yet\n const available =\n parseFloat(withdrawableBalance) > 0\n ? parseFloat(withdrawableBalance)\n : parseFloat(vault.availableBalance) || parseFloat(vault.balance) || 0;\n const amountNum = parseFloat(amount) || 0;\n const isValid = amountNum > 0 && amountNum <= available;\n\n return (\n <div className=\"surf-modal-body\">\n <Tabs\n tabs={[\n { id: \"deposit\", label: \"Deposit\" },\n { id: \"withdraw\", label: \"Withdraw\" },\n ]}\n activeTab=\"withdraw\"\n onChange={(id) => {\n if (id === \"deposit\") onSwitchToDeposit();\n }}\n variant=\"pill\"\n />\n <p\n className=\"surf-modal-subtitle\"\n style={{ marginTop: 14, textAlign: \"center\" }}\n >\n Surf will withdraw to your connected wallet{\" \"}\n <span style={{ fontWeight: 600, color: \"#111827\" }}>\n {truncate(walletAddress)}\n </span>\n </p>\n\n {/* Token + Blockchain row */}\n <div style={{ display: \"flex\", gap: 12, marginBottom: 16 }}>\n <div className=\"surf-field\" style={{ flex: 1, marginBottom: 0 }}>\n <span className=\"surf-label\">Token</span>\n <div className=\"surf-select-box\">\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <TokenIcon\n symbol={vault.token.symbol}\n icon={vault.token.icon}\n size={26}\n />\n <span style={{ fontSize: 14, fontWeight: 600 }}>\n {vault.token.symbol}\n </span>\n </div>\n </div>\n </div>\n <div className=\"surf-field\" style={{ flex: 1, marginBottom: 0 }}>\n <span className=\"surf-label\">Blockchain</span>\n <div className=\"surf-select-box\">\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 7 }}>\n <img\n src={vault.chain.id === 137 ? CDN_IMAGES.POLYGON : CDN_IMAGES.BASE_CHAIN}\n alt={vault.chain.name}\n width={18}\n height={18}\n />\n <span style={{ fontSize: 13, fontWeight: 500 }}>\n {vault.chain.name}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Amount box — same layout as Deposit */}\n <div className=\"surf-amount-box\">\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n marginBottom: 8,\n }}\n >\n <span className=\"surf-label\" style={{ margin: 0 }}>\n Enter Amount\n </span>\n <div style={{ display: \"flex\", gap: 10 }}>\n {PCTS.map((p) => (\n <button\n key={p}\n className=\"surf-pct-link\"\n onClick={() => onAmountChange(floor2((available * p) / 100))}\n >\n {p}%\n </button>\n ))}\n </div>\n </div>\n <input\n type=\"number\"\n value={amount}\n onChange={(e) => onAmountChange(e.target.value)}\n placeholder=\"0\"\n min=\"0\"\n step=\"any\"\n className=\"surf-amount-input\"\n />\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-end\",\n justifyContent: \"flex-end\",\n marginTop: 8,\n }}\n >\n <span className=\"surf-amount-hint\">\n Available:{\" \"}\n {isBalanceLoading\n ? \"...\"\n : available.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n })}{\" \"}\n {vault.token.symbol}\n <button\n className=\"surf-refresh-btn\"\n onClick={onRefreshBalance}\n title=\"Refresh balance\"\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n >\n <path d=\"M1 4v6h6M23 20v-6h-6\" />\n <path d=\"M20.49 9A9 9 0 005.64 5.64L1 10M23 14l-4.64 4.36A9 9 0 013.51 15\" />\n </svg>\n </button>\n </span>\n </div>\n </div>\n\n <Button\n variant=\"primary\"\n size=\"lg\"\n fullWidth\n disabled={!isValid}\n onClick={onSubmit}\n style={{ borderRadius: 50, marginTop: 16 }}\n >\n Withdraw funds\n </Button>\n <p className=\"surf-disclaimer\" style={{ marginTop: 10 }}>\n Rewards will also be withdrawn by default\n </p>\n </div>\n );\n}\n\n// ─── Processing ───────────────────────────────────────────────────────────────\n\nfunction buildSteps(\n current: WithdrawStep,\n amount: string,\n symbol: string,\n): Step[] {\n const order = [\"closing_position\", \"redeeming_reward\"];\n function status(id: string): Step[\"status\"] {\n const ci = order.indexOf(current.id);\n const ti = order.indexOf(id);\n if (current.id === \"success\") return \"completed\";\n if (ci === -1) return \"pending\";\n if (ti < ci) return \"completed\";\n if (ti === ci) return \"active\";\n return \"pending\";\n }\n function tx(id: string): string | undefined {\n return current.id === id && \"txHash\" in current\n ? current.txHash\n : undefined;\n }\n return [\n {\n id: \"closing_position\",\n title: \"Close current position\",\n description: `Withdraw ${parseFloat(amount || \"0\").toFixed(2)} ${symbol} from Vault`,\n status: status(\"closing_position\"),\n txHash: tx(\"closing_position\"),\n },\n {\n id: \"redeeming_reward\",\n title: \"Redeem Reward\",\n description: \"Transferring to your wallet\",\n status: status(\"redeeming_reward\"),\n txHash: tx(\"redeeming_reward\"),\n },\n ];\n}\n\nfunction processingLabel(step: WithdrawStep): string {\n switch (step.id) {\n case \"closing_position\":\n return \"Withdrawing Funds...\";\n case \"redeeming_reward\":\n return \"Redeeming Reward...\";\n default:\n return \"Processing...\";\n }\n}\n\nfunction ProcessingView({\n step,\n amount,\n tokenSymbol,\n walletAddress,\n onSwitchToDeposit,\n}: {\n step: WithdrawStep;\n amount: string;\n tokenSymbol: string;\n walletAddress: string;\n onSwitchToDeposit: () => void;\n}) {\n const isSpinning =\n step.id !== \"success\" && step.id !== \"error\" && step.id !== \"idle\";\n return (\n <div className=\"surf-modal-body\">\n <Tabs\n tabs={[\n { id: \"deposit\", label: \"Deposit\" },\n { id: \"withdraw\", label: \"Withdraw\" },\n ]}\n activeTab=\"withdraw\"\n onChange={(id) => {\n if (id === \"deposit\") onSwitchToDeposit();\n }}\n variant=\"pill\"\n />\n <p\n className=\"surf-modal-subtitle\"\n style={{ marginTop: 14, textAlign: \"center\" }}\n >\n Surf is resolving all your positions and withdrawing to your connected\n wallet <strong>{truncate(walletAddress)}</strong>\n </p>\n <StepProgress steps={buildSteps(step, amount, tokenSymbol)} />\n <div style={{ marginTop: 20 }}>\n <Button\n variant=\"soft\"\n size=\"lg\"\n fullWidth\n isLoading={isSpinning}\n disabled={step.id !== \"error\"}\n style={{ borderRadius: 50 }}\n >\n {processingLabel(step)}\n </Button>\n </div>\n {step.id === \"error\" && (\n <div className=\"surf-error-box\">⚠ {cleanError(step.error)}</div>\n )}\n </div>\n );\n}\n\n// ─── Success ──────────────────────────────────────────────────────────────────\n\nfunction SuccessView({\n amount,\n tokenSymbol,\n walletAddress,\n onExplore,\n onBack,\n}: {\n amount: string;\n tokenSymbol: string;\n walletAddress: string;\n onExplore: () => void;\n onBack: () => void;\n}) {\n return (\n <div className=\"surf-success\">\n <div className=\"surf-success-icon\">\n <div className=\"surf-success-icon-inner\">\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"white\"\n strokeWidth=\"2.5\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n </div>\n </div>\n <p className=\"surf-success-title\">You're all done!</p>\n <p className=\"surf-success-desc\">\n Successfully withdrew{\" \"}\n <strong>\n {parseFloat(amount).toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n })}{\" \"}\n {tokenSymbol}\n </strong>{\" \"}\n to your wallet <strong>{truncate(walletAddress)}</strong>\n </p>\n <div className=\"surf-success-actions\">\n <Button\n variant=\"outline\"\n size=\"md\"\n style={{ flex: 1 }}\n onClick={onExplore}\n rightIcon={\n <svg\n width=\"13\"\n height=\"13\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6M15 3h6v6M10 14 21 3\" />\n </svg>\n }\n >\n Explore\n </Button>\n <Button\n variant=\"primary\"\n size=\"md\"\n style={{ flex: 1 }}\n onClick={onBack}\n >\n Back to dashboard\n </Button>\n </div>\n </div>\n );\n}\n\n// ─── Root ─────────────────────────────────────────────────────────────────────\n\nexport interface WithdrawModalProps {\n isOpen: boolean;\n onClose: () => void;\n vault: VaultInfo | null;\n onSwitchToDeposit?: () => void;\n}\n\nexport function WithdrawModal({\n isOpen,\n onClose,\n vault,\n onSwitchToDeposit,\n}: WithdrawModalProps) {\n const { walletAddress } = useSurf();\n const { step, execute, reset } = useWithdraw();\n const [amount, setAmount] = useState(\"\");\n\n // Fetch max withdrawable amount via surfClient.getWithdrawableAmount()\n const {\n balance: withdrawableBalance,\n isLoading: isBalanceLoading,\n refetch: refetchBalance,\n } = useWithdrawableBalance(\n vault?.token.address ?? \"\",\n vault?.userVaultAddress,\n vault?.token.decimals ?? 6,\n );\n\n const isIdle = step.id === \"idle\";\n const isSuccess = step.id === \"success\";\n\n function handleClose() {\n reset();\n setAmount(\"\");\n onClose();\n }\n const currentAmount =\n isSuccess && step.id === \"success\" ? step.amount : amount;\n\n return (\n <Modal isOpen={isOpen} onClose={handleClose}>\n <button\n className=\"surf-modal-close\"\n onClick={handleClose}\n aria-label=\"Close\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n >\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </button>\n\n {vault && isIdle && (\n <WithdrawForm\n vault={vault}\n amount={amount}\n walletAddress={walletAddress}\n withdrawableBalance={withdrawableBalance}\n isBalanceLoading={isBalanceLoading}\n onAmountChange={setAmount}\n onSubmit={() => vault && amount && execute(amount, vault)}\n onRefreshBalance={refetchBalance}\n onSwitchToDeposit={() => {\n reset();\n setAmount(\"\");\n onSwitchToDeposit?.();\n }}\n />\n )}\n\n {!isIdle && !isSuccess && vault && (\n <ProcessingView\n step={step}\n amount={amount}\n tokenSymbol={vault.token.symbol}\n walletAddress={walletAddress}\n onSwitchToDeposit={() => {\n reset();\n setAmount(\"\");\n onSwitchToDeposit?.();\n }}\n />\n )}\n\n {isSuccess && step.id === \"success\" && (\n <SuccessView\n amount={currentAmount}\n tokenSymbol={vault?.token.symbol ?? \"USDC\"}\n walletAddress={walletAddress}\n onExplore={() =>\n window.open(`https://basescan.org/tx/${step.txHash}`, \"_blank\")\n }\n onBack={handleClose}\n />\n )}\n\n {!vault && <div className=\"surf-empty\">Loading vault information...</div>}\n </Modal>\n );\n}\n"],"names":["SurfContext","createContext","applyTheme","el","theme","c","vars","key","value","SurfProvider","config","containerRef","children","surfClient","walletAddress","chainId","onSuccess","onError","useEffect","useMemo","jsx","useSurf","ctx","useContext","CHAIN_NAMES","mapVault","raw","contextChainId","resolvedChainId","chain","_a","chainAssets","a","relevantAssets","primary","best","chainBalance","sum","chainEarnings","useVault","vault","setVault","useState","isLoading","setIsLoading","error","setError","fetchTick","setFetchTick","cancelled","load","err","refetch","useCallback","t","BASE_URL","CDN_IMAGES","symbolToColor","symbol","colors","hash","TokenIcon","icon","size","className","cls","bg","initials","fontSize","Button","variant","leftIcon","rightIcon","fullWidth","disabled","style","props","classes","jsxs","ManageDropdown","isOpen","onClose","onWithdraw","onViewDeposits","onViewActivities","ref","useRef","handler","e","ChainIcon","src","StatBlock","label","apy","VaultCard","onDeposit","isSelected","manageOpen","setManageOpen","balanceFormatted","earningsFormatted","v","mapMessage","msg","isWithdraw","_b","version","protocol","useAgentMessages","activities","setActivities","tick","setTick","result","msgs","Modal","overlayRef","handleKey","Tabs","tabs","activeTab","onChange","wrapClass","tab","TimeAgo","timestamp","diff","days","hours","minutes","ChainLogo","ActivityRow","activity","isIn","Fragment","DepositRow","deposit","TABS","VaultActivityModal","initialTab","setActiveTab","loadingAct","deposits","i","IDLE","useDeposit","step","setStep","stepRef","isProcessing","txHash","execute","amount","deployed","assetAddress","tx","reset","useWithdraw","fromWei","decimals","safeDecimals","n","divisor","whole","remainder","frac","useDepositBalance","tokenAddress","balance","setBalance","useWithdrawableBalance","vaultAddress","StatusIcon","status","ExternalIcon","StepProgress","steps","baseExplorerUrl","PCTS","truncate","addr","floor2","cleanError","lower","sentence","CheckIcon","ExploreIcon","RefreshIcon","DepositForm","availableBalance","isBalanceLoading","onAmountChange","onSubmit","onRefreshBalance","onSwitchTab","available","amountNum","isValid","p","WithdrawForm","withdrawableBalance","buildDepositSteps","current","vaultExists","order","id","ci","ti","DepositProcessingView","onDashboard","depositDone","isSpinning","buildWithdrawSteps","WithdrawProcessingView","tokenSymbol","SuccessView","action","onExplore","onBack","DEFAULT_VAULT","TransactionModal","activeVault","depositAmount","setDepositAmount","withdrawAmount","setWithdrawAmount","depositStep","executeDeposit","resetDeposit","withdrawStep","executeWithdraw","resetWithdraw","isDepositBalanceLoading","refetchDepositBalance","isWithdrawBalanceLoading","refetchWithdrawBalance","prevInitialTab","switchTab","handleClose","depositIdle","depositSuccess","withdrawIdle","withdrawSuccess","renderContent","WidgetInner","lastVaultRef","stableVault","txTab","setTxTab","activityOpen","setActivityOpen","activityTab","setActivityTab","openDeposit","openWithdraw","openActivity","defaultVault","SurfWidget","client","API_BASE","CopyButton","copied","setCopied","handleCopy","Field","masked","reveal","setReveal","display","r","RegistrationForm","loading","setLoading","wallet","setWallet","email","setEmail","appName","setAppName","otp","setOtp","credentials","setCredentials","handleRegister","res","data","handleVerify","creds","containerStyle","labelStyle","inputStyle","btnStyle","headingStyle","subStyle","stepIndex","s","onSwitchToWithdraw","buildSteps","processingLabel","isDepositTxSubmitted","ProcessingView","DepositModal","setAmount","refetchBalance","isIdle","isSuccess","onSwitchToDeposit","WithdrawModal","currentAmount"],"mappings":"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"}
|