@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.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","i","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","d","IDLE","useDeposit","step","setStep","stepRef","isProcessing","txHash","execute","amount","deployed","assetAddress","tx","reset","useWithdraw","fromWei","decimals","safeDecimals","divisor","whole","remainder","frac","useDepositBalance","tokenAddress","balance","setBalance","useWithdrawableBalance","vaultAddress","StatusIcon","status","ExternalIcon","StepProgress","steps","baseExplorerUrl","PCTS","truncate","addr","floor2","n","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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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@surf_liquid/surf-widget",
|
|
3
|
+
"version": "0.1.5",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Embeddable DeFi yield widget SDK",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"defi",
|
|
8
|
+
"yield",
|
|
9
|
+
"widget",
|
|
10
|
+
"sdk",
|
|
11
|
+
"react",
|
|
12
|
+
"surf",
|
|
13
|
+
"surfliquid",
|
|
14
|
+
"vault",
|
|
15
|
+
"deposit",
|
|
16
|
+
"withdraw",
|
|
17
|
+
"web3",
|
|
18
|
+
"ethereum",
|
|
19
|
+
"base",
|
|
20
|
+
"polygon"
|
|
21
|
+
],
|
|
22
|
+
"main": "dist/index.js",
|
|
23
|
+
"module": "dist/index.esm.js",
|
|
24
|
+
"types": "dist/index.d.ts",
|
|
25
|
+
"files": [
|
|
26
|
+
"dist"
|
|
27
|
+
],
|
|
28
|
+
"publishConfig": {
|
|
29
|
+
"access": "public"
|
|
30
|
+
},
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "vite build",
|
|
33
|
+
"dev": "vite build --watch",
|
|
34
|
+
"demo": "vite --config vite.demo.config.ts",
|
|
35
|
+
"typecheck": "tsc --noEmit"
|
|
36
|
+
},
|
|
37
|
+
"peerDependencies": {
|
|
38
|
+
"react": ">=18",
|
|
39
|
+
"react-dom": ">=18",
|
|
40
|
+
"surfliquid": ">=0.1.1"
|
|
41
|
+
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"clsx": "^2.1.0"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@types/node": "^25.6.0",
|
|
47
|
+
"@types/react": "^18",
|
|
48
|
+
"@types/react-dom": "^18",
|
|
49
|
+
"@vitejs/plugin-react": "^4",
|
|
50
|
+
"autoprefixer": "^10",
|
|
51
|
+
"postcss": "^8",
|
|
52
|
+
"tailwindcss": "^3",
|
|
53
|
+
"typescript": "^5",
|
|
54
|
+
"vite": "^5",
|
|
55
|
+
"vite-plugin-dts": "^3"
|
|
56
|
+
}
|
|
57
|
+
}
|