cilantro-react 0.1.5 → 0.1.7
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 +1063 -594
- package/dist/AuthGuard-siMJeYPD.d.mts +42 -0
- package/dist/AuthGuard-siMJeYPD.d.ts +42 -0
- package/dist/index.d.mts +134 -23
- package/dist/index.d.ts +134 -23
- package/dist/index.js +634 -273
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +611 -255
- package/dist/index.mjs.map +1 -1
- package/dist/next.d.mts +19 -0
- package/dist/next.d.ts +19 -0
- package/dist/next.js +494 -0
- package/dist/next.js.map +1 -0
- package/dist/next.mjs +465 -0
- package/dist/next.mjs.map +1 -0
- package/package.json +10 -3
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/context/CilantroContext.tsx","../src/core/auth.ts","../src/core/storage-adapter.ts","../src/core/types.ts","../src/core/error-utils.ts","../src/core/normalize.ts","../src/providers/CilantroProvider.tsx","../src/providers/CilantroAuthProvider.tsx","../src/providers/WalletProvider.tsx","../src/index.ts","../src/hooks/useCilantroConfig.ts","../src/hooks/useAuth.ts","../src/hooks/useWallet.ts","../src/hooks/useSigners.ts","../src/core/signer-helpers.ts","../src/core/signer-creation.ts","../src/hooks/usePasskey.ts","../src/hooks/useExternalWallet.ts","../src/hooks/useSendTransaction.ts","../src/components/auth/LoginForm.tsx","../src/ui/button.tsx","../src/ui/cn.ts","../src/ui/input.tsx","../src/ui/label.tsx","../src/ui/card.tsx","../src/components/auth/LogoutButton.tsx","../src/ui/dialog.tsx","../src/ui/skeleton.tsx","../src/components/auth/AuthGuard.tsx","../src/components/signers/CreateEmailSignerForm.tsx","../src/components/signers/CreatePhoneSignerForm.tsx","../src/components/signers/AddPasskeyButton.tsx","../src/components/signers/SignerList.tsx","../src/components/signers/SignerSelector.tsx","../src/components/wallet/ConnectWalletButton.tsx","../src/components/wallet/CreateWalletForm.tsx","../src/ui/select.tsx","../src/components/wallet/WalletSelector.tsx","../src/components/wallet/WalletAddress.tsx","../src/components/wallet/WalletBalance.tsx","../src/components/transactions/SendSOLForm.tsx","../src/components/transactions/SendSPLForm.tsx","../src/components/transactions/TransactionStatus.tsx","../src/components/transactions/TransactionHistory.tsx","../src/components/layout/CilantroConnect.tsx","../src/components/layout/LoadingOverlay.tsx","../src/components/layout/ErrorBoundary.tsx","../src/ui/theme-provider.tsx","../src/adapters/solana-connection.ts","../src/core/signer-signing/core.ts","../src/core/signer-signing/constants.ts","../src/core/signer-signing/storage.ts","../src/core/signer-signing/message-signing.ts","../src/core/signer-signing/errors.ts","../src/core/signer-signing/signer-types.ts","../src/core/signer-signing/transaction-signing.ts","../src/core/signer-signing/validation.ts","../src/core/signer-signing/wallet-data.ts"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { clearAuth } from \"cilantro-sdk\";\nimport { login as cilantroLogin } from \"cilantro-sdk/auth\";\nimport type { AuthControllerLogin200Data } from \"cilantro-sdk/auth\";\nimport { create as createUser } from \"cilantro-sdk/user\";\nimport { create as createWalletSDK, findAll as findAllWallets } from \"cilantro-sdk/wallet\";\nimport type {\n WalletControllerFindAllResult,\n WalletControllerCreateResult,\n} from \"cilantro-sdk/wallet\";\nimport { setAuthConfig, setSdkAuth, getPlatformApiKey, isJwtExpired } from \"../core/auth\";\nimport { setStorageAdapter } from \"../core/storage-adapter\";\nimport type { DeviceKeyStorage } from \"../core/storage-adapter\";\nimport { extractResponseData } from \"../core/types\";\nimport { extractErrorMessage, isAuthError } from \"../core/error-utils\";\nimport { normalizeWallet } from \"../core/normalize\";\n\nconst DEFAULT_BASE_URL = \"https://api.cilantro.gg\";\nconst DEFAULT_JWT_STORAGE_KEY = \"cilantro_jwt\";\nconst DEFAULT_WALLET_STORAGE_KEY = \"cilantro_selected_wallet_id\";\n\n/** Minimal user view; populated from SDK login result data.user when available. */\nexport interface User {\n username?: string;\n email?: string;\n userType?: string;\n}\n\n/** SDK wallet list item type. */\nexport type WalletDataDto = WalletControllerFindAllResult[\"data\"] extends readonly (infer E)[]\n ? E\n : WalletControllerFindAllResult[\"data\"] extends (infer E)[]\n ? E\n : never;\n\n/** Wallet with backward-compat aliases (id, address, active). */\nexport type WalletData = WalletDataDto & {\n id?: string;\n address?: string;\n active?: boolean;\n};\n\nexport interface CilantroConfig {\n apiKey?: string;\n baseURL: string;\n jwt?: string | null;\n}\n\nexport interface CilantroContextValue {\n config: CilantroConfig;\n storage: DeviceKeyStorage | null;\n // Auth\n user: User | null;\n jwt: string | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n login: (params: { usernameOrEmail: string; password: string }) => Promise<void>;\n logout: () => void;\n register: (\n username: string,\n email: string,\n password: string,\n isActive?: boolean\n ) => Promise<void>;\n clearSessionDueToAuthError: () => void;\n // Wallet\n wallet: WalletData | null;\n wallets: WalletData[];\n createWallet: (params: { name: string; userId?: string }) => Promise<WalletControllerCreateResult>;\n selectWallet: (walletId: string) => void;\n refreshWallets: () => Promise<void>;\n walletError: string | null;\n walletsLoading: boolean;\n}\n\nconst CilantroContext = createContext<CilantroContextValue | undefined>(undefined);\n\nexport interface CilantroContextProviderProps {\n children: ReactNode;\n apiKey?: string;\n baseURL?: string;\n storageAdapter?: DeviceKeyStorage | null;\n jwtStorageKey?: string;\n walletStorageKey?: string;\n onLoginSuccess?: () => void;\n onLogout?: () => void;\n onRegisterSuccess?: () => void;\n onSessionExpired?: () => void;\n}\n\nexport function CilantroContextProvider({\n children,\n apiKey,\n baseURL = DEFAULT_BASE_URL,\n storageAdapter = null,\n jwtStorageKey = DEFAULT_JWT_STORAGE_KEY,\n walletStorageKey = DEFAULT_WALLET_STORAGE_KEY,\n onLoginSuccess,\n onLogout,\n onRegisterSuccess,\n onSessionExpired,\n}: CilantroContextProviderProps) {\n const [user, setUser] = useState<User | null>(null);\n const [jwt, setJwt] = useState<string | null>(null);\n const [authLoading, setAuthLoading] = useState(true);\n const [wallets, setWallets] = useState<WalletData[]>([]);\n const [selectedWallet, setSelectedWallet] = useState<WalletData | null>(null);\n const [walletsLoading, setWalletsLoading] = useState(true);\n const [walletError, setWalletError] = useState<string | null>(null);\n\n const config = useMemo<CilantroConfig>(\n () => ({\n apiKey,\n baseURL,\n jwt: jwt ?? undefined,\n }),\n [apiKey, baseURL, jwt]\n );\n\n // Inject storage adapter into core so signer creation uses it\n useEffect(() => {\n setStorageAdapter(storageAdapter ?? null);\n return () => setStorageAdapter(null);\n }, [storageAdapter]);\n\n // Set SDK auth config and restore session from storage\n useEffect(() => {\n setAuthConfig({ apiKey, baseURL });\n const storedToken =\n typeof window !== \"undefined\" ? localStorage.getItem(jwtStorageKey) : null;\n if (storedToken) {\n if (isJwtExpired(storedToken)) {\n if (typeof window !== \"undefined\") {\n localStorage.removeItem(jwtStorageKey);\n const keys = Object.keys(localStorage);\n keys.forEach((key) => {\n if (key.startsWith(\"delegated-key-\")) localStorage.removeItem(key);\n });\n }\n setSdkAuth(null);\n } else {\n setJwt(storedToken);\n setSdkAuth(storedToken);\n try {\n const payload = JSON.parse(atob(storedToken.split(\".\")[1]));\n setUser({\n username: payload.username,\n email: payload.email,\n userType: payload.userType,\n });\n } catch {\n // ignore\n }\n }\n } else {\n setSdkAuth(null);\n }\n setAuthLoading(false);\n }, [apiKey, baseURL, jwtStorageKey]);\n\n const login = useCallback(\n async (params: { usernameOrEmail: string; password: string }) => {\n const result = await cilantroLogin(params);\n const data: AuthControllerLogin200Data | undefined =\n result && typeof result === \"object\" && \"data\" in result\n ? (result as { data: AuthControllerLogin200Data }).data\n : undefined;\n const token =\n (data && \"jwt\" in data ? (data as { jwt?: string }).jwt : undefined) ??\n (data && \"accessToken\" in data ? (data as { accessToken?: string }).accessToken : undefined);\n if (!token) throw new Error(\"No JWT token received from server\");\n const userType = data?.userType;\n setJwt(token);\n setSdkAuth(token);\n if (typeof window !== \"undefined\") {\n localStorage.setItem(jwtStorageKey, token);\n }\n if (data?.user && typeof data.user === \"object\") {\n const u = data.user as Record<string, unknown>;\n setUser({\n username: u.username as string | undefined,\n email: u.email as string | undefined,\n userType: (userType ?? u.userType) as string | undefined,\n });\n } else {\n try {\n const payload = JSON.parse(atob(token.split(\".\")[1])) as Record<string, unknown>;\n setUser({\n username: payload.username as string | undefined,\n email: payload.email as string | undefined,\n userType: (userType ?? payload.userType) as string | undefined,\n });\n } catch {\n setUser({ userType: userType as string | undefined });\n }\n }\n onLoginSuccess?.();\n },\n [jwtStorageKey, onLoginSuccess]\n );\n\n const logout = useCallback(() => {\n setUser(null);\n setJwt(null);\n clearAuth();\n if (typeof window !== \"undefined\") {\n localStorage.removeItem(jwtStorageKey);\n const keys = Object.keys(localStorage);\n keys.forEach((key) => {\n if (key.startsWith(\"delegated-key-\")) localStorage.removeItem(key);\n });\n }\n setSdkAuth(null);\n onLogout?.();\n }, [jwtStorageKey, onLogout]);\n\n const register = useCallback(\n async (username: string, email: string, password: string, isActive = true) => {\n setSdkAuth(null);\n const platformKey = getPlatformApiKey();\n const userData: {\n username: string;\n email: string;\n password: string;\n isActive: boolean;\n platformApiKey?: string;\n } = { username, email, password, isActive };\n if (platformKey) userData.platformApiKey = platformKey;\n await createUser(userData);\n await login({ usernameOrEmail: username, password });\n onRegisterSuccess?.();\n },\n [login, onRegisterSuccess]\n );\n\n const clearSessionDueToAuthError = useCallback(() => {\n setUser(null);\n setJwt(null);\n clearAuth();\n if (typeof window !== \"undefined\") {\n localStorage.removeItem(jwtStorageKey);\n const keys = Object.keys(localStorage);\n keys.forEach((key) => {\n if (key.startsWith(\"delegated-key-\")) localStorage.removeItem(key);\n });\n }\n setSdkAuth(null);\n onSessionExpired?.();\n }, [jwtStorageKey, onSessionExpired]);\n\n const loadWallets = useCallback(async () => {\n if (!jwt) return;\n setWalletsLoading(true);\n setWalletError(null);\n try {\n setSdkAuth(jwt);\n const result = await findAllWallets();\n const walletsList = extractResponseData<WalletDataDto[]>(result) ?? [];\n const list = Array.isArray(walletsList) ? walletsList : [];\n const formatted: WalletData[] = list.map((w) =>\n normalizeWallet(w as unknown as Record<string, unknown>) as unknown as WalletData\n );\n setWallets(formatted);\n } catch (err) {\n if (isAuthError(err)) {\n clearSessionDueToAuthError();\n setWalletError(\"Session expired. Please sign in again.\");\n } else {\n setWalletError(extractErrorMessage(err));\n }\n setWallets([]);\n } finally {\n setWalletsLoading(false);\n }\n }, [jwt, clearSessionDueToAuthError]);\n\n useEffect(() => {\n if (jwt) {\n loadWallets();\n } else {\n setWallets([]);\n setSelectedWallet(null);\n setWalletError(null);\n setWalletsLoading(false);\n }\n }, [jwt, loadWallets]);\n\n useEffect(() => {\n if (wallets.length > 0 && !selectedWallet) {\n const storedId =\n typeof window !== \"undefined\" ? localStorage.getItem(walletStorageKey) : null;\n if (storedId) {\n const w = wallets.find((x) => x.id === storedId || x.walletId === storedId);\n if (w) setSelectedWallet(w);\n else {\n setSelectedWallet(wallets[0]);\n if (typeof window !== \"undefined\")\n localStorage.setItem(walletStorageKey, wallets[0].id ?? wallets[0].walletId);\n }\n } else {\n setSelectedWallet(wallets[0]);\n if (typeof window !== \"undefined\")\n localStorage.setItem(walletStorageKey, wallets[0].id ?? wallets[0].walletId);\n }\n } else if (wallets.length === 0) {\n setSelectedWallet(null);\n if (typeof window !== \"undefined\") localStorage.removeItem(walletStorageKey);\n }\n }, [wallets, walletStorageKey]);\n\n const selectWallet = useCallback(\n (walletId: string) => {\n const w = wallets.find((x) => x.id === walletId || x.walletId === walletId);\n if (w) {\n setSelectedWallet(w);\n if (typeof window !== \"undefined\")\n localStorage.setItem(walletStorageKey, w.id ?? w.walletId);\n }\n },\n [wallets, walletStorageKey]\n );\n\n const createWallet = useCallback(\n async (params: { name: string; userId?: string }) => {\n setSdkAuth(jwt ?? undefined);\n const dto = { walletName: params.name, chain: \"solana\" as const };\n const result = await createWalletSDK(dto);\n await loadWallets();\n return result as WalletControllerCreateResult;\n },\n [jwt, loadWallets]\n );\n\n const value: CilantroContextValue = useMemo(\n () => ({\n config,\n storage: storageAdapter ?? null,\n user,\n jwt,\n isAuthenticated: !!jwt,\n isLoading: authLoading,\n login,\n logout,\n register,\n clearSessionDueToAuthError,\n wallet: selectedWallet,\n wallets,\n createWallet,\n selectWallet,\n refreshWallets: loadWallets,\n walletError,\n walletsLoading,\n }),\n [\n config,\n storageAdapter,\n user,\n jwt,\n authLoading,\n login,\n logout,\n register,\n clearSessionDueToAuthError,\n selectedWallet,\n wallets,\n createWallet,\n selectWallet,\n loadWallets,\n walletError,\n walletsLoading,\n ]\n );\n\n return (\n <CilantroContext.Provider value={value}>{children}</CilantroContext.Provider>\n );\n}\n\nexport function useCilantroContext(): CilantroContextValue {\n const ctx = useContext(CilantroContext);\n if (ctx === undefined) {\n throw new Error(\"useCilantroContext must be used within CilantroContextProvider\");\n }\n return ctx;\n}\n","import { setAuth } from \"cilantro-sdk\";\n\nlet platformApiKey = \"\";\nlet apiUrl: string | undefined;\n\nexport interface AuthConfig {\n platformApiKey?: string;\n apiUrl?: string;\n /** Guide-aligned alias for platformApiKey */\n apiKey?: string;\n /** Guide-aligned alias for apiUrl */\n baseURL?: string;\n jwt?: string | null;\n}\n\n/**\n * Set SDK authentication config. Call with apiKey/baseURL (or platformApiKey/apiUrl) from provider/config.\n * Do not read process.env in library code.\n */\nexport function setAuthConfig(config: AuthConfig): void {\n platformApiKey = config.apiKey ?? config.platformApiKey ?? \"\";\n apiUrl = config.baseURL ?? config.apiUrl;\n const authPayload: { jwt?: string; platformApiKey?: string; apiUrl?: string } = {};\n if (config.jwt) {\n authPayload.jwt = config.jwt;\n }\n if (platformApiKey) {\n authPayload.platformApiKey = platformApiKey;\n }\n if (apiUrl) {\n authPayload.apiUrl = apiUrl;\n }\n setAuth(authPayload);\n}\n\n/**\n * Set SDK auth with JWT (assumes platformApiKey already set via setAuthConfig).\n */\nexport function setSdkAuth(jwt?: string | null): void {\n const authConfig: { jwt?: string; platformApiKey?: string; apiUrl?: string } = {};\n if (jwt) {\n authConfig.jwt = jwt;\n }\n if (platformApiKey) {\n authConfig.platformApiKey = platformApiKey;\n }\n if (apiUrl) {\n authConfig.apiUrl = apiUrl;\n }\n setAuth(authConfig);\n}\n\n/**\n * Get the platform API key (set via setAuthConfig).\n */\nexport function getPlatformApiKey(): string {\n return platformApiKey;\n}\n\n/**\n * Get the optional API URL (set via setAuthConfig).\n */\nexport function getApiUrl(): string | undefined {\n return apiUrl;\n}\n\n/**\n * Check if a JWT is expired using the payload `exp` claim.\n * @param token - JWT string (assumes 3 segments separated by dots).\n * @param bufferSeconds - Optional buffer in seconds; if exp is within this many seconds of now, treat as expired (default 60).\n * @returns true if token is expired or invalid/not a JWT.\n */\nexport function isJwtExpired(token: string, bufferSeconds = 60): boolean {\n if (!token || typeof token !== \"string\") return true;\n const parts = token.split(\".\");\n if (parts.length !== 3) return true;\n try {\n const payload = JSON.parse(atob(parts[1])) as { exp?: number };\n const exp = payload.exp;\n if (exp == null || typeof exp !== \"number\") return false;\n const now = Math.floor(Date.now() / 1000);\n return exp - bufferSeconds <= now;\n } catch {\n return true;\n }\n}\n","import { createIndexedDBAdapter } from \"cilantro-sdk/helpers\";\n\nexport type DeviceKeyStorage = ReturnType<typeof createIndexedDBAdapter>;\n\nlet storageAdapterInstance: DeviceKeyStorage | null = null;\nlet contextProvidedAdapter: DeviceKeyStorage | null = null;\nlet initializationPromise: Promise<DeviceKeyStorage> | null = null;\n\n/**\n * Set the storage adapter from CilantroProvider (context). When set, getStorageAdapter() returns this.\n */\nexport function setStorageAdapter(adapter: DeviceKeyStorage | null): void {\n contextProvidedAdapter = adapter;\n}\n\nexport async function initializeStorageAdapter(): Promise<DeviceKeyStorage> {\n if (contextProvidedAdapter) return contextProvidedAdapter;\n if (storageAdapterInstance) return storageAdapterInstance;\n if (initializationPromise) return initializationPromise;\n if (typeof window === \"undefined\") {\n throw new Error(\"Storage adapter can only be initialized in browser environment.\");\n }\n initializationPromise = (async () => {\n try {\n storageAdapterInstance = createIndexedDBAdapter();\n return storageAdapterInstance;\n } catch (error) {\n initializationPromise = null;\n throw error;\n }\n })();\n return initializationPromise;\n}\n\nexport function getStorageAdapter(): DeviceKeyStorage {\n if (contextProvidedAdapter) return contextProvidedAdapter;\n if (storageAdapterInstance) return storageAdapterInstance;\n if (typeof window === \"undefined\") {\n throw new Error(\"Storage adapter can only be initialized in browser environment.\");\n }\n storageAdapterInstance = createIndexedDBAdapter();\n return storageAdapterInstance;\n}\n\nexport function getStorageAdapterType(): \"IndexedDB\" | \"LocalStorage\" | \"Memory\" | \"Unknown\" {\n if (typeof window === \"undefined\") return \"Memory\";\n if (\"indexedDB\" in window) return \"IndexedDB\";\n return \"Unknown\";\n}\n\nexport function clearStorageAdapter(): void {\n storageAdapterInstance = null;\n}\n","/**\n * Type Utilities - common types and utilities for SDK interactions\n */\n\nexport type ActionState<T = unknown> = {\n status: \"idle\" | \"loading\" | \"success\" | \"error\";\n message?: string;\n detail?: T;\n};\n\nexport interface ErrorResponse {\n message?: string;\n error?: string;\n code?: string | number;\n status?: number;\n statusText?: string;\n data?: unknown;\n stack?: string;\n type?: string;\n}\n\nexport type ApiResponse<T> = T | { data: T } | { success: boolean; data: T };\n\nexport function extractResponseData<T>(response: unknown): T | null {\n if (!response) return null;\n if (typeof response !== \"object\" || response === null) {\n return response as T;\n }\n if (\"data\" in response) {\n const data = (response as { data: unknown }).data;\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const dataObj = data as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n if (\"authenticationSigners\" in dataObj || \"onChainSigners\" in dataObj) {\n const authSigners = Array.isArray(dataObj.authenticationSigners) ? dataObj.authenticationSigners : [];\n const onChainSigners = Array.isArray(dataObj.onChainSigners) ? dataObj.onChainSigners : [];\n return [...authSigners, ...onChainSigners] as T;\n }\n }\n return data as T;\n }\n if (\"success\" in response && \"data\" in response) {\n const data = (response as { success: boolean; data: unknown }).data;\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const dataObj = data as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n if (\"authenticationSigners\" in dataObj || \"onChainSigners\" in dataObj) {\n const authSigners = Array.isArray(dataObj.authenticationSigners) ? dataObj.authenticationSigners : [];\n const onChainSigners = Array.isArray(dataObj.onChainSigners) ? dataObj.onChainSigners : [];\n return [...authSigners, ...onChainSigners] as T;\n }\n }\n return data as T;\n }\n if (\"authenticationSigners\" in response || \"onChainSigners\" in response) {\n const responseObj = response as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n const authSigners = Array.isArray(responseObj.authenticationSigners) ? responseObj.authenticationSigners : [];\n const onChainSigners = Array.isArray(responseObj.onChainSigners) ? responseObj.onChainSigners : [];\n return [...authSigners, ...onChainSigners] as T;\n }\n return response as T;\n}\n\nexport function extractOnChainSigners<T>(response: unknown): T[] {\n if (!response || typeof response !== \"object\" || response === null) return [];\n let signersObj: { authenticationSigners?: unknown[]; onChainSigners?: unknown[] } | null = null;\n if (\"data\" in response) {\n const data = (response as { data: unknown }).data;\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const dataObj = data as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n if (\"authenticationSigners\" in dataObj || \"onChainSigners\" in dataObj) signersObj = dataObj;\n }\n }\n if (!signersObj && \"success\" in response && \"data\" in response) {\n const data = (response as { success: boolean; data: unknown }).data;\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const dataObj = data as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n if (\"authenticationSigners\" in dataObj || \"onChainSigners\" in dataObj) signersObj = dataObj;\n }\n }\n if (!signersObj && (\"authenticationSigners\" in response || \"onChainSigners\" in response)) {\n signersObj = response as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n }\n if (signersObj) {\n return (Array.isArray(signersObj.onChainSigners) ? signersObj.onChainSigners : []) as T[];\n }\n if (Array.isArray(response)) return response as T[];\n return [];\n}\n\nexport function extractAuthenticationSigners<T>(response: unknown): T[] {\n if (!response || typeof response !== \"object\" || response === null) return [];\n let signersObj: { authenticationSigners?: unknown[]; onChainSigners?: unknown[] } | null = null;\n if (\"data\" in response) {\n const data = (response as { data: unknown }).data;\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const dataObj = data as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n if (\"authenticationSigners\" in dataObj || \"onChainSigners\" in dataObj) signersObj = dataObj;\n }\n }\n if (!signersObj && \"success\" in response && \"data\" in response) {\n const data = (response as { success: boolean; data: unknown }).data;\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const dataObj = data as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n if (\"authenticationSigners\" in dataObj || \"onChainSigners\" in dataObj) signersObj = dataObj;\n }\n }\n if (!signersObj && (\"authenticationSigners\" in response || \"onChainSigners\" in response)) {\n signersObj = response as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n }\n if (signersObj) {\n return (Array.isArray(signersObj.authenticationSigners) ? signersObj.authenticationSigners : []) as T[];\n }\n return [];\n}\n\nexport function isErrorWithResponse(\n error: unknown\n): error is { response?: { data?: { message?: string; error?: string }; status?: number; statusText?: string } } {\n return typeof error === \"object\" && error !== null && \"response\" in error;\n}\n\nexport function isErrorWithMessage(error: unknown): error is { message?: string } {\n return typeof error === \"object\" && error !== null && \"message\" in error;\n}\n","import { isErrorWithResponse, isErrorWithMessage } from \"./types\";\nimport type { ErrorResponse } from \"./types\";\n\nexport function extractErrorMessage(error: unknown): string {\n if (!error) return \"An unknown error occurred\";\n if (error instanceof Error) return error.message;\n if (isErrorWithResponse(error)) {\n if (error.response?.data?.message) return String(error.response.data.message);\n if (error.response?.data?.error) return String(error.response.data.error);\n }\n if (isErrorWithMessage(error)) return String(error.message);\n if (typeof error === \"object\" && error !== null && \"error\" in error) {\n return String((error as { error: unknown }).error);\n }\n return String(error);\n}\n\nexport function getErrorDetails(error: unknown): ErrorResponse | null {\n if (!error) return null;\n if (typeof error === \"object\" && error !== null) {\n const err = error as { name?: string; constructor?: { name?: string }; code?: string | number; stack?: string };\n const details: ErrorResponse = {\n message: extractErrorMessage(error),\n type: err.name || (err.constructor?.name as string | undefined),\n stack: err.stack,\n };\n if (isErrorWithResponse(error)) {\n details.code = err.code ?? error.response?.status;\n details.status = error.response?.status;\n details.statusText = error.response?.statusText;\n details.data = error.response?.data;\n } else if (err.code) {\n details.code = err.code;\n }\n return details;\n }\n return { message: extractErrorMessage(error), data: error };\n}\n\nexport function isNetworkError(error: unknown): boolean {\n if (!error || typeof error !== \"object\" || error === null) return false;\n const err = error as { code?: string; message?: string };\n const hasResponse = isErrorWithResponse(error);\n return (\n err.code === \"ECONNREFUSED\" ||\n err.code === \"ETIMEDOUT\" ||\n err.code === \"ENOTFOUND\" ||\n (err.message?.toLowerCase().includes(\"network\") ?? false) ||\n (err.message?.toLowerCase().includes(\"connection\") ?? false) ||\n !hasResponse\n );\n}\n\nexport function isAuthError(error: unknown): boolean {\n if (!error || typeof error !== \"object\" || error === null) return false;\n if (isErrorWithResponse(error)) {\n const status = error.response?.status;\n if (status === 401 || status === 403) return true;\n }\n const err = error as { message?: string };\n const message = err.message?.toLowerCase() ?? \"\";\n return message.includes(\"unauthorized\") || message.includes(\"authentication\");\n}\n","/**\n * Normalization at the boundary: map SDK DTOs to a consistent shape with id/address (and aliases).\n * Use these when ingesting wallet/signer data from the SDK so consumers can rely on id and address.\n */\n\n/** Normalized wallet shape: always has id and address. */\nexport interface NormalizedWallet {\n id: string;\n address: string;\n active?: boolean;\n [key: string]: unknown;\n}\n\n/**\n * Normalize a wallet DTO so that id and address are always present.\n * Use at the boundary when loading wallets from the SDK.\n * Accepts any object with optional walletId/id, walletAddress/address, isActive.\n */\nexport function normalizeWallet(dto: Record<string, unknown>): NormalizedWallet {\n const w = dto as { walletId?: string; id?: string; walletAddress?: string; address?: string; isActive?: boolean };\n return {\n ...dto,\n id: w.walletId ?? w.id ?? \"\",\n address: w.walletAddress ?? w.address ?? \"\",\n active: w.isActive,\n } as NormalizedWallet;\n}\n","\"use client\";\n\nimport { type ReactNode, useEffect } from \"react\";\nimport { CilantroContextProvider } from \"../context/CilantroContext\";\nimport { initializeStorageAdapter } from \"../core/storage-adapter\";\nimport type { DeviceKeyStorage } from \"../core/storage-adapter\";\n\nexport interface CilantroProviderProps {\n children: ReactNode;\n /** Platform API key (guide: apiKey). Either apiKey or jwt via login is required for authenticated requests. */\n apiKey?: string;\n /** API base URL (guide: baseURL). Default: https://api.cilantro.gg */\n baseURL?: string;\n /** Storage for device keys - email/phone signers (guide: storageAdapter). Default: IndexedDB in browser. */\n storageAdapter?: DeviceKeyStorage | null;\n /** @deprecated Use apiKey instead. */\n platformApiKey?: string;\n /** @deprecated Use baseURL instead. */\n apiUrl?: string;\n /** localStorage key for JWT (default: cilantro_jwt) */\n jwtStorageKey?: string;\n /** localStorage key for selected wallet id (default: cilantro_selected_wallet_id) */\n walletStorageKey?: string;\n onLoginSuccess?: () => void;\n onLogout?: () => void;\n onRegisterSuccess?: () => void;\n onSessionExpired?: () => void;\n}\n\nexport function CilantroProvider({\n children,\n apiKey: apiKeyProp,\n baseURL,\n storageAdapter,\n platformApiKey,\n apiUrl,\n jwtStorageKey,\n walletStorageKey,\n onLoginSuccess,\n onLogout,\n onRegisterSuccess,\n onSessionExpired,\n}: CilantroProviderProps) {\n const apiKey = apiKeyProp ?? platformApiKey;\n const resolvedBaseURL = baseURL ?? apiUrl;\n\n useEffect(() => {\n if (!storageAdapter) {\n initializeStorageAdapter().catch((err) => {\n console.error(\"[CilantroProvider] Failed to initialize storage adapter:\", err);\n });\n }\n }, [storageAdapter]);\n\n return (\n <CilantroContextProvider\n apiKey={apiKey}\n baseURL={resolvedBaseURL}\n storageAdapter={storageAdapter ?? undefined}\n jwtStorageKey={jwtStorageKey}\n walletStorageKey={walletStorageKey}\n onLoginSuccess={onLoginSuccess}\n onLogout={onLogout}\n onRegisterSuccess={onRegisterSuccess}\n onSessionExpired={onSessionExpired}\n >\n {children}\n </CilantroContextProvider>\n );\n}\n","\"use client\";\n\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport type { User } from \"../context/CilantroContext\";\n\nexport interface CilantroAuthContextType {\n user: User | null;\n token: string | null;\n isAuthenticated: boolean;\n login: (usernameOrEmail: string, password: string) => Promise<void>;\n register: (username: string, email: string, password: string, isActive?: boolean) => Promise<void>;\n logout: () => void;\n clearSessionDueToAuthError: () => void;\n isLoading: boolean;\n}\n\nexport function useCilantroAuth(): CilantroAuthContextType {\n const ctx = useCilantroContext();\n return {\n user: ctx.user,\n token: ctx.jwt,\n isAuthenticated: ctx.isAuthenticated,\n login: (usernameOrEmail: string, password: string) =>\n ctx.login({ usernameOrEmail, password }),\n register: ctx.register,\n logout: ctx.logout,\n clearSessionDueToAuthError: ctx.clearSessionDueToAuthError,\n isLoading: ctx.isLoading,\n };\n}\n\nexport type { User };\n","\"use client\";\n\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport type { WalletData } from \"../context/CilantroContext\";\n\nexport interface WalletContextType {\n selectedWallet: WalletData | null;\n wallets: WalletData[];\n selectWallet: (walletId: string) => void;\n refreshWallets: () => Promise<void>;\n isLoading: boolean;\n error: string | null;\n}\n\nexport function useWallets(): WalletContextType {\n const ctx = useCilantroContext();\n return {\n selectedWallet: ctx.wallet,\n wallets: ctx.wallets,\n selectWallet: ctx.selectWallet,\n refreshWallets: ctx.refreshWallets,\n isLoading: ctx.walletsLoading,\n error: ctx.walletError,\n };\n}\n\nexport type { WalletData };\nexport type WalletDataDto = WalletData;\n","/**\n * cilantro-react - Public API\n * React SDK/UI for Cilantro Smart Wallet (guide-aligned)\n */\n\n// Context\nexport {\n CilantroContextProvider,\n useCilantroContext,\n type CilantroConfig,\n type CilantroContextValue,\n type User,\n type WalletData,\n type WalletDataDto,\n} from \"./context/CilantroContext\";\n\n// Provider (single entry point)\nexport {\n CilantroProvider,\n type CilantroProviderProps,\n} from \"./providers/CilantroProvider\";\n\n// Auth/wallet hooks (read from context)\nexport { useCilantroAuth, type CilantroAuthContextType } from \"./providers/CilantroAuthProvider\";\nexport {\n useWallets,\n type WalletContextType,\n type WalletData as WalletDataFromHook,\n type WalletDataDto as WalletDataDtoFromHook,\n} from \"./providers/WalletProvider\";\n\n// Storage adapters\nexport {\n createIndexedDBAdapter,\n createLocalStorageAdapter,\n createMemoryAdapter,\n} from \"cilantro-sdk/helpers\";\nexport type { DeviceKeyStorage } from \"./core/storage-adapter\";\n\n// Hooks (guide API)\nexport { useCilantroConfig, type UseCilantroConfigResult } from \"./hooks/useCilantroConfig\";\nexport { useAuth, type UseAuthResult } from \"./hooks/useAuth\";\nexport { useWallet, type UseWalletResult } from \"./hooks/useWallet\";\nexport { useSigners, type UseSignersOptions, type UseSignersResult } from \"./hooks/useSigners\";\nexport { usePasskey, type UsePasskeyResult } from \"./hooks/usePasskey\";\nexport {\n useExternalWallet,\n type UseExternalWalletResult,\n type SolanaWallet,\n} from \"./hooks/useExternalWallet\";\nexport {\n useSendTransaction,\n type UseSendTransactionResult,\n type SubmitTransactionResult,\n type SignerType as SendTransactionSignerType,\n} from \"./hooks/useSendTransaction\";\n\n// Auth components\nexport { LoginForm, type LoginFormProps, type LoginFormClassNames } from \"./components/auth/LoginForm\";\nexport { LogoutButton, type LogoutButtonProps } from \"./components/auth/LogoutButton\";\nexport { AuthGuard, type AuthGuardProps, type AuthGuardClassNames } from \"./components/auth/AuthGuard\";\n\n// Signer components\nexport {\n CreateEmailSignerForm,\n type CreateEmailSignerFormProps,\n} from \"./components/signers/CreateEmailSignerForm\";\nexport {\n CreatePhoneSignerForm,\n type CreatePhoneSignerFormProps,\n} from \"./components/signers/CreatePhoneSignerForm\";\nexport { AddPasskeyButton, type AddPasskeyButtonProps } from \"./components/signers/AddPasskeyButton\";\nexport {\n SignerList,\n type SignerListProps,\n type SignerListClassNames,\n} from \"./components/signers/SignerList\";\nexport {\n SignerSelector,\n type SignerSelectorProps,\n type SignerSelectorClassNames,\n} from \"./components/signers/SignerSelector\";\n\n// Wallet components\nexport {\n ConnectWalletButton,\n type ConnectWalletButtonProps,\n} from \"./components/wallet/ConnectWalletButton\";\nexport {\n CreateWalletForm,\n type CreateWalletFormProps,\n} from \"./components/wallet/CreateWalletForm\";\nexport {\n WalletSelector,\n type WalletSelectorProps,\n type WalletSelectorClassNames,\n} from \"./components/wallet/WalletSelector\";\nexport { WalletAddress, type WalletAddressProps } from \"./components/wallet/WalletAddress\";\nexport { WalletBalance, type WalletBalanceProps } from \"./components/wallet/WalletBalance\";\n\n// Transaction components\nexport {\n SendSOLForm,\n type SendSOLFormProps,\n type SignerType as SendSOLSignerType,\n} from \"./components/transactions/SendSOLForm\";\nexport {\n SendSPLForm,\n type SendSPLFormProps,\n} from \"./components/transactions/SendSPLForm\";\nexport {\n TransactionStatus,\n type TransactionStatusProps,\n} from \"./components/transactions/TransactionStatus\";\nexport {\n TransactionHistory,\n type TransactionHistoryProps,\n} from \"./components/transactions/TransactionHistory\";\n\n// Layout / utility\nexport {\n CilantroConnect,\n type CilantroConnectProps,\n type WalletInfo,\n} from \"./components/layout/CilantroConnect\";\nexport { LoadingOverlay, type LoadingOverlayProps } from \"./components/layout/LoadingOverlay\";\nexport { ErrorBoundary, type ErrorBoundaryProps } from \"./components/layout/ErrorBoundary\";\n\n// UI primitives\nexport { Skeleton } from \"./ui/skeleton\";\nexport {\n ThemeProvider,\n type Theme,\n type ResolvedTheme,\n type ThemeProviderProps,\n} from \"./ui/theme-provider\";\n\n// Core types and utilities\nexport type { ActionState, ApiResponse, ErrorResponse } from \"./core/types\";\nexport type { SignerData } from \"./core/signer-helpers\";\nexport { normalizeSigner } from \"./core/signer-helpers\";\nexport { normalizeWallet } from \"./core/normalize\";\nexport type { NormalizedWallet } from \"./core/normalize\";\nexport { extractResponseData } from \"./core/types\";\nexport { extractErrorMessage, isAuthError } from \"./core/error-utils\";\nexport { isJwtExpired } from \"./core/auth\";\n\n// Solana connection adapter (advanced usage)\nexport {\n adaptSolanaConnection,\n type SignAndSendConnectionAdapter,\n} from \"./adapters/solana-connection\";\n\n// Signer signing (advanced usage)\nexport {\n signMessageWithSigner,\n signAndSendTransactionWithSigner,\n signTransactionWithSigner,\n getWalletData,\n getSignerPublicKey,\n SIGNER_TYPES,\n type SignerType,\n type SignAndSendConnection,\n type SignAndSendResult,\n type SubmitTransactionDataDto,\n type SignMessageResult,\n} from \"./core/signer-signing\";\n\n// SDK types (re-exports)\nexport type { AuthControllerLogin200Data } from \"cilantro-sdk/auth\";\nexport type {\n WalletControllerFindAllResult,\n WalletControllerFindOneResult,\n WalletControllerSubmitTransactionResult,\n WalletControllerListSignersResult,\n} from \"cilantro-sdk/wallet\";\nexport type { TransactionControllerSendRawPasskeyTransactionResult } from \"cilantro-sdk/transactions\";\n","\"use client\";\n\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport type { CilantroConfig } from \"../context/CilantroContext\";\nimport type { DeviceKeyStorage } from \"../core/storage-adapter\";\n\nexport interface UseCilantroConfigResult {\n config: CilantroConfig;\n storage: DeviceKeyStorage | null;\n}\n\nexport function useCilantroConfig(): UseCilantroConfigResult {\n const ctx = useCilantroContext();\n return {\n config: ctx.config,\n storage: ctx.storage,\n };\n}\n","\"use client\";\n\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport type { User } from \"../context/CilantroContext\";\n\nexport interface UseAuthResult {\n user: User | null;\n jwt: string | null;\n isLoading: boolean;\n isAuthenticated: boolean;\n login: (params: { usernameOrEmail: string; password: string }) => Promise<void>;\n logout: () => void;\n}\n\nexport function useAuth(): UseAuthResult {\n const ctx = useCilantroContext();\n return {\n user: ctx.user,\n jwt: ctx.jwt,\n isLoading: ctx.isLoading,\n isAuthenticated: ctx.isAuthenticated,\n login: ctx.login,\n logout: ctx.logout,\n };\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport type { WalletData } from \"../context/CilantroContext\";\nimport type { WalletControllerCreateResult } from \"cilantro-sdk/wallet\";\n\nexport interface UseWalletResult {\n wallet: WalletData | null;\n wallets: WalletData[];\n createWallet: (params: { name: string; userId?: string }) => Promise<WalletControllerCreateResult>;\n selectWallet: (walletId: string) => void;\n isLoading: boolean;\n}\n\nexport function useWallet(_walletId?: string): UseWalletResult {\n const ctx = useCilantroContext();\n return useMemo(\n () => ({\n wallet: ctx.wallet,\n wallets: ctx.wallets,\n createWallet: ctx.createWallet,\n selectWallet: ctx.selectWallet,\n isLoading: ctx.walletsLoading,\n }),\n [\n ctx.wallet,\n ctx.wallets,\n ctx.createWallet,\n ctx.selectWallet,\n ctx.walletsLoading,\n ]\n );\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport { setSdkAuth } from \"../core/auth\";\nimport { loadSigners, type SignerData } from \"../core/signer-helpers\";\nimport {\n createEmailSignerHelper,\n createPhoneSignerHelper,\n} from \"../core/signer-creation\";\nimport { deleteSigner } from \"cilantro-sdk/wallet\";\nimport type { SignerInfo } from \"cilantro-sdk/helpers\";\n\nexport interface UseSignersOptions {\n /** Wallet ID to load signers for. If not provided, uses selectedWallet?.id from context (call useWallets() in same component). */\n walletId?: string | null;\n}\n\nexport interface UseSignersResult {\n signers: SignerData[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n createEmailSigner: (params: { email: string }) => Promise<SignerInfo>;\n createPhoneSigner: (params: { phone: string }) => Promise<SignerInfo>;\n revokeSigner: (signerId: string) => Promise<void>;\n}\n\nexport function useSigners(\n walletIdOrOptions?: string | null | UseSignersOptions\n): UseSignersResult {\n const walletIdOption =\n typeof walletIdOrOptions === \"object\"\n ? walletIdOrOptions?.walletId\n : walletIdOrOptions;\n const { jwt } = useCilantroContext();\n const [signers, setSigners] = useState<SignerData[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const load = useCallback(\n async (walletId: string) => {\n if (!walletId) {\n setSigners([]);\n return;\n }\n setIsLoading(true);\n setError(null);\n try {\n if (jwt) setSdkAuth(jwt);\n const list = await loadSigners(walletId);\n setSigners(list);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n setSigners([]);\n } finally {\n setIsLoading(false);\n }\n },\n [jwt]\n );\n\n useEffect(() => {\n const id = walletIdOption ?? undefined;\n if (id) load(id);\n else {\n setSigners([]);\n setError(null);\n }\n }, [walletIdOption, load]);\n\n const refresh = useCallback(async () => {\n const id = walletIdOption ?? undefined;\n if (id) await load(id);\n }, [walletIdOption, load]);\n\n const createEmailSigner = useCallback(\n async (params: { email: string }) => {\n const walletId = walletIdOption ?? undefined;\n if (!walletId) throw new Error(\"walletId is required\");\n if (jwt) setSdkAuth(jwt);\n const signer = await createEmailSignerHelper(walletId, params.email);\n await refresh();\n return signer;\n },\n [walletIdOption, jwt, refresh]\n );\n\n const createPhoneSigner = useCallback(\n async (params: { phone: string }) => {\n const walletId = walletIdOption ?? undefined;\n if (!walletId) throw new Error(\"walletId is required\");\n if (jwt) setSdkAuth(jwt);\n const signer = await createPhoneSignerHelper(walletId, params.phone);\n await refresh();\n return signer;\n },\n [walletIdOption, jwt, refresh]\n );\n\n const revokeSigner = useCallback(\n async (signerId: string) => {\n const walletId = walletIdOption ?? undefined;\n if (!walletId) throw new Error(\"walletId is required\");\n if (jwt) setSdkAuth(jwt);\n await deleteSigner(walletId, signerId);\n await refresh();\n },\n [walletIdOption, jwt, refresh]\n );\n\n return {\n signers,\n isLoading,\n error,\n refresh,\n createEmailSigner,\n createPhoneSigner,\n revokeSigner,\n };\n}\n","import { getSigners, parseSignerResponse, type SignerInfo } from \"cilantro-sdk/helpers\";\nimport { listSigners } from \"cilantro-sdk/wallet\";\nimport { extractOnChainSigners, extractAuthenticationSigners } from \"./types\";\n\n/**\n * Normalized signer shape aligned with SDK SignerDataDto / WalletSignerDataDto.\n * Uses SDK field names (signerId, signerType, signerPubkey, authId); id is an alias for signerId or WalletSignerDataDto.id.\n */\nexport interface SignerData extends Omit<SignerInfo, \"signerId\"> {\n id: string;\n signerId: string;\n signerType?: string;\n signerPubkey?: string;\n signerConfig?: { email?: string; phone?: string; credentialId?: string };\n deviceIdentities?: unknown[];\n credentialId?: string;\n authId?: string;\n signerCategory?: \"onchain\" | \"authenticationsigner\";\n [key: string]: unknown;\n}\n\nexport async function loadSigners(walletId: string): Promise<SignerData[]> {\n if (!walletId) return [];\n try {\n let signersResult = (await getSigners(walletId)) as unknown;\n let onChainSigners = extractOnChainSigners<Record<string, unknown>>(signersResult);\n let authSigners = extractAuthenticationSigners<Record<string, unknown>>(signersResult);\n if (\n (!onChainSigners || !Array.isArray(onChainSigners) || onChainSigners.length === 0) &&\n (!authSigners || !Array.isArray(authSigners) || authSigners.length === 0)\n ) {\n const response = await listSigners(walletId);\n onChainSigners = extractOnChainSigners<Record<string, unknown>>(response);\n authSigners = extractAuthenticationSigners<Record<string, unknown>>(response);\n }\n const processedOnChain = onChainSigners\n .filter((s) => s && typeof s === \"object\")\n .map((signer) => processSigner(signer, \"onchain\"));\n const processedAuth = authSigners\n .filter((s) => s && typeof s === \"object\")\n .map((signer) => processSigner(signer, \"authenticationsigner\"));\n return [...processedOnChain, ...processedAuth].filter((s) => s.id && (s.type || s.signerType));\n } catch (error) {\n console.error(\"Failed to load signers:\", error);\n return [];\n }\n}\n\n/**\n * Normalize a raw signer DTO to SignerData (id, signerId, signerPubkey/publicKey, etc.).\n * Use at API boundaries when ingesting signer data from the SDK.\n */\nexport function normalizeSigner(\n signer: Record<string, unknown>,\n category: \"onchain\" | \"authenticationsigner\"\n): SignerData {\n return processSigner(signer, category);\n}\n\nfunction processSigner(signer: Record<string, unknown>, category: \"onchain\" | \"authenticationsigner\"): SignerData {\n const parsed = parseSignerResponse(signer);\n const signerId = (signer.id ?? signer.signerId ?? parsed.signerId) as string;\n const signerType = (signer.signerType ?? signer.type ?? parsed.type) as string;\n const signerPubkey = (signer.signerPubkey ?? signer.publicKey ?? parsed.publicKey ?? \"\") as string;\n const authId = (signer.authId ?? parsed.email ?? parsed.phone) as string | undefined;\n const walletId = (signer.walletId ?? parsed.walletId) as string | undefined;\n let email = (signer.email ?? parsed.email) as string | undefined;\n let phone = (signer.phone ?? parsed.phone) as string | undefined;\n if (!email && !phone && authId) {\n if (signerType === \"email\") email = authId;\n else if (signerType === \"phone\") phone = authId;\n }\n const signerConfig = signer.signerConfig as { email?: string; phone?: string } | undefined;\n if (signerConfig) {\n if (!email && signerConfig.email) email = signerConfig.email;\n if (!phone && signerConfig.phone) phone = signerConfig.phone;\n }\n const isActive =\n signer.isActive !== undefined ? (signer.isActive as boolean) : (parsed.isActive !== undefined ? parsed.isActive : true);\n return {\n ...signer,\n id: signerId,\n signerId,\n walletId: walletId ?? \"\",\n type: signerType,\n signerType,\n publicKey: signerPubkey,\n signerPubkey,\n email,\n phone,\n isActive,\n credentialId: (signer.credentialId ?? (signerType === \"passkey\" ? authId : undefined)) as string | undefined,\n authId,\n deviceIdentities: signer.deviceIdentities as unknown[] | undefined,\n signerConfig: signer.signerConfig as SignerData[\"signerConfig\"],\n permissions: signer.permissions,\n signerCategory: category,\n } as SignerData;\n}\n\nexport function getSignerType(signer: SignerData): string {\n return signer.type || signer.signerType || \"\";\n}\n\nexport function getSignerTypeLabel(type?: string): string {\n if (!type) return \"Unknown\";\n const t = type.toLowerCase();\n if (t === \"email\") return \"Email\";\n if (t === \"phone\") return \"Phone\";\n if (t === \"external\" || t === \"external-wallet\") return \"External Wallet\";\n if (t === \"passkey\") return \"Passkey\";\n if (t === \"api-key\" || t === \"apikey\") return \"API Key\";\n return type;\n}\n\nexport function getSignerDisplayName(signer: SignerData): string {\n const signerType = getSignerType(signer);\n const typeLabel = getSignerTypeLabel(signerType);\n const shortId = signer.id.length > 8 ? `${signer.id.slice(0, 4)}...${signer.id.slice(-4)}` : signer.id;\n if (signer.email) return `${typeLabel}: ${signer.email}`;\n if (signer.phone) return `${typeLabel}: ${signer.phone}`;\n if (signerType === \"passkey\") {\n const credId =\n (signer.credentialId as string | undefined) ??\n (signer.authId as string | undefined) ??\n (signer.signerConfig as { credentialId?: string } | undefined)?.credentialId;\n if (credId) {\n const shortCredId = credId.length > 12 ? `${credId.slice(0, 6)}...${credId.slice(-6)}` : credId;\n return `${typeLabel} (${shortCredId})`;\n }\n return `${typeLabel} (${shortId})`;\n }\n return `${typeLabel} (${shortId})`;\n}\n\nexport function getSignerUniqueId(signer: SignerData): string {\n if (signer.id) return signer.id.length > 12 ? `${signer.id.slice(0, 6)}...${signer.id.slice(-6)}` : signer.id;\n if (signer.publicKey) return `${signer.publicKey.slice(0, 6)}...${signer.publicKey.slice(-6)}`;\n return \"Unknown\";\n}\n\nexport function validateSignerActive(signer: SignerData, signerType: string): void {\n if (!signer.isActive) {\n throw new Error(`${signerType} signer is not active. Please activate the signer first.`);\n }\n}\n\nexport function extractSignerInfo(signer: SignerData): { signerId: string; signerType: string } {\n const signerType = signer.type || signer.signerType;\n const signerId = signer.id || signer.signerId;\n if (!signerType) throw new Error(`Signer type is missing. Signer data: ${JSON.stringify(signer)}`);\n if (!signerId) throw new Error(`Signer ID is missing. Signer data: ${JSON.stringify(signer)}`);\n return { signerId, signerType };\n}\n","import type { Transaction } from \"@solana/web3.js\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport {\n createEmailSignerHelper as createEmailSignerSDK,\n createPhoneSignerHelper as createPhoneSignerSDK,\n isValidEmail,\n isValidPhone,\n type SignerInfo,\n authenticateWithPasskey,\n findExistingPasskeySigner,\n formatAuthenticationResponse,\n isWebAuthnSupported,\n registerPasskeyComplete,\n signWithPasskeySigner,\n} from \"cilantro-sdk/helpers\";\nimport {\n sendRawPasskeyTransaction,\n type TransactionControllerSendRawPasskeyTransactionResult,\n} from \"cilantro-sdk/transactions\";\nimport { createExternalWalletSigner, startPasskeyAuthentication } from \"cilantro-sdk/wallet\";\nimport type { WalletControllerStartPasskeyAuthenticationResult } from \"cilantro-sdk/wallet\";\nimport { getStorageAdapter } from \"./storage-adapter\";\nimport { loadSigners } from \"./signer-helpers\";\nimport { extractResponseData } from \"./types\";\n\ntype PasskeyTransactionDataDto = TransactionControllerSendRawPasskeyTransactionResult[\"data\"];\n\nexport async function createEmailSignerHelper(walletId: string, email: string): Promise<SignerInfo> {\n const trimmedEmail = email.trim();\n if (!trimmedEmail) throw new Error(\"Email address is required\");\n if (!isValidEmail(trimmedEmail)) throw new Error(\"Invalid email address format\");\n const deviceKeyManager = getStorageAdapter();\n return await createEmailSignerSDK(walletId, { email: trimmedEmail, deviceKeyManager });\n}\n\nexport async function createPhoneSignerHelper(walletId: string, phone: string): Promise<SignerInfo> {\n const trimmedPhone = phone.trim();\n if (!trimmedPhone) throw new Error(\"Phone number is required\");\n if (!isValidPhone(trimmedPhone)) throw new Error(\"Invalid phone number format\");\n const deviceKeyManager = getStorageAdapter();\n return await createPhoneSignerSDK(walletId, { phone: trimmedPhone, deviceKeyManager });\n}\n\nexport async function createExternalSignerHelper(walletId: string, address: string): Promise<unknown> {\n if (!address.trim()) throw new Error(\"Wallet address is required\");\n return await createExternalWalletSigner(walletId, { address: address.trim(), chain: \"solana\" });\n}\n\nexport async function registerPasskeySigner(walletId: string): Promise<{\n signerId: string;\n isNew: boolean;\n credentialId?: string;\n}> {\n if (!isWebAuthnSupported()) throw new Error(\"WebAuthn is not supported in this browser\");\n return await registerPasskeyComplete(walletId);\n}\n\nexport async function checkExistingPasskey(\n walletId: string,\n credentialId?: string\n): Promise<{ signerId: string; credentialId?: string } | null> {\n return await findExistingPasskeySigner(walletId, credentialId);\n}\n\nexport async function signWithPasskey(\n walletId: string,\n signerId: string,\n message: string,\n options?: { useBrowserAutofill?: boolean }\n): Promise<{ signature: string; signer: string }> {\n if (!isWebAuthnSupported()) throw new Error(\"WebAuthn is not supported in this browser\");\n const messageBytes = new TextEncoder().encode(message);\n const signature = await signWithPasskeySigner(walletId, signerId, messageBytes, options);\n return {\n signature: Buffer.from(signature).toString(\"hex\"),\n signer: signerId,\n };\n}\n\nexport async function signAndSendPasskeyTransaction(\n walletId: string,\n signerId: string,\n transaction: Transaction,\n options?: { credentialId?: string; useBrowserAutofill?: boolean; mintAddress?: string }\n): Promise<{ signature: string; status?: string }> {\n if (!isWebAuthnSupported()) throw new Error(\"WebAuthn is not supported in this browser\");\n let credentialId = options?.credentialId;\n if (!credentialId) {\n const signers = await loadSigners(walletId);\n const passkeySigner = signers.find((s) => s.id === signerId || s.signerId === signerId);\n if (!passkeySigner) {\n throw new Error(\n `Passkey signer ${signerId} not found in wallet. Available signers: ${signers.map((s) => `${s.id} (${s.type})`).join(\", \")}`\n );\n }\n credentialId =\n passkeySigner.credentialId ??\n (passkeySigner.signerConfig as { credentialId?: string } | undefined)?.credentialId ??\n (passkeySigner.authId as string | undefined);\n if (!credentialId) {\n throw new Error(`Credential ID not found for passkey signer ${signerId}.`);\n }\n }\n let mintAddress: string | undefined = options?.mintAddress;\n if (!mintAddress && transaction.instructions.length > 0) {\n const systemProgramId = new PublicKey(\"11111111111111111111111111111111\");\n const feePayer = transaction.feePayer || systemProgramId;\n transaction.instructions.forEach((ix) => {\n ix.keys.forEach((key) => {\n if (key.isWritable && key.isSigner && !key.pubkey.equals(feePayer) && !mintAddress) {\n mintAddress = key.pubkey.toString();\n }\n });\n });\n }\n const unsignedTransaction = transaction.serialize({ verifySignatures: false }).toString(\"base64\");\n const authOptions: WalletControllerStartPasskeyAuthenticationResult = await startPasskeyAuthentication(\n walletId,\n { credentialId: options?.credentialId }\n );\n const authData = extractResponseData<WalletControllerStartPasskeyAuthenticationResult[\"data\"]>(authOptions);\n if (!authData) throw new Error(\"Failed to get authentication options\");\n const authDataValue =\n authData && typeof authData === \"object\" && \"data\" in authData\n ? (authData as { data: unknown }).data\n : authData;\n const credential = await authenticateWithPasskey(\n authDataValue as Parameters<typeof authenticateWithPasskey>[0],\n { useBrowserAutofill: options?.useBrowserAutofill ?? false }\n );\n const formattedCredential = formatAuthenticationResponse(credential);\n const dto = {\n walletId,\n credentialId,\n unsignedTransaction,\n signature: formattedCredential.response.signature,\n authenticatorData: formattedCredential.response.authenticatorData,\n clientDataJSON: formattedCredential.response.clientDataJSON,\n };\n const result: TransactionControllerSendRawPasskeyTransactionResult = await sendRawPasskeyTransaction(dto);\n const resultData = extractResponseData<PasskeyTransactionDataDto>(result);\n return {\n signature: resultData?.signature ?? \"\",\n status: resultData?.status,\n };\n}\n","\"use client\";\n\nimport { useState, useCallback } from \"react\";\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport { isWebAuthnSupported } from \"cilantro-sdk/helpers\";\nimport { registerPasskeySigner } from \"../core/signer-creation\";\nimport { startPasskeyAuthentication } from \"cilantro-sdk/wallet\";\nimport { extractResponseData } from \"../core/types\";\nimport { authenticateWithPasskey, formatAuthenticationResponse } from \"cilantro-sdk/helpers\";\n\nexport interface UsePasskeyResult {\n isSupported: boolean;\n register: () => Promise<{ signerId: string; isNew: boolean; credentialId?: string }>;\n authenticate: (signerId?: string) => Promise<{ signature: string; signerId: string }>;\n isLoading: boolean;\n}\n\nexport function usePasskey(walletId: string | undefined): UsePasskeyResult {\n const { jwt } = useCilantroContext();\n const [isLoading, setIsLoading] = useState(false);\n const isSupported = typeof window !== \"undefined\" && isWebAuthnSupported();\n\n const register = useCallback(async () => {\n if (!walletId) throw new Error(\"walletId is required\");\n if (!isSupported) throw new Error(\"WebAuthn is not supported in this browser\");\n setIsLoading(true);\n try {\n const result = await registerPasskeySigner(walletId);\n return result;\n } finally {\n setIsLoading(false);\n }\n }, [walletId, isSupported]);\n\n const authenticate = useCallback(\n async (signerId?: string) => {\n if (!walletId) throw new Error(\"walletId is required\");\n if (!isSupported) throw new Error(\"WebAuthn is not supported in this browser\");\n setIsLoading(true);\n try {\n const authOptions = await startPasskeyAuthentication(walletId, {\n credentialId: undefined,\n });\n const authData = extractResponseData(authOptions);\n const authDataValue =\n authData && typeof authData === \"object\" && \"data\" in authData\n ? (authData as { data: unknown }).data\n : authData;\n const credential = await authenticateWithPasskey(\n authDataValue as Parameters<typeof authenticateWithPasskey>[0],\n { useBrowserAutofill: false }\n );\n const formatted = formatAuthenticationResponse(credential);\n return {\n signature: Buffer.from(formatted.response.signature).toString(\"hex\"),\n signerId: signerId ?? \"\",\n };\n } finally {\n setIsLoading(false);\n }\n },\n [walletId, isSupported]\n );\n\n return { isSupported, register, authenticate, isLoading };\n}\n","\"use client\";\n\nimport { useState, useCallback, useEffect } from \"react\";\n\n/** Minimal Solana wallet interface (Phantom, Solflare, etc.) */\nexport interface SolanaWallet {\n name: string;\n publicKey: { toString: () => string } | null;\n connect: () => Promise<{ publicKey: { toString: () => string } }>;\n disconnect: () => Promise<void>;\n}\n\ndeclare global {\n interface Window {\n solana?: SolanaWallet & { isPhantom?: boolean };\n solflare?: SolanaWallet;\n }\n}\n\nfunction getDetectedWallets(): SolanaWallet[] {\n if (typeof window === \"undefined\") return [];\n const list: SolanaWallet[] = [];\n if (window.solana?.connect) {\n list.push({\n name: \"Phantom\",\n publicKey: window.solana.publicKey ?? null,\n connect: window.solana.connect.bind(window.solana),\n disconnect: window.solana.disconnect?.bind(window.solana) ?? (() => Promise.resolve()),\n });\n }\n if (window.solflare?.connect && !list.some((w) => w.name === \"Solflare\")) {\n list.push({\n name: \"Solflare\",\n publicKey: window.solflare.publicKey ?? null,\n connect: window.solflare.connect.bind(window.solflare),\n disconnect: window.solflare.disconnect?.bind(window.solflare) ?? (() => Promise.resolve()),\n });\n }\n return list;\n}\n\nexport interface UseExternalWalletResult {\n wallets: SolanaWallet[];\n connectedWallet: SolanaWallet | null;\n connect: (wallet: SolanaWallet) => Promise<string>;\n disconnect: () => Promise<void>;\n}\n\nexport function useExternalWallet(): UseExternalWalletResult {\n const [wallets, setWallets] = useState<SolanaWallet[]>([]);\n const [connectedWallet, setConnectedWallet] = useState<SolanaWallet | null>(null);\n\n useEffect(() => {\n setWallets(getDetectedWallets());\n }, []);\n\n const connect = useCallback(async (wallet: SolanaWallet) => {\n const res = await wallet.connect();\n const publicKey = res.publicKey.toString();\n setConnectedWallet(wallet);\n return publicKey;\n }, []);\n\n const disconnect = useCallback(async () => {\n if (connectedWallet?.disconnect) {\n await connectedWallet.disconnect();\n }\n setConnectedWallet(null);\n }, [connectedWallet]);\n\n return { wallets, connectedWallet, connect, disconnect };\n}\n","\"use client\";\n\nimport { useState, useCallback } from \"react\";\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport { setSdkAuth } from \"../core/auth\";\nimport { sendSOL as sendSOLApi, sendSPL as sendSPLApi } from \"cilantro-sdk/wallet\";\nimport { extractResponseData } from \"../core/types\";\nimport { extractErrorMessage } from \"../core/error-utils\";\n\nexport type SignerType = \"email\" | \"phone\" | \"passkey\" | \"external\";\n\nexport interface SubmitTransactionResult {\n success: boolean;\n data: { signature?: string; [key: string]: unknown };\n}\n\nexport interface UseSendTransactionResult {\n sendSOL: (params: {\n recipientAddress: string;\n amountLamports: number;\n }) => Promise<SubmitTransactionResult>;\n sendSPL: (params: {\n mintAddress: string;\n recipientAddress: string;\n amount: number;\n }) => Promise<SubmitTransactionResult>;\n isPending: boolean;\n error: string | null;\n}\n\nexport function useSendTransaction(\n walletId: string | undefined,\n _signerId?: string,\n _signerType?: SignerType\n): UseSendTransactionResult {\n const { jwt } = useCilantroContext();\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const sendSOL = useCallback(\n async (params: { recipientAddress: string; amountLamports: number }) => {\n if (!walletId) throw new Error(\"walletId is required\");\n setError(null);\n setIsPending(true);\n try {\n if (jwt) setSdkAuth(jwt);\n const result = await sendSOLApi(walletId, {\n recipientAddress: params.recipientAddress,\n amountLamports: params.amountLamports,\n });\n const data = extractResponseData<{ transactionHash?: string }>(result);\n const signature = data?.transactionHash ?? (data as { signature?: string })?.signature;\n return {\n success: true,\n data: { signature, ...data },\n } as SubmitTransactionResult;\n } catch (err) {\n const msg = extractErrorMessage(err);\n setError(msg);\n throw new Error(msg);\n } finally {\n setIsPending(false);\n }\n },\n [walletId, jwt]\n );\n\n const sendSPL = useCallback(\n async (params: {\n mintAddress: string;\n recipientAddress: string;\n amount: number;\n }) => {\n if (!walletId) throw new Error(\"walletId is required\");\n setError(null);\n setIsPending(true);\n try {\n if (jwt) setSdkAuth(jwt);\n const result = await sendSPLApi(walletId, {\n mintAddress: params.mintAddress,\n recipientAddress: params.recipientAddress,\n amount: params.amount,\n });\n const data = extractResponseData<{ transactionHash?: string }>(result);\n const signature = data?.transactionHash ?? (data as { signature?: string })?.signature;\n return {\n success: true,\n data: { signature, ...data },\n } as SubmitTransactionResult;\n } catch (err) {\n const msg = extractErrorMessage(err);\n setError(msg);\n throw new Error(msg);\n } finally {\n setIsPending(false);\n }\n },\n [walletId, jwt]\n );\n\n return { sendSOL, sendSPL, isPending, error };\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useCilantroAuth } from \"../../providers/CilantroAuthProvider\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"../../ui/card\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface LoginFormClassNames {\n root?: string;\n header?: string;\n title?: string;\n description?: string;\n form?: string;\n label?: string;\n input?: string;\n submitButton?: string;\n error?: string;\n}\n\nexport interface LoginFormProps {\n className?: string;\n classNames?: LoginFormClassNames;\n style?: React.CSSProperties;\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n rememberMe?: boolean;\n /** Override submit button label */\n submitLabel?: string;\n /** Override title */\n title?: string;\n /** Override description */\n description?: string;\n /** Render \"Create account\" link (e.g. to switch to register). Shown below submit. */\n renderSwitchToRegister?: () => React.ReactNode;\n}\n\nexport function LoginForm({\n className,\n classNames,\n style,\n onSuccess,\n onError,\n submitLabel = \"Sign in\",\n title = \"Sign in\",\n description,\n renderSwitchToRegister,\n}: LoginFormProps) {\n const { login, isLoading } = useCilantroAuth();\n const [usernameOrEmail, setUsernameOrEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n try {\n await login(usernameOrEmail.trim(), password);\n onSuccess?.();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n };\n\n return (\n <Card className={cn(className, classNames?.root)} style={style} data-cilantro-login-form>\n <CardHeader className={classNames?.header}>\n <CardTitle className={classNames?.title}>{title}</CardTitle>\n {description != null && (\n <CardDescription className={classNames?.description}>{description}</CardDescription>\n )}\n </CardHeader>\n <CardContent>\n <form onSubmit={handleSubmit} className={cn(\"space-y-4\", classNames?.form)}>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-login-username\" className={classNames?.label}>\n Username or email\n </Label>\n <Input\n id=\"cilantro-login-username\"\n type=\"text\"\n autoComplete=\"username\"\n className={classNames?.input}\n value={usernameOrEmail}\n onChange={(e) => setUsernameOrEmail(e.target.value)}\n placeholder=\"Username or email\"\n required\n disabled={isLoading}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-login-password\" className={classNames?.label}>\n Password\n </Label>\n <Input\n id=\"cilantro-login-password\"\n type=\"password\"\n autoComplete=\"current-password\"\n className={classNames?.input}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Password\"\n required\n disabled={isLoading}\n />\n </div>\n {error && (\n <div\n className={cn(\n \"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\",\n classNames?.error\n )}\n role=\"alert\"\n >\n {error}\n </div>\n )}\n <Button\n type=\"submit\"\n size=\"touch\"\n className={cn(\"w-full\", classNames?.submitButton)}\n disabled={isLoading || !usernameOrEmail.trim() || !password}\n >\n {isLoading ? \"Signing in...\" : submitLabel}\n </Button>\n {renderSwitchToRegister && (\n <div className=\"text-center text-sm text-muted-foreground\">{renderSwitchToRegister()}</div>\n )}\n </form>\n </CardContent>\n </Card>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"./cn\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive: \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline: \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary: \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n touch: \"h-12 min-h-[44px] min-w-[44px] rounded-md px-4\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />;\n }\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"./cn\";\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n ref={ref}\n {...props}\n />\n );\n }\n);\nInput.displayName = \"Input\";\n\nexport { Input };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"./cn\";\n\nconst labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n);\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root ref={ref} className={cn(labelVariants(), className)} {...props} />\n));\nLabel.displayName = LabelPrimitive.Root.displayName;\n\nexport { Label };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"./cn\";\n\nconst Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"rounded-xl border bg-card text-card-foreground shadow\", className)}\n {...props}\n />\n )\n);\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"flex flex-col space-y-1.5 p-6\", className)} {...props} />\n )\n);\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLHeadingElement>>(\n ({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\"font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n )\n);\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p ref={ref} className={cn(\"text-sm text-muted-foreground\", className)} {...props} />\n));\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n )\n);\nCardContent.displayName = \"CardContent\";\n\nconst CardFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"flex items-center p-6 pt-0\", className)} {...props} />\n )\n);\nCardFooter.displayName = \"CardFooter\";\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { useAuth } from \"../../hooks/useAuth\";\nimport { Button } from \"../../ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../../ui/dialog\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface LogoutButtonProps {\n onLogout?: () => void;\n confirmBeforeLogout?: boolean;\n className?: string;\n children?: ReactNode;\n}\n\nexport function LogoutButton({\n onLogout,\n confirmBeforeLogout = false,\n className,\n children,\n}: LogoutButtonProps) {\n const { logout } = useAuth();\n const [confirmOpen, setConfirmOpen] = useState(false);\n\n const handleLogout = () => {\n logout();\n setConfirmOpen(false);\n onLogout?.();\n };\n\n const handleClick = () => {\n if (confirmBeforeLogout) {\n setConfirmOpen(true);\n } else {\n handleLogout();\n }\n };\n\n return (\n <>\n <Button\n type=\"button\"\n variant=\"outline\"\n className={cn(className)}\n onClick={handleClick}\n data-cilantro-logout-button\n >\n {children ?? \"Log out\"}\n </Button>\n {confirmBeforeLogout && (\n <Dialog open={confirmOpen} onOpenChange={setConfirmOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Log out?</DialogTitle>\n <DialogDescription>Are you sure you want to log out?</DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setConfirmOpen(false)}>\n Cancel\n </Button>\n <Button variant=\"destructive\" onClick={handleLogout}>\n Log out\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )}\n </>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { cn } from \"./cn\";\n\nconst Dialog = DialogPrimitive.Root;\nconst DialogTrigger = DialogPrimitive.Trigger;\nconst DialogPortal = DialogPrimitive.Portal;\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg max-h-[100dvh] sm:max-h-[90vh] translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 overflow-y-auto data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n className\n )}\n {...props}\n >\n {children}\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"flex flex-col space-y-1.5 text-center sm:text-left\", className)} {...props} />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\", className)}\n {...props}\n />\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"./cn\";\n\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"rounded-md bg-muted animate-pulse\", className)}\n {...props}\n />\n )\n);\nSkeleton.displayName = \"Skeleton\";\n\nexport { Skeleton };\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { useCilantroAuth } from \"../../providers/CilantroAuthProvider\";\nimport { LoginForm } from \"./LoginForm\";\nimport { Skeleton } from \"../../ui/skeleton\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface AuthGuardClassNames {\n root?: string;\n fallback?: string;\n skeleton?: string;\n loading?: string;\n}\n\nexport interface AuthGuardProps {\n children: ReactNode;\n /** Shown when not authenticated. Default: <LoginForm /> */\n fallback?: ReactNode;\n /** If using a router, redirect to this path when not authenticated (consumer can pass fallback={<Navigate to={redirectTo} />}) */\n redirectTo?: string;\n /** Root class when showing fallback */\n className?: string;\n classNames?: AuthGuardClassNames;\n /** When true, show fallback (login) instead of children when unauthenticated. When false, render null when unauthenticated. */\n showFallback?: boolean;\n /** When true, show a small skeleton card while loading; when false (default), show \"Loading...\" text. */\n useSkeleton?: boolean;\n}\n\n/**\n * Wraps content and shows fallback (e.g. LoginForm) when the user is not authenticated.\n * Use inside CilantroProvider.\n */\nexport function AuthGuard({\n children,\n fallback,\n redirectTo,\n className,\n classNames,\n showFallback = true,\n useSkeleton = false,\n}: AuthGuardProps) {\n const { isAuthenticated, isLoading } = useCilantroAuth();\n\n if (isLoading) {\n return (\n <div\n className={cn(className, classNames?.root, classNames?.loading)}\n data-cilantro-auth-guard\n aria-busy=\"true\"\n aria-live=\"polite\"\n >\n {useSkeleton ? (\n <div className={cn(\"rounded-lg border border-input p-4 space-y-3 w-full max-w-sm\", classNames?.fallback)}>\n <Skeleton className={cn(\"h-6 w-2/3 rounded\", classNames?.skeleton)} />\n <Skeleton className={cn(\"h-4 w-full rounded\", classNames?.skeleton)} />\n <Skeleton className={cn(\"h-4 w-[80%] rounded\", classNames?.skeleton)} />\n </div>\n ) : (\n <div className={cn(\"text-sm text-muted-foreground\", classNames?.fallback)}>Loading...</div>\n )}\n </div>\n );\n }\n\n if (!isAuthenticated) {\n if (!showFallback) return null;\n if (redirectTo && typeof window !== \"undefined\") {\n window.location.href = redirectTo;\n return null;\n }\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-auth-guard>\n {fallback ?? <LoginForm className={classNames?.fallback} />}\n </div>\n );\n }\n\n return <>{children}</>;\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useSigners } from \"../../hooks/useSigners\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { cn } from \"../../ui/cn\";\nimport type { SignerInfo } from \"cilantro-sdk/helpers\";\n\nexport interface CreateEmailSignerFormProps {\n walletId: string;\n onCreated?: (signer: SignerInfo) => void;\n onError?: (error: Error) => void;\n className?: string;\n}\n\nexport function CreateEmailSignerForm({\n walletId,\n onCreated,\n onError,\n className,\n}: CreateEmailSignerFormProps) {\n const { createEmailSigner, isLoading } = useSigners(walletId);\n const [email, setEmail] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n try {\n const signer = await createEmailSigner({ email: email.trim() });\n setEmail(\"\");\n onCreated?.(signer);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className={cn(\"space-y-4\", className)} data-cilantro-create-email-signer>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-email-signer-email\">Email</Label>\n <Input\n id=\"cilantro-email-signer-email\"\n type=\"email\"\n autoComplete=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n disabled={isLoading}\n />\n </div>\n {error && (\n <div className=\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\" role=\"alert\">\n {error}\n </div>\n )}\n <Button type=\"submit\" disabled={isLoading || !email.trim()}>\n {isLoading ? \"Creating...\" : \"Create email signer\"}\n </Button>\n </form>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useSigners } from \"../../hooks/useSigners\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { cn } from \"../../ui/cn\";\nimport type { SignerInfo } from \"cilantro-sdk/helpers\";\n\nexport interface CreatePhoneSignerFormProps {\n walletId: string;\n onCreated?: (signer: SignerInfo) => void;\n onError?: (error: Error) => void;\n className?: string;\n}\n\nexport function CreatePhoneSignerForm({\n walletId,\n onCreated,\n onError,\n className,\n}: CreatePhoneSignerFormProps) {\n const { createPhoneSigner, isLoading } = useSigners(walletId);\n const [phone, setPhone] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n try {\n const signer = await createPhoneSigner({ phone: phone.trim() });\n setPhone(\"\");\n onCreated?.(signer);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className={cn(\"space-y-4\", className)} data-cilantro-create-phone-signer>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-phone-signer-phone\">Phone number</Label>\n <Input\n id=\"cilantro-phone-signer-phone\"\n type=\"tel\"\n autoComplete=\"tel\"\n value={phone}\n onChange={(e) => setPhone(e.target.value)}\n placeholder=\"+1234567890\"\n required\n disabled={isLoading}\n />\n </div>\n {error && (\n <div className=\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\" role=\"alert\">\n {error}\n </div>\n )}\n <Button type=\"submit\" disabled={isLoading || !phone.trim()}>\n {isLoading ? \"Creating...\" : \"Create phone signer\"}\n </Button>\n </form>\n );\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { usePasskey } from \"../../hooks/usePasskey\";\nimport { Button } from \"../../ui/button\";\nimport { cn } from \"../../ui/cn\";\nimport type { SignerInfo } from \"cilantro-sdk/helpers\";\n\nexport interface AddPasskeyButtonProps {\n walletId: string;\n onRegistered?: (signer: SignerInfo) => void;\n onError?: (error: Error) => void;\n className?: string;\n children?: ReactNode;\n}\n\nexport function AddPasskeyButton({\n walletId,\n onRegistered,\n onError,\n className,\n children,\n}: AddPasskeyButtonProps) {\n const { isSupported, register, isLoading } = usePasskey(walletId);\n const [error, setError] = useState<string | null>(null);\n\n const handleClick = async () => {\n setError(null);\n try {\n const result = await register();\n onRegistered?.(result as unknown as SignerInfo);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n };\n\n if (!isSupported) return null;\n\n return (\n <div className={cn(className)} data-cilantro-add-passkey>\n <Button type=\"button\" variant=\"outline\" onClick={handleClick} disabled={isLoading}>\n {children ?? \"Add Passkey\"}\n </Button>\n {error && (\n <p className=\"mt-2 text-sm text-destructive\" role=\"alert\">\n {error}\n </p>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useSigners } from \"../../hooks/useSigners\";\nimport { getSignerDisplayName, getSignerTypeLabel } from \"../../core/signer-helpers\";\nimport type { SignerData } from \"../../core/signer-helpers\";\nimport { Button } from \"../../ui/button\";\nimport { Skeleton } from \"../../ui/skeleton\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"../../ui/dialog\";\nimport { CreateEmailSignerForm } from \"./CreateEmailSignerForm\";\nimport { CreatePhoneSignerForm } from \"./CreatePhoneSignerForm\";\nimport { AddPasskeyButton } from \"./AddPasskeyButton\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface SignerListClassNames {\n root?: string;\n header?: string;\n list?: string;\n item?: string;\n addButton?: string;\n message?: string;\n skeleton?: string;\n loading?: string;\n}\n\nexport interface SignerListProps {\n walletId: string;\n onRevoke?: (signerId: string) => void;\n className?: string;\n classNames?: SignerListClassNames;\n onSignerAdded?: () => void;\n useSkeleton?: boolean;\n children?: (props: {\n signers: SignerData[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n openAddSigner: () => void;\n }) => React.ReactNode;\n}\n\nexport function SignerList({\n walletId,\n onRevoke,\n className,\n classNames,\n onSignerAdded,\n useSkeleton = true,\n children,\n}: SignerListProps) {\n const { signers, isLoading, error, refresh, revokeSigner } = useSigners(walletId);\n const [addSignerOpen, setAddSignerOpen] = useState(false);\n\n const handleAddSuccess = () => {\n refresh();\n setAddSignerOpen(false);\n onSignerAdded?.();\n };\n\n const handleRevoke = async (signerId: string) => {\n try {\n await revokeSigner(signerId);\n onRevoke?.(signerId);\n } catch {\n // error handled by hook/UI\n }\n };\n\n if (children) {\n return (\n <>\n {children({\n signers,\n isLoading,\n error,\n refresh,\n openAddSigner: () => setAddSignerOpen(true),\n })}\n <Dialog open={addSignerOpen} onOpenChange={setAddSignerOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Add signer</DialogTitle>\n </DialogHeader>\n <div className=\"space-y-4\">\n <CreateEmailSignerForm\n walletId={walletId}\n onCreated={handleAddSuccess}\n />\n <CreatePhoneSignerForm\n walletId={walletId}\n onCreated={handleAddSuccess}\n />\n <AddPasskeyButton\n walletId={walletId}\n onRegistered={handleAddSuccess}\n />\n </div>\n </DialogContent>\n </Dialog>\n </>\n );\n }\n\n if (!walletId) {\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-signer-list>\n <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>Select a wallet first.</p>\n </div>\n );\n }\n\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-signer-list aria-busy={isLoading} aria-live=\"polite\">\n <div className={cn(\"flex items-center justify-between gap-2 mb-2\", classNames?.header)}>\n <span className=\"text-sm font-medium\">Signers</span>\n <Button\n type=\"button\"\n size=\"touch\"\n variant=\"outline\"\n className={classNames?.addButton}\n onClick={() => setAddSignerOpen(true)}\n disabled={isLoading}\n aria-label=\"Add signer\"\n >\n Add signer\n </Button>\n </div>\n {isLoading && useSkeleton ? (\n <div className={cn(\"space-y-1\", classNames?.loading)} aria-busy=\"true\" aria-live=\"polite\">\n {[1, 2, 3].map((i) => (\n <Skeleton key={i} className={cn(\"h-5 w-full rounded-md\", classNames?.skeleton)} />\n ))}\n </div>\n ) : isLoading ? (\n <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>Loading signers...</p>\n ) : error ? (\n <div className={cn(\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2\", classNames?.message)} role=\"alert\">\n <p className=\"text-sm text-destructive\">{error}</p>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"mt-2\" onClick={() => refresh()}>\n Retry\n </Button>\n </div>\n ) : signers.length === 0 ? (\n <div className={cn(\"rounded-md border border-input bg-muted/30 px-4 py-3 text-sm text-muted-foreground\", classNames?.message)}>\n <p className=\"font-medium text-foreground\">No signers</p>\n <p className=\"mt-1\">Add a signer to authorize transactions for this wallet.</p>\n <Button\n type=\"button\"\n size=\"touch\"\n variant=\"outline\"\n className={cn(\"mt-3\", classNames?.addButton)}\n onClick={() => setAddSignerOpen(true)}\n aria-label=\"Add signer\"\n >\n Add signer\n </Button>\n </div>\n ) : (\n <ul className={cn(\"space-y-1\", classNames?.list)} role=\"list\">\n {signers.map((signer) => (\n <li key={signer.id} className={cn(\"flex items-center justify-between gap-2 text-sm\", classNames?.item)}>\n <span>\n {getSignerDisplayName(signer)} ({getSignerTypeLabel(signer.type || signer.signerType || \"\")})\n </span>\n {onRevoke && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-destructive\"\n onClick={() => handleRevoke(signer.id)}\n aria-label=\"Revoke signer\"\n >\n Revoke\n </Button>\n )}\n </li>\n ))}\n </ul>\n )}\n <Dialog open={addSignerOpen} onOpenChange={setAddSignerOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Add signer</DialogTitle>\n </DialogHeader>\n <div className=\"space-y-4\">\n <CreateEmailSignerForm walletId={walletId} onCreated={handleAddSuccess} />\n <CreatePhoneSignerForm walletId={walletId} onCreated={handleAddSuccess} />\n <AddPasskeyButton walletId={walletId} onRegistered={handleAddSuccess} />\n </div>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","\"use client\";\n\nimport { useSigners } from \"../../hooks/useSigners\";\nimport type { SignerData } from \"../../core/signer-helpers\";\nimport { getSignerDisplayName, getSignerTypeLabel, getSignerUniqueId } from \"../../core/signer-helpers\";\nimport { Button } from \"../../ui/button\";\nimport { Skeleton } from \"../../ui/skeleton\";\nimport { cn } from \"../../ui/cn\";\nimport type { SignerType } from \"../../core/signer-signing\";\n\nexport interface SignerSelectorClassNames {\n root?: string;\n list?: string;\n item?: string;\n message?: string;\n skeleton?: string;\n loading?: string;\n}\n\n/** Guide API: walletId + value + onChange(signerId, signerType) */\nexport interface SignerSelectorProps {\n walletId: string;\n value?: string;\n onChange: (signerId: string, signerType: SignerType) => void;\n className?: string;\n classNames?: SignerSelectorClassNames;\n useSkeleton?: boolean;\n /** Legacy: when provided with availableSigners/selectedSigner/onSignerSelect, use legacy API */\n selectedWalletId?: string;\n availableSigners?: SignerData[];\n selectedSigner?: SignerData | null;\n isLoadingSigners?: boolean;\n onSignerSelect?: (signer: SignerData) => void;\n renderList?: (props: {\n signers: SignerData[];\n selectedSigner: SignerData | null;\n onSelect: (signer: SignerData) => void;\n isLoading: boolean;\n getSignerDisplayName: (s: SignerData) => string;\n getSignerTypeLabel: (type: string) => string;\n getSignerUniqueId: (s: SignerData) => string;\n }) => React.ReactNode;\n children?: (props: {\n signers: SignerData[];\n selectedSigner: SignerData | null;\n onSignerSelect: (signer: SignerData) => void;\n isLoading: boolean;\n }) => React.ReactNode;\n}\n\nexport function SignerSelector({\n walletId,\n value,\n onChange,\n className,\n classNames,\n useSkeleton = true,\n selectedWalletId,\n availableSigners: availableSignersProp,\n selectedSigner: selectedSignerProp,\n isLoadingSigners: isLoadingSignersProp,\n onSignerSelect,\n renderList,\n children,\n}: SignerSelectorProps) {\n const { signers, isLoading } = useSigners(walletId);\n const availableSigners = availableSignersProp ?? signers;\n const isLoadingSigners = isLoadingSignersProp ?? isLoading;\n const resolvedSelected =\n value != null\n ? availableSigners.find((s) => s.id === value || s.signerId === value)\n : null;\n const selectedSigner = selectedSignerProp ?? resolvedSelected ?? null;\n\n const handleSelect = (signer: SignerData) => {\n const signerType = (signer.type || signer.signerType || \"email\") as SignerType;\n onChange(signer.id, signerType);\n onSignerSelect?.(signer);\n };\n\n if (!walletId && !selectedWalletId) return null;\n\n if (children) {\n return (\n <>\n {children({\n signers: availableSigners,\n selectedSigner,\n onSignerSelect: handleSelect,\n isLoading: isLoadingSigners,\n })}\n </>\n );\n }\n\n if (renderList) {\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-signer-selector>\n {renderList({\n signers: availableSigners,\n selectedSigner: selectedSigner ?? null,\n onSelect: handleSelect,\n isLoading: isLoadingSigners,\n getSignerDisplayName,\n getSignerTypeLabel,\n getSignerUniqueId,\n })}\n </div>\n );\n }\n\n const loadingContent =\n isLoadingSigners && useSkeleton ? (\n <div className={cn(\"space-y-1\", classNames?.loading)} aria-busy=\"true\" aria-live=\"polite\">\n {[1, 2, 3].map((i) => (\n <Skeleton key={i} className={cn(\"h-8 w-full rounded-md\", classNames?.skeleton)} />\n ))}\n </div>\n ) : isLoadingSigners ? (\n <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>Loading signers...</p>\n ) : null;\n\n return (\n <div\n className={cn(className, classNames?.root)}\n data-cilantro-signer-selector\n role=\"listbox\"\n aria-label=\"Select signer\"\n aria-busy={isLoadingSigners}\n aria-live=\"polite\"\n >\n {loadingContent ??\n (availableSigners.length === 0 ? (\n <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>No signers for this wallet.</p>\n ) : (\n <ul className={cn(\"space-y-1\", classNames?.list)}>\n {availableSigners.map((signer) => (\n <li key={signer.id}>\n <Button\n type=\"button\"\n variant={selectedSigner?.id === signer.id ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n className={cn(\"w-full justify-start\", classNames?.item)}\n onClick={() => handleSelect(signer)}\n aria-pressed={selectedSigner?.id === signer.id}\n >\n {getSignerDisplayName(signer)} ({getSignerTypeLabel(signer.type || signer.signerType || \"\")})\n </Button>\n </li>\n ))}\n </ul>\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { useExternalWallet } from \"../../hooks/useExternalWallet\";\nimport type { SolanaWallet } from \"../../hooks/useExternalWallet\";\nimport { Button } from \"../../ui/button\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface ConnectWalletButtonProps {\n onConnect?: (publicKey: string, wallet: SolanaWallet) => void;\n onDisconnect?: () => void;\n className?: string;\n children?: ReactNode;\n}\n\nexport function ConnectWalletButton({\n onConnect,\n onDisconnect,\n className,\n children,\n}: ConnectWalletButtonProps) {\n const { wallets, connectedWallet, connect, disconnect } = useExternalWallet();\n const [loading, setLoading] = useState(false);\n\n const handleConnect = async (wallet: SolanaWallet) => {\n setLoading(true);\n try {\n const publicKey = await connect(wallet);\n onConnect?.(publicKey, wallet);\n } finally {\n setLoading(false);\n }\n };\n\n const handleDisconnect = async () => {\n setLoading(true);\n try {\n await disconnect();\n onDisconnect?.();\n } finally {\n setLoading(false);\n }\n };\n\n if (connectedWallet) {\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n className={cn(className)}\n onClick={handleDisconnect}\n disabled={loading}\n data-cilantro-connect-wallet\n >\n {loading ? \"Disconnecting...\" : \"Disconnect\"}\n </Button>\n );\n }\n\n if (wallets.length === 0) {\n return (\n <Button type=\"button\" variant=\"outline\" className={cn(className)} disabled data-cilantro-connect-wallet>\n No wallet detected\n </Button>\n );\n }\n\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n className={cn(className)}\n onClick={() => handleConnect(wallets[0])}\n disabled={loading}\n data-cilantro-connect-wallet\n >\n {loading ? \"Connecting...\" : (children ?? \"Connect Wallet\")}\n </Button>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useWallet } from \"../../hooks/useWallet\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { cn } from \"../../ui/cn\";\nimport type { WalletControllerCreateResult } from \"cilantro-sdk/wallet\";\n\nexport interface CreateWalletFormProps {\n userId?: string;\n onCreated?: (wallet: WalletControllerCreateResult) => void;\n onError?: (error: Error) => void;\n className?: string;\n}\n\nexport function CreateWalletForm({\n userId,\n onCreated,\n onError,\n className,\n}: CreateWalletFormProps) {\n const { createWallet, isLoading } = useWallet();\n const [name, setName] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n try {\n const result = await createWallet({ name: name.trim(), userId });\n setName(\"\");\n onCreated?.(result);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className={cn(\"space-y-4\", className)} data-cilantro-create-wallet>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-wallet-name\">Wallet name</Label>\n <Input\n id=\"cilantro-wallet-name\"\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"My Wallet\"\n required\n disabled={isLoading}\n />\n </div>\n {error && (\n <div className=\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\" role=\"alert\">\n {error}\n </div>\n )}\n <Button type=\"submit\" disabled={isLoading || !name.trim()}>\n {isLoading ? \"Creating...\" : \"Create wallet\"}\n </Button>\n </form>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\nimport { cn } from \"./cn\";\n\nconst Select = SelectPrimitive.Root;\nconst SelectGroup = SelectPrimitive.Group;\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <span className=\"ml-2 h-4 w-4 shrink-0 opacity-50\">▼</span>\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n));\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>✓</SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n));\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nexport { Select, SelectGroup, SelectValue, SelectTrigger, SelectContent, SelectItem };\n","\"use client\";\n\nimport { useWallets } from \"../../providers/WalletProvider\";\nimport type { WalletData } from \"../../providers/WalletProvider\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../ui/select\";\nimport { Skeleton } from \"../../ui/skeleton\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface WalletSelectorClassNames {\n root?: string;\n trigger?: string;\n content?: string;\n item?: string;\n skeleton?: string;\n loading?: string;\n}\n\nexport interface WalletSelectorProps {\n value?: string;\n onChange?: (walletId: string) => void;\n onWalletChange?: (walletId: string, wallet: WalletData | null) => void;\n className?: string;\n classNames?: WalletSelectorClassNames;\n useSkeleton?: boolean;\n placeholder?: string;\n renderTrigger?: (props: {\n selectedWallet: WalletData | null;\n wallets: WalletData[];\n isLoading: boolean;\n open: boolean;\n setOpen: (open: boolean) => void;\n }) => React.ReactNode;\n renderList?: (props: {\n wallets: WalletData[];\n selectedWallet: WalletData | null;\n onSelect: (wallet: WalletData) => void;\n isLoading: boolean;\n }) => React.ReactNode;\n children?: (props: {\n wallets: WalletData[];\n selectedWallet: WalletData | null;\n selectWallet: (walletId: string) => void;\n isLoading: boolean;\n refreshWallets: () => Promise<void>;\n }) => React.ReactNode;\n}\n\nexport function WalletSelector(props: WalletSelectorProps) {\n const {\n value,\n onChange,\n onWalletChange,\n className,\n classNames,\n useSkeleton = true,\n placeholder = \"Select a wallet\",\n renderTrigger,\n renderList,\n children,\n } = props;\n const { wallets, selectedWallet, selectWallet, isLoading, refreshWallets } = useWallets();\n const isEmpty = !isLoading && wallets.length === 0;\n const effectiveValue = value ?? selectedWallet?.id ?? selectedWallet?.walletId ?? \"\";\n const selected = wallets.find((w) => w.id === effectiveValue || w.walletId === effectiveValue) ?? selectedWallet;\n\n const handleSelect = (wallet: WalletData) => {\n const id = wallet.id ?? wallet.walletId;\n selectWallet(id);\n onChange?.(id);\n onWalletChange?.(id, wallet);\n };\n\n const handleValueChange = (id: string) => {\n selectWallet(id);\n onChange?.(id);\n onWalletChange?.(id, wallets.find((w) => w.id === id || w.walletId === id) ?? null);\n };\n\n if (children) {\n return (\n <>\n {children({\n wallets,\n selectedWallet: selected,\n selectWallet: (id) => {\n selectWallet(id);\n onChange?.(id);\n onWalletChange?.(id, wallets.find((w) => w.id === id || w.walletId === id) ?? null);\n },\n isLoading,\n refreshWallets,\n })}\n </>\n );\n }\n\n if (renderTrigger || renderList) {\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-wallet-selector>\n {renderTrigger?.({ selectedWallet: selected, wallets, isLoading, open: false, setOpen: () => {} })}\n {renderList?.({ wallets, selectedWallet: selected, onSelect: handleSelect, isLoading })}\n </div>\n );\n }\n\n if (isLoading && useSkeleton) {\n return (\n <div\n className={cn(className, classNames?.root, classNames?.loading)}\n data-cilantro-wallet-selector\n aria-busy=\"true\"\n aria-live=\"polite\"\n >\n <div\n className={cn(\n \"flex h-9 w-full items-center justify-between rounded-md border border-input bg-transparent px-3 py-2\",\n classNames?.trigger\n )}\n >\n <Skeleton className={cn(\"h-4 flex-1 rounded\", classNames?.skeleton)} />\n </div>\n </div>\n );\n }\n\n if (isEmpty) {\n return (\n <div\n className={cn(\n \"rounded-md border border-input bg-muted/30 px-4 py-3 text-sm text-muted-foreground\",\n className,\n classNames?.root\n )}\n data-cilantro-wallet-selector\n >\n <p className=\"font-medium text-foreground\">No wallets</p>\n <p className=\"mt-1\">Wallets are created by the platform when you sign in. If you just logged in, try refreshing.</p>\n </div>\n );\n }\n\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-wallet-selector>\n <Select value={effectiveValue || undefined} onValueChange={handleValueChange} disabled={isLoading}>\n <SelectTrigger className={classNames?.trigger} aria-label=\"Select wallet\">\n <SelectValue placeholder={isLoading ? \"Loading...\" : placeholder} />\n </SelectTrigger>\n <SelectContent className={classNames?.content}>\n {wallets.map((w) => {\n const id = w.id ?? w.walletId;\n return (\n <SelectItem key={id} value={id} className={classNames?.item}>\n {w.walletName || id}\n </SelectItem>\n );\n })}\n </SelectContent>\n </Select>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Button } from \"../../ui/button\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface WalletAddressProps {\n address: string;\n short?: boolean;\n copyable?: boolean;\n className?: string;\n}\n\nfunction truncateAddress(addr: string, chars = 4): string {\n if (addr.length <= chars * 2 + 3) return addr;\n return `${addr.slice(0, chars)}...${addr.slice(-chars)}`;\n}\n\nexport function WalletAddress({\n address,\n short = false,\n copyable = false,\n className,\n}: WalletAddressProps) {\n const [copied, setCopied] = useState(false);\n const display = short ? truncateAddress(address) : address;\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(address);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // ignore\n }\n };\n\n return (\n <span className={cn(\"inline-flex items-center gap-2\", className)} data-cilantro-wallet-address>\n <code className=\"text-sm font-mono\">{display}</code>\n {copyable && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-2 text-xs\"\n onClick={handleCopy}\n aria-label=\"Copy address\"\n >\n {copied ? \"Copied\" : \"Copy\"}\n </Button>\n )}\n </span>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useCilantroContext } from \"../../context/CilantroContext\";\nimport { setSdkAuth } from \"../../core/auth\";\nimport { getAssets } from \"cilantro-sdk/wallet\";\nimport { extractResponseData } from \"../../core/types\";\nimport { Skeleton } from \"../../ui/skeleton\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface WalletBalanceProps {\n walletId: string;\n showTokens?: boolean;\n className?: string;\n}\n\nexport function WalletBalance({\n walletId,\n showTokens = false,\n className,\n}: WalletBalanceProps) {\n const { jwt } = useCilantroContext();\n const [loading, setLoading] = useState(true);\n const [solBalance, setSolBalance] = useState<string | null>(null);\n const [tokens, setTokens] = useState<Array<{ symbol?: string; balance?: string; mint?: string }>>([]);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!walletId || !jwt) {\n setSolBalance(null);\n setTokens([]);\n setLoading(false);\n return;\n }\n let cancelled = false;\n setLoading(true);\n setError(null);\n (async () => {\n try {\n if (jwt) setSdkAuth(jwt);\n const result = await getAssets(walletId);\n const data = extractResponseData<{ solBalance?: string; assets?: Array<{ symbol?: string; balance?: string; mint?: string }> }>(result);\n if (cancelled) return;\n setSolBalance(data?.solBalance ?? null);\n if (showTokens && Array.isArray(data?.assets)) {\n setTokens(data.assets);\n } else {\n setTokens([]);\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : String(err));\n setSolBalance(null);\n setTokens([]);\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [walletId, jwt, showTokens]);\n\n if (loading) {\n return (\n <div className={cn(className)} data-cilantro-wallet-balance>\n <Skeleton className=\"h-5 w-24 rounded\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={cn(\"text-sm text-destructive\", className)} data-cilantro-wallet-balance role=\"alert\">\n {error}\n </div>\n );\n }\n\n const solDisplay = solBalance != null ? `${Number(solBalance) / 1e9} SOL` : \"—\";\n\n return (\n <div className={cn(\"text-sm\", className)} data-cilantro-wallet-balance>\n <span className=\"font-medium\">{solDisplay}</span>\n {showTokens && tokens.length > 0 && (\n <ul className=\"mt-1 space-y-0.5 text-muted-foreground\">\n {tokens.map((t, i) => (\n <li key={t.mint ?? i}>\n {t.symbol ?? t.mint ?? \"Token\"}: {t.balance ?? \"—\"}\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useSendTransaction } from \"../../hooks/useSendTransaction\";\nimport type { SubmitTransactionResult } from \"../../hooks/useSendTransaction\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { cn } from \"../../ui/cn\";\n\nexport type SignerType = \"email\" | \"phone\" | \"passkey\" | \"external\";\n\nexport interface SendSOLFormProps {\n walletId: string;\n signerId?: string;\n signerType?: SignerType;\n onSuccess?: (result: SubmitTransactionResult) => void;\n onError?: (error: Error) => void;\n className?: string;\n}\n\nexport function SendSOLForm({\n walletId,\n signerId,\n signerType,\n onSuccess,\n onError,\n className,\n}: SendSOLFormProps) {\n const { sendSOL, isPending, error } = useSendTransaction(walletId, signerId, signerType);\n const [recipientAddress, setRecipientAddress] = useState(\"\");\n const [amountLamports, setAmountLamports] = useState(\"\");\n const [submitError, setSubmitError] = useState<string | null>(null);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setSubmitError(null);\n const lamports = Number(amountLamports);\n if (!recipientAddress.trim() || Number.isNaN(lamports) || lamports < 1) {\n setSubmitError(\"Invalid recipient or amount\");\n return;\n }\n try {\n const result = await sendSOL({ recipientAddress: recipientAddress.trim(), amountLamports: lamports });\n setRecipientAddress(\"\");\n setAmountLamports(\"\");\n onSuccess?.(result);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setSubmitError(message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className={cn(\"space-y-4\", className)} data-cilantro-send-sol>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-send-sol-recipient\">Recipient address</Label>\n <Input\n id=\"cilantro-send-sol-recipient\"\n type=\"text\"\n value={recipientAddress}\n onChange={(e) => setRecipientAddress(e.target.value)}\n placeholder=\"7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU\"\n required\n disabled={isPending}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-send-sol-amount\">Amount (lamports)</Label>\n <Input\n id=\"cilantro-send-sol-amount\"\n type=\"number\"\n min={1}\n value={amountLamports}\n onChange={(e) => setAmountLamports(e.target.value)}\n placeholder=\"100000000\"\n required\n disabled={isPending}\n />\n </div>\n {(error || submitError) && (\n <div className=\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\" role=\"alert\">\n {submitError ?? error}\n </div>\n )}\n <Button type=\"submit\" disabled={isPending || !recipientAddress.trim() || !amountLamports}>\n {isPending ? \"Sending...\" : \"Send SOL\"}\n </Button>\n </form>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport {\n useSendTransaction,\n type SubmitTransactionResult,\n type SignerType,\n} from \"../../hooks/useSendTransaction\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface SendSPLFormProps {\n walletId: string;\n signerId?: string;\n signerType?: SignerType;\n mintAddress?: string;\n onSuccess?: (result: SubmitTransactionResult) => void;\n onError?: (error: Error) => void;\n className?: string;\n}\n\nexport function SendSPLForm({\n walletId,\n signerId,\n signerType,\n mintAddress: initialMint,\n onSuccess,\n onError,\n className,\n}: SendSPLFormProps) {\n const { sendSPL, isPending, error } = useSendTransaction(walletId, signerId, signerType);\n const [mintAddress, setMintAddress] = useState(initialMint ?? \"\");\n const [recipientAddress, setRecipientAddress] = useState(\"\");\n const [amount, setAmount] = useState(\"\");\n const [submitError, setSubmitError] = useState<string | null>(null);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setSubmitError(null);\n const amt = Number(amount);\n if (!mintAddress.trim() || !recipientAddress.trim() || Number.isNaN(amt) || amt < 0) {\n setSubmitError(\"Invalid mint, recipient or amount\");\n return;\n }\n try {\n const result = await sendSPL({\n mintAddress: mintAddress.trim(),\n recipientAddress: recipientAddress.trim(),\n amount: amt,\n });\n setRecipientAddress(\"\");\n setAmount(\"\");\n onSuccess?.(result);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setSubmitError(message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className={cn(\"space-y-4\", className)} data-cilantro-send-spl>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-send-spl-mint\">Mint address</Label>\n <Input\n id=\"cilantro-send-spl-mint\"\n type=\"text\"\n value={mintAddress}\n onChange={(e) => setMintAddress(e.target.value)}\n placeholder=\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\"\n required\n disabled={isPending}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-send-spl-recipient\">Recipient address</Label>\n <Input\n id=\"cilantro-send-spl-recipient\"\n type=\"text\"\n value={recipientAddress}\n onChange={(e) => setRecipientAddress(e.target.value)}\n placeholder=\"Recipient Solana address\"\n required\n disabled={isPending}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-send-spl-amount\">Amount</Label>\n <Input\n id=\"cilantro-send-spl-amount\"\n type=\"number\"\n min={0}\n step=\"any\"\n value={amount}\n onChange={(e) => setAmount(e.target.value)}\n placeholder=\"100\"\n required\n disabled={isPending}\n />\n </div>\n {(error || submitError) && (\n <div className=\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\" role=\"alert\">\n {submitError ?? error}\n </div>\n )}\n <Button type=\"submit\" disabled={isPending || !mintAddress.trim() || !recipientAddress.trim() || !amount}>\n {isPending ? \"Sending...\" : \"Send SPL\"}\n </Button>\n </form>\n );\n}\n","\"use client\";\n\nimport { cn } from \"../../ui/cn\";\n\nconst EXPLORER_URL: Record<string, string> = {\n \"mainnet-beta\": \"https://explorer.solana.com\",\n devnet: \"https://explorer.solana.com/?cluster=devnet\",\n testnet: \"https://explorer.solana.com/?cluster=testnet\",\n};\n\nexport interface TransactionStatusProps {\n signature: string;\n cluster?: \"mainnet-beta\" | \"devnet\" | \"testnet\";\n className?: string;\n}\n\nexport function TransactionStatus({\n signature,\n cluster = \"mainnet-beta\",\n className,\n}: TransactionStatusProps) {\n const base = EXPLORER_URL[cluster] ?? EXPLORER_URL[\"mainnet-beta\"];\n const href = `${base}/tx/${signature}`;\n\n return (\n <div className={cn(\"text-sm\", className)} data-cilantro-transaction-status>\n <span className=\"text-muted-foreground\">Transaction: </span>\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"font-mono text-primary underline underline-offset-2\"\n >\n {signature.slice(0, 8)}...{signature.slice(-8)}\n </a>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useCilantroContext } from \"../../context/CilantroContext\";\nimport { setSdkAuth } from \"../../core/auth\";\nimport { cn } from \"../../ui/cn\";\nimport { TransactionStatus } from \"./TransactionStatus\";\n\nexport interface TransactionHistoryProps {\n walletId: string;\n pageSize?: number;\n className?: string;\n}\n\nexport function TransactionHistory({\n walletId,\n pageSize = 10,\n className,\n}: TransactionHistoryProps) {\n const { jwt } = useCilantroContext();\n const [loading, setLoading] = useState(true);\n const [signatures, setSignatures] = useState<string[]>([]);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!walletId || !jwt) {\n setSignatures([]);\n setLoading(false);\n return;\n }\n let cancelled = false;\n setLoading(true);\n setError(null);\n (async () => {\n try {\n if (jwt) setSdkAuth(jwt);\n // Placeholder: SDK may not expose transaction history list; show empty or use API when available\n if (!cancelled) setSignatures([]);\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : String(err));\n setSignatures([]);\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [walletId, jwt, pageSize]);\n\n if (loading) {\n return (\n <div className={cn(\"text-sm text-muted-foreground\", className)} data-cilantro-transaction-history>\n Loading...\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={cn(\"text-sm text-destructive\", className)} data-cilantro-transaction-history role=\"alert\">\n {error}\n </div>\n );\n }\n\n if (signatures.length === 0) {\n return (\n <div className={cn(\"text-sm text-muted-foreground\", className)} data-cilantro-transaction-history>\n No recent transactions.\n </div>\n );\n }\n\n return (\n <ul className={cn(\"space-y-2\", className)} data-cilantro-transaction-history role=\"list\">\n {signatures.map((sig) => (\n <li key={sig}>\n <TransactionStatus signature={sig} />\n </li>\n ))}\n </ul>\n );\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { useAuth } from \"../../hooks/useAuth\";\nimport { useWallet } from \"../../hooks/useWallet\";\nimport { useSigners } from \"../../hooks/useSigners\";\nimport type { WalletData } from \"../../context/CilantroContext\";\nimport type { SignerInfo } from \"cilantro-sdk/helpers\";\nimport { LoginForm } from \"../auth/LoginForm\";\nimport { CreateWalletForm } from \"../wallet/CreateWalletForm\";\nimport { CreateEmailSignerForm } from \"../signers/CreateEmailSignerForm\";\nimport { AddPasskeyButton } from \"../signers/AddPasskeyButton\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface WalletInfo extends WalletData {}\n\nexport interface CilantroConnectProps {\n onConnect?: (wallet: WalletInfo, signers: SignerInfo[]) => void;\n onDisconnect?: () => void;\n className?: string;\n}\n\nexport function CilantroConnect({\n onConnect,\n onDisconnect,\n className,\n}: CilantroConnectProps) {\n const { isAuthenticated } = useAuth();\n const { wallet, wallets, createWallet, selectWallet, isLoading: walletLoading } = useWallet();\n const [walletId, setWalletId] = useState<string | null>(null);\n const [step, setStep] = useState<\"auth\" | \"wallet\" | \"signer\" | \"done\">(\"auth\");\n\n if (!isAuthenticated) {\n return (\n <div className={cn(className)} data-cilantro-connect>\n <LoginForm onSuccess={() => setStep(\"wallet\")} />\n </div>\n );\n }\n\n if (step === \"wallet\" && wallets.length === 0 && !walletLoading) {\n return (\n <div className={cn(className)} data-cilantro-connect>\n <CreateWalletForm\n onCreated={(res) => {\n const id = (res as { data?: { id?: string } })?.data?.id;\n if (id) {\n setWalletId(id);\n selectWallet(id);\n setStep(\"signer\");\n }\n }}\n />\n </div>\n );\n }\n\n if (step === \"signer\" && walletId) {\n const currentWallet = wallet ?? wallets.find((w) => (w.id ?? w.walletId) === walletId);\n return (\n <div className={cn(\"space-y-4\", className)} data-cilantro-connect>\n <p className=\"text-sm text-muted-foreground\">Add a signer to your wallet</p>\n <CreateEmailSignerForm\n walletId={walletId}\n onCreated={(signer) => {\n const signers = [signer];\n if (currentWallet) {\n onConnect?.(currentWallet as WalletInfo, signers);\n }\n setStep(\"done\");\n }}\n />\n <AddPasskeyButton\n walletId={walletId}\n onRegistered={() => {\n if (currentWallet) {\n onConnect?.(currentWallet as WalletInfo, []);\n }\n setStep(\"done\");\n }}\n />\n </div>\n );\n }\n\n if (wallet && step === \"done\") {\n return (\n <div className={cn(className)} data-cilantro-connect>\n <p className=\"text-sm text-muted-foreground\">Connected</p>\n {onDisconnect && (\n <button\n type=\"button\"\n className=\"text-sm text-primary underline\"\n onClick={() => {\n onDisconnect();\n setStep(\"wallet\");\n setWalletId(null);\n }}\n >\n Disconnect\n </button>\n )}\n </div>\n );\n }\n\n if (walletLoading) {\n return (\n <div className={cn(\"text-sm text-muted-foreground\", className)} data-cilantro-connect>\n Loading...\n </div>\n );\n }\n\n return (\n <div className={cn(className)} data-cilantro-connect>\n <p className=\"text-sm text-muted-foreground\">Set up your wallet</p>\n <CreateWalletForm\n onCreated={(res) => {\n const id = (res as { data?: { id?: string } })?.data?.id;\n if (id) {\n setWalletId(id);\n selectWallet(id);\n setStep(\"signer\");\n }\n }}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface LoadingOverlayProps {\n isLoading: boolean;\n message?: string;\n children: ReactNode;\n className?: string;\n}\n\nexport function LoadingOverlay({\n isLoading,\n message,\n children,\n className,\n}: LoadingOverlayProps) {\n if (!isLoading) return <>{children}</>;\n\n return (\n <div className={cn(\"relative\", className)} data-cilantro-loading-overlay>\n <div\n className=\"absolute inset-0 z-10 flex items-center justify-center bg-background/80\"\n aria-busy=\"true\"\n aria-live=\"polite\"\n >\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n {message && <p className=\"text-sm text-muted-foreground\">{message}</p>}\n </div>\n </div>\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport { Component, type ErrorInfo, type ReactNode } from \"react\";\nimport { Button } from \"../../ui/button\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface ErrorBoundaryProps {\n fallback?: ReactNode;\n onRetry?: () => void;\n children: ReactNode;\n}\n\ninterface State {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, State> {\n state: State = { hasError: false, error: null };\n\n static getDerivedStateFromError(error: Error): State {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error(\"[Cilantro ErrorBoundary]\", error, errorInfo);\n }\n\n handleRetry = () => {\n this.setState({ hasError: false, error: null });\n this.props.onRetry?.();\n };\n\n render() {\n if (this.state.hasError && this.state.error) {\n if (this.props.fallback) {\n return this.props.fallback;\n }\n return (\n <div\n className=\"rounded-md border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive\"\n data-cilantro-error-boundary\n role=\"alert\"\n >\n <p className=\"font-medium\">Something went wrong</p>\n <p className=\"mt-1 text-muted-foreground\">{this.state.error.message}</p>\n {this.props.onRetry && (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"mt-3\" onClick={this.handleRetry}>\n Retry\n </Button>\n )}\n </div>\n );\n }\n return this.props.children;\n }\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"./cn\";\n\nconst DEFAULT_THEME_CSS = `\n:root,[data-theme=\"light\"]{--background:0 0% 100%;--foreground:222.2 84% 4.9%;--primary:222.2 47.4% 11.2%;--primary-foreground:210 40% 98%;--muted:210 40% 96.1%;--muted-foreground:215.4 16.3% 46.9%;--border:214.3 31.8% 91.4%;--input:214.3 31.8% 91.4%;--ring:222.2 84% 4.9%;--destructive:0 84.2% 60.2%;--destructive-foreground:210 40% 98%;--accent:210 40% 96.1%;--accent-foreground:222.2 47.4% 11.2%;--popover:0 0% 100%;--popover-foreground:222.2 84% 4.9%;--card:0 0% 100%;--card-foreground:222.2 84% 4.9%}\n[data-theme=\"dark\"]{--background:222.2 84% 4.9%;--foreground:210 40% 98%;--primary:210 40% 98%;--primary-foreground:222.2 47.4% 11.2%;--muted:217.2 32.6% 17.5%;--muted-foreground:215 20.2% 65.1%;--border:217.2 32.6% 17.5%;--input:217.2 32.6% 17.5%;--ring:212.7 26.8% 83.9%;--destructive:0 62.8% 30.6%;--destructive-foreground:210 40% 98%;--accent:217.2 32.6% 17.5%;--accent-foreground:210 40% 98%;--popover:222.2 84% 4.9%;--popover-foreground:210 40% 98%;--card:222.2 84% 4.9%;--card-foreground:210 40% 98%}\n`;\n\nexport type Theme = \"light\" | \"dark\" | \"system\";\nexport type ResolvedTheme = \"light\" | \"dark\";\n\nexport interface ThemeProviderProps {\n /** Current theme: \"light\", \"dark\", or \"system\" (follows prefers-color-scheme). */\n theme?: Theme;\n /** Default theme when theme is \"system\" or for initial render. */\n defaultTheme?: ResolvedTheme;\n /** Optional localStorage key for persisting theme when using \"system\". */\n storageKey?: string;\n /** Optional class for the wrapper div. */\n className?: string;\n children: React.ReactNode;\n /** When true, inject the default theme CSS variables (light/dark). Your app must still use Tailwind. */\n injectStyles?: boolean;\n}\n\nfunction getSystemTheme(): ResolvedTheme {\n if (typeof window === \"undefined\") return \"dark\";\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\";\n}\n\nexport function ThemeProvider({\n theme = \"system\",\n defaultTheme = \"dark\",\n storageKey,\n className,\n children,\n injectStyles = true,\n}: ThemeProviderProps) {\n const [resolved, setResolved] = React.useState<ResolvedTheme>(() => {\n if (theme === \"light\") return \"light\";\n if (theme === \"dark\") return \"dark\";\n if (typeof window !== \"undefined\" && storageKey) {\n const stored = window.localStorage.getItem(storageKey);\n if (stored === \"light\" || stored === \"dark\") return stored;\n }\n return defaultTheme;\n });\n\n React.useEffect(() => {\n if (theme === \"light\") {\n setResolved(\"light\");\n return;\n }\n if (theme === \"dark\") {\n setResolved(\"dark\");\n return;\n }\n const system = getSystemTheme();\n setResolved(system);\n const mql = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const listener = () => {\n const next = mql.matches ? \"dark\" : \"light\";\n setResolved(next);\n if (storageKey) window.localStorage.setItem(storageKey, next);\n };\n mql.addEventListener(\"change\", listener);\n return () => mql.removeEventListener(\"change\", listener);\n }, [theme, storageKey]);\n\n return (\n <>\n {injectStyles && (\n <style\n dangerouslySetInnerHTML={{ __html: DEFAULT_THEME_CSS }}\n data-cilantro-theme-styles\n />\n )}\n <div\n className={cn(className)}\n data-theme={resolved}\n data-cilantro-theme-provider\n >\n {children}\n </div>\n </>\n );\n}\n","/**\n * Adapter to use @solana/web3.js Connection for sign-and-send (advanced usage).\n * Pass the result as the connection prop so you don't need type assertions.\n */\n\nimport type { Connection } from \"@solana/web3.js\";\n\n/** Connection shape expected for sign-and-send (advanced usage). */\nexport interface SignAndSendConnectionAdapter {\n sendRawTransaction: (buf: Buffer) => Promise<string>;\n getLatestBlockhash: () => Promise<{ blockhash: string; lastValidBlockHeight: number }>;\n confirmTransaction: (opts: {\n signature: string;\n blockhash: string;\n lastValidBlockHeight: number;\n }) => Promise<void>;\n}\n\n/**\n * Wrap a @solana/web3.js Connection for sign-and-send (advanced usage).\n * Use when you have a Solana Connection and need the adapter shape without type assertions.\n *\n * @example\n * import { Connection } from '@solana/web3.js';\n * import { adaptSolanaConnection } from 'cilantro-react';\n *\n * const connection = new Connection(rpcUrl);\n * const adapter = adaptSolanaConnection(connection);\n */\nexport function adaptSolanaConnection(connection: Connection): SignAndSendConnectionAdapter {\n return {\n sendRawTransaction: (buf: Buffer) =>\n connection.sendRawTransaction(buf),\n\n getLatestBlockhash: () =>\n connection.getLatestBlockhash().then(({ blockhash, lastValidBlockHeight }) => ({\n blockhash,\n lastValidBlockHeight,\n })),\n\n confirmTransaction: async (opts: {\n signature: string;\n blockhash: string;\n lastValidBlockHeight: number;\n }) => {\n await connection.confirmTransaction({\n signature: opts.signature,\n blockhash: opts.blockhash,\n lastValidBlockHeight: opts.lastValidBlockHeight,\n });\n },\n };\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport {\n deriveSignerKeypair,\n getEmailSignerKeypair,\n getPhoneSignerKeypair,\n} from \"cilantro-sdk/helpers\";\nimport type { SignerData } from \"../signer-helpers\";\nimport { getStorageOptions } from \"./storage\";\nimport { SIGNER_TYPES, type SignerType } from \"./constants\";\n\nexport async function getSignerPublicKey(\n walletId: string,\n signer: SignerData,\n signerType: string,\n signerId: string\n): Promise<PublicKey> {\n const existingPubkey = signer.signerPubkey || signer.publicKey;\n if (existingPubkey && typeof existingPubkey === \"string\" && existingPubkey.trim()) {\n return new PublicKey(existingPubkey.trim());\n }\n const storageOptions = getStorageOptions();\n if (signerType === SIGNER_TYPES.EMAIL) {\n const keypair = await getEmailSignerKeypair(walletId, signerId, storageOptions);\n return new PublicKey(keypair.publicKey);\n }\n if (signerType === SIGNER_TYPES.PHONE) {\n const keypair = await getPhoneSignerKeypair(walletId, signerId, storageOptions);\n return new PublicKey(keypair.publicKey);\n }\n if (signerType === SIGNER_TYPES.EXTERNAL || signerType === SIGNER_TYPES.API_KEY) {\n const keypair = await deriveSignerKeypair(walletId, signerId, signerType, storageOptions);\n return new PublicKey(keypair.publicKey);\n }\n throw new Error(`Unsupported signer type: ${signerType}`);\n}\n","export const CACHE_CONFIG = { enabled: true, ttl: 300000 } as const;\n\nexport const SIGNER_TYPES = {\n EMAIL: \"email\",\n PHONE: \"phone\",\n PASSKEY: \"passkey\",\n EXTERNAL: \"external\",\n API_KEY: \"apiKey\",\n} as const;\n\nexport type SignerType = (typeof SIGNER_TYPES)[keyof typeof SIGNER_TYPES];\n\nexport function isValidSignerType(type: string): type is SignerType {\n return Object.values(SIGNER_TYPES).includes(type as SignerType);\n}\n","import { getStorageAdapter, type DeviceKeyStorage } from \"../storage-adapter\";\nimport { CACHE_CONFIG } from \"./constants\";\n\nexport function getSignerStorage(): DeviceKeyStorage {\n return getStorageAdapter();\n}\n\nexport function getStorageOptions() {\n return {\n deviceKeyManager: getSignerStorage(),\n cache: CACHE_CONFIG,\n };\n}\n","import {\n deriveSignerKeypair,\n signWithSigner,\n signWithEmailSigner,\n signWithPhoneSigner,\n getEmailSignerKeypair,\n getPhoneSignerKeypair,\n} from \"cilantro-sdk/helpers\";\nimport type { SignerData } from \"../signer-helpers\";\nimport { signWithPasskey } from \"../signer-creation\";\nimport { handleDeviceKeyError } from \"./errors\";\nimport { extractSignerInfo, validateSignerActive } from \"./signer-types\";\nimport { getStorageOptions } from \"./storage\";\nimport { SIGNER_TYPES } from \"./constants\";\n\n/** Result shape aligned with SDK SignMessageDataDto (signature base64, message) plus optional helper fields. */\nexport interface SignMessageResult {\n /** Signature in base64 (SDK SignMessageDataDto shape). */\n signature: string;\n /** Original message that was signed (SDK SignMessageDataDto shape). */\n message: string;\n publicKey?: string;\n signerType: string;\n signer?: string;\n}\n\nexport async function signMessageWithSigner(\n walletId: string,\n signer: SignerData,\n messageText: string\n): Promise<SignMessageResult> {\n const { signerType, signerId } = extractSignerInfo(signer);\n const message = new TextEncoder().encode(messageText);\n\n if (signerType === SIGNER_TYPES.EMAIL) {\n validateSignerActive(signer, signerType);\n const storageOptions = getStorageOptions();\n try {\n const signatureBytes = await signWithEmailSigner(walletId, signerId, message, storageOptions);\n const keypair = await getEmailSignerKeypair(walletId, signerId, storageOptions);\n return {\n signature: Buffer.from(signatureBytes).toString(\"base64\"),\n message: messageText,\n publicKey: Buffer.from(keypair.publicKey).toString(\"hex\"),\n signerType: SIGNER_TYPES.EMAIL,\n };\n } catch (error: unknown) {\n throw handleDeviceKeyError(error, SIGNER_TYPES.EMAIL);\n }\n }\n\n if (signerType === SIGNER_TYPES.PHONE) {\n validateSignerActive(signer, signerType);\n const storageOptions = getStorageOptions();\n try {\n const signatureBytes = await signWithPhoneSigner(walletId, signerId, message, storageOptions);\n const keypair = await getPhoneSignerKeypair(walletId, signerId, storageOptions);\n return {\n signature: Buffer.from(signatureBytes).toString(\"base64\"),\n message: messageText,\n publicKey: Buffer.from(keypair.publicKey).toString(\"hex\"),\n signerType: SIGNER_TYPES.PHONE,\n };\n } catch (error: unknown) {\n throw handleDeviceKeyError(error, SIGNER_TYPES.PHONE);\n }\n }\n\n if (signerType === SIGNER_TYPES.PASSKEY) {\n const signResult = await signWithPasskey(walletId, signerId, messageText, { useBrowserAutofill: false });\n const signatureBase64 = Buffer.from(signResult.signature, \"hex\").toString(\"base64\");\n return {\n signature: signatureBase64,\n message: messageText,\n signerType: SIGNER_TYPES.PASSKEY,\n signer: signResult.signer,\n };\n }\n\n if (signerType === SIGNER_TYPES.EXTERNAL || signerType === SIGNER_TYPES.API_KEY) {\n validateSignerActive(signer, signerType);\n const storageOptions = getStorageOptions();\n const signatureBytes = await signWithSigner(walletId, signerId, signerType, message, storageOptions);\n const keypair = await deriveSignerKeypair(walletId, signerId, signerType, storageOptions);\n return {\n signature: Buffer.from(signatureBytes).toString(\"base64\"),\n message: messageText,\n publicKey: Buffer.from(keypair.publicKey).toString(\"base64\"),\n signerType,\n };\n }\n\n throw new Error(`Unsupported signer type: ${signerType}`);\n}\n","import {\n DeviceKeyNotFoundError,\n DeviceKeyMismatchError,\n SignerInactiveError,\n SignerNotFoundError,\n} from \"cilantro-sdk/helpers\";\n\nexport function handleDeviceKeyError(error: unknown, signerType: string): never {\n if (error instanceof DeviceKeyNotFoundError) {\n throw new Error(\n `Device key not found. Please create the ${signerType} signer first using the Signers page. The device key is generated when you create the signer.`\n );\n }\n if (error instanceof DeviceKeyMismatchError) {\n throw new Error(\n \"Device key mismatch. The stored device key doesn't match the server. You may need to create a new signer or update the device identity.\"\n );\n }\n if (error instanceof SignerNotFoundError) {\n throw new Error(`Signer not found. Please ensure the ${signerType} signer exists.`);\n }\n if (error instanceof SignerInactiveError) {\n throw new Error(`${signerType} signer is not active. Please activate the signer first.`);\n }\n if (error instanceof Error) {\n if (error.message.includes(\"Device key not found\") || error.name === \"DeviceKeyNotFoundError\") {\n throw new Error(\n `Device key not found. Please create the ${signerType} signer first using the Signers page. The device key is generated when you create the signer.`\n );\n }\n if (error.message.includes(\"Device key mismatch\") || error.name === \"DeviceKeyMismatchError\") {\n throw new Error(\n \"Device key mismatch. The stored device key doesn't match the server. You may need to create a new signer or update the device identity.\"\n );\n }\n }\n throw error;\n}\n\nexport function createMissingSignerInfoError(signer: unknown): Error {\n return new Error(`Signer type or ID is missing. Signer data: ${JSON.stringify(signer)}`);\n}\n\nexport function createUnsupportedSignerTypeError(signerType: string): Error {\n return new Error(`Unsupported signer type: ${signerType}`);\n}\n","import type { SignerData } from \"../signer-helpers\";\nimport { SIGNER_TYPES, isValidSignerType, type SignerType } from \"./constants\";\n\nexport function extractSignerInfo(signer: SignerData): { signerType: SignerType; signerId: string } {\n const signerType = (signer.type || signer.signerType) as SignerType;\n const signerId = signer.id || signer.signerId;\n if (!signerType || !signerId) {\n throw new Error(`Signer type or ID is missing. Signer data: ${JSON.stringify(signer)}`);\n }\n if (!isValidSignerType(signerType)) {\n throw new Error(`Unsupported signer type: ${signerType}`);\n }\n return { signerType, signerId };\n}\n\nexport function requiresDeviceKeyStorage(signerType: SignerType): boolean {\n return (\n signerType === SIGNER_TYPES.EMAIL ||\n signerType === SIGNER_TYPES.PHONE ||\n signerType === SIGNER_TYPES.EXTERNAL ||\n signerType === SIGNER_TYPES.API_KEY\n );\n}\n\nexport function isAuthenticationSigner(signerType: SignerType): boolean {\n return (\n signerType === SIGNER_TYPES.EMAIL ||\n signerType === SIGNER_TYPES.PHONE ||\n signerType === SIGNER_TYPES.PASSKEY\n );\n}\n\nexport function requiresActiveStatus(signerType: SignerType): boolean {\n return (\n signerType === SIGNER_TYPES.EMAIL ||\n signerType === SIGNER_TYPES.PHONE ||\n signerType === SIGNER_TYPES.EXTERNAL ||\n signerType === SIGNER_TYPES.API_KEY\n );\n}\n\nexport function validateSignerActive(signer: SignerData, signerType: SignerType): void {\n if (requiresActiveStatus(signerType) && !signer.isActive) {\n throw new Error(`${signerType} signer is not active. Please activate the signer first.`);\n }\n}\n","import { Transaction } from \"@solana/web3.js\";\nimport {\n signWithSigner,\n signWithEmailSigner,\n signWithPhoneSigner,\n signTransactionWithEmailSigner,\n signTransactionWithPhoneSigner,\n} from \"cilantro-sdk/helpers\";\nimport { submitTransaction } from \"cilantro-sdk/wallet\";\nimport type { WalletControllerSubmitTransactionResult } from \"cilantro-sdk/wallet\";\nimport type { SignerData } from \"../signer-helpers\";\nimport { signAndSendPasskeyTransaction } from \"../signer-creation\";\nimport { extractErrorMessage } from \"../error-utils\";\nimport { extractResponseData } from \"../types\";\nimport { handleDeviceKeyError } from \"./errors\";\n\n/** Connection-like interface for sign-and-send (passkey). Consumer provides from their Solana config. */\nexport interface SignAndSendConnection {\n getLatestBlockhash: (commitment?: string) => Promise<{ blockhash: string; lastValidBlockHeight: number }>;\n confirmTransaction: (opts: { signature: string; blockhash: string; lastValidBlockHeight: number }) => Promise<void>;\n}\nimport { extractSignerInfo, validateSignerActive } from \"./signer-types\";\nimport { getStorageOptions } from \"./storage\";\nimport { SIGNER_TYPES, type SignerType } from \"./constants\";\nimport { getSignerPublicKey } from \"./core\";\nimport { validateSignerInTransaction } from \"./validation\";\n\nfunction prepareTransactionForSigning(\n transaction: Transaction,\n signerPublicKey: import(\"@solana/web3.js\").PublicKey\n): void {\n const signerPubkeyStr = signerPublicKey.toString();\n const hasSignerInSignatures = transaction.signatures.some(\n (sig) => sig.publicKey.toString() === signerPubkeyStr\n );\n if (!hasSignerInSignatures) {\n transaction.signatures.push({\n publicKey: signerPublicKey,\n signature: null,\n });\n }\n if (transaction.feePayer) {\n const feePayerStr = transaction.feePayer.toString();\n const hasFeePayerInSignatures = transaction.signatures.some(\n (sig) => sig.publicKey.toString() === feePayerStr\n );\n if (!hasFeePayerInSignatures) {\n transaction.signatures.push({ publicKey: transaction.feePayer, signature: null });\n }\n }\n}\n\nasync function signTransactionWithEmailOrPhone(\n walletId: string,\n signerId: string,\n signerType: SignerType,\n unsignedTransactionBase64: string\n): Promise<string> {\n const storageOptions = getStorageOptions();\n if (signerType === SIGNER_TYPES.EMAIL) {\n return await signTransactionWithEmailSigner(\n walletId,\n signerId,\n unsignedTransactionBase64,\n storageOptions\n );\n }\n return await signTransactionWithPhoneSigner(\n walletId,\n signerId,\n unsignedTransactionBase64,\n storageOptions\n );\n}\n\n/** SDK submit transaction data (SubmitTransactionResponseDto.data). */\nexport type SubmitTransactionDataDto = WalletControllerSubmitTransactionResult[\"data\"];\n\nasync function submitSignedTransaction(\n walletId: string,\n signedTransactionBase64: string\n): Promise<{ signature: string; status: string; confirmationStatus: string }> {\n const submitResult: WalletControllerSubmitTransactionResult = await submitTransaction(walletId, {\n signedTransaction: signedTransactionBase64,\n });\n const resultData = extractResponseData<SubmitTransactionDataDto>(submitResult);\n if (!resultData?.signature) throw new Error(\"Server did not return a transaction signature\");\n const status = resultData.status ?? \"pending\";\n return {\n signature: resultData.signature,\n status,\n confirmationStatus: status,\n };\n}\n\nasync function handlePasskeyTransaction(\n walletId: string,\n signerId: string,\n transaction: Transaction,\n connection: SignAndSendConnection | null | undefined\n): Promise<{ signature: string; status: string; confirmationStatus: string }> {\n if (!connection) {\n throw new Error(\n \"Connection is required for passkey sign-and-send. Pass the connection from your Solana config to useTransactionSigning / TransactionSigningForm.\"\n );\n }\n const { blockhash, lastValidBlockHeight } = await connection.getLatestBlockhash(\"confirmed\");\n const result = await signAndSendPasskeyTransaction(walletId, signerId, transaction, {\n useBrowserAutofill: false,\n });\n let status = \"confirmed\";\n try {\n await connection.confirmTransaction({\n signature: result.signature,\n blockhash,\n lastValidBlockHeight,\n });\n } catch (error) {\n const errorMsg = extractErrorMessage(error);\n if (\n errorMsg.includes(\"block height exceeded\") ||\n errorMsg.includes(\"expired\") ||\n errorMsg.includes(\"timeout\")\n ) {\n status = \"pending\";\n } else {\n throw new Error(`Transaction confirmation failed: ${errorMsg}. Signature: ${result.signature}`);\n }\n }\n return { signature: result.signature, status, confirmationStatus: status };\n}\n\nasync function handleEmailOrPhoneTransaction(\n walletId: string,\n signer: SignerData,\n signerType: SignerType,\n signerId: string,\n transaction: Transaction\n): Promise<{ signature: string; status: string; confirmationStatus: string }> {\n validateSignerActive(signer, signerType);\n const signerPublicKey = await getSignerPublicKey(walletId, signer, signerType, signerId);\n prepareTransactionForSigning(transaction, signerPublicKey);\n const unsignedTransactionBase64 = Buffer.from(\n transaction.serialize({ verifySignatures: false })\n ).toString(\"base64\");\n let signedTransactionBase64: string;\n try {\n signedTransactionBase64 = await signTransactionWithEmailOrPhone(\n walletId,\n signerId,\n signerType,\n unsignedTransactionBase64\n );\n } catch (error: unknown) {\n handleDeviceKeyError(error, signerType);\n throw error;\n }\n try {\n const validationResult = await validateSignerInTransaction(\n signedTransactionBase64,\n signerPublicKey\n );\n if (!validationResult.isValid) {\n console.error(\"Transaction validation failed:\", {\n errors: validationResult.errors,\n warnings: validationResult.warnings,\n });\n }\n } catch (validationError) {\n console.error(\"Validation error (non-fatal):\", extractErrorMessage(validationError));\n }\n return await submitSignedTransaction(walletId, signedTransactionBase64);\n}\n\nasync function handleExternalOrApiKeyTransaction(\n walletId: string,\n signer: SignerData,\n signerType: SignerType,\n signerId: string,\n transaction: Transaction\n): Promise<{ signature: string; status: string; confirmationStatus: string }> {\n validateSignerActive(signer, signerType);\n const messageBytes = transaction.serializeMessage();\n const storageOptions = getStorageOptions();\n const signatureBytes = await signWithSigner(\n walletId,\n signerId,\n signerType,\n messageBytes,\n storageOptions\n );\n const signerPublicKey = await getSignerPublicKey(walletId, signer, signerType, signerId);\n const signatureBuffer = Buffer.from(signatureBytes);\n transaction.addSignature(signerPublicKey, signatureBuffer);\n const signedTransactionBytes = transaction.serialize();\n const signedTransactionBase64 = Buffer.from(signedTransactionBytes).toString(\"base64\");\n return await submitSignedTransaction(walletId, signedTransactionBase64);\n}\n\nexport async function signTransactionWithSigner(\n walletId: string,\n signer: SignerData,\n transactionBuffer: Uint8Array\n): Promise<{ signature: string; signerType: string }> {\n const { signerType, signerId } = extractSignerInfo(signer);\n const storageOptions = getStorageOptions();\n\n if (signerType === SIGNER_TYPES.EMAIL) {\n validateSignerActive(signer, signerType);\n try {\n const signature = await signWithEmailSigner(walletId, signerId, transactionBuffer, storageOptions);\n return { signature: Buffer.from(signature).toString(\"hex\"), signerType: SIGNER_TYPES.EMAIL };\n } catch (error: unknown) {\n throw handleDeviceKeyError(error, SIGNER_TYPES.EMAIL);\n }\n }\n if (signerType === SIGNER_TYPES.PHONE) {\n validateSignerActive(signer, signerType);\n try {\n const signature = await signWithPhoneSigner(walletId, signerId, transactionBuffer, storageOptions);\n return { signature: Buffer.from(signature).toString(\"hex\"), signerType: SIGNER_TYPES.PHONE };\n } catch (error: unknown) {\n throw handleDeviceKeyError(error, SIGNER_TYPES.PHONE);\n }\n }\n if (signerType === SIGNER_TYPES.PASSKEY) {\n const { signWithPasskeySigner } = await import(\"cilantro-sdk/helpers\");\n const signature = await signWithPasskeySigner(walletId, signerId, transactionBuffer, {\n useBrowserAutofill: false,\n });\n return { signature: Buffer.from(signature).toString(\"hex\"), signerType: SIGNER_TYPES.PASSKEY };\n }\n if (signerType === SIGNER_TYPES.EXTERNAL || signerType === SIGNER_TYPES.API_KEY) {\n validateSignerActive(signer, signerType);\n const signature = await signWithSigner(\n walletId,\n signerId,\n signerType,\n transactionBuffer,\n storageOptions\n );\n return { signature: Buffer.from(signature).toString(\"hex\"), signerType };\n }\n throw new Error(`Unsupported signer type: ${signerType}`);\n}\n\n/** Result of sign-and-send; status is the SDK SubmitTransactionDataDto.status, confirmationStatus is the same for backward compat. */\nexport interface SignAndSendResult {\n signature: string;\n status: string;\n confirmationStatus: string;\n}\n\nexport async function signAndSendTransactionWithSigner(\n walletId: string,\n signer: SignerData,\n transaction: Transaction,\n connection?: SignAndSendConnection | null\n): Promise<SignAndSendResult> {\n const { signerType, signerId } = extractSignerInfo(signer);\n if (signerType === SIGNER_TYPES.PASSKEY) {\n return await handlePasskeyTransaction(walletId, signerId, transaction, connection);\n }\n if (signerType === SIGNER_TYPES.EMAIL || signerType === SIGNER_TYPES.PHONE) {\n return await handleEmailOrPhoneTransaction(walletId, signer, signerType, signerId, transaction);\n }\n if (signerType === SIGNER_TYPES.EXTERNAL || signerType === SIGNER_TYPES.API_KEY) {\n return await handleExternalOrApiKeyTransaction(walletId, signer, signerType, signerId, transaction);\n }\n throw new Error(`Unsupported signer type: ${signerType}`);\n}\n","import { PublicKey, Transaction } from \"@solana/web3.js\";\nimport type { SignerData } from \"../signer-helpers\";\nimport { extractErrorMessage } from \"../error-utils\";\nimport { getSignerPublicKey } from \"./core\";\nimport { extractSignerInfo } from \"./signer-types\";\n\nexport async function validateSignerInTransaction(\n signedTransactionBase64: string,\n expectedSignerPublicKey?: PublicKey | string\n): Promise<{\n isValid: boolean;\n transaction: Transaction;\n signers: Array<{\n publicKey: string;\n hasSignature: boolean;\n signatureLength: number;\n matchesExpected: boolean;\n }>;\n expectedSignerFound: boolean;\n allSignaturesValid: boolean;\n feePayer?: string;\n recentBlockhash?: string;\n errors: string[];\n warnings: string[];\n}> {\n const errors: string[] = [];\n const warnings: string[] = [];\n try {\n const transactionBuffer = Buffer.from(signedTransactionBase64, \"base64\");\n const transaction = Transaction.from(transactionBuffer);\n let allSignaturesValid = true;\n try {\n transaction.verifySignatures();\n } catch (error) {\n allSignaturesValid = false;\n errors.push(`Signature verification failed: ${extractErrorMessage(error)}`);\n }\n const signers = transaction.signatures.map((sig) => {\n const publicKeyStr = sig.publicKey.toString();\n const hasSignature = sig.signature !== null && sig.signature.length > 0;\n const signatureLength = sig.signature !== null ? sig.signature.length : 0;\n let matchesExpected = false;\n if (expectedSignerPublicKey) {\n const expectedPubkey =\n typeof expectedSignerPublicKey === \"string\"\n ? new PublicKey(expectedSignerPublicKey)\n : expectedSignerPublicKey;\n matchesExpected = sig.publicKey.equals(expectedPubkey);\n }\n if (!hasSignature) warnings.push(`Signer ${publicKeyStr} has no signature (unsigned)`);\n return { publicKey: publicKeyStr, hasSignature, signatureLength, matchesExpected };\n });\n let expectedSignerFound = false;\n if (expectedSignerPublicKey) {\n const expectedPubkey =\n typeof expectedSignerPublicKey === \"string\"\n ? new PublicKey(expectedSignerPublicKey)\n : expectedSignerPublicKey;\n expectedSignerFound = signers.some((s) => s.matchesExpected);\n if (!expectedSignerFound) {\n errors.push(`Expected signer ${expectedPubkey.toString()} not found in transaction signers`);\n }\n }\n if (expectedSignerFound && expectedSignerPublicKey) {\n const expectedSigner = signers.find((s) => s.matchesExpected);\n if (expectedSigner && !expectedSigner.hasSignature) {\n errors.push(\n `Expected signer ${\n typeof expectedSignerPublicKey === \"string\"\n ? expectedSignerPublicKey\n : expectedSignerPublicKey.toString()\n } is present but has no signature`\n );\n }\n }\n const isValid =\n allSignaturesValid && (expectedSignerPublicKey ? expectedSignerFound : true) && errors.length === 0;\n return {\n isValid,\n transaction,\n signers,\n expectedSignerFound,\n allSignaturesValid,\n feePayer: transaction.feePayer?.toString(),\n recentBlockhash: transaction.recentBlockhash ?? undefined,\n errors,\n warnings,\n };\n } catch (error) {\n errors.push(`Failed to deserialize transaction: ${extractErrorMessage(error)}`);\n throw new Error(\n `Transaction validation failed: ${errors.join(\"; \")}\\nOriginal error: ${extractErrorMessage(error)}`\n );\n }\n}\n\nexport async function validateSignerInTransactionWithSigner(\n walletId: string,\n signer: SignerData,\n signedTransactionBase64: string\n): Promise<\n Awaited<ReturnType<typeof validateSignerInTransaction>> & { expectedSignerPublicKey: string }\n> {\n const { signerType, signerId } = extractSignerInfo(signer);\n const expectedSignerPublicKey = await getSignerPublicKey(walletId, signer, signerType, signerId);\n const validationResult = await validateSignerInTransaction(\n signedTransactionBase64,\n expectedSignerPublicKey\n );\n return {\n ...validationResult,\n expectedSignerPublicKey: expectedSignerPublicKey.toString(),\n };\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport { findOne as findOneWallet } from \"cilantro-sdk/wallet\";\nimport type { WalletControllerFindOneResult } from \"cilantro-sdk/wallet\";\nimport { extractResponseData } from \"../types\";\n\n/** SDK wallet single response data (WalletSuccessResponseDto.data). */\nexport type WalletDataDtoFromFindOne = WalletControllerFindOneResult[\"data\"];\n\nexport async function getWalletData(walletId: string): Promise<{\n walletPublicKey: PublicKey;\n adminSignerPubkey: PublicKey;\n}> {\n const walletDataResponse: WalletControllerFindOneResult = await findOneWallet(walletId);\n const walletData = extractResponseData<WalletDataDtoFromFindOne>(walletDataResponse);\n if (!walletData) throw new Error(\"Wallet data is empty\");\n const address = String(walletData.walletAddress ?? \"\").trim();\n if (!address) throw new Error(\"No wallet address found (walletAddress is empty).\");\n const walletPublicKey = new PublicKey(address);\n const adminPubkey = String(walletData.adminSignerPubkey ?? \"\").trim();\n if (!adminPubkey) {\n throw new Error(\"adminSignerPubkey not found in wallet data.\");\n }\n const adminSignerPubkey = new PublicKey(adminPubkey);\n return { walletPublicKey, adminSignerPubkey };\n}\n"],"mappings":"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","names":["useEffect","jsx","platformApiKey","apiUrl","useEffect","createIndexedDBAdapter","useMemo","useMemo","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useCallback","isWebAuthnSupported","startPasskeyAuthentication","authenticateWithPasskey","formatAuthenticationResponse","useState","isWebAuthnSupported","useCallback","startPasskeyAuthentication","useState","useCallback","useEffect","useState","useCallback","useState","useCallback","useState","jsx","React","jsx","React","cva","jsx","cva","React","jsx","jsx","useState","useState","React","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","React","jsx","Fragment","jsx","jsxs","useState","jsx","jsxs","useState","useState","jsx","jsxs","useState","useState","jsx","jsxs","useState","useState","Fragment","jsx","jsxs","useState","Fragment","jsx","jsxs","useState","jsx","useState","useState","jsx","jsxs","useState","React","jsx","jsxs","jsxs","jsx","Fragment","jsx","jsxs","useState","jsx","jsxs","useState","useState","useEffect","jsx","jsxs","useState","useEffect","useState","jsx","jsxs","useState","useState","jsx","jsxs","useState","jsx","jsxs","useState","useEffect","jsx","useState","useEffect","useState","jsx","jsxs","useState","Fragment","jsx","jsxs","jsx","jsxs","React","Fragment","jsx","jsxs","PublicKey","PublicKey","deriveSignerKeypair","getEmailSignerKeypair","getPhoneSignerKeypair","getEmailSignerKeypair","getPhoneSignerKeypair","deriveSignerKeypair","signWithSigner","signWithEmailSigner","signWithPhoneSigner","PublicKey","PublicKey","signWithSigner","signWithEmailSigner","signWithPhoneSigner","signWithPasskeySigner","PublicKey","PublicKey"]}
|
|
1
|
+
{"version":3,"sources":["../src/context/CilantroContext.tsx","../src/core/auth.ts","../src/core/storage-adapter.ts","../src/core/types.ts","../src/core/error-utils.ts","../src/core/normalize.ts","../src/providers/CilantroProvider.tsx","../src/providers/CilantroAuthProvider.tsx","../src/providers/WalletProvider.tsx","../src/index.ts","../src/hooks/useCilantroConfig.ts","../src/hooks/useAuth.ts","../src/hooks/useReturnUrl.ts","../src/hooks/useWallet.ts","../src/hooks/useSigners.ts","../src/core/signer-helpers.ts","../src/core/signer-creation.ts","../src/hooks/usePasskey.ts","../src/hooks/useExternalWallet.ts","../src/hooks/useSendTransaction.ts","../src/components/auth/LoginForm.tsx","../src/ui/button.tsx","../src/ui/cn.ts","../src/ui/input.tsx","../src/ui/label.tsx","../src/ui/card.tsx","../src/components/auth/RegisterForm.tsx","../src/components/auth/LogoutButton.tsx","../src/ui/dialog.tsx","../src/components/auth/AuthGuard.tsx","../src/ui/skeleton.tsx","../src/components/auth/AuthShell.tsx","../src/components/signers/CreateEmailSignerForm.tsx","../src/components/signers/CreatePhoneSignerForm.tsx","../src/components/signers/AddPasskeyButton.tsx","../src/components/signers/SignerList.tsx","../src/components/signers/SignerSelector.tsx","../src/components/wallet/ConnectWalletButton.tsx","../src/components/wallet/CreateWalletForm.tsx","../src/ui/select.tsx","../src/components/wallet/WalletSelector.tsx","../src/components/wallet/WalletAddress.tsx","../src/components/wallet/WalletBalance.tsx","../src/components/transactions/SendSOLForm.tsx","../src/components/transactions/SendSPLForm.tsx","../src/components/transactions/TransactionStatus.tsx","../src/components/transactions/TransactionHistory.tsx","../src/components/layout/CilantroConnect.tsx","../src/components/layout/LoadingOverlay.tsx","../src/components/layout/ErrorBoundary.tsx","../src/ui/theme-provider.tsx","../src/adapters/solana-connection.ts","../src/core/signer-signing/core.ts","../src/core/signer-signing/constants.ts","../src/core/signer-signing/storage.ts","../src/core/signer-signing/message-signing.ts","../src/core/signer-signing/errors.ts","../src/core/signer-signing/signer-types.ts","../src/core/signer-signing/transaction-signing.ts","../src/core/signer-signing/validation.ts","../src/core/signer-signing/wallet-data.ts"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { clearAuth } from \"cilantro-sdk\";\nimport { login as cilantroLogin } from \"cilantro-sdk/auth\";\nimport type { AuthControllerLogin200Data } from \"cilantro-sdk/auth\";\nimport { create as createUser } from \"cilantro-sdk/user\";\nimport { create as createWalletSDK, findAll as findAllWallets } from \"cilantro-sdk/wallet\";\nimport type {\n WalletControllerFindAllResult,\n WalletControllerCreateResult,\n} from \"cilantro-sdk/wallet\";\nimport { setAuthConfig, setSdkAuth, getPlatformApiKey, isJwtExpired } from \"../core/auth\";\nimport { setStorageAdapter } from \"../core/storage-adapter\";\nimport type { DeviceKeyStorage } from \"../core/storage-adapter\";\nimport { extractResponseData } from \"../core/types\";\nimport { extractErrorMessage, isAuthError } from \"../core/error-utils\";\nimport { normalizeWallet } from \"../core/normalize\";\n\nconst DEFAULT_BASE_URL = \"https://api.cilantro.gg\";\nconst DEFAULT_JWT_STORAGE_KEY = \"cilantro_jwt\";\nconst DEFAULT_WALLET_STORAGE_KEY = \"cilantro_selected_wallet_id\";\n\n/** Minimal user view; populated from SDK login result data.user when available. */\nexport interface User {\n username?: string;\n email?: string;\n userType?: string;\n}\n\n/** SDK wallet list item type. */\nexport type WalletDataDto = WalletControllerFindAllResult[\"data\"] extends readonly (infer E)[]\n ? E\n : WalletControllerFindAllResult[\"data\"] extends (infer E)[]\n ? E\n : never;\n\n/** Wallet with backward-compat aliases (id, address, active). */\nexport type WalletData = WalletDataDto & {\n id?: string;\n address?: string;\n active?: boolean;\n};\n\nexport interface CilantroConfig {\n apiKey?: string;\n baseURL: string;\n jwt?: string | null;\n}\n\nexport interface CilantroContextValue {\n config: CilantroConfig;\n storage: DeviceKeyStorage | null;\n // Auth\n user: User | null;\n jwt: string | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n login: (params: { usernameOrEmail: string; password: string }) => Promise<void>;\n logout: () => void;\n register: (\n username: string,\n email: string,\n password: string,\n isActive?: boolean\n ) => Promise<void>;\n clearSessionDueToAuthError: () => void;\n // Wallet\n wallet: WalletData | null;\n wallets: WalletData[];\n createWallet: (params: { name: string; userId?: string }) => Promise<WalletControllerCreateResult>;\n selectWallet: (walletId: string) => void;\n refreshWallets: () => Promise<void>;\n walletError: string | null;\n walletsLoading: boolean;\n}\n\nconst CilantroContext = createContext<CilantroContextValue | undefined>(undefined);\n\nexport interface CilantroContextProviderProps {\n children: ReactNode;\n apiKey?: string;\n baseURL?: string;\n storageAdapter?: DeviceKeyStorage | null;\n jwtStorageKey?: string;\n walletStorageKey?: string;\n /** When true, sync JWT to a cookie (same name as jwtStorageKey) for Next.js/middleware. Default: false. */\n syncJwtToCookie?: boolean;\n /** Cookie name for JWT when syncJwtToCookie is true. Default: cilantro_jwt. */\n jwtCookieName?: string;\n onLoginSuccess?: () => void;\n onLogout?: () => void;\n onRegisterSuccess?: () => void;\n onSessionExpired?: () => void;\n}\n\nconst DEFAULT_JWT_COOKIE_NAME = \"cilantro_jwt\";\n\nfunction setJwtCookie(name: string, token: string | null): void {\n if (typeof document === \"undefined\") return;\n const value = token ?? \"\";\n if (!value) {\n document.cookie = `${name}=; path=/; SameSite=Lax; max-age=0`;\n return;\n }\n // Set cookie with long expiry (JWT has its own exp; middleware will validate).\n const maxAge = 60 * 60 * 24 * 7; // 7 days\n document.cookie = `${name}=${encodeURIComponent(value)}; path=/; SameSite=Lax; max-age=${maxAge}`;\n}\n\nexport function CilantroContextProvider({\n children,\n apiKey,\n baseURL = DEFAULT_BASE_URL,\n storageAdapter = null,\n jwtStorageKey = DEFAULT_JWT_STORAGE_KEY,\n walletStorageKey = DEFAULT_WALLET_STORAGE_KEY,\n syncJwtToCookie = false,\n jwtCookieName = DEFAULT_JWT_COOKIE_NAME,\n onLoginSuccess,\n onLogout,\n onRegisterSuccess,\n onSessionExpired,\n}: CilantroContextProviderProps) {\n const [user, setUser] = useState<User | null>(null);\n const [jwt, setJwt] = useState<string | null>(null);\n const [authLoading, setAuthLoading] = useState(true);\n const [wallets, setWallets] = useState<WalletData[]>([]);\n const [selectedWallet, setSelectedWallet] = useState<WalletData | null>(null);\n const [walletsLoading, setWalletsLoading] = useState(true);\n const [walletError, setWalletError] = useState<string | null>(null);\n\n const config = useMemo<CilantroConfig>(\n () => ({\n apiKey,\n baseURL,\n jwt: jwt ?? undefined,\n }),\n [apiKey, baseURL, jwt]\n );\n\n // Inject storage adapter into core so signer creation uses it\n useEffect(() => {\n setStorageAdapter(storageAdapter ?? null);\n return () => setStorageAdapter(null);\n }, [storageAdapter]);\n\n // Set SDK auth config and restore session from storage\n useEffect(() => {\n setAuthConfig({ apiKey, baseURL });\n const storedToken =\n typeof window !== \"undefined\" ? localStorage.getItem(jwtStorageKey) : null;\n if (storedToken) {\n if (isJwtExpired(storedToken)) {\n if (typeof window !== \"undefined\") {\n localStorage.removeItem(jwtStorageKey);\n const keys = Object.keys(localStorage);\n keys.forEach((key) => {\n if (key.startsWith(\"delegated-key-\")) localStorage.removeItem(key);\n });\n }\n setSdkAuth(null);\n } else {\n setJwt(storedToken);\n setSdkAuth(storedToken);\n try {\n const payload = JSON.parse(atob(storedToken.split(\".\")[1]));\n setUser({\n username: payload.username,\n email: payload.email,\n userType: payload.userType,\n });\n } catch {\n // ignore\n }\n }\n } else {\n setSdkAuth(null);\n }\n setAuthLoading(false);\n }, [apiKey, baseURL, jwtStorageKey]);\n\n // Sync JWT to cookie for Next.js/middleware when enabled\n useEffect(() => {\n if (syncJwtToCookie && typeof document !== \"undefined\") {\n setJwtCookie(jwtCookieName, jwt);\n }\n }, [jwt, syncJwtToCookie, jwtCookieName]);\n\n const login = useCallback(\n async (params: { usernameOrEmail: string; password: string }) => {\n const result = await cilantroLogin(params);\n const data: AuthControllerLogin200Data | undefined =\n result && typeof result === \"object\" && \"data\" in result\n ? (result as { data: AuthControllerLogin200Data }).data\n : undefined;\n const token =\n (data && \"jwt\" in data ? (data as { jwt?: string }).jwt : undefined) ??\n (data && \"accessToken\" in data ? (data as { accessToken?: string }).accessToken : undefined);\n if (!token) throw new Error(\"No JWT token received from server\");\n const userType = data?.userType;\n setJwt(token);\n setSdkAuth(token);\n if (typeof window !== \"undefined\") {\n localStorage.setItem(jwtStorageKey, token);\n if (syncJwtToCookie) setJwtCookie(jwtCookieName, token);\n }\n if (data?.user && typeof data.user === \"object\") {\n const u = data.user as Record<string, unknown>;\n setUser({\n username: u.username as string | undefined,\n email: u.email as string | undefined,\n userType: (userType ?? u.userType) as string | undefined,\n });\n } else {\n try {\n const payload = JSON.parse(atob(token.split(\".\")[1])) as Record<string, unknown>;\n setUser({\n username: payload.username as string | undefined,\n email: payload.email as string | undefined,\n userType: (userType ?? payload.userType) as string | undefined,\n });\n } catch {\n setUser({ userType: userType as string | undefined });\n }\n }\n onLoginSuccess?.();\n },\n [jwtStorageKey, jwtCookieName, syncJwtToCookie, onLoginSuccess]\n );\n\n const logout = useCallback(() => {\n setUser(null);\n setJwt(null);\n clearAuth();\n if (typeof window !== \"undefined\") {\n localStorage.removeItem(jwtStorageKey);\n if (syncJwtToCookie) setJwtCookie(jwtCookieName, null);\n const keys = Object.keys(localStorage);\n keys.forEach((key) => {\n if (key.startsWith(\"delegated-key-\")) localStorage.removeItem(key);\n });\n }\n setSdkAuth(null);\n onLogout?.();\n }, [jwtStorageKey, jwtCookieName, syncJwtToCookie, onLogout]);\n\n const register = useCallback(\n async (username: string, email: string, password: string, isActive = true) => {\n setSdkAuth(null);\n const platformKey = getPlatformApiKey();\n const userData: {\n username: string;\n email: string;\n password: string;\n isActive: boolean;\n platformApiKey?: string;\n } = { username, email, password, isActive };\n if (platformKey) userData.platformApiKey = platformKey;\n await createUser(userData);\n await login({ usernameOrEmail: username, password });\n onRegisterSuccess?.();\n },\n [login, onRegisterSuccess]\n );\n\n const clearSessionDueToAuthError = useCallback(() => {\n setUser(null);\n setJwt(null);\n clearAuth();\n if (typeof window !== \"undefined\") {\n localStorage.removeItem(jwtStorageKey);\n if (syncJwtToCookie) setJwtCookie(jwtCookieName, null);\n const keys = Object.keys(localStorage);\n keys.forEach((key) => {\n if (key.startsWith(\"delegated-key-\")) localStorage.removeItem(key);\n });\n }\n setSdkAuth(null);\n onSessionExpired?.();\n }, [jwtStorageKey, jwtCookieName, syncJwtToCookie, onSessionExpired]);\n\n const loadWallets = useCallback(async () => {\n if (!jwt) return;\n setWalletsLoading(true);\n setWalletError(null);\n try {\n setSdkAuth(jwt);\n const result = await findAllWallets();\n const walletsList = extractResponseData<WalletDataDto[]>(result) ?? [];\n const list = Array.isArray(walletsList) ? walletsList : [];\n const formatted: WalletData[] = list.map((w) =>\n normalizeWallet(w as unknown as Record<string, unknown>) as unknown as WalletData\n );\n setWallets(formatted);\n } catch (err) {\n if (isAuthError(err)) {\n clearSessionDueToAuthError();\n setWalletError(\"Session expired. Please sign in again.\");\n } else {\n setWalletError(extractErrorMessage(err));\n }\n setWallets([]);\n } finally {\n setWalletsLoading(false);\n }\n }, [jwt, clearSessionDueToAuthError]);\n\n useEffect(() => {\n if (jwt) {\n loadWallets();\n } else {\n setWallets([]);\n setSelectedWallet(null);\n setWalletError(null);\n setWalletsLoading(false);\n }\n }, [jwt, loadWallets]);\n\n useEffect(() => {\n if (wallets.length > 0 && !selectedWallet) {\n const storedId =\n typeof window !== \"undefined\" ? localStorage.getItem(walletStorageKey) : null;\n if (storedId) {\n const w = wallets.find((x) => x.id === storedId || x.walletId === storedId);\n if (w) setSelectedWallet(w);\n else {\n setSelectedWallet(wallets[0]);\n if (typeof window !== \"undefined\")\n localStorage.setItem(walletStorageKey, wallets[0].id ?? wallets[0].walletId);\n }\n } else {\n setSelectedWallet(wallets[0]);\n if (typeof window !== \"undefined\")\n localStorage.setItem(walletStorageKey, wallets[0].id ?? wallets[0].walletId);\n }\n } else if (wallets.length === 0) {\n setSelectedWallet(null);\n if (typeof window !== \"undefined\") localStorage.removeItem(walletStorageKey);\n }\n }, [wallets, walletStorageKey]);\n\n const selectWallet = useCallback(\n (walletId: string) => {\n const w = wallets.find((x) => x.id === walletId || x.walletId === walletId);\n if (w) {\n setSelectedWallet(w);\n if (typeof window !== \"undefined\")\n localStorage.setItem(walletStorageKey, w.id ?? w.walletId);\n }\n },\n [wallets, walletStorageKey]\n );\n\n const createWallet = useCallback(\n async (params: { name: string; userId?: string }) => {\n setSdkAuth(jwt ?? undefined);\n const dto = { walletName: params.name, chain: \"solana\" as const };\n const result = await createWalletSDK(dto);\n await loadWallets();\n return result as WalletControllerCreateResult;\n },\n [jwt, loadWallets]\n );\n\n const value: CilantroContextValue = useMemo(\n () => ({\n config,\n storage: storageAdapter ?? null,\n user,\n jwt,\n isAuthenticated: !!jwt,\n isLoading: authLoading,\n login,\n logout,\n register,\n clearSessionDueToAuthError,\n wallet: selectedWallet,\n wallets,\n createWallet,\n selectWallet,\n refreshWallets: loadWallets,\n walletError,\n walletsLoading,\n }),\n [\n config,\n storageAdapter,\n user,\n jwt,\n authLoading,\n login,\n logout,\n register,\n clearSessionDueToAuthError,\n selectedWallet,\n wallets,\n createWallet,\n selectWallet,\n loadWallets,\n walletError,\n walletsLoading,\n ]\n );\n\n return (\n <CilantroContext.Provider value={value}>{children}</CilantroContext.Provider>\n );\n}\n\nexport function useCilantroContext(): CilantroContextValue {\n const ctx = useContext(CilantroContext);\n if (ctx === undefined) {\n throw new Error(\"useCilantroContext must be used within CilantroContextProvider\");\n }\n return ctx;\n}\n","import { setAuth } from \"cilantro-sdk\";\n\nlet platformApiKey = \"\";\nlet apiUrl: string | undefined;\n\nexport interface AuthConfig {\n platformApiKey?: string;\n apiUrl?: string;\n /** Guide-aligned alias for platformApiKey */\n apiKey?: string;\n /** Guide-aligned alias for apiUrl */\n baseURL?: string;\n jwt?: string | null;\n}\n\n/**\n * Set SDK authentication config. Call with apiKey/baseURL (or platformApiKey/apiUrl) from provider/config.\n * Do not read process.env in library code.\n */\nexport function setAuthConfig(config: AuthConfig): void {\n platformApiKey = config.apiKey ?? config.platformApiKey ?? \"\";\n apiUrl = config.baseURL ?? config.apiUrl;\n const authPayload: { jwt?: string; platformApiKey?: string; apiUrl?: string } = {};\n if (config.jwt) {\n authPayload.jwt = config.jwt;\n }\n if (platformApiKey) {\n authPayload.platformApiKey = platformApiKey;\n }\n if (apiUrl) {\n authPayload.apiUrl = apiUrl;\n }\n setAuth(authPayload);\n}\n\n/**\n * Set SDK auth with JWT (assumes platformApiKey already set via setAuthConfig).\n */\nexport function setSdkAuth(jwt?: string | null): void {\n const authConfig: { jwt?: string; platformApiKey?: string; apiUrl?: string } = {};\n if (jwt) {\n authConfig.jwt = jwt;\n }\n if (platformApiKey) {\n authConfig.platformApiKey = platformApiKey;\n }\n if (apiUrl) {\n authConfig.apiUrl = apiUrl;\n }\n setAuth(authConfig);\n}\n\n/**\n * Get the platform API key (set via setAuthConfig).\n */\nexport function getPlatformApiKey(): string {\n return platformApiKey;\n}\n\n/**\n * Get the optional API URL (set via setAuthConfig).\n */\nexport function getApiUrl(): string | undefined {\n return apiUrl;\n}\n\n/**\n * Check if a JWT is expired using the payload `exp` claim.\n * @param token - JWT string (assumes 3 segments separated by dots).\n * @param bufferSeconds - Optional buffer in seconds; if exp is within this many seconds of now, treat as expired (default 60).\n * @returns true if token is expired or invalid/not a JWT.\n */\nexport function isJwtExpired(token: string, bufferSeconds = 60): boolean {\n if (!token || typeof token !== \"string\") return true;\n const parts = token.split(\".\");\n if (parts.length !== 3) return true;\n try {\n const payload = JSON.parse(atob(parts[1])) as { exp?: number };\n const exp = payload.exp;\n if (exp == null || typeof exp !== \"number\") return false;\n const now = Math.floor(Date.now() / 1000);\n return exp - bufferSeconds <= now;\n } catch {\n return true;\n }\n}\n","import { createIndexedDBAdapter } from \"cilantro-sdk/helpers\";\n\nexport type DeviceKeyStorage = ReturnType<typeof createIndexedDBAdapter>;\n\nlet storageAdapterInstance: DeviceKeyStorage | null = null;\nlet contextProvidedAdapter: DeviceKeyStorage | null = null;\nlet initializationPromise: Promise<DeviceKeyStorage> | null = null;\n\n/**\n * Set the storage adapter from CilantroProvider (context). When set, getStorageAdapter() returns this.\n */\nexport function setStorageAdapter(adapter: DeviceKeyStorage | null): void {\n contextProvidedAdapter = adapter;\n}\n\nexport async function initializeStorageAdapter(): Promise<DeviceKeyStorage> {\n if (contextProvidedAdapter) return contextProvidedAdapter;\n if (storageAdapterInstance) return storageAdapterInstance;\n if (initializationPromise) return initializationPromise;\n if (typeof window === \"undefined\") {\n throw new Error(\"Storage adapter can only be initialized in browser environment.\");\n }\n initializationPromise = (async () => {\n try {\n storageAdapterInstance = createIndexedDBAdapter();\n return storageAdapterInstance;\n } catch (error) {\n initializationPromise = null;\n throw error;\n }\n })();\n return initializationPromise;\n}\n\nexport function getStorageAdapter(): DeviceKeyStorage {\n if (contextProvidedAdapter) return contextProvidedAdapter;\n if (storageAdapterInstance) return storageAdapterInstance;\n if (typeof window === \"undefined\") {\n throw new Error(\"Storage adapter can only be initialized in browser environment.\");\n }\n storageAdapterInstance = createIndexedDBAdapter();\n return storageAdapterInstance;\n}\n\nexport function getStorageAdapterType(): \"IndexedDB\" | \"LocalStorage\" | \"Memory\" | \"Unknown\" {\n if (typeof window === \"undefined\") return \"Memory\";\n if (\"indexedDB\" in window) return \"IndexedDB\";\n return \"Unknown\";\n}\n\nexport function clearStorageAdapter(): void {\n storageAdapterInstance = null;\n}\n","/**\n * Type Utilities - common types and utilities for SDK interactions\n */\n\nexport type ActionState<T = unknown> = {\n status: \"idle\" | \"loading\" | \"success\" | \"error\";\n message?: string;\n detail?: T;\n};\n\nexport interface ErrorResponse {\n message?: string;\n error?: string;\n code?: string | number;\n status?: number;\n statusText?: string;\n data?: unknown;\n stack?: string;\n type?: string;\n}\n\nexport type ApiResponse<T> = T | { data: T } | { success: boolean; data: T };\n\nexport function extractResponseData<T>(response: unknown): T | null {\n if (!response) return null;\n if (typeof response !== \"object\" || response === null) {\n return response as T;\n }\n if (\"data\" in response) {\n const data = (response as { data: unknown }).data;\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const dataObj = data as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n if (\"authenticationSigners\" in dataObj || \"onChainSigners\" in dataObj) {\n const authSigners = Array.isArray(dataObj.authenticationSigners) ? dataObj.authenticationSigners : [];\n const onChainSigners = Array.isArray(dataObj.onChainSigners) ? dataObj.onChainSigners : [];\n return [...authSigners, ...onChainSigners] as T;\n }\n }\n return data as T;\n }\n if (\"success\" in response && \"data\" in response) {\n const data = (response as { success: boolean; data: unknown }).data;\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const dataObj = data as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n if (\"authenticationSigners\" in dataObj || \"onChainSigners\" in dataObj) {\n const authSigners = Array.isArray(dataObj.authenticationSigners) ? dataObj.authenticationSigners : [];\n const onChainSigners = Array.isArray(dataObj.onChainSigners) ? dataObj.onChainSigners : [];\n return [...authSigners, ...onChainSigners] as T;\n }\n }\n return data as T;\n }\n if (\"authenticationSigners\" in response || \"onChainSigners\" in response) {\n const responseObj = response as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n const authSigners = Array.isArray(responseObj.authenticationSigners) ? responseObj.authenticationSigners : [];\n const onChainSigners = Array.isArray(responseObj.onChainSigners) ? responseObj.onChainSigners : [];\n return [...authSigners, ...onChainSigners] as T;\n }\n return response as T;\n}\n\nexport function extractOnChainSigners<T>(response: unknown): T[] {\n if (!response || typeof response !== \"object\" || response === null) return [];\n let signersObj: { authenticationSigners?: unknown[]; onChainSigners?: unknown[] } | null = null;\n if (\"data\" in response) {\n const data = (response as { data: unknown }).data;\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const dataObj = data as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n if (\"authenticationSigners\" in dataObj || \"onChainSigners\" in dataObj) signersObj = dataObj;\n }\n }\n if (!signersObj && \"success\" in response && \"data\" in response) {\n const data = (response as { success: boolean; data: unknown }).data;\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const dataObj = data as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n if (\"authenticationSigners\" in dataObj || \"onChainSigners\" in dataObj) signersObj = dataObj;\n }\n }\n if (!signersObj && (\"authenticationSigners\" in response || \"onChainSigners\" in response)) {\n signersObj = response as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n }\n if (signersObj) {\n return (Array.isArray(signersObj.onChainSigners) ? signersObj.onChainSigners : []) as T[];\n }\n if (Array.isArray(response)) return response as T[];\n return [];\n}\n\nexport function extractAuthenticationSigners<T>(response: unknown): T[] {\n if (!response || typeof response !== \"object\" || response === null) return [];\n let signersObj: { authenticationSigners?: unknown[]; onChainSigners?: unknown[] } | null = null;\n if (\"data\" in response) {\n const data = (response as { data: unknown }).data;\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const dataObj = data as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n if (\"authenticationSigners\" in dataObj || \"onChainSigners\" in dataObj) signersObj = dataObj;\n }\n }\n if (!signersObj && \"success\" in response && \"data\" in response) {\n const data = (response as { success: boolean; data: unknown }).data;\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const dataObj = data as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n if (\"authenticationSigners\" in dataObj || \"onChainSigners\" in dataObj) signersObj = dataObj;\n }\n }\n if (!signersObj && (\"authenticationSigners\" in response || \"onChainSigners\" in response)) {\n signersObj = response as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n }\n if (signersObj) {\n return (Array.isArray(signersObj.authenticationSigners) ? signersObj.authenticationSigners : []) as T[];\n }\n return [];\n}\n\nexport function isErrorWithResponse(\n error: unknown\n): error is { response?: { data?: { message?: string; error?: string }; status?: number; statusText?: string } } {\n return typeof error === \"object\" && error !== null && \"response\" in error;\n}\n\nexport function isErrorWithMessage(error: unknown): error is { message?: string } {\n return typeof error === \"object\" && error !== null && \"message\" in error;\n}\n","import { isErrorWithResponse, isErrorWithMessage } from \"./types\";\nimport type { ErrorResponse } from \"./types\";\n\nexport function extractErrorMessage(error: unknown): string {\n if (!error) return \"An unknown error occurred\";\n if (error instanceof Error) return error.message;\n if (isErrorWithResponse(error)) {\n if (error.response?.data?.message) return String(error.response.data.message);\n if (error.response?.data?.error) return String(error.response.data.error);\n }\n if (isErrorWithMessage(error)) return String(error.message);\n if (typeof error === \"object\" && error !== null && \"error\" in error) {\n return String((error as { error: unknown }).error);\n }\n return String(error);\n}\n\nexport function getErrorDetails(error: unknown): ErrorResponse | null {\n if (!error) return null;\n if (typeof error === \"object\" && error !== null) {\n const err = error as { name?: string; constructor?: { name?: string }; code?: string | number; stack?: string };\n const details: ErrorResponse = {\n message: extractErrorMessage(error),\n type: err.name || (err.constructor?.name as string | undefined),\n stack: err.stack,\n };\n if (isErrorWithResponse(error)) {\n details.code = err.code ?? error.response?.status;\n details.status = error.response?.status;\n details.statusText = error.response?.statusText;\n details.data = error.response?.data;\n } else if (err.code) {\n details.code = err.code;\n }\n return details;\n }\n return { message: extractErrorMessage(error), data: error };\n}\n\nexport function isNetworkError(error: unknown): boolean {\n if (!error || typeof error !== \"object\" || error === null) return false;\n const err = error as { code?: string; message?: string };\n const hasResponse = isErrorWithResponse(error);\n return (\n err.code === \"ECONNREFUSED\" ||\n err.code === \"ETIMEDOUT\" ||\n err.code === \"ENOTFOUND\" ||\n (err.message?.toLowerCase().includes(\"network\") ?? false) ||\n (err.message?.toLowerCase().includes(\"connection\") ?? false) ||\n !hasResponse\n );\n}\n\nexport function isAuthError(error: unknown): boolean {\n if (!error || typeof error !== \"object\" || error === null) return false;\n if (isErrorWithResponse(error)) {\n const status = error.response?.status;\n if (status === 401 || status === 403) return true;\n }\n const err = error as { message?: string };\n const message = err.message?.toLowerCase() ?? \"\";\n return message.includes(\"unauthorized\") || message.includes(\"authentication\");\n}\n","/**\n * Normalization at the boundary: map SDK DTOs to a consistent shape with id/address (and aliases).\n * Use these when ingesting wallet/signer data from the SDK so consumers can rely on id and address.\n */\n\n/** Normalized wallet shape: always has id and address. */\nexport interface NormalizedWallet {\n id: string;\n address: string;\n active?: boolean;\n [key: string]: unknown;\n}\n\n/**\n * Normalize a wallet DTO so that id and address are always present.\n * Use at the boundary when loading wallets from the SDK.\n * Accepts any object with optional walletId/id, walletAddress/address, isActive.\n */\nexport function normalizeWallet(dto: Record<string, unknown>): NormalizedWallet {\n const w = dto as { walletId?: string; id?: string; walletAddress?: string; address?: string; isActive?: boolean };\n return {\n ...dto,\n id: w.walletId ?? w.id ?? \"\",\n address: w.walletAddress ?? w.address ?? \"\",\n active: w.isActive,\n } as NormalizedWallet;\n}\n\n/** Wallet-like object with optional id/walletId and address/walletAddress. */\nexport type WalletLike = { id?: string; walletId?: string; address?: string; walletAddress?: string } & Record<string, unknown>;\n\n/**\n * Get wallet ID from a wallet-like object. Prefer id; fallback to walletId.\n */\nexport function getWalletId(wallet: WalletLike | null | undefined): string {\n if (!wallet) return \"\";\n return (wallet.id ?? wallet.walletId ?? \"\") as string;\n}\n\n/**\n * Get wallet address from a wallet-like object. Prefer address; fallback to walletAddress.\n */\nexport function getWalletAddress(wallet: WalletLike | null | undefined): string {\n if (!wallet) return \"\";\n return (wallet.address ?? wallet.walletAddress ?? \"\") as string;\n}\n","\"use client\";\n\nimport { type ReactNode, useEffect } from \"react\";\nimport { CilantroContextProvider } from \"../context/CilantroContext\";\nimport { initializeStorageAdapter } from \"../core/storage-adapter\";\nimport type { DeviceKeyStorage } from \"../core/storage-adapter\";\n\nexport interface CilantroProviderProps {\n children: ReactNode;\n /** Platform API key (guide: apiKey). Either apiKey or jwt via login is required for authenticated requests. */\n apiKey?: string;\n /** API base URL (guide: baseURL). Default: https://api.cilantro.gg */\n baseURL?: string;\n /** Storage for device keys - email/phone signers (guide: storageAdapter). Default: IndexedDB in browser. */\n storageAdapter?: DeviceKeyStorage | null;\n /** @deprecated Use apiKey instead. */\n platformApiKey?: string;\n /** @deprecated Use baseURL instead. */\n apiUrl?: string;\n /** localStorage key for JWT (default: cilantro_jwt) */\n jwtStorageKey?: string;\n /** localStorage key for selected wallet id (default: cilantro_selected_wallet_id) */\n walletStorageKey?: string;\n /** When true, sync JWT to a cookie for Next.js/middleware. Default: false. */\n syncJwtToCookie?: boolean;\n /** Cookie name for JWT when syncJwtToCookie is true. Default: cilantro_jwt. */\n jwtCookieName?: string;\n onLoginSuccess?: () => void;\n onLogout?: () => void;\n onRegisterSuccess?: () => void;\n onSessionExpired?: () => void;\n}\n\nexport function CilantroProvider({\n children,\n apiKey: apiKeyProp,\n baseURL,\n storageAdapter,\n platformApiKey,\n apiUrl,\n jwtStorageKey,\n walletStorageKey,\n syncJwtToCookie,\n jwtCookieName,\n onLoginSuccess,\n onLogout,\n onRegisterSuccess,\n onSessionExpired,\n}: CilantroProviderProps) {\n const apiKey = apiKeyProp ?? platformApiKey;\n const resolvedBaseURL = baseURL ?? apiUrl;\n\n useEffect(() => {\n if (!storageAdapter) {\n initializeStorageAdapter().catch((err) => {\n console.error(\"[CilantroProvider] Failed to initialize storage adapter:\", err);\n });\n }\n }, [storageAdapter]);\n\n return (\n <CilantroContextProvider\n apiKey={apiKey}\n baseURL={resolvedBaseURL}\n storageAdapter={storageAdapter ?? undefined}\n jwtStorageKey={jwtStorageKey}\n walletStorageKey={walletStorageKey}\n syncJwtToCookie={syncJwtToCookie}\n jwtCookieName={jwtCookieName}\n onLoginSuccess={onLoginSuccess}\n onLogout={onLogout}\n onRegisterSuccess={onRegisterSuccess}\n onSessionExpired={onSessionExpired}\n >\n {children}\n </CilantroContextProvider>\n );\n}\n","\"use client\";\n\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport type { User } from \"../context/CilantroContext\";\n\nexport interface CilantroAuthContextType {\n user: User | null;\n /** JWT token. Alias for token. */\n jwt: string | null;\n token: string | null;\n isAuthenticated: boolean;\n login: (usernameOrEmail: string, password: string) => Promise<void>;\n register: (username: string, email: string, password: string, isActive?: boolean) => Promise<void>;\n logout: () => void;\n clearSessionDueToAuthError: () => void;\n isLoading: boolean;\n}\n\nexport function useCilantroAuth(): CilantroAuthContextType {\n const ctx = useCilantroContext();\n return {\n user: ctx.user,\n jwt: ctx.jwt,\n token: ctx.jwt,\n isAuthenticated: ctx.isAuthenticated,\n login: (usernameOrEmail: string, password: string) =>\n ctx.login({ usernameOrEmail, password }),\n register: ctx.register,\n logout: ctx.logout,\n clearSessionDueToAuthError: ctx.clearSessionDueToAuthError,\n isLoading: ctx.isLoading,\n };\n}\n\nexport type { User };\n","\"use client\";\n\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport type { WalletData } from \"../context/CilantroContext\";\n\nexport interface WalletContextType {\n /** Selected wallet. Primary name. */\n wallet: WalletData | null;\n /** @deprecated Use wallet instead. Alias for backward compat. */\n selectedWallet: WalletData | null;\n wallets: WalletData[];\n selectWallet: (walletId: string) => void;\n refreshWallets: () => Promise<void>;\n isLoading: boolean;\n error: string | null;\n}\n\nexport function useWallets(): WalletContextType {\n const ctx = useCilantroContext();\n const wallet = ctx.wallet;\n return {\n wallet,\n selectedWallet: wallet,\n wallets: ctx.wallets,\n selectWallet: ctx.selectWallet,\n refreshWallets: ctx.refreshWallets,\n isLoading: ctx.walletsLoading,\n error: ctx.walletError,\n };\n}\n\nexport type { WalletData };\nexport type WalletDataDto = WalletData;\n","/**\n * cilantro-react - Public API\n * React SDK/UI for Cilantro Smart Wallet (guide-aligned)\n */\n\n// Context\nexport {\n CilantroContextProvider,\n useCilantroContext,\n type CilantroConfig,\n type CilantroContextValue,\n type User,\n type WalletData,\n type WalletDataDto,\n} from \"./context/CilantroContext\";\n\n// Provider (single entry point)\nexport {\n CilantroProvider,\n type CilantroProviderProps,\n} from \"./providers/CilantroProvider\";\n\n// Auth/wallet hooks (read from context)\nexport { useCilantroAuth, type CilantroAuthContextType } from \"./providers/CilantroAuthProvider\";\nexport {\n useWallets,\n type WalletContextType,\n type WalletData as WalletDataFromHook,\n type WalletDataDto as WalletDataDtoFromHook,\n} from \"./providers/WalletProvider\";\n\n// Storage adapters\nexport {\n createIndexedDBAdapter,\n createLocalStorageAdapter,\n createMemoryAdapter,\n} from \"cilantro-sdk/helpers\";\nexport type { DeviceKeyStorage } from \"./core/storage-adapter\";\n\n// Hooks (guide API)\nexport { useCilantroConfig, type UseCilantroConfigResult } from \"./hooks/useCilantroConfig\";\nexport { useAuth, type UseAuthResult } from \"./hooks/useAuth\";\nexport { useReturnUrl, type UseReturnUrlOptions } from \"./hooks/useReturnUrl\";\nexport { useWallet, type UseWalletResult } from \"./hooks/useWallet\";\nexport { useSigners, type UseSignersOptions, type UseSignersResult } from \"./hooks/useSigners\";\nexport { usePasskey, type UsePasskeyResult } from \"./hooks/usePasskey\";\nexport {\n useExternalWallet,\n type UseExternalWalletResult,\n type SolanaWallet,\n} from \"./hooks/useExternalWallet\";\nexport {\n useSendTransaction,\n type UseSendTransactionResult,\n type SubmitTransactionResult,\n type SignerType as SendTransactionSignerType,\n} from \"./hooks/useSendTransaction\";\n\n// Auth components\nexport { LoginForm, type LoginFormProps, type LoginFormClassNames } from \"./components/auth/LoginForm\";\nexport { RegisterForm, type RegisterFormProps, type RegisterFormClassNames } from \"./components/auth/RegisterForm\";\nexport { LogoutButton, type LogoutButtonProps } from \"./components/auth/LogoutButton\";\nexport { AuthGuard, type AuthGuardProps, type AuthGuardClassNames, type AuthGuardLayout } from \"./components/auth/AuthGuard\";\nexport { AuthShell, type AuthShellProps, type AuthShellClassNames } from \"./components/auth/AuthShell\";\n\n// Signer components\nexport {\n CreateEmailSignerForm,\n type CreateEmailSignerFormProps,\n} from \"./components/signers/CreateEmailSignerForm\";\nexport {\n CreatePhoneSignerForm,\n type CreatePhoneSignerFormProps,\n} from \"./components/signers/CreatePhoneSignerForm\";\nexport { AddPasskeyButton, type AddPasskeyButtonProps } from \"./components/signers/AddPasskeyButton\";\nexport {\n SignerList,\n type SignerListProps,\n type SignerListClassNames,\n} from \"./components/signers/SignerList\";\nexport {\n SignerSelector,\n type SignerSelectorProps,\n type SignerSelectorClassNames,\n} from \"./components/signers/SignerSelector\";\n\n// Wallet components\nexport {\n ConnectWalletButton,\n type ConnectWalletButtonProps,\n} from \"./components/wallet/ConnectWalletButton\";\nexport {\n CreateWalletForm,\n type CreateWalletFormProps,\n} from \"./components/wallet/CreateWalletForm\";\nexport {\n WalletSelector,\n type WalletSelectorProps,\n type WalletSelectorClassNames,\n} from \"./components/wallet/WalletSelector\";\nexport { WalletAddress, type WalletAddressProps } from \"./components/wallet/WalletAddress\";\nexport { WalletBalance, type WalletBalanceProps } from \"./components/wallet/WalletBalance\";\n\n// Transaction components\nexport {\n SendSOLForm,\n type SendSOLFormProps,\n type SignerType as SendSOLSignerType,\n} from \"./components/transactions/SendSOLForm\";\nexport {\n SendSPLForm,\n type SendSPLFormProps,\n} from \"./components/transactions/SendSPLForm\";\nexport {\n TransactionStatus,\n type TransactionStatusProps,\n} from \"./components/transactions/TransactionStatus\";\nexport {\n TransactionHistory,\n type TransactionHistoryProps,\n} from \"./components/transactions/TransactionHistory\";\n\n// Layout / utility\nexport {\n CilantroConnect,\n type CilantroConnectProps,\n type WalletInfo,\n} from \"./components/layout/CilantroConnect\";\nexport { LoadingOverlay, type LoadingOverlayProps } from \"./components/layout/LoadingOverlay\";\nexport { ErrorBoundary, type ErrorBoundaryProps } from \"./components/layout/ErrorBoundary\";\n\n// UI primitives\nexport { Skeleton } from \"./ui/skeleton\";\nexport {\n ThemeProvider,\n type Theme,\n type ResolvedTheme,\n type ThemeProviderProps,\n} from \"./ui/theme-provider\";\n\n// Core types and utilities\nexport type { ActionState, ApiResponse, ErrorResponse } from \"./core/types\";\nexport type { SignerData } from \"./core/signer-helpers\";\nexport { normalizeSigner } from \"./core/signer-helpers\";\nexport { normalizeWallet, getWalletId, getWalletAddress } from \"./core/normalize\";\nexport type { NormalizedWallet, WalletLike } from \"./core/normalize\";\nexport { extractResponseData } from \"./core/types\";\nexport { extractErrorMessage, isAuthError } from \"./core/error-utils\";\nexport { isJwtExpired } from \"./core/auth\";\n\n// Solana connection adapter (advanced usage)\nexport {\n adaptSolanaConnection,\n type SignAndSendConnectionAdapter,\n} from \"./adapters/solana-connection\";\n\n// Signer signing (advanced usage)\nexport {\n signMessageWithSigner,\n signAndSendTransactionWithSigner,\n signTransactionWithSigner,\n getWalletData,\n getSignerPublicKey,\n SIGNER_TYPES,\n type SignerType,\n type SignAndSendConnection,\n type SignAndSendResult,\n type SubmitTransactionDataDto,\n type SignMessageResult,\n} from \"./core/signer-signing\";\n\n// SDK types (re-exports)\nexport type { AuthControllerLogin200Data } from \"cilantro-sdk/auth\";\nexport type {\n WalletControllerFindAllResult,\n WalletControllerFindOneResult,\n WalletControllerSubmitTransactionResult,\n WalletControllerListSignersResult,\n} from \"cilantro-sdk/wallet\";\nexport type { TransactionControllerSendRawPasskeyTransactionResult } from \"cilantro-sdk/transactions\";\n","\"use client\";\n\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport type { CilantroConfig } from \"../context/CilantroContext\";\nimport type { DeviceKeyStorage } from \"../core/storage-adapter\";\n\nexport interface UseCilantroConfigResult {\n config: CilantroConfig;\n storage: DeviceKeyStorage | null;\n}\n\nexport function useCilantroConfig(): UseCilantroConfigResult {\n const ctx = useCilantroContext();\n return {\n config: ctx.config,\n storage: ctx.storage,\n };\n}\n","\"use client\";\n\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport type { User } from \"../context/CilantroContext\";\n\nexport interface UseAuthResult {\n /** Current user (from JWT payload or login response). */\n user: User | null;\n /** JWT token. Prefer this name. */\n jwt: string | null;\n /** Alias for jwt. Same value. */\n token: string | null;\n isLoading: boolean;\n isAuthenticated: boolean;\n login: (params: { usernameOrEmail: string; password: string }) => Promise<void>;\n /** Register a new user and auto-login. */\n register: (\n username: string,\n email: string,\n password: string,\n isActive?: boolean\n ) => Promise<void>;\n logout: () => void;\n /** Clear session when API returns 401/403. Call onSessionExpired. */\n clearSessionDueToAuthError: () => void;\n}\n\nexport function useAuth(): UseAuthResult {\n const ctx = useCilantroContext();\n return {\n user: ctx.user,\n jwt: ctx.jwt,\n token: ctx.jwt,\n isLoading: ctx.isLoading,\n isAuthenticated: ctx.isAuthenticated,\n login: ctx.login,\n register: ctx.register,\n logout: ctx.logout,\n clearSessionDueToAuthError: ctx.clearSessionDueToAuthError,\n };\n}\n","\"use client\";\n\nimport { useCallback, useMemo } from \"react\";\n\nexport interface UseReturnUrlOptions {\n /** Query param name for return URL. Default: \"returnUrl\" */\n param?: string;\n /** Default path when no returnUrl in URL. Default: \"/\" */\n defaultPath?: string;\n /** Only allow relative paths (no protocol). Default: true */\n allowRelativeOnly?: boolean;\n}\n\n/**\n * Read returnUrl from URL search params and provide a safe redirect path.\n * Use with LoginForm/RegisterForm to redirect users back after auth.\n *\n * @example\n * // In LoginForm wrapper - redirect to returnUrl after login\n * const { returnPath, redirect } = useReturnUrl();\n * <LoginForm onSuccess={() => redirect()} redirectAfterSuccess={returnPath} onRedirect={router.replace} />\n */\nexport function useReturnUrl(options: UseReturnUrlOptions = {}): {\n /** Safe path to redirect to (from URL or defaultPath) */\n returnPath: string;\n /** Redirect to returnPath using window.location (or pass custom fn) */\n redirect: (customRedirect?: (path: string) => void) => void;\n /** Raw value from URL (may be empty) */\n rawReturnUrl: string | null;\n} {\n const {\n param = \"returnUrl\",\n defaultPath = \"/\",\n allowRelativeOnly = true,\n } = options;\n\n const rawReturnUrl = useMemo(() => {\n if (typeof window === \"undefined\") return null;\n const params = new URLSearchParams(window.location.search);\n return params.get(param);\n }, [param]);\n\n const returnPath = useMemo(() => {\n if (!rawReturnUrl) return defaultPath;\n if (allowRelativeOnly) {\n // Reject absolute URLs (protocol-relative or http(s))\n const trimmed = rawReturnUrl.trim();\n if (trimmed.startsWith(\"//\") || /^https?:\\/\\//i.test(trimmed)) {\n return defaultPath;\n }\n if (trimmed.startsWith(\"/\")) return trimmed;\n // Relative path without leading slash - make absolute\n return `/${trimmed}`;\n }\n return rawReturnUrl;\n }, [rawReturnUrl, defaultPath, allowRelativeOnly]);\n\n const redirect = useCallback(\n (customRedirect?: (path: string) => void) => {\n const path = returnPath;\n if (customRedirect) {\n customRedirect(path);\n } else if (typeof window !== \"undefined\") {\n window.location.href = path;\n }\n },\n [returnPath]\n );\n\n return { returnPath, redirect, rawReturnUrl };\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport type { WalletData } from \"../context/CilantroContext\";\nimport type { WalletControllerCreateResult } from \"cilantro-sdk/wallet\";\n\nexport interface UseWalletResult {\n /** Selected wallet. Use this as primary. */\n wallet: WalletData | null;\n wallets: WalletData[];\n createWallet: (params: { name: string; userId?: string }) => Promise<WalletControllerCreateResult>;\n selectWallet: (walletId: string) => void;\n /** Refresh wallet list from API. */\n refreshWallets: () => Promise<void>;\n isLoading: boolean;\n /** Error from wallet operations (e.g. fetch failed). */\n error: string | null;\n}\n\nexport function useWallet(_walletId?: string): UseWalletResult {\n const ctx = useCilantroContext();\n return useMemo(\n () => ({\n wallet: ctx.wallet,\n wallets: ctx.wallets,\n createWallet: ctx.createWallet,\n selectWallet: ctx.selectWallet,\n refreshWallets: ctx.refreshWallets,\n isLoading: ctx.walletsLoading,\n error: ctx.walletError,\n }),\n [\n ctx.wallet,\n ctx.wallets,\n ctx.createWallet,\n ctx.selectWallet,\n ctx.refreshWallets,\n ctx.walletsLoading,\n ctx.walletError,\n ]\n );\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport { setSdkAuth } from \"../core/auth\";\nimport { loadSigners, type SignerData } from \"../core/signer-helpers\";\nimport {\n createEmailSignerHelper,\n createPhoneSignerHelper,\n} from \"../core/signer-creation\";\nimport { deleteSigner } from \"cilantro-sdk/wallet\";\nimport type { SignerInfo } from \"cilantro-sdk/helpers\";\n\nexport interface UseSignersOptions {\n /** Wallet ID to load signers for. If not provided, uses selectedWallet?.id from context (call useWallets() in same component). */\n walletId?: string | null;\n}\n\nexport interface UseSignersResult {\n signers: SignerData[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n createEmailSigner: (params: { email: string }) => Promise<SignerInfo>;\n createPhoneSigner: (params: { phone: string }) => Promise<SignerInfo>;\n revokeSigner: (signerId: string) => Promise<void>;\n}\n\nexport function useSigners(\n walletIdOrOptions?: string | null | UseSignersOptions\n): UseSignersResult {\n const walletIdOption =\n typeof walletIdOrOptions === \"object\"\n ? walletIdOrOptions?.walletId\n : walletIdOrOptions;\n const { jwt } = useCilantroContext();\n const [signers, setSigners] = useState<SignerData[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const load = useCallback(\n async (walletId: string) => {\n if (!walletId) {\n setSigners([]);\n return;\n }\n setIsLoading(true);\n setError(null);\n try {\n if (jwt) setSdkAuth(jwt);\n const list = await loadSigners(walletId);\n setSigners(list);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n setSigners([]);\n } finally {\n setIsLoading(false);\n }\n },\n [jwt]\n );\n\n useEffect(() => {\n const id = walletIdOption ?? undefined;\n if (id) load(id);\n else {\n setSigners([]);\n setError(null);\n }\n }, [walletIdOption, load]);\n\n const refresh = useCallback(async () => {\n const id = walletIdOption ?? undefined;\n if (id) await load(id);\n }, [walletIdOption, load]);\n\n const createEmailSigner = useCallback(\n async (params: { email: string }) => {\n const walletId = walletIdOption ?? undefined;\n if (!walletId) throw new Error(\"walletId is required\");\n if (jwt) setSdkAuth(jwt);\n const signer = await createEmailSignerHelper(walletId, params.email);\n await refresh();\n return signer;\n },\n [walletIdOption, jwt, refresh]\n );\n\n const createPhoneSigner = useCallback(\n async (params: { phone: string }) => {\n const walletId = walletIdOption ?? undefined;\n if (!walletId) throw new Error(\"walletId is required\");\n if (jwt) setSdkAuth(jwt);\n const signer = await createPhoneSignerHelper(walletId, params.phone);\n await refresh();\n return signer;\n },\n [walletIdOption, jwt, refresh]\n );\n\n const revokeSigner = useCallback(\n async (signerId: string) => {\n const walletId = walletIdOption ?? undefined;\n if (!walletId) throw new Error(\"walletId is required\");\n if (jwt) setSdkAuth(jwt);\n await deleteSigner(walletId, signerId);\n await refresh();\n },\n [walletIdOption, jwt, refresh]\n );\n\n return {\n signers,\n isLoading,\n error,\n refresh,\n createEmailSigner,\n createPhoneSigner,\n revokeSigner,\n };\n}\n","import { getSigners, parseSignerResponse, type SignerInfo } from \"cilantro-sdk/helpers\";\nimport { listSigners } from \"cilantro-sdk/wallet\";\nimport { extractOnChainSigners, extractAuthenticationSigners } from \"./types\";\n\n/**\n * Normalized signer shape aligned with SDK SignerDataDto / WalletSignerDataDto.\n * Uses SDK field names (signerId, signerType, signerPubkey, authId); id is an alias for signerId or WalletSignerDataDto.id.\n */\nexport interface SignerData extends Omit<SignerInfo, \"signerId\"> {\n id: string;\n signerId: string;\n signerType?: string;\n signerPubkey?: string;\n signerConfig?: { email?: string; phone?: string; credentialId?: string };\n deviceIdentities?: unknown[];\n credentialId?: string;\n authId?: string;\n signerCategory?: \"onchain\" | \"authenticationsigner\";\n [key: string]: unknown;\n}\n\nexport async function loadSigners(walletId: string): Promise<SignerData[]> {\n if (!walletId) return [];\n try {\n let signersResult = (await getSigners(walletId)) as unknown;\n let onChainSigners = extractOnChainSigners<Record<string, unknown>>(signersResult);\n let authSigners = extractAuthenticationSigners<Record<string, unknown>>(signersResult);\n if (\n (!onChainSigners || !Array.isArray(onChainSigners) || onChainSigners.length === 0) &&\n (!authSigners || !Array.isArray(authSigners) || authSigners.length === 0)\n ) {\n const response = await listSigners(walletId);\n onChainSigners = extractOnChainSigners<Record<string, unknown>>(response);\n authSigners = extractAuthenticationSigners<Record<string, unknown>>(response);\n }\n const processedOnChain = onChainSigners\n .filter((s) => s && typeof s === \"object\")\n .map((signer) => processSigner(signer, \"onchain\"));\n const processedAuth = authSigners\n .filter((s) => s && typeof s === \"object\")\n .map((signer) => processSigner(signer, \"authenticationsigner\"));\n return [...processedOnChain, ...processedAuth].filter((s) => s.id && (s.type || s.signerType));\n } catch (error) {\n console.error(\"Failed to load signers:\", error);\n return [];\n }\n}\n\n/**\n * Normalize a raw signer DTO to SignerData (id, signerId, signerPubkey/publicKey, etc.).\n * Use at API boundaries when ingesting signer data from the SDK.\n */\nexport function normalizeSigner(\n signer: Record<string, unknown>,\n category: \"onchain\" | \"authenticationsigner\"\n): SignerData {\n return processSigner(signer, category);\n}\n\nfunction processSigner(signer: Record<string, unknown>, category: \"onchain\" | \"authenticationsigner\"): SignerData {\n const parsed = parseSignerResponse(signer);\n const signerId = (signer.id ?? signer.signerId ?? parsed.signerId) as string;\n const signerType = (signer.signerType ?? signer.type ?? parsed.type) as string;\n const signerPubkey = (signer.signerPubkey ?? signer.publicKey ?? parsed.publicKey ?? \"\") as string;\n const authId = (signer.authId ?? parsed.email ?? parsed.phone) as string | undefined;\n const walletId = (signer.walletId ?? parsed.walletId) as string | undefined;\n let email = (signer.email ?? parsed.email) as string | undefined;\n let phone = (signer.phone ?? parsed.phone) as string | undefined;\n if (!email && !phone && authId) {\n if (signerType === \"email\") email = authId;\n else if (signerType === \"phone\") phone = authId;\n }\n const signerConfig = signer.signerConfig as { email?: string; phone?: string } | undefined;\n if (signerConfig) {\n if (!email && signerConfig.email) email = signerConfig.email;\n if (!phone && signerConfig.phone) phone = signerConfig.phone;\n }\n const isActive =\n signer.isActive !== undefined ? (signer.isActive as boolean) : (parsed.isActive !== undefined ? parsed.isActive : true);\n return {\n ...signer,\n id: signerId,\n signerId,\n walletId: walletId ?? \"\",\n type: signerType,\n signerType,\n publicKey: signerPubkey,\n signerPubkey,\n email,\n phone,\n isActive,\n credentialId: (signer.credentialId ?? (signerType === \"passkey\" ? authId : undefined)) as string | undefined,\n authId,\n deviceIdentities: signer.deviceIdentities as unknown[] | undefined,\n signerConfig: signer.signerConfig as SignerData[\"signerConfig\"],\n permissions: signer.permissions,\n signerCategory: category,\n } as SignerData;\n}\n\nexport function getSignerType(signer: SignerData): string {\n return signer.type || signer.signerType || \"\";\n}\n\nexport function getSignerTypeLabel(type?: string): string {\n if (!type) return \"Unknown\";\n const t = type.toLowerCase();\n if (t === \"email\") return \"Email\";\n if (t === \"phone\") return \"Phone\";\n if (t === \"external\" || t === \"external-wallet\") return \"External Wallet\";\n if (t === \"passkey\") return \"Passkey\";\n if (t === \"api-key\" || t === \"apikey\") return \"API Key\";\n return type;\n}\n\nexport function getSignerDisplayName(signer: SignerData): string {\n const signerType = getSignerType(signer);\n const typeLabel = getSignerTypeLabel(signerType);\n const shortId = signer.id.length > 8 ? `${signer.id.slice(0, 4)}...${signer.id.slice(-4)}` : signer.id;\n if (signer.email) return `${typeLabel}: ${signer.email}`;\n if (signer.phone) return `${typeLabel}: ${signer.phone}`;\n if (signerType === \"passkey\") {\n const credId =\n (signer.credentialId as string | undefined) ??\n (signer.authId as string | undefined) ??\n (signer.signerConfig as { credentialId?: string } | undefined)?.credentialId;\n if (credId) {\n const shortCredId = credId.length > 12 ? `${credId.slice(0, 6)}...${credId.slice(-6)}` : credId;\n return `${typeLabel} (${shortCredId})`;\n }\n return `${typeLabel} (${shortId})`;\n }\n return `${typeLabel} (${shortId})`;\n}\n\nexport function getSignerUniqueId(signer: SignerData): string {\n if (signer.id) return signer.id.length > 12 ? `${signer.id.slice(0, 6)}...${signer.id.slice(-6)}` : signer.id;\n if (signer.publicKey) return `${signer.publicKey.slice(0, 6)}...${signer.publicKey.slice(-6)}`;\n return \"Unknown\";\n}\n\nexport function validateSignerActive(signer: SignerData, signerType: string): void {\n if (!signer.isActive) {\n throw new Error(`${signerType} signer is not active. Please activate the signer first.`);\n }\n}\n\nexport function extractSignerInfo(signer: SignerData): { signerId: string; signerType: string } {\n const signerType = signer.type || signer.signerType;\n const signerId = signer.id || signer.signerId;\n if (!signerType) throw new Error(`Signer type is missing. Signer data: ${JSON.stringify(signer)}`);\n if (!signerId) throw new Error(`Signer ID is missing. Signer data: ${JSON.stringify(signer)}`);\n return { signerId, signerType };\n}\n","import type { Transaction } from \"@solana/web3.js\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport {\n createEmailSignerHelper as createEmailSignerSDK,\n createPhoneSignerHelper as createPhoneSignerSDK,\n isValidEmail,\n isValidPhone,\n type SignerInfo,\n authenticateWithPasskey,\n findExistingPasskeySigner,\n formatAuthenticationResponse,\n isWebAuthnSupported,\n registerPasskeyComplete,\n signWithPasskeySigner,\n} from \"cilantro-sdk/helpers\";\nimport {\n sendRawPasskeyTransaction,\n type TransactionControllerSendRawPasskeyTransactionResult,\n} from \"cilantro-sdk/transactions\";\nimport { createExternalWalletSigner, startPasskeyAuthentication } from \"cilantro-sdk/wallet\";\nimport type { WalletControllerStartPasskeyAuthenticationResult } from \"cilantro-sdk/wallet\";\nimport { getStorageAdapter } from \"./storage-adapter\";\nimport { loadSigners } from \"./signer-helpers\";\nimport { extractResponseData } from \"./types\";\n\ntype PasskeyTransactionDataDto = TransactionControllerSendRawPasskeyTransactionResult[\"data\"];\n\nexport async function createEmailSignerHelper(walletId: string, email: string): Promise<SignerInfo> {\n const trimmedEmail = email.trim();\n if (!trimmedEmail) throw new Error(\"Email address is required\");\n if (!isValidEmail(trimmedEmail)) throw new Error(\"Invalid email address format\");\n const deviceKeyManager = getStorageAdapter();\n return await createEmailSignerSDK(walletId, { email: trimmedEmail, deviceKeyManager });\n}\n\nexport async function createPhoneSignerHelper(walletId: string, phone: string): Promise<SignerInfo> {\n const trimmedPhone = phone.trim();\n if (!trimmedPhone) throw new Error(\"Phone number is required\");\n if (!isValidPhone(trimmedPhone)) throw new Error(\"Invalid phone number format\");\n const deviceKeyManager = getStorageAdapter();\n return await createPhoneSignerSDK(walletId, { phone: trimmedPhone, deviceKeyManager });\n}\n\nexport async function createExternalSignerHelper(walletId: string, address: string): Promise<unknown> {\n if (!address.trim()) throw new Error(\"Wallet address is required\");\n return await createExternalWalletSigner(walletId, { address: address.trim(), chain: \"solana\" });\n}\n\nexport async function registerPasskeySigner(walletId: string): Promise<{\n signerId: string;\n isNew: boolean;\n credentialId?: string;\n}> {\n if (!isWebAuthnSupported()) throw new Error(\"WebAuthn is not supported in this browser\");\n return await registerPasskeyComplete(walletId);\n}\n\nexport async function checkExistingPasskey(\n walletId: string,\n credentialId?: string\n): Promise<{ signerId: string; credentialId?: string } | null> {\n return await findExistingPasskeySigner(walletId, credentialId);\n}\n\nexport async function signWithPasskey(\n walletId: string,\n signerId: string,\n message: string,\n options?: { useBrowserAutofill?: boolean }\n): Promise<{ signature: string; signer: string }> {\n if (!isWebAuthnSupported()) throw new Error(\"WebAuthn is not supported in this browser\");\n const messageBytes = new TextEncoder().encode(message);\n const signature = await signWithPasskeySigner(walletId, signerId, messageBytes, options);\n return {\n signature: Buffer.from(signature).toString(\"hex\"),\n signer: signerId,\n };\n}\n\nexport async function signAndSendPasskeyTransaction(\n walletId: string,\n signerId: string,\n transaction: Transaction,\n options?: { credentialId?: string; useBrowserAutofill?: boolean; mintAddress?: string }\n): Promise<{ signature: string; status?: string }> {\n if (!isWebAuthnSupported()) throw new Error(\"WebAuthn is not supported in this browser\");\n let credentialId = options?.credentialId;\n if (!credentialId) {\n const signers = await loadSigners(walletId);\n const passkeySigner = signers.find((s) => s.id === signerId || s.signerId === signerId);\n if (!passkeySigner) {\n throw new Error(\n `Passkey signer ${signerId} not found in wallet. Available signers: ${signers.map((s) => `${s.id} (${s.type})`).join(\", \")}`\n );\n }\n credentialId =\n passkeySigner.credentialId ??\n (passkeySigner.signerConfig as { credentialId?: string } | undefined)?.credentialId ??\n (passkeySigner.authId as string | undefined);\n if (!credentialId) {\n throw new Error(`Credential ID not found for passkey signer ${signerId}.`);\n }\n }\n let mintAddress: string | undefined = options?.mintAddress;\n if (!mintAddress && transaction.instructions.length > 0) {\n const systemProgramId = new PublicKey(\"11111111111111111111111111111111\");\n const feePayer = transaction.feePayer || systemProgramId;\n transaction.instructions.forEach((ix) => {\n ix.keys.forEach((key) => {\n if (key.isWritable && key.isSigner && !key.pubkey.equals(feePayer) && !mintAddress) {\n mintAddress = key.pubkey.toString();\n }\n });\n });\n }\n const unsignedTransaction = transaction.serialize({ verifySignatures: false }).toString(\"base64\");\n const authOptions: WalletControllerStartPasskeyAuthenticationResult = await startPasskeyAuthentication(\n walletId,\n { credentialId: options?.credentialId }\n );\n const authData = extractResponseData<WalletControllerStartPasskeyAuthenticationResult[\"data\"]>(authOptions);\n if (!authData) throw new Error(\"Failed to get authentication options\");\n const authDataValue =\n authData && typeof authData === \"object\" && \"data\" in authData\n ? (authData as { data: unknown }).data\n : authData;\n const credential = await authenticateWithPasskey(\n authDataValue as Parameters<typeof authenticateWithPasskey>[0],\n { useBrowserAutofill: options?.useBrowserAutofill ?? false }\n );\n const formattedCredential = formatAuthenticationResponse(credential);\n const dto = {\n walletId,\n credentialId,\n unsignedTransaction,\n signature: formattedCredential.response.signature,\n authenticatorData: formattedCredential.response.authenticatorData,\n clientDataJSON: formattedCredential.response.clientDataJSON,\n };\n const result: TransactionControllerSendRawPasskeyTransactionResult = await sendRawPasskeyTransaction(dto);\n const resultData = extractResponseData<PasskeyTransactionDataDto>(result);\n return {\n signature: resultData?.signature ?? \"\",\n status: resultData?.status,\n };\n}\n","\"use client\";\n\nimport { useState, useCallback } from \"react\";\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport { isWebAuthnSupported } from \"cilantro-sdk/helpers\";\nimport { registerPasskeySigner } from \"../core/signer-creation\";\nimport { startPasskeyAuthentication } from \"cilantro-sdk/wallet\";\nimport { extractResponseData } from \"../core/types\";\nimport { authenticateWithPasskey, formatAuthenticationResponse } from \"cilantro-sdk/helpers\";\n\nexport interface UsePasskeyResult {\n isSupported: boolean;\n register: () => Promise<{ signerId: string; isNew: boolean; credentialId?: string }>;\n authenticate: (signerId?: string) => Promise<{ signature: string; signerId: string }>;\n isLoading: boolean;\n}\n\nexport function usePasskey(walletId: string | undefined): UsePasskeyResult {\n const { jwt } = useCilantroContext();\n const [isLoading, setIsLoading] = useState(false);\n const isSupported = typeof window !== \"undefined\" && isWebAuthnSupported();\n\n const register = useCallback(async () => {\n if (!walletId) throw new Error(\"walletId is required\");\n if (!isSupported) throw new Error(\"WebAuthn is not supported in this browser\");\n setIsLoading(true);\n try {\n const result = await registerPasskeySigner(walletId);\n return result;\n } finally {\n setIsLoading(false);\n }\n }, [walletId, isSupported]);\n\n const authenticate = useCallback(\n async (signerId?: string) => {\n if (!walletId) throw new Error(\"walletId is required\");\n if (!isSupported) throw new Error(\"WebAuthn is not supported in this browser\");\n setIsLoading(true);\n try {\n const authOptions = await startPasskeyAuthentication(walletId, {\n credentialId: undefined,\n });\n const authData = extractResponseData(authOptions);\n const authDataValue =\n authData && typeof authData === \"object\" && \"data\" in authData\n ? (authData as { data: unknown }).data\n : authData;\n const credential = await authenticateWithPasskey(\n authDataValue as Parameters<typeof authenticateWithPasskey>[0],\n { useBrowserAutofill: false }\n );\n const formatted = formatAuthenticationResponse(credential);\n return {\n signature: Buffer.from(formatted.response.signature).toString(\"hex\"),\n signerId: signerId ?? \"\",\n };\n } finally {\n setIsLoading(false);\n }\n },\n [walletId, isSupported]\n );\n\n return { isSupported, register, authenticate, isLoading };\n}\n","\"use client\";\n\nimport { useState, useCallback, useEffect } from \"react\";\n\n/** Minimal Solana wallet interface (Phantom, Solflare, etc.) */\nexport interface SolanaWallet {\n name: string;\n publicKey: { toString: () => string } | null;\n connect: () => Promise<{ publicKey: { toString: () => string } }>;\n disconnect: () => Promise<void>;\n}\n\ndeclare global {\n interface Window {\n solana?: SolanaWallet & { isPhantom?: boolean };\n solflare?: SolanaWallet;\n }\n}\n\nfunction getDetectedWallets(): SolanaWallet[] {\n if (typeof window === \"undefined\") return [];\n const list: SolanaWallet[] = [];\n if (window.solana?.connect) {\n list.push({\n name: \"Phantom\",\n publicKey: window.solana.publicKey ?? null,\n connect: window.solana.connect.bind(window.solana),\n disconnect: window.solana.disconnect?.bind(window.solana) ?? (() => Promise.resolve()),\n });\n }\n if (window.solflare?.connect && !list.some((w) => w.name === \"Solflare\")) {\n list.push({\n name: \"Solflare\",\n publicKey: window.solflare.publicKey ?? null,\n connect: window.solflare.connect.bind(window.solflare),\n disconnect: window.solflare.disconnect?.bind(window.solflare) ?? (() => Promise.resolve()),\n });\n }\n return list;\n}\n\nexport interface UseExternalWalletResult {\n wallets: SolanaWallet[];\n connectedWallet: SolanaWallet | null;\n connect: (wallet: SolanaWallet) => Promise<string>;\n disconnect: () => Promise<void>;\n}\n\nexport function useExternalWallet(): UseExternalWalletResult {\n const [wallets, setWallets] = useState<SolanaWallet[]>([]);\n const [connectedWallet, setConnectedWallet] = useState<SolanaWallet | null>(null);\n\n useEffect(() => {\n setWallets(getDetectedWallets());\n }, []);\n\n const connect = useCallback(async (wallet: SolanaWallet) => {\n const res = await wallet.connect();\n const publicKey = res.publicKey.toString();\n setConnectedWallet(wallet);\n return publicKey;\n }, []);\n\n const disconnect = useCallback(async () => {\n if (connectedWallet?.disconnect) {\n await connectedWallet.disconnect();\n }\n setConnectedWallet(null);\n }, [connectedWallet]);\n\n return { wallets, connectedWallet, connect, disconnect };\n}\n","\"use client\";\n\nimport { useState, useCallback } from \"react\";\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport { setSdkAuth } from \"../core/auth\";\nimport { sendSOL as sendSOLApi, sendSPL as sendSPLApi } from \"cilantro-sdk/wallet\";\nimport { extractResponseData } from \"../core/types\";\nimport { extractErrorMessage } from \"../core/error-utils\";\n\nexport type SignerType = \"email\" | \"phone\" | \"passkey\" | \"external\";\n\nexport interface SubmitTransactionResult {\n success: boolean;\n data: { signature?: string; [key: string]: unknown };\n}\n\nexport interface UseSendTransactionResult {\n sendSOL: (params: {\n recipientAddress: string;\n amountLamports: number;\n }) => Promise<SubmitTransactionResult>;\n sendSPL: (params: {\n mintAddress: string;\n recipientAddress: string;\n amount: number;\n }) => Promise<SubmitTransactionResult>;\n isPending: boolean;\n error: string | null;\n}\n\nexport function useSendTransaction(\n walletId: string | undefined,\n _signerId?: string,\n _signerType?: SignerType\n): UseSendTransactionResult {\n const { jwt } = useCilantroContext();\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const sendSOL = useCallback(\n async (params: { recipientAddress: string; amountLamports: number }) => {\n if (!walletId) throw new Error(\"walletId is required\");\n setError(null);\n setIsPending(true);\n try {\n if (jwt) setSdkAuth(jwt);\n const result = await sendSOLApi(walletId, {\n recipientAddress: params.recipientAddress,\n amountLamports: params.amountLamports,\n });\n const data = extractResponseData<{ transactionHash?: string }>(result);\n const signature = data?.transactionHash ?? (data as { signature?: string })?.signature;\n return {\n success: true,\n data: { signature, ...data },\n } as SubmitTransactionResult;\n } catch (err) {\n const msg = extractErrorMessage(err);\n setError(msg);\n throw new Error(msg);\n } finally {\n setIsPending(false);\n }\n },\n [walletId, jwt]\n );\n\n const sendSPL = useCallback(\n async (params: {\n mintAddress: string;\n recipientAddress: string;\n amount: number;\n }) => {\n if (!walletId) throw new Error(\"walletId is required\");\n setError(null);\n setIsPending(true);\n try {\n if (jwt) setSdkAuth(jwt);\n const result = await sendSPLApi(walletId, {\n mintAddress: params.mintAddress,\n recipientAddress: params.recipientAddress,\n amount: params.amount,\n });\n const data = extractResponseData<{ transactionHash?: string }>(result);\n const signature = data?.transactionHash ?? (data as { signature?: string })?.signature;\n return {\n success: true,\n data: { signature, ...data },\n } as SubmitTransactionResult;\n } catch (err) {\n const msg = extractErrorMessage(err);\n setError(msg);\n throw new Error(msg);\n } finally {\n setIsPending(false);\n }\n },\n [walletId, jwt]\n );\n\n return { sendSOL, sendSPL, isPending, error };\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useCilantroAuth } from \"../../providers/CilantroAuthProvider\";\nimport { useReturnUrl } from \"../../hooks/useReturnUrl\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"../../ui/card\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface LoginFormClassNames {\n root?: string;\n header?: string;\n title?: string;\n description?: string;\n form?: string;\n label?: string;\n input?: string;\n submitButton?: string;\n error?: string;\n}\n\nexport interface LoginFormProps {\n className?: string;\n classNames?: LoginFormClassNames;\n style?: React.CSSProperties;\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n /** Redirect to this path after successful login. If not set, reads from URL ?returnUrl= (when returnUrlParam provided). */\n redirectAfterSuccess?: string;\n /** Custom redirect function for SPA routers. e.g. (path) => router.replace(path) */\n onRedirect?: (path: string) => void;\n /** Query param to read returnUrl from URL. Default: \"returnUrl\". Used when redirectAfterSuccess not set. */\n returnUrlParam?: string;\n rememberMe?: boolean;\n /** Override submit button label */\n submitLabel?: string;\n /** Override title */\n title?: string;\n /** Override description */\n description?: string;\n /** Render \"Create account\" link (e.g. to switch to register). Shown below submit. */\n renderSwitchToRegister?: () => React.ReactNode;\n}\n\nexport function LoginForm({\n className,\n classNames,\n style,\n onSuccess,\n onError,\n redirectAfterSuccess,\n onRedirect,\n returnUrlParam = \"returnUrl\",\n submitLabel = \"Sign in\",\n title = \"Sign in\",\n description,\n renderSwitchToRegister,\n}: LoginFormProps) {\n const { login, isLoading } = useCilantroAuth();\n const { returnPath } = useReturnUrl({ param: returnUrlParam, defaultPath: \"/\" });\n const [usernameOrEmail, setUsernameOrEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n\n const pathToRedirect = redirectAfterSuccess ?? returnPath;\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n try {\n await login(usernameOrEmail.trim(), password);\n onSuccess?.();\n if (pathToRedirect) {\n if (onRedirect) {\n onRedirect(pathToRedirect);\n } else if (typeof window !== \"undefined\") {\n window.location.href = pathToRedirect;\n }\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n };\n\n return (\n <Card className={cn(className, classNames?.root)} style={style} data-cilantro-login-form>\n <CardHeader className={classNames?.header}>\n <CardTitle className={classNames?.title}>{title}</CardTitle>\n {description != null && (\n <CardDescription className={classNames?.description}>{description}</CardDescription>\n )}\n </CardHeader>\n <CardContent>\n <form onSubmit={handleSubmit} className={cn(\"space-y-4\", classNames?.form)}>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-login-username\" className={classNames?.label}>\n Username or email\n </Label>\n <Input\n id=\"cilantro-login-username\"\n type=\"text\"\n autoComplete=\"username\"\n className={classNames?.input}\n value={usernameOrEmail}\n onChange={(e) => setUsernameOrEmail(e.target.value)}\n placeholder=\"Username or email\"\n required\n disabled={isLoading}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-login-password\" className={classNames?.label}>\n Password\n </Label>\n <Input\n id=\"cilantro-login-password\"\n type=\"password\"\n autoComplete=\"current-password\"\n className={classNames?.input}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Password\"\n required\n disabled={isLoading}\n />\n </div>\n {error && (\n <div\n className={cn(\n \"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\",\n classNames?.error\n )}\n role=\"alert\"\n >\n {error}\n </div>\n )}\n <Button\n type=\"submit\"\n size=\"touch\"\n className={cn(\"w-full\", classNames?.submitButton)}\n disabled={isLoading || !usernameOrEmail.trim() || !password}\n >\n {isLoading ? \"Signing in...\" : submitLabel}\n </Button>\n {renderSwitchToRegister && (\n <div className=\"text-center text-sm text-muted-foreground\">{renderSwitchToRegister()}</div>\n )}\n </form>\n </CardContent>\n </Card>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"./cn\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive: \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline: \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary: \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n touch: \"h-12 min-h-[44px] min-w-[44px] rounded-md px-4\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />;\n }\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"./cn\";\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n ref={ref}\n {...props}\n />\n );\n }\n);\nInput.displayName = \"Input\";\n\nexport { Input };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"./cn\";\n\nconst labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n);\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root ref={ref} className={cn(labelVariants(), className)} {...props} />\n));\nLabel.displayName = LabelPrimitive.Root.displayName;\n\nexport { Label };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"./cn\";\n\nconst Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"rounded-xl border bg-card text-card-foreground shadow\", className)}\n {...props}\n />\n )\n);\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"flex flex-col space-y-1.5 p-6\", className)} {...props} />\n )\n);\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLHeadingElement>>(\n ({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\"font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n )\n);\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p ref={ref} className={cn(\"text-sm text-muted-foreground\", className)} {...props} />\n));\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n )\n);\nCardContent.displayName = \"CardContent\";\n\nconst CardFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"flex items-center p-6 pt-0\", className)} {...props} />\n )\n);\nCardFooter.displayName = \"CardFooter\";\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useAuth } from \"../../hooks/useAuth\";\nimport { useReturnUrl } from \"../../hooks/useReturnUrl\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"../../ui/card\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface RegisterFormClassNames {\n root?: string;\n header?: string;\n title?: string;\n description?: string;\n form?: string;\n label?: string;\n input?: string;\n submitButton?: string;\n error?: string;\n}\n\nexport interface RegisterFormProps {\n className?: string;\n classNames?: RegisterFormClassNames;\n style?: React.CSSProperties;\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n /** Redirect to this path after successful registration. If not set, reads from URL ?returnUrl= */\n redirectAfterSuccess?: string;\n /** Custom redirect function for SPA routers */\n onRedirect?: (path: string) => void;\n /** Query param to read returnUrl from URL. Default: \"returnUrl\" */\n returnUrlParam?: string;\n /** Override submit button label */\n submitLabel?: string;\n /** Override title */\n title?: string;\n /** Override description */\n description?: string;\n /** Render \"Already have an account?\" link to switch to login */\n renderSwitchToLogin?: () => React.ReactNode;\n}\n\nexport function RegisterForm({\n className,\n classNames,\n style,\n onSuccess,\n onError,\n redirectAfterSuccess,\n onRedirect,\n returnUrlParam = \"returnUrl\",\n submitLabel = \"Create account\",\n title = \"Create account\",\n description,\n renderSwitchToLogin,\n}: RegisterFormProps) {\n const { register, isLoading } = useAuth();\n const { returnPath } = useReturnUrl({ param: returnUrlParam, defaultPath: \"/\" });\n const [username, setUsername] = useState(\"\");\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n\n const pathToRedirect = redirectAfterSuccess ?? returnPath;\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n try {\n await register(username.trim(), email.trim(), password);\n onSuccess?.();\n if (pathToRedirect) {\n if (onRedirect) {\n onRedirect(pathToRedirect);\n } else if (typeof window !== \"undefined\") {\n window.location.href = pathToRedirect;\n }\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n };\n\n return (\n <Card className={cn(className, classNames?.root)} style={style} data-cilantro-register-form>\n <CardHeader className={classNames?.header}>\n <CardTitle className={classNames?.title}>{title}</CardTitle>\n {description != null && (\n <CardDescription className={classNames?.description}>{description}</CardDescription>\n )}\n </CardHeader>\n <CardContent>\n <form onSubmit={handleSubmit} className={cn(\"space-y-4\", classNames?.form)}>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-register-username\" className={classNames?.label}>\n Username\n </Label>\n <Input\n id=\"cilantro-register-username\"\n type=\"text\"\n autoComplete=\"username\"\n className={classNames?.input}\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n placeholder=\"Username\"\n required\n disabled={isLoading}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-register-email\" className={classNames?.label}>\n Email\n </Label>\n <Input\n id=\"cilantro-register-email\"\n type=\"email\"\n autoComplete=\"email\"\n className={classNames?.input}\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"Email\"\n required\n disabled={isLoading}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-register-password\" className={classNames?.label}>\n Password\n </Label>\n <Input\n id=\"cilantro-register-password\"\n type=\"password\"\n autoComplete=\"new-password\"\n className={classNames?.input}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Password\"\n required\n disabled={isLoading}\n />\n </div>\n {error && (\n <div\n className={cn(\n \"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\",\n classNames?.error\n )}\n role=\"alert\"\n >\n {error}\n </div>\n )}\n <Button\n type=\"submit\"\n size=\"touch\"\n className={cn(\"w-full\", classNames?.submitButton)}\n disabled={isLoading || !username.trim() || !email.trim() || !password}\n >\n {isLoading ? \"Creating account...\" : submitLabel}\n </Button>\n {renderSwitchToLogin && (\n <div className=\"text-center text-sm text-muted-foreground\">{renderSwitchToLogin()}</div>\n )}\n </form>\n </CardContent>\n </Card>\n );\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { useAuth } from \"../../hooks/useAuth\";\nimport { Button } from \"../../ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../../ui/dialog\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface LogoutButtonProps {\n onLogout?: () => void;\n /** Redirect to this path after logout (e.g. \"/login\") */\n redirectAfterLogout?: string;\n /** Custom redirect for SPA routers. e.g. (path) => router.replace(path) */\n onRedirect?: (path: string) => void;\n confirmBeforeLogout?: boolean;\n className?: string;\n children?: ReactNode;\n}\n\nexport function LogoutButton({\n onLogout,\n redirectAfterLogout,\n onRedirect,\n confirmBeforeLogout = false,\n className,\n children,\n}: LogoutButtonProps) {\n const { logout } = useAuth();\n const [confirmOpen, setConfirmOpen] = useState(false);\n\n const handleLogout = () => {\n logout();\n setConfirmOpen(false);\n onLogout?.();\n if (redirectAfterLogout) {\n if (onRedirect) {\n onRedirect(redirectAfterLogout);\n } else if (typeof window !== \"undefined\") {\n window.location.href = redirectAfterLogout;\n }\n }\n };\n\n const handleClick = () => {\n if (confirmBeforeLogout) {\n setConfirmOpen(true);\n } else {\n handleLogout();\n }\n };\n\n return (\n <>\n <Button\n type=\"button\"\n variant=\"outline\"\n className={cn(className)}\n onClick={handleClick}\n data-cilantro-logout-button\n >\n {children ?? \"Log out\"}\n </Button>\n {confirmBeforeLogout && (\n <Dialog open={confirmOpen} onOpenChange={setConfirmOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Log out?</DialogTitle>\n <DialogDescription>Are you sure you want to log out?</DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setConfirmOpen(false)}>\n Cancel\n </Button>\n <Button variant=\"destructive\" onClick={handleLogout}>\n Log out\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )}\n </>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { cn } from \"./cn\";\n\nconst Dialog = DialogPrimitive.Root;\nconst DialogTrigger = DialogPrimitive.Trigger;\nconst DialogPortal = DialogPrimitive.Portal;\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg max-h-[100dvh] sm:max-h-[90vh] translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 overflow-y-auto data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n className\n )}\n {...props}\n >\n {children}\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"flex flex-col space-y-1.5 text-center sm:text-left\", className)} {...props} />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\", className)}\n {...props}\n />\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n","\"use client\";\n\nimport { useMemo, type ReactNode } from \"react\";\nimport { useCilantroAuth } from \"../../providers/CilantroAuthProvider\";\nimport { LoginForm } from \"./LoginForm\";\nimport { Skeleton } from \"../../ui/skeleton\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface AuthGuardClassNames {\n root?: string;\n fallback?: string;\n skeleton?: string;\n loading?: string;\n /** Centered/fullscreen layout wrapper */\n layout?: string;\n}\n\nexport type AuthGuardLayout = \"inline\" | \"centered\" | \"fullscreen\";\n\nexport interface AuthGuardProps {\n children: ReactNode;\n /** Shown when not authenticated. Default: <LoginForm /> */\n fallback?: ReactNode;\n /** Redirect unauthenticated users to this path (e.g. \"/login\"). Uses onRedirect if provided, else window.location. */\n redirectTo?: string;\n /** Custom redirect function for SPA routers (Next.js, React Router). e.g. (path) => router.replace(path) */\n onRedirect?: (path: string) => void;\n /** Query param for return URL when redirecting. Default: \"returnUrl\" */\n returnUrlParam?: string;\n /** Layout for fallback content. \"centered\" and \"fullscreen\" give polished auth UX. */\n layout?: AuthGuardLayout;\n /** Root class when showing fallback */\n className?: string;\n classNames?: AuthGuardClassNames;\n /** When true, show fallback (login) instead of redirecting. When false, redirect when redirectTo is set, else render null. */\n showFallback?: boolean;\n /** When true, show skeleton while loading. When false, show \"Loading...\" text. */\n useSkeleton?: boolean;\n}\n\nconst LAYOUT_CLASSES: Record<AuthGuardLayout, string> = {\n inline: \"\",\n centered: \"flex min-h-[280px] items-center justify-center p-6\",\n fullscreen: \"fixed inset-0 z-50 flex min-h-screen items-center justify-center bg-background p-4\",\n};\n\nfunction getCurrentReturnPath(returnUrlParam: string): string {\n if (typeof window === \"undefined\") return \"/\";\n const params = new URLSearchParams(window.location.search);\n const existing = params.get(returnUrlParam);\n if (existing && existing.startsWith(\"/\")) return existing;\n const path = window.location.pathname + window.location.search;\n return path || \"/\";\n}\n\n/**\n * Wraps content and shows fallback (e.g. LoginForm) when the user is not authenticated.\n * Use inside CilantroProvider.\n *\n * For Next.js: pass onRedirect={(path) => router.replace(path)} and redirectTo=\"/login\".\n * For return-after-login flow: set redirectTo=\"/login\"; AuthGuard will redirect with ?returnUrl=currentPath.\n */\nexport function AuthGuard({\n children,\n fallback,\n redirectTo,\n onRedirect,\n returnUrlParam = \"returnUrl\",\n layout = \"inline\",\n className,\n classNames,\n showFallback = true,\n useSkeleton = false,\n}: AuthGuardProps) {\n const { isAuthenticated, isLoading } = useCilantroAuth();\n\n const redirectPath = useMemo(() => {\n if (!redirectTo) return null;\n const returnPath = getCurrentReturnPath(returnUrlParam);\n const sep = redirectTo.includes(\"?\") ? \"&\" : \"?\";\n return `${redirectTo}${sep}${returnUrlParam}=${encodeURIComponent(returnPath)}`;\n }, [redirectTo, returnUrlParam]);\n\n if (isLoading) {\n const loadingContent = useSkeleton ? (\n <div className={cn(\"rounded-lg border border-input p-6 space-y-4 w-full max-w-sm\", classNames?.fallback)}>\n <Skeleton className={cn(\"h-7 w-2/3 rounded\", classNames?.skeleton)} />\n <Skeleton className={cn(\"h-4 w-full rounded\", classNames?.skeleton)} />\n <Skeleton className={cn(\"h-10 w-full rounded\", classNames?.skeleton)} />\n <Skeleton className={cn(\"h-10 w-full rounded\", classNames?.skeleton)} />\n </div>\n ) : (\n <div className=\"flex flex-col items-center gap-3\">\n <div\n className=\"h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent\"\n aria-hidden\n />\n <p className=\"text-sm text-muted-foreground\">Loading...</p>\n </div>\n );\n\n return (\n <div\n className={cn(\n LAYOUT_CLASSES[layout],\n className,\n classNames?.root,\n classNames?.loading\n )}\n data-cilantro-auth-guard\n aria-busy=\"true\"\n aria-live=\"polite\"\n >\n <div className={cn(layout !== \"inline\" && \"w-full max-w-sm\", classNames?.layout)}>\n {loadingContent}\n </div>\n </div>\n );\n }\n\n if (!isAuthenticated) {\n if (!showFallback && redirectPath) {\n if (onRedirect) {\n onRedirect(redirectPath);\n } else if (typeof window !== \"undefined\") {\n window.location.href = redirectPath;\n }\n return null;\n }\n if (!showFallback) return null;\n\n // Redirect mode: send user to login page with returnUrl\n if (redirectPath) {\n if (onRedirect) {\n onRedirect(redirectPath);\n } else if (typeof window !== \"undefined\") {\n window.location.href = redirectPath;\n }\n return null;\n }\n\n // Show fallback (login form) - pass returnPath for post-login redirect\n const returnPath = getCurrentReturnPath(returnUrlParam);\n const fallbackContent =\n fallback ??\n (\n <LoginForm\n className={classNames?.fallback}\n redirectAfterSuccess={returnPath}\n returnUrlParam={returnUrlParam}\n onRedirect={onRedirect}\n />\n );\n\n return (\n <div\n className={cn(\n LAYOUT_CLASSES[layout],\n className,\n classNames?.root\n )}\n data-cilantro-auth-guard\n >\n <div className={cn(layout !== \"inline\" && \"w-full max-w-sm\", classNames?.layout)}>\n {fallbackContent}\n </div>\n </div>\n );\n }\n\n return <>{children}</>;\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"./cn\";\n\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"rounded-md bg-muted animate-pulse\", className)}\n {...props}\n />\n )\n);\nSkeleton.displayName = \"Skeleton\";\n\nexport { Skeleton };\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface AuthShellClassNames {\n root?: string;\n inner?: string;\n logo?: string;\n}\n\nexport interface AuthShellProps {\n children: ReactNode;\n /** Optional logo/brand (e.g. <img> or <Logo />) */\n logo?: ReactNode;\n /** Max width of the auth card area. Default: \"sm\" (24rem) */\n maxWidth?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n classNames?: AuthShellClassNames;\n}\n\nconst MAX_WIDTH_CLASSES = {\n sm: \"max-w-sm\",\n md: \"max-w-md\",\n lg: \"max-w-lg\",\n};\n\n/**\n * Full-page centered layout for auth screens (login, register).\n * Provides a polished, accessible UX with consistent spacing and optional logo.\n *\n * @example\n * <AuthShell logo={<img src=\"/logo.svg\" alt=\"App\" />}>\n * <LoginForm />\n * </AuthShell>\n */\nexport function AuthShell({\n children,\n logo,\n maxWidth = \"sm\",\n className,\n classNames,\n}: AuthShellProps) {\n return (\n <div\n className={cn(\n \"flex min-h-screen flex-col items-center justify-center bg-background p-4 sm:p-6\",\n className,\n classNames?.root\n )}\n data-cilantro-auth-shell\n >\n <div\n className={cn(\n \"w-full space-y-6\",\n MAX_WIDTH_CLASSES[maxWidth],\n classNames?.inner\n )}\n >\n {logo && (\n <div\n className={cn(\"flex justify-center\", classNames?.logo)}\n data-cilantro-auth-shell-logo\n >\n {logo}\n </div>\n )}\n {children}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useSigners } from \"../../hooks/useSigners\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { cn } from \"../../ui/cn\";\nimport type { SignerInfo } from \"cilantro-sdk/helpers\";\n\nexport interface CreateEmailSignerFormProps {\n walletId: string;\n onCreated?: (signer: SignerInfo) => void;\n onError?: (error: Error) => void;\n className?: string;\n}\n\nexport function CreateEmailSignerForm({\n walletId,\n onCreated,\n onError,\n className,\n}: CreateEmailSignerFormProps) {\n const { createEmailSigner, isLoading } = useSigners(walletId);\n const [email, setEmail] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n try {\n const signer = await createEmailSigner({ email: email.trim() });\n setEmail(\"\");\n onCreated?.(signer);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className={cn(\"space-y-4\", className)} data-cilantro-create-email-signer>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-email-signer-email\">Email</Label>\n <Input\n id=\"cilantro-email-signer-email\"\n type=\"email\"\n autoComplete=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n disabled={isLoading}\n />\n </div>\n {error && (\n <div className=\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\" role=\"alert\">\n {error}\n </div>\n )}\n <Button type=\"submit\" disabled={isLoading || !email.trim()}>\n {isLoading ? \"Creating...\" : \"Create email signer\"}\n </Button>\n </form>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useSigners } from \"../../hooks/useSigners\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { cn } from \"../../ui/cn\";\nimport type { SignerInfo } from \"cilantro-sdk/helpers\";\n\nexport interface CreatePhoneSignerFormProps {\n walletId: string;\n onCreated?: (signer: SignerInfo) => void;\n onError?: (error: Error) => void;\n className?: string;\n}\n\nexport function CreatePhoneSignerForm({\n walletId,\n onCreated,\n onError,\n className,\n}: CreatePhoneSignerFormProps) {\n const { createPhoneSigner, isLoading } = useSigners(walletId);\n const [phone, setPhone] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n try {\n const signer = await createPhoneSigner({ phone: phone.trim() });\n setPhone(\"\");\n onCreated?.(signer);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className={cn(\"space-y-4\", className)} data-cilantro-create-phone-signer>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-phone-signer-phone\">Phone number</Label>\n <Input\n id=\"cilantro-phone-signer-phone\"\n type=\"tel\"\n autoComplete=\"tel\"\n value={phone}\n onChange={(e) => setPhone(e.target.value)}\n placeholder=\"+1234567890\"\n required\n disabled={isLoading}\n />\n </div>\n {error && (\n <div className=\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\" role=\"alert\">\n {error}\n </div>\n )}\n <Button type=\"submit\" disabled={isLoading || !phone.trim()}>\n {isLoading ? \"Creating...\" : \"Create phone signer\"}\n </Button>\n </form>\n );\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { usePasskey } from \"../../hooks/usePasskey\";\nimport { Button } from \"../../ui/button\";\nimport { cn } from \"../../ui/cn\";\nimport type { SignerInfo } from \"cilantro-sdk/helpers\";\n\nexport interface AddPasskeyButtonProps {\n walletId: string;\n onRegistered?: (signer: SignerInfo) => void;\n onError?: (error: Error) => void;\n className?: string;\n children?: ReactNode;\n}\n\nexport function AddPasskeyButton({\n walletId,\n onRegistered,\n onError,\n className,\n children,\n}: AddPasskeyButtonProps) {\n const { isSupported, register, isLoading } = usePasskey(walletId);\n const [error, setError] = useState<string | null>(null);\n\n const handleClick = async () => {\n setError(null);\n try {\n const result = await register();\n onRegistered?.(result as unknown as SignerInfo);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n };\n\n if (!isSupported) return null;\n\n return (\n <div className={cn(className)} data-cilantro-add-passkey>\n <Button type=\"button\" variant=\"outline\" onClick={handleClick} disabled={isLoading}>\n {children ?? \"Add Passkey\"}\n </Button>\n {error && (\n <p className=\"mt-2 text-sm text-destructive\" role=\"alert\">\n {error}\n </p>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useSigners } from \"../../hooks/useSigners\";\nimport { getSignerDisplayName, getSignerTypeLabel } from \"../../core/signer-helpers\";\nimport type { SignerData } from \"../../core/signer-helpers\";\nimport { Button } from \"../../ui/button\";\nimport { Skeleton } from \"../../ui/skeleton\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"../../ui/dialog\";\nimport { CreateEmailSignerForm } from \"./CreateEmailSignerForm\";\nimport { CreatePhoneSignerForm } from \"./CreatePhoneSignerForm\";\nimport { AddPasskeyButton } from \"./AddPasskeyButton\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface SignerListClassNames {\n root?: string;\n header?: string;\n list?: string;\n item?: string;\n addButton?: string;\n message?: string;\n skeleton?: string;\n loading?: string;\n}\n\nexport interface SignerListProps {\n walletId: string;\n onRevoke?: (signerId: string) => void;\n className?: string;\n classNames?: SignerListClassNames;\n onSignerAdded?: () => void;\n useSkeleton?: boolean;\n children?: (props: {\n signers: SignerData[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n openAddSigner: () => void;\n }) => React.ReactNode;\n}\n\nexport function SignerList({\n walletId,\n onRevoke,\n className,\n classNames,\n onSignerAdded,\n useSkeleton = true,\n children,\n}: SignerListProps) {\n const { signers, isLoading, error, refresh, revokeSigner } = useSigners(walletId);\n const [addSignerOpen, setAddSignerOpen] = useState(false);\n\n const handleAddSuccess = () => {\n refresh();\n setAddSignerOpen(false);\n onSignerAdded?.();\n };\n\n const handleRevoke = async (signerId: string) => {\n try {\n await revokeSigner(signerId);\n onRevoke?.(signerId);\n } catch {\n // error handled by hook/UI\n }\n };\n\n if (children) {\n return (\n <>\n {children({\n signers,\n isLoading,\n error,\n refresh,\n openAddSigner: () => setAddSignerOpen(true),\n })}\n <Dialog open={addSignerOpen} onOpenChange={setAddSignerOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Add signer</DialogTitle>\n </DialogHeader>\n <div className=\"space-y-4\">\n <CreateEmailSignerForm\n walletId={walletId}\n onCreated={handleAddSuccess}\n />\n <CreatePhoneSignerForm\n walletId={walletId}\n onCreated={handleAddSuccess}\n />\n <AddPasskeyButton\n walletId={walletId}\n onRegistered={handleAddSuccess}\n />\n </div>\n </DialogContent>\n </Dialog>\n </>\n );\n }\n\n if (!walletId) {\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-signer-list>\n <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>Select a wallet first.</p>\n </div>\n );\n }\n\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-signer-list aria-busy={isLoading} aria-live=\"polite\">\n <div className={cn(\"flex items-center justify-between gap-2 mb-2\", classNames?.header)}>\n <span className=\"text-sm font-medium\">Signers</span>\n <Button\n type=\"button\"\n size=\"touch\"\n variant=\"outline\"\n className={classNames?.addButton}\n onClick={() => setAddSignerOpen(true)}\n disabled={isLoading}\n aria-label=\"Add signer\"\n >\n Add signer\n </Button>\n </div>\n {isLoading && useSkeleton ? (\n <div className={cn(\"space-y-1\", classNames?.loading)} aria-busy=\"true\" aria-live=\"polite\">\n {[1, 2, 3].map((i) => (\n <Skeleton key={i} className={cn(\"h-5 w-full rounded-md\", classNames?.skeleton)} />\n ))}\n </div>\n ) : isLoading ? (\n <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>Loading signers...</p>\n ) : error ? (\n <div className={cn(\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2\", classNames?.message)} role=\"alert\">\n <p className=\"text-sm text-destructive\">{error}</p>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"mt-2\" onClick={() => refresh()}>\n Retry\n </Button>\n </div>\n ) : signers.length === 0 ? (\n <div className={cn(\"rounded-md border border-input bg-muted/30 px-4 py-3 text-sm text-muted-foreground\", classNames?.message)}>\n <p className=\"font-medium text-foreground\">No signers</p>\n <p className=\"mt-1\">Add a signer to authorize transactions for this wallet.</p>\n <Button\n type=\"button\"\n size=\"touch\"\n variant=\"outline\"\n className={cn(\"mt-3\", classNames?.addButton)}\n onClick={() => setAddSignerOpen(true)}\n aria-label=\"Add signer\"\n >\n Add signer\n </Button>\n </div>\n ) : (\n <ul className={cn(\"space-y-1\", classNames?.list)} role=\"list\">\n {signers.map((signer) => (\n <li key={signer.id} className={cn(\"flex items-center justify-between gap-2 text-sm\", classNames?.item)}>\n <span>\n {getSignerDisplayName(signer)} ({getSignerTypeLabel(signer.type || signer.signerType || \"\")})\n </span>\n {onRevoke && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-destructive\"\n onClick={() => handleRevoke(signer.id)}\n aria-label=\"Revoke signer\"\n >\n Revoke\n </Button>\n )}\n </li>\n ))}\n </ul>\n )}\n <Dialog open={addSignerOpen} onOpenChange={setAddSignerOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Add signer</DialogTitle>\n </DialogHeader>\n <div className=\"space-y-4\">\n <CreateEmailSignerForm walletId={walletId} onCreated={handleAddSuccess} />\n <CreatePhoneSignerForm walletId={walletId} onCreated={handleAddSuccess} />\n <AddPasskeyButton walletId={walletId} onRegistered={handleAddSuccess} />\n </div>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","\"use client\";\n\nimport { useSigners } from \"../../hooks/useSigners\";\nimport type { SignerData } from \"../../core/signer-helpers\";\nimport { getSignerDisplayName, getSignerTypeLabel, getSignerUniqueId } from \"../../core/signer-helpers\";\nimport { Button } from \"../../ui/button\";\nimport { Skeleton } from \"../../ui/skeleton\";\nimport { cn } from \"../../ui/cn\";\nimport type { SignerType } from \"../../core/signer-signing\";\n\nexport interface SignerSelectorClassNames {\n root?: string;\n list?: string;\n item?: string;\n message?: string;\n skeleton?: string;\n loading?: string;\n}\n\n/** Guide API: walletId + value + onChange(signerId, signerType) */\nexport interface SignerSelectorProps {\n walletId: string;\n value?: string;\n onChange: (signerId: string, signerType: SignerType) => void;\n className?: string;\n classNames?: SignerSelectorClassNames;\n useSkeleton?: boolean;\n /** Legacy: when provided with availableSigners/selectedSigner/onSignerSelect, use legacy API */\n selectedWalletId?: string;\n availableSigners?: SignerData[];\n selectedSigner?: SignerData | null;\n isLoadingSigners?: boolean;\n onSignerSelect?: (signer: SignerData) => void;\n renderList?: (props: {\n signers: SignerData[];\n selectedSigner: SignerData | null;\n onSelect: (signer: SignerData) => void;\n isLoading: boolean;\n getSignerDisplayName: (s: SignerData) => string;\n getSignerTypeLabel: (type: string) => string;\n getSignerUniqueId: (s: SignerData) => string;\n }) => React.ReactNode;\n children?: (props: {\n signers: SignerData[];\n selectedSigner: SignerData | null;\n onSignerSelect: (signer: SignerData) => void;\n isLoading: boolean;\n }) => React.ReactNode;\n}\n\nexport function SignerSelector({\n walletId,\n value,\n onChange,\n className,\n classNames,\n useSkeleton = true,\n selectedWalletId,\n availableSigners: availableSignersProp,\n selectedSigner: selectedSignerProp,\n isLoadingSigners: isLoadingSignersProp,\n onSignerSelect,\n renderList,\n children,\n}: SignerSelectorProps) {\n const { signers, isLoading } = useSigners(walletId);\n const availableSigners = availableSignersProp ?? signers;\n const isLoadingSigners = isLoadingSignersProp ?? isLoading;\n const resolvedSelected =\n value != null\n ? availableSigners.find((s) => s.id === value || s.signerId === value)\n : null;\n const selectedSigner = selectedSignerProp ?? resolvedSelected ?? null;\n\n const handleSelect = (signer: SignerData) => {\n const signerType = (signer.type || signer.signerType || \"email\") as SignerType;\n onChange(signer.id, signerType);\n onSignerSelect?.(signer);\n };\n\n if (!walletId && !selectedWalletId) return null;\n\n if (children) {\n return (\n <>\n {children({\n signers: availableSigners,\n selectedSigner,\n onSignerSelect: handleSelect,\n isLoading: isLoadingSigners,\n })}\n </>\n );\n }\n\n if (renderList) {\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-signer-selector>\n {renderList({\n signers: availableSigners,\n selectedSigner: selectedSigner ?? null,\n onSelect: handleSelect,\n isLoading: isLoadingSigners,\n getSignerDisplayName,\n getSignerTypeLabel,\n getSignerUniqueId,\n })}\n </div>\n );\n }\n\n const loadingContent =\n isLoadingSigners && useSkeleton ? (\n <div className={cn(\"space-y-1\", classNames?.loading)} aria-busy=\"true\" aria-live=\"polite\">\n {[1, 2, 3].map((i) => (\n <Skeleton key={i} className={cn(\"h-8 w-full rounded-md\", classNames?.skeleton)} />\n ))}\n </div>\n ) : isLoadingSigners ? (\n <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>Loading signers...</p>\n ) : null;\n\n return (\n <div\n className={cn(className, classNames?.root)}\n data-cilantro-signer-selector\n role=\"listbox\"\n aria-label=\"Select signer\"\n aria-busy={isLoadingSigners}\n aria-live=\"polite\"\n >\n {loadingContent ??\n (availableSigners.length === 0 ? (\n <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>No signers for this wallet.</p>\n ) : (\n <ul className={cn(\"space-y-1\", classNames?.list)}>\n {availableSigners.map((signer) => (\n <li key={signer.id}>\n <Button\n type=\"button\"\n variant={selectedSigner?.id === signer.id ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n className={cn(\"w-full justify-start\", classNames?.item)}\n onClick={() => handleSelect(signer)}\n aria-pressed={selectedSigner?.id === signer.id}\n >\n {getSignerDisplayName(signer)} ({getSignerTypeLabel(signer.type || signer.signerType || \"\")})\n </Button>\n </li>\n ))}\n </ul>\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { useExternalWallet } from \"../../hooks/useExternalWallet\";\nimport type { SolanaWallet } from \"../../hooks/useExternalWallet\";\nimport { Button } from \"../../ui/button\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface ConnectWalletButtonProps {\n onConnect?: (publicKey: string, wallet: SolanaWallet) => void;\n onDisconnect?: () => void;\n className?: string;\n children?: ReactNode;\n}\n\nexport function ConnectWalletButton({\n onConnect,\n onDisconnect,\n className,\n children,\n}: ConnectWalletButtonProps) {\n const { wallets, connectedWallet, connect, disconnect } = useExternalWallet();\n const [loading, setLoading] = useState(false);\n\n const handleConnect = async (wallet: SolanaWallet) => {\n setLoading(true);\n try {\n const publicKey = await connect(wallet);\n onConnect?.(publicKey, wallet);\n } finally {\n setLoading(false);\n }\n };\n\n const handleDisconnect = async () => {\n setLoading(true);\n try {\n await disconnect();\n onDisconnect?.();\n } finally {\n setLoading(false);\n }\n };\n\n if (connectedWallet) {\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n className={cn(className)}\n onClick={handleDisconnect}\n disabled={loading}\n data-cilantro-connect-wallet\n >\n {loading ? \"Disconnecting...\" : \"Disconnect\"}\n </Button>\n );\n }\n\n if (wallets.length === 0) {\n return (\n <Button type=\"button\" variant=\"outline\" className={cn(className)} disabled data-cilantro-connect-wallet>\n No wallet detected\n </Button>\n );\n }\n\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n className={cn(className)}\n onClick={() => handleConnect(wallets[0])}\n disabled={loading}\n data-cilantro-connect-wallet\n >\n {loading ? \"Connecting...\" : (children ?? \"Connect Wallet\")}\n </Button>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useWallet } from \"../../hooks/useWallet\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { cn } from \"../../ui/cn\";\nimport type { WalletControllerCreateResult } from \"cilantro-sdk/wallet\";\n\nexport interface CreateWalletFormProps {\n userId?: string;\n onCreated?: (wallet: WalletControllerCreateResult) => void;\n onError?: (error: Error) => void;\n className?: string;\n}\n\nexport function CreateWalletForm({\n userId,\n onCreated,\n onError,\n className,\n}: CreateWalletFormProps) {\n const { createWallet, isLoading } = useWallet();\n const [name, setName] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n try {\n const result = await createWallet({ name: name.trim(), userId });\n setName(\"\");\n onCreated?.(result);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className={cn(\"space-y-4\", className)} data-cilantro-create-wallet>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-wallet-name\">Wallet name</Label>\n <Input\n id=\"cilantro-wallet-name\"\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"My Wallet\"\n required\n disabled={isLoading}\n />\n </div>\n {error && (\n <div className=\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\" role=\"alert\">\n {error}\n </div>\n )}\n <Button type=\"submit\" disabled={isLoading || !name.trim()}>\n {isLoading ? \"Creating...\" : \"Create wallet\"}\n </Button>\n </form>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\nimport { cn } from \"./cn\";\n\nconst Select = SelectPrimitive.Root;\nconst SelectGroup = SelectPrimitive.Group;\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <span className=\"ml-2 h-4 w-4 shrink-0 opacity-50\">▼</span>\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n));\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>✓</SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n));\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nexport { Select, SelectGroup, SelectValue, SelectTrigger, SelectContent, SelectItem };\n","\"use client\";\n\nimport { useWallets } from \"../../providers/WalletProvider\";\nimport type { WalletData } from \"../../providers/WalletProvider\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../ui/select\";\nimport { Skeleton } from \"../../ui/skeleton\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface WalletSelectorClassNames {\n root?: string;\n trigger?: string;\n content?: string;\n item?: string;\n skeleton?: string;\n loading?: string;\n}\n\nexport interface WalletSelectorProps {\n value?: string;\n onChange?: (walletId: string) => void;\n onWalletChange?: (walletId: string, wallet: WalletData | null) => void;\n className?: string;\n classNames?: WalletSelectorClassNames;\n useSkeleton?: boolean;\n placeholder?: string;\n renderTrigger?: (props: {\n selectedWallet: WalletData | null;\n wallets: WalletData[];\n isLoading: boolean;\n open: boolean;\n setOpen: (open: boolean) => void;\n }) => React.ReactNode;\n renderList?: (props: {\n wallets: WalletData[];\n selectedWallet: WalletData | null;\n onSelect: (wallet: WalletData) => void;\n isLoading: boolean;\n }) => React.ReactNode;\n children?: (props: {\n wallets: WalletData[];\n selectedWallet: WalletData | null;\n selectWallet: (walletId: string) => void;\n isLoading: boolean;\n refreshWallets: () => Promise<void>;\n }) => React.ReactNode;\n}\n\nexport function WalletSelector(props: WalletSelectorProps) {\n const {\n value,\n onChange,\n onWalletChange,\n className,\n classNames,\n useSkeleton = true,\n placeholder = \"Select a wallet\",\n renderTrigger,\n renderList,\n children,\n } = props;\n const { wallets, selectedWallet, selectWallet, isLoading, refreshWallets } = useWallets();\n const isEmpty = !isLoading && wallets.length === 0;\n const effectiveValue = value ?? selectedWallet?.id ?? selectedWallet?.walletId ?? \"\";\n const selected = wallets.find((w) => w.id === effectiveValue || w.walletId === effectiveValue) ?? selectedWallet;\n\n const handleSelect = (wallet: WalletData) => {\n const id = wallet.id ?? wallet.walletId;\n selectWallet(id);\n onChange?.(id);\n onWalletChange?.(id, wallet);\n };\n\n const handleValueChange = (id: string) => {\n selectWallet(id);\n onChange?.(id);\n onWalletChange?.(id, wallets.find((w) => w.id === id || w.walletId === id) ?? null);\n };\n\n if (children) {\n return (\n <>\n {children({\n wallets,\n selectedWallet: selected,\n selectWallet: (id) => {\n selectWallet(id);\n onChange?.(id);\n onWalletChange?.(id, wallets.find((w) => w.id === id || w.walletId === id) ?? null);\n },\n isLoading,\n refreshWallets,\n })}\n </>\n );\n }\n\n if (renderTrigger || renderList) {\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-wallet-selector>\n {renderTrigger?.({ selectedWallet: selected, wallets, isLoading, open: false, setOpen: () => {} })}\n {renderList?.({ wallets, selectedWallet: selected, onSelect: handleSelect, isLoading })}\n </div>\n );\n }\n\n if (isLoading && useSkeleton) {\n return (\n <div\n className={cn(className, classNames?.root, classNames?.loading)}\n data-cilantro-wallet-selector\n aria-busy=\"true\"\n aria-live=\"polite\"\n >\n <div\n className={cn(\n \"flex h-9 w-full items-center justify-between rounded-md border border-input bg-transparent px-3 py-2\",\n classNames?.trigger\n )}\n >\n <Skeleton className={cn(\"h-4 flex-1 rounded\", classNames?.skeleton)} />\n </div>\n </div>\n );\n }\n\n if (isEmpty) {\n return (\n <div\n className={cn(\n \"rounded-md border border-input bg-muted/30 px-4 py-3 text-sm text-muted-foreground\",\n className,\n classNames?.root\n )}\n data-cilantro-wallet-selector\n >\n <p className=\"font-medium text-foreground\">No wallets</p>\n <p className=\"mt-1\">Wallets are created by the platform when you sign in. If you just logged in, try refreshing.</p>\n </div>\n );\n }\n\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-wallet-selector>\n <Select value={effectiveValue || undefined} onValueChange={handleValueChange} disabled={isLoading}>\n <SelectTrigger className={classNames?.trigger} aria-label=\"Select wallet\">\n <SelectValue placeholder={isLoading ? \"Loading...\" : placeholder} />\n </SelectTrigger>\n <SelectContent className={classNames?.content}>\n {wallets.map((w) => {\n const id = w.id ?? w.walletId;\n return (\n <SelectItem key={id} value={id} className={classNames?.item}>\n {w.walletName || id}\n </SelectItem>\n );\n })}\n </SelectContent>\n </Select>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Button } from \"../../ui/button\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface WalletAddressProps {\n address: string;\n short?: boolean;\n copyable?: boolean;\n className?: string;\n}\n\nfunction truncateAddress(addr: string, chars = 4): string {\n if (addr.length <= chars * 2 + 3) return addr;\n return `${addr.slice(0, chars)}...${addr.slice(-chars)}`;\n}\n\nexport function WalletAddress({\n address,\n short = false,\n copyable = false,\n className,\n}: WalletAddressProps) {\n const [copied, setCopied] = useState(false);\n const display = short ? truncateAddress(address) : address;\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(address);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // ignore\n }\n };\n\n return (\n <span className={cn(\"inline-flex items-center gap-2\", className)} data-cilantro-wallet-address>\n <code className=\"text-sm font-mono\">{display}</code>\n {copyable && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-2 text-xs\"\n onClick={handleCopy}\n aria-label=\"Copy address\"\n >\n {copied ? \"Copied\" : \"Copy\"}\n </Button>\n )}\n </span>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useCilantroContext } from \"../../context/CilantroContext\";\nimport { setSdkAuth } from \"../../core/auth\";\nimport { getAssets } from \"cilantro-sdk/wallet\";\nimport { extractResponseData } from \"../../core/types\";\nimport { Skeleton } from \"../../ui/skeleton\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface WalletBalanceProps {\n walletId: string;\n showTokens?: boolean;\n className?: string;\n}\n\nexport function WalletBalance({\n walletId,\n showTokens = false,\n className,\n}: WalletBalanceProps) {\n const { jwt } = useCilantroContext();\n const [loading, setLoading] = useState(true);\n const [solBalance, setSolBalance] = useState<string | null>(null);\n const [tokens, setTokens] = useState<Array<{ symbol?: string; balance?: string; mint?: string }>>([]);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!walletId || !jwt) {\n setSolBalance(null);\n setTokens([]);\n setLoading(false);\n return;\n }\n let cancelled = false;\n setLoading(true);\n setError(null);\n (async () => {\n try {\n if (jwt) setSdkAuth(jwt);\n const result = await getAssets(walletId);\n const data = extractResponseData<{ solBalance?: string; assets?: Array<{ symbol?: string; balance?: string; mint?: string }> }>(result);\n if (cancelled) return;\n setSolBalance(data?.solBalance ?? null);\n if (showTokens && Array.isArray(data?.assets)) {\n setTokens(data.assets);\n } else {\n setTokens([]);\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : String(err));\n setSolBalance(null);\n setTokens([]);\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [walletId, jwt, showTokens]);\n\n if (loading) {\n return (\n <div className={cn(className)} data-cilantro-wallet-balance>\n <Skeleton className=\"h-5 w-24 rounded\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={cn(\"text-sm text-destructive\", className)} data-cilantro-wallet-balance role=\"alert\">\n {error}\n </div>\n );\n }\n\n const solDisplay = solBalance != null ? `${Number(solBalance) / 1e9} SOL` : \"—\";\n\n return (\n <div className={cn(\"text-sm\", className)} data-cilantro-wallet-balance>\n <span className=\"font-medium\">{solDisplay}</span>\n {showTokens && tokens.length > 0 && (\n <ul className=\"mt-1 space-y-0.5 text-muted-foreground\">\n {tokens.map((t, i) => (\n <li key={t.mint ?? i}>\n {t.symbol ?? t.mint ?? \"Token\"}: {t.balance ?? \"—\"}\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useSendTransaction } from \"../../hooks/useSendTransaction\";\nimport type { SubmitTransactionResult } from \"../../hooks/useSendTransaction\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { cn } from \"../../ui/cn\";\n\nexport type SignerType = \"email\" | \"phone\" | \"passkey\" | \"external\";\n\nexport interface SendSOLFormProps {\n walletId: string;\n signerId?: string;\n signerType?: SignerType;\n onSuccess?: (result: SubmitTransactionResult) => void;\n onError?: (error: Error) => void;\n className?: string;\n}\n\nexport function SendSOLForm({\n walletId,\n signerId,\n signerType,\n onSuccess,\n onError,\n className,\n}: SendSOLFormProps) {\n const { sendSOL, isPending, error } = useSendTransaction(walletId, signerId, signerType);\n const [recipientAddress, setRecipientAddress] = useState(\"\");\n const [amountLamports, setAmountLamports] = useState(\"\");\n const [submitError, setSubmitError] = useState<string | null>(null);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setSubmitError(null);\n const lamports = Number(amountLamports);\n if (!recipientAddress.trim() || Number.isNaN(lamports) || lamports < 1) {\n setSubmitError(\"Invalid recipient or amount\");\n return;\n }\n try {\n const result = await sendSOL({ recipientAddress: recipientAddress.trim(), amountLamports: lamports });\n setRecipientAddress(\"\");\n setAmountLamports(\"\");\n onSuccess?.(result);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setSubmitError(message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className={cn(\"space-y-4\", className)} data-cilantro-send-sol>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-send-sol-recipient\">Recipient address</Label>\n <Input\n id=\"cilantro-send-sol-recipient\"\n type=\"text\"\n value={recipientAddress}\n onChange={(e) => setRecipientAddress(e.target.value)}\n placeholder=\"7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU\"\n required\n disabled={isPending}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-send-sol-amount\">Amount (lamports)</Label>\n <Input\n id=\"cilantro-send-sol-amount\"\n type=\"number\"\n min={1}\n value={amountLamports}\n onChange={(e) => setAmountLamports(e.target.value)}\n placeholder=\"100000000\"\n required\n disabled={isPending}\n />\n </div>\n {(error || submitError) && (\n <div className=\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\" role=\"alert\">\n {submitError ?? error}\n </div>\n )}\n <Button type=\"submit\" disabled={isPending || !recipientAddress.trim() || !amountLamports}>\n {isPending ? \"Sending...\" : \"Send SOL\"}\n </Button>\n </form>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport {\n useSendTransaction,\n type SubmitTransactionResult,\n type SignerType,\n} from \"../../hooks/useSendTransaction\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface SendSPLFormProps {\n walletId: string;\n signerId?: string;\n signerType?: SignerType;\n mintAddress?: string;\n onSuccess?: (result: SubmitTransactionResult) => void;\n onError?: (error: Error) => void;\n className?: string;\n}\n\nexport function SendSPLForm({\n walletId,\n signerId,\n signerType,\n mintAddress: initialMint,\n onSuccess,\n onError,\n className,\n}: SendSPLFormProps) {\n const { sendSPL, isPending, error } = useSendTransaction(walletId, signerId, signerType);\n const [mintAddress, setMintAddress] = useState(initialMint ?? \"\");\n const [recipientAddress, setRecipientAddress] = useState(\"\");\n const [amount, setAmount] = useState(\"\");\n const [submitError, setSubmitError] = useState<string | null>(null);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setSubmitError(null);\n const amt = Number(amount);\n if (!mintAddress.trim() || !recipientAddress.trim() || Number.isNaN(amt) || amt < 0) {\n setSubmitError(\"Invalid mint, recipient or amount\");\n return;\n }\n try {\n const result = await sendSPL({\n mintAddress: mintAddress.trim(),\n recipientAddress: recipientAddress.trim(),\n amount: amt,\n });\n setRecipientAddress(\"\");\n setAmount(\"\");\n onSuccess?.(result);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setSubmitError(message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className={cn(\"space-y-4\", className)} data-cilantro-send-spl>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-send-spl-mint\">Mint address</Label>\n <Input\n id=\"cilantro-send-spl-mint\"\n type=\"text\"\n value={mintAddress}\n onChange={(e) => setMintAddress(e.target.value)}\n placeholder=\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\"\n required\n disabled={isPending}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-send-spl-recipient\">Recipient address</Label>\n <Input\n id=\"cilantro-send-spl-recipient\"\n type=\"text\"\n value={recipientAddress}\n onChange={(e) => setRecipientAddress(e.target.value)}\n placeholder=\"Recipient Solana address\"\n required\n disabled={isPending}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-send-spl-amount\">Amount</Label>\n <Input\n id=\"cilantro-send-spl-amount\"\n type=\"number\"\n min={0}\n step=\"any\"\n value={amount}\n onChange={(e) => setAmount(e.target.value)}\n placeholder=\"100\"\n required\n disabled={isPending}\n />\n </div>\n {(error || submitError) && (\n <div className=\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\" role=\"alert\">\n {submitError ?? error}\n </div>\n )}\n <Button type=\"submit\" disabled={isPending || !mintAddress.trim() || !recipientAddress.trim() || !amount}>\n {isPending ? \"Sending...\" : \"Send SPL\"}\n </Button>\n </form>\n );\n}\n","\"use client\";\n\nimport { cn } from \"../../ui/cn\";\n\nconst EXPLORER_URL: Record<string, string> = {\n \"mainnet-beta\": \"https://explorer.solana.com\",\n devnet: \"https://explorer.solana.com/?cluster=devnet\",\n testnet: \"https://explorer.solana.com/?cluster=testnet\",\n};\n\nexport interface TransactionStatusProps {\n signature: string;\n cluster?: \"mainnet-beta\" | \"devnet\" | \"testnet\";\n className?: string;\n}\n\nexport function TransactionStatus({\n signature,\n cluster = \"mainnet-beta\",\n className,\n}: TransactionStatusProps) {\n const base = EXPLORER_URL[cluster] ?? EXPLORER_URL[\"mainnet-beta\"];\n const href = `${base}/tx/${signature}`;\n\n return (\n <div className={cn(\"text-sm\", className)} data-cilantro-transaction-status>\n <span className=\"text-muted-foreground\">Transaction: </span>\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"font-mono text-primary underline underline-offset-2\"\n >\n {signature.slice(0, 8)}...{signature.slice(-8)}\n </a>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useCilantroContext } from \"../../context/CilantroContext\";\nimport { setSdkAuth } from \"../../core/auth\";\nimport { cn } from \"../../ui/cn\";\nimport { TransactionStatus } from \"./TransactionStatus\";\n\nexport interface TransactionHistoryProps {\n walletId: string;\n pageSize?: number;\n className?: string;\n}\n\nexport function TransactionHistory({\n walletId,\n pageSize = 10,\n className,\n}: TransactionHistoryProps) {\n const { jwt } = useCilantroContext();\n const [loading, setLoading] = useState(true);\n const [signatures, setSignatures] = useState<string[]>([]);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!walletId || !jwt) {\n setSignatures([]);\n setLoading(false);\n return;\n }\n let cancelled = false;\n setLoading(true);\n setError(null);\n (async () => {\n try {\n if (jwt) setSdkAuth(jwt);\n // Placeholder: SDK may not expose transaction history list; show empty or use API when available\n if (!cancelled) setSignatures([]);\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : String(err));\n setSignatures([]);\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [walletId, jwt, pageSize]);\n\n if (loading) {\n return (\n <div className={cn(\"text-sm text-muted-foreground\", className)} data-cilantro-transaction-history>\n Loading...\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={cn(\"text-sm text-destructive\", className)} data-cilantro-transaction-history role=\"alert\">\n {error}\n </div>\n );\n }\n\n if (signatures.length === 0) {\n return (\n <div className={cn(\"text-sm text-muted-foreground\", className)} data-cilantro-transaction-history>\n No recent transactions.\n </div>\n );\n }\n\n return (\n <ul className={cn(\"space-y-2\", className)} data-cilantro-transaction-history role=\"list\">\n {signatures.map((sig) => (\n <li key={sig}>\n <TransactionStatus signature={sig} />\n </li>\n ))}\n </ul>\n );\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { useAuth } from \"../../hooks/useAuth\";\nimport { useWallet } from \"../../hooks/useWallet\";\nimport { useSigners } from \"../../hooks/useSigners\";\nimport type { WalletData } from \"../../context/CilantroContext\";\nimport type { SignerInfo } from \"cilantro-sdk/helpers\";\nimport { LoginForm } from \"../auth/LoginForm\";\nimport { CreateWalletForm } from \"../wallet/CreateWalletForm\";\nimport { CreateEmailSignerForm } from \"../signers/CreateEmailSignerForm\";\nimport { AddPasskeyButton } from \"../signers/AddPasskeyButton\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface WalletInfo extends WalletData {}\n\nexport interface CilantroConnectProps {\n onConnect?: (wallet: WalletInfo, signers: SignerInfo[]) => void;\n onDisconnect?: () => void;\n className?: string;\n}\n\nexport function CilantroConnect({\n onConnect,\n onDisconnect,\n className,\n}: CilantroConnectProps) {\n const { isAuthenticated } = useAuth();\n const { wallet, wallets, createWallet, selectWallet, isLoading: walletLoading } = useWallet();\n const [walletId, setWalletId] = useState<string | null>(null);\n const [step, setStep] = useState<\"auth\" | \"wallet\" | \"signer\" | \"done\">(\"auth\");\n\n if (!isAuthenticated) {\n return (\n <div className={cn(className)} data-cilantro-connect>\n <LoginForm onSuccess={() => setStep(\"wallet\")} />\n </div>\n );\n }\n\n if (step === \"wallet\" && wallets.length === 0 && !walletLoading) {\n return (\n <div className={cn(className)} data-cilantro-connect>\n <CreateWalletForm\n onCreated={(res) => {\n const id = (res as { data?: { id?: string } })?.data?.id;\n if (id) {\n setWalletId(id);\n selectWallet(id);\n setStep(\"signer\");\n }\n }}\n />\n </div>\n );\n }\n\n if (step === \"signer\" && walletId) {\n const currentWallet = wallet ?? wallets.find((w) => (w.id ?? w.walletId) === walletId);\n return (\n <div className={cn(\"space-y-4\", className)} data-cilantro-connect>\n <p className=\"text-sm text-muted-foreground\">Add a signer to your wallet</p>\n <CreateEmailSignerForm\n walletId={walletId}\n onCreated={(signer) => {\n const signers = [signer];\n if (currentWallet) {\n onConnect?.(currentWallet as WalletInfo, signers);\n }\n setStep(\"done\");\n }}\n />\n <AddPasskeyButton\n walletId={walletId}\n onRegistered={() => {\n if (currentWallet) {\n onConnect?.(currentWallet as WalletInfo, []);\n }\n setStep(\"done\");\n }}\n />\n </div>\n );\n }\n\n if (wallet && step === \"done\") {\n return (\n <div className={cn(className)} data-cilantro-connect>\n <p className=\"text-sm text-muted-foreground\">Connected</p>\n {onDisconnect && (\n <button\n type=\"button\"\n className=\"text-sm text-primary underline\"\n onClick={() => {\n onDisconnect();\n setStep(\"wallet\");\n setWalletId(null);\n }}\n >\n Disconnect\n </button>\n )}\n </div>\n );\n }\n\n if (walletLoading) {\n return (\n <div className={cn(\"text-sm text-muted-foreground\", className)} data-cilantro-connect>\n Loading...\n </div>\n );\n }\n\n return (\n <div className={cn(className)} data-cilantro-connect>\n <p className=\"text-sm text-muted-foreground\">Set up your wallet</p>\n <CreateWalletForm\n onCreated={(res) => {\n const id = (res as { data?: { id?: string } })?.data?.id;\n if (id) {\n setWalletId(id);\n selectWallet(id);\n setStep(\"signer\");\n }\n }}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface LoadingOverlayProps {\n isLoading: boolean;\n message?: string;\n children: ReactNode;\n className?: string;\n}\n\nexport function LoadingOverlay({\n isLoading,\n message,\n children,\n className,\n}: LoadingOverlayProps) {\n if (!isLoading) return <>{children}</>;\n\n return (\n <div className={cn(\"relative\", className)} data-cilantro-loading-overlay>\n <div\n className=\"absolute inset-0 z-10 flex items-center justify-center bg-background/80\"\n aria-busy=\"true\"\n aria-live=\"polite\"\n >\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n {message && <p className=\"text-sm text-muted-foreground\">{message}</p>}\n </div>\n </div>\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport { Component, type ErrorInfo, type ReactNode } from \"react\";\nimport { Button } from \"../../ui/button\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface ErrorBoundaryProps {\n fallback?: ReactNode;\n onRetry?: () => void;\n children: ReactNode;\n}\n\ninterface State {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, State> {\n state: State = { hasError: false, error: null };\n\n static getDerivedStateFromError(error: Error): State {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error(\"[Cilantro ErrorBoundary]\", error, errorInfo);\n }\n\n handleRetry = () => {\n this.setState({ hasError: false, error: null });\n this.props.onRetry?.();\n };\n\n render() {\n if (this.state.hasError && this.state.error) {\n if (this.props.fallback) {\n return this.props.fallback;\n }\n return (\n <div\n className=\"rounded-md border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive\"\n data-cilantro-error-boundary\n role=\"alert\"\n >\n <p className=\"font-medium\">Something went wrong</p>\n <p className=\"mt-1 text-muted-foreground\">{this.state.error.message}</p>\n {this.props.onRetry && (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"mt-3\" onClick={this.handleRetry}>\n Retry\n </Button>\n )}\n </div>\n );\n }\n return this.props.children;\n }\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"./cn\";\n\nconst DEFAULT_THEME_CSS = `\n:root,[data-theme=\"light\"]{--background:0 0% 100%;--foreground:222.2 84% 4.9%;--primary:222.2 47.4% 11.2%;--primary-foreground:210 40% 98%;--muted:210 40% 96.1%;--muted-foreground:215.4 16.3% 46.9%;--border:214.3 31.8% 91.4%;--input:214.3 31.8% 91.4%;--ring:222.2 84% 4.9%;--destructive:0 84.2% 60.2%;--destructive-foreground:210 40% 98%;--accent:210 40% 96.1%;--accent-foreground:222.2 47.4% 11.2%;--popover:0 0% 100%;--popover-foreground:222.2 84% 4.9%;--card:0 0% 100%;--card-foreground:222.2 84% 4.9%}\n[data-theme=\"dark\"]{--background:222.2 84% 4.9%;--foreground:210 40% 98%;--primary:210 40% 98%;--primary-foreground:222.2 47.4% 11.2%;--muted:217.2 32.6% 17.5%;--muted-foreground:215 20.2% 65.1%;--border:217.2 32.6% 17.5%;--input:217.2 32.6% 17.5%;--ring:212.7 26.8% 83.9%;--destructive:0 62.8% 30.6%;--destructive-foreground:210 40% 98%;--accent:217.2 32.6% 17.5%;--accent-foreground:210 40% 98%;--popover:222.2 84% 4.9%;--popover-foreground:210 40% 98%;--card:222.2 84% 4.9%;--card-foreground:210 40% 98%}\n`;\n\nexport type Theme = \"light\" | \"dark\" | \"system\";\nexport type ResolvedTheme = \"light\" | \"dark\";\n\nexport interface ThemeProviderProps {\n /** Current theme: \"light\", \"dark\", or \"system\" (follows prefers-color-scheme). */\n theme?: Theme;\n /** Default theme when theme is \"system\" or for initial render. */\n defaultTheme?: ResolvedTheme;\n /** Optional localStorage key for persisting theme when using \"system\". */\n storageKey?: string;\n /** Optional class for the wrapper div. */\n className?: string;\n children: React.ReactNode;\n /** When true, inject the default theme CSS variables (light/dark). Your app must still use Tailwind. */\n injectStyles?: boolean;\n}\n\nfunction getSystemTheme(): ResolvedTheme {\n if (typeof window === \"undefined\") return \"dark\";\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\";\n}\n\nexport function ThemeProvider({\n theme = \"system\",\n defaultTheme = \"dark\",\n storageKey,\n className,\n children,\n injectStyles = true,\n}: ThemeProviderProps) {\n const [resolved, setResolved] = React.useState<ResolvedTheme>(() => {\n if (theme === \"light\") return \"light\";\n if (theme === \"dark\") return \"dark\";\n if (typeof window !== \"undefined\" && storageKey) {\n const stored = window.localStorage.getItem(storageKey);\n if (stored === \"light\" || stored === \"dark\") return stored;\n }\n return defaultTheme;\n });\n\n React.useEffect(() => {\n if (theme === \"light\") {\n setResolved(\"light\");\n return;\n }\n if (theme === \"dark\") {\n setResolved(\"dark\");\n return;\n }\n const system = getSystemTheme();\n setResolved(system);\n const mql = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const listener = () => {\n const next = mql.matches ? \"dark\" : \"light\";\n setResolved(next);\n if (storageKey) window.localStorage.setItem(storageKey, next);\n };\n mql.addEventListener(\"change\", listener);\n return () => mql.removeEventListener(\"change\", listener);\n }, [theme, storageKey]);\n\n return (\n <>\n {injectStyles && (\n <style\n dangerouslySetInnerHTML={{ __html: DEFAULT_THEME_CSS }}\n data-cilantro-theme-styles\n />\n )}\n <div\n className={cn(className)}\n data-theme={resolved}\n data-cilantro-theme-provider\n >\n {children}\n </div>\n </>\n );\n}\n","/**\n * Adapter to use @solana/web3.js Connection for sign-and-send (advanced usage).\n * Pass the result as the connection prop so you don't need type assertions.\n */\n\nimport type { Connection } from \"@solana/web3.js\";\n\n/** Connection shape expected for sign-and-send (advanced usage). */\nexport interface SignAndSendConnectionAdapter {\n sendRawTransaction: (buf: Buffer) => Promise<string>;\n getLatestBlockhash: () => Promise<{ blockhash: string; lastValidBlockHeight: number }>;\n confirmTransaction: (opts: {\n signature: string;\n blockhash: string;\n lastValidBlockHeight: number;\n }) => Promise<void>;\n}\n\n/**\n * Wrap a @solana/web3.js Connection for sign-and-send (advanced usage).\n * Use when you have a Solana Connection and need the adapter shape without type assertions.\n *\n * @example\n * import { Connection } from '@solana/web3.js';\n * import { adaptSolanaConnection } from 'cilantro-react';\n *\n * const connection = new Connection(rpcUrl);\n * const adapter = adaptSolanaConnection(connection);\n */\nexport function adaptSolanaConnection(connection: Connection): SignAndSendConnectionAdapter {\n return {\n sendRawTransaction: (buf: Buffer) =>\n connection.sendRawTransaction(buf),\n\n getLatestBlockhash: () =>\n connection.getLatestBlockhash().then(({ blockhash, lastValidBlockHeight }) => ({\n blockhash,\n lastValidBlockHeight,\n })),\n\n confirmTransaction: async (opts: {\n signature: string;\n blockhash: string;\n lastValidBlockHeight: number;\n }) => {\n await connection.confirmTransaction({\n signature: opts.signature,\n blockhash: opts.blockhash,\n lastValidBlockHeight: opts.lastValidBlockHeight,\n });\n },\n };\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport {\n deriveSignerKeypair,\n getEmailSignerKeypair,\n getPhoneSignerKeypair,\n} from \"cilantro-sdk/helpers\";\nimport type { SignerData } from \"../signer-helpers\";\nimport { getStorageOptions } from \"./storage\";\nimport { SIGNER_TYPES, type SignerType } from \"./constants\";\n\nexport async function getSignerPublicKey(\n walletId: string,\n signer: SignerData,\n signerType: string,\n signerId: string\n): Promise<PublicKey> {\n const existingPubkey = signer.signerPubkey || signer.publicKey;\n if (existingPubkey && typeof existingPubkey === \"string\" && existingPubkey.trim()) {\n return new PublicKey(existingPubkey.trim());\n }\n const storageOptions = getStorageOptions();\n if (signerType === SIGNER_TYPES.EMAIL) {\n const keypair = await getEmailSignerKeypair(walletId, signerId, storageOptions);\n return new PublicKey(keypair.publicKey);\n }\n if (signerType === SIGNER_TYPES.PHONE) {\n const keypair = await getPhoneSignerKeypair(walletId, signerId, storageOptions);\n return new PublicKey(keypair.publicKey);\n }\n if (signerType === SIGNER_TYPES.EXTERNAL || signerType === SIGNER_TYPES.API_KEY) {\n const keypair = await deriveSignerKeypair(walletId, signerId, signerType, storageOptions);\n return new PublicKey(keypair.publicKey);\n }\n throw new Error(`Unsupported signer type: ${signerType}`);\n}\n","export const CACHE_CONFIG = { enabled: true, ttl: 300000 } as const;\n\nexport const SIGNER_TYPES = {\n EMAIL: \"email\",\n PHONE: \"phone\",\n PASSKEY: \"passkey\",\n EXTERNAL: \"external\",\n API_KEY: \"apiKey\",\n} as const;\n\nexport type SignerType = (typeof SIGNER_TYPES)[keyof typeof SIGNER_TYPES];\n\nexport function isValidSignerType(type: string): type is SignerType {\n return Object.values(SIGNER_TYPES).includes(type as SignerType);\n}\n","import { getStorageAdapter, type DeviceKeyStorage } from \"../storage-adapter\";\nimport { CACHE_CONFIG } from \"./constants\";\n\nexport function getSignerStorage(): DeviceKeyStorage {\n return getStorageAdapter();\n}\n\nexport function getStorageOptions() {\n return {\n deviceKeyManager: getSignerStorage(),\n cache: CACHE_CONFIG,\n };\n}\n","import {\n deriveSignerKeypair,\n signWithSigner,\n signWithEmailSigner,\n signWithPhoneSigner,\n getEmailSignerKeypair,\n getPhoneSignerKeypair,\n} from \"cilantro-sdk/helpers\";\nimport type { SignerData } from \"../signer-helpers\";\nimport { signWithPasskey } from \"../signer-creation\";\nimport { handleDeviceKeyError } from \"./errors\";\nimport { extractSignerInfo, validateSignerActive } from \"./signer-types\";\nimport { getStorageOptions } from \"./storage\";\nimport { SIGNER_TYPES } from \"./constants\";\n\n/** Result shape aligned with SDK SignMessageDataDto (signature base64, message) plus optional helper fields. */\nexport interface SignMessageResult {\n /** Signature in base64 (SDK SignMessageDataDto shape). */\n signature: string;\n /** Original message that was signed (SDK SignMessageDataDto shape). */\n message: string;\n publicKey?: string;\n signerType: string;\n signer?: string;\n}\n\nexport async function signMessageWithSigner(\n walletId: string,\n signer: SignerData,\n messageText: string\n): Promise<SignMessageResult> {\n const { signerType, signerId } = extractSignerInfo(signer);\n const message = new TextEncoder().encode(messageText);\n\n if (signerType === SIGNER_TYPES.EMAIL) {\n validateSignerActive(signer, signerType);\n const storageOptions = getStorageOptions();\n try {\n const signatureBytes = await signWithEmailSigner(walletId, signerId, message, storageOptions);\n const keypair = await getEmailSignerKeypair(walletId, signerId, storageOptions);\n return {\n signature: Buffer.from(signatureBytes).toString(\"base64\"),\n message: messageText,\n publicKey: Buffer.from(keypair.publicKey).toString(\"hex\"),\n signerType: SIGNER_TYPES.EMAIL,\n };\n } catch (error: unknown) {\n throw handleDeviceKeyError(error, SIGNER_TYPES.EMAIL);\n }\n }\n\n if (signerType === SIGNER_TYPES.PHONE) {\n validateSignerActive(signer, signerType);\n const storageOptions = getStorageOptions();\n try {\n const signatureBytes = await signWithPhoneSigner(walletId, signerId, message, storageOptions);\n const keypair = await getPhoneSignerKeypair(walletId, signerId, storageOptions);\n return {\n signature: Buffer.from(signatureBytes).toString(\"base64\"),\n message: messageText,\n publicKey: Buffer.from(keypair.publicKey).toString(\"hex\"),\n signerType: SIGNER_TYPES.PHONE,\n };\n } catch (error: unknown) {\n throw handleDeviceKeyError(error, SIGNER_TYPES.PHONE);\n }\n }\n\n if (signerType === SIGNER_TYPES.PASSKEY) {\n const signResult = await signWithPasskey(walletId, signerId, messageText, { useBrowserAutofill: false });\n const signatureBase64 = Buffer.from(signResult.signature, \"hex\").toString(\"base64\");\n return {\n signature: signatureBase64,\n message: messageText,\n signerType: SIGNER_TYPES.PASSKEY,\n signer: signResult.signer,\n };\n }\n\n if (signerType === SIGNER_TYPES.EXTERNAL || signerType === SIGNER_TYPES.API_KEY) {\n validateSignerActive(signer, signerType);\n const storageOptions = getStorageOptions();\n const signatureBytes = await signWithSigner(walletId, signerId, signerType, message, storageOptions);\n const keypair = await deriveSignerKeypair(walletId, signerId, signerType, storageOptions);\n return {\n signature: Buffer.from(signatureBytes).toString(\"base64\"),\n message: messageText,\n publicKey: Buffer.from(keypair.publicKey).toString(\"base64\"),\n signerType,\n };\n }\n\n throw new Error(`Unsupported signer type: ${signerType}`);\n}\n","import {\n DeviceKeyNotFoundError,\n DeviceKeyMismatchError,\n SignerInactiveError,\n SignerNotFoundError,\n} from \"cilantro-sdk/helpers\";\n\nexport function handleDeviceKeyError(error: unknown, signerType: string): never {\n if (error instanceof DeviceKeyNotFoundError) {\n throw new Error(\n `Device key not found. Please create the ${signerType} signer first using the Signers page. The device key is generated when you create the signer.`\n );\n }\n if (error instanceof DeviceKeyMismatchError) {\n throw new Error(\n \"Device key mismatch. The stored device key doesn't match the server. You may need to create a new signer or update the device identity.\"\n );\n }\n if (error instanceof SignerNotFoundError) {\n throw new Error(`Signer not found. Please ensure the ${signerType} signer exists.`);\n }\n if (error instanceof SignerInactiveError) {\n throw new Error(`${signerType} signer is not active. Please activate the signer first.`);\n }\n if (error instanceof Error) {\n if (error.message.includes(\"Device key not found\") || error.name === \"DeviceKeyNotFoundError\") {\n throw new Error(\n `Device key not found. Please create the ${signerType} signer first using the Signers page. The device key is generated when you create the signer.`\n );\n }\n if (error.message.includes(\"Device key mismatch\") || error.name === \"DeviceKeyMismatchError\") {\n throw new Error(\n \"Device key mismatch. The stored device key doesn't match the server. You may need to create a new signer or update the device identity.\"\n );\n }\n }\n throw error;\n}\n\nexport function createMissingSignerInfoError(signer: unknown): Error {\n return new Error(`Signer type or ID is missing. Signer data: ${JSON.stringify(signer)}`);\n}\n\nexport function createUnsupportedSignerTypeError(signerType: string): Error {\n return new Error(`Unsupported signer type: ${signerType}`);\n}\n","import type { SignerData } from \"../signer-helpers\";\nimport { SIGNER_TYPES, isValidSignerType, type SignerType } from \"./constants\";\n\nexport function extractSignerInfo(signer: SignerData): { signerType: SignerType; signerId: string } {\n const signerType = (signer.type || signer.signerType) as SignerType;\n const signerId = signer.id || signer.signerId;\n if (!signerType || !signerId) {\n throw new Error(`Signer type or ID is missing. Signer data: ${JSON.stringify(signer)}`);\n }\n if (!isValidSignerType(signerType)) {\n throw new Error(`Unsupported signer type: ${signerType}`);\n }\n return { signerType, signerId };\n}\n\nexport function requiresDeviceKeyStorage(signerType: SignerType): boolean {\n return (\n signerType === SIGNER_TYPES.EMAIL ||\n signerType === SIGNER_TYPES.PHONE ||\n signerType === SIGNER_TYPES.EXTERNAL ||\n signerType === SIGNER_TYPES.API_KEY\n );\n}\n\nexport function isAuthenticationSigner(signerType: SignerType): boolean {\n return (\n signerType === SIGNER_TYPES.EMAIL ||\n signerType === SIGNER_TYPES.PHONE ||\n signerType === SIGNER_TYPES.PASSKEY\n );\n}\n\nexport function requiresActiveStatus(signerType: SignerType): boolean {\n return (\n signerType === SIGNER_TYPES.EMAIL ||\n signerType === SIGNER_TYPES.PHONE ||\n signerType === SIGNER_TYPES.EXTERNAL ||\n signerType === SIGNER_TYPES.API_KEY\n );\n}\n\nexport function validateSignerActive(signer: SignerData, signerType: SignerType): void {\n if (requiresActiveStatus(signerType) && !signer.isActive) {\n throw new Error(`${signerType} signer is not active. Please activate the signer first.`);\n }\n}\n","import { Transaction } from \"@solana/web3.js\";\nimport {\n signWithSigner,\n signWithEmailSigner,\n signWithPhoneSigner,\n signTransactionWithEmailSigner,\n signTransactionWithPhoneSigner,\n} from \"cilantro-sdk/helpers\";\nimport { submitTransaction } from \"cilantro-sdk/wallet\";\nimport type { WalletControllerSubmitTransactionResult } from \"cilantro-sdk/wallet\";\nimport type { SignerData } from \"../signer-helpers\";\nimport { signAndSendPasskeyTransaction } from \"../signer-creation\";\nimport { extractErrorMessage } from \"../error-utils\";\nimport { extractResponseData } from \"../types\";\nimport { handleDeviceKeyError } from \"./errors\";\n\n/** Connection-like interface for sign-and-send (passkey). Consumer provides from their Solana config. */\nexport interface SignAndSendConnection {\n getLatestBlockhash: (commitment?: string) => Promise<{ blockhash: string; lastValidBlockHeight: number }>;\n confirmTransaction: (opts: { signature: string; blockhash: string; lastValidBlockHeight: number }) => Promise<void>;\n}\nimport { extractSignerInfo, validateSignerActive } from \"./signer-types\";\nimport { getStorageOptions } from \"./storage\";\nimport { SIGNER_TYPES, type SignerType } from \"./constants\";\nimport { getSignerPublicKey } from \"./core\";\nimport { validateSignerInTransaction } from \"./validation\";\n\nfunction prepareTransactionForSigning(\n transaction: Transaction,\n signerPublicKey: import(\"@solana/web3.js\").PublicKey\n): void {\n const signerPubkeyStr = signerPublicKey.toString();\n const hasSignerInSignatures = transaction.signatures.some(\n (sig) => sig.publicKey.toString() === signerPubkeyStr\n );\n if (!hasSignerInSignatures) {\n transaction.signatures.push({\n publicKey: signerPublicKey,\n signature: null,\n });\n }\n if (transaction.feePayer) {\n const feePayerStr = transaction.feePayer.toString();\n const hasFeePayerInSignatures = transaction.signatures.some(\n (sig) => sig.publicKey.toString() === feePayerStr\n );\n if (!hasFeePayerInSignatures) {\n transaction.signatures.push({ publicKey: transaction.feePayer, signature: null });\n }\n }\n}\n\nasync function signTransactionWithEmailOrPhone(\n walletId: string,\n signerId: string,\n signerType: SignerType,\n unsignedTransactionBase64: string\n): Promise<string> {\n const storageOptions = getStorageOptions();\n if (signerType === SIGNER_TYPES.EMAIL) {\n return await signTransactionWithEmailSigner(\n walletId,\n signerId,\n unsignedTransactionBase64,\n storageOptions\n );\n }\n return await signTransactionWithPhoneSigner(\n walletId,\n signerId,\n unsignedTransactionBase64,\n storageOptions\n );\n}\n\n/** SDK submit transaction data (SubmitTransactionResponseDto.data). */\nexport type SubmitTransactionDataDto = WalletControllerSubmitTransactionResult[\"data\"];\n\nasync function submitSignedTransaction(\n walletId: string,\n signedTransactionBase64: string\n): Promise<{ signature: string; status: string; confirmationStatus: string }> {\n const submitResult: WalletControllerSubmitTransactionResult = await submitTransaction(walletId, {\n signedTransaction: signedTransactionBase64,\n });\n const resultData = extractResponseData<SubmitTransactionDataDto>(submitResult);\n if (!resultData?.signature) throw new Error(\"Server did not return a transaction signature\");\n const status = resultData.status ?? \"pending\";\n return {\n signature: resultData.signature,\n status,\n confirmationStatus: status,\n };\n}\n\nasync function handlePasskeyTransaction(\n walletId: string,\n signerId: string,\n transaction: Transaction,\n connection: SignAndSendConnection | null | undefined\n): Promise<{ signature: string; status: string; confirmationStatus: string }> {\n if (!connection) {\n throw new Error(\n \"Connection is required for passkey sign-and-send. Pass the connection from your Solana config.\"\n );\n }\n const { blockhash, lastValidBlockHeight } = await connection.getLatestBlockhash(\"confirmed\");\n const result = await signAndSendPasskeyTransaction(walletId, signerId, transaction, {\n useBrowserAutofill: false,\n });\n let status = \"confirmed\";\n try {\n await connection.confirmTransaction({\n signature: result.signature,\n blockhash,\n lastValidBlockHeight,\n });\n } catch (error) {\n const errorMsg = extractErrorMessage(error);\n if (\n errorMsg.includes(\"block height exceeded\") ||\n errorMsg.includes(\"expired\") ||\n errorMsg.includes(\"timeout\")\n ) {\n status = \"pending\";\n } else {\n throw new Error(`Transaction confirmation failed: ${errorMsg}. Signature: ${result.signature}`);\n }\n }\n return { signature: result.signature, status, confirmationStatus: status };\n}\n\nasync function handleEmailOrPhoneTransaction(\n walletId: string,\n signer: SignerData,\n signerType: SignerType,\n signerId: string,\n transaction: Transaction\n): Promise<{ signature: string; status: string; confirmationStatus: string }> {\n validateSignerActive(signer, signerType);\n const signerPublicKey = await getSignerPublicKey(walletId, signer, signerType, signerId);\n prepareTransactionForSigning(transaction, signerPublicKey);\n const unsignedTransactionBase64 = Buffer.from(\n transaction.serialize({ verifySignatures: false })\n ).toString(\"base64\");\n let signedTransactionBase64: string;\n try {\n signedTransactionBase64 = await signTransactionWithEmailOrPhone(\n walletId,\n signerId,\n signerType,\n unsignedTransactionBase64\n );\n } catch (error: unknown) {\n handleDeviceKeyError(error, signerType);\n throw error;\n }\n try {\n const validationResult = await validateSignerInTransaction(\n signedTransactionBase64,\n signerPublicKey\n );\n if (!validationResult.isValid) {\n console.error(\"Transaction validation failed:\", {\n errors: validationResult.errors,\n warnings: validationResult.warnings,\n });\n }\n } catch (validationError) {\n console.error(\"Validation error (non-fatal):\", extractErrorMessage(validationError));\n }\n return await submitSignedTransaction(walletId, signedTransactionBase64);\n}\n\nasync function handleExternalOrApiKeyTransaction(\n walletId: string,\n signer: SignerData,\n signerType: SignerType,\n signerId: string,\n transaction: Transaction\n): Promise<{ signature: string; status: string; confirmationStatus: string }> {\n validateSignerActive(signer, signerType);\n const messageBytes = transaction.serializeMessage();\n const storageOptions = getStorageOptions();\n const signatureBytes = await signWithSigner(\n walletId,\n signerId,\n signerType,\n messageBytes,\n storageOptions\n );\n const signerPublicKey = await getSignerPublicKey(walletId, signer, signerType, signerId);\n const signatureBuffer = Buffer.from(signatureBytes);\n transaction.addSignature(signerPublicKey, signatureBuffer);\n const signedTransactionBytes = transaction.serialize();\n const signedTransactionBase64 = Buffer.from(signedTransactionBytes).toString(\"base64\");\n return await submitSignedTransaction(walletId, signedTransactionBase64);\n}\n\nexport async function signTransactionWithSigner(\n walletId: string,\n signer: SignerData,\n transactionBuffer: Uint8Array\n): Promise<{ signature: string; signerType: string }> {\n const { signerType, signerId } = extractSignerInfo(signer);\n const storageOptions = getStorageOptions();\n\n if (signerType === SIGNER_TYPES.EMAIL) {\n validateSignerActive(signer, signerType);\n try {\n const signature = await signWithEmailSigner(walletId, signerId, transactionBuffer, storageOptions);\n return { signature: Buffer.from(signature).toString(\"hex\"), signerType: SIGNER_TYPES.EMAIL };\n } catch (error: unknown) {\n throw handleDeviceKeyError(error, SIGNER_TYPES.EMAIL);\n }\n }\n if (signerType === SIGNER_TYPES.PHONE) {\n validateSignerActive(signer, signerType);\n try {\n const signature = await signWithPhoneSigner(walletId, signerId, transactionBuffer, storageOptions);\n return { signature: Buffer.from(signature).toString(\"hex\"), signerType: SIGNER_TYPES.PHONE };\n } catch (error: unknown) {\n throw handleDeviceKeyError(error, SIGNER_TYPES.PHONE);\n }\n }\n if (signerType === SIGNER_TYPES.PASSKEY) {\n const { signWithPasskeySigner } = await import(\"cilantro-sdk/helpers\");\n const signature = await signWithPasskeySigner(walletId, signerId, transactionBuffer, {\n useBrowserAutofill: false,\n });\n return { signature: Buffer.from(signature).toString(\"hex\"), signerType: SIGNER_TYPES.PASSKEY };\n }\n if (signerType === SIGNER_TYPES.EXTERNAL || signerType === SIGNER_TYPES.API_KEY) {\n validateSignerActive(signer, signerType);\n const signature = await signWithSigner(\n walletId,\n signerId,\n signerType,\n transactionBuffer,\n storageOptions\n );\n return { signature: Buffer.from(signature).toString(\"hex\"), signerType };\n }\n throw new Error(`Unsupported signer type: ${signerType}`);\n}\n\n/** Result of sign-and-send; status is the SDK SubmitTransactionDataDto.status, confirmationStatus is the same for backward compat. */\nexport interface SignAndSendResult {\n signature: string;\n status: string;\n confirmationStatus: string;\n}\n\nexport async function signAndSendTransactionWithSigner(\n walletId: string,\n signer: SignerData,\n transaction: Transaction,\n connection?: SignAndSendConnection | null\n): Promise<SignAndSendResult> {\n const { signerType, signerId } = extractSignerInfo(signer);\n if (signerType === SIGNER_TYPES.PASSKEY) {\n return await handlePasskeyTransaction(walletId, signerId, transaction, connection);\n }\n if (signerType === SIGNER_TYPES.EMAIL || signerType === SIGNER_TYPES.PHONE) {\n return await handleEmailOrPhoneTransaction(walletId, signer, signerType, signerId, transaction);\n }\n if (signerType === SIGNER_TYPES.EXTERNAL || signerType === SIGNER_TYPES.API_KEY) {\n return await handleExternalOrApiKeyTransaction(walletId, signer, signerType, signerId, transaction);\n }\n throw new Error(`Unsupported signer type: ${signerType}`);\n}\n","import { PublicKey, Transaction } from \"@solana/web3.js\";\nimport type { SignerData } from \"../signer-helpers\";\nimport { extractErrorMessage } from \"../error-utils\";\nimport { getSignerPublicKey } from \"./core\";\nimport { extractSignerInfo } from \"./signer-types\";\n\nexport async function validateSignerInTransaction(\n signedTransactionBase64: string,\n expectedSignerPublicKey?: PublicKey | string\n): Promise<{\n isValid: boolean;\n transaction: Transaction;\n signers: Array<{\n publicKey: string;\n hasSignature: boolean;\n signatureLength: number;\n matchesExpected: boolean;\n }>;\n expectedSignerFound: boolean;\n allSignaturesValid: boolean;\n feePayer?: string;\n recentBlockhash?: string;\n errors: string[];\n warnings: string[];\n}> {\n const errors: string[] = [];\n const warnings: string[] = [];\n try {\n const transactionBuffer = Buffer.from(signedTransactionBase64, \"base64\");\n const transaction = Transaction.from(transactionBuffer);\n let allSignaturesValid = true;\n try {\n transaction.verifySignatures();\n } catch (error) {\n allSignaturesValid = false;\n errors.push(`Signature verification failed: ${extractErrorMessage(error)}`);\n }\n const signers = transaction.signatures.map((sig) => {\n const publicKeyStr = sig.publicKey.toString();\n const hasSignature = sig.signature !== null && sig.signature.length > 0;\n const signatureLength = sig.signature !== null ? sig.signature.length : 0;\n let matchesExpected = false;\n if (expectedSignerPublicKey) {\n const expectedPubkey =\n typeof expectedSignerPublicKey === \"string\"\n ? new PublicKey(expectedSignerPublicKey)\n : expectedSignerPublicKey;\n matchesExpected = sig.publicKey.equals(expectedPubkey);\n }\n if (!hasSignature) warnings.push(`Signer ${publicKeyStr} has no signature (unsigned)`);\n return { publicKey: publicKeyStr, hasSignature, signatureLength, matchesExpected };\n });\n let expectedSignerFound = false;\n if (expectedSignerPublicKey) {\n const expectedPubkey =\n typeof expectedSignerPublicKey === \"string\"\n ? new PublicKey(expectedSignerPublicKey)\n : expectedSignerPublicKey;\n expectedSignerFound = signers.some((s) => s.matchesExpected);\n if (!expectedSignerFound) {\n errors.push(`Expected signer ${expectedPubkey.toString()} not found in transaction signers`);\n }\n }\n if (expectedSignerFound && expectedSignerPublicKey) {\n const expectedSigner = signers.find((s) => s.matchesExpected);\n if (expectedSigner && !expectedSigner.hasSignature) {\n errors.push(\n `Expected signer ${\n typeof expectedSignerPublicKey === \"string\"\n ? expectedSignerPublicKey\n : expectedSignerPublicKey.toString()\n } is present but has no signature`\n );\n }\n }\n const isValid =\n allSignaturesValid && (expectedSignerPublicKey ? expectedSignerFound : true) && errors.length === 0;\n return {\n isValid,\n transaction,\n signers,\n expectedSignerFound,\n allSignaturesValid,\n feePayer: transaction.feePayer?.toString(),\n recentBlockhash: transaction.recentBlockhash ?? undefined,\n errors,\n warnings,\n };\n } catch (error) {\n errors.push(`Failed to deserialize transaction: ${extractErrorMessage(error)}`);\n throw new Error(\n `Transaction validation failed: ${errors.join(\"; \")}\\nOriginal error: ${extractErrorMessage(error)}`\n );\n }\n}\n\nexport async function validateSignerInTransactionWithSigner(\n walletId: string,\n signer: SignerData,\n signedTransactionBase64: string\n): Promise<\n Awaited<ReturnType<typeof validateSignerInTransaction>> & { expectedSignerPublicKey: string }\n> {\n const { signerType, signerId } = extractSignerInfo(signer);\n const expectedSignerPublicKey = await getSignerPublicKey(walletId, signer, signerType, signerId);\n const validationResult = await validateSignerInTransaction(\n signedTransactionBase64,\n expectedSignerPublicKey\n );\n return {\n ...validationResult,\n expectedSignerPublicKey: expectedSignerPublicKey.toString(),\n };\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport { findOne as findOneWallet } from \"cilantro-sdk/wallet\";\nimport type { WalletControllerFindOneResult } from \"cilantro-sdk/wallet\";\nimport { extractResponseData } from \"../types\";\n\n/** SDK wallet single response data (WalletSuccessResponseDto.data). */\nexport type WalletDataDtoFromFindOne = WalletControllerFindOneResult[\"data\"];\n\nexport async function getWalletData(walletId: string): Promise<{\n walletPublicKey: PublicKey;\n adminSignerPubkey: PublicKey;\n}> {\n const walletDataResponse: WalletControllerFindOneResult = await findOneWallet(walletId);\n const walletData = extractResponseData<WalletDataDtoFromFindOne>(walletDataResponse);\n if (!walletData) throw new Error(\"Wallet data is empty\");\n const address = String(walletData.walletAddress ?? \"\").trim();\n if (!address) throw new Error(\"No wallet address found (walletAddress is empty).\");\n const walletPublicKey = new PublicKey(address);\n const adminPubkey = String(walletData.adminSignerPubkey ?? \"\").trim();\n if (!adminPubkey) {\n throw new Error(\"adminSignerPubkey not found in wallet data.\");\n }\n const adminSignerPubkey = new PublicKey(adminPubkey);\n return { walletPublicKey, adminSignerPubkey };\n}\n"],"mappings":"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","names":["useEffect","jsx","platformApiKey","apiUrl","useEffect","createIndexedDBAdapter","useCallback","useMemo","useMemo","useMemo","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useCallback","isWebAuthnSupported","startPasskeyAuthentication","authenticateWithPasskey","formatAuthenticationResponse","useState","isWebAuthnSupported","useCallback","startPasskeyAuthentication","useState","useCallback","useEffect","useState","useCallback","useState","useCallback","useState","jsx","React","jsx","React","cva","jsx","cva","React","jsx","jsx","useState","useState","jsx","jsxs","useState","useState","React","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","useMemo","React","jsx","Fragment","jsx","jsxs","useMemo","jsx","jsxs","useState","jsx","jsxs","useState","useState","jsx","jsxs","useState","useState","jsx","jsxs","useState","useState","Fragment","jsx","jsxs","useState","Fragment","jsx","jsxs","useState","jsx","useState","useState","jsx","jsxs","useState","React","jsx","jsxs","jsxs","jsx","Fragment","jsx","jsxs","useState","jsx","jsxs","useState","useState","useEffect","jsx","jsxs","useState","useEffect","useState","jsx","jsxs","useState","useState","jsx","jsxs","useState","jsx","jsxs","useState","useEffect","jsx","useState","useEffect","useState","jsx","jsxs","useState","Fragment","jsx","jsxs","jsx","jsxs","React","Fragment","jsx","jsxs","PublicKey","PublicKey","deriveSignerKeypair","getEmailSignerKeypair","getPhoneSignerKeypair","getEmailSignerKeypair","getPhoneSignerKeypair","deriveSignerKeypair","signWithSigner","signWithEmailSigner","signWithPhoneSigner","PublicKey","PublicKey","signWithSigner","signWithEmailSigner","signWithPhoneSigner","signWithPasskeySigner","PublicKey","PublicKey"]}
|