cilantro-react 0.1.0 → 0.1.2

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/providers/CilantroProvider.tsx","../src/providers/CilantroAuthProvider.tsx","../src/core/auth.ts","../src/core/types.ts","../src/core/error-utils.ts","../src/providers/WalletProvider.tsx","../src/core/storage-adapter.ts","../src/hooks/useSigners.ts","../src/core/signer-helpers.ts","../src/hooks/useSignerSelection.ts","../src/hooks/useMessageSigning.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-creation.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","../src/hooks/useTransactionSigning.ts","../src/ui/select.tsx","../src/ui/cn.ts","../src/components/WalletSelector.tsx","../src/ui/button.tsx","../src/components/SignerSelector.tsx","../src/components/DelegatedKeySelector.tsx","../src/ui/textarea.tsx","../src/ui/label.tsx","../src/ui/card.tsx","../src/components/MessageSigningForm.tsx","../src/components/TransactionSigningForm.tsx","../src/components/LoginForm.tsx","../src/ui/input.tsx","../src/components/RegisterForm.tsx","../src/components/AuthForm.tsx","../src/components/AuthGuard.tsx","../src/components/AddSignerForm.tsx","../src/ui/dialog.tsx","../src/components/SignerList.tsx"],"sourcesContent":["\"use client\";\n\nimport { type ReactNode, useEffect } from \"react\";\nimport { CilantroAuthProvider } from \"./CilantroAuthProvider\";\nimport { WalletProvider } from \"./WalletProvider\";\nimport { initializeStorageAdapter } from \"../core/storage-adapter\";\n\nexport interface CilantroProviderProps {\n children: ReactNode;\n platformApiKey: string;\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}\n\nexport function CilantroProvider({\n children,\n platformApiKey,\n apiUrl,\n jwtStorageKey,\n walletStorageKey,\n onLoginSuccess,\n onLogout,\n onRegisterSuccess,\n}: CilantroProviderProps) {\n useEffect(() => {\n initializeStorageAdapter().catch((err) => {\n console.error(\"[CilantroProvider] Failed to initialize storage adapter:\", err);\n });\n }, []);\n\n return (\n <CilantroAuthProvider\n platformApiKey={platformApiKey}\n apiUrl={apiUrl}\n jwtStorageKey={jwtStorageKey}\n onLoginSuccess={onLoginSuccess}\n onLogout={onLogout}\n onRegisterSuccess={onRegisterSuccess}\n >\n <WalletProvider storageKey={walletStorageKey}>{children}</WalletProvider>\n </CilantroAuthProvider>\n );\n}\n","\"use client\";\n\nimport { createContext, type ReactNode, useContext, useEffect, useState } from \"react\";\nimport { clearAuth } from \"cilantro-sdk\";\nimport { login as cilantroLogin } from \"cilantro-sdk/auth\";\nimport { create as createUser } from \"cilantro-sdk/user\";\nimport { setAuthConfig, setSdkAuth, getPlatformApiKey } from \"../core/auth\";\nimport { extractResponseData } from \"../core/types\";\nimport { extractErrorMessage } from \"../core/error-utils\";\n\nexport interface User {\n username?: string;\n email?: string;\n userType?: string;\n}\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 isLoading: boolean;\n}\n\nconst AuthContext = createContext<CilantroAuthContextType | undefined>(undefined);\n\nconst DEFAULT_JWT_STORAGE_KEY = \"cilantro_jwt\";\n\nexport interface CilantroAuthProviderProps {\n children: ReactNode;\n platformApiKey: string;\n apiUrl?: string;\n jwtStorageKey?: string;\n onLoginSuccess?: () => void;\n onLogout?: () => void;\n onRegisterSuccess?: () => void;\n}\n\nexport function CilantroAuthProvider({\n children,\n platformApiKey,\n apiUrl,\n jwtStorageKey = DEFAULT_JWT_STORAGE_KEY,\n onLoginSuccess,\n onLogout,\n onRegisterSuccess,\n}: CilantroAuthProviderProps) {\n const [user, setUser] = useState<User | null>(null);\n const [token, setToken] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n setAuthConfig({ platformApiKey, apiUrl });\n setSdkAuth(null);\n const storedToken = typeof window !== \"undefined\" ? localStorage.getItem(jwtStorageKey) : null;\n if (storedToken) {\n setToken(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 parse errors\n }\n }\n setIsLoading(false);\n }, [platformApiKey, apiUrl, jwtStorageKey]);\n\n const login = async (usernameOrEmail: string, password: string) => {\n try {\n const result = await cilantroLogin({ usernameOrEmail, password });\n const responseData = extractResponseData<{ jwt?: string; userType?: string }>(result);\n if (!responseData?.jwt) throw new Error(\"No JWT token received from server\");\n const jwt = responseData.jwt;\n const userType = responseData.userType;\n setToken(jwt);\n setSdkAuth(jwt);\n if (typeof window !== \"undefined\") {\n localStorage.setItem(jwtStorageKey, jwt);\n document.cookie = `cilantro_jwt=${jwt}; path=/; max-age=${60 * 60 * 24 * 7}`;\n }\n try {\n const payload = JSON.parse(atob(jwt.split(\".\")[1]));\n setUser({\n username: payload.username,\n email: payload.email,\n userType: userType ?? payload.userType,\n });\n } catch {\n setUser({ userType: userType });\n }\n onLoginSuccess?.();\n } catch (error: unknown) {\n throw new Error(extractErrorMessage(error));\n }\n };\n\n const register = async (username: string, email: string, password: string, isActive = true) => {\n try {\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(username, password);\n onRegisterSuccess?.();\n } catch (error: unknown) {\n throw new Error(extractErrorMessage(error));\n }\n };\n\n const logout = () => {\n setUser(null);\n setToken(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 document.cookie = \"cilantro_jwt=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT\";\n }\n setSdkAuth(null);\n onLogout?.();\n };\n\n const value: CilantroAuthContextType = {\n user,\n token,\n isAuthenticated: !!token,\n login,\n register,\n logout,\n isLoading,\n };\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n}\n\nexport function useCilantroAuth(): CilantroAuthContextType {\n const context = useContext(AuthContext);\n if (context === undefined) {\n throw new Error(\"useCilantroAuth must be used within a CilantroAuthProvider\");\n }\n return context;\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 jwt?: string | null;\n}\n\n/**\n * Set SDK authentication config. Call with platformApiKey (and optional apiUrl) from provider/config.\n * Do not read process.env in library code.\n */\nexport function setAuthConfig(config: AuthConfig): void {\n platformApiKey = config.platformApiKey;\n apiUrl = 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 * 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","\"use client\";\n\nimport { createContext, type ReactNode, useContext, useEffect, useState } from \"react\";\nimport { useCilantroAuth } from \"./CilantroAuthProvider\";\nimport { setSdkAuth } from \"../core/auth\";\nimport { findAll as findAllWallets } from \"cilantro-sdk/wallet\";\nimport { extractResponseData } from \"../core/types\";\n\nexport interface WalletData {\n id: string;\n walletId: string;\n walletName?: string;\n address?: string;\n walletAddress?: string;\n chain?: string;\n active?: boolean;\n [key: string]: unknown;\n}\n\nexport interface WalletContextType {\n selectedWallet: WalletData | null;\n wallets: WalletData[];\n selectWallet: (walletId: string) => void;\n refreshWallets: () => Promise<void>;\n isLoading: boolean;\n}\n\nconst WalletContext = createContext<WalletContextType | undefined>(undefined);\n\nconst DEFAULT_STORAGE_KEY = \"cilantro_selected_wallet_id\";\n\nexport interface WalletProviderProps {\n children: ReactNode;\n storageKey?: string;\n}\n\nexport function WalletProvider({ children, storageKey = DEFAULT_STORAGE_KEY }: WalletProviderProps) {\n const { token } = useCilantroAuth();\n const [wallets, setWallets] = useState<WalletData[]>([]);\n const [selectedWallet, setSelectedWallet] = useState<WalletData | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n if (token) {\n loadWallets();\n } else {\n setWallets([]);\n setSelectedWallet(null);\n setIsLoading(false);\n }\n }, [token]);\n\n useEffect(() => {\n if (wallets.length > 0 && !selectedWallet) {\n const storedWalletId = typeof window !== \"undefined\" ? localStorage.getItem(storageKey) : null;\n if (storedWalletId) {\n const wallet = wallets.find((w) => w.id === storedWalletId || w.walletId === storedWalletId);\n if (wallet) {\n setSelectedWallet(wallet);\n } else {\n setSelectedWallet(wallets[0]);\n if (typeof window !== \"undefined\") localStorage.setItem(storageKey, wallets[0].id);\n }\n } else {\n if (wallets.length > 0) {\n setSelectedWallet(wallets[0]);\n if (typeof window !== \"undefined\") localStorage.setItem(storageKey, wallets[0].id);\n }\n }\n } else if (wallets.length === 0) {\n setSelectedWallet(null);\n if (typeof window !== \"undefined\") localStorage.removeItem(storageKey);\n }\n }, [wallets, storageKey]);\n\n const loadWallets = async () => {\n try {\n setIsLoading(true);\n if (token) setSdkAuth(token);\n const result = await findAllWallets();\n const walletsList = extractResponseData<unknown[]>(result) ?? [];\n const formattedWallets = Array.isArray(walletsList)\n ? walletsList.map((wallet: unknown) => {\n const w = wallet as Record<string, unknown>;\n return {\n id: String(w.walletId ?? w.id ?? \"\"),\n walletId: String(w.walletId ?? w.id ?? \"\"),\n walletName: (w.walletName as string) ?? \"\",\n address: (w.walletAddress ?? w.address) as string ?? \"\",\n walletAddress: (w.walletAddress ?? w.address) as string ?? \"\",\n chain: (w.chain as string) ?? \"solana\",\n active: (w.active as boolean) !== false,\n ...w,\n };\n })\n : [];\n setWallets(formattedWallets);\n } catch (error) {\n console.error(\"Failed to load wallets:\", error);\n setWallets([]);\n } finally {\n setIsLoading(false);\n }\n };\n\n const selectWallet = (walletId: string) => {\n const wallet = wallets.find((w) => w.id === walletId || w.walletId === walletId);\n if (wallet) {\n setSelectedWallet(wallet);\n if (typeof window !== \"undefined\") localStorage.setItem(storageKey, wallet.id);\n }\n };\n\n const refreshWallets = async () => {\n await loadWallets();\n };\n\n const value: WalletContextType = {\n selectedWallet,\n wallets,\n selectWallet,\n refreshWallets,\n isLoading,\n };\n\n return <WalletContext.Provider value={value}>{children}</WalletContext.Provider>;\n}\n\nexport function useWallets(): WalletContextType {\n const context = useContext(WalletContext);\n if (context === undefined) {\n throw new Error(\"useWallets must be used within a WalletProvider\");\n }\n return context;\n}\n","import { createIndexedDBAdapter } from \"cilantro-sdk/helpers\";\n\nexport type DeviceKeyStorage = ReturnType<typeof createIndexedDBAdapter>;\n\nlet storageAdapterInstance: DeviceKeyStorage | null = null;\nlet initializationPromise: Promise<DeviceKeyStorage> | null = null;\n\nexport async function initializeStorageAdapter(): Promise<DeviceKeyStorage> {\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 (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","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { useCilantroAuth } from \"../providers/CilantroAuthProvider\";\nimport { setSdkAuth } from \"../core/auth\";\nimport { loadSigners, type SignerData } from \"../core/signer-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}\n\nexport function useSigners(options: UseSignersOptions = {}): UseSignersResult {\n const { walletId: walletIdOption } = options;\n const { token } = useCilantroAuth();\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(async (walletId: string) => {\n if (!walletId) {\n setSigners([]);\n return;\n }\n setIsLoading(true);\n setError(null);\n try {\n if (token) setSdkAuth(token);\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 }, [token]);\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 return { signers, isLoading, error, refresh };\n}\n","import { getSigners, parseSignerResponse, type SignerInfo } from \"cilantro-sdk/helpers\";\nimport { listSigners } from \"cilantro-sdk/wallet\";\nimport { extractOnChainSigners, extractAuthenticationSigners } from \"./types\";\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\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","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { useWallets } from \"../providers/WalletProvider\";\nimport { useSigners } from \"./useSigners\";\nimport type { SignerData } from \"../core/signer-helpers\";\n\nexport type SigningMethod = \"wallet-adapter\" | \"sdk-signer\";\n\nexport interface UseSignerSelectionOptions {\n /** Override wallet ID; if not set, uses selected wallet from WalletProvider */\n walletId?: string | null;\n /** Current signing method */\n signingMethod?: SigningMethod | null;\n}\n\nexport interface UseSignerSelectionResult {\n selectedWalletId: string;\n setSelectedWalletId: (id: string) => void;\n availableSigners: SignerData[];\n selectedSigner: SignerData | null;\n setSelectedSigner: (signer: SignerData | null) => void;\n isLoadingSigners: boolean;\n reset: () => void;\n}\n\nexport function useSignerSelection(options: UseSignerSelectionOptions = {}): UseSignerSelectionResult {\n const { walletId: walletIdOverride, signingMethod = \"sdk-signer\" } = options;\n const { selectedWallet } = useWallets();\n const effectiveWalletId = walletIdOverride ?? selectedWallet?.id ?? selectedWallet?.walletId ?? \"\";\n const { signers: availableSigners, isLoading: isLoadingSigners } = useSigners({\n walletId: effectiveWalletId || null,\n });\n const [selectedWalletId, setSelectedWalletId] = useState(effectiveWalletId);\n const [selectedSigner, setSelectedSigner] = useState<SignerData | null>(null);\n\n useEffect(() => {\n setSelectedWalletId(effectiveWalletId);\n }, [effectiveWalletId]);\n\n useEffect(() => {\n if (signingMethod !== \"sdk-signer\") {\n setSelectedSigner(null);\n }\n }, [signingMethod]);\n\n const reset = useCallback(() => {\n setSelectedWalletId(\"\");\n setSelectedSigner(null);\n }, []);\n\n return {\n selectedWalletId: selectedWalletId || effectiveWalletId,\n setSelectedWalletId,\n availableSigners,\n selectedSigner,\n setSelectedSigner,\n isLoadingSigners,\n reset,\n };\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { setSdkAuth } from \"../core/auth\";\nimport { extractErrorMessage } from \"../core/error-utils\";\nimport { signMessageWithSigner } from \"../core/signer-signing\";\nimport { extractSignerInfo } from \"../core/signer-helpers\";\nimport type { SignerData } from \"../core/signer-helpers\";\nimport type { SigningMethod } from \"./useSignerSelection\";\nimport type { ActionState } from \"../core/types\";\n\nexport interface UseMessageSigningOptions {\n token: string | null;\n signingMethod: SigningMethod | null;\n selectedSigner: SignerData | null;\n selectedWalletId: string;\n /** Optional: callback when using wallet-adapter; signMessage(encodedMessage) => signature bytes */\n walletAdapterSignMessage?: (message: Uint8Array) => Promise<Uint8Array>;\n /** Optional: public key when using wallet-adapter (for result) */\n walletAdapterPublicKey?: string | null;\n}\n\nexport interface UseMessageSigningResult {\n messageText: string;\n setMessageText: (text: string) => void;\n signResultState: ActionState;\n isSigning: boolean;\n handleSign: () => Promise<void>;\n reset: () => void;\n}\n\nexport function useMessageSigning(options: UseMessageSigningOptions): UseMessageSigningResult {\n const {\n token,\n signingMethod,\n selectedSigner,\n selectedWalletId,\n walletAdapterSignMessage,\n walletAdapterPublicKey,\n } = options;\n const [messageText, setMessageText] = useState(\"Hello, Solana!\");\n const [signResultState, setSignResultState] = useState<ActionState>({ status: \"idle\" });\n const [isSigning, setIsSigning] = useState(false);\n\n const handleSign = async () => {\n setIsSigning(true);\n setSignResultState({ status: \"loading\" });\n try {\n if (token) setSdkAuth(token);\n if (!messageText.trim()) throw new Error(\"Please enter a message to sign.\");\n\n if (signingMethod === \"wallet-adapter\") {\n if (!walletAdapterSignMessage) {\n throw new Error(\"Wallet adapter signMessage not provided.\");\n }\n const message = new TextEncoder().encode(messageText);\n const signature = await walletAdapterSignMessage(message);\n setSignResultState({\n status: \"success\",\n message: \"Message signed successfully!\",\n detail: {\n message: messageText,\n signature: Array.from(signature)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\"),\n publicKey: walletAdapterPublicKey ?? undefined,\n },\n });\n return;\n }\n\n if (!selectedSigner || !selectedWalletId) throw new Error(\"Please select a signer.\");\n const result = await signMessageWithSigner(selectedWalletId, selectedSigner, messageText);\n const { signerType } = extractSignerInfo(selectedSigner);\n setSignResultState({\n status: \"success\",\n message: `Message signed successfully with ${signerType} signer!`,\n detail: { message: messageText, ...result },\n });\n } catch (error: unknown) {\n const errorMsg = extractErrorMessage(error);\n const isCancelled =\n errorMsg.toLowerCase().includes(\"cancel\") || errorMsg.toLowerCase().includes(\"notallowederror\");\n setSignResultState({\n status: \"error\",\n message: isCancelled ? \"User cancelled authentication\" : errorMsg,\n });\n } finally {\n setIsSigning(false);\n }\n };\n\n const reset = () => {\n setMessageText(\"Hello, Solana!\");\n setSignResultState({ status: \"idle\" });\n };\n\n return {\n messageText,\n setMessageText,\n signResultState,\n isSigning,\n handleSign,\n reset,\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\nexport async function signMessageWithSigner(\n walletId: string,\n signer: SignerData,\n messageText: string\n): Promise<{\n signature: string;\n publicKey?: string;\n signerType: string;\n signer?: string;\n}> {\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 signature = await signWithEmailSigner(walletId, signerId, message, storageOptions);\n const keypair = await getEmailSignerKeypair(walletId, signerId, storageOptions);\n return {\n signature: Buffer.from(signature).toString(\"hex\"),\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 signature = await signWithPhoneSigner(walletId, signerId, message, storageOptions);\n const keypair = await getPhoneSignerKeypair(walletId, signerId, storageOptions);\n return {\n signature: Buffer.from(signature).toString(\"hex\"),\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 return {\n signature: signResult.signature,\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 signature = await signWithSigner(walletId, signerId, signerType, message, storageOptions);\n const keypair = await deriveSignerKeypair(walletId, signerId, signerType, storageOptions);\n return {\n signature: Buffer.from(signature).toString(\"hex\"),\n publicKey: Buffer.from(keypair.publicKey).toString(\"base64\"),\n signerType,\n };\n }\n\n throw new Error(`Unsupported signer type: ${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 { sendRawPasskeyTransaction } 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\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 = (await startPasskeyAuthentication(walletId, {\n credentialId: options?.credentialId,\n })) as WalletControllerStartPasskeyAuthenticationResult;\n const authData = extractResponseData(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 = await sendRawPasskeyTransaction(dto);\n const resultData = extractResponseData<{ signature?: string; status?: string }>(result);\n return { signature: resultData?.signature ?? \"\", status: resultData?.status };\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 { 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\nasync function submitSignedTransaction(\n walletId: string,\n signedTransactionBase64: string\n): Promise<{ signature: string; confirmationStatus: string }> {\n const submitResult = await submitTransaction(walletId, {\n signedTransaction: signedTransactionBase64,\n });\n const resultData = extractResponseData<{ signature?: string; status?: string }>(submitResult);\n if (!resultData?.signature) throw new Error(\"Server did not return a transaction signature\");\n return {\n signature: resultData.signature,\n confirmationStatus: resultData.status === \"confirmed\" ? \"confirmed\" : \"pending\",\n };\n}\n\nasync function handlePasskeyTransaction(\n walletId: string,\n signerId: string,\n transaction: Transaction,\n connection: SignAndSendConnection | null | undefined\n): Promise<{ signature: 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 confirmationStatus = \"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 confirmationStatus = \"pending\";\n } else {\n throw new Error(`Transaction confirmation failed: ${errorMsg}. Signature: ${result.signature}`);\n }\n }\n return { signature: result.signature, confirmationStatus };\n}\n\nasync function handleEmailOrPhoneTransaction(\n walletId: string,\n signer: SignerData,\n signerType: SignerType,\n signerId: string,\n transaction: Transaction\n): Promise<{ signature: 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; 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\nexport async function signAndSendTransactionWithSigner(\n walletId: string,\n signer: SignerData,\n transaction: Transaction,\n connection?: SignAndSendConnection | null\n): Promise<{ signature: string; confirmationStatus: string }> {\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 { extractResponseData } from \"../types\";\n\nexport async function getWalletData(walletId: string): Promise<{\n walletPublicKey: PublicKey;\n adminSignerPubkey: PublicKey;\n}> {\n const walletDataResponse = await findOneWallet(walletId);\n const walletData = extractResponseData<Record<string, unknown>>(walletDataResponse);\n if (!walletData) throw new Error(\"Wallet data is empty\");\n const address = String(\n walletData.address ??\n walletData.walletAddress ??\n walletData.solanaAddress ??\n walletData.publicKey ??\n walletData.pubkey ??\n \"\"\n ).trim();\n if (!address) throw new Error(`No wallet address found. Available fields: ${Object.keys(walletData).join(\", \")}`);\n const walletPublicKey = new PublicKey(address);\n const adminData = walletData.admin as Record<string, unknown> | undefined;\n const adminPubkey = String(\n walletData.adminSignerPubkey ?? walletData.adminSigner ?? adminData?.publicKey ?? \"\"\n ).trim();\n if (!adminPubkey) {\n throw new Error(\n `adminSignerPubkey not found in wallet data. Available fields: ${Object.keys(walletData).join(\", \")}`\n );\n }\n const adminSignerPubkey = new PublicKey(adminPubkey);\n return { walletPublicKey, adminSignerPubkey };\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport type { Transaction } from \"@solana/web3.js\";\nimport { setSdkAuth } from \"../core/auth\";\nimport { extractErrorMessage } from \"../core/error-utils\";\nimport {\n signTransactionWithSigner,\n signAndSendTransactionWithSigner,\n getSignerPublicKey,\n getWalletData,\n} from \"../core/signer-signing\";\nimport { extractSignerInfo } from \"../core/signer-helpers\";\nimport type { SignerData } from \"../core/signer-helpers\";\nimport type { SigningMethod } from \"./useSignerSelection\";\nimport type { ActionState } from \"../core/types\";\n\nexport interface UseTransactionSigningOptions {\n token: string | null;\n signingMethod: SigningMethod | null;\n selectedSigner: SignerData | null;\n selectedWalletId: string;\n /** Optional: wallet-adapter signTransaction(transaction) => signed transaction */\n walletAdapterSignTransaction?: (transaction: Transaction) => Promise<Transaction>;\n /** Optional: wallet-adapter public key (for building/sending) */\n walletAdapterPublicKey?: string | null;\n /** Optional: connection for sending (e.g. from @solana/web3.js). Used for wallet-adapter send. */\n connection?: { sendRawTransaction: (buf: Buffer) => Promise<string>; getLatestBlockhash: () => Promise<{ blockhash: string; lastValidBlockHeight: number }>; confirmTransaction: (opts: { signature: string; blockhash: string; lastValidBlockHeight: number }) => Promise<void> } | null;\n}\n\nexport interface UseTransactionSigningResult {\n transactionResultState: ActionState;\n isSigningTransaction: boolean;\n isSendingTransaction: boolean;\n signTransaction: (transaction: Transaction) => Promise<void>;\n signAndSendTransaction: (transaction: Transaction) => Promise<void>;\n reset: () => void;\n}\n\nexport function useTransactionSigning(\n options: UseTransactionSigningOptions\n): UseTransactionSigningResult {\n const {\n token,\n signingMethod,\n selectedSigner,\n selectedWalletId,\n walletAdapterSignTransaction,\n walletAdapterPublicKey,\n connection,\n } = options;\n const [transactionResultState, setTransactionResultState] = useState<ActionState>({ status: \"idle\" });\n const [isSigningTransaction, setIsSigningTransaction] = useState(false);\n const [isSendingTransaction, setIsSendingTransaction] = useState(false);\n\n const signTransaction = async (transaction: Transaction) => {\n setIsSigningTransaction(true);\n setTransactionResultState({ status: \"loading\" });\n try {\n if (token) setSdkAuth(token);\n if (signingMethod === \"wallet-adapter\") {\n if (!walletAdapterSignTransaction || !walletAdapterPublicKey) {\n throw new Error(\"Wallet adapter signTransaction or publicKey not provided.\");\n }\n const signed = await walletAdapterSignTransaction(transaction);\n setTransactionResultState({\n status: \"success\",\n message: \"Transaction signed successfully!\",\n detail: { transaction: signed.serialize().toString(\"base64\") },\n });\n return;\n }\n if (!selectedSigner || !selectedWalletId) throw new Error(\"Please select a signer.\");\n const { signerId, signerType } = extractSignerInfo(selectedSigner);\n if (signerType === \"passkey\") {\n throw new Error(\"Passkey signers cannot be used for sign-only. Use sign-and-send instead.\");\n }\n const transactionBuffer = transaction.serializeMessage();\n const result = await signTransactionWithSigner(\n selectedWalletId,\n selectedSigner,\n transactionBuffer\n );\n setTransactionResultState({\n status: \"success\",\n message: `Transaction signed with ${signerType} signer!`,\n detail: { ...result },\n });\n } catch (error: unknown) {\n const errorMsg = extractErrorMessage(error);\n const isCancelled =\n errorMsg.toLowerCase().includes(\"cancel\") || errorMsg.toLowerCase().includes(\"notallowederror\");\n setTransactionResultState({\n status: \"error\",\n message: isCancelled ? \"User cancelled authentication\" : errorMsg,\n });\n } finally {\n setIsSigningTransaction(false);\n }\n };\n\n const signAndSendTransaction = async (transaction: Transaction) => {\n setIsSendingTransaction(true);\n setTransactionResultState({ status: \"loading\" });\n try {\n if (token) setSdkAuth(token);\n if (signingMethod === \"wallet-adapter\") {\n if (!walletAdapterSignTransaction || !walletAdapterPublicKey || !connection) {\n throw new Error(\"Wallet adapter signTransaction, publicKey, or connection not provided.\");\n }\n const signed = await walletAdapterSignTransaction(transaction);\n const { blockhash, lastValidBlockHeight } = await connection.getLatestBlockhash();\n const signature = await connection.sendRawTransaction(Buffer.from(signed.serialize()));\n await connection.confirmTransaction({ signature, blockhash, lastValidBlockHeight });\n setTransactionResultState({\n status: \"success\",\n message: \"Transaction sent successfully!\",\n detail: { signature, explorerUrl: `https://solscan.io/tx/${signature}?cluster=devnet` },\n });\n return;\n }\n if (!selectedSigner || !selectedWalletId) throw new Error(\"Please select a signer.\");\n const { signerType } = extractSignerInfo(selectedSigner);\n const result = await signAndSendTransactionWithSigner(\n selectedWalletId,\n selectedSigner,\n transaction,\n connection ?? undefined\n );\n setTransactionResultState({\n status: \"success\",\n message: `Transaction sent with ${signerType} signer!`,\n detail: {\n signature: result.signature,\n confirmationStatus: result.confirmationStatus,\n explorerUrl: `https://solscan.io/tx/${result.signature}?cluster=devnet`,\n },\n });\n } catch (error: unknown) {\n const errorMsg = extractErrorMessage(error);\n const isCancelled =\n errorMsg.toLowerCase().includes(\"cancel\") || errorMsg.toLowerCase().includes(\"notallowederror\");\n setTransactionResultState({\n status: \"error\",\n message: isCancelled ? \"User cancelled transaction\" : errorMsg,\n detail: { error: errorMsg, walletId: selectedWalletId },\n });\n } finally {\n setIsSendingTransaction(false);\n }\n };\n\n const reset = () => {\n setTransactionResultState({ status: \"idle\" });\n };\n\n return {\n transactionResultState,\n isSigningTransaction,\n isSendingTransaction,\n signTransaction,\n signAndSendTransaction,\n reset,\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","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 { 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 { cn } from \"../ui/cn\";\n\nexport interface WalletSelectorClassNames {\n root?: string;\n trigger?: string;\n content?: string;\n item?: string;\n}\n\nexport interface WalletSelectorProps {\n value?: string;\n onWalletChange?: (walletId: string, wallet: WalletData | null) => void;\n className?: string;\n classNames?: WalletSelectorClassNames;\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 onWalletChange,\n className,\n classNames,\n placeholder = \"Select a wallet\",\n renderTrigger,\n renderList,\n children,\n } = props;\n const { wallets, selectedWallet, selectWallet, isLoading, refreshWallets } = useWallets();\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 selectWallet(wallet.id);\n onWalletChange?.(wallet.id, wallet);\n };\n\n const handleValueChange = (id: string) => {\n selectWallet(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 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 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 <SelectItem key={w.id} value={w.id} className={classNames?.item}>\n {w.walletName || w.id}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\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 },\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","\"use client\";\n\nimport type { SignerData } from \"../core/signer-helpers\";\nimport { getSignerDisplayName, getSignerTypeLabel, getSignerUniqueId } from \"../core/signer-helpers\";\nimport { Button } from \"../ui/button\";\nimport { cn } from \"../ui/cn\";\n\nexport interface SignerSelectorClassNames {\n root?: string;\n list?: string;\n item?: string;\n message?: string;\n}\n\nexport interface SignerSelectorProps {\n /** Wallet ID (signers are loaded for this wallet when used with useSigners) */\n selectedWalletId?: string;\n /** Available signers (from useSigners or useSignerSelection) */\n availableSigners: SignerData[];\n /** Currently selected signer */\n selectedSigner: SignerData | null;\n /** Loading state */\n isLoadingSigners?: boolean;\n /** Callback when user selects a signer */\n onSignerSelect: (signer: SignerData) => void;\n /** Root class */\n className?: string;\n /** Override class names for sub-elements */\n classNames?: SignerSelectorClassNames;\n /** Custom list render (headless) */\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 render props */\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 selectedWalletId,\n availableSigners,\n selectedSigner,\n isLoadingSigners = false,\n onSignerSelect,\n className,\n classNames,\n renderList,\n children,\n}: SignerSelectorProps) {\n if (!selectedWalletId) return null;\n\n if (children) {\n return (\n <>{children({ signers: availableSigners, selectedSigner, onSignerSelect, isLoading: isLoadingSigners })}</>\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,\n onSelect: onSignerSelect,\n isLoading: isLoadingSigners,\n getSignerDisplayName,\n getSignerTypeLabel,\n getSignerUniqueId,\n })}\n </div>\n );\n }\n\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-signer-selector role=\"listbox\" aria-label=\"Select signer\">\n {isLoadingSigners ? (\n <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>Loading signers...</p>\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={() => onSignerSelect(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, useEffect, useCallback } from \"react\";\nimport { findAll } from \"cilantro-sdk/delegated-keys\";\nimport { setSdkAuth } from \"../core/auth\";\nimport { extractResponseData } from \"../core/types\";\nimport { useCilantroAuth } from \"../providers/CilantroAuthProvider\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../ui/select\";\nimport { cn } from \"../ui/cn\";\n\nexport interface DelegatedKeyData {\n id: string;\n walletId: string;\n name?: string;\n publicKey: string;\n permissions: Record<string, unknown>;\n isActive?: boolean;\n createdAt?: string;\n expiresAt?: string;\n [key: string]: unknown;\n}\n\nexport interface DelegatedKeySelectorClassNames {\n root?: string;\n trigger?: string;\n content?: string;\n item?: string;\n message?: string;\n}\n\nexport interface DelegatedKeySelectorProps {\n walletId: string;\n value?: string;\n onChange?: (delegatedKeyId: string, key: DelegatedKeyData | null) => void;\n filterActive?: boolean;\n className?: string;\n classNames?: DelegatedKeySelectorClassNames;\n placeholder?: string;\n children?: (props: {\n keys: DelegatedKeyData[];\n selectedKeyId: string | undefined;\n onSelect: (key: DelegatedKeyData) => void;\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n }) => React.ReactNode;\n}\n\nexport function DelegatedKeySelector(props: DelegatedKeySelectorProps) {\n const {\n walletId,\n value,\n onChange,\n filterActive = true,\n className,\n classNames,\n placeholder = \"Select a delegated key\",\n children,\n } = props;\n const { token } = useCilantroAuth();\n const [keys, setKeys] = useState<DelegatedKeyData[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const loadKeys = useCallback(async () => {\n if (!walletId) {\n setKeys([]);\n return;\n }\n setIsLoading(true);\n setError(null);\n try {\n if (token) setSdkAuth(token);\n const result = await findAll(walletId);\n const keysData = extractResponseData<unknown[]>(result) ?? [];\n const list = Array.isArray(keysData) ? keysData : [];\n let loaded = list\n .filter((k): k is Record<string, unknown> => k != null && typeof k === \"object\" && \"id\" in k)\n .map((k) => ({\n id: String(k.id ?? \"\"),\n walletId: String(k.walletId ?? \"\"),\n name: k.name as string | undefined,\n publicKey: String(k.publicKey ?? \"\"),\n permissions: (k.permissions as Record<string, unknown>) ?? {},\n isActive: (k.isActive as boolean) !== false,\n createdAt: k.createdAt as string | undefined,\n expiresAt: k.expiresAt as string | undefined,\n ...k,\n })) as DelegatedKeyData[];\n if (filterActive) {\n const now = Date.now();\n loaded = loaded.filter((key) => {\n if (!key.isActive) return false;\n const exp = key.expiresAt ? new Date(key.expiresAt).getTime() : null;\n return exp === null || exp > now;\n });\n }\n setKeys(loaded);\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n setKeys([]);\n } finally {\n setIsLoading(false);\n }\n }, [walletId, token, filterActive]);\n\n useEffect(() => {\n loadKeys();\n }, [loadKeys]);\n\n const onSelect = (key: DelegatedKeyData) => {\n onChange?.(key.id, key);\n };\n\n const handleValueChange = (id: string) => {\n const key = keys.find((k) => k.id === id) ?? null;\n onChange?.(id, key);\n };\n\n if (children) {\n return (\n <>\n {children({ keys, selectedKeyId: value, onSelect, isLoading, error, refresh: loadKeys })}\n </>\n );\n }\n\n if (!walletId) {\n return (\n <div className={cn(className, classNames?.root, \"text-sm text-muted-foreground\")}>\n Select a wallet first\n </div>\n );\n }\n\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-delegated-key-selector>\n {isLoading ? (\n <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>Loading delegated keys...</p>\n ) : error ? (\n <p className={cn(\"text-sm text-destructive\", classNames?.message)} role=\"alert\">\n {error}\n </p>\n ) : keys.length === 0 ? (\n <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>No delegated keys found.</p>\n ) : (\n <Select value={(value ?? \"\") || undefined} onValueChange={handleValueChange}>\n <SelectTrigger className={classNames?.trigger} aria-label=\"Select delegated key\">\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent className={classNames?.content}>\n {keys.map((k) => (\n <SelectItem key={k.id} value={k.id} className={classNames?.item}>\n {k.name || k.publicKey.slice(0, 8) + \"...\"}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"./cn\";\n\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, ...props }, ref) => (\n <textarea\n className={cn(\n \"flex min-h-[80px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm ring-offset-background 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);\nTextarea.displayName = \"Textarea\";\n\nexport { Textarea };\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 { useMessageSigning } from \"../hooks/useMessageSigning\";\nimport { useCilantroAuth } from \"../providers/CilantroAuthProvider\";\nimport { useSignerSelection } from \"../hooks/useSignerSelection\";\nimport { getSignerDisplayName, getSignerTypeLabel } from \"../core/signer-helpers\";\nimport type { ActionState } from \"../core/types\";\nimport { Button } from \"../ui/button\";\nimport { Textarea } from \"../ui/textarea\";\nimport { Label } from \"../ui/label\";\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"../ui/card\";\nimport { cn } from \"../ui/cn\";\n\nexport interface MessageSigningFormClassNames {\n root?: string;\n header?: string;\n title?: string;\n description?: string;\n context?: string;\n label?: string;\n textarea?: string;\n charCount?: string;\n button?: string;\n resetButton?: string;\n result?: string;\n resultSuccess?: string;\n resultError?: string;\n resultPre?: string;\n}\n\nexport interface MessageSigningFormProps {\n /** Optional: override token (default: from useCilantroAuth) */\n token?: string | null;\n /** Optional: override wallet/signer (default: from useSignerSelection) */\n selectedWalletId?: string;\n selectedSigner?: import(\"../core/signer-helpers\").SignerData | null;\n signingMethod?: import(\"../hooks/useSignerSelection\").SigningMethod | null;\n /** Optional: wallet-adapter sign message (when signingMethod === \"wallet-adapter\") */\n walletAdapterSignMessage?: (message: Uint8Array) => Promise<Uint8Array>;\n walletAdapterPublicKey?: string | null;\n /** Root class */\n className?: string;\n /** Override class names for sub-elements */\n classNames?: MessageSigningFormClassNames;\n /** Show wallet/signer context above the form (default: true when wallet/signer selected) */\n showContext?: boolean;\n /** Show character count below textarea (default: false) */\n showCharCount?: boolean;\n /** Headless: render form content */\n children?: (props: {\n messageText: string;\n setMessageText: (text: string) => void;\n signResultState: ActionState;\n isSigning: boolean;\n handleSign: () => Promise<void>;\n reset: () => void;\n }) => React.ReactNode;\n}\n\nexport function MessageSigningForm({\n token: tokenOverride,\n selectedWalletId: walletIdOverride,\n selectedSigner: signerOverride,\n signingMethod: methodOverride,\n walletAdapterSignMessage,\n walletAdapterPublicKey,\n className,\n classNames,\n showContext = true,\n showCharCount = false,\n children,\n}: MessageSigningFormProps) {\n const { token: contextToken } = useCilantroAuth();\n const token = tokenOverride ?? contextToken;\n const selection = useSignerSelection({\n signingMethod: methodOverride ?? \"sdk-signer\",\n walletId: walletIdOverride,\n });\n const selectedWalletId = walletIdOverride ?? selection.selectedWalletId;\n const selectedSigner = signerOverride ?? selection.selectedSigner;\n const signingMethod = methodOverride ?? \"sdk-signer\";\n\n const signing = useMessageSigning({\n token,\n signingMethod,\n selectedSigner,\n selectedWalletId,\n walletAdapterSignMessage,\n walletAdapterPublicKey,\n });\n\n if (children) {\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-message-signing-form>\n {children({\n messageText: signing.messageText,\n setMessageText: signing.setMessageText,\n signResultState: signing.signResultState,\n isSigning: signing.isSigning,\n handleSign: signing.handleSign,\n reset: signing.reset,\n })}\n </div>\n );\n }\n\n const resultStatus = signing.signResultState.status;\n const isSuccess = resultStatus === \"success\";\n const isError = resultStatus === \"error\";\n\n return (\n <Card className={cn(className, classNames?.root)} data-cilantro-message-signing-form>\n <CardHeader className={classNames?.header}>\n <CardTitle className={cn(\"text-lg\", classNames?.title)}>Sign message</CardTitle>\n <CardDescription className={classNames?.description}>\n Sign a message with your selected wallet or signer. The signature proves you control the key.\n </CardDescription>\n {showContext && (selectedWalletId || selectedSigner) && (\n <p className={cn(\"mt-1 text-xs text-muted-foreground\", classNames?.context)}>\n {selectedWalletId && <span>Wallet: {selectedWalletId.slice(0, 8)}…</span>}\n {selectedSigner && (\n <span className={selectedWalletId ? \" ml-2\" : \"\"}>\n Signer: {getSignerDisplayName(selectedSigner)} ({getSignerTypeLabel(selectedSigner.type || selectedSigner.signerType || \"\")})\n </span>\n )}\n </p>\n )}\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-message-text\" className={classNames?.label}>\n Message\n </Label>\n <Textarea\n id=\"cilantro-message-text\"\n className={classNames?.textarea}\n value={signing.messageText}\n onChange={(e) => signing.setMessageText(e.target.value)}\n placeholder=\"Enter the message you want to sign...\"\n rows={4}\n />\n {showCharCount && (\n <p className={cn(\"text-right text-xs text-muted-foreground\", classNames?.charCount)}>\n {signing.messageText.length} character{signing.messageText.length !== 1 ? \"s\" : \"\"}\n </p>\n )}\n </div>\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center\">\n <Button\n type=\"button\"\n className={cn(\"w-full sm:w-auto\", classNames?.button)}\n onClick={signing.handleSign}\n disabled={signing.isSigning || !signing.messageText.trim()}\n >\n {signing.isSigning ? \"Signing...\" : \"Sign message\"}\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n className={cn(\"w-full sm:w-auto\", classNames?.resetButton)}\n onClick={signing.reset}\n disabled={signing.isSigning}\n >\n Clear\n </Button>\n </div>\n {resultStatus !== \"idle\" && (\n <div\n className={cn(\n \"rounded-lg border px-3 py-2 text-sm\",\n isSuccess && cn(\"border-green-500/50 bg-green-500/10 text-green-700 dark:text-green-400\", classNames?.resultSuccess),\n isError && cn(\"border-destructive/50 bg-destructive/10 text-destructive\", classNames?.resultError),\n resultStatus === \"loading\" && \"border-muted bg-muted/50 text-muted-foreground\",\n classNames?.result\n )}\n data-status={resultStatus}\n >\n {signing.signResultState.message}\n {signing.signResultState.detail != null && (\n <pre className={cn(\"mt-2 overflow-auto rounded-md bg-muted/80 p-2 text-xs\", classNames?.resultPre)}>\n {JSON.stringify(signing.signResultState.detail, null, 2)}\n </pre>\n )}\n </div>\n )}\n </CardContent>\n </Card>\n );\n}\n","\"use client\";\n\nimport type { Transaction } from \"@solana/web3.js\";\nimport { useTransactionSigning } from \"../hooks/useTransactionSigning\";\nimport { useCilantroAuth } from \"../providers/CilantroAuthProvider\";\nimport { useSignerSelection } from \"../hooks/useSignerSelection\";\nimport { getSignerDisplayName, getSignerTypeLabel } from \"../core/signer-helpers\";\nimport type { ActionState } from \"../core/types\";\nimport { Button } from \"../ui/button\";\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"../ui/card\";\nimport { cn } from \"../ui/cn\";\n\nexport interface TransactionSigningFormClassNames {\n root?: string;\n header?: string;\n title?: string;\n description?: string;\n context?: string;\n button?: string;\n result?: string;\n resultSuccess?: string;\n resultError?: string;\n resultPre?: string;\n}\n\nexport interface TransactionSigningFormProps {\n token?: string | null;\n selectedWalletId?: string;\n selectedSigner?: import(\"../core/signer-helpers\").SignerData | null;\n signingMethod?: import(\"../hooks/useSignerSelection\").SigningMethod | null;\n walletAdapterSignTransaction?: (tx: Transaction) => Promise<Transaction>;\n walletAdapterPublicKey?: string | null;\n connection?: {\n sendRawTransaction: (buf: Buffer) => Promise<string>;\n getLatestBlockhash: () => Promise<{ blockhash: string; lastValidBlockHeight: number }>;\n confirmTransaction: (opts: { signature: string; blockhash: string; lastValidBlockHeight: number }) => Promise<void>;\n } | null;\n className?: string;\n classNames?: TransactionSigningFormClassNames;\n /** Show wallet/signer context above the form (default: true when wallet/signer selected) */\n showContext?: boolean;\n /** Headless: render content; consumer builds transaction and calls signTransaction(tx) / signAndSendTransaction(tx) */\n children?: (props: {\n transactionResultState: ActionState;\n isSigningTransaction: boolean;\n isSendingTransaction: boolean;\n signTransaction: (transaction: Transaction) => Promise<void>;\n signAndSendTransaction: (transaction: Transaction) => Promise<void>;\n reset: () => void;\n }) => React.ReactNode;\n}\n\nexport function TransactionSigningForm({\n token: tokenOverride,\n selectedWalletId: walletIdOverride,\n selectedSigner: signerOverride,\n signingMethod: methodOverride,\n walletAdapterSignTransaction,\n walletAdapterPublicKey,\n connection,\n className,\n classNames,\n showContext = true,\n children,\n}: TransactionSigningFormProps) {\n const { token: contextToken } = useCilantroAuth();\n const token = tokenOverride ?? contextToken;\n const selection = useSignerSelection({\n signingMethod: methodOverride ?? \"sdk-signer\",\n walletId: walletIdOverride,\n });\n const selectedWalletId = walletIdOverride ?? selection.selectedWalletId;\n const selectedSigner = signerOverride ?? selection.selectedSigner;\n const signingMethod = methodOverride ?? \"sdk-signer\";\n\n const signing = useTransactionSigning({\n token,\n signingMethod,\n selectedSigner,\n selectedWalletId,\n walletAdapterSignTransaction,\n walletAdapterPublicKey,\n connection,\n });\n\n if (children) {\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-transaction-signing-form>\n {children({\n transactionResultState: signing.transactionResultState,\n isSigningTransaction: signing.isSigningTransaction,\n isSendingTransaction: signing.isSendingTransaction,\n signTransaction: signing.signTransaction,\n signAndSendTransaction: signing.signAndSendTransaction,\n reset: signing.reset,\n })}\n </div>\n );\n }\n\n const resultStatus = signing.transactionResultState.status;\n const isSuccess = resultStatus === \"success\";\n const isError = resultStatus === \"error\";\n\n return (\n <Card className={cn(className, classNames?.root)} data-cilantro-transaction-signing-form>\n <CardHeader className={classNames?.header}>\n <CardTitle className={cn(\"text-lg\", classNames?.title)}>Sign transaction</CardTitle>\n <CardDescription className={classNames?.description}>\n Build a transaction in your app, then pass it to <code className=\"text-xs\">signTransaction(tx)</code> to sign\n only, or <code className=\"text-xs\">signAndSendTransaction(tx)</code> to sign and send. Use the render props\n (children) to wire your own UI.\n </CardDescription>\n {showContext && (selectedWalletId || selectedSigner) && (\n <p className={cn(\"mt-1 text-xs text-muted-foreground\", classNames?.context)}>\n {selectedWalletId && <span>Wallet: {selectedWalletId.slice(0, 8)}…</span>}\n {selectedSigner && (\n <span className={selectedWalletId ? \" ml-2\" : \"\"}>\n Signer: {getSignerDisplayName(selectedSigner)} ({getSignerTypeLabel(selectedSigner.type || selectedSigner.signerType || \"\")})\n </span>\n )}\n </p>\n )}\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className={classNames?.button}\n onClick={signing.reset}\n disabled={signing.isSigningTransaction || signing.isSendingTransaction}\n >\n Reset status\n </Button>\n {resultStatus !== \"idle\" && (\n <div\n className={cn(\n \"rounded-lg border px-3 py-2 text-sm\",\n isSuccess && cn(\"border-green-500/50 bg-green-500/10 text-green-700 dark:text-green-400\", classNames?.resultSuccess),\n isError && cn(\"border-destructive/50 bg-destructive/10 text-destructive\", classNames?.resultError),\n resultStatus === \"loading\" && \"border-muted bg-muted/50 text-muted-foreground\",\n classNames?.result\n )}\n data-status={resultStatus}\n >\n {signing.transactionResultState.message}\n {signing.transactionResultState.detail != null && (\n <pre className={cn(\"mt-2 overflow-auto rounded-md bg-muted/80 p-2 text-xs\", classNames?.resultPre)}>\n {JSON.stringify(signing.transactionResultState.detail, null, 2)}\n </pre>\n )}\n </div>\n )}\n </CardContent>\n </Card>\n );\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 onSuccess?: () => void;\n onError?: (error: string) => void;\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 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?.(message);\n }\n };\n\n return (\n <Card className={cn(className, classNames?.root)} 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 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 { 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 { 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 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 onSuccess?: () => void;\n onError?: (error: string) => void;\n /** Override submit button label */\n submitLabel?: string;\n /** Override title */\n title?: string;\n /** Override description */\n description?: string;\n /** Default is true (user is active after registration) */\n isActive?: boolean;\n /** Render \"Already have an account? Sign in\" link. Shown below submit. */\n renderSwitchToLogin?: () => React.ReactNode;\n}\n\nexport function RegisterForm({\n className,\n classNames,\n onSuccess,\n onError,\n submitLabel = \"Create account\",\n title = \"Create an account\",\n description,\n isActive = true,\n renderSwitchToLogin,\n}: RegisterFormProps) {\n const { register, isLoading } = useCilantroAuth();\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 handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n try {\n await register(username.trim(), email.trim(), password, isActive);\n onSuccess?.();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n onError?.(message);\n }\n };\n\n return (\n <Card className={cn(className, classNames?.root)} 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 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 } 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 type AuthFormMode = \"login\" | \"register\";\n\nexport interface AuthFormClassNames {\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 toggle?: string;\n toggleLink?: string;\n error?: string;\n}\n\nexport interface AuthFormProps {\n /** Initial mode: login or register */\n defaultMode?: AuthFormMode;\n className?: string;\n classNames?: AuthFormClassNames;\n onSuccess?: () => void;\n onError?: (error: string) => void;\n /** Login: submit button label */\n loginSubmitLabel?: string;\n /** Register: submit button label */\n registerSubmitLabel?: string;\n /** Login: title */\n loginTitle?: string;\n /** Register: title */\n registerTitle?: string;\n /** Login: description */\n loginDescription?: string;\n /** Register: description */\n registerDescription?: string;\n /** Text for \"switch to register\" link */\n switchToRegisterText?: string;\n /** Text for \"switch to login\" link */\n switchToLoginText?: string;\n /** Default is true (user is active after registration) */\n isActive?: boolean;\n}\n\nexport function AuthForm({\n defaultMode = \"login\",\n className,\n classNames,\n onSuccess,\n onError,\n loginSubmitLabel = \"Sign in\",\n registerSubmitLabel = \"Create account\",\n loginTitle = \"Welcome back\",\n registerTitle = \"Create an account\",\n loginDescription = \"Sign in with your username or email.\",\n registerDescription = \"Enter your details to get started.\",\n switchToRegisterText = \"Don't have an account? Create one\",\n switchToLoginText = \"Already have an account? Sign in\",\n isActive = true,\n}: AuthFormProps) {\n const { login, register, isLoading } = useCilantroAuth();\n const [mode, setMode] = useState<AuthFormMode>(defaultMode);\n const [usernameOrEmail, setUsernameOrEmail] = useState(\"\");\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 isLogin = mode === \"login\";\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n try {\n if (isLogin) {\n await login(usernameOrEmail.trim(), password);\n } else {\n await register(username.trim(), email.trim(), password, isActive);\n }\n onSuccess?.();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n onError?.(message);\n }\n };\n\n const switchMode = () => {\n setMode(isLogin ? \"register\" : \"login\");\n setError(null);\n };\n\n const canSubmit = isLogin\n ? usernameOrEmail.trim().length > 0 && password.length > 0\n : username.trim().length > 0 && email.trim().length > 0 && password.length > 0;\n\n return (\n <Card className={cn(\"w-full max-w-sm\", className, classNames?.root)} data-cilantro-auth-form>\n <CardHeader className={cn(\"space-y-1 text-center sm:text-left\", classNames?.header)}>\n <CardTitle className={cn(\"text-xl\", classNames?.title)}>\n {isLogin ? loginTitle : registerTitle}\n </CardTitle>\n <CardDescription className={classNames?.description}>\n {isLogin ? loginDescription : registerDescription}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <form onSubmit={handleSubmit} className={cn(\"space-y-4\", classNames?.form)}>\n {isLogin ? (\n <>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-auth-username\" className={classNames?.label}>\n Username or email\n </Label>\n <Input\n id=\"cilantro-auth-username\"\n type=\"text\"\n autoComplete=\"username\"\n className={classNames?.input}\n value={usernameOrEmail}\n onChange={(e) => setUsernameOrEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n disabled={isLoading}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-auth-password\" className={classNames?.label}>\n Password\n </Label>\n <Input\n id=\"cilantro-auth-password\"\n type=\"password\"\n autoComplete=\"current-password\"\n className={classNames?.input}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"••••••••\"\n required\n disabled={isLoading}\n />\n </div>\n </>\n ) : (\n <>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-auth-reg-username\" className={classNames?.label}>\n Username\n </Label>\n <Input\n id=\"cilantro-auth-reg-username\"\n type=\"text\"\n autoComplete=\"username\"\n className={classNames?.input}\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n placeholder=\"johndoe\"\n required\n disabled={isLoading}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-auth-reg-email\" className={classNames?.label}>\n Email\n </Label>\n <Input\n id=\"cilantro-auth-reg-email\"\n type=\"email\"\n autoComplete=\"email\"\n className={classNames?.input}\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n disabled={isLoading}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-auth-reg-password\" className={classNames?.label}>\n Password\n </Label>\n <Input\n id=\"cilantro-auth-reg-password\"\n type=\"password\"\n autoComplete=\"new-password\"\n className={classNames?.input}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"••••••••\"\n required\n disabled={isLoading}\n />\n </div>\n </>\n )}\n\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\n <Button\n type=\"submit\"\n className={cn(\"w-full\", classNames?.submitButton)}\n disabled={isLoading || !canSubmit}\n >\n {isLoading\n ? isLogin\n ? \"Signing in...\"\n : \"Creating account...\"\n : isLogin\n ? loginSubmitLabel\n : registerSubmitLabel}\n </Button>\n\n <p className={cn(\"text-center text-sm text-muted-foreground\", classNames?.toggle)}>\n <button\n type=\"button\"\n className={cn(\"underline underline-offset-2 hover:text-foreground\", classNames?.toggleLink)}\n onClick={switchMode}\n disabled={isLoading}\n >\n {isLogin ? switchToRegisterText : switchToLoginText}\n </button>\n </p>\n </form>\n </CardContent>\n </Card>\n );\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { useCilantroAuth } from \"../providers/CilantroAuthProvider\";\nimport { LoginForm } from \"./LoginForm\";\nimport { cn } from \"../ui/cn\";\n\nexport interface AuthGuardClassNames {\n root?: string;\n fallback?: string;\n}\n\nexport interface AuthGuardProps {\n children: ReactNode;\n /** Shown when not authenticated. Default: <LoginForm /> */\n fallback?: ReactNode;\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}\n\n/**\n * Wraps content and shows fallback (e.g. LoginForm) when the user is not authenticated.\n * Use inside CilantroAuthProvider.\n */\nexport function AuthGuard({\n children,\n fallback,\n className,\n classNames,\n showFallback = true,\n}: AuthGuardProps) {\n const { isAuthenticated, isLoading } = useCilantroAuth();\n\n if (isLoading) {\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-auth-guard>\n <div className={cn(\"text-sm text-muted-foreground\", classNames?.fallback)}>Loading...</div>\n </div>\n );\n }\n\n if (!isAuthenticated) {\n if (!showFallback) return null;\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 {\n createEmailSignerHelper,\n createPhoneSignerHelper,\n createExternalSignerHelper,\n registerPasskeySigner,\n} from \"../core/signer-creation\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../ui/dialog\";\nimport { cn } from \"../ui/cn\";\n\nexport type AddSignerType = \"email\" | \"phone\" | \"passkey\" | \"external\";\n\nexport interface AddSignerFormClassNames {\n root?: string;\n dialog?: string;\n form?: string;\n label?: string;\n input?: string;\n submitButton?: string;\n cancelButton?: string;\n error?: string;\n}\n\nexport interface AddSignerFormProps {\n walletId: string;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n onSuccess?: () => void;\n onCancel?: () => void;\n onError?: (error: string) => void;\n className?: string;\n classNames?: AddSignerFormClassNames;\n /** When true, render as a dialog. When false, render inline. */\n asDialog?: boolean;\n}\n\nexport function AddSignerForm({\n walletId,\n open = true,\n onOpenChange,\n onSuccess,\n onCancel,\n onError,\n className,\n classNames,\n asDialog = true,\n}: AddSignerFormProps) {\n const [signerType, setSignerType] = useState<AddSignerType | null>(null);\n const [email, setEmail] = useState(\"\");\n const [phone, setPhone] = useState(\"\");\n const [address, setAddress] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const resetForm = () => {\n setSignerType(null);\n setEmail(\"\");\n setPhone(\"\");\n setAddress(\"\");\n setError(null);\n };\n\n const handleClose = (open: boolean) => {\n if (!open) {\n resetForm();\n onCancel?.();\n }\n onOpenChange?.(open);\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!signerType) return;\n setError(null);\n setIsSubmitting(true);\n try {\n if (signerType === \"email\") {\n await createEmailSignerHelper(walletId, email);\n } else if (signerType === \"phone\") {\n await createPhoneSignerHelper(walletId, phone);\n } else if (signerType === \"passkey\") {\n await registerPasskeySigner(walletId);\n } else if (signerType === \"external\") {\n await createExternalSignerHelper(walletId, address);\n }\n resetForm();\n onSuccess?.();\n handleClose(false);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n onError?.(message);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handlePasskeyClick = () => {\n setSignerType(\"passkey\");\n setError(null);\n setIsSubmitting(true);\n registerPasskeySigner(walletId)\n .then(() => {\n resetForm();\n onSuccess?.();\n handleClose(false);\n })\n .catch((err) => {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n onError?.(message);\n })\n .finally(() => setIsSubmitting(false));\n };\n\n const formContent = (\n <form onSubmit={handleSubmit} className={cn(\"space-y-4\", classNames?.form)}>\n {!signerType ? (\n <>\n <div className=\"space-y-2\">\n <Label className={classNames?.label}>Signer type</Label>\n <div className=\"flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setSignerType(\"email\")}\n disabled={isSubmitting}\n >\n Email\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setSignerType(\"phone\")}\n disabled={isSubmitting}\n >\n Phone\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={handlePasskeyClick}\n disabled={isSubmitting}\n >\n Passkey\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setSignerType(\"external\")}\n disabled={isSubmitting}\n >\n External wallet\n </Button>\n </div>\n </div>\n {asDialog && (\n <DialogFooter className=\"gap-2 sm:gap-0\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className={classNames?.cancelButton}\n onClick={() => handleClose(false)}\n disabled={isSubmitting}\n >\n Cancel\n </Button>\n </DialogFooter>\n )}\n </>\n ) : signerType === \"email\" ? (\n <>\n <div className=\"space-y-2\">\n <Label htmlFor=\"add-signer-email\" className={classNames?.label}>\n Email\n </Label>\n <Input\n id=\"add-signer-email\"\n type=\"email\"\n autoComplete=\"email\"\n className={classNames?.input}\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"email@example.com\"\n required\n disabled={isSubmitting}\n />\n </div>\n {asDialog && (\n <DialogFooter className=\"gap-2 sm:gap-0\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className={classNames?.cancelButton}\n onClick={() => setSignerType(null)}\n disabled={isSubmitting}\n >\n Back\n </Button>\n <Button type=\"submit\" className={classNames?.submitButton} disabled={isSubmitting}>\n {isSubmitting ? \"Adding...\" : \"Add signer\"}\n </Button>\n </DialogFooter>\n )}\n {!asDialog && (\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className={classNames?.cancelButton}\n onClick={() => setSignerType(null)}\n disabled={isSubmitting}\n >\n Back\n </Button>\n <Button type=\"submit\" className={classNames?.submitButton} disabled={isSubmitting}>\n {isSubmitting ? \"Adding...\" : \"Add signer\"}\n </Button>\n </div>\n )}\n </>\n ) : signerType === \"phone\" ? (\n <>\n <div className=\"space-y-2\">\n <Label htmlFor=\"add-signer-phone\" className={classNames?.label}>\n Phone number\n </Label>\n <Input\n id=\"add-signer-phone\"\n type=\"tel\"\n autoComplete=\"tel\"\n className={classNames?.input}\n value={phone}\n onChange={(e) => setPhone(e.target.value)}\n placeholder=\"+1234567890\"\n required\n disabled={isSubmitting}\n />\n </div>\n {asDialog && (\n <DialogFooter className=\"gap-2 sm:gap-0\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className={classNames?.cancelButton}\n onClick={() => setSignerType(null)}\n disabled={isSubmitting}\n >\n Back\n </Button>\n <Button type=\"submit\" className={classNames?.submitButton} disabled={isSubmitting}>\n {isSubmitting ? \"Adding...\" : \"Add signer\"}\n </Button>\n </DialogFooter>\n )}\n {!asDialog && (\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className={classNames?.cancelButton}\n onClick={() => setSignerType(null)}\n disabled={isSubmitting}\n >\n Back\n </Button>\n <Button type=\"submit\" className={classNames?.submitButton} disabled={isSubmitting}>\n {isSubmitting ? \"Adding...\" : \"Add signer\"}\n </Button>\n </div>\n )}\n </>\n ) : signerType === \"external\" ? (\n <>\n <div className=\"space-y-2\">\n <Label htmlFor=\"add-signer-address\" className={classNames?.label}>\n Wallet address\n </Label>\n <Input\n id=\"add-signer-address\"\n type=\"text\"\n className={classNames?.input}\n value={address}\n onChange={(e) => setAddress(e.target.value)}\n placeholder=\"Solana address\"\n required\n disabled={isSubmitting}\n />\n </div>\n {asDialog && (\n <DialogFooter className=\"gap-2 sm:gap-0\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className={classNames?.cancelButton}\n onClick={() => setSignerType(null)}\n disabled={isSubmitting}\n >\n Back\n </Button>\n <Button type=\"submit\" className={classNames?.submitButton} disabled={isSubmitting}>\n {isSubmitting ? \"Adding...\" : \"Add signer\"}\n </Button>\n </DialogFooter>\n )}\n {!asDialog && (\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className={classNames?.cancelButton}\n onClick={() => setSignerType(null)}\n disabled={isSubmitting}\n >\n Back\n </Button>\n <Button type=\"submit\" className={classNames?.submitButton} disabled={isSubmitting}>\n {isSubmitting ? \"Adding...\" : \"Add signer\"}\n </Button>\n </div>\n )}\n </>\n ) : null}\n {error && (\n <p className={cn(\"text-sm text-destructive\", classNames?.error)} role=\"alert\">\n {error}\n </p>\n )}\n </form>\n );\n\n if (asDialog) {\n return (\n <Dialog open={open} onOpenChange={handleClose}>\n <DialogContent className={cn(classNames?.dialog)}>\n <DialogHeader>\n <DialogTitle>Add signer</DialogTitle>\n <DialogDescription>Add a new signer to this wallet.</DialogDescription>\n </DialogHeader>\n {formContent}\n </DialogContent>\n </Dialog>\n );\n }\n\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-add-signer-form>\n <h3 className=\"text-sm font-medium mb-2\">Add signer</h3>\n {formContent}\n </div>\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 translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 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 { 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 { AddSignerForm } from \"./AddSignerForm\";\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}\n\nexport interface SignerListProps {\n walletId: string;\n className?: string;\n classNames?: SignerListClassNames;\n /** Callback when a signer is added (e.g. to refresh parent state) */\n onSignerAdded?: () => void;\n /** Custom render for the list of signers */\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 className,\n classNames,\n onSignerAdded,\n children,\n}: SignerListProps) {\n const { signers, isLoading, error, refresh } = useSigners({ walletId });\n const [addSignerOpen, setAddSignerOpen] = useState(false);\n\n const handleAddSuccess = () => {\n refresh();\n onSignerAdded?.();\n };\n\n if (children) {\n return (\n <>\n {children({\n signers,\n isLoading,\n error,\n refresh,\n openAddSigner: () => setAddSignerOpen(true),\n })}\n <AddSignerForm\n walletId={walletId}\n open={addSignerOpen}\n onOpenChange={setAddSignerOpen}\n onSuccess={handleAddSuccess}\n asDialog\n />\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>\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=\"sm\"\n variant=\"outline\"\n className={classNames?.addButton}\n onClick={() => setAddSignerOpen(true)}\n disabled={isLoading}\n >\n Add signer\n </Button>\n </div>\n {isLoading ? (\n <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>Loading signers...</p>\n ) : error ? (\n <p className={cn(\"text-sm text-destructive\", classNames?.message)} role=\"alert\">\n {error}\n </p>\n ) : signers.length === 0 ? (\n <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>No signers. Add one to get started.</p>\n ) : (\n <ul className={cn(\"space-y-1\", classNames?.list)} role=\"list\">\n {signers.map((signer) => (\n <li key={signer.id} className={cn(\"text-sm\", classNames?.item)}>\n {getSignerDisplayName(signer)} ({getSignerTypeLabel(signer.type || signer.signerType || \"\")})\n </li>\n ))}\n </ul>\n )}\n <AddSignerForm\n walletId={walletId}\n open={addSignerOpen}\n onOpenChange={setAddSignerOpen}\n onSuccess={handleAddSuccess}\n asDialog\n />\n </div>\n );\n}\n"],"mappings":"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","names":["useEffect","platformApiKey","apiUrl","createContext","useContext","useEffect","useState","jsx","createContext","useState","useEffect","useContext","jsx","platformApiKey","apiUrl","useEffect","useState","useEffect","useState","useEffect","useState","useEffect","useCallback","useState","useEffect","useCallback","useState","deriveSignerKeypair","getEmailSignerKeypair","getPhoneSignerKeypair","PublicKey","PublicKey","extractSignerInfo","extractSignerInfo","getEmailSignerKeypair","getPhoneSignerKeypair","deriveSignerKeypair","signWithSigner","signWithEmailSigner","signWithPhoneSigner","PublicKey","PublicKey","signWithSigner","extractSignerInfo","signWithEmailSigner","signWithPhoneSigner","signWithPasskeySigner","PublicKey","PublicKey","useState","useState","useState","jsx","jsx","jsx","jsxs","React","jsx","Fragment","jsx","jsxs","useState","useEffect","useCallback","Fragment","jsx","jsxs","useState","useCallback","useEffect","React","jsx","React","cva","jsx","cva","React","jsx","jsx","jsxs","jsx","jsxs","useState","React","jsx","jsx","jsxs","useState","useState","jsx","jsxs","useState","useState","Fragment","jsx","jsxs","useState","Fragment","jsx","useState","React","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","useState","open","useState","Fragment","jsx","jsxs","useState"]}
1
+ {"version":3,"sources":["../src/providers/CilantroProvider.tsx","../src/providers/CilantroAuthProvider.tsx","../src/core/auth.ts","../src/core/types.ts","../src/core/error-utils.ts","../src/providers/WalletProvider.tsx","../src/core/storage-adapter.ts","../src/hooks/useSelectedWallet.ts","../src/hooks/useWalletAddress.ts","../src/hooks/useSigners.ts","../src/core/signer-helpers.ts","../src/hooks/useSignersRaw.ts","../src/hooks/useSignersForSelectedWallet.ts","../src/hooks/useDelegatedKeys.ts","../src/hooks/useSignerSelection.ts","../src/hooks/useCanSign.ts","../src/hooks/useMessageSigning.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-creation.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","../src/hooks/useTransactionSigning.ts","../src/ui/select.tsx","../src/ui/cn.ts","../src/ui/skeleton.tsx","../src/components/WalletSelector.tsx","../src/ui/button.tsx","../src/components/SignerSelector.tsx","../src/components/DelegatedKeySelector.tsx","../src/ui/textarea.tsx","../src/ui/label.tsx","../src/ui/card.tsx","../src/components/MessageSigningForm.tsx","../src/components/TransactionSigningForm.tsx","../src/components/LoginForm.tsx","../src/ui/input.tsx","../src/components/RegisterForm.tsx","../src/components/AuthForm.tsx","../src/components/AuthGuard.tsx","../src/components/AddSignerForm.tsx","../src/ui/dialog.tsx","../src/components/SignerList.tsx","../src/ui/theme-provider.tsx"],"sourcesContent":["\"use client\";\n\nimport { type ReactNode, useEffect } from \"react\";\nimport { CilantroAuthProvider } from \"./CilantroAuthProvider\";\nimport { WalletProvider } from \"./WalletProvider\";\nimport { initializeStorageAdapter } from \"../core/storage-adapter\";\n\nexport interface CilantroProviderProps {\n children: ReactNode;\n platformApiKey: string;\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}\n\nexport function CilantroProvider({\n children,\n platformApiKey,\n apiUrl,\n jwtStorageKey,\n walletStorageKey,\n onLoginSuccess,\n onLogout,\n onRegisterSuccess,\n}: CilantroProviderProps) {\n useEffect(() => {\n initializeStorageAdapter().catch((err) => {\n console.error(\"[CilantroProvider] Failed to initialize storage adapter:\", err);\n });\n }, []);\n\n return (\n <CilantroAuthProvider\n platformApiKey={platformApiKey}\n apiUrl={apiUrl}\n jwtStorageKey={jwtStorageKey}\n onLoginSuccess={onLoginSuccess}\n onLogout={onLogout}\n onRegisterSuccess={onRegisterSuccess}\n >\n <WalletProvider storageKey={walletStorageKey}>{children}</WalletProvider>\n </CilantroAuthProvider>\n );\n}\n","\"use client\";\n\nimport { createContext, type ReactNode, useContext, useEffect, useState } 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 { setAuthConfig, setSdkAuth, getPlatformApiKey } from \"../core/auth\";\nimport { extractErrorMessage } from \"../core/error-utils\";\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\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 isLoading: boolean;\n}\n\nconst AuthContext = createContext<CilantroAuthContextType | undefined>(undefined);\n\nconst DEFAULT_JWT_STORAGE_KEY = \"cilantro_jwt\";\n\nexport interface CilantroAuthProviderProps {\n children: ReactNode;\n platformApiKey: string;\n apiUrl?: string;\n jwtStorageKey?: string;\n onLoginSuccess?: () => void;\n onLogout?: () => void;\n onRegisterSuccess?: () => void;\n}\n\nexport function CilantroAuthProvider({\n children,\n platformApiKey,\n apiUrl,\n jwtStorageKey = DEFAULT_JWT_STORAGE_KEY,\n onLoginSuccess,\n onLogout,\n onRegisterSuccess,\n}: CilantroAuthProviderProps) {\n const [user, setUser] = useState<User | null>(null);\n const [token, setToken] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n setAuthConfig({ platformApiKey, apiUrl });\n setSdkAuth(null);\n const storedToken = typeof window !== \"undefined\" ? localStorage.getItem(jwtStorageKey) : null;\n if (storedToken) {\n setToken(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 parse errors\n }\n }\n setIsLoading(false);\n }, [platformApiKey, apiUrl, jwtStorageKey]);\n\n const login = async (usernameOrEmail: string, password: string) => {\n try {\n const result = await cilantroLogin({ usernameOrEmail, password });\n const data: AuthControllerLogin200Data | undefined =\n result && typeof result === \"object\" && \"data\" in result\n ? (result as { data: AuthControllerLogin200Data }).data\n : undefined;\n if (!data?.jwt) throw new Error(\"No JWT token received from server\");\n const jwt = data.jwt;\n const userType = data.userType;\n setToken(jwt);\n setSdkAuth(jwt);\n if (typeof window !== \"undefined\") {\n localStorage.setItem(jwtStorageKey, jwt);\n document.cookie = `cilantro_jwt=${jwt}; path=/; max-age=${60 * 60 * 24 * 7}`;\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(jwt.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 } catch (error: unknown) {\n throw new Error(extractErrorMessage(error));\n }\n };\n\n const register = async (username: string, email: string, password: string, isActive = true) => {\n try {\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(username, password);\n onRegisterSuccess?.();\n } catch (error: unknown) {\n throw new Error(extractErrorMessage(error));\n }\n };\n\n const logout = () => {\n setUser(null);\n setToken(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 document.cookie = \"cilantro_jwt=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT\";\n }\n setSdkAuth(null);\n onLogout?.();\n };\n\n const value: CilantroAuthContextType = {\n user,\n token,\n isAuthenticated: !!token,\n login,\n register,\n logout,\n isLoading,\n };\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n}\n\nexport function useCilantroAuth(): CilantroAuthContextType {\n const context = useContext(AuthContext);\n if (context === undefined) {\n throw new Error(\"useCilantroAuth must be used within a CilantroAuthProvider\");\n }\n return context;\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 jwt?: string | null;\n}\n\n/**\n * Set SDK authentication config. Call with platformApiKey (and optional apiUrl) from provider/config.\n * Do not read process.env in library code.\n */\nexport function setAuthConfig(config: AuthConfig): void {\n platformApiKey = config.platformApiKey;\n apiUrl = 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 * 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","\"use client\";\n\nimport { createContext, type ReactNode, useContext, useEffect, useState } from \"react\";\nimport { useCilantroAuth } from \"./CilantroAuthProvider\";\nimport { setSdkAuth } from \"../core/auth\";\nimport { findAll as findAllWallets } from \"cilantro-sdk/wallet\";\nimport type { WalletControllerFindAllResult } from \"cilantro-sdk/wallet\";\nimport { extractResponseData } from \"../core/types\";\n\n/** SDK wallet list item type (element of WalletsListResponseDto.data). */\nexport type WalletDataDto = WalletControllerFindAllResult[\"data\"] extends readonly (infer E)[]\n ? E\n : WalletControllerFindAllResult[\"data\"] extends (infer E)[]\n ? E\n : never;\n\n/** WalletDataDto with backward-compat aliases (id, address, active) for existing UI. */\nexport type WalletData = WalletDataDto & {\n id?: string;\n address?: string;\n active?: boolean;\n};\n\nexport interface WalletContextType {\n selectedWallet: WalletData | null;\n wallets: WalletData[];\n selectWallet: (walletId: string) => void;\n refreshWallets: () => Promise<void>;\n isLoading: boolean;\n}\n\nconst WalletContext = createContext<WalletContextType | undefined>(undefined);\n\nconst DEFAULT_STORAGE_KEY = \"cilantro_selected_wallet_id\";\n\nexport interface WalletProviderProps {\n children: ReactNode;\n storageKey?: string;\n}\n\nexport function WalletProvider({ children, storageKey = DEFAULT_STORAGE_KEY }: WalletProviderProps) {\n const { token } = useCilantroAuth();\n const [wallets, setWallets] = useState<WalletData[]>([]);\n const [selectedWallet, setSelectedWallet] = useState<WalletData | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n if (token) {\n loadWallets();\n } else {\n setWallets([]);\n setSelectedWallet(null);\n setIsLoading(false);\n }\n }, [token]);\n\n useEffect(() => {\n if (wallets.length > 0 && !selectedWallet) {\n const storedWalletId = typeof window !== \"undefined\" ? localStorage.getItem(storageKey) : null;\n if (storedWalletId) {\n const wallet = wallets.find((w) => w.id === storedWalletId || w.walletId === storedWalletId);\n if (wallet) {\n setSelectedWallet(wallet);\n } else {\n setSelectedWallet(wallets[0]);\n if (typeof window !== \"undefined\") localStorage.setItem(storageKey, wallets[0].id ?? wallets[0].walletId);\n }\n } else {\n if (wallets.length > 0) {\n setSelectedWallet(wallets[0]);\n if (typeof window !== \"undefined\") localStorage.setItem(storageKey, wallets[0].id ?? wallets[0].walletId);\n }\n }\n } else if (wallets.length === 0) {\n setSelectedWallet(null);\n if (typeof window !== \"undefined\") localStorage.removeItem(storageKey);\n }\n }, [wallets, storageKey]);\n\n const loadWallets = async () => {\n try {\n setIsLoading(true);\n if (token) setSdkAuth(token);\n const result = await findAllWallets();\n const walletsList = extractResponseData<WalletDataDto[]>(result) ?? [];\n const list = Array.isArray(walletsList) ? walletsList : [];\n const formattedWallets: WalletData[] = list.map((w) => ({\n ...w,\n id: w.walletId,\n address: w.walletAddress,\n active: w.isActive,\n }));\n setWallets(formattedWallets);\n } catch (error) {\n console.error(\"Failed to load wallets:\", error);\n setWallets([]);\n } finally {\n setIsLoading(false);\n }\n };\n\n const selectWallet = (walletId: string) => {\n const wallet = wallets.find((w) => w.id === walletId || w.walletId === walletId);\n if (wallet) {\n setSelectedWallet(wallet);\n if (typeof window !== \"undefined\") localStorage.setItem(storageKey, wallet.id ?? wallet.walletId);\n }\n };\n\n const refreshWallets = async () => {\n await loadWallets();\n };\n\n const value: WalletContextType = {\n selectedWallet,\n wallets,\n selectWallet,\n refreshWallets,\n isLoading,\n };\n\n return <WalletContext.Provider value={value}>{children}</WalletContext.Provider>;\n}\n\nexport function useWallets(): WalletContextType {\n const context = useContext(WalletContext);\n if (context === undefined) {\n throw new Error(\"useWallets must be used within a WalletProvider\");\n }\n return context;\n}\n","import { createIndexedDBAdapter } from \"cilantro-sdk/helpers\";\n\nexport type DeviceKeyStorage = ReturnType<typeof createIndexedDBAdapter>;\n\nlet storageAdapterInstance: DeviceKeyStorage | null = null;\nlet initializationPromise: Promise<DeviceKeyStorage> | null = null;\n\nexport async function initializeStorageAdapter(): Promise<DeviceKeyStorage> {\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 (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","\"use client\";\n\nimport { useWallets } from \"../providers/WalletProvider\";\nimport type { WalletData } from \"../providers/WalletProvider\";\n\nexport interface UseSelectedWalletResult {\n selectedWallet: WalletData | null;\n isLoading: boolean;\n refreshWallets: () => Promise<void>;\n}\n\n/**\n * Returns the currently selected wallet, loading state, and refresh.\n * Use when you only need the current wallet, not the full wallet list.\n * Must be used inside CilantroProvider (WalletProvider).\n */\nexport function useSelectedWallet(): UseSelectedWalletResult {\n const { selectedWallet, isLoading, refreshWallets } = useWallets();\n return { selectedWallet, isLoading, refreshWallets };\n}\n","\"use client\";\n\nimport { useWallets } from \"../providers/WalletProvider\";\n\n/**\n * Returns the address of the currently selected wallet.\n * Handles both `address` and `walletAddress` on WalletData.\n * Must be used inside CilantroProvider (WalletProvider).\n */\nexport function useWalletAddress(): string | null {\n const { selectedWallet } = useWallets();\n return selectedWallet?.address ?? selectedWallet?.walletAddress ?? null;\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { useCilantroAuth } from \"../providers/CilantroAuthProvider\";\nimport { setSdkAuth } from \"../core/auth\";\nimport { loadSigners, type SignerData } from \"../core/signer-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}\n\nexport function useSigners(options: UseSignersOptions = {}): UseSignersResult {\n const { walletId: walletIdOption } = options;\n const { token } = useCilantroAuth();\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(async (walletId: string) => {\n if (!walletId) {\n setSigners([]);\n return;\n }\n setIsLoading(true);\n setError(null);\n try {\n if (token) setSdkAuth(token);\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 }, [token]);\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 return { signers, isLoading, error, refresh };\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\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","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { listSigners } from \"cilantro-sdk/wallet\";\nimport type { WalletControllerListSignersResult } from \"cilantro-sdk/wallet\";\nimport { setSdkAuth } from \"../core/auth\";\nimport { useCilantroAuth } from \"../providers/CilantroAuthProvider\";\n\nexport type SignersListResponseDto = WalletControllerListSignersResult;\n\nexport interface UseSignersRawOptions {\n /** Wallet ID to load signers for. When null/undefined, response is null. */\n walletId?: string | null;\n}\n\nexport interface UseSignersRawResult {\n /** Exact SDK response from listSigners (success, data: { authenticationSigners, onChainSigners }). */\n signersRaw: SignersListResponseDto | null;\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\n/**\n * Load signers for a wallet and return the exact SDK shape (SignersListResponseDto).\n * Use when you need SDK-exact output; for a normalized list use useSigners instead.\n * Must be used inside CilantroProvider (auth required).\n */\nexport function useSignersRaw(options: UseSignersRawOptions = {}): UseSignersRawResult {\n const { walletId } = options;\n const { token } = useCilantroAuth();\n const [signersRaw, setSignersRaw] = useState<SignersListResponseDto | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const load = useCallback(async () => {\n if (!walletId) {\n setSignersRaw(null);\n return;\n }\n setIsLoading(true);\n setError(null);\n try {\n if (token) setSdkAuth(token);\n const result = await listSigners(walletId);\n setSignersRaw(result);\n } catch (err) {\n setSignersRaw(null);\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setIsLoading(false);\n }\n }, [walletId, token]);\n\n useEffect(() => {\n if (!walletId) {\n setSignersRaw(null);\n setError(null);\n return;\n }\n load();\n }, [walletId, load]);\n\n const refresh = useCallback(async () => {\n if (walletId) await load();\n }, [walletId, load]);\n\n return {\n signersRaw: walletId ? signersRaw : null,\n isLoading,\n error,\n refresh,\n };\n}\n","\"use client\";\n\nimport { useWallets } from \"../providers/WalletProvider\";\nimport { useSigners } from \"./useSigners\";\nimport type { UseSignersResult } from \"./useSigners\";\n\nexport interface UseSignersForSelectedWalletOptions {\n /** Override wallet ID; when omitted, uses the selected wallet from context. */\n walletId?: string | null;\n}\n\n/**\n * Returns signers for the currently selected wallet (or the given walletId override).\n * Composes useWallets + useSigners so you don't have to pass walletId yourself.\n * Must be used inside CilantroProvider.\n */\nexport function useSignersForSelectedWallet(\n options: UseSignersForSelectedWalletOptions = {}\n): UseSignersResult {\n const { walletId: walletIdOverride } = options;\n const { selectedWallet } = useWallets();\n const effectiveWalletId = walletIdOverride ?? selectedWallet?.id ?? selectedWallet?.walletId ?? null;\n return useSigners({ walletId: effectiveWalletId });\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { findAll } from \"cilantro-sdk/delegated-keys\";\nimport type { DelegatedKeyControllerFindAllResult } from \"cilantro-sdk/delegated-keys\";\nimport { setSdkAuth } from \"../core/auth\";\nimport { extractResponseData } from \"../core/types\";\nimport { useCilantroAuth } from \"../providers/CilantroAuthProvider\";\n\n/** SDK delegated key type (element of DelegatedKeysListResponseDto.data). Canonical id is delegatedKeyId. */\nexport type DelegatedKeyDataDto = DelegatedKeyControllerFindAllResult[\"data\"] extends readonly (infer E)[]\n ? E\n : DelegatedKeyControllerFindAllResult[\"data\"] extends (infer E)[]\n ? E\n : never;\n\n/** DelegatedKeyDataDto with backward-compat id alias (id = delegatedKeyId) for existing UI. */\nexport type DelegatedKeyData = DelegatedKeyDataDto & { id?: string };\n\nexport interface UseDelegatedKeysOptions {\n /** Wallet ID to load delegated keys for. When null/undefined, keys are empty. */\n walletId?: string | null;\n /** When true (default), filter to active keys and non-expired only. */\n filterActive?: boolean;\n}\n\nexport interface UseDelegatedKeysResult {\n keys: DelegatedKeyData[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nfunction normalizeKeys(list: DelegatedKeyDataDto[]): DelegatedKeyData[] {\n return list.map((k) => ({\n ...k,\n id: k.delegatedKeyId,\n }));\n}\n\n/**\n * Load delegated keys for a wallet. Use for custom delegated-key UI or logic.\n * Must be used inside CilantroProvider (auth required).\n */\nexport function useDelegatedKeys(options: UseDelegatedKeysOptions = {}): UseDelegatedKeysResult {\n const { walletId, filterActive = true } = options;\n const { token } = useCilantroAuth();\n const [keys, setKeys] = useState<DelegatedKeyData[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const loadKeys = useCallback(async () => {\n if (!walletId) {\n setKeys([]);\n return;\n }\n setIsLoading(true);\n setError(null);\n try {\n if (token) setSdkAuth(token);\n const result = await findAll(walletId);\n const keysData = extractResponseData<DelegatedKeyDataDto[]>(result) ?? [];\n const list = Array.isArray(keysData) ? keysData : [];\n const valid = list.filter(\n (k): k is DelegatedKeyDataDto =>\n k != null && typeof k === \"object\" && \"delegatedKeyId\" in k\n );\n let loaded = normalizeKeys(valid);\n if (filterActive) {\n const now = Date.now();\n loaded = loaded.filter((key) => {\n if (!key.isActive) return false;\n const raw = key.expiresAt;\n const exp =\n raw != null && (typeof raw === \"string\" || typeof raw === \"number\")\n ? new Date(raw).getTime()\n : null;\n return exp === null || exp > now;\n });\n }\n setKeys(loaded);\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n setKeys([]);\n } finally {\n setIsLoading(false);\n }\n }, [walletId, token, filterActive]);\n\n useEffect(() => {\n loadKeys();\n }, [loadKeys]);\n\n const refresh = useCallback(async () => {\n if (walletId) await loadKeys();\n }, [walletId, loadKeys]);\n\n return { keys, isLoading, error, refresh };\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { useWallets } from \"../providers/WalletProvider\";\nimport { useSigners } from \"./useSigners\";\nimport type { SignerData } from \"../core/signer-helpers\";\n\nexport type SigningMethod = \"wallet-adapter\" | \"sdk-signer\";\n\nexport interface UseSignerSelectionOptions {\n /** Override wallet ID; if not set, uses selected wallet from WalletProvider */\n walletId?: string | null;\n /** Current signing method */\n signingMethod?: SigningMethod | null;\n}\n\nexport interface UseSignerSelectionResult {\n selectedWalletId: string;\n setSelectedWalletId: (id: string) => void;\n availableSigners: SignerData[];\n selectedSigner: SignerData | null;\n setSelectedSigner: (signer: SignerData | null) => void;\n isLoadingSigners: boolean;\n reset: () => void;\n}\n\nexport function useSignerSelection(options: UseSignerSelectionOptions = {}): UseSignerSelectionResult {\n const { walletId: walletIdOverride, signingMethod = \"sdk-signer\" } = options;\n const { selectedWallet } = useWallets();\n const effectiveWalletId = walletIdOverride ?? selectedWallet?.id ?? selectedWallet?.walletId ?? \"\";\n const { signers: availableSigners, isLoading: isLoadingSigners } = useSigners({\n walletId: effectiveWalletId || null,\n });\n const [selectedWalletId, setSelectedWalletId] = useState(effectiveWalletId);\n const [selectedSigner, setSelectedSigner] = useState<SignerData | null>(null);\n\n useEffect(() => {\n setSelectedWalletId(effectiveWalletId);\n }, [effectiveWalletId]);\n\n useEffect(() => {\n if (signingMethod !== \"sdk-signer\") {\n setSelectedSigner(null);\n }\n }, [signingMethod]);\n\n const reset = useCallback(() => {\n setSelectedWalletId(\"\");\n setSelectedSigner(null);\n }, []);\n\n return {\n selectedWalletId: selectedWalletId || effectiveWalletId,\n setSelectedWalletId,\n availableSigners,\n selectedSigner,\n setSelectedSigner,\n isLoadingSigners,\n reset,\n };\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useCilantroAuth } from \"../providers/CilantroAuthProvider\";\nimport { useWallets } from \"../providers/WalletProvider\";\nimport { useSignerSelection, type SigningMethod } from \"./useSignerSelection\";\n\nexport interface UseCanSignOptions {\n /** Override signing method; when omitted, uses default \"sdk-signer\". */\n signingMethod?: SigningMethod | null;\n /** When true (default for sdk-signer), require a selected signer. When false, only wallet is required. */\n requireSigner?: boolean;\n /** When using wallet-adapter, pass true when the adapter is connected. Omit if not using wallet-adapter. */\n walletAdapterConnected?: boolean;\n}\n\nexport interface UseCanSignResult {\n /** True when the user has a valid token. */\n hasToken: boolean;\n /** True when a wallet is selected. */\n hasWallet: boolean;\n /** True when a signer is selected (sdk-signer) or wallet-adapter is connected (when walletAdapterConnected is passed). */\n hasSigner: boolean;\n /** True when ready to sign a message (hasToken + hasWallet + hasSigner for current method). */\n canSignMessage: boolean;\n /** True when ready to sign/send a transaction (same as canSignMessage; connection is required for send). */\n canSignTransaction: boolean;\n}\n\n/**\n * Derived \"is the user ready to sign?\" for disabling sign buttons or showing prompts.\n * For wallet-adapter, pass walletAdapterConnected when your adapter is connected so canSign reflects it.\n * Must be used inside CilantroProvider.\n */\nexport function useCanSign(options: UseCanSignOptions = {}): UseCanSignResult {\n const {\n signingMethod = \"sdk-signer\",\n requireSigner = true,\n walletAdapterConnected,\n } = options;\n\n const { token } = useCilantroAuth();\n const { selectedWallet } = useWallets();\n const { selectedSigner } = useSignerSelection({ signingMethod });\n\n return useMemo(() => {\n const hasToken = !!token;\n const hasWallet = !!selectedWallet?.id || !!selectedWallet?.walletId;\n const isSdkSigner = signingMethod === \"sdk-signer\";\n const hasSigner = isSdkSigner\n ? !!selectedSigner\n : walletAdapterConnected !== undefined\n ? walletAdapterConnected\n : hasWallet;\n\n const canSign =\n hasToken &&\n hasWallet &&\n (requireSigner ? hasSigner : true);\n\n return {\n hasToken,\n hasWallet,\n hasSigner,\n canSignMessage: canSign,\n canSignTransaction: canSign,\n };\n }, [\n token,\n selectedWallet?.id,\n selectedWallet?.walletId,\n selectedSigner,\n signingMethod,\n requireSigner,\n walletAdapterConnected,\n ]);\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { setSdkAuth } from \"../core/auth\";\nimport { extractErrorMessage } from \"../core/error-utils\";\nimport { signMessageWithSigner } from \"../core/signer-signing\";\nimport { extractSignerInfo } from \"../core/signer-helpers\";\nimport type { SignerData } from \"../core/signer-helpers\";\nimport type { SigningMethod } from \"./useSignerSelection\";\nimport type { ActionState } from \"../core/types\";\n\nexport interface UseMessageSigningOptions {\n token: string | null;\n signingMethod: SigningMethod | null;\n selectedSigner: SignerData | null;\n selectedWalletId: string;\n /** Optional: callback when using wallet-adapter; signMessage(encodedMessage) => signature bytes */\n walletAdapterSignMessage?: (message: Uint8Array) => Promise<Uint8Array>;\n /** Optional: public key when using wallet-adapter (for result) */\n walletAdapterPublicKey?: string | null;\n}\n\nexport interface UseMessageSigningResult {\n messageText: string;\n setMessageText: (text: string) => void;\n signResultState: ActionState;\n isSigning: boolean;\n handleSign: () => Promise<void>;\n reset: () => void;\n}\n\nexport function useMessageSigning(options: UseMessageSigningOptions): UseMessageSigningResult {\n const {\n token,\n signingMethod,\n selectedSigner,\n selectedWalletId,\n walletAdapterSignMessage,\n walletAdapterPublicKey,\n } = options;\n const [messageText, setMessageText] = useState(\"Hello, Solana!\");\n const [signResultState, setSignResultState] = useState<ActionState>({ status: \"idle\" });\n const [isSigning, setIsSigning] = useState(false);\n\n const handleSign = async () => {\n setIsSigning(true);\n setSignResultState({ status: \"loading\" });\n try {\n if (token) setSdkAuth(token);\n if (!messageText.trim()) throw new Error(\"Please enter a message to sign.\");\n\n if (signingMethod === \"wallet-adapter\") {\n if (!walletAdapterSignMessage) {\n throw new Error(\"Wallet adapter signMessage not provided.\");\n }\n const message = new TextEncoder().encode(messageText);\n const signature = await walletAdapterSignMessage(message);\n setSignResultState({\n status: \"success\",\n message: \"Message signed successfully!\",\n detail: {\n message: messageText,\n signature: Array.from(signature)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\"),\n publicKey: walletAdapterPublicKey ?? undefined,\n },\n });\n return;\n }\n\n if (!selectedSigner || !selectedWalletId) throw new Error(\"Please select a signer.\");\n const result = await signMessageWithSigner(selectedWalletId, selectedSigner, messageText);\n const { signerType } = extractSignerInfo(selectedSigner);\n setSignResultState({\n status: \"success\",\n message: `Message signed successfully with ${signerType} signer!`,\n detail: { ...result },\n });\n } catch (error: unknown) {\n const errorMsg = extractErrorMessage(error);\n const isCancelled =\n errorMsg.toLowerCase().includes(\"cancel\") || errorMsg.toLowerCase().includes(\"notallowederror\");\n setSignResultState({\n status: \"error\",\n message: isCancelled ? \"User cancelled authentication\" : errorMsg,\n });\n } finally {\n setIsSigning(false);\n }\n };\n\n const reset = () => {\n setMessageText(\"Hello, Solana!\");\n setSignResultState({ status: \"idle\" });\n };\n\n return {\n messageText,\n setMessageText,\n signResultState,\n isSigning,\n handleSign,\n reset,\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 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","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","\"use client\";\n\nimport { useState } from \"react\";\nimport type { Transaction } from \"@solana/web3.js\";\nimport { setSdkAuth } from \"../core/auth\";\nimport { extractErrorMessage } from \"../core/error-utils\";\nimport {\n signTransactionWithSigner,\n signAndSendTransactionWithSigner,\n getSignerPublicKey,\n getWalletData,\n} from \"../core/signer-signing\";\nimport { extractSignerInfo } from \"../core/signer-helpers\";\nimport type { SignerData } from \"../core/signer-helpers\";\nimport type { SigningMethod } from \"./useSignerSelection\";\nimport type { ActionState } from \"../core/types\";\n\nexport interface UseTransactionSigningOptions {\n token: string | null;\n signingMethod: SigningMethod | null;\n selectedSigner: SignerData | null;\n selectedWalletId: string;\n /** Optional: wallet-adapter signTransaction(transaction) => signed transaction */\n walletAdapterSignTransaction?: (transaction: Transaction) => Promise<Transaction>;\n /** Optional: wallet-adapter public key (for building/sending) */\n walletAdapterPublicKey?: string | null;\n /** Optional: connection for sending (e.g. from @solana/web3.js). Used for wallet-adapter send. */\n connection?: { sendRawTransaction: (buf: Buffer) => Promise<string>; getLatestBlockhash: () => Promise<{ blockhash: string; lastValidBlockHeight: number }>; confirmTransaction: (opts: { signature: string; blockhash: string; lastValidBlockHeight: number }) => Promise<void> } | null;\n}\n\nexport interface UseTransactionSigningResult {\n transactionResultState: ActionState;\n isSigningTransaction: boolean;\n isSendingTransaction: boolean;\n signTransaction: (transaction: Transaction) => Promise<void>;\n signAndSendTransaction: (transaction: Transaction) => Promise<void>;\n reset: () => void;\n}\n\nexport function useTransactionSigning(\n options: UseTransactionSigningOptions\n): UseTransactionSigningResult {\n const {\n token,\n signingMethod,\n selectedSigner,\n selectedWalletId,\n walletAdapterSignTransaction,\n walletAdapterPublicKey,\n connection,\n } = options;\n const [transactionResultState, setTransactionResultState] = useState<ActionState>({ status: \"idle\" });\n const [isSigningTransaction, setIsSigningTransaction] = useState(false);\n const [isSendingTransaction, setIsSendingTransaction] = useState(false);\n\n const signTransaction = async (transaction: Transaction) => {\n setIsSigningTransaction(true);\n setTransactionResultState({ status: \"loading\" });\n try {\n if (token) setSdkAuth(token);\n if (signingMethod === \"wallet-adapter\") {\n if (!walletAdapterSignTransaction || !walletAdapterPublicKey) {\n throw new Error(\"Wallet adapter signTransaction or publicKey not provided.\");\n }\n const signed = await walletAdapterSignTransaction(transaction);\n setTransactionResultState({\n status: \"success\",\n message: \"Transaction signed successfully!\",\n detail: { transaction: signed.serialize().toString(\"base64\") },\n });\n return;\n }\n if (!selectedSigner || !selectedWalletId) throw new Error(\"Please select a signer.\");\n const { signerId, signerType } = extractSignerInfo(selectedSigner);\n if (signerType === \"passkey\") {\n throw new Error(\"Passkey signers cannot be used for sign-only. Use sign-and-send instead.\");\n }\n const transactionBuffer = transaction.serializeMessage();\n const result = await signTransactionWithSigner(\n selectedWalletId,\n selectedSigner,\n transactionBuffer\n );\n setTransactionResultState({\n status: \"success\",\n message: `Transaction signed with ${signerType} signer!`,\n detail: { ...result },\n });\n } catch (error: unknown) {\n const errorMsg = extractErrorMessage(error);\n const isCancelled =\n errorMsg.toLowerCase().includes(\"cancel\") || errorMsg.toLowerCase().includes(\"notallowederror\");\n setTransactionResultState({\n status: \"error\",\n message: isCancelled ? \"User cancelled authentication\" : errorMsg,\n });\n } finally {\n setIsSigningTransaction(false);\n }\n };\n\n const signAndSendTransaction = async (transaction: Transaction) => {\n setIsSendingTransaction(true);\n setTransactionResultState({ status: \"loading\" });\n try {\n if (token) setSdkAuth(token);\n if (signingMethod === \"wallet-adapter\") {\n if (!walletAdapterSignTransaction || !walletAdapterPublicKey || !connection) {\n throw new Error(\"Wallet adapter signTransaction, publicKey, or connection not provided.\");\n }\n const signed = await walletAdapterSignTransaction(transaction);\n const { blockhash, lastValidBlockHeight } = await connection.getLatestBlockhash();\n const signature = await connection.sendRawTransaction(Buffer.from(signed.serialize()));\n await connection.confirmTransaction({ signature, blockhash, lastValidBlockHeight });\n setTransactionResultState({\n status: \"success\",\n message: \"Transaction sent successfully!\",\n detail: { signature, explorerUrl: `https://solscan.io/tx/${signature}?cluster=devnet` },\n });\n return;\n }\n if (!selectedSigner || !selectedWalletId) throw new Error(\"Please select a signer.\");\n const { signerType } = extractSignerInfo(selectedSigner);\n const result = await signAndSendTransactionWithSigner(\n selectedWalletId,\n selectedSigner,\n transaction,\n connection ?? undefined\n );\n setTransactionResultState({\n status: \"success\",\n message: `Transaction sent with ${signerType} signer!`,\n detail: {\n signature: result.signature,\n status: result.status,\n confirmationStatus: result.confirmationStatus,\n explorerUrl: `https://solscan.io/tx/${result.signature}?cluster=devnet`,\n },\n });\n } catch (error: unknown) {\n const errorMsg = extractErrorMessage(error);\n const isCancelled =\n errorMsg.toLowerCase().includes(\"cancel\") || errorMsg.toLowerCase().includes(\"notallowederror\");\n setTransactionResultState({\n status: \"error\",\n message: isCancelled ? \"User cancelled transaction\" : errorMsg,\n detail: { error: errorMsg, walletId: selectedWalletId },\n });\n } finally {\n setIsSendingTransaction(false);\n }\n };\n\n const reset = () => {\n setTransactionResultState({ status: \"idle\" });\n };\n\n return {\n transactionResultState,\n isSigningTransaction,\n isSendingTransaction,\n signTransaction,\n signAndSendTransaction,\n reset,\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","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 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 { 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 onWalletChange?: (walletId: string, wallet: WalletData | null) => void;\n className?: string;\n classNames?: WalletSelectorClassNames;\n /** When true (default), show skeleton in trigger while loading; when false, show \"Loading...\" text. */\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 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 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 onWalletChange?.(id, wallet);\n };\n\n const handleValueChange = (id: string) => {\n selectWallet(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 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 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 * 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","\"use client\";\n\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\";\n\nexport interface SignerSelectorClassNames {\n root?: string;\n list?: string;\n item?: string;\n message?: string;\n skeleton?: string;\n loading?: string;\n}\n\nexport interface SignerSelectorProps {\n /** Wallet ID (signers are loaded for this wallet when used with useSigners) */\n selectedWalletId?: string;\n /** Available signers (from useSigners or useSignerSelection) */\n availableSigners: SignerData[];\n /** Currently selected signer */\n selectedSigner: SignerData | null;\n /** Loading state */\n isLoadingSigners?: boolean;\n /** Callback when user selects a signer */\n onSignerSelect: (signer: SignerData) => void;\n /** Root class */\n className?: string;\n /** Override class names for sub-elements */\n classNames?: SignerSelectorClassNames;\n /** When true (default), show skeleton rows while loading; when false, show \"Loading signers...\" text. */\n useSkeleton?: boolean;\n /** Custom list render (headless) */\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 render props */\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 selectedWalletId,\n availableSigners,\n selectedSigner,\n isLoadingSigners = false,\n onSignerSelect,\n className,\n classNames,\n useSkeleton = true,\n renderList,\n children,\n}: SignerSelectorProps) {\n if (!selectedWalletId) return null;\n\n if (children) {\n return (\n <>{children({ signers: availableSigners, selectedSigner, onSignerSelect, isLoading: isLoadingSigners })}</>\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,\n onSelect: onSignerSelect,\n isLoading: isLoadingSigners,\n getSignerDisplayName,\n getSignerTypeLabel,\n getSignerUniqueId,\n })}\n </div>\n );\n }\n\n const loadingContent =\n isLoadingSigners && useSkeleton ? (\n <div\n className={cn(\"space-y-1\", classNames?.loading)}\n aria-busy=\"true\"\n aria-live=\"polite\"\n >\n {[1, 2, 3].map((i) => (\n <Skeleton\n key={i}\n className={cn(\"h-8 w-full rounded-md\", classNames?.skeleton)}\n />\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={() => onSignerSelect(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 {\n useDelegatedKeys,\n type DelegatedKeyData,\n} from \"../hooks/useDelegatedKeys\";\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 type { DelegatedKeyData };\n\nexport interface DelegatedKeySelectorClassNames {\n root?: string;\n trigger?: string;\n content?: string;\n item?: string;\n message?: string;\n skeleton?: string;\n loading?: string;\n}\n\nexport interface DelegatedKeySelectorProps {\n walletId: string;\n value?: string;\n onChange?: (delegatedKeyId: string, key: DelegatedKeyData | null) => void;\n filterActive?: boolean;\n className?: string;\n classNames?: DelegatedKeySelectorClassNames;\n /** When true (default), show skeleton trigger while loading; when false, show \"Loading delegated keys...\" text. */\n useSkeleton?: boolean;\n placeholder?: string;\n children?: (props: {\n keys: DelegatedKeyData[];\n selectedKeyId: string | undefined;\n onSelect: (key: DelegatedKeyData) => void;\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n }) => React.ReactNode;\n}\n\nexport function DelegatedKeySelector(props: DelegatedKeySelectorProps) {\n const {\n walletId,\n value,\n onChange,\n filterActive = true,\n className,\n classNames,\n useSkeleton = true,\n placeholder = \"Select a delegated key\",\n children,\n } = props;\n\n const { keys, isLoading, error, refresh: loadKeys } = useDelegatedKeys({\n walletId,\n filterActive,\n });\n\n const onSelect = (key: DelegatedKeyData) => {\n const id = key.id ?? key.delegatedKeyId;\n onChange?.(id, key);\n };\n\n const handleValueChange = (id: string) => {\n const key = keys.find((k) => (k.id ?? k.delegatedKeyId) === id) ?? null;\n onChange?.(id, key);\n };\n\n if (children) {\n return (\n <>\n {children({ keys, selectedKeyId: value, onSelect, isLoading, error, refresh: loadKeys })}\n </>\n );\n }\n\n if (!walletId) {\n return (\n <div className={cn(className, classNames?.root, \"text-sm text-muted-foreground\")}>\n Select a wallet first\n </div>\n );\n }\n\n if (isLoading && useSkeleton) {\n return (\n <div\n className={cn(className, classNames?.root, classNames?.loading)}\n data-cilantro-delegated-key-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 return (\n <div\n className={cn(className, classNames?.root)}\n data-cilantro-delegated-key-selector\n aria-busy={isLoading}\n aria-live=\"polite\"\n >\n {isLoading ? (\n <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>Loading delegated keys...</p>\n ) : error ? (\n <p className={cn(\"text-sm text-destructive\", classNames?.message)} role=\"alert\">\n {error}\n </p>\n ) : keys.length === 0 ? (\n <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>No delegated keys found.</p>\n ) : (\n <Select value={(value ?? \"\") || undefined} onValueChange={handleValueChange}>\n <SelectTrigger className={classNames?.trigger} aria-label=\"Select delegated key\">\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent className={classNames?.content}>\n {keys.map((k) => {\n const id = k.id ?? k.delegatedKeyId;\n return (\n <SelectItem key={id} value={id} className={classNames?.item}>\n {k.publicKey.slice(0, 8)}...\n </SelectItem>\n );\n })}\n </SelectContent>\n </Select>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"./cn\";\n\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, ...props }, ref) => (\n <textarea\n className={cn(\n \"flex min-h-[80px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm ring-offset-background 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);\nTextarea.displayName = \"Textarea\";\n\nexport { Textarea };\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 { useMessageSigning } from \"../hooks/useMessageSigning\";\nimport { useCilantroAuth } from \"../providers/CilantroAuthProvider\";\nimport { useSignerSelection } from \"../hooks/useSignerSelection\";\nimport { getSignerDisplayName, getSignerTypeLabel } from \"../core/signer-helpers\";\nimport type { ActionState } from \"../core/types\";\nimport { Button } from \"../ui/button\";\nimport { Textarea } from \"../ui/textarea\";\nimport { Label } from \"../ui/label\";\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"../ui/card\";\nimport { cn } from \"../ui/cn\";\n\nexport interface MessageSigningFormClassNames {\n root?: string;\n header?: string;\n title?: string;\n description?: string;\n context?: string;\n label?: string;\n textarea?: string;\n charCount?: string;\n button?: string;\n resetButton?: string;\n result?: string;\n resultSuccess?: string;\n resultError?: string;\n resultPre?: string;\n}\n\nexport interface MessageSigningFormProps {\n /** Optional: override token (default: from useCilantroAuth) */\n token?: string | null;\n /** Optional: override wallet/signer (default: from useSignerSelection) */\n selectedWalletId?: string;\n selectedSigner?: import(\"../core/signer-helpers\").SignerData | null;\n signingMethod?: import(\"../hooks/useSignerSelection\").SigningMethod | null;\n /** Optional: wallet-adapter sign message (when signingMethod === \"wallet-adapter\") */\n walletAdapterSignMessage?: (message: Uint8Array) => Promise<Uint8Array>;\n walletAdapterPublicKey?: string | null;\n /** Root class */\n className?: string;\n /** Override class names for sub-elements */\n classNames?: MessageSigningFormClassNames;\n /** Show wallet/signer context above the form (default: true when wallet/signer selected) */\n showContext?: boolean;\n /** Show character count below textarea (default: false) */\n showCharCount?: boolean;\n /** Headless: render form content */\n children?: (props: {\n messageText: string;\n setMessageText: (text: string) => void;\n signResultState: ActionState;\n isSigning: boolean;\n handleSign: () => Promise<void>;\n reset: () => void;\n }) => React.ReactNode;\n}\n\nexport function MessageSigningForm({\n token: tokenOverride,\n selectedWalletId: walletIdOverride,\n selectedSigner: signerOverride,\n signingMethod: methodOverride,\n walletAdapterSignMessage,\n walletAdapterPublicKey,\n className,\n classNames,\n showContext = true,\n showCharCount = false,\n children,\n}: MessageSigningFormProps) {\n const { token: contextToken } = useCilantroAuth();\n const token = tokenOverride ?? contextToken;\n const selection = useSignerSelection({\n signingMethod: methodOverride ?? \"sdk-signer\",\n walletId: walletIdOverride,\n });\n const selectedWalletId = walletIdOverride ?? selection.selectedWalletId;\n const selectedSigner = signerOverride ?? selection.selectedSigner;\n const signingMethod = methodOverride ?? \"sdk-signer\";\n\n const signing = useMessageSigning({\n token,\n signingMethod,\n selectedSigner,\n selectedWalletId,\n walletAdapterSignMessage,\n walletAdapterPublicKey,\n });\n\n if (children) {\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-message-signing-form>\n {children({\n messageText: signing.messageText,\n setMessageText: signing.setMessageText,\n signResultState: signing.signResultState,\n isSigning: signing.isSigning,\n handleSign: signing.handleSign,\n reset: signing.reset,\n })}\n </div>\n );\n }\n\n const resultStatus = signing.signResultState.status;\n const isSuccess = resultStatus === \"success\";\n const isError = resultStatus === \"error\";\n\n return (\n <Card className={cn(className, classNames?.root)} data-cilantro-message-signing-form>\n <CardHeader className={classNames?.header}>\n <CardTitle className={cn(\"text-lg\", classNames?.title)}>Sign message</CardTitle>\n <CardDescription className={classNames?.description}>\n Sign a message with your selected wallet or signer. The signature proves you control the key.\n </CardDescription>\n {showContext && (selectedWalletId || selectedSigner) && (\n <p className={cn(\"mt-1 text-xs text-muted-foreground\", classNames?.context)}>\n {selectedWalletId && <span>Wallet: {selectedWalletId.slice(0, 8)}…</span>}\n {selectedSigner && (\n <span className={selectedWalletId ? \" ml-2\" : \"\"}>\n Signer: {getSignerDisplayName(selectedSigner)} ({getSignerTypeLabel(selectedSigner.type || selectedSigner.signerType || \"\")})\n </span>\n )}\n </p>\n )}\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-message-text\" className={classNames?.label}>\n Message\n </Label>\n <Textarea\n id=\"cilantro-message-text\"\n className={classNames?.textarea}\n value={signing.messageText}\n onChange={(e) => signing.setMessageText(e.target.value)}\n placeholder=\"Enter the message you want to sign...\"\n rows={4}\n />\n {showCharCount && (\n <p className={cn(\"text-right text-xs text-muted-foreground\", classNames?.charCount)}>\n {signing.messageText.length} character{signing.messageText.length !== 1 ? \"s\" : \"\"}\n </p>\n )}\n </div>\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center\">\n <Button\n type=\"button\"\n size=\"touch\"\n className={cn(\"w-full sm:w-auto\", classNames?.button)}\n onClick={signing.handleSign}\n disabled={signing.isSigning || !signing.messageText.trim()}\n >\n {signing.isSigning ? \"Signing...\" : \"Sign message\"}\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n className={cn(\"w-full sm:w-auto\", classNames?.resetButton)}\n onClick={signing.reset}\n disabled={signing.isSigning}\n >\n Clear\n </Button>\n </div>\n {resultStatus !== \"idle\" && (\n <div\n role=\"status\"\n aria-live={isError ? \"assertive\" : \"polite\"}\n aria-busy={resultStatus === \"loading\"}\n className={cn(\n \"rounded-lg border px-3 py-2 text-sm\",\n isSuccess && cn(\"border-green-500/50 bg-green-500/10 text-green-700 dark:text-green-400\", classNames?.resultSuccess),\n isError && cn(\"border-destructive/50 bg-destructive/10 text-destructive\", classNames?.resultError),\n resultStatus === \"loading\" && \"border-muted bg-muted/50 text-muted-foreground\",\n classNames?.result\n )}\n data-status={resultStatus}\n >\n {signing.signResultState.message}\n {signing.signResultState.detail != null && (\n <pre className={cn(\"mt-2 overflow-auto rounded-md bg-muted/80 p-2 text-xs\", classNames?.resultPre)}>\n {JSON.stringify(signing.signResultState.detail, null, 2)}\n </pre>\n )}\n </div>\n )}\n </CardContent>\n </Card>\n );\n}\n","\"use client\";\n\nimport type { Transaction } from \"@solana/web3.js\";\nimport { useTransactionSigning } from \"../hooks/useTransactionSigning\";\nimport { useCilantroAuth } from \"../providers/CilantroAuthProvider\";\nimport { useSignerSelection } from \"../hooks/useSignerSelection\";\nimport { getSignerDisplayName, getSignerTypeLabel } from \"../core/signer-helpers\";\nimport type { ActionState } from \"../core/types\";\nimport { Button } from \"../ui/button\";\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"../ui/card\";\nimport { cn } from \"../ui/cn\";\n\nexport interface TransactionSigningFormClassNames {\n root?: string;\n header?: string;\n title?: string;\n description?: string;\n context?: string;\n button?: string;\n result?: string;\n resultSuccess?: string;\n resultError?: string;\n resultPre?: string;\n}\n\nexport interface TransactionSigningFormProps {\n token?: string | null;\n selectedWalletId?: string;\n selectedSigner?: import(\"../core/signer-helpers\").SignerData | null;\n signingMethod?: import(\"../hooks/useSignerSelection\").SigningMethod | null;\n walletAdapterSignTransaction?: (tx: Transaction) => Promise<Transaction>;\n walletAdapterPublicKey?: string | null;\n connection?: {\n sendRawTransaction: (buf: Buffer) => Promise<string>;\n getLatestBlockhash: () => Promise<{ blockhash: string; lastValidBlockHeight: number }>;\n confirmTransaction: (opts: { signature: string; blockhash: string; lastValidBlockHeight: number }) => Promise<void>;\n } | null;\n className?: string;\n classNames?: TransactionSigningFormClassNames;\n /** Show wallet/signer context above the form (default: true when wallet/signer selected) */\n showContext?: boolean;\n /** Headless: render content; consumer builds transaction and calls signTransaction(tx) / signAndSendTransaction(tx) */\n children?: (props: {\n transactionResultState: ActionState;\n isSigningTransaction: boolean;\n isSendingTransaction: boolean;\n signTransaction: (transaction: Transaction) => Promise<void>;\n signAndSendTransaction: (transaction: Transaction) => Promise<void>;\n reset: () => void;\n }) => React.ReactNode;\n}\n\nexport function TransactionSigningForm({\n token: tokenOverride,\n selectedWalletId: walletIdOverride,\n selectedSigner: signerOverride,\n signingMethod: methodOverride,\n walletAdapterSignTransaction,\n walletAdapterPublicKey,\n connection,\n className,\n classNames,\n showContext = true,\n children,\n}: TransactionSigningFormProps) {\n const { token: contextToken } = useCilantroAuth();\n const token = tokenOverride ?? contextToken;\n const selection = useSignerSelection({\n signingMethod: methodOverride ?? \"sdk-signer\",\n walletId: walletIdOverride,\n });\n const selectedWalletId = walletIdOverride ?? selection.selectedWalletId;\n const selectedSigner = signerOverride ?? selection.selectedSigner;\n const signingMethod = methodOverride ?? \"sdk-signer\";\n\n const signing = useTransactionSigning({\n token,\n signingMethod,\n selectedSigner,\n selectedWalletId,\n walletAdapterSignTransaction,\n walletAdapterPublicKey,\n connection,\n });\n\n if (children) {\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-transaction-signing-form>\n {children({\n transactionResultState: signing.transactionResultState,\n isSigningTransaction: signing.isSigningTransaction,\n isSendingTransaction: signing.isSendingTransaction,\n signTransaction: signing.signTransaction,\n signAndSendTransaction: signing.signAndSendTransaction,\n reset: signing.reset,\n })}\n </div>\n );\n }\n\n const resultStatus = signing.transactionResultState.status;\n const isSuccess = resultStatus === \"success\";\n const isError = resultStatus === \"error\";\n\n return (\n <Card className={cn(className, classNames?.root)} data-cilantro-transaction-signing-form>\n <CardHeader className={classNames?.header}>\n <CardTitle className={cn(\"text-lg\", classNames?.title)}>Sign transaction</CardTitle>\n <CardDescription className={classNames?.description}>\n Build a transaction in your app, then pass it to <code className=\"text-xs\">signTransaction(tx)</code> to sign\n only, or <code className=\"text-xs\">signAndSendTransaction(tx)</code> to sign and send. Use the render props\n (children) to wire your own UI.\n </CardDescription>\n {showContext && (selectedWalletId || selectedSigner) && (\n <p className={cn(\"mt-1 text-xs text-muted-foreground\", classNames?.context)}>\n {selectedWalletId && <span>Wallet: {selectedWalletId.slice(0, 8)}…</span>}\n {selectedSigner && (\n <span className={selectedWalletId ? \" ml-2\" : \"\"}>\n Signer: {getSignerDisplayName(selectedSigner)} ({getSignerTypeLabel(selectedSigner.type || selectedSigner.signerType || \"\")})\n </span>\n )}\n </p>\n )}\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className={classNames?.button}\n onClick={signing.reset}\n disabled={signing.isSigningTransaction || signing.isSendingTransaction}\n >\n Reset status\n </Button>\n {resultStatus !== \"idle\" && (\n <div\n role=\"status\"\n aria-live={isError ? \"assertive\" : \"polite\"}\n aria-busy={resultStatus === \"loading\"}\n className={cn(\n \"rounded-lg border px-3 py-2 text-sm\",\n isSuccess && cn(\"border-green-500/50 bg-green-500/10 text-green-700 dark:text-green-400\", classNames?.resultSuccess),\n isError && cn(\"border-destructive/50 bg-destructive/10 text-destructive\", classNames?.resultError),\n resultStatus === \"loading\" && \"border-muted bg-muted/50 text-muted-foreground\",\n classNames?.result\n )}\n data-status={resultStatus}\n >\n {signing.transactionResultState.message}\n {signing.transactionResultState.detail != null && (\n <pre className={cn(\"mt-2 overflow-auto rounded-md bg-muted/80 p-2 text-xs\", classNames?.resultPre)}>\n {JSON.stringify(signing.transactionResultState.detail, null, 2)}\n </pre>\n )}\n </div>\n )}\n </CardContent>\n </Card>\n );\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 onSuccess?: () => void;\n onError?: (error: string) => void;\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 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?.(message);\n }\n };\n\n return (\n <Card className={cn(className, classNames?.root)} 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 { 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 { 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 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 onSuccess?: () => void;\n onError?: (error: string) => void;\n /** Override submit button label */\n submitLabel?: string;\n /** Override title */\n title?: string;\n /** Override description */\n description?: string;\n /** Default is true (user is active after registration) */\n isActive?: boolean;\n /** Render \"Already have an account? Sign in\" link. Shown below submit. */\n renderSwitchToLogin?: () => React.ReactNode;\n}\n\nexport function RegisterForm({\n className,\n classNames,\n onSuccess,\n onError,\n submitLabel = \"Create account\",\n title = \"Create an account\",\n description,\n isActive = true,\n renderSwitchToLogin,\n}: RegisterFormProps) {\n const { register, isLoading } = useCilantroAuth();\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 handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n try {\n await register(username.trim(), email.trim(), password, isActive);\n onSuccess?.();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n onError?.(message);\n }\n };\n\n return (\n <Card className={cn(className, classNames?.root)} 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 } 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 type AuthFormMode = \"login\" | \"register\";\n\nexport interface AuthFormClassNames {\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 toggle?: string;\n toggleLink?: string;\n error?: string;\n}\n\nexport interface AuthFormProps {\n /** Initial mode: login or register */\n defaultMode?: AuthFormMode;\n className?: string;\n classNames?: AuthFormClassNames;\n onSuccess?: () => void;\n onError?: (error: string) => void;\n /** Login: submit button label */\n loginSubmitLabel?: string;\n /** Register: submit button label */\n registerSubmitLabel?: string;\n /** Login: title */\n loginTitle?: string;\n /** Register: title */\n registerTitle?: string;\n /** Login: description */\n loginDescription?: string;\n /** Register: description */\n registerDescription?: string;\n /** Text for \"switch to register\" link */\n switchToRegisterText?: string;\n /** Text for \"switch to login\" link */\n switchToLoginText?: string;\n /** Default is true (user is active after registration) */\n isActive?: boolean;\n}\n\nexport function AuthForm({\n defaultMode = \"login\",\n className,\n classNames,\n onSuccess,\n onError,\n loginSubmitLabel = \"Sign in\",\n registerSubmitLabel = \"Create account\",\n loginTitle = \"Welcome back\",\n registerTitle = \"Create an account\",\n loginDescription = \"Sign in with your username or email.\",\n registerDescription = \"Enter your details to get started.\",\n switchToRegisterText = \"Don't have an account? Create one\",\n switchToLoginText = \"Already have an account? Sign in\",\n isActive = true,\n}: AuthFormProps) {\n const { login, register, isLoading } = useCilantroAuth();\n const [mode, setMode] = useState<AuthFormMode>(defaultMode);\n const [usernameOrEmail, setUsernameOrEmail] = useState(\"\");\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 isLogin = mode === \"login\";\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n try {\n if (isLogin) {\n await login(usernameOrEmail.trim(), password);\n } else {\n await register(username.trim(), email.trim(), password, isActive);\n }\n onSuccess?.();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n onError?.(message);\n }\n };\n\n const switchMode = () => {\n setMode(isLogin ? \"register\" : \"login\");\n setError(null);\n };\n\n const canSubmit = isLogin\n ? usernameOrEmail.trim().length > 0 && password.length > 0\n : username.trim().length > 0 && email.trim().length > 0 && password.length > 0;\n\n return (\n <Card className={cn(\"w-full max-w-sm\", className, classNames?.root)} data-cilantro-auth-form>\n <CardHeader className={cn(\"space-y-1 text-center sm:text-left\", classNames?.header)}>\n <CardTitle className={cn(\"text-xl\", classNames?.title)}>\n {isLogin ? loginTitle : registerTitle}\n </CardTitle>\n <CardDescription className={classNames?.description}>\n {isLogin ? loginDescription : registerDescription}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <form onSubmit={handleSubmit} className={cn(\"space-y-4\", classNames?.form)}>\n {isLogin ? (\n <>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-auth-username\" className={classNames?.label}>\n Username or email\n </Label>\n <Input\n id=\"cilantro-auth-username\"\n type=\"text\"\n autoComplete=\"username\"\n className={classNames?.input}\n value={usernameOrEmail}\n onChange={(e) => setUsernameOrEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n disabled={isLoading}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-auth-password\" className={classNames?.label}>\n Password\n </Label>\n <Input\n id=\"cilantro-auth-password\"\n type=\"password\"\n autoComplete=\"current-password\"\n className={classNames?.input}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"••••••••\"\n required\n disabled={isLoading}\n />\n </div>\n </>\n ) : (\n <>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-auth-reg-username\" className={classNames?.label}>\n Username\n </Label>\n <Input\n id=\"cilantro-auth-reg-username\"\n type=\"text\"\n autoComplete=\"username\"\n className={classNames?.input}\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n placeholder=\"johndoe\"\n required\n disabled={isLoading}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-auth-reg-email\" className={classNames?.label}>\n Email\n </Label>\n <Input\n id=\"cilantro-auth-reg-email\"\n type=\"email\"\n autoComplete=\"email\"\n className={classNames?.input}\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n disabled={isLoading}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-auth-reg-password\" className={classNames?.label}>\n Password\n </Label>\n <Input\n id=\"cilantro-auth-reg-password\"\n type=\"password\"\n autoComplete=\"new-password\"\n className={classNames?.input}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"••••••••\"\n required\n disabled={isLoading}\n />\n </div>\n </>\n )}\n\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\n <Button\n type=\"submit\"\n size=\"touch\"\n className={cn(\"w-full\", classNames?.submitButton)}\n disabled={isLoading || !canSubmit}\n >\n {isLoading\n ? isLogin\n ? \"Signing in...\"\n : \"Creating account...\"\n : isLogin\n ? loginSubmitLabel\n : registerSubmitLabel}\n </Button>\n\n <p className={cn(\"text-center text-sm text-muted-foreground\", classNames?.toggle)}>\n <button\n type=\"button\"\n className={cn(\"underline underline-offset-2 hover:text-foreground\", classNames?.toggleLink)}\n onClick={switchMode}\n disabled={isLoading}\n >\n {isLogin ? switchToRegisterText : switchToLoginText}\n </button>\n </p>\n </form>\n </CardContent>\n </Card>\n );\n}\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 /** 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 CilantroAuthProvider.\n */\nexport function AuthGuard({\n children,\n fallback,\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 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 {\n createEmailSignerHelper,\n createPhoneSignerHelper,\n createExternalSignerHelper,\n registerPasskeySigner,\n} from \"../core/signer-creation\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../ui/dialog\";\nimport { cn } from \"../ui/cn\";\n\nexport type AddSignerType = \"email\" | \"phone\" | \"passkey\" | \"external\";\n\nexport interface AddSignerFormClassNames {\n root?: string;\n dialog?: string;\n form?: string;\n label?: string;\n input?: string;\n submitButton?: string;\n cancelButton?: string;\n error?: string;\n}\n\nexport interface AddSignerFormProps {\n walletId: string;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n onSuccess?: () => void;\n onCancel?: () => void;\n onError?: (error: string) => void;\n className?: string;\n classNames?: AddSignerFormClassNames;\n /** When true, render as a dialog. When false, render inline. */\n asDialog?: boolean;\n}\n\nexport function AddSignerForm({\n walletId,\n open = true,\n onOpenChange,\n onSuccess,\n onCancel,\n onError,\n className,\n classNames,\n asDialog = true,\n}: AddSignerFormProps) {\n const [signerType, setSignerType] = useState<AddSignerType | null>(null);\n const [email, setEmail] = useState(\"\");\n const [phone, setPhone] = useState(\"\");\n const [address, setAddress] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const resetForm = () => {\n setSignerType(null);\n setEmail(\"\");\n setPhone(\"\");\n setAddress(\"\");\n setError(null);\n };\n\n const handleClose = (open: boolean) => {\n if (!open) {\n resetForm();\n onCancel?.();\n }\n onOpenChange?.(open);\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!signerType) return;\n setError(null);\n setIsSubmitting(true);\n try {\n if (signerType === \"email\") {\n await createEmailSignerHelper(walletId, email);\n } else if (signerType === \"phone\") {\n await createPhoneSignerHelper(walletId, phone);\n } else if (signerType === \"passkey\") {\n await registerPasskeySigner(walletId);\n } else if (signerType === \"external\") {\n await createExternalSignerHelper(walletId, address);\n }\n resetForm();\n onSuccess?.();\n handleClose(false);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n onError?.(message);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handlePasskeyClick = () => {\n setSignerType(\"passkey\");\n setError(null);\n setIsSubmitting(true);\n registerPasskeySigner(walletId)\n .then(() => {\n resetForm();\n onSuccess?.();\n handleClose(false);\n })\n .catch((err) => {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n onError?.(message);\n })\n .finally(() => setIsSubmitting(false));\n };\n\n const formContent = (\n <form onSubmit={handleSubmit} className={cn(\"space-y-4\", classNames?.form)}>\n {!signerType ? (\n <>\n <div className=\"space-y-2\" role=\"group\" aria-labelledby=\"add-signer-type-label\">\n <Label id=\"add-signer-type-label\" className={classNames?.label}>Signer type</Label>\n <div className=\"flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setSignerType(\"email\")}\n disabled={isSubmitting}\n >\n Email\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setSignerType(\"phone\")}\n disabled={isSubmitting}\n >\n Phone\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={handlePasskeyClick}\n disabled={isSubmitting}\n >\n Passkey\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setSignerType(\"external\")}\n disabled={isSubmitting}\n >\n External wallet\n </Button>\n </div>\n </div>\n {asDialog && (\n <DialogFooter className=\"gap-2 sm:gap-0\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className={classNames?.cancelButton}\n onClick={() => handleClose(false)}\n disabled={isSubmitting}\n >\n Cancel\n </Button>\n </DialogFooter>\n )}\n </>\n ) : signerType === \"email\" ? (\n <>\n <div className=\"space-y-2\">\n <Label htmlFor=\"add-signer-email\" className={classNames?.label}>\n Email\n </Label>\n <Input\n id=\"add-signer-email\"\n type=\"email\"\n autoComplete=\"email\"\n className={classNames?.input}\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"email@example.com\"\n required\n disabled={isSubmitting}\n />\n </div>\n {asDialog && (\n <DialogFooter className=\"gap-2 sm:gap-0\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className={classNames?.cancelButton}\n onClick={() => setSignerType(null)}\n disabled={isSubmitting}\n >\n Back\n </Button>\n <Button type=\"submit\" className={classNames?.submitButton} disabled={isSubmitting}>\n {isSubmitting ? \"Adding...\" : \"Add signer\"}\n </Button>\n </DialogFooter>\n )}\n {!asDialog && (\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className={classNames?.cancelButton}\n onClick={() => setSignerType(null)}\n disabled={isSubmitting}\n >\n Back\n </Button>\n <Button type=\"submit\" className={classNames?.submitButton} disabled={isSubmitting}>\n {isSubmitting ? \"Adding...\" : \"Add signer\"}\n </Button>\n </div>\n )}\n </>\n ) : signerType === \"phone\" ? (\n <>\n <div className=\"space-y-2\">\n <Label htmlFor=\"add-signer-phone\" className={classNames?.label}>\n Phone number\n </Label>\n <Input\n id=\"add-signer-phone\"\n type=\"tel\"\n autoComplete=\"tel\"\n className={classNames?.input}\n value={phone}\n onChange={(e) => setPhone(e.target.value)}\n placeholder=\"+1234567890\"\n required\n disabled={isSubmitting}\n />\n </div>\n {asDialog && (\n <DialogFooter className=\"gap-2 sm:gap-0\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className={classNames?.cancelButton}\n onClick={() => setSignerType(null)}\n disabled={isSubmitting}\n >\n Back\n </Button>\n <Button type=\"submit\" className={classNames?.submitButton} disabled={isSubmitting}>\n {isSubmitting ? \"Adding...\" : \"Add signer\"}\n </Button>\n </DialogFooter>\n )}\n {!asDialog && (\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className={classNames?.cancelButton}\n onClick={() => setSignerType(null)}\n disabled={isSubmitting}\n >\n Back\n </Button>\n <Button type=\"submit\" className={classNames?.submitButton} disabled={isSubmitting}>\n {isSubmitting ? \"Adding...\" : \"Add signer\"}\n </Button>\n </div>\n )}\n </>\n ) : signerType === \"external\" ? (\n <>\n <div className=\"space-y-2\">\n <Label htmlFor=\"add-signer-address\" className={classNames?.label}>\n Wallet address\n </Label>\n <Input\n id=\"add-signer-address\"\n type=\"text\"\n className={classNames?.input}\n value={address}\n onChange={(e) => setAddress(e.target.value)}\n placeholder=\"Solana address\"\n required\n disabled={isSubmitting}\n />\n </div>\n {asDialog && (\n <DialogFooter className=\"gap-2 sm:gap-0\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className={classNames?.cancelButton}\n onClick={() => setSignerType(null)}\n disabled={isSubmitting}\n >\n Back\n </Button>\n <Button type=\"submit\" className={classNames?.submitButton} disabled={isSubmitting}>\n {isSubmitting ? \"Adding...\" : \"Add signer\"}\n </Button>\n </DialogFooter>\n )}\n {!asDialog && (\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className={classNames?.cancelButton}\n onClick={() => setSignerType(null)}\n disabled={isSubmitting}\n >\n Back\n </Button>\n <Button type=\"submit\" className={classNames?.submitButton} disabled={isSubmitting}>\n {isSubmitting ? \"Adding...\" : \"Add signer\"}\n </Button>\n </div>\n )}\n </>\n ) : null}\n {error && (\n <div className={cn(\"text-sm text-destructive\", classNames?.error)} role=\"alert\">\n {error}\n </div>\n )}\n </form>\n );\n\n if (asDialog) {\n return (\n <Dialog open={open} onOpenChange={handleClose}>\n <DialogContent className={cn(classNames?.dialog)}>\n <DialogHeader>\n <DialogTitle>Add signer</DialogTitle>\n <DialogDescription>Add a new signer to this wallet.</DialogDescription>\n </DialogHeader>\n {formContent}\n </DialogContent>\n </Dialog>\n );\n }\n\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-add-signer-form>\n <h3 className=\"text-sm font-medium mb-2\">Add signer</h3>\n {formContent}\n </div>\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 { 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 { AddSignerForm } from \"./AddSignerForm\";\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 className?: string;\n classNames?: SignerListClassNames;\n /** Callback when a signer is added (e.g. to refresh parent state) */\n onSignerAdded?: () => void;\n /** When true (default), show skeleton rows while loading; when false, show \"Loading signers...\" text. */\n useSkeleton?: boolean;\n /** Custom render for the list of signers */\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 className,\n classNames,\n onSignerAdded,\n useSkeleton = true,\n children,\n}: SignerListProps) {\n const { signers, isLoading, error, refresh } = useSigners({ walletId });\n const [addSignerOpen, setAddSignerOpen] = useState(false);\n\n const handleAddSuccess = () => {\n refresh();\n onSignerAdded?.();\n };\n\n if (children) {\n return (\n <>\n {children({\n signers,\n isLoading,\n error,\n refresh,\n openAddSigner: () => setAddSignerOpen(true),\n })}\n <AddSignerForm\n walletId={walletId}\n open={addSignerOpen}\n onOpenChange={setAddSignerOpen}\n onSuccess={handleAddSuccess}\n asDialog\n />\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\n className={cn(\"space-y-1\", classNames?.loading)}\n aria-busy=\"true\"\n aria-live=\"polite\"\n >\n {[1, 2, 3].map((i) => (\n <Skeleton\n key={i}\n className={cn(\"h-5 w-full rounded-md\", classNames?.skeleton)}\n />\n ))}\n </div>\n ) : isLoading ? (\n <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>Loading signers...</p>\n ) : error ? (\n <p className={cn(\"text-sm text-destructive\", classNames?.message)} role=\"alert\">\n {error}\n </p>\n ) : signers.length === 0 ? (\n <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>No signers. Add one to get started.</p>\n ) : (\n <ul className={cn(\"space-y-1\", classNames?.list)} role=\"list\">\n {signers.map((signer) => (\n <li key={signer.id} className={cn(\"text-sm\", classNames?.item)}>\n {getSignerDisplayName(signer)} ({getSignerTypeLabel(signer.type || signer.signerType || \"\")})\n </li>\n ))}\n </ul>\n )}\n <AddSignerForm\n walletId={walletId}\n open={addSignerOpen}\n onOpenChange={setAddSignerOpen}\n onSuccess={handleAddSuccess}\n asDialog\n />\n </div>\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"],"mappings":"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","names":["useEffect","platformApiKey","apiUrl","createContext","useContext","useEffect","useState","jsx","createContext","useState","useEffect","useContext","jsx","platformApiKey","apiUrl","useEffect","useState","useEffect","useState","useEffect","useState","useEffect","useCallback","listSigners","useState","useCallback","listSigners","useEffect","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useEffect","useCallback","useState","useEffect","useCallback","useState","deriveSignerKeypair","getEmailSignerKeypair","getPhoneSignerKeypair","PublicKey","PublicKey","extractSignerInfo","extractSignerInfo","getEmailSignerKeypair","getPhoneSignerKeypair","deriveSignerKeypair","signWithSigner","signWithEmailSigner","signWithPhoneSigner","PublicKey","PublicKey","signWithSigner","extractSignerInfo","signWithEmailSigner","signWithPhoneSigner","signWithPasskeySigner","PublicKey","PublicKey","useState","useState","useState","jsx","jsx","React","jsx","jsx","jsxs","React","jsx","Fragment","jsx","jsxs","Fragment","jsx","jsxs","React","jsx","React","cva","jsx","cva","React","jsx","jsx","jsxs","jsx","jsxs","useState","React","jsx","jsx","jsxs","useState","useState","jsx","jsxs","useState","useState","Fragment","jsx","jsxs","useState","Fragment","jsx","jsxs","useState","React","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","useState","open","useState","Fragment","jsx","jsxs","useState","React","Fragment","jsx","jsxs"]}