cilantro-react 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +965 -518
- package/dist/index.d.mts +506 -554
- package/dist/index.d.ts +506 -554
- package/dist/index.js +2471 -2525
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2475 -2532
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../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":["/**\n * cilantro-react - Public API\n * React SDK/UI for Cilantro Smart Wallet\n */\n\n// Providers\nexport { CilantroProvider } from \"./providers/CilantroProvider\";\nexport {\n CilantroAuthProvider,\n useCilantroAuth,\n type CilantroAuthContextType,\n type CilantroAuthProviderProps,\n type User,\n} from \"./providers/CilantroAuthProvider\";\nexport {\n WalletProvider,\n useWallets,\n type WalletContextType,\n type WalletData,\n type WalletDataDto,\n type WalletProviderProps,\n} from \"./providers/WalletProvider\";\n\n// Hooks\nexport { useSelectedWallet, type UseSelectedWalletResult } from \"./hooks/useSelectedWallet\";\nexport { useWalletAddress } from \"./hooks/useWalletAddress\";\nexport { useSigners, type UseSignersOptions, type UseSignersResult } from \"./hooks/useSigners\";\nexport {\n useSignersRaw,\n type UseSignersRawOptions,\n type UseSignersRawResult,\n type SignersListResponseDto,\n} from \"./hooks/useSignersRaw\";\nexport {\n useSignersForSelectedWallet,\n type UseSignersForSelectedWalletOptions,\n} from \"./hooks/useSignersForSelectedWallet\";\nexport {\n useDelegatedKeys,\n type UseDelegatedKeysOptions,\n type UseDelegatedKeysResult,\n type DelegatedKeyDataDto,\n} from \"./hooks/useDelegatedKeys\";\nexport {\n useSignerSelection,\n type SigningMethod,\n type UseSignerSelectionOptions,\n type UseSignerSelectionResult,\n} from \"./hooks/useSignerSelection\";\nexport {\n useCanSign,\n type UseCanSignOptions,\n type UseCanSignResult,\n} from \"./hooks/useCanSign\";\nexport {\n useMessageSigning,\n type UseMessageSigningOptions,\n type UseMessageSigningResult,\n} from \"./hooks/useMessageSigning\";\nexport {\n useTransactionSigning,\n type UseTransactionSigningOptions,\n type UseTransactionSigningResult,\n} from \"./hooks/useTransactionSigning\";\n\n// Components\nexport {\n WalletSelector,\n type WalletSelectorProps,\n type WalletSelectorClassNames,\n} from \"./components/WalletSelector\";\nexport {\n SignerSelector,\n type SignerSelectorProps,\n type SignerSelectorClassNames,\n} from \"./components/SignerSelector\";\nexport {\n DelegatedKeySelector,\n type DelegatedKeyData,\n type DelegatedKeySelectorProps,\n type DelegatedKeySelectorClassNames,\n} from \"./components/DelegatedKeySelector\";\nexport {\n MessageSigningForm,\n type MessageSigningFormProps,\n type MessageSigningFormClassNames,\n} from \"./components/MessageSigningForm\";\nexport {\n TransactionSigningForm,\n type TransactionSigningFormProps,\n type TransactionSigningFormClassNames,\n} from \"./components/TransactionSigningForm\";\nexport { LoginForm, type LoginFormProps, type LoginFormClassNames } from \"./components/LoginForm\";\nexport { RegisterForm, type RegisterFormProps, type RegisterFormClassNames } from \"./components/RegisterForm\";\nexport {\n AuthForm,\n type AuthFormProps,\n type AuthFormClassNames,\n type AuthFormMode,\n} from \"./components/AuthForm\";\nexport { AuthGuard, type AuthGuardProps, type AuthGuardClassNames } from \"./components/AuthGuard\";\nexport {\n AddSignerForm,\n type AddSignerFormProps,\n type AddSignerFormClassNames,\n type AddSignerType,\n} from \"./components/AddSignerForm\";\nexport {\n SignerList,\n type SignerListProps,\n type SignerListClassNames,\n} from \"./components/SignerList\";\n\n// UI primitives (for customization / headless use)\nexport { Skeleton } from \"./ui/skeleton\";\nexport {\n ThemeProvider,\n type Theme,\n type ResolvedTheme,\n type ThemeProviderProps,\n} from \"./ui/theme-provider\";\n\n// Core types (for consumers)\nexport type { ActionState, ApiResponse, ErrorResponse } from \"./core/types\";\nexport type { SignerData } from \"./core/signer-helpers\";\nexport { extractResponseData } from \"./core/types\";\nexport { extractErrorMessage } from \"./core/error-utils\";\n\n// Signer signing (for advanced usage)\nexport {\n signMessageWithSigner,\n signAndSendTransactionWithSigner,\n signTransactionWithSigner,\n getWalletData,\n getSignerPublicKey,\n SIGNER_TYPES,\n type SignerType,\n type SignAndSendConnection,\n type SignAndSendResult,\n type SubmitTransactionDataDto,\n type SignMessageResult,\n} from \"./core/signer-signing\";\n\n// SDK-aligned types (re-exports from cilantro-sdk where used by hooks)\nexport type { AuthControllerLogin200Data } from \"cilantro-sdk/auth\";\nexport type {\n WalletControllerFindAllResult,\n WalletControllerFindOneResult,\n WalletControllerSubmitTransactionResult,\n WalletControllerListSignersResult,\n} from \"cilantro-sdk/wallet\";\nexport type {\n DelegatedKeyControllerFindAllResult,\n} from \"cilantro-sdk/delegated-keys\";\nexport type { TransactionControllerSendRawPasskeyTransactionResult } from \"cilantro-sdk/transactions\";\n","\"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 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 } else {\n setSdkAuth(null);\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 const jwt =\n (data && \"jwt\" in data ? (data as { jwt?: string }).jwt : undefined) ??\n (data && \"accessToken\" in data ? (data as { accessToken?: string }).accessToken : undefined);\n if (!jwt) throw new Error(\"No JWT token received from server\");\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\";\nimport { extractErrorMessage } from \"../core/error-utils\";\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 error: string | null;\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 const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (token) {\n setSdkAuth(token);\n loadWallets();\n } else {\n setWallets([]);\n setSelectedWallet(null);\n setError(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 setError(null);\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 (err) {\n console.error(\"Failed to load wallets:\", err);\n setWallets([]);\n setError(extractErrorMessage(err));\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 error,\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 isEmpty = !isLoading && wallets.length === 0;\n const effectiveValue = value ?? selectedWallet?.id ?? selectedWallet?.walletId ?? \"\";\n const selected = wallets.find((w) => w.id === effectiveValue || w.walletId === effectiveValue) ?? selectedWallet;\n\n const handleSelect = (wallet: WalletData) => {\n const id = wallet.id ?? wallet.walletId;\n selectWallet(id);\n 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 if (isEmpty) {\n return (\n <div\n className={cn(\n \"rounded-md border border-input bg-muted/30 px-4 py-3 text-sm text-muted-foreground\",\n className,\n classNames?.root\n )}\n data-cilantro-wallet-selector\n >\n <p className=\"font-medium text-foreground\">No wallets</p>\n <p className=\"mt-1\">Wallets are created by the platform when you sign in. If you just logged in, try refreshing.</p>\n </div>\n );\n }\n\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-wallet-selector>\n <Select value={effectiveValue || undefined} onValueChange={handleValueChange} disabled={isLoading}>\n <SelectTrigger className={classNames?.trigger} aria-label=\"Select wallet\">\n <SelectValue placeholder={isLoading ? \"Loading...\" : placeholder} />\n </SelectTrigger>\n <SelectContent className={classNames?.content}>\n {wallets.map((w) => {\n const id = w.id ?? w.walletId;\n return (\n <SelectItem key={id} value={id} className={classNames?.item}>\n {w.walletName || id}\n </SelectItem>\n );\n })}\n </SelectContent>\n </Select>\n </div>\n );\n}\n","\"use client\";\n\nimport * 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 <div className={cn(\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2\", classNames?.message)} role=\"alert\">\n <p className=\"text-sm text-destructive\">{error}</p>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-2\"\n onClick={() => refresh()}\n >\n Retry\n </Button>\n </div>\n ) : signers.length === 0 ? (\n <div className={cn(\"rounded-md border border-input bg-muted/30 px-4 py-3 text-sm text-muted-foreground\", classNames?.message)}>\n <p className=\"font-medium text-foreground\">No signers</p>\n <p className=\"mt-1\">Add a signer to authorize transactions for this wallet.</p>\n <Button\n type=\"button\"\n size=\"touch\"\n variant=\"outline\"\n className={cn(\"mt-3\", classNames?.addButton)}\n onClick={() => setAddSignerOpen(true)}\n aria-label=\"Add signer\"\n >\n Add signer\n </Button>\n </div>\n ) : (\n <ul className={cn(\"space-y-1\", classNames?.list)} role=\"list\">\n {signers.map((signer) => (\n <li key={signer.id} className={cn(\"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":["import_react","import_cilantro_sdk","platformApiKey","apiUrl","cilantroLogin","createUser","import_react","import_jsx_runtime","findAllWallets","import_jsx_runtime","platformApiKey","apiUrl","import_react","import_helpers","import_wallet","import_react","import_wallet","import_react","import_react","import_react","import_react","import_helpers","import_helpers","import_web3","import_helpers","import_wallet","createEmailSignerSDK","createPhoneSignerSDK","import_helpers","extractSignerInfo","extractSignerInfo","import_helpers","import_wallet","import_web3","extractSignerInfo","signWithPasskeySigner","import_web3","import_wallet","findOneWallet","import_react","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","React","import_class_variance_authority","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","React","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","React","import_jsx_runtime","import_jsx_runtime","open","import_react","import_jsx_runtime","React","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/context/CilantroContext.tsx","../src/core/auth.ts","../src/core/storage-adapter.ts","../src/core/types.ts","../src/core/error-utils.ts","../src/core/normalize.ts","../src/providers/CilantroProvider.tsx","../src/providers/CilantroAuthProvider.tsx","../src/providers/WalletProvider.tsx","../src/hooks/useCilantroConfig.ts","../src/hooks/useAuth.ts","../src/hooks/useWallet.ts","../src/hooks/useSigners.ts","../src/core/signer-helpers.ts","../src/core/signer-creation.ts","../src/hooks/usePasskey.ts","../src/hooks/useExternalWallet.ts","../src/hooks/useSendTransaction.ts","../src/components/auth/LoginForm.tsx","../src/ui/button.tsx","../src/ui/cn.ts","../src/ui/input.tsx","../src/ui/label.tsx","../src/ui/card.tsx","../src/components/auth/LogoutButton.tsx","../src/ui/dialog.tsx","../src/ui/skeleton.tsx","../src/components/auth/AuthGuard.tsx","../src/components/signers/CreateEmailSignerForm.tsx","../src/components/signers/CreatePhoneSignerForm.tsx","../src/components/signers/AddPasskeyButton.tsx","../src/components/signers/SignerList.tsx","../src/components/signers/SignerSelector.tsx","../src/components/wallet/ConnectWalletButton.tsx","../src/components/wallet/CreateWalletForm.tsx","../src/ui/select.tsx","../src/components/wallet/WalletSelector.tsx","../src/components/wallet/WalletAddress.tsx","../src/components/wallet/WalletBalance.tsx","../src/components/transactions/SendSOLForm.tsx","../src/components/transactions/SendSPLForm.tsx","../src/components/transactions/TransactionStatus.tsx","../src/components/transactions/TransactionHistory.tsx","../src/components/layout/CilantroConnect.tsx","../src/components/layout/LoadingOverlay.tsx","../src/components/layout/ErrorBoundary.tsx","../src/ui/theme-provider.tsx","../src/adapters/solana-connection.ts","../src/core/signer-signing/core.ts","../src/core/signer-signing/constants.ts","../src/core/signer-signing/storage.ts","../src/core/signer-signing/message-signing.ts","../src/core/signer-signing/errors.ts","../src/core/signer-signing/signer-types.ts","../src/core/signer-signing/transaction-signing.ts","../src/core/signer-signing/validation.ts","../src/core/signer-signing/wallet-data.ts"],"sourcesContent":["/**\n * cilantro-react - Public API\n * React SDK/UI for Cilantro Smart Wallet (guide-aligned)\n */\n\n// Context\nexport {\n CilantroContextProvider,\n useCilantroContext,\n type CilantroConfig,\n type CilantroContextValue,\n type User,\n type WalletData,\n type WalletDataDto,\n} from \"./context/CilantroContext\";\n\n// Provider (single entry point)\nexport {\n CilantroProvider,\n type CilantroProviderProps,\n} from \"./providers/CilantroProvider\";\n\n// Auth/wallet hooks (read from context)\nexport { useCilantroAuth, type CilantroAuthContextType } from \"./providers/CilantroAuthProvider\";\nexport {\n useWallets,\n type WalletContextType,\n type WalletData as WalletDataFromHook,\n type WalletDataDto as WalletDataDtoFromHook,\n} from \"./providers/WalletProvider\";\n\n// Storage adapters\nexport {\n createIndexedDBAdapter,\n createLocalStorageAdapter,\n createMemoryAdapter,\n} from \"cilantro-sdk/helpers\";\nexport type { DeviceKeyStorage } from \"./core/storage-adapter\";\n\n// Hooks (guide API)\nexport { useCilantroConfig, type UseCilantroConfigResult } from \"./hooks/useCilantroConfig\";\nexport { useAuth, type UseAuthResult } from \"./hooks/useAuth\";\nexport { useWallet, type UseWalletResult } from \"./hooks/useWallet\";\nexport { useSigners, type UseSignersOptions, type UseSignersResult } from \"./hooks/useSigners\";\nexport { usePasskey, type UsePasskeyResult } from \"./hooks/usePasskey\";\nexport {\n useExternalWallet,\n type UseExternalWalletResult,\n type SolanaWallet,\n} from \"./hooks/useExternalWallet\";\nexport {\n useSendTransaction,\n type UseSendTransactionResult,\n type SubmitTransactionResult,\n type SignerType as SendTransactionSignerType,\n} from \"./hooks/useSendTransaction\";\n\n// Auth components\nexport { LoginForm, type LoginFormProps, type LoginFormClassNames } from \"./components/auth/LoginForm\";\nexport { LogoutButton, type LogoutButtonProps } from \"./components/auth/LogoutButton\";\nexport { AuthGuard, type AuthGuardProps, type AuthGuardClassNames } from \"./components/auth/AuthGuard\";\n\n// Signer components\nexport {\n CreateEmailSignerForm,\n type CreateEmailSignerFormProps,\n} from \"./components/signers/CreateEmailSignerForm\";\nexport {\n CreatePhoneSignerForm,\n type CreatePhoneSignerFormProps,\n} from \"./components/signers/CreatePhoneSignerForm\";\nexport { AddPasskeyButton, type AddPasskeyButtonProps } from \"./components/signers/AddPasskeyButton\";\nexport {\n SignerList,\n type SignerListProps,\n type SignerListClassNames,\n} from \"./components/signers/SignerList\";\nexport {\n SignerSelector,\n type SignerSelectorProps,\n type SignerSelectorClassNames,\n} from \"./components/signers/SignerSelector\";\n\n// Wallet components\nexport {\n ConnectWalletButton,\n type ConnectWalletButtonProps,\n} from \"./components/wallet/ConnectWalletButton\";\nexport {\n CreateWalletForm,\n type CreateWalletFormProps,\n} from \"./components/wallet/CreateWalletForm\";\nexport {\n WalletSelector,\n type WalletSelectorProps,\n type WalletSelectorClassNames,\n} from \"./components/wallet/WalletSelector\";\nexport { WalletAddress, type WalletAddressProps } from \"./components/wallet/WalletAddress\";\nexport { WalletBalance, type WalletBalanceProps } from \"./components/wallet/WalletBalance\";\n\n// Transaction components\nexport {\n SendSOLForm,\n type SendSOLFormProps,\n type SignerType as SendSOLSignerType,\n} from \"./components/transactions/SendSOLForm\";\nexport {\n SendSPLForm,\n type SendSPLFormProps,\n} from \"./components/transactions/SendSPLForm\";\nexport {\n TransactionStatus,\n type TransactionStatusProps,\n} from \"./components/transactions/TransactionStatus\";\nexport {\n TransactionHistory,\n type TransactionHistoryProps,\n} from \"./components/transactions/TransactionHistory\";\n\n// Layout / utility\nexport {\n CilantroConnect,\n type CilantroConnectProps,\n type WalletInfo,\n} from \"./components/layout/CilantroConnect\";\nexport { LoadingOverlay, type LoadingOverlayProps } from \"./components/layout/LoadingOverlay\";\nexport { ErrorBoundary, type ErrorBoundaryProps } from \"./components/layout/ErrorBoundary\";\n\n// UI primitives\nexport { Skeleton } from \"./ui/skeleton\";\nexport {\n ThemeProvider,\n type Theme,\n type ResolvedTheme,\n type ThemeProviderProps,\n} from \"./ui/theme-provider\";\n\n// Core types and utilities\nexport type { ActionState, ApiResponse, ErrorResponse } from \"./core/types\";\nexport type { SignerData } from \"./core/signer-helpers\";\nexport { normalizeSigner } from \"./core/signer-helpers\";\nexport { normalizeWallet } from \"./core/normalize\";\nexport type { NormalizedWallet } from \"./core/normalize\";\nexport { extractResponseData } from \"./core/types\";\nexport { extractErrorMessage, isAuthError } from \"./core/error-utils\";\nexport { isJwtExpired } from \"./core/auth\";\n\n// Solana connection adapter (advanced usage)\nexport {\n adaptSolanaConnection,\n type SignAndSendConnectionAdapter,\n} from \"./adapters/solana-connection\";\n\n// Signer signing (advanced usage)\nexport {\n signMessageWithSigner,\n signAndSendTransactionWithSigner,\n signTransactionWithSigner,\n getWalletData,\n getSignerPublicKey,\n SIGNER_TYPES,\n type SignerType,\n type SignAndSendConnection,\n type SignAndSendResult,\n type SubmitTransactionDataDto,\n type SignMessageResult,\n} from \"./core/signer-signing\";\n\n// SDK types (re-exports)\nexport type { AuthControllerLogin200Data } from \"cilantro-sdk/auth\";\nexport type {\n WalletControllerFindAllResult,\n WalletControllerFindOneResult,\n WalletControllerSubmitTransactionResult,\n WalletControllerListSignersResult,\n} from \"cilantro-sdk/wallet\";\nexport type { TransactionControllerSendRawPasskeyTransactionResult } from \"cilantro-sdk/transactions\";\n","\"use client\";\n\nimport {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { clearAuth } from \"cilantro-sdk\";\nimport { login as cilantroLogin } from \"cilantro-sdk/auth\";\nimport type { AuthControllerLogin200Data } from \"cilantro-sdk/auth\";\nimport { create as createUser } from \"cilantro-sdk/user\";\nimport { create as createWalletSDK, findAll as findAllWallets } from \"cilantro-sdk/wallet\";\nimport type {\n WalletControllerFindAllResult,\n WalletControllerCreateResult,\n} from \"cilantro-sdk/wallet\";\nimport { setAuthConfig, setSdkAuth, getPlatformApiKey, isJwtExpired } from \"../core/auth\";\nimport { setStorageAdapter } from \"../core/storage-adapter\";\nimport type { DeviceKeyStorage } from \"../core/storage-adapter\";\nimport { extractResponseData } from \"../core/types\";\nimport { extractErrorMessage, isAuthError } from \"../core/error-utils\";\nimport { normalizeWallet } from \"../core/normalize\";\n\nconst DEFAULT_BASE_URL = \"https://api.cilantro.gg\";\nconst DEFAULT_JWT_STORAGE_KEY = \"cilantro_jwt\";\nconst DEFAULT_WALLET_STORAGE_KEY = \"cilantro_selected_wallet_id\";\n\n/** Minimal user view; populated from SDK login result data.user when available. */\nexport interface User {\n username?: string;\n email?: string;\n userType?: string;\n}\n\n/** SDK wallet list item type. */\nexport type WalletDataDto = WalletControllerFindAllResult[\"data\"] extends readonly (infer E)[]\n ? E\n : WalletControllerFindAllResult[\"data\"] extends (infer E)[]\n ? E\n : never;\n\n/** Wallet with backward-compat aliases (id, address, active). */\nexport type WalletData = WalletDataDto & {\n id?: string;\n address?: string;\n active?: boolean;\n};\n\nexport interface CilantroConfig {\n apiKey?: string;\n baseURL: string;\n jwt?: string | null;\n}\n\nexport interface CilantroContextValue {\n config: CilantroConfig;\n storage: DeviceKeyStorage | null;\n // Auth\n user: User | null;\n jwt: string | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n login: (params: { usernameOrEmail: string; password: string }) => Promise<void>;\n logout: () => void;\n register: (\n username: string,\n email: string,\n password: string,\n isActive?: boolean\n ) => Promise<void>;\n clearSessionDueToAuthError: () => void;\n // Wallet\n wallet: WalletData | null;\n wallets: WalletData[];\n createWallet: (params: { name: string; userId?: string }) => Promise<WalletControllerCreateResult>;\n selectWallet: (walletId: string) => void;\n refreshWallets: () => Promise<void>;\n walletError: string | null;\n walletsLoading: boolean;\n}\n\nconst CilantroContext = createContext<CilantroContextValue | undefined>(undefined);\n\nexport interface CilantroContextProviderProps {\n children: ReactNode;\n apiKey?: string;\n baseURL?: string;\n storageAdapter?: DeviceKeyStorage | null;\n jwtStorageKey?: string;\n walletStorageKey?: string;\n onLoginSuccess?: () => void;\n onLogout?: () => void;\n onRegisterSuccess?: () => void;\n onSessionExpired?: () => void;\n}\n\nexport function CilantroContextProvider({\n children,\n apiKey,\n baseURL = DEFAULT_BASE_URL,\n storageAdapter = null,\n jwtStorageKey = DEFAULT_JWT_STORAGE_KEY,\n walletStorageKey = DEFAULT_WALLET_STORAGE_KEY,\n onLoginSuccess,\n onLogout,\n onRegisterSuccess,\n onSessionExpired,\n}: CilantroContextProviderProps) {\n const [user, setUser] = useState<User | null>(null);\n const [jwt, setJwt] = useState<string | null>(null);\n const [authLoading, setAuthLoading] = useState(true);\n const [wallets, setWallets] = useState<WalletData[]>([]);\n const [selectedWallet, setSelectedWallet] = useState<WalletData | null>(null);\n const [walletsLoading, setWalletsLoading] = useState(true);\n const [walletError, setWalletError] = useState<string | null>(null);\n\n const config = useMemo<CilantroConfig>(\n () => ({\n apiKey,\n baseURL,\n jwt: jwt ?? undefined,\n }),\n [apiKey, baseURL, jwt]\n );\n\n // Inject storage adapter into core so signer creation uses it\n useEffect(() => {\n setStorageAdapter(storageAdapter ?? null);\n return () => setStorageAdapter(null);\n }, [storageAdapter]);\n\n // Set SDK auth config and restore session from storage\n useEffect(() => {\n setAuthConfig({ apiKey, baseURL });\n const storedToken =\n typeof window !== \"undefined\" ? localStorage.getItem(jwtStorageKey) : null;\n if (storedToken) {\n if (isJwtExpired(storedToken)) {\n if (typeof window !== \"undefined\") {\n localStorage.removeItem(jwtStorageKey);\n const keys = Object.keys(localStorage);\n keys.forEach((key) => {\n if (key.startsWith(\"delegated-key-\")) localStorage.removeItem(key);\n });\n }\n setSdkAuth(null);\n } else {\n setJwt(storedToken);\n setSdkAuth(storedToken);\n try {\n const payload = JSON.parse(atob(storedToken.split(\".\")[1]));\n setUser({\n username: payload.username,\n email: payload.email,\n userType: payload.userType,\n });\n } catch {\n // ignore\n }\n }\n } else {\n setSdkAuth(null);\n }\n setAuthLoading(false);\n }, [apiKey, baseURL, jwtStorageKey]);\n\n const login = useCallback(\n async (params: { usernameOrEmail: string; password: string }) => {\n const result = await cilantroLogin(params);\n const data: AuthControllerLogin200Data | undefined =\n result && typeof result === \"object\" && \"data\" in result\n ? (result as { data: AuthControllerLogin200Data }).data\n : undefined;\n const token =\n (data && \"jwt\" in data ? (data as { jwt?: string }).jwt : undefined) ??\n (data && \"accessToken\" in data ? (data as { accessToken?: string }).accessToken : undefined);\n if (!token) throw new Error(\"No JWT token received from server\");\n const userType = data?.userType;\n setJwt(token);\n setSdkAuth(token);\n if (typeof window !== \"undefined\") {\n localStorage.setItem(jwtStorageKey, token);\n }\n if (data?.user && typeof data.user === \"object\") {\n const u = data.user as Record<string, unknown>;\n setUser({\n username: u.username as string | undefined,\n email: u.email as string | undefined,\n userType: (userType ?? u.userType) as string | undefined,\n });\n } else {\n try {\n const payload = JSON.parse(atob(token.split(\".\")[1])) as Record<string, unknown>;\n setUser({\n username: payload.username as string | undefined,\n email: payload.email as string | undefined,\n userType: (userType ?? payload.userType) as string | undefined,\n });\n } catch {\n setUser({ userType: userType as string | undefined });\n }\n }\n onLoginSuccess?.();\n },\n [jwtStorageKey, onLoginSuccess]\n );\n\n const logout = useCallback(() => {\n setUser(null);\n setJwt(null);\n clearAuth();\n if (typeof window !== \"undefined\") {\n localStorage.removeItem(jwtStorageKey);\n const keys = Object.keys(localStorage);\n keys.forEach((key) => {\n if (key.startsWith(\"delegated-key-\")) localStorage.removeItem(key);\n });\n }\n setSdkAuth(null);\n onLogout?.();\n }, [jwtStorageKey, onLogout]);\n\n const register = useCallback(\n async (username: string, email: string, password: string, isActive = true) => {\n setSdkAuth(null);\n const platformKey = getPlatformApiKey();\n const userData: {\n username: string;\n email: string;\n password: string;\n isActive: boolean;\n platformApiKey?: string;\n } = { username, email, password, isActive };\n if (platformKey) userData.platformApiKey = platformKey;\n await createUser(userData);\n await login({ usernameOrEmail: username, password });\n onRegisterSuccess?.();\n },\n [login, onRegisterSuccess]\n );\n\n const clearSessionDueToAuthError = useCallback(() => {\n setUser(null);\n setJwt(null);\n clearAuth();\n if (typeof window !== \"undefined\") {\n localStorage.removeItem(jwtStorageKey);\n const keys = Object.keys(localStorage);\n keys.forEach((key) => {\n if (key.startsWith(\"delegated-key-\")) localStorage.removeItem(key);\n });\n }\n setSdkAuth(null);\n onSessionExpired?.();\n }, [jwtStorageKey, onSessionExpired]);\n\n const loadWallets = useCallback(async () => {\n if (!jwt) return;\n setWalletsLoading(true);\n setWalletError(null);\n try {\n setSdkAuth(jwt);\n const result = await findAllWallets();\n const walletsList = extractResponseData<WalletDataDto[]>(result) ?? [];\n const list = Array.isArray(walletsList) ? walletsList : [];\n const formatted: WalletData[] = list.map((w) =>\n normalizeWallet(w as unknown as Record<string, unknown>) as unknown as WalletData\n );\n setWallets(formatted);\n } catch (err) {\n if (isAuthError(err)) {\n clearSessionDueToAuthError();\n setWalletError(\"Session expired. Please sign in again.\");\n } else {\n setWalletError(extractErrorMessage(err));\n }\n setWallets([]);\n } finally {\n setWalletsLoading(false);\n }\n }, [jwt, clearSessionDueToAuthError]);\n\n useEffect(() => {\n if (jwt) {\n loadWallets();\n } else {\n setWallets([]);\n setSelectedWallet(null);\n setWalletError(null);\n setWalletsLoading(false);\n }\n }, [jwt, loadWallets]);\n\n useEffect(() => {\n if (wallets.length > 0 && !selectedWallet) {\n const storedId =\n typeof window !== \"undefined\" ? localStorage.getItem(walletStorageKey) : null;\n if (storedId) {\n const w = wallets.find((x) => x.id === storedId || x.walletId === storedId);\n if (w) setSelectedWallet(w);\n else {\n setSelectedWallet(wallets[0]);\n if (typeof window !== \"undefined\")\n localStorage.setItem(walletStorageKey, wallets[0].id ?? wallets[0].walletId);\n }\n } else {\n setSelectedWallet(wallets[0]);\n if (typeof window !== \"undefined\")\n localStorage.setItem(walletStorageKey, wallets[0].id ?? wallets[0].walletId);\n }\n } else if (wallets.length === 0) {\n setSelectedWallet(null);\n if (typeof window !== \"undefined\") localStorage.removeItem(walletStorageKey);\n }\n }, [wallets, walletStorageKey]);\n\n const selectWallet = useCallback(\n (walletId: string) => {\n const w = wallets.find((x) => x.id === walletId || x.walletId === walletId);\n if (w) {\n setSelectedWallet(w);\n if (typeof window !== \"undefined\")\n localStorage.setItem(walletStorageKey, w.id ?? w.walletId);\n }\n },\n [wallets, walletStorageKey]\n );\n\n const createWallet = useCallback(\n async (params: { name: string; userId?: string }) => {\n setSdkAuth(jwt ?? undefined);\n const dto = { walletName: params.name, chain: \"solana\" as const };\n const result = await createWalletSDK(dto);\n await loadWallets();\n return result as WalletControllerCreateResult;\n },\n [jwt, loadWallets]\n );\n\n const value: CilantroContextValue = useMemo(\n () => ({\n config,\n storage: storageAdapter ?? null,\n user,\n jwt,\n isAuthenticated: !!jwt,\n isLoading: authLoading,\n login,\n logout,\n register,\n clearSessionDueToAuthError,\n wallet: selectedWallet,\n wallets,\n createWallet,\n selectWallet,\n refreshWallets: loadWallets,\n walletError,\n walletsLoading,\n }),\n [\n config,\n storageAdapter,\n user,\n jwt,\n authLoading,\n login,\n logout,\n register,\n clearSessionDueToAuthError,\n selectedWallet,\n wallets,\n createWallet,\n selectWallet,\n loadWallets,\n walletError,\n walletsLoading,\n ]\n );\n\n return (\n <CilantroContext.Provider value={value}>{children}</CilantroContext.Provider>\n );\n}\n\nexport function useCilantroContext(): CilantroContextValue {\n const ctx = useContext(CilantroContext);\n if (ctx === undefined) {\n throw new Error(\"useCilantroContext must be used within CilantroContextProvider\");\n }\n return ctx;\n}\n","import { setAuth } from \"cilantro-sdk\";\n\nlet platformApiKey = \"\";\nlet apiUrl: string | undefined;\n\nexport interface AuthConfig {\n platformApiKey?: string;\n apiUrl?: string;\n /** Guide-aligned alias for platformApiKey */\n apiKey?: string;\n /** Guide-aligned alias for apiUrl */\n baseURL?: string;\n jwt?: string | null;\n}\n\n/**\n * Set SDK authentication config. Call with apiKey/baseURL (or platformApiKey/apiUrl) from provider/config.\n * Do not read process.env in library code.\n */\nexport function setAuthConfig(config: AuthConfig): void {\n platformApiKey = config.apiKey ?? config.platformApiKey ?? \"\";\n apiUrl = config.baseURL ?? config.apiUrl;\n const authPayload: { jwt?: string; platformApiKey?: string; apiUrl?: string } = {};\n if (config.jwt) {\n authPayload.jwt = config.jwt;\n }\n if (platformApiKey) {\n authPayload.platformApiKey = platformApiKey;\n }\n if (apiUrl) {\n authPayload.apiUrl = apiUrl;\n }\n setAuth(authPayload);\n}\n\n/**\n * Set SDK auth with JWT (assumes platformApiKey already set via setAuthConfig).\n */\nexport function setSdkAuth(jwt?: string | null): void {\n const authConfig: { jwt?: string; platformApiKey?: string; apiUrl?: string } = {};\n if (jwt) {\n authConfig.jwt = jwt;\n }\n if (platformApiKey) {\n authConfig.platformApiKey = platformApiKey;\n }\n if (apiUrl) {\n authConfig.apiUrl = apiUrl;\n }\n setAuth(authConfig);\n}\n\n/**\n * Get the platform API key (set via setAuthConfig).\n */\nexport function getPlatformApiKey(): string {\n return platformApiKey;\n}\n\n/**\n * Get the optional API URL (set via setAuthConfig).\n */\nexport function getApiUrl(): string | undefined {\n return apiUrl;\n}\n\n/**\n * Check if a JWT is expired using the payload `exp` claim.\n * @param token - JWT string (assumes 3 segments separated by dots).\n * @param bufferSeconds - Optional buffer in seconds; if exp is within this many seconds of now, treat as expired (default 60).\n * @returns true if token is expired or invalid/not a JWT.\n */\nexport function isJwtExpired(token: string, bufferSeconds = 60): boolean {\n if (!token || typeof token !== \"string\") return true;\n const parts = token.split(\".\");\n if (parts.length !== 3) return true;\n try {\n const payload = JSON.parse(atob(parts[1])) as { exp?: number };\n const exp = payload.exp;\n if (exp == null || typeof exp !== \"number\") return false;\n const now = Math.floor(Date.now() / 1000);\n return exp - bufferSeconds <= now;\n } catch {\n return true;\n }\n}\n","import { createIndexedDBAdapter } from \"cilantro-sdk/helpers\";\n\nexport type DeviceKeyStorage = ReturnType<typeof createIndexedDBAdapter>;\n\nlet storageAdapterInstance: DeviceKeyStorage | null = null;\nlet contextProvidedAdapter: DeviceKeyStorage | null = null;\nlet initializationPromise: Promise<DeviceKeyStorage> | null = null;\n\n/**\n * Set the storage adapter from CilantroProvider (context). When set, getStorageAdapter() returns this.\n */\nexport function setStorageAdapter(adapter: DeviceKeyStorage | null): void {\n contextProvidedAdapter = adapter;\n}\n\nexport async function initializeStorageAdapter(): Promise<DeviceKeyStorage> {\n if (contextProvidedAdapter) return contextProvidedAdapter;\n if (storageAdapterInstance) return storageAdapterInstance;\n if (initializationPromise) return initializationPromise;\n if (typeof window === \"undefined\") {\n throw new Error(\"Storage adapter can only be initialized in browser environment.\");\n }\n initializationPromise = (async () => {\n try {\n storageAdapterInstance = createIndexedDBAdapter();\n return storageAdapterInstance;\n } catch (error) {\n initializationPromise = null;\n throw error;\n }\n })();\n return initializationPromise;\n}\n\nexport function getStorageAdapter(): DeviceKeyStorage {\n if (contextProvidedAdapter) return contextProvidedAdapter;\n if (storageAdapterInstance) return storageAdapterInstance;\n if (typeof window === \"undefined\") {\n throw new Error(\"Storage adapter can only be initialized in browser environment.\");\n }\n storageAdapterInstance = createIndexedDBAdapter();\n return storageAdapterInstance;\n}\n\nexport function getStorageAdapterType(): \"IndexedDB\" | \"LocalStorage\" | \"Memory\" | \"Unknown\" {\n if (typeof window === \"undefined\") return \"Memory\";\n if (\"indexedDB\" in window) return \"IndexedDB\";\n return \"Unknown\";\n}\n\nexport function clearStorageAdapter(): void {\n storageAdapterInstance = null;\n}\n","/**\n * Type Utilities - common types and utilities for SDK interactions\n */\n\nexport type ActionState<T = unknown> = {\n status: \"idle\" | \"loading\" | \"success\" | \"error\";\n message?: string;\n detail?: T;\n};\n\nexport interface ErrorResponse {\n message?: string;\n error?: string;\n code?: string | number;\n status?: number;\n statusText?: string;\n data?: unknown;\n stack?: string;\n type?: string;\n}\n\nexport type ApiResponse<T> = T | { data: T } | { success: boolean; data: T };\n\nexport function extractResponseData<T>(response: unknown): T | null {\n if (!response) return null;\n if (typeof response !== \"object\" || response === null) {\n return response as T;\n }\n if (\"data\" in response) {\n const data = (response as { data: unknown }).data;\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const dataObj = data as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n if (\"authenticationSigners\" in dataObj || \"onChainSigners\" in dataObj) {\n const authSigners = Array.isArray(dataObj.authenticationSigners) ? dataObj.authenticationSigners : [];\n const onChainSigners = Array.isArray(dataObj.onChainSigners) ? dataObj.onChainSigners : [];\n return [...authSigners, ...onChainSigners] as T;\n }\n }\n return data as T;\n }\n if (\"success\" in response && \"data\" in response) {\n const data = (response as { success: boolean; data: unknown }).data;\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const dataObj = data as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n if (\"authenticationSigners\" in dataObj || \"onChainSigners\" in dataObj) {\n const authSigners = Array.isArray(dataObj.authenticationSigners) ? dataObj.authenticationSigners : [];\n const onChainSigners = Array.isArray(dataObj.onChainSigners) ? dataObj.onChainSigners : [];\n return [...authSigners, ...onChainSigners] as T;\n }\n }\n return data as T;\n }\n if (\"authenticationSigners\" in response || \"onChainSigners\" in response) {\n const responseObj = response as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n const authSigners = Array.isArray(responseObj.authenticationSigners) ? responseObj.authenticationSigners : [];\n const onChainSigners = Array.isArray(responseObj.onChainSigners) ? responseObj.onChainSigners : [];\n return [...authSigners, ...onChainSigners] as T;\n }\n return response as T;\n}\n\nexport function extractOnChainSigners<T>(response: unknown): T[] {\n if (!response || typeof response !== \"object\" || response === null) return [];\n let signersObj: { authenticationSigners?: unknown[]; onChainSigners?: unknown[] } | null = null;\n if (\"data\" in response) {\n const data = (response as { data: unknown }).data;\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const dataObj = data as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n if (\"authenticationSigners\" in dataObj || \"onChainSigners\" in dataObj) signersObj = dataObj;\n }\n }\n if (!signersObj && \"success\" in response && \"data\" in response) {\n const data = (response as { success: boolean; data: unknown }).data;\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const dataObj = data as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n if (\"authenticationSigners\" in dataObj || \"onChainSigners\" in dataObj) signersObj = dataObj;\n }\n }\n if (!signersObj && (\"authenticationSigners\" in response || \"onChainSigners\" in response)) {\n signersObj = response as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n }\n if (signersObj) {\n return (Array.isArray(signersObj.onChainSigners) ? signersObj.onChainSigners : []) as T[];\n }\n if (Array.isArray(response)) return response as T[];\n return [];\n}\n\nexport function extractAuthenticationSigners<T>(response: unknown): T[] {\n if (!response || typeof response !== \"object\" || response === null) return [];\n let signersObj: { authenticationSigners?: unknown[]; onChainSigners?: unknown[] } | null = null;\n if (\"data\" in response) {\n const data = (response as { data: unknown }).data;\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const dataObj = data as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n if (\"authenticationSigners\" in dataObj || \"onChainSigners\" in dataObj) signersObj = dataObj;\n }\n }\n if (!signersObj && \"success\" in response && \"data\" in response) {\n const data = (response as { success: boolean; data: unknown }).data;\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const dataObj = data as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n if (\"authenticationSigners\" in dataObj || \"onChainSigners\" in dataObj) signersObj = dataObj;\n }\n }\n if (!signersObj && (\"authenticationSigners\" in response || \"onChainSigners\" in response)) {\n signersObj = response as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n }\n if (signersObj) {\n return (Array.isArray(signersObj.authenticationSigners) ? signersObj.authenticationSigners : []) as T[];\n }\n return [];\n}\n\nexport function isErrorWithResponse(\n error: unknown\n): error is { response?: { data?: { message?: string; error?: string }; status?: number; statusText?: string } } {\n return typeof error === \"object\" && error !== null && \"response\" in error;\n}\n\nexport function isErrorWithMessage(error: unknown): error is { message?: string } {\n return typeof error === \"object\" && error !== null && \"message\" in error;\n}\n","import { isErrorWithResponse, isErrorWithMessage } from \"./types\";\nimport type { ErrorResponse } from \"./types\";\n\nexport function extractErrorMessage(error: unknown): string {\n if (!error) return \"An unknown error occurred\";\n if (error instanceof Error) return error.message;\n if (isErrorWithResponse(error)) {\n if (error.response?.data?.message) return String(error.response.data.message);\n if (error.response?.data?.error) return String(error.response.data.error);\n }\n if (isErrorWithMessage(error)) return String(error.message);\n if (typeof error === \"object\" && error !== null && \"error\" in error) {\n return String((error as { error: unknown }).error);\n }\n return String(error);\n}\n\nexport function getErrorDetails(error: unknown): ErrorResponse | null {\n if (!error) return null;\n if (typeof error === \"object\" && error !== null) {\n const err = error as { name?: string; constructor?: { name?: string }; code?: string | number; stack?: string };\n const details: ErrorResponse = {\n message: extractErrorMessage(error),\n type: err.name || (err.constructor?.name as string | undefined),\n stack: err.stack,\n };\n if (isErrorWithResponse(error)) {\n details.code = err.code ?? error.response?.status;\n details.status = error.response?.status;\n details.statusText = error.response?.statusText;\n details.data = error.response?.data;\n } else if (err.code) {\n details.code = err.code;\n }\n return details;\n }\n return { message: extractErrorMessage(error), data: error };\n}\n\nexport function isNetworkError(error: unknown): boolean {\n if (!error || typeof error !== \"object\" || error === null) return false;\n const err = error as { code?: string; message?: string };\n const hasResponse = isErrorWithResponse(error);\n return (\n err.code === \"ECONNREFUSED\" ||\n err.code === \"ETIMEDOUT\" ||\n err.code === \"ENOTFOUND\" ||\n (err.message?.toLowerCase().includes(\"network\") ?? false) ||\n (err.message?.toLowerCase().includes(\"connection\") ?? false) ||\n !hasResponse\n );\n}\n\nexport function isAuthError(error: unknown): boolean {\n if (!error || typeof error !== \"object\" || error === null) return false;\n if (isErrorWithResponse(error)) {\n const status = error.response?.status;\n if (status === 401 || status === 403) return true;\n }\n const err = error as { message?: string };\n const message = err.message?.toLowerCase() ?? \"\";\n return message.includes(\"unauthorized\") || message.includes(\"authentication\");\n}\n","/**\n * Normalization at the boundary: map SDK DTOs to a consistent shape with id/address (and aliases).\n * Use these when ingesting wallet/signer data from the SDK so consumers can rely on id and address.\n */\n\n/** Normalized wallet shape: always has id and address. */\nexport interface NormalizedWallet {\n id: string;\n address: string;\n active?: boolean;\n [key: string]: unknown;\n}\n\n/**\n * Normalize a wallet DTO so that id and address are always present.\n * Use at the boundary when loading wallets from the SDK.\n * Accepts any object with optional walletId/id, walletAddress/address, isActive.\n */\nexport function normalizeWallet(dto: Record<string, unknown>): NormalizedWallet {\n const w = dto as { walletId?: string; id?: string; walletAddress?: string; address?: string; isActive?: boolean };\n return {\n ...dto,\n id: w.walletId ?? w.id ?? \"\",\n address: w.walletAddress ?? w.address ?? \"\",\n active: w.isActive,\n } as NormalizedWallet;\n}\n","\"use client\";\n\nimport { type ReactNode, useEffect } from \"react\";\nimport { CilantroContextProvider } from \"../context/CilantroContext\";\nimport { initializeStorageAdapter } from \"../core/storage-adapter\";\nimport type { DeviceKeyStorage } from \"../core/storage-adapter\";\n\nexport interface CilantroProviderProps {\n children: ReactNode;\n /** Platform API key (guide: apiKey). Either apiKey or jwt via login is required for authenticated requests. */\n apiKey?: string;\n /** API base URL (guide: baseURL). Default: https://api.cilantro.gg */\n baseURL?: string;\n /** Storage for device keys - email/phone signers (guide: storageAdapter). Default: IndexedDB in browser. */\n storageAdapter?: DeviceKeyStorage | null;\n /** @deprecated Use apiKey instead. */\n platformApiKey?: string;\n /** @deprecated Use baseURL instead. */\n apiUrl?: string;\n /** localStorage key for JWT (default: cilantro_jwt) */\n jwtStorageKey?: string;\n /** localStorage key for selected wallet id (default: cilantro_selected_wallet_id) */\n walletStorageKey?: string;\n onLoginSuccess?: () => void;\n onLogout?: () => void;\n onRegisterSuccess?: () => void;\n onSessionExpired?: () => void;\n}\n\nexport function CilantroProvider({\n children,\n apiKey: apiKeyProp,\n baseURL,\n storageAdapter,\n platformApiKey,\n apiUrl,\n jwtStorageKey,\n walletStorageKey,\n onLoginSuccess,\n onLogout,\n onRegisterSuccess,\n onSessionExpired,\n}: CilantroProviderProps) {\n const apiKey = apiKeyProp ?? platformApiKey;\n const resolvedBaseURL = baseURL ?? apiUrl;\n\n useEffect(() => {\n if (!storageAdapter) {\n initializeStorageAdapter().catch((err) => {\n console.error(\"[CilantroProvider] Failed to initialize storage adapter:\", err);\n });\n }\n }, [storageAdapter]);\n\n return (\n <CilantroContextProvider\n apiKey={apiKey}\n baseURL={resolvedBaseURL}\n storageAdapter={storageAdapter ?? undefined}\n jwtStorageKey={jwtStorageKey}\n walletStorageKey={walletStorageKey}\n onLoginSuccess={onLoginSuccess}\n onLogout={onLogout}\n onRegisterSuccess={onRegisterSuccess}\n onSessionExpired={onSessionExpired}\n >\n {children}\n </CilantroContextProvider>\n );\n}\n","\"use client\";\n\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport type { User } from \"../context/CilantroContext\";\n\nexport interface CilantroAuthContextType {\n user: User | null;\n token: string | null;\n isAuthenticated: boolean;\n login: (usernameOrEmail: string, password: string) => Promise<void>;\n register: (username: string, email: string, password: string, isActive?: boolean) => Promise<void>;\n logout: () => void;\n clearSessionDueToAuthError: () => void;\n isLoading: boolean;\n}\n\nexport function useCilantroAuth(): CilantroAuthContextType {\n const ctx = useCilantroContext();\n return {\n user: ctx.user,\n token: ctx.jwt,\n isAuthenticated: ctx.isAuthenticated,\n login: (usernameOrEmail: string, password: string) =>\n ctx.login({ usernameOrEmail, password }),\n register: ctx.register,\n logout: ctx.logout,\n clearSessionDueToAuthError: ctx.clearSessionDueToAuthError,\n isLoading: ctx.isLoading,\n };\n}\n\nexport type { User };\n","\"use client\";\n\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport type { WalletData } from \"../context/CilantroContext\";\n\nexport interface WalletContextType {\n selectedWallet: WalletData | null;\n wallets: WalletData[];\n selectWallet: (walletId: string) => void;\n refreshWallets: () => Promise<void>;\n isLoading: boolean;\n error: string | null;\n}\n\nexport function useWallets(): WalletContextType {\n const ctx = useCilantroContext();\n return {\n selectedWallet: ctx.wallet,\n wallets: ctx.wallets,\n selectWallet: ctx.selectWallet,\n refreshWallets: ctx.refreshWallets,\n isLoading: ctx.walletsLoading,\n error: ctx.walletError,\n };\n}\n\nexport type { WalletData };\nexport type WalletDataDto = WalletData;\n","\"use client\";\n\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport type { CilantroConfig } from \"../context/CilantroContext\";\nimport type { DeviceKeyStorage } from \"../core/storage-adapter\";\n\nexport interface UseCilantroConfigResult {\n config: CilantroConfig;\n storage: DeviceKeyStorage | null;\n}\n\nexport function useCilantroConfig(): UseCilantroConfigResult {\n const ctx = useCilantroContext();\n return {\n config: ctx.config,\n storage: ctx.storage,\n };\n}\n","\"use client\";\n\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport type { User } from \"../context/CilantroContext\";\n\nexport interface UseAuthResult {\n user: User | null;\n jwt: string | null;\n isLoading: boolean;\n isAuthenticated: boolean;\n login: (params: { usernameOrEmail: string; password: string }) => Promise<void>;\n logout: () => void;\n}\n\nexport function useAuth(): UseAuthResult {\n const ctx = useCilantroContext();\n return {\n user: ctx.user,\n jwt: ctx.jwt,\n isLoading: ctx.isLoading,\n isAuthenticated: ctx.isAuthenticated,\n login: ctx.login,\n logout: ctx.logout,\n };\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport type { WalletData } from \"../context/CilantroContext\";\nimport type { WalletControllerCreateResult } from \"cilantro-sdk/wallet\";\n\nexport interface UseWalletResult {\n wallet: WalletData | null;\n wallets: WalletData[];\n createWallet: (params: { name: string; userId?: string }) => Promise<WalletControllerCreateResult>;\n selectWallet: (walletId: string) => void;\n isLoading: boolean;\n}\n\nexport function useWallet(_walletId?: string): UseWalletResult {\n const ctx = useCilantroContext();\n return useMemo(\n () => ({\n wallet: ctx.wallet,\n wallets: ctx.wallets,\n createWallet: ctx.createWallet,\n selectWallet: ctx.selectWallet,\n isLoading: ctx.walletsLoading,\n }),\n [\n ctx.wallet,\n ctx.wallets,\n ctx.createWallet,\n ctx.selectWallet,\n ctx.walletsLoading,\n ]\n );\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport { setSdkAuth } from \"../core/auth\";\nimport { loadSigners, type SignerData } from \"../core/signer-helpers\";\nimport {\n createEmailSignerHelper,\n createPhoneSignerHelper,\n} from \"../core/signer-creation\";\nimport { deleteSigner } from \"cilantro-sdk/wallet\";\nimport type { SignerInfo } from \"cilantro-sdk/helpers\";\n\nexport interface UseSignersOptions {\n /** Wallet ID to load signers for. If not provided, uses selectedWallet?.id from context (call useWallets() in same component). */\n walletId?: string | null;\n}\n\nexport interface UseSignersResult {\n signers: SignerData[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n createEmailSigner: (params: { email: string }) => Promise<SignerInfo>;\n createPhoneSigner: (params: { phone: string }) => Promise<SignerInfo>;\n revokeSigner: (signerId: string) => Promise<void>;\n}\n\nexport function useSigners(\n walletIdOrOptions?: string | null | UseSignersOptions\n): UseSignersResult {\n const walletIdOption =\n typeof walletIdOrOptions === \"object\"\n ? walletIdOrOptions?.walletId\n : walletIdOrOptions;\n const { jwt } = useCilantroContext();\n const [signers, setSigners] = useState<SignerData[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const load = useCallback(\n async (walletId: string) => {\n if (!walletId) {\n setSigners([]);\n return;\n }\n setIsLoading(true);\n setError(null);\n try {\n if (jwt) setSdkAuth(jwt);\n const list = await loadSigners(walletId);\n setSigners(list);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n setSigners([]);\n } finally {\n setIsLoading(false);\n }\n },\n [jwt]\n );\n\n useEffect(() => {\n const id = walletIdOption ?? undefined;\n if (id) load(id);\n else {\n setSigners([]);\n setError(null);\n }\n }, [walletIdOption, load]);\n\n const refresh = useCallback(async () => {\n const id = walletIdOption ?? undefined;\n if (id) await load(id);\n }, [walletIdOption, load]);\n\n const createEmailSigner = useCallback(\n async (params: { email: string }) => {\n const walletId = walletIdOption ?? undefined;\n if (!walletId) throw new Error(\"walletId is required\");\n if (jwt) setSdkAuth(jwt);\n const signer = await createEmailSignerHelper(walletId, params.email);\n await refresh();\n return signer;\n },\n [walletIdOption, jwt, refresh]\n );\n\n const createPhoneSigner = useCallback(\n async (params: { phone: string }) => {\n const walletId = walletIdOption ?? undefined;\n if (!walletId) throw new Error(\"walletId is required\");\n if (jwt) setSdkAuth(jwt);\n const signer = await createPhoneSignerHelper(walletId, params.phone);\n await refresh();\n return signer;\n },\n [walletIdOption, jwt, refresh]\n );\n\n const revokeSigner = useCallback(\n async (signerId: string) => {\n const walletId = walletIdOption ?? undefined;\n if (!walletId) throw new Error(\"walletId is required\");\n if (jwt) setSdkAuth(jwt);\n await deleteSigner(walletId, signerId);\n await refresh();\n },\n [walletIdOption, jwt, refresh]\n );\n\n return {\n signers,\n isLoading,\n error,\n refresh,\n createEmailSigner,\n createPhoneSigner,\n revokeSigner,\n };\n}\n","import { getSigners, parseSignerResponse, type SignerInfo } from \"cilantro-sdk/helpers\";\nimport { listSigners } from \"cilantro-sdk/wallet\";\nimport { extractOnChainSigners, extractAuthenticationSigners } from \"./types\";\n\n/**\n * Normalized signer shape aligned with SDK SignerDataDto / WalletSignerDataDto.\n * Uses SDK field names (signerId, signerType, signerPubkey, authId); id is an alias for signerId or WalletSignerDataDto.id.\n */\nexport interface SignerData extends Omit<SignerInfo, \"signerId\"> {\n id: string;\n signerId: string;\n signerType?: string;\n signerPubkey?: string;\n signerConfig?: { email?: string; phone?: string; credentialId?: string };\n deviceIdentities?: unknown[];\n credentialId?: string;\n authId?: string;\n signerCategory?: \"onchain\" | \"authenticationsigner\";\n [key: string]: unknown;\n}\n\nexport async function loadSigners(walletId: string): Promise<SignerData[]> {\n if (!walletId) return [];\n try {\n let signersResult = (await getSigners(walletId)) as unknown;\n let onChainSigners = extractOnChainSigners<Record<string, unknown>>(signersResult);\n let authSigners = extractAuthenticationSigners<Record<string, unknown>>(signersResult);\n if (\n (!onChainSigners || !Array.isArray(onChainSigners) || onChainSigners.length === 0) &&\n (!authSigners || !Array.isArray(authSigners) || authSigners.length === 0)\n ) {\n const response = await listSigners(walletId);\n onChainSigners = extractOnChainSigners<Record<string, unknown>>(response);\n authSigners = extractAuthenticationSigners<Record<string, unknown>>(response);\n }\n const processedOnChain = onChainSigners\n .filter((s) => s && typeof s === \"object\")\n .map((signer) => processSigner(signer, \"onchain\"));\n const processedAuth = authSigners\n .filter((s) => s && typeof s === \"object\")\n .map((signer) => processSigner(signer, \"authenticationsigner\"));\n return [...processedOnChain, ...processedAuth].filter((s) => s.id && (s.type || s.signerType));\n } catch (error) {\n console.error(\"Failed to load signers:\", error);\n return [];\n }\n}\n\n/**\n * Normalize a raw signer DTO to SignerData (id, signerId, signerPubkey/publicKey, etc.).\n * Use at API boundaries when ingesting signer data from the SDK.\n */\nexport function normalizeSigner(\n signer: Record<string, unknown>,\n category: \"onchain\" | \"authenticationsigner\"\n): SignerData {\n return processSigner(signer, category);\n}\n\nfunction processSigner(signer: Record<string, unknown>, category: \"onchain\" | \"authenticationsigner\"): SignerData {\n const parsed = parseSignerResponse(signer);\n const signerId = (signer.id ?? signer.signerId ?? parsed.signerId) as string;\n const signerType = (signer.signerType ?? signer.type ?? parsed.type) as string;\n const signerPubkey = (signer.signerPubkey ?? signer.publicKey ?? parsed.publicKey ?? \"\") as string;\n const authId = (signer.authId ?? parsed.email ?? parsed.phone) as string | undefined;\n const walletId = (signer.walletId ?? parsed.walletId) as string | undefined;\n let email = (signer.email ?? parsed.email) as string | undefined;\n let phone = (signer.phone ?? parsed.phone) as string | undefined;\n if (!email && !phone && authId) {\n if (signerType === \"email\") email = authId;\n else if (signerType === \"phone\") phone = authId;\n }\n const signerConfig = signer.signerConfig as { email?: string; phone?: string } | undefined;\n if (signerConfig) {\n if (!email && signerConfig.email) email = signerConfig.email;\n if (!phone && signerConfig.phone) phone = signerConfig.phone;\n }\n const isActive =\n signer.isActive !== undefined ? (signer.isActive as boolean) : (parsed.isActive !== undefined ? parsed.isActive : true);\n return {\n ...signer,\n id: signerId,\n signerId,\n walletId: walletId ?? \"\",\n type: signerType,\n signerType,\n publicKey: signerPubkey,\n signerPubkey,\n email,\n phone,\n isActive,\n credentialId: (signer.credentialId ?? (signerType === \"passkey\" ? authId : undefined)) as string | undefined,\n authId,\n deviceIdentities: signer.deviceIdentities as unknown[] | undefined,\n signerConfig: signer.signerConfig as SignerData[\"signerConfig\"],\n permissions: signer.permissions,\n signerCategory: category,\n } as SignerData;\n}\n\nexport function getSignerType(signer: SignerData): string {\n return signer.type || signer.signerType || \"\";\n}\n\nexport function getSignerTypeLabel(type?: string): string {\n if (!type) return \"Unknown\";\n const t = type.toLowerCase();\n if (t === \"email\") return \"Email\";\n if (t === \"phone\") return \"Phone\";\n if (t === \"external\" || t === \"external-wallet\") return \"External Wallet\";\n if (t === \"passkey\") return \"Passkey\";\n if (t === \"api-key\" || t === \"apikey\") return \"API Key\";\n return type;\n}\n\nexport function getSignerDisplayName(signer: SignerData): string {\n const signerType = getSignerType(signer);\n const typeLabel = getSignerTypeLabel(signerType);\n const shortId = signer.id.length > 8 ? `${signer.id.slice(0, 4)}...${signer.id.slice(-4)}` : signer.id;\n if (signer.email) return `${typeLabel}: ${signer.email}`;\n if (signer.phone) return `${typeLabel}: ${signer.phone}`;\n if (signerType === \"passkey\") {\n const credId =\n (signer.credentialId as string | undefined) ??\n (signer.authId as string | undefined) ??\n (signer.signerConfig as { credentialId?: string } | undefined)?.credentialId;\n if (credId) {\n const shortCredId = credId.length > 12 ? `${credId.slice(0, 6)}...${credId.slice(-6)}` : credId;\n return `${typeLabel} (${shortCredId})`;\n }\n return `${typeLabel} (${shortId})`;\n }\n return `${typeLabel} (${shortId})`;\n}\n\nexport function getSignerUniqueId(signer: SignerData): string {\n if (signer.id) return signer.id.length > 12 ? `${signer.id.slice(0, 6)}...${signer.id.slice(-6)}` : signer.id;\n if (signer.publicKey) return `${signer.publicKey.slice(0, 6)}...${signer.publicKey.slice(-6)}`;\n return \"Unknown\";\n}\n\nexport function validateSignerActive(signer: SignerData, signerType: string): void {\n if (!signer.isActive) {\n throw new Error(`${signerType} signer is not active. Please activate the signer first.`);\n }\n}\n\nexport function extractSignerInfo(signer: SignerData): { signerId: string; signerType: string } {\n const signerType = signer.type || signer.signerType;\n const signerId = signer.id || signer.signerId;\n if (!signerType) throw new Error(`Signer type is missing. Signer data: ${JSON.stringify(signer)}`);\n if (!signerId) throw new Error(`Signer ID is missing. Signer data: ${JSON.stringify(signer)}`);\n return { signerId, signerType };\n}\n","import type { Transaction } from \"@solana/web3.js\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport {\n createEmailSignerHelper as createEmailSignerSDK,\n createPhoneSignerHelper as createPhoneSignerSDK,\n isValidEmail,\n isValidPhone,\n type SignerInfo,\n authenticateWithPasskey,\n findExistingPasskeySigner,\n formatAuthenticationResponse,\n isWebAuthnSupported,\n registerPasskeyComplete,\n signWithPasskeySigner,\n} from \"cilantro-sdk/helpers\";\nimport {\n sendRawPasskeyTransaction,\n type TransactionControllerSendRawPasskeyTransactionResult,\n} from \"cilantro-sdk/transactions\";\nimport { createExternalWalletSigner, startPasskeyAuthentication } from \"cilantro-sdk/wallet\";\nimport type { WalletControllerStartPasskeyAuthenticationResult } from \"cilantro-sdk/wallet\";\nimport { getStorageAdapter } from \"./storage-adapter\";\nimport { loadSigners } from \"./signer-helpers\";\nimport { extractResponseData } from \"./types\";\n\ntype PasskeyTransactionDataDto = TransactionControllerSendRawPasskeyTransactionResult[\"data\"];\n\nexport async function createEmailSignerHelper(walletId: string, email: string): Promise<SignerInfo> {\n const trimmedEmail = email.trim();\n if (!trimmedEmail) throw new Error(\"Email address is required\");\n if (!isValidEmail(trimmedEmail)) throw new Error(\"Invalid email address format\");\n const deviceKeyManager = getStorageAdapter();\n return await createEmailSignerSDK(walletId, { email: trimmedEmail, deviceKeyManager });\n}\n\nexport async function createPhoneSignerHelper(walletId: string, phone: string): Promise<SignerInfo> {\n const trimmedPhone = phone.trim();\n if (!trimmedPhone) throw new Error(\"Phone number is required\");\n if (!isValidPhone(trimmedPhone)) throw new Error(\"Invalid phone number format\");\n const deviceKeyManager = getStorageAdapter();\n return await createPhoneSignerSDK(walletId, { phone: trimmedPhone, deviceKeyManager });\n}\n\nexport async function createExternalSignerHelper(walletId: string, address: string): Promise<unknown> {\n if (!address.trim()) throw new Error(\"Wallet address is required\");\n return await createExternalWalletSigner(walletId, { address: address.trim(), chain: \"solana\" });\n}\n\nexport async function registerPasskeySigner(walletId: string): Promise<{\n signerId: string;\n isNew: boolean;\n credentialId?: string;\n}> {\n if (!isWebAuthnSupported()) throw new Error(\"WebAuthn is not supported in this browser\");\n return await registerPasskeyComplete(walletId);\n}\n\nexport async function checkExistingPasskey(\n walletId: string,\n credentialId?: string\n): Promise<{ signerId: string; credentialId?: string } | null> {\n return await findExistingPasskeySigner(walletId, credentialId);\n}\n\nexport async function signWithPasskey(\n walletId: string,\n signerId: string,\n message: string,\n options?: { useBrowserAutofill?: boolean }\n): Promise<{ signature: string; signer: string }> {\n if (!isWebAuthnSupported()) throw new Error(\"WebAuthn is not supported in this browser\");\n const messageBytes = new TextEncoder().encode(message);\n const signature = await signWithPasskeySigner(walletId, signerId, messageBytes, options);\n return {\n signature: Buffer.from(signature).toString(\"hex\"),\n signer: signerId,\n };\n}\n\nexport async function signAndSendPasskeyTransaction(\n walletId: string,\n signerId: string,\n transaction: Transaction,\n options?: { credentialId?: string; useBrowserAutofill?: boolean; mintAddress?: string }\n): Promise<{ signature: string; status?: string }> {\n if (!isWebAuthnSupported()) throw new Error(\"WebAuthn is not supported in this browser\");\n let credentialId = options?.credentialId;\n if (!credentialId) {\n const signers = await loadSigners(walletId);\n const passkeySigner = signers.find((s) => s.id === signerId || s.signerId === signerId);\n if (!passkeySigner) {\n throw new Error(\n `Passkey signer ${signerId} not found in wallet. Available signers: ${signers.map((s) => `${s.id} (${s.type})`).join(\", \")}`\n );\n }\n credentialId =\n passkeySigner.credentialId ??\n (passkeySigner.signerConfig as { credentialId?: string } | undefined)?.credentialId ??\n (passkeySigner.authId as string | undefined);\n if (!credentialId) {\n throw new Error(`Credential ID not found for passkey signer ${signerId}.`);\n }\n }\n let mintAddress: string | undefined = options?.mintAddress;\n if (!mintAddress && transaction.instructions.length > 0) {\n const systemProgramId = new PublicKey(\"11111111111111111111111111111111\");\n const feePayer = transaction.feePayer || systemProgramId;\n transaction.instructions.forEach((ix) => {\n ix.keys.forEach((key) => {\n if (key.isWritable && key.isSigner && !key.pubkey.equals(feePayer) && !mintAddress) {\n mintAddress = key.pubkey.toString();\n }\n });\n });\n }\n const unsignedTransaction = transaction.serialize({ verifySignatures: false }).toString(\"base64\");\n const authOptions: WalletControllerStartPasskeyAuthenticationResult = await startPasskeyAuthentication(\n walletId,\n { credentialId: options?.credentialId }\n );\n const authData = extractResponseData<WalletControllerStartPasskeyAuthenticationResult[\"data\"]>(authOptions);\n if (!authData) throw new Error(\"Failed to get authentication options\");\n const authDataValue =\n authData && typeof authData === \"object\" && \"data\" in authData\n ? (authData as { data: unknown }).data\n : authData;\n const credential = await authenticateWithPasskey(\n authDataValue as Parameters<typeof authenticateWithPasskey>[0],\n { useBrowserAutofill: options?.useBrowserAutofill ?? false }\n );\n const formattedCredential = formatAuthenticationResponse(credential);\n const dto = {\n walletId,\n credentialId,\n unsignedTransaction,\n signature: formattedCredential.response.signature,\n authenticatorData: formattedCredential.response.authenticatorData,\n clientDataJSON: formattedCredential.response.clientDataJSON,\n };\n const result: TransactionControllerSendRawPasskeyTransactionResult = await sendRawPasskeyTransaction(dto);\n const resultData = extractResponseData<PasskeyTransactionDataDto>(result);\n return {\n signature: resultData?.signature ?? \"\",\n status: resultData?.status,\n };\n}\n","\"use client\";\n\nimport { useState, useCallback } from \"react\";\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport { isWebAuthnSupported } from \"cilantro-sdk/helpers\";\nimport { registerPasskeySigner } from \"../core/signer-creation\";\nimport { startPasskeyAuthentication } from \"cilantro-sdk/wallet\";\nimport { extractResponseData } from \"../core/types\";\nimport { authenticateWithPasskey, formatAuthenticationResponse } from \"cilantro-sdk/helpers\";\n\nexport interface UsePasskeyResult {\n isSupported: boolean;\n register: () => Promise<{ signerId: string; isNew: boolean; credentialId?: string }>;\n authenticate: (signerId?: string) => Promise<{ signature: string; signerId: string }>;\n isLoading: boolean;\n}\n\nexport function usePasskey(walletId: string | undefined): UsePasskeyResult {\n const { jwt } = useCilantroContext();\n const [isLoading, setIsLoading] = useState(false);\n const isSupported = typeof window !== \"undefined\" && isWebAuthnSupported();\n\n const register = useCallback(async () => {\n if (!walletId) throw new Error(\"walletId is required\");\n if (!isSupported) throw new Error(\"WebAuthn is not supported in this browser\");\n setIsLoading(true);\n try {\n const result = await registerPasskeySigner(walletId);\n return result;\n } finally {\n setIsLoading(false);\n }\n }, [walletId, isSupported]);\n\n const authenticate = useCallback(\n async (signerId?: string) => {\n if (!walletId) throw new Error(\"walletId is required\");\n if (!isSupported) throw new Error(\"WebAuthn is not supported in this browser\");\n setIsLoading(true);\n try {\n const authOptions = await startPasskeyAuthentication(walletId, {\n credentialId: undefined,\n });\n const authData = extractResponseData(authOptions);\n const authDataValue =\n authData && typeof authData === \"object\" && \"data\" in authData\n ? (authData as { data: unknown }).data\n : authData;\n const credential = await authenticateWithPasskey(\n authDataValue as Parameters<typeof authenticateWithPasskey>[0],\n { useBrowserAutofill: false }\n );\n const formatted = formatAuthenticationResponse(credential);\n return {\n signature: Buffer.from(formatted.response.signature).toString(\"hex\"),\n signerId: signerId ?? \"\",\n };\n } finally {\n setIsLoading(false);\n }\n },\n [walletId, isSupported]\n );\n\n return { isSupported, register, authenticate, isLoading };\n}\n","\"use client\";\n\nimport { useState, useCallback, useEffect } from \"react\";\n\n/** Minimal Solana wallet interface (Phantom, Solflare, etc.) */\nexport interface SolanaWallet {\n name: string;\n publicKey: { toString: () => string } | null;\n connect: () => Promise<{ publicKey: { toString: () => string } }>;\n disconnect: () => Promise<void>;\n}\n\ndeclare global {\n interface Window {\n solana?: SolanaWallet & { isPhantom?: boolean };\n solflare?: SolanaWallet;\n }\n}\n\nfunction getDetectedWallets(): SolanaWallet[] {\n if (typeof window === \"undefined\") return [];\n const list: SolanaWallet[] = [];\n if (window.solana?.connect) {\n list.push({\n name: \"Phantom\",\n publicKey: window.solana.publicKey ?? null,\n connect: window.solana.connect.bind(window.solana),\n disconnect: window.solana.disconnect?.bind(window.solana) ?? (() => Promise.resolve()),\n });\n }\n if (window.solflare?.connect && !list.some((w) => w.name === \"Solflare\")) {\n list.push({\n name: \"Solflare\",\n publicKey: window.solflare.publicKey ?? null,\n connect: window.solflare.connect.bind(window.solflare),\n disconnect: window.solflare.disconnect?.bind(window.solflare) ?? (() => Promise.resolve()),\n });\n }\n return list;\n}\n\nexport interface UseExternalWalletResult {\n wallets: SolanaWallet[];\n connectedWallet: SolanaWallet | null;\n connect: (wallet: SolanaWallet) => Promise<string>;\n disconnect: () => Promise<void>;\n}\n\nexport function useExternalWallet(): UseExternalWalletResult {\n const [wallets, setWallets] = useState<SolanaWallet[]>([]);\n const [connectedWallet, setConnectedWallet] = useState<SolanaWallet | null>(null);\n\n useEffect(() => {\n setWallets(getDetectedWallets());\n }, []);\n\n const connect = useCallback(async (wallet: SolanaWallet) => {\n const res = await wallet.connect();\n const publicKey = res.publicKey.toString();\n setConnectedWallet(wallet);\n return publicKey;\n }, []);\n\n const disconnect = useCallback(async () => {\n if (connectedWallet?.disconnect) {\n await connectedWallet.disconnect();\n }\n setConnectedWallet(null);\n }, [connectedWallet]);\n\n return { wallets, connectedWallet, connect, disconnect };\n}\n","\"use client\";\n\nimport { useState, useCallback } from \"react\";\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport { setSdkAuth } from \"../core/auth\";\nimport { sendSOL as sendSOLApi, sendSPL as sendSPLApi } from \"cilantro-sdk/wallet\";\nimport { extractResponseData } from \"../core/types\";\nimport { extractErrorMessage } from \"../core/error-utils\";\n\nexport type SignerType = \"email\" | \"phone\" | \"passkey\" | \"external\";\n\nexport interface SubmitTransactionResult {\n success: boolean;\n data: { signature?: string; [key: string]: unknown };\n}\n\nexport interface UseSendTransactionResult {\n sendSOL: (params: {\n recipientAddress: string;\n amountLamports: number;\n }) => Promise<SubmitTransactionResult>;\n sendSPL: (params: {\n mintAddress: string;\n recipientAddress: string;\n amount: number;\n }) => Promise<SubmitTransactionResult>;\n isPending: boolean;\n error: string | null;\n}\n\nexport function useSendTransaction(\n walletId: string | undefined,\n _signerId?: string,\n _signerType?: SignerType\n): UseSendTransactionResult {\n const { jwt } = useCilantroContext();\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const sendSOL = useCallback(\n async (params: { recipientAddress: string; amountLamports: number }) => {\n if (!walletId) throw new Error(\"walletId is required\");\n setError(null);\n setIsPending(true);\n try {\n if (jwt) setSdkAuth(jwt);\n const result = await sendSOLApi(walletId, {\n recipientAddress: params.recipientAddress,\n amountLamports: params.amountLamports,\n });\n const data = extractResponseData<{ transactionHash?: string }>(result);\n const signature = data?.transactionHash ?? (data as { signature?: string })?.signature;\n return {\n success: true,\n data: { signature, ...data },\n } as SubmitTransactionResult;\n } catch (err) {\n const msg = extractErrorMessage(err);\n setError(msg);\n throw new Error(msg);\n } finally {\n setIsPending(false);\n }\n },\n [walletId, jwt]\n );\n\n const sendSPL = useCallback(\n async (params: {\n mintAddress: string;\n recipientAddress: string;\n amount: number;\n }) => {\n if (!walletId) throw new Error(\"walletId is required\");\n setError(null);\n setIsPending(true);\n try {\n if (jwt) setSdkAuth(jwt);\n const result = await sendSPLApi(walletId, {\n mintAddress: params.mintAddress,\n recipientAddress: params.recipientAddress,\n amount: params.amount,\n });\n const data = extractResponseData<{ transactionHash?: string }>(result);\n const signature = data?.transactionHash ?? (data as { signature?: string })?.signature;\n return {\n success: true,\n data: { signature, ...data },\n } as SubmitTransactionResult;\n } catch (err) {\n const msg = extractErrorMessage(err);\n setError(msg);\n throw new Error(msg);\n } finally {\n setIsPending(false);\n }\n },\n [walletId, jwt]\n );\n\n return { sendSOL, sendSPL, isPending, error };\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useCilantroAuth } from \"../../providers/CilantroAuthProvider\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"../../ui/card\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface LoginFormClassNames {\n root?: string;\n header?: string;\n title?: string;\n description?: string;\n form?: string;\n label?: string;\n input?: string;\n submitButton?: string;\n error?: string;\n}\n\nexport interface LoginFormProps {\n className?: string;\n classNames?: LoginFormClassNames;\n style?: React.CSSProperties;\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n rememberMe?: boolean;\n /** Override submit button label */\n submitLabel?: string;\n /** Override title */\n title?: string;\n /** Override description */\n description?: string;\n /** Render \"Create account\" link (e.g. to switch to register). Shown below submit. */\n renderSwitchToRegister?: () => React.ReactNode;\n}\n\nexport function LoginForm({\n className,\n classNames,\n style,\n onSuccess,\n onError,\n submitLabel = \"Sign in\",\n title = \"Sign in\",\n description,\n renderSwitchToRegister,\n}: LoginFormProps) {\n const { login, isLoading } = useCilantroAuth();\n const [usernameOrEmail, setUsernameOrEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n try {\n await login(usernameOrEmail.trim(), password);\n onSuccess?.();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n };\n\n return (\n <Card className={cn(className, classNames?.root)} style={style} data-cilantro-login-form>\n <CardHeader className={classNames?.header}>\n <CardTitle className={classNames?.title}>{title}</CardTitle>\n {description != null && (\n <CardDescription className={classNames?.description}>{description}</CardDescription>\n )}\n </CardHeader>\n <CardContent>\n <form onSubmit={handleSubmit} className={cn(\"space-y-4\", classNames?.form)}>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-login-username\" className={classNames?.label}>\n Username or email\n </Label>\n <Input\n id=\"cilantro-login-username\"\n type=\"text\"\n autoComplete=\"username\"\n className={classNames?.input}\n value={usernameOrEmail}\n onChange={(e) => setUsernameOrEmail(e.target.value)}\n placeholder=\"Username or email\"\n required\n disabled={isLoading}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-login-password\" className={classNames?.label}>\n Password\n </Label>\n <Input\n id=\"cilantro-login-password\"\n type=\"password\"\n autoComplete=\"current-password\"\n className={classNames?.input}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Password\"\n required\n disabled={isLoading}\n />\n </div>\n {error && (\n <div\n className={cn(\n \"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\",\n classNames?.error\n )}\n role=\"alert\"\n >\n {error}\n </div>\n )}\n <Button\n type=\"submit\"\n size=\"touch\"\n className={cn(\"w-full\", classNames?.submitButton)}\n disabled={isLoading || !usernameOrEmail.trim() || !password}\n >\n {isLoading ? \"Signing in...\" : submitLabel}\n </Button>\n {renderSwitchToRegister && (\n <div className=\"text-center text-sm text-muted-foreground\">{renderSwitchToRegister()}</div>\n )}\n </form>\n </CardContent>\n </Card>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"./cn\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive: \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline: \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary: \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n touch: \"h-12 min-h-[44px] min-w-[44px] rounded-md px-4\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />;\n }\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"./cn\";\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n ref={ref}\n {...props}\n />\n );\n }\n);\nInput.displayName = \"Input\";\n\nexport { Input };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"./cn\";\n\nconst labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n);\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root ref={ref} className={cn(labelVariants(), className)} {...props} />\n));\nLabel.displayName = LabelPrimitive.Root.displayName;\n\nexport { Label };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"./cn\";\n\nconst Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"rounded-xl border bg-card text-card-foreground shadow\", className)}\n {...props}\n />\n )\n);\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"flex flex-col space-y-1.5 p-6\", className)} {...props} />\n )\n);\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLHeadingElement>>(\n ({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\"font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n )\n);\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p ref={ref} className={cn(\"text-sm text-muted-foreground\", className)} {...props} />\n));\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n )\n);\nCardContent.displayName = \"CardContent\";\n\nconst CardFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"flex items-center p-6 pt-0\", className)} {...props} />\n )\n);\nCardFooter.displayName = \"CardFooter\";\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { useAuth } from \"../../hooks/useAuth\";\nimport { Button } from \"../../ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../../ui/dialog\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface LogoutButtonProps {\n onLogout?: () => void;\n confirmBeforeLogout?: boolean;\n className?: string;\n children?: ReactNode;\n}\n\nexport function LogoutButton({\n onLogout,\n confirmBeforeLogout = false,\n className,\n children,\n}: LogoutButtonProps) {\n const { logout } = useAuth();\n const [confirmOpen, setConfirmOpen] = useState(false);\n\n const handleLogout = () => {\n logout();\n setConfirmOpen(false);\n onLogout?.();\n };\n\n const handleClick = () => {\n if (confirmBeforeLogout) {\n setConfirmOpen(true);\n } else {\n handleLogout();\n }\n };\n\n return (\n <>\n <Button\n type=\"button\"\n variant=\"outline\"\n className={cn(className)}\n onClick={handleClick}\n data-cilantro-logout-button\n >\n {children ?? \"Log out\"}\n </Button>\n {confirmBeforeLogout && (\n <Dialog open={confirmOpen} onOpenChange={setConfirmOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Log out?</DialogTitle>\n <DialogDescription>Are you sure you want to log out?</DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setConfirmOpen(false)}>\n Cancel\n </Button>\n <Button variant=\"destructive\" onClick={handleLogout}>\n Log out\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )}\n </>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { cn } from \"./cn\";\n\nconst Dialog = DialogPrimitive.Root;\nconst DialogTrigger = DialogPrimitive.Trigger;\nconst DialogPortal = DialogPrimitive.Portal;\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg max-h-[100dvh] sm:max-h-[90vh] translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 overflow-y-auto data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n className\n )}\n {...props}\n >\n {children}\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"flex flex-col space-y-1.5 text-center sm:text-left\", className)} {...props} />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\", className)}\n {...props}\n />\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"./cn\";\n\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"rounded-md bg-muted animate-pulse\", className)}\n {...props}\n />\n )\n);\nSkeleton.displayName = \"Skeleton\";\n\nexport { Skeleton };\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { useCilantroAuth } from \"../../providers/CilantroAuthProvider\";\nimport { LoginForm } from \"./LoginForm\";\nimport { Skeleton } from \"../../ui/skeleton\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface AuthGuardClassNames {\n root?: string;\n fallback?: string;\n skeleton?: string;\n loading?: string;\n}\n\nexport interface AuthGuardProps {\n children: ReactNode;\n /** Shown when not authenticated. Default: <LoginForm /> */\n fallback?: ReactNode;\n /** If using a router, redirect to this path when not authenticated (consumer can pass fallback={<Navigate to={redirectTo} />}) */\n redirectTo?: string;\n /** Root class when showing fallback */\n className?: string;\n classNames?: AuthGuardClassNames;\n /** When true, show fallback (login) instead of children when unauthenticated. When false, render null when unauthenticated. */\n showFallback?: boolean;\n /** When true, show a small skeleton card while loading; when false (default), show \"Loading...\" text. */\n useSkeleton?: boolean;\n}\n\n/**\n * Wraps content and shows fallback (e.g. LoginForm) when the user is not authenticated.\n * Use inside CilantroProvider.\n */\nexport function AuthGuard({\n children,\n fallback,\n redirectTo,\n className,\n classNames,\n showFallback = true,\n useSkeleton = false,\n}: AuthGuardProps) {\n const { isAuthenticated, isLoading } = useCilantroAuth();\n\n if (isLoading) {\n return (\n <div\n className={cn(className, classNames?.root, classNames?.loading)}\n data-cilantro-auth-guard\n aria-busy=\"true\"\n aria-live=\"polite\"\n >\n {useSkeleton ? (\n <div className={cn(\"rounded-lg border border-input p-4 space-y-3 w-full max-w-sm\", classNames?.fallback)}>\n <Skeleton className={cn(\"h-6 w-2/3 rounded\", classNames?.skeleton)} />\n <Skeleton className={cn(\"h-4 w-full rounded\", classNames?.skeleton)} />\n <Skeleton className={cn(\"h-4 w-[80%] rounded\", classNames?.skeleton)} />\n </div>\n ) : (\n <div className={cn(\"text-sm text-muted-foreground\", classNames?.fallback)}>Loading...</div>\n )}\n </div>\n );\n }\n\n if (!isAuthenticated) {\n if (!showFallback) return null;\n if (redirectTo && typeof window !== \"undefined\") {\n window.location.href = redirectTo;\n return null;\n }\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-auth-guard>\n {fallback ?? <LoginForm className={classNames?.fallback} />}\n </div>\n );\n }\n\n return <>{children}</>;\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useSigners } from \"../../hooks/useSigners\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { cn } from \"../../ui/cn\";\nimport type { SignerInfo } from \"cilantro-sdk/helpers\";\n\nexport interface CreateEmailSignerFormProps {\n walletId: string;\n onCreated?: (signer: SignerInfo) => void;\n onError?: (error: Error) => void;\n className?: string;\n}\n\nexport function CreateEmailSignerForm({\n walletId,\n onCreated,\n onError,\n className,\n}: CreateEmailSignerFormProps) {\n const { createEmailSigner, isLoading } = useSigners(walletId);\n const [email, setEmail] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n try {\n const signer = await createEmailSigner({ email: email.trim() });\n setEmail(\"\");\n onCreated?.(signer);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className={cn(\"space-y-4\", className)} data-cilantro-create-email-signer>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-email-signer-email\">Email</Label>\n <Input\n id=\"cilantro-email-signer-email\"\n type=\"email\"\n autoComplete=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n disabled={isLoading}\n />\n </div>\n {error && (\n <div className=\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\" role=\"alert\">\n {error}\n </div>\n )}\n <Button type=\"submit\" disabled={isLoading || !email.trim()}>\n {isLoading ? \"Creating...\" : \"Create email signer\"}\n </Button>\n </form>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useSigners } from \"../../hooks/useSigners\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { cn } from \"../../ui/cn\";\nimport type { SignerInfo } from \"cilantro-sdk/helpers\";\n\nexport interface CreatePhoneSignerFormProps {\n walletId: string;\n onCreated?: (signer: SignerInfo) => void;\n onError?: (error: Error) => void;\n className?: string;\n}\n\nexport function CreatePhoneSignerForm({\n walletId,\n onCreated,\n onError,\n className,\n}: CreatePhoneSignerFormProps) {\n const { createPhoneSigner, isLoading } = useSigners(walletId);\n const [phone, setPhone] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n try {\n const signer = await createPhoneSigner({ phone: phone.trim() });\n setPhone(\"\");\n onCreated?.(signer);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className={cn(\"space-y-4\", className)} data-cilantro-create-phone-signer>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-phone-signer-phone\">Phone number</Label>\n <Input\n id=\"cilantro-phone-signer-phone\"\n type=\"tel\"\n autoComplete=\"tel\"\n value={phone}\n onChange={(e) => setPhone(e.target.value)}\n placeholder=\"+1234567890\"\n required\n disabled={isLoading}\n />\n </div>\n {error && (\n <div className=\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\" role=\"alert\">\n {error}\n </div>\n )}\n <Button type=\"submit\" disabled={isLoading || !phone.trim()}>\n {isLoading ? \"Creating...\" : \"Create phone signer\"}\n </Button>\n </form>\n );\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { usePasskey } from \"../../hooks/usePasskey\";\nimport { Button } from \"../../ui/button\";\nimport { cn } from \"../../ui/cn\";\nimport type { SignerInfo } from \"cilantro-sdk/helpers\";\n\nexport interface AddPasskeyButtonProps {\n walletId: string;\n onRegistered?: (signer: SignerInfo) => void;\n onError?: (error: Error) => void;\n className?: string;\n children?: ReactNode;\n}\n\nexport function AddPasskeyButton({\n walletId,\n onRegistered,\n onError,\n className,\n children,\n}: AddPasskeyButtonProps) {\n const { isSupported, register, isLoading } = usePasskey(walletId);\n const [error, setError] = useState<string | null>(null);\n\n const handleClick = async () => {\n setError(null);\n try {\n const result = await register();\n onRegistered?.(result as unknown as SignerInfo);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n };\n\n if (!isSupported) return null;\n\n return (\n <div className={cn(className)} data-cilantro-add-passkey>\n <Button type=\"button\" variant=\"outline\" onClick={handleClick} disabled={isLoading}>\n {children ?? \"Add Passkey\"}\n </Button>\n {error && (\n <p className=\"mt-2 text-sm text-destructive\" role=\"alert\">\n {error}\n </p>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useSigners } from \"../../hooks/useSigners\";\nimport { getSignerDisplayName, getSignerTypeLabel } from \"../../core/signer-helpers\";\nimport type { SignerData } from \"../../core/signer-helpers\";\nimport { Button } from \"../../ui/button\";\nimport { Skeleton } from \"../../ui/skeleton\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"../../ui/dialog\";\nimport { CreateEmailSignerForm } from \"./CreateEmailSignerForm\";\nimport { CreatePhoneSignerForm } from \"./CreatePhoneSignerForm\";\nimport { AddPasskeyButton } from \"./AddPasskeyButton\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface SignerListClassNames {\n root?: string;\n header?: string;\n list?: string;\n item?: string;\n addButton?: string;\n message?: string;\n skeleton?: string;\n loading?: string;\n}\n\nexport interface SignerListProps {\n walletId: string;\n onRevoke?: (signerId: string) => void;\n className?: string;\n classNames?: SignerListClassNames;\n onSignerAdded?: () => void;\n useSkeleton?: boolean;\n children?: (props: {\n signers: SignerData[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n openAddSigner: () => void;\n }) => React.ReactNode;\n}\n\nexport function SignerList({\n walletId,\n onRevoke,\n className,\n classNames,\n onSignerAdded,\n useSkeleton = true,\n children,\n}: SignerListProps) {\n const { signers, isLoading, error, refresh, revokeSigner } = useSigners(walletId);\n const [addSignerOpen, setAddSignerOpen] = useState(false);\n\n const handleAddSuccess = () => {\n refresh();\n setAddSignerOpen(false);\n onSignerAdded?.();\n };\n\n const handleRevoke = async (signerId: string) => {\n try {\n await revokeSigner(signerId);\n onRevoke?.(signerId);\n } catch {\n // error handled by hook/UI\n }\n };\n\n if (children) {\n return (\n <>\n {children({\n signers,\n isLoading,\n error,\n refresh,\n openAddSigner: () => setAddSignerOpen(true),\n })}\n <Dialog open={addSignerOpen} onOpenChange={setAddSignerOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Add signer</DialogTitle>\n </DialogHeader>\n <div className=\"space-y-4\">\n <CreateEmailSignerForm\n walletId={walletId}\n onCreated={handleAddSuccess}\n />\n <CreatePhoneSignerForm\n walletId={walletId}\n onCreated={handleAddSuccess}\n />\n <AddPasskeyButton\n walletId={walletId}\n onRegistered={handleAddSuccess}\n />\n </div>\n </DialogContent>\n </Dialog>\n </>\n );\n }\n\n if (!walletId) {\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-signer-list>\n <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>Select a wallet first.</p>\n </div>\n );\n }\n\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-signer-list aria-busy={isLoading} aria-live=\"polite\">\n <div className={cn(\"flex items-center justify-between gap-2 mb-2\", classNames?.header)}>\n <span className=\"text-sm font-medium\">Signers</span>\n <Button\n type=\"button\"\n size=\"touch\"\n variant=\"outline\"\n className={classNames?.addButton}\n onClick={() => setAddSignerOpen(true)}\n disabled={isLoading}\n aria-label=\"Add signer\"\n >\n Add signer\n </Button>\n </div>\n {isLoading && useSkeleton ? (\n <div className={cn(\"space-y-1\", classNames?.loading)} aria-busy=\"true\" aria-live=\"polite\">\n {[1, 2, 3].map((i) => (\n <Skeleton key={i} className={cn(\"h-5 w-full rounded-md\", classNames?.skeleton)} />\n ))}\n </div>\n ) : isLoading ? (\n <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>Loading signers...</p>\n ) : error ? (\n <div className={cn(\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2\", classNames?.message)} role=\"alert\">\n <p className=\"text-sm text-destructive\">{error}</p>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"mt-2\" onClick={() => refresh()}>\n Retry\n </Button>\n </div>\n ) : signers.length === 0 ? (\n <div className={cn(\"rounded-md border border-input bg-muted/30 px-4 py-3 text-sm text-muted-foreground\", classNames?.message)}>\n <p className=\"font-medium text-foreground\">No signers</p>\n <p className=\"mt-1\">Add a signer to authorize transactions for this wallet.</p>\n <Button\n type=\"button\"\n size=\"touch\"\n variant=\"outline\"\n className={cn(\"mt-3\", classNames?.addButton)}\n onClick={() => setAddSignerOpen(true)}\n aria-label=\"Add signer\"\n >\n Add signer\n </Button>\n </div>\n ) : (\n <ul className={cn(\"space-y-1\", classNames?.list)} role=\"list\">\n {signers.map((signer) => (\n <li key={signer.id} className={cn(\"flex items-center justify-between gap-2 text-sm\", classNames?.item)}>\n <span>\n {getSignerDisplayName(signer)} ({getSignerTypeLabel(signer.type || signer.signerType || \"\")})\n </span>\n {onRevoke && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-destructive\"\n onClick={() => handleRevoke(signer.id)}\n aria-label=\"Revoke signer\"\n >\n Revoke\n </Button>\n )}\n </li>\n ))}\n </ul>\n )}\n <Dialog open={addSignerOpen} onOpenChange={setAddSignerOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Add signer</DialogTitle>\n </DialogHeader>\n <div className=\"space-y-4\">\n <CreateEmailSignerForm walletId={walletId} onCreated={handleAddSuccess} />\n <CreatePhoneSignerForm walletId={walletId} onCreated={handleAddSuccess} />\n <AddPasskeyButton walletId={walletId} onRegistered={handleAddSuccess} />\n </div>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","\"use client\";\n\nimport { useSigners } from \"../../hooks/useSigners\";\nimport type { SignerData } from \"../../core/signer-helpers\";\nimport { getSignerDisplayName, getSignerTypeLabel, getSignerUniqueId } from \"../../core/signer-helpers\";\nimport { Button } from \"../../ui/button\";\nimport { Skeleton } from \"../../ui/skeleton\";\nimport { cn } from \"../../ui/cn\";\nimport type { SignerType } from \"../../core/signer-signing\";\n\nexport interface SignerSelectorClassNames {\n root?: string;\n list?: string;\n item?: string;\n message?: string;\n skeleton?: string;\n loading?: string;\n}\n\n/** Guide API: walletId + value + onChange(signerId, signerType) */\nexport interface SignerSelectorProps {\n walletId: string;\n value?: string;\n onChange: (signerId: string, signerType: SignerType) => void;\n className?: string;\n classNames?: SignerSelectorClassNames;\n useSkeleton?: boolean;\n /** Legacy: when provided with availableSigners/selectedSigner/onSignerSelect, use legacy API */\n selectedWalletId?: string;\n availableSigners?: SignerData[];\n selectedSigner?: SignerData | null;\n isLoadingSigners?: boolean;\n onSignerSelect?: (signer: SignerData) => void;\n renderList?: (props: {\n signers: SignerData[];\n selectedSigner: SignerData | null;\n onSelect: (signer: SignerData) => void;\n isLoading: boolean;\n getSignerDisplayName: (s: SignerData) => string;\n getSignerTypeLabel: (type: string) => string;\n getSignerUniqueId: (s: SignerData) => string;\n }) => React.ReactNode;\n children?: (props: {\n signers: SignerData[];\n selectedSigner: SignerData | null;\n onSignerSelect: (signer: SignerData) => void;\n isLoading: boolean;\n }) => React.ReactNode;\n}\n\nexport function SignerSelector({\n walletId,\n value,\n onChange,\n className,\n classNames,\n useSkeleton = true,\n selectedWalletId,\n availableSigners: availableSignersProp,\n selectedSigner: selectedSignerProp,\n isLoadingSigners: isLoadingSignersProp,\n onSignerSelect,\n renderList,\n children,\n}: SignerSelectorProps) {\n const { signers, isLoading } = useSigners(walletId);\n const availableSigners = availableSignersProp ?? signers;\n const isLoadingSigners = isLoadingSignersProp ?? isLoading;\n const resolvedSelected =\n value != null\n ? availableSigners.find((s) => s.id === value || s.signerId === value)\n : null;\n const selectedSigner = selectedSignerProp ?? resolvedSelected ?? null;\n\n const handleSelect = (signer: SignerData) => {\n const signerType = (signer.type || signer.signerType || \"email\") as SignerType;\n onChange(signer.id, signerType);\n onSignerSelect?.(signer);\n };\n\n if (!walletId && !selectedWalletId) return null;\n\n if (children) {\n return (\n <>\n {children({\n signers: availableSigners,\n selectedSigner,\n onSignerSelect: handleSelect,\n isLoading: isLoadingSigners,\n })}\n </>\n );\n }\n\n if (renderList) {\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-signer-selector>\n {renderList({\n signers: availableSigners,\n selectedSigner: selectedSigner ?? null,\n onSelect: handleSelect,\n isLoading: isLoadingSigners,\n getSignerDisplayName,\n getSignerTypeLabel,\n getSignerUniqueId,\n })}\n </div>\n );\n }\n\n const loadingContent =\n isLoadingSigners && useSkeleton ? (\n <div className={cn(\"space-y-1\", classNames?.loading)} aria-busy=\"true\" aria-live=\"polite\">\n {[1, 2, 3].map((i) => (\n <Skeleton key={i} className={cn(\"h-8 w-full rounded-md\", classNames?.skeleton)} />\n ))}\n </div>\n ) : isLoadingSigners ? (\n <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>Loading signers...</p>\n ) : null;\n\n return (\n <div\n className={cn(className, classNames?.root)}\n data-cilantro-signer-selector\n role=\"listbox\"\n aria-label=\"Select signer\"\n aria-busy={isLoadingSigners}\n aria-live=\"polite\"\n >\n {loadingContent ??\n (availableSigners.length === 0 ? (\n <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>No signers for this wallet.</p>\n ) : (\n <ul className={cn(\"space-y-1\", classNames?.list)}>\n {availableSigners.map((signer) => (\n <li key={signer.id}>\n <Button\n type=\"button\"\n variant={selectedSigner?.id === signer.id ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n className={cn(\"w-full justify-start\", classNames?.item)}\n onClick={() => handleSelect(signer)}\n aria-pressed={selectedSigner?.id === signer.id}\n >\n {getSignerDisplayName(signer)} ({getSignerTypeLabel(signer.type || signer.signerType || \"\")})\n </Button>\n </li>\n ))}\n </ul>\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { useExternalWallet } from \"../../hooks/useExternalWallet\";\nimport type { SolanaWallet } from \"../../hooks/useExternalWallet\";\nimport { Button } from \"../../ui/button\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface ConnectWalletButtonProps {\n onConnect?: (publicKey: string, wallet: SolanaWallet) => void;\n onDisconnect?: () => void;\n className?: string;\n children?: ReactNode;\n}\n\nexport function ConnectWalletButton({\n onConnect,\n onDisconnect,\n className,\n children,\n}: ConnectWalletButtonProps) {\n const { wallets, connectedWallet, connect, disconnect } = useExternalWallet();\n const [loading, setLoading] = useState(false);\n\n const handleConnect = async (wallet: SolanaWallet) => {\n setLoading(true);\n try {\n const publicKey = await connect(wallet);\n onConnect?.(publicKey, wallet);\n } finally {\n setLoading(false);\n }\n };\n\n const handleDisconnect = async () => {\n setLoading(true);\n try {\n await disconnect();\n onDisconnect?.();\n } finally {\n setLoading(false);\n }\n };\n\n if (connectedWallet) {\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n className={cn(className)}\n onClick={handleDisconnect}\n disabled={loading}\n data-cilantro-connect-wallet\n >\n {loading ? \"Disconnecting...\" : \"Disconnect\"}\n </Button>\n );\n }\n\n if (wallets.length === 0) {\n return (\n <Button type=\"button\" variant=\"outline\" className={cn(className)} disabled data-cilantro-connect-wallet>\n No wallet detected\n </Button>\n );\n }\n\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n className={cn(className)}\n onClick={() => handleConnect(wallets[0])}\n disabled={loading}\n data-cilantro-connect-wallet\n >\n {loading ? \"Connecting...\" : (children ?? \"Connect Wallet\")}\n </Button>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useWallet } from \"../../hooks/useWallet\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { cn } from \"../../ui/cn\";\nimport type { WalletControllerCreateResult } from \"cilantro-sdk/wallet\";\n\nexport interface CreateWalletFormProps {\n userId?: string;\n onCreated?: (wallet: WalletControllerCreateResult) => void;\n onError?: (error: Error) => void;\n className?: string;\n}\n\nexport function CreateWalletForm({\n userId,\n onCreated,\n onError,\n className,\n}: CreateWalletFormProps) {\n const { createWallet, isLoading } = useWallet();\n const [name, setName] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n try {\n const result = await createWallet({ name: name.trim(), userId });\n setName(\"\");\n onCreated?.(result);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className={cn(\"space-y-4\", className)} data-cilantro-create-wallet>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-wallet-name\">Wallet name</Label>\n <Input\n id=\"cilantro-wallet-name\"\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"My Wallet\"\n required\n disabled={isLoading}\n />\n </div>\n {error && (\n <div className=\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\" role=\"alert\">\n {error}\n </div>\n )}\n <Button type=\"submit\" disabled={isLoading || !name.trim()}>\n {isLoading ? \"Creating...\" : \"Create wallet\"}\n </Button>\n </form>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\nimport { cn } from \"./cn\";\n\nconst Select = SelectPrimitive.Root;\nconst SelectGroup = SelectPrimitive.Group;\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <span className=\"ml-2 h-4 w-4 shrink-0 opacity-50\">▼</span>\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n));\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>✓</SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n));\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nexport { Select, SelectGroup, SelectValue, SelectTrigger, SelectContent, SelectItem };\n","\"use client\";\n\nimport { useWallets } from \"../../providers/WalletProvider\";\nimport type { WalletData } from \"../../providers/WalletProvider\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../ui/select\";\nimport { Skeleton } from \"../../ui/skeleton\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface WalletSelectorClassNames {\n root?: string;\n trigger?: string;\n content?: string;\n item?: string;\n skeleton?: string;\n loading?: string;\n}\n\nexport interface WalletSelectorProps {\n value?: string;\n onChange?: (walletId: string) => void;\n onWalletChange?: (walletId: string, wallet: WalletData | null) => void;\n className?: string;\n classNames?: WalletSelectorClassNames;\n useSkeleton?: boolean;\n placeholder?: string;\n renderTrigger?: (props: {\n selectedWallet: WalletData | null;\n wallets: WalletData[];\n isLoading: boolean;\n open: boolean;\n setOpen: (open: boolean) => void;\n }) => React.ReactNode;\n renderList?: (props: {\n wallets: WalletData[];\n selectedWallet: WalletData | null;\n onSelect: (wallet: WalletData) => void;\n isLoading: boolean;\n }) => React.ReactNode;\n children?: (props: {\n wallets: WalletData[];\n selectedWallet: WalletData | null;\n selectWallet: (walletId: string) => void;\n isLoading: boolean;\n refreshWallets: () => Promise<void>;\n }) => React.ReactNode;\n}\n\nexport function WalletSelector(props: WalletSelectorProps) {\n const {\n value,\n onChange,\n onWalletChange,\n className,\n classNames,\n useSkeleton = true,\n placeholder = \"Select a wallet\",\n renderTrigger,\n renderList,\n children,\n } = props;\n const { wallets, selectedWallet, selectWallet, isLoading, refreshWallets } = useWallets();\n const isEmpty = !isLoading && wallets.length === 0;\n const effectiveValue = value ?? selectedWallet?.id ?? selectedWallet?.walletId ?? \"\";\n const selected = wallets.find((w) => w.id === effectiveValue || w.walletId === effectiveValue) ?? selectedWallet;\n\n const handleSelect = (wallet: WalletData) => {\n const id = wallet.id ?? wallet.walletId;\n selectWallet(id);\n onChange?.(id);\n onWalletChange?.(id, wallet);\n };\n\n const handleValueChange = (id: string) => {\n selectWallet(id);\n onChange?.(id);\n onWalletChange?.(id, wallets.find((w) => w.id === id || w.walletId === id) ?? null);\n };\n\n if (children) {\n return (\n <>\n {children({\n wallets,\n selectedWallet: selected,\n selectWallet: (id) => {\n selectWallet(id);\n onChange?.(id);\n onWalletChange?.(id, wallets.find((w) => w.id === id || w.walletId === id) ?? null);\n },\n isLoading,\n refreshWallets,\n })}\n </>\n );\n }\n\n if (renderTrigger || renderList) {\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-wallet-selector>\n {renderTrigger?.({ selectedWallet: selected, wallets, isLoading, open: false, setOpen: () => {} })}\n {renderList?.({ wallets, selectedWallet: selected, onSelect: handleSelect, isLoading })}\n </div>\n );\n }\n\n if (isLoading && useSkeleton) {\n return (\n <div\n className={cn(className, classNames?.root, classNames?.loading)}\n data-cilantro-wallet-selector\n aria-busy=\"true\"\n aria-live=\"polite\"\n >\n <div\n className={cn(\n \"flex h-9 w-full items-center justify-between rounded-md border border-input bg-transparent px-3 py-2\",\n classNames?.trigger\n )}\n >\n <Skeleton className={cn(\"h-4 flex-1 rounded\", classNames?.skeleton)} />\n </div>\n </div>\n );\n }\n\n if (isEmpty) {\n return (\n <div\n className={cn(\n \"rounded-md border border-input bg-muted/30 px-4 py-3 text-sm text-muted-foreground\",\n className,\n classNames?.root\n )}\n data-cilantro-wallet-selector\n >\n <p className=\"font-medium text-foreground\">No wallets</p>\n <p className=\"mt-1\">Wallets are created by the platform when you sign in. If you just logged in, try refreshing.</p>\n </div>\n );\n }\n\n return (\n <div className={cn(className, classNames?.root)} data-cilantro-wallet-selector>\n <Select value={effectiveValue || undefined} onValueChange={handleValueChange} disabled={isLoading}>\n <SelectTrigger className={classNames?.trigger} aria-label=\"Select wallet\">\n <SelectValue placeholder={isLoading ? \"Loading...\" : placeholder} />\n </SelectTrigger>\n <SelectContent className={classNames?.content}>\n {wallets.map((w) => {\n const id = w.id ?? w.walletId;\n return (\n <SelectItem key={id} value={id} className={classNames?.item}>\n {w.walletName || id}\n </SelectItem>\n );\n })}\n </SelectContent>\n </Select>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Button } from \"../../ui/button\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface WalletAddressProps {\n address: string;\n short?: boolean;\n copyable?: boolean;\n className?: string;\n}\n\nfunction truncateAddress(addr: string, chars = 4): string {\n if (addr.length <= chars * 2 + 3) return addr;\n return `${addr.slice(0, chars)}...${addr.slice(-chars)}`;\n}\n\nexport function WalletAddress({\n address,\n short = false,\n copyable = false,\n className,\n}: WalletAddressProps) {\n const [copied, setCopied] = useState(false);\n const display = short ? truncateAddress(address) : address;\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(address);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // ignore\n }\n };\n\n return (\n <span className={cn(\"inline-flex items-center gap-2\", className)} data-cilantro-wallet-address>\n <code className=\"text-sm font-mono\">{display}</code>\n {copyable && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-2 text-xs\"\n onClick={handleCopy}\n aria-label=\"Copy address\"\n >\n {copied ? \"Copied\" : \"Copy\"}\n </Button>\n )}\n </span>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useCilantroContext } from \"../../context/CilantroContext\";\nimport { setSdkAuth } from \"../../core/auth\";\nimport { getAssets } from \"cilantro-sdk/wallet\";\nimport { extractResponseData } from \"../../core/types\";\nimport { Skeleton } from \"../../ui/skeleton\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface WalletBalanceProps {\n walletId: string;\n showTokens?: boolean;\n className?: string;\n}\n\nexport function WalletBalance({\n walletId,\n showTokens = false,\n className,\n}: WalletBalanceProps) {\n const { jwt } = useCilantroContext();\n const [loading, setLoading] = useState(true);\n const [solBalance, setSolBalance] = useState<string | null>(null);\n const [tokens, setTokens] = useState<Array<{ symbol?: string; balance?: string; mint?: string }>>([]);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!walletId || !jwt) {\n setSolBalance(null);\n setTokens([]);\n setLoading(false);\n return;\n }\n let cancelled = false;\n setLoading(true);\n setError(null);\n (async () => {\n try {\n if (jwt) setSdkAuth(jwt);\n const result = await getAssets(walletId);\n const data = extractResponseData<{ solBalance?: string; assets?: Array<{ symbol?: string; balance?: string; mint?: string }> }>(result);\n if (cancelled) return;\n setSolBalance(data?.solBalance ?? null);\n if (showTokens && Array.isArray(data?.assets)) {\n setTokens(data.assets);\n } else {\n setTokens([]);\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : String(err));\n setSolBalance(null);\n setTokens([]);\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [walletId, jwt, showTokens]);\n\n if (loading) {\n return (\n <div className={cn(className)} data-cilantro-wallet-balance>\n <Skeleton className=\"h-5 w-24 rounded\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={cn(\"text-sm text-destructive\", className)} data-cilantro-wallet-balance role=\"alert\">\n {error}\n </div>\n );\n }\n\n const solDisplay = solBalance != null ? `${Number(solBalance) / 1e9} SOL` : \"—\";\n\n return (\n <div className={cn(\"text-sm\", className)} data-cilantro-wallet-balance>\n <span className=\"font-medium\">{solDisplay}</span>\n {showTokens && tokens.length > 0 && (\n <ul className=\"mt-1 space-y-0.5 text-muted-foreground\">\n {tokens.map((t, i) => (\n <li key={t.mint ?? i}>\n {t.symbol ?? t.mint ?? \"Token\"}: {t.balance ?? \"—\"}\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useSendTransaction } from \"../../hooks/useSendTransaction\";\nimport type { SubmitTransactionResult } from \"../../hooks/useSendTransaction\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { cn } from \"../../ui/cn\";\n\nexport type SignerType = \"email\" | \"phone\" | \"passkey\" | \"external\";\n\nexport interface SendSOLFormProps {\n walletId: string;\n signerId?: string;\n signerType?: SignerType;\n onSuccess?: (result: SubmitTransactionResult) => void;\n onError?: (error: Error) => void;\n className?: string;\n}\n\nexport function SendSOLForm({\n walletId,\n signerId,\n signerType,\n onSuccess,\n onError,\n className,\n}: SendSOLFormProps) {\n const { sendSOL, isPending, error } = useSendTransaction(walletId, signerId, signerType);\n const [recipientAddress, setRecipientAddress] = useState(\"\");\n const [amountLamports, setAmountLamports] = useState(\"\");\n const [submitError, setSubmitError] = useState<string | null>(null);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setSubmitError(null);\n const lamports = Number(amountLamports);\n if (!recipientAddress.trim() || Number.isNaN(lamports) || lamports < 1) {\n setSubmitError(\"Invalid recipient or amount\");\n return;\n }\n try {\n const result = await sendSOL({ recipientAddress: recipientAddress.trim(), amountLamports: lamports });\n setRecipientAddress(\"\");\n setAmountLamports(\"\");\n onSuccess?.(result);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setSubmitError(message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className={cn(\"space-y-4\", className)} data-cilantro-send-sol>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-send-sol-recipient\">Recipient address</Label>\n <Input\n id=\"cilantro-send-sol-recipient\"\n type=\"text\"\n value={recipientAddress}\n onChange={(e) => setRecipientAddress(e.target.value)}\n placeholder=\"7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU\"\n required\n disabled={isPending}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-send-sol-amount\">Amount (lamports)</Label>\n <Input\n id=\"cilantro-send-sol-amount\"\n type=\"number\"\n min={1}\n value={amountLamports}\n onChange={(e) => setAmountLamports(e.target.value)}\n placeholder=\"100000000\"\n required\n disabled={isPending}\n />\n </div>\n {(error || submitError) && (\n <div className=\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\" role=\"alert\">\n {submitError ?? error}\n </div>\n )}\n <Button type=\"submit\" disabled={isPending || !recipientAddress.trim() || !amountLamports}>\n {isPending ? \"Sending...\" : \"Send SOL\"}\n </Button>\n </form>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport {\n useSendTransaction,\n type SubmitTransactionResult,\n type SignerType,\n} from \"../../hooks/useSendTransaction\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface SendSPLFormProps {\n walletId: string;\n signerId?: string;\n signerType?: SignerType;\n mintAddress?: string;\n onSuccess?: (result: SubmitTransactionResult) => void;\n onError?: (error: Error) => void;\n className?: string;\n}\n\nexport function SendSPLForm({\n walletId,\n signerId,\n signerType,\n mintAddress: initialMint,\n onSuccess,\n onError,\n className,\n}: SendSPLFormProps) {\n const { sendSPL, isPending, error } = useSendTransaction(walletId, signerId, signerType);\n const [mintAddress, setMintAddress] = useState(initialMint ?? \"\");\n const [recipientAddress, setRecipientAddress] = useState(\"\");\n const [amount, setAmount] = useState(\"\");\n const [submitError, setSubmitError] = useState<string | null>(null);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setSubmitError(null);\n const amt = Number(amount);\n if (!mintAddress.trim() || !recipientAddress.trim() || Number.isNaN(amt) || amt < 0) {\n setSubmitError(\"Invalid mint, recipient or amount\");\n return;\n }\n try {\n const result = await sendSPL({\n mintAddress: mintAddress.trim(),\n recipientAddress: recipientAddress.trim(),\n amount: amt,\n });\n setRecipientAddress(\"\");\n setAmount(\"\");\n onSuccess?.(result);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setSubmitError(message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className={cn(\"space-y-4\", className)} data-cilantro-send-spl>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-send-spl-mint\">Mint address</Label>\n <Input\n id=\"cilantro-send-spl-mint\"\n type=\"text\"\n value={mintAddress}\n onChange={(e) => setMintAddress(e.target.value)}\n placeholder=\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\"\n required\n disabled={isPending}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-send-spl-recipient\">Recipient address</Label>\n <Input\n id=\"cilantro-send-spl-recipient\"\n type=\"text\"\n value={recipientAddress}\n onChange={(e) => setRecipientAddress(e.target.value)}\n placeholder=\"Recipient Solana address\"\n required\n disabled={isPending}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cilantro-send-spl-amount\">Amount</Label>\n <Input\n id=\"cilantro-send-spl-amount\"\n type=\"number\"\n min={0}\n step=\"any\"\n value={amount}\n onChange={(e) => setAmount(e.target.value)}\n placeholder=\"100\"\n required\n disabled={isPending}\n />\n </div>\n {(error || submitError) && (\n <div className=\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\" role=\"alert\">\n {submitError ?? error}\n </div>\n )}\n <Button type=\"submit\" disabled={isPending || !mintAddress.trim() || !recipientAddress.trim() || !amount}>\n {isPending ? \"Sending...\" : \"Send SPL\"}\n </Button>\n </form>\n );\n}\n","\"use client\";\n\nimport { cn } from \"../../ui/cn\";\n\nconst EXPLORER_URL: Record<string, string> = {\n \"mainnet-beta\": \"https://explorer.solana.com\",\n devnet: \"https://explorer.solana.com/?cluster=devnet\",\n testnet: \"https://explorer.solana.com/?cluster=testnet\",\n};\n\nexport interface TransactionStatusProps {\n signature: string;\n cluster?: \"mainnet-beta\" | \"devnet\" | \"testnet\";\n className?: string;\n}\n\nexport function TransactionStatus({\n signature,\n cluster = \"mainnet-beta\",\n className,\n}: TransactionStatusProps) {\n const base = EXPLORER_URL[cluster] ?? EXPLORER_URL[\"mainnet-beta\"];\n const href = `${base}/tx/${signature}`;\n\n return (\n <div className={cn(\"text-sm\", className)} data-cilantro-transaction-status>\n <span className=\"text-muted-foreground\">Transaction: </span>\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"font-mono text-primary underline underline-offset-2\"\n >\n {signature.slice(0, 8)}...{signature.slice(-8)}\n </a>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useCilantroContext } from \"../../context/CilantroContext\";\nimport { setSdkAuth } from \"../../core/auth\";\nimport { cn } from \"../../ui/cn\";\nimport { TransactionStatus } from \"./TransactionStatus\";\n\nexport interface TransactionHistoryProps {\n walletId: string;\n pageSize?: number;\n className?: string;\n}\n\nexport function TransactionHistory({\n walletId,\n pageSize = 10,\n className,\n}: TransactionHistoryProps) {\n const { jwt } = useCilantroContext();\n const [loading, setLoading] = useState(true);\n const [signatures, setSignatures] = useState<string[]>([]);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!walletId || !jwt) {\n setSignatures([]);\n setLoading(false);\n return;\n }\n let cancelled = false;\n setLoading(true);\n setError(null);\n (async () => {\n try {\n if (jwt) setSdkAuth(jwt);\n // Placeholder: SDK may not expose transaction history list; show empty or use API when available\n if (!cancelled) setSignatures([]);\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : String(err));\n setSignatures([]);\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [walletId, jwt, pageSize]);\n\n if (loading) {\n return (\n <div className={cn(\"text-sm text-muted-foreground\", className)} data-cilantro-transaction-history>\n Loading...\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={cn(\"text-sm text-destructive\", className)} data-cilantro-transaction-history role=\"alert\">\n {error}\n </div>\n );\n }\n\n if (signatures.length === 0) {\n return (\n <div className={cn(\"text-sm text-muted-foreground\", className)} data-cilantro-transaction-history>\n No recent transactions.\n </div>\n );\n }\n\n return (\n <ul className={cn(\"space-y-2\", className)} data-cilantro-transaction-history role=\"list\">\n {signatures.map((sig) => (\n <li key={sig}>\n <TransactionStatus signature={sig} />\n </li>\n ))}\n </ul>\n );\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { useAuth } from \"../../hooks/useAuth\";\nimport { useWallet } from \"../../hooks/useWallet\";\nimport { useSigners } from \"../../hooks/useSigners\";\nimport type { WalletData } from \"../../context/CilantroContext\";\nimport type { SignerInfo } from \"cilantro-sdk/helpers\";\nimport { LoginForm } from \"../auth/LoginForm\";\nimport { CreateWalletForm } from \"../wallet/CreateWalletForm\";\nimport { CreateEmailSignerForm } from \"../signers/CreateEmailSignerForm\";\nimport { AddPasskeyButton } from \"../signers/AddPasskeyButton\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface WalletInfo extends WalletData {}\n\nexport interface CilantroConnectProps {\n onConnect?: (wallet: WalletInfo, signers: SignerInfo[]) => void;\n onDisconnect?: () => void;\n className?: string;\n}\n\nexport function CilantroConnect({\n onConnect,\n onDisconnect,\n className,\n}: CilantroConnectProps) {\n const { isAuthenticated } = useAuth();\n const { wallet, wallets, createWallet, selectWallet, isLoading: walletLoading } = useWallet();\n const [walletId, setWalletId] = useState<string | null>(null);\n const [step, setStep] = useState<\"auth\" | \"wallet\" | \"signer\" | \"done\">(\"auth\");\n\n if (!isAuthenticated) {\n return (\n <div className={cn(className)} data-cilantro-connect>\n <LoginForm onSuccess={() => setStep(\"wallet\")} />\n </div>\n );\n }\n\n if (step === \"wallet\" && wallets.length === 0 && !walletLoading) {\n return (\n <div className={cn(className)} data-cilantro-connect>\n <CreateWalletForm\n onCreated={(res) => {\n const id = (res as { data?: { id?: string } })?.data?.id;\n if (id) {\n setWalletId(id);\n selectWallet(id);\n setStep(\"signer\");\n }\n }}\n />\n </div>\n );\n }\n\n if (step === \"signer\" && walletId) {\n const currentWallet = wallet ?? wallets.find((w) => (w.id ?? w.walletId) === walletId);\n return (\n <div className={cn(\"space-y-4\", className)} data-cilantro-connect>\n <p className=\"text-sm text-muted-foreground\">Add a signer to your wallet</p>\n <CreateEmailSignerForm\n walletId={walletId}\n onCreated={(signer) => {\n const signers = [signer];\n if (currentWallet) {\n onConnect?.(currentWallet as WalletInfo, signers);\n }\n setStep(\"done\");\n }}\n />\n <AddPasskeyButton\n walletId={walletId}\n onRegistered={() => {\n if (currentWallet) {\n onConnect?.(currentWallet as WalletInfo, []);\n }\n setStep(\"done\");\n }}\n />\n </div>\n );\n }\n\n if (wallet && step === \"done\") {\n return (\n <div className={cn(className)} data-cilantro-connect>\n <p className=\"text-sm text-muted-foreground\">Connected</p>\n {onDisconnect && (\n <button\n type=\"button\"\n className=\"text-sm text-primary underline\"\n onClick={() => {\n onDisconnect();\n setStep(\"wallet\");\n setWalletId(null);\n }}\n >\n Disconnect\n </button>\n )}\n </div>\n );\n }\n\n if (walletLoading) {\n return (\n <div className={cn(\"text-sm text-muted-foreground\", className)} data-cilantro-connect>\n Loading...\n </div>\n );\n }\n\n return (\n <div className={cn(className)} data-cilantro-connect>\n <p className=\"text-sm text-muted-foreground\">Set up your wallet</p>\n <CreateWalletForm\n onCreated={(res) => {\n const id = (res as { data?: { id?: string } })?.data?.id;\n if (id) {\n setWalletId(id);\n selectWallet(id);\n setStep(\"signer\");\n }\n }}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface LoadingOverlayProps {\n isLoading: boolean;\n message?: string;\n children: ReactNode;\n className?: string;\n}\n\nexport function LoadingOverlay({\n isLoading,\n message,\n children,\n className,\n}: LoadingOverlayProps) {\n if (!isLoading) return <>{children}</>;\n\n return (\n <div className={cn(\"relative\", className)} data-cilantro-loading-overlay>\n <div\n className=\"absolute inset-0 z-10 flex items-center justify-center bg-background/80\"\n aria-busy=\"true\"\n aria-live=\"polite\"\n >\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n {message && <p className=\"text-sm text-muted-foreground\">{message}</p>}\n </div>\n </div>\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport { Component, type ErrorInfo, type ReactNode } from \"react\";\nimport { Button } from \"../../ui/button\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface ErrorBoundaryProps {\n fallback?: ReactNode;\n onRetry?: () => void;\n children: ReactNode;\n}\n\ninterface State {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, State> {\n state: State = { hasError: false, error: null };\n\n static getDerivedStateFromError(error: Error): State {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error(\"[Cilantro ErrorBoundary]\", error, errorInfo);\n }\n\n handleRetry = () => {\n this.setState({ hasError: false, error: null });\n this.props.onRetry?.();\n };\n\n render() {\n if (this.state.hasError && this.state.error) {\n if (this.props.fallback) {\n return this.props.fallback;\n }\n return (\n <div\n className=\"rounded-md border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive\"\n data-cilantro-error-boundary\n role=\"alert\"\n >\n <p className=\"font-medium\">Something went wrong</p>\n <p className=\"mt-1 text-muted-foreground\">{this.state.error.message}</p>\n {this.props.onRetry && (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"mt-3\" onClick={this.handleRetry}>\n Retry\n </Button>\n )}\n </div>\n );\n }\n return this.props.children;\n }\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"./cn\";\n\nconst DEFAULT_THEME_CSS = `\n:root,[data-theme=\"light\"]{--background:0 0% 100%;--foreground:222.2 84% 4.9%;--primary:222.2 47.4% 11.2%;--primary-foreground:210 40% 98%;--muted:210 40% 96.1%;--muted-foreground:215.4 16.3% 46.9%;--border:214.3 31.8% 91.4%;--input:214.3 31.8% 91.4%;--ring:222.2 84% 4.9%;--destructive:0 84.2% 60.2%;--destructive-foreground:210 40% 98%;--accent:210 40% 96.1%;--accent-foreground:222.2 47.4% 11.2%;--popover:0 0% 100%;--popover-foreground:222.2 84% 4.9%;--card:0 0% 100%;--card-foreground:222.2 84% 4.9%}\n[data-theme=\"dark\"]{--background:222.2 84% 4.9%;--foreground:210 40% 98%;--primary:210 40% 98%;--primary-foreground:222.2 47.4% 11.2%;--muted:217.2 32.6% 17.5%;--muted-foreground:215 20.2% 65.1%;--border:217.2 32.6% 17.5%;--input:217.2 32.6% 17.5%;--ring:212.7 26.8% 83.9%;--destructive:0 62.8% 30.6%;--destructive-foreground:210 40% 98%;--accent:217.2 32.6% 17.5%;--accent-foreground:210 40% 98%;--popover:222.2 84% 4.9%;--popover-foreground:210 40% 98%;--card:222.2 84% 4.9%;--card-foreground:210 40% 98%}\n`;\n\nexport type Theme = \"light\" | \"dark\" | \"system\";\nexport type ResolvedTheme = \"light\" | \"dark\";\n\nexport interface ThemeProviderProps {\n /** Current theme: \"light\", \"dark\", or \"system\" (follows prefers-color-scheme). */\n theme?: Theme;\n /** Default theme when theme is \"system\" or for initial render. */\n defaultTheme?: ResolvedTheme;\n /** Optional localStorage key for persisting theme when using \"system\". */\n storageKey?: string;\n /** Optional class for the wrapper div. */\n className?: string;\n children: React.ReactNode;\n /** When true, inject the default theme CSS variables (light/dark). Your app must still use Tailwind. */\n injectStyles?: boolean;\n}\n\nfunction getSystemTheme(): ResolvedTheme {\n if (typeof window === \"undefined\") return \"dark\";\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\";\n}\n\nexport function ThemeProvider({\n theme = \"system\",\n defaultTheme = \"dark\",\n storageKey,\n className,\n children,\n injectStyles = true,\n}: ThemeProviderProps) {\n const [resolved, setResolved] = React.useState<ResolvedTheme>(() => {\n if (theme === \"light\") return \"light\";\n if (theme === \"dark\") return \"dark\";\n if (typeof window !== \"undefined\" && storageKey) {\n const stored = window.localStorage.getItem(storageKey);\n if (stored === \"light\" || stored === \"dark\") return stored;\n }\n return defaultTheme;\n });\n\n React.useEffect(() => {\n if (theme === \"light\") {\n setResolved(\"light\");\n return;\n }\n if (theme === \"dark\") {\n setResolved(\"dark\");\n return;\n }\n const system = getSystemTheme();\n setResolved(system);\n const mql = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const listener = () => {\n const next = mql.matches ? \"dark\" : \"light\";\n setResolved(next);\n if (storageKey) window.localStorage.setItem(storageKey, next);\n };\n mql.addEventListener(\"change\", listener);\n return () => mql.removeEventListener(\"change\", listener);\n }, [theme, storageKey]);\n\n return (\n <>\n {injectStyles && (\n <style\n dangerouslySetInnerHTML={{ __html: DEFAULT_THEME_CSS }}\n data-cilantro-theme-styles\n />\n )}\n <div\n className={cn(className)}\n data-theme={resolved}\n data-cilantro-theme-provider\n >\n {children}\n </div>\n </>\n );\n}\n","/**\n * Adapter to use @solana/web3.js Connection for sign-and-send (advanced usage).\n * Pass the result as the connection prop so you don't need type assertions.\n */\n\nimport type { Connection } from \"@solana/web3.js\";\n\n/** Connection shape expected for sign-and-send (advanced usage). */\nexport interface SignAndSendConnectionAdapter {\n sendRawTransaction: (buf: Buffer) => Promise<string>;\n getLatestBlockhash: () => Promise<{ blockhash: string; lastValidBlockHeight: number }>;\n confirmTransaction: (opts: {\n signature: string;\n blockhash: string;\n lastValidBlockHeight: number;\n }) => Promise<void>;\n}\n\n/**\n * Wrap a @solana/web3.js Connection for sign-and-send (advanced usage).\n * Use when you have a Solana Connection and need the adapter shape without type assertions.\n *\n * @example\n * import { Connection } from '@solana/web3.js';\n * import { adaptSolanaConnection } from 'cilantro-react';\n *\n * const connection = new Connection(rpcUrl);\n * const adapter = adaptSolanaConnection(connection);\n */\nexport function adaptSolanaConnection(connection: Connection): SignAndSendConnectionAdapter {\n return {\n sendRawTransaction: (buf: Buffer) =>\n connection.sendRawTransaction(buf),\n\n getLatestBlockhash: () =>\n connection.getLatestBlockhash().then(({ blockhash, lastValidBlockHeight }) => ({\n blockhash,\n lastValidBlockHeight,\n })),\n\n confirmTransaction: async (opts: {\n signature: string;\n blockhash: string;\n lastValidBlockHeight: number;\n }) => {\n await connection.confirmTransaction({\n signature: opts.signature,\n blockhash: opts.blockhash,\n lastValidBlockHeight: opts.lastValidBlockHeight,\n });\n },\n };\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport {\n deriveSignerKeypair,\n getEmailSignerKeypair,\n getPhoneSignerKeypair,\n} from \"cilantro-sdk/helpers\";\nimport type { SignerData } from \"../signer-helpers\";\nimport { getStorageOptions } from \"./storage\";\nimport { SIGNER_TYPES, type SignerType } from \"./constants\";\n\nexport async function getSignerPublicKey(\n walletId: string,\n signer: SignerData,\n signerType: string,\n signerId: string\n): Promise<PublicKey> {\n const existingPubkey = signer.signerPubkey || signer.publicKey;\n if (existingPubkey && typeof existingPubkey === \"string\" && existingPubkey.trim()) {\n return new PublicKey(existingPubkey.trim());\n }\n const storageOptions = getStorageOptions();\n if (signerType === SIGNER_TYPES.EMAIL) {\n const keypair = await getEmailSignerKeypair(walletId, signerId, storageOptions);\n return new PublicKey(keypair.publicKey);\n }\n if (signerType === SIGNER_TYPES.PHONE) {\n const keypair = await getPhoneSignerKeypair(walletId, signerId, storageOptions);\n return new PublicKey(keypair.publicKey);\n }\n if (signerType === SIGNER_TYPES.EXTERNAL || signerType === SIGNER_TYPES.API_KEY) {\n const keypair = await deriveSignerKeypair(walletId, signerId, signerType, storageOptions);\n return new PublicKey(keypair.publicKey);\n }\n throw new Error(`Unsupported signer type: ${signerType}`);\n}\n","export const CACHE_CONFIG = { enabled: true, ttl: 300000 } as const;\n\nexport const SIGNER_TYPES = {\n EMAIL: \"email\",\n PHONE: \"phone\",\n PASSKEY: \"passkey\",\n EXTERNAL: \"external\",\n API_KEY: \"apiKey\",\n} as const;\n\nexport type SignerType = (typeof SIGNER_TYPES)[keyof typeof SIGNER_TYPES];\n\nexport function isValidSignerType(type: string): type is SignerType {\n return Object.values(SIGNER_TYPES).includes(type as SignerType);\n}\n","import { getStorageAdapter, type DeviceKeyStorage } from \"../storage-adapter\";\nimport { CACHE_CONFIG } from \"./constants\";\n\nexport function getSignerStorage(): DeviceKeyStorage {\n return getStorageAdapter();\n}\n\nexport function getStorageOptions() {\n return {\n deviceKeyManager: getSignerStorage(),\n cache: CACHE_CONFIG,\n };\n}\n","import {\n deriveSignerKeypair,\n signWithSigner,\n signWithEmailSigner,\n signWithPhoneSigner,\n getEmailSignerKeypair,\n getPhoneSignerKeypair,\n} from \"cilantro-sdk/helpers\";\nimport type { SignerData } from \"../signer-helpers\";\nimport { signWithPasskey } from \"../signer-creation\";\nimport { handleDeviceKeyError } from \"./errors\";\nimport { extractSignerInfo, validateSignerActive } from \"./signer-types\";\nimport { getStorageOptions } from \"./storage\";\nimport { SIGNER_TYPES } from \"./constants\";\n\n/** Result shape aligned with SDK SignMessageDataDto (signature base64, message) plus optional helper fields. */\nexport interface SignMessageResult {\n /** Signature in base64 (SDK SignMessageDataDto shape). */\n signature: string;\n /** Original message that was signed (SDK SignMessageDataDto shape). */\n message: string;\n publicKey?: string;\n signerType: string;\n signer?: string;\n}\n\nexport async function signMessageWithSigner(\n walletId: string,\n signer: SignerData,\n messageText: string\n): Promise<SignMessageResult> {\n const { signerType, signerId } = extractSignerInfo(signer);\n const message = new TextEncoder().encode(messageText);\n\n if (signerType === SIGNER_TYPES.EMAIL) {\n validateSignerActive(signer, signerType);\n const storageOptions = getStorageOptions();\n try {\n const signatureBytes = await signWithEmailSigner(walletId, signerId, message, storageOptions);\n const keypair = await getEmailSignerKeypair(walletId, signerId, storageOptions);\n return {\n signature: Buffer.from(signatureBytes).toString(\"base64\"),\n message: messageText,\n publicKey: Buffer.from(keypair.publicKey).toString(\"hex\"),\n signerType: SIGNER_TYPES.EMAIL,\n };\n } catch (error: unknown) {\n throw handleDeviceKeyError(error, SIGNER_TYPES.EMAIL);\n }\n }\n\n if (signerType === SIGNER_TYPES.PHONE) {\n validateSignerActive(signer, signerType);\n const storageOptions = getStorageOptions();\n try {\n const signatureBytes = await signWithPhoneSigner(walletId, signerId, message, storageOptions);\n const keypair = await getPhoneSignerKeypair(walletId, signerId, storageOptions);\n return {\n signature: Buffer.from(signatureBytes).toString(\"base64\"),\n message: messageText,\n publicKey: Buffer.from(keypair.publicKey).toString(\"hex\"),\n signerType: SIGNER_TYPES.PHONE,\n };\n } catch (error: unknown) {\n throw handleDeviceKeyError(error, SIGNER_TYPES.PHONE);\n }\n }\n\n if (signerType === SIGNER_TYPES.PASSKEY) {\n const signResult = await signWithPasskey(walletId, signerId, messageText, { useBrowserAutofill: false });\n const signatureBase64 = Buffer.from(signResult.signature, \"hex\").toString(\"base64\");\n return {\n signature: signatureBase64,\n message: messageText,\n signerType: SIGNER_TYPES.PASSKEY,\n signer: signResult.signer,\n };\n }\n\n if (signerType === SIGNER_TYPES.EXTERNAL || signerType === SIGNER_TYPES.API_KEY) {\n validateSignerActive(signer, signerType);\n const storageOptions = getStorageOptions();\n const signatureBytes = await signWithSigner(walletId, signerId, signerType, message, storageOptions);\n const keypair = await deriveSignerKeypair(walletId, signerId, signerType, storageOptions);\n return {\n signature: Buffer.from(signatureBytes).toString(\"base64\"),\n message: messageText,\n publicKey: Buffer.from(keypair.publicKey).toString(\"base64\"),\n signerType,\n };\n }\n\n throw new Error(`Unsupported signer type: ${signerType}`);\n}\n","import {\n DeviceKeyNotFoundError,\n DeviceKeyMismatchError,\n SignerInactiveError,\n SignerNotFoundError,\n} from \"cilantro-sdk/helpers\";\n\nexport function handleDeviceKeyError(error: unknown, signerType: string): never {\n if (error instanceof DeviceKeyNotFoundError) {\n throw new Error(\n `Device key not found. Please create the ${signerType} signer first using the Signers page. The device key is generated when you create the signer.`\n );\n }\n if (error instanceof DeviceKeyMismatchError) {\n throw new Error(\n \"Device key mismatch. The stored device key doesn't match the server. You may need to create a new signer or update the device identity.\"\n );\n }\n if (error instanceof SignerNotFoundError) {\n throw new Error(`Signer not found. Please ensure the ${signerType} signer exists.`);\n }\n if (error instanceof SignerInactiveError) {\n throw new Error(`${signerType} signer is not active. Please activate the signer first.`);\n }\n if (error instanceof Error) {\n if (error.message.includes(\"Device key not found\") || error.name === \"DeviceKeyNotFoundError\") {\n throw new Error(\n `Device key not found. Please create the ${signerType} signer first using the Signers page. The device key is generated when you create the signer.`\n );\n }\n if (error.message.includes(\"Device key mismatch\") || error.name === \"DeviceKeyMismatchError\") {\n throw new Error(\n \"Device key mismatch. The stored device key doesn't match the server. You may need to create a new signer or update the device identity.\"\n );\n }\n }\n throw error;\n}\n\nexport function createMissingSignerInfoError(signer: unknown): Error {\n return new Error(`Signer type or ID is missing. Signer data: ${JSON.stringify(signer)}`);\n}\n\nexport function createUnsupportedSignerTypeError(signerType: string): Error {\n return new Error(`Unsupported signer type: ${signerType}`);\n}\n","import type { SignerData } from \"../signer-helpers\";\nimport { SIGNER_TYPES, isValidSignerType, type SignerType } from \"./constants\";\n\nexport function extractSignerInfo(signer: SignerData): { signerType: SignerType; signerId: string } {\n const signerType = (signer.type || signer.signerType) as SignerType;\n const signerId = signer.id || signer.signerId;\n if (!signerType || !signerId) {\n throw new Error(`Signer type or ID is missing. Signer data: ${JSON.stringify(signer)}`);\n }\n if (!isValidSignerType(signerType)) {\n throw new Error(`Unsupported signer type: ${signerType}`);\n }\n return { signerType, signerId };\n}\n\nexport function requiresDeviceKeyStorage(signerType: SignerType): boolean {\n return (\n signerType === SIGNER_TYPES.EMAIL ||\n signerType === SIGNER_TYPES.PHONE ||\n signerType === SIGNER_TYPES.EXTERNAL ||\n signerType === SIGNER_TYPES.API_KEY\n );\n}\n\nexport function isAuthenticationSigner(signerType: SignerType): boolean {\n return (\n signerType === SIGNER_TYPES.EMAIL ||\n signerType === SIGNER_TYPES.PHONE ||\n signerType === SIGNER_TYPES.PASSKEY\n );\n}\n\nexport function requiresActiveStatus(signerType: SignerType): boolean {\n return (\n signerType === SIGNER_TYPES.EMAIL ||\n signerType === SIGNER_TYPES.PHONE ||\n signerType === SIGNER_TYPES.EXTERNAL ||\n signerType === SIGNER_TYPES.API_KEY\n );\n}\n\nexport function validateSignerActive(signer: SignerData, signerType: SignerType): void {\n if (requiresActiveStatus(signerType) && !signer.isActive) {\n throw new Error(`${signerType} signer is not active. Please activate the signer first.`);\n }\n}\n","import { Transaction } from \"@solana/web3.js\";\nimport {\n signWithSigner,\n signWithEmailSigner,\n signWithPhoneSigner,\n signTransactionWithEmailSigner,\n signTransactionWithPhoneSigner,\n} from \"cilantro-sdk/helpers\";\nimport { submitTransaction } from \"cilantro-sdk/wallet\";\nimport type { WalletControllerSubmitTransactionResult } from \"cilantro-sdk/wallet\";\nimport type { SignerData } from \"../signer-helpers\";\nimport { signAndSendPasskeyTransaction } from \"../signer-creation\";\nimport { extractErrorMessage } from \"../error-utils\";\nimport { extractResponseData } from \"../types\";\nimport { handleDeviceKeyError } from \"./errors\";\n\n/** Connection-like interface for sign-and-send (passkey). Consumer provides from their Solana config. */\nexport interface SignAndSendConnection {\n getLatestBlockhash: (commitment?: string) => Promise<{ blockhash: string; lastValidBlockHeight: number }>;\n confirmTransaction: (opts: { signature: string; blockhash: string; lastValidBlockHeight: number }) => Promise<void>;\n}\nimport { extractSignerInfo, validateSignerActive } from \"./signer-types\";\nimport { getStorageOptions } from \"./storage\";\nimport { SIGNER_TYPES, type SignerType } from \"./constants\";\nimport { getSignerPublicKey } from \"./core\";\nimport { validateSignerInTransaction } from \"./validation\";\n\nfunction prepareTransactionForSigning(\n transaction: Transaction,\n signerPublicKey: import(\"@solana/web3.js\").PublicKey\n): void {\n const signerPubkeyStr = signerPublicKey.toString();\n const hasSignerInSignatures = transaction.signatures.some(\n (sig) => sig.publicKey.toString() === signerPubkeyStr\n );\n if (!hasSignerInSignatures) {\n transaction.signatures.push({\n publicKey: signerPublicKey,\n signature: null,\n });\n }\n if (transaction.feePayer) {\n const feePayerStr = transaction.feePayer.toString();\n const hasFeePayerInSignatures = transaction.signatures.some(\n (sig) => sig.publicKey.toString() === feePayerStr\n );\n if (!hasFeePayerInSignatures) {\n transaction.signatures.push({ publicKey: transaction.feePayer, signature: null });\n }\n }\n}\n\nasync function signTransactionWithEmailOrPhone(\n walletId: string,\n signerId: string,\n signerType: SignerType,\n unsignedTransactionBase64: string\n): Promise<string> {\n const storageOptions = getStorageOptions();\n if (signerType === SIGNER_TYPES.EMAIL) {\n return await signTransactionWithEmailSigner(\n walletId,\n signerId,\n unsignedTransactionBase64,\n storageOptions\n );\n }\n return await signTransactionWithPhoneSigner(\n walletId,\n signerId,\n unsignedTransactionBase64,\n storageOptions\n );\n}\n\n/** SDK submit transaction data (SubmitTransactionResponseDto.data). */\nexport type SubmitTransactionDataDto = WalletControllerSubmitTransactionResult[\"data\"];\n\nasync function submitSignedTransaction(\n walletId: string,\n signedTransactionBase64: string\n): Promise<{ signature: string; status: string; confirmationStatus: string }> {\n const submitResult: WalletControllerSubmitTransactionResult = await submitTransaction(walletId, {\n signedTransaction: signedTransactionBase64,\n });\n const resultData = extractResponseData<SubmitTransactionDataDto>(submitResult);\n if (!resultData?.signature) throw new Error(\"Server did not return a transaction signature\");\n const status = resultData.status ?? \"pending\";\n return {\n signature: resultData.signature,\n status,\n confirmationStatus: status,\n };\n}\n\nasync function handlePasskeyTransaction(\n walletId: string,\n signerId: string,\n transaction: Transaction,\n connection: SignAndSendConnection | null | undefined\n): Promise<{ signature: string; status: string; confirmationStatus: string }> {\n if (!connection) {\n throw new Error(\n \"Connection is required for passkey sign-and-send. Pass the connection from your Solana config.\"\n );\n }\n const { blockhash, lastValidBlockHeight } = await connection.getLatestBlockhash(\"confirmed\");\n const result = await signAndSendPasskeyTransaction(walletId, signerId, transaction, {\n useBrowserAutofill: false,\n });\n let status = \"confirmed\";\n try {\n await connection.confirmTransaction({\n signature: result.signature,\n blockhash,\n lastValidBlockHeight,\n });\n } catch (error) {\n const errorMsg = extractErrorMessage(error);\n if (\n errorMsg.includes(\"block height exceeded\") ||\n errorMsg.includes(\"expired\") ||\n errorMsg.includes(\"timeout\")\n ) {\n status = \"pending\";\n } else {\n throw new Error(`Transaction confirmation failed: ${errorMsg}. Signature: ${result.signature}`);\n }\n }\n return { signature: result.signature, status, confirmationStatus: status };\n}\n\nasync function handleEmailOrPhoneTransaction(\n walletId: string,\n signer: SignerData,\n signerType: SignerType,\n signerId: string,\n transaction: Transaction\n): Promise<{ signature: string; status: string; confirmationStatus: string }> {\n validateSignerActive(signer, signerType);\n const signerPublicKey = await getSignerPublicKey(walletId, signer, signerType, signerId);\n prepareTransactionForSigning(transaction, signerPublicKey);\n const unsignedTransactionBase64 = Buffer.from(\n transaction.serialize({ verifySignatures: false })\n ).toString(\"base64\");\n let signedTransactionBase64: string;\n try {\n signedTransactionBase64 = await signTransactionWithEmailOrPhone(\n walletId,\n signerId,\n signerType,\n unsignedTransactionBase64\n );\n } catch (error: unknown) {\n handleDeviceKeyError(error, signerType);\n throw error;\n }\n try {\n const validationResult = await validateSignerInTransaction(\n signedTransactionBase64,\n signerPublicKey\n );\n if (!validationResult.isValid) {\n console.error(\"Transaction validation failed:\", {\n errors: validationResult.errors,\n warnings: validationResult.warnings,\n });\n }\n } catch (validationError) {\n console.error(\"Validation error (non-fatal):\", extractErrorMessage(validationError));\n }\n return await submitSignedTransaction(walletId, signedTransactionBase64);\n}\n\nasync function handleExternalOrApiKeyTransaction(\n walletId: string,\n signer: SignerData,\n signerType: SignerType,\n signerId: string,\n transaction: Transaction\n): Promise<{ signature: string; status: string; confirmationStatus: string }> {\n validateSignerActive(signer, signerType);\n const messageBytes = transaction.serializeMessage();\n const storageOptions = getStorageOptions();\n const signatureBytes = await signWithSigner(\n walletId,\n signerId,\n signerType,\n messageBytes,\n storageOptions\n );\n const signerPublicKey = await getSignerPublicKey(walletId, signer, signerType, signerId);\n const signatureBuffer = Buffer.from(signatureBytes);\n transaction.addSignature(signerPublicKey, signatureBuffer);\n const signedTransactionBytes = transaction.serialize();\n const signedTransactionBase64 = Buffer.from(signedTransactionBytes).toString(\"base64\");\n return await submitSignedTransaction(walletId, signedTransactionBase64);\n}\n\nexport async function signTransactionWithSigner(\n walletId: string,\n signer: SignerData,\n transactionBuffer: Uint8Array\n): Promise<{ signature: string; signerType: string }> {\n const { signerType, signerId } = extractSignerInfo(signer);\n const storageOptions = getStorageOptions();\n\n if (signerType === SIGNER_TYPES.EMAIL) {\n validateSignerActive(signer, signerType);\n try {\n const signature = await signWithEmailSigner(walletId, signerId, transactionBuffer, storageOptions);\n return { signature: Buffer.from(signature).toString(\"hex\"), signerType: SIGNER_TYPES.EMAIL };\n } catch (error: unknown) {\n throw handleDeviceKeyError(error, SIGNER_TYPES.EMAIL);\n }\n }\n if (signerType === SIGNER_TYPES.PHONE) {\n validateSignerActive(signer, signerType);\n try {\n const signature = await signWithPhoneSigner(walletId, signerId, transactionBuffer, storageOptions);\n return { signature: Buffer.from(signature).toString(\"hex\"), signerType: SIGNER_TYPES.PHONE };\n } catch (error: unknown) {\n throw handleDeviceKeyError(error, SIGNER_TYPES.PHONE);\n }\n }\n if (signerType === SIGNER_TYPES.PASSKEY) {\n const { signWithPasskeySigner } = await import(\"cilantro-sdk/helpers\");\n const signature = await signWithPasskeySigner(walletId, signerId, transactionBuffer, {\n useBrowserAutofill: false,\n });\n return { signature: Buffer.from(signature).toString(\"hex\"), signerType: SIGNER_TYPES.PASSKEY };\n }\n if (signerType === SIGNER_TYPES.EXTERNAL || signerType === SIGNER_TYPES.API_KEY) {\n validateSignerActive(signer, signerType);\n const signature = await signWithSigner(\n walletId,\n signerId,\n signerType,\n transactionBuffer,\n storageOptions\n );\n return { signature: Buffer.from(signature).toString(\"hex\"), signerType };\n }\n throw new Error(`Unsupported signer type: ${signerType}`);\n}\n\n/** Result of sign-and-send; status is the SDK SubmitTransactionDataDto.status, confirmationStatus is the same for backward compat. */\nexport interface SignAndSendResult {\n signature: string;\n status: string;\n confirmationStatus: string;\n}\n\nexport async function signAndSendTransactionWithSigner(\n walletId: string,\n signer: SignerData,\n transaction: Transaction,\n connection?: SignAndSendConnection | null\n): Promise<SignAndSendResult> {\n const { signerType, signerId } = extractSignerInfo(signer);\n if (signerType === SIGNER_TYPES.PASSKEY) {\n return await handlePasskeyTransaction(walletId, signerId, transaction, connection);\n }\n if (signerType === SIGNER_TYPES.EMAIL || signerType === SIGNER_TYPES.PHONE) {\n return await handleEmailOrPhoneTransaction(walletId, signer, signerType, signerId, transaction);\n }\n if (signerType === SIGNER_TYPES.EXTERNAL || signerType === SIGNER_TYPES.API_KEY) {\n return await handleExternalOrApiKeyTransaction(walletId, signer, signerType, signerId, transaction);\n }\n throw new Error(`Unsupported signer type: ${signerType}`);\n}\n","import { PublicKey, Transaction } from \"@solana/web3.js\";\nimport type { SignerData } from \"../signer-helpers\";\nimport { extractErrorMessage } from \"../error-utils\";\nimport { getSignerPublicKey } from \"./core\";\nimport { extractSignerInfo } from \"./signer-types\";\n\nexport async function validateSignerInTransaction(\n signedTransactionBase64: string,\n expectedSignerPublicKey?: PublicKey | string\n): Promise<{\n isValid: boolean;\n transaction: Transaction;\n signers: Array<{\n publicKey: string;\n hasSignature: boolean;\n signatureLength: number;\n matchesExpected: boolean;\n }>;\n expectedSignerFound: boolean;\n allSignaturesValid: boolean;\n feePayer?: string;\n recentBlockhash?: string;\n errors: string[];\n warnings: string[];\n}> {\n const errors: string[] = [];\n const warnings: string[] = [];\n try {\n const transactionBuffer = Buffer.from(signedTransactionBase64, \"base64\");\n const transaction = Transaction.from(transactionBuffer);\n let allSignaturesValid = true;\n try {\n transaction.verifySignatures();\n } catch (error) {\n allSignaturesValid = false;\n errors.push(`Signature verification failed: ${extractErrorMessage(error)}`);\n }\n const signers = transaction.signatures.map((sig) => {\n const publicKeyStr = sig.publicKey.toString();\n const hasSignature = sig.signature !== null && sig.signature.length > 0;\n const signatureLength = sig.signature !== null ? sig.signature.length : 0;\n let matchesExpected = false;\n if (expectedSignerPublicKey) {\n const expectedPubkey =\n typeof expectedSignerPublicKey === \"string\"\n ? new PublicKey(expectedSignerPublicKey)\n : expectedSignerPublicKey;\n matchesExpected = sig.publicKey.equals(expectedPubkey);\n }\n if (!hasSignature) warnings.push(`Signer ${publicKeyStr} has no signature (unsigned)`);\n return { publicKey: publicKeyStr, hasSignature, signatureLength, matchesExpected };\n });\n let expectedSignerFound = false;\n if (expectedSignerPublicKey) {\n const expectedPubkey =\n typeof expectedSignerPublicKey === \"string\"\n ? new PublicKey(expectedSignerPublicKey)\n : expectedSignerPublicKey;\n expectedSignerFound = signers.some((s) => s.matchesExpected);\n if (!expectedSignerFound) {\n errors.push(`Expected signer ${expectedPubkey.toString()} not found in transaction signers`);\n }\n }\n if (expectedSignerFound && expectedSignerPublicKey) {\n const expectedSigner = signers.find((s) => s.matchesExpected);\n if (expectedSigner && !expectedSigner.hasSignature) {\n errors.push(\n `Expected signer ${\n typeof expectedSignerPublicKey === \"string\"\n ? expectedSignerPublicKey\n : expectedSignerPublicKey.toString()\n } is present but has no signature`\n );\n }\n }\n const isValid =\n allSignaturesValid && (expectedSignerPublicKey ? expectedSignerFound : true) && errors.length === 0;\n return {\n isValid,\n transaction,\n signers,\n expectedSignerFound,\n allSignaturesValid,\n feePayer: transaction.feePayer?.toString(),\n recentBlockhash: transaction.recentBlockhash ?? undefined,\n errors,\n warnings,\n };\n } catch (error) {\n errors.push(`Failed to deserialize transaction: ${extractErrorMessage(error)}`);\n throw new Error(\n `Transaction validation failed: ${errors.join(\"; \")}\\nOriginal error: ${extractErrorMessage(error)}`\n );\n }\n}\n\nexport async function validateSignerInTransactionWithSigner(\n walletId: string,\n signer: SignerData,\n signedTransactionBase64: string\n): Promise<\n Awaited<ReturnType<typeof validateSignerInTransaction>> & { expectedSignerPublicKey: string }\n> {\n const { signerType, signerId } = extractSignerInfo(signer);\n const expectedSignerPublicKey = await getSignerPublicKey(walletId, signer, signerType, signerId);\n const validationResult = await validateSignerInTransaction(\n signedTransactionBase64,\n expectedSignerPublicKey\n );\n return {\n ...validationResult,\n expectedSignerPublicKey: expectedSignerPublicKey.toString(),\n };\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport { findOne as findOneWallet } from \"cilantro-sdk/wallet\";\nimport type { WalletControllerFindOneResult } from \"cilantro-sdk/wallet\";\nimport { extractResponseData } from \"../types\";\n\n/** SDK wallet single response data (WalletSuccessResponseDto.data). */\nexport type WalletDataDtoFromFindOne = WalletControllerFindOneResult[\"data\"];\n\nexport async function getWalletData(walletId: string): Promise<{\n walletPublicKey: PublicKey;\n adminSignerPubkey: PublicKey;\n}> {\n const walletDataResponse: WalletControllerFindOneResult = await findOneWallet(walletId);\n const walletData = extractResponseData<WalletDataDtoFromFindOne>(walletDataResponse);\n if (!walletData) throw new Error(\"Wallet data is empty\");\n const address = String(walletData.walletAddress ?? \"\").trim();\n if (!address) throw new Error(\"No wallet address found (walletAddress is empty).\");\n const walletPublicKey = new PublicKey(address);\n const adminPubkey = String(walletData.adminSignerPubkey ?? \"\").trim();\n if (!adminPubkey) {\n throw new Error(\"adminSignerPubkey not found in wallet data.\");\n }\n const adminSignerPubkey = new PublicKey(adminPubkey);\n return { walletPublicKey, adminSignerPubkey };\n}\n"],"mappings":"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","names":["import_cilantro_sdk","cilantroLogin","createUser","findAllWallets","createWalletSDK","import_react","import_jsx_runtime","platformApiKey","apiUrl","import_helpers","import_react","import_react","import_helpers","import_wallet","import_helpers","import_wallet","createEmailSignerSDK","createPhoneSignerSDK","import_wallet","import_react","import_helpers","import_wallet","import_helpers","import_react","import_react","import_wallet","sendSOLApi","sendSPLApi","import_react","import_jsx_runtime","React","import_jsx_runtime","React","import_class_variance_authority","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","import_react","React","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_wallet","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","React","import_jsx_runtime","import_web3","import_helpers","import_helpers","import_helpers","import_helpers","import_wallet","import_web3","signWithPasskeySigner","import_web3","import_wallet","findOneWallet"]}
|