@volr/react 0.1.7 → 0.1.8
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/dist/index.cjs +3 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +3 -5
- package/dist/index.js.map +1 -1
- package/package.json +2 -3
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/context.tsx","../src/utils/errors.ts","../src/utils/ssr.ts","../../shared/src/constants/storage.ts","../src/headless/client.ts","../src/headless/auth-sync.ts","../src/config/backend.ts","../src/config/webauthn.ts","../src/adapters/passkey.ts","../src/headless/passkey-restore.ts","../src/react/Provider.tsx","../src/hooks/useVolr.ts","../src/utils/validation.ts","../src/hooks/usePrecheck.ts","../src/hooks/useInternalAuth.ts","../src/hooks/useRelay.ts","../src/utils/normalize.ts","../src/utils/call-builder.ts","../src/utils/rpc.ts","../src/utils/network.ts","../src/utils/tx-validation.ts","../src/wallet/normalize.ts","../src/wallet/preflight.ts","../src/wallet/signer.ts","../src/utils/defaults.ts","../src/wallet/auth.ts","../src/utils/tx-polling.ts","../src/wallet/sender.ts","../src/hooks/useVolrWallet.ts","../src/utils/axios.ts","../src/hooks/useVolrLogin.ts","../src/hooks/useVolrAuthCallback.ts","../src/hooks/useDepositListener.ts","../src/headless/passkey-enrollment.ts","../src/hooks/usePasskeyEnrollment.ts","../src/headless/mpc-transport.ts","../src/headless/wallet-provider.ts","../src/hooks/useMpcConnection.ts","../src/headless/blobs.ts"],"names":["createContext","VolrError","axios","config","createPasskeyProvider","useRef","useEffect","useMemo","useState","useCallback","error","jsx","useContext","signSession","getAuthNonce","signAuthorization","encodeFunctionData","validatePolicyId","ZERO_HASH","validateCalls","getAddress","selectSigner","createPublicClient","http","client","publicClient","calls","deriveWrapKey","createMasterKeyProvider","sealMasterSeed","uploadBlob","deriveEvmKey","createMpcProvider"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * React context for Volr\n */\n\nimport { createContext } from \"react\";\nimport type {\n PrecheckInput,\n PrecheckQuote,\n RelayInput,\n RelayResult,\n WalletProviderPort,\n} from \"@volr/sdk-core\";\nimport type { APIClient } from \"@/headless/client\";\nimport type { PrfInputDto } from \"@/types/api\";\n\n// Import provider types directly from core (will be available after build)\nexport type KeyStorageType = \"passkey\" | \"mpc\";\nexport type SignerType = \"passkey\" | \"external_wallet\" | \"mpc\";\n\n// Re-export WalletProviderPort for convenience\nexport type { WalletProviderPort };\n\n/**\n * ERC-20 token configuration\n */\nexport interface Erc20Token {\n address: `0x${string}`;\n symbol: string;\n decimals: number;\n iconUrl?: string;\n}\n\n/**\n * Deposit asset configuration (native or ERC-20)\n */\nexport interface DepositAsset {\n chainId: number;\n token: \"native\" | Erc20Token;\n}\n\n/**\n * Deposit/Topup configuration\n */\nexport interface DepositConfig {\n supportedAssets: DepositAsset[];\n pollIntervalMs?: number; // default: 6000\n}\n\n/**\n * User information\n */\nexport interface VolrUser {\n id?: string;\n email?: string;\n accountId?: string; // CAIP-10 format (e.g., eip155:1:0xAbC...)\n evmAddress?: `0x${string}`; // EVM address for convenience\n keyStorageType?: KeyStorageType;\n signerType?: SignerType; // How the user signs transactions\n walletConnector?: string; // EIP-6963 rdns (e.g., \"io.metamask\")\n lastWalletChainId?: number; // Last used chain ID\n // Passkey restoration fields (optional, only present for passkey users)\n blobUrl?: string;\n prfInput?: PrfInputDto;\n credentialId?: string;\n}\n\n/**\n * Volr configuration\n */\nexport type VolrConfig = {\n defaultChainId: number; // required\n projectApiKey: string;\n rpcOverrides?: Record<string, string>; // optional\n autoRecoverOnLogin?: boolean; // default true\n providerPolicy?: {\n enforceOnFirstLogin?: boolean; // default true\n };\n /**\n * Deposit/Topup configuration for multi-chain, multi-token support\n */\n deposit?: DepositConfig;\n};\n\n/**\n * Public context value\n */\nexport type VolrContextValue = {\n config: VolrConfig;\n user: VolrUser | null;\n provider: WalletProviderPort | null;\n setProvider: (provider: WalletProviderPort) => Promise<void>;\n setUser: (user: VolrUser | null) => void;\n chainId: number;\n precheck: (input: PrecheckInput) => Promise<PrecheckQuote>;\n relay: (\n input: RelayInput,\n opts?: { idempotencyKey?: string }\n ) => Promise<RelayResult>;\n logout: () => Promise<void>;\n isLoading: boolean;\n error: Error | null;\n};\n\n/**\n * Internal auth context (for advanced use)\n */\nexport type InternalAuthContextType = {\n // Internal session state\n session: {\n accessToken: string | null;\n refreshToken: string | null; // opaque, cookie-based\n };\n // Internal methods\n refreshAccessToken: () => Promise<void>;\n setAccessToken: (token: string) => void;\n // APIClient instance for backend communication\n client: APIClient;\n};\n\n/**\n * Public Volr context\n */\nexport const VolrContext = createContext<VolrContextValue | null>(null);\n\n/**\n * Internal auth context (for advanced use)\n */\nexport const InternalAuthContext =\n createContext<InternalAuthContextType | null>(null);\n","/**\n * Error mapping utilities\n * Maps backend envelope errors to SDK errors\n */\n\nimport { VolrError } from '@volr/sdk-core';\n\n/**\n * Backend error envelope\n */\nexport type BackendError = {\n ok: false;\n error: {\n code: string;\n message: string;\n };\n};\n\n/**\n * Backend response envelope\n */\nexport type BackendResponse<T> =\n | { ok: true; data: T }\n | BackendError;\n\n/**\n * Error code constants\n */\nexport const ERROR_CODES = {\n COMMON_VALIDATION: 'COMMON_VALIDATION',\n COMMON_INTERNAL_ERROR: 'COMMON_INTERNAL_ERROR',\n AUTH_NOT_FOUND: 'AUTH_NOT_FOUND',\n AUTH_INVALID_TOKEN: 'AUTH_INVALID_TOKEN',\n NET_NOT_FOUND: 'NET_NOT_FOUND',\n WALLET_INVALID_EXPIRY: 'WALLET_INVALID_EXPIRY',\n WALLET_INVALID_NONCE: 'WALLET_INVALID_NONCE',\n WALLET_INVALID_POLICY_ID: 'WALLET_INVALID_POLICY_ID',\n WALLET_EMPTY_CALLS: 'WALLET_EMPTY_CALLS',\n WALLET_INVALID_CALL: 'WALLET_INVALID_CALL',\n WALLET_GAS_LIMIT_EXCEEDED: 'WALLET_GAS_LIMIT_EXCEEDED',\n WALLET_MAX_CALLS_EXCEEDED: 'WALLET_MAX_CALLS_EXCEEDED',\n WALLET_CALL_DATA_TOO_LARGE: 'WALLET_CALL_DATA_TOO_LARGE',\n WALLET_CALL_GAS_LIMIT_EXCEEDED: 'WALLET_CALL_GAS_LIMIT_EXCEEDED',\n WALLET_INVALID_VALUE: 'WALLET_INVALID_VALUE',\n WALLET_INVALID_AUTHORIZATION_LIST: 'WALLET_INVALID_AUTHORIZATION_LIST',\n WALLET_INVALID_INVOKER_ADDRESS: 'WALLET_INVALID_INVOKER_ADDRESS',\n WALLET_AUTH_CHAIN_ID_ZERO_NOT_ALLOWED: 'WALLET_AUTH_CHAIN_ID_ZERO_NOT_ALLOWED',\n WALLET_CHAIN_ID_MISMATCH: 'WALLET_CHAIN_ID_MISMATCH',\n WALLET_SIGNATURE_INVALID: 'WALLET_SIGNATURE_INVALID',\n WALLET_IDEMPOTENT_MISMATCH: 'WALLET_IDEMPOTENT_MISMATCH',\n WALLET_GAS_PRICE_CAP_EXCEEDED: 'WALLET_GAS_PRICE_CAP_EXCEEDED',\n} as const;\n\n/**\n * Map backend error to SDK error\n */\nexport function mapBackendError(error: BackendError['error']): VolrError {\n return new VolrError(error.code, error.message);\n}\n\n/**\n * Check if response is an error\n */\nexport function isErrorResponse<T>(\n response: BackendResponse<T>\n): response is BackendError {\n return !response.ok;\n}\n\n/**\n * Extract data from response or throw error\n */\nexport function unwrapResponse<T>(response: BackendResponse<T>): T {\n if (isErrorResponse(response)) {\n throw mapBackendError(response.error);\n }\n return response.data;\n}\n\n\n\n\n\n\n\n","/**\n * SSR-safe utilities\n */\n\n/**\n * Check if code is running in browser\n */\nexport function isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * Safe localStorage access (SSR-safe)\n */\nexport const safeStorage = {\n getItem(key: string): string | null {\n if (!isBrowser()) {\n return null;\n }\n try {\n const value = localStorage.getItem(key);\n // Filter out invalid JSON strings\n if (!value || value === 'undefined' || value === 'null') {\n return null;\n }\n return value;\n } catch {\n return null;\n }\n },\n\n setItem(key: string, value: string): void {\n if (!isBrowser()) {\n return;\n }\n try {\n localStorage.setItem(key, value);\n } catch {\n // Ignore errors (quota exceeded, etc.)\n }\n },\n\n removeItem(key: string): void {\n if (!isBrowser()) {\n return;\n }\n try {\n localStorage.removeItem(key);\n } catch {\n // Ignore errors\n }\n },\n\n clear(): void {\n if (!isBrowser()) {\n return;\n }\n try {\n localStorage.clear();\n } catch {\n // Ignore errors\n }\n },\n};\n\n","export const STORAGE_KEYS = {\n accessToken: 'volr:accessToken',\n user: 'volr:user',\n provider: 'volr:provider',\n credentialId: 'volr:credentialId',\n selectedProject: 'volr:selectedProject',\n lastEmail: 'volr:lastEmail',\n} as const;\n\nexport const STORAGE_CHANNELS = {\n session: 'volr:session',\n} as const;\n\n","/**\n * API client with automatic token refresh\n */\n\nimport type { BackendResponse } from '@/utils/errors';\nimport { unwrapResponse, isErrorResponse } from '@/utils/errors';\nimport { safeStorage } from '@/utils/ssr';\nimport axios, { AxiosInstance, AxiosError, InternalAxiosRequestConfig } from 'axios';\nimport { STORAGE_KEYS } from '@volr/shared/constants/storage';\n\n/**\n * API client configuration\n */\nexport type APIClientConfig = {\n baseUrl: string;\n apiKey?: string; // Optional, can be set later via setApiKey\n};\n\n/**\n * API client\n */\nexport class APIClient {\n private refreshPromise: Promise<void> | null = null;\n private accessToken: string | null = null;\n private apiKey: string | null = null;\n private api: AxiosInstance;\n\n constructor(config: APIClientConfig) {\n this.apiKey = config.apiKey || null;\n // Load access token from storage\n this.accessToken = safeStorage.getItem(STORAGE_KEYS.accessToken);\n\n // Create axios instance\n this.api = axios.create({\n baseURL: config.baseUrl.replace(/\\/+$/, ''),\n withCredentials: true,\n headers: {\n 'Content-Type': 'application/json',\n },\n transformRequest: [\n (data) => {\n // Transform BigInt to string before JSON serialization\n if (data && typeof data === 'object') {\n return JSON.stringify(data, (_, value) =>\n typeof value === 'bigint' ? value.toString() : value\n );\n }\n return data;\n },\n ],\n });\n\n // Request interceptor: Add API key and access token\n this.api.interceptors.request.use((config) => {\n // Ensure headers object exists\n if (!config.headers) {\n config.headers = {} as any;\n }\n \n // Set X-API-Key header (required for all authenticated requests)\n if (this.apiKey) {\n config.headers['X-API-Key'] = this.apiKey;\n } else {\n console.warn('[APIClient] X-API-Key not set. Some endpoints may fail.');\n }\n \n // Set Authorization header (for authenticated requests)\n if (this.accessToken) {\n config.headers['Authorization'] = `Bearer ${this.accessToken}`;\n }\n \n return config;\n });\n\n // Response interceptor: Handle 401 and refresh token\n this.api.interceptors.response.use(\n (response) => response,\n async (error: AxiosError<BackendResponse<any>>) => {\n const originalRequest = error.config as InternalAxiosRequestConfig & { _retry?: boolean };\n\n // Handle 401: try refresh once\n if (error.response?.status === 401 && !originalRequest._retry) {\n originalRequest._retry = true;\n try {\n await this.refreshAccessToken();\n if (this.accessToken) {\n originalRequest.headers['Authorization'] = `Bearer ${this.accessToken}`;\n }\n return this.api(originalRequest);\n } catch (refreshError) {\n return Promise.reject(refreshError);\n }\n }\n\n return Promise.reject(error);\n }\n );\n }\n\n /**\n * Set API key\n */\n setApiKey(apiKey: string | null): void {\n this.apiKey = apiKey;\n }\n\n /**\n * Get API key\n */\n getApiKey(): string | null {\n return this.apiKey;\n }\n\n /**\n * Set access token\n */\n setAccessToken(token: string | null): void {\n this.accessToken = token;\n if (token) {\n safeStorage.setItem(STORAGE_KEYS.accessToken, token);\n } else {\n safeStorage.removeItem(STORAGE_KEYS.accessToken);\n }\n }\n\n /**\n * Get access token\n */\n getAccessToken(): string | null {\n return this.accessToken;\n }\n\n /**\n * Refresh access token (single-flight)\n */\n private async refreshAccessToken(): Promise<void> {\n // Single-flight: if already refreshing, wait for that promise\n if (this.refreshPromise) {\n return this.refreshPromise;\n }\n\n this.refreshPromise = (async () => {\n try {\n // Use this.api instead of direct axios.post to ensure interceptors (X-API-Key header) are applied\n const response = await this.api.post<BackendResponse<{ accessToken: string; user?: { id: string; email: string } }>>(\n '/auth/refresh',\n {}\n );\n\n const data = response.data;\n\n if (isErrorResponse(data)) {\n // Refresh failed, clear token\n this.setAccessToken(null);\n safeStorage.removeItem(STORAGE_KEYS.user);\n throw new Error(data.error.message);\n }\n\n this.setAccessToken(data.data.accessToken);\n \n // Update user if provided\n if (data.data.user) {\n safeStorage.setItem(STORAGE_KEYS.user, JSON.stringify(data.data.user));\n }\n } finally {\n this.refreshPromise = null;\n }\n })();\n\n return this.refreshPromise;\n }\n\n /**\n * Make API request with automatic retry on 401\n */\n async request<T>(\n endpoint: string,\n options: RequestInit = {},\n idempotencyKey?: string\n ): Promise<T> {\n // Normalize endpoint: ensure it starts with /\n const normalizedEndpoint = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\n \n const config: any = {\n method: options.method || 'GET',\n url: normalizedEndpoint,\n };\n\n // Add body if present\n if (options.body) {\n config.data = typeof options.body === 'string' ? JSON.parse(options.body) : options.body;\n }\n\n // Add idempotency key if present\n if (idempotencyKey) {\n config.headers = {\n ...config.headers,\n 'Idempotency-Key': idempotencyKey,\n };\n }\n\n const response = await this.api.request<BackendResponse<T>>(config);\n return unwrapResponse(response.data);\n }\n\n /**\n * POST request\n */\n async post<T>(\n endpoint: string,\n body: any,\n idempotencyKey?: string\n ): Promise<T> {\n const normalizedEndpoint = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\n const config: any = {\n method: 'POST',\n url: normalizedEndpoint,\n data: body,\n };\n\n if (idempotencyKey) {\n config.headers = {\n 'Idempotency-Key': idempotencyKey,\n };\n }\n\n const response = await this.api.request<BackendResponse<T>>(config);\n return unwrapResponse(response.data);\n }\n\n /**\n * POST request that returns raw binary (ArrayBuffer)\n * - Uses axios instance with interceptors (auto 401 refresh)\n * - Applies X-API-Key and Authorization automatically\n */\n async postBinary(endpoint: string, body: any): Promise<ArrayBuffer> {\n const normalizedEndpoint = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\n \n // Ensure API key is set (required for authenticated endpoints)\n if (!this.apiKey) {\n throw new Error(\n 'API key not configured. Please ensure VolrProvider is initialized with projectApiKey in config.'\n );\n }\n \n const response = await this.api.request<ArrayBuffer>({\n method: 'POST',\n url: normalizedEndpoint,\n data: body,\n responseType: 'arraybuffer',\n headers: {\n 'X-API-Key': this.apiKey, // Explicitly set API key header\n ...(this.accessToken && { Authorization: `Bearer ${this.accessToken}` }),\n },\n });\n return response.data;\n }\n\n /**\n * GET request\n */\n async get<T>(endpoint: string): Promise<T> {\n const normalizedEndpoint = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\n const response = await this.api.get<BackendResponse<T>>(normalizedEndpoint);\n return unwrapResponse(response.data);\n }\n}\n\n","/**\n * Session synchronization across tabs using BroadcastChannel and localStorage\n */\n\nimport { safeStorage } from '@/utils/ssr';\nimport type { SessionEvent } from '@/headless/types';\nimport { STORAGE_CHANNELS, STORAGE_KEYS } from '@volr/shared/constants/storage';\n\n/**\n * Session sync manager\n */\nexport class SessionSync {\n private channel: BroadcastChannel | null = null;\n private listeners: Set<(event: SessionEvent) => void> = new Set();\n\n constructor() {\n if (typeof window !== 'undefined' && 'BroadcastChannel' in window) {\n this.channel = new BroadcastChannel(STORAGE_CHANNELS.session);\n this.channel.onmessage = (e: MessageEvent<SessionEvent>) => {\n this.handleChannelMessage(e.data);\n };\n }\n\n // Listen to localStorage changes (for same-origin tabs)\n if (typeof window !== 'undefined') {\n window.addEventListener('storage', (e) => {\n if (e.key === STORAGE_KEYS.accessToken || e.key === STORAGE_KEYS.user) {\n this.notifyListeners({\n type: 'REFRESH',\n payload: {\n accessToken: safeStorage.getItem(STORAGE_KEYS.accessToken) || '',\n },\n });\n }\n });\n }\n }\n\n /**\n * Subscribe to session events\n */\n subscribe(listener: (event: SessionEvent) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n /**\n * Broadcast session event to other tabs\n */\n broadcast(event: SessionEvent): void {\n if (this.channel) {\n this.channel.postMessage(event);\n }\n }\n\n /**\n * Handle channel message\n */\n private handleChannelMessage(event: SessionEvent): void {\n this.notifyListeners(event);\n }\n\n /**\n * Notify all listeners\n */\n private notifyListeners(event: SessionEvent): void {\n for (const listener of this.listeners) {\n try {\n listener(event);\n } catch (error) {\n console.error('SessionSync listener error:', error);\n }\n }\n }\n\n /**\n * Cleanup\n */\n destroy(): void {\n if (this.channel) {\n this.channel.close();\n this.channel = null;\n }\n this.listeners.clear();\n }\n}\n\n","/**\n * Backend API base URL configuration for Volr React SDK\n *\n * 일반 SDK 사용자는 별도 설정 없이 항상 프로덕션 SaaS 엔드포인트를 사용합니다.\n * (https://api.volr.io)\n *\n * 고급/내부 사용 시에는 VolrConfig 타입에 노출되지 않은 `apiBaseUrl` 필드를\n * 런타임에서 주입하여 오버라이드할 수 있습니다.\n */\n\nimport type { VolrConfig } from \"@/react/context\";\n\n/**\n * Public SaaS 기본 API 엔드포인트\n */\nexport const DEFAULT_API_BASE_URL = \"https://api.volr.io\";\n\n/**\n * VolrConfig로부터 실제로 사용할 API base URL을 해석합니다.\n *\n * - 일반 유저: 항상 DEFAULT_API_BASE_URL 을 사용\n * - 고급/내부: `config` 객체에 `apiBaseUrl` 필드를 (any 캐스팅 등으로)\n * 주입하면 해당 값을 우선 사용\n */\nexport function resolveApiBaseUrl(config: VolrConfig): string {\n const anyConfig = config as any;\n // 1순위: 내부 개발용 오버라이드 (__devApiBaseUrl)\n const devOverride = anyConfig.__devApiBaseUrl;\n if (devOverride && typeof devOverride === \"string\") {\n return devOverride.replace(/\\/+$/, \"\");\n }\n\n // 2순위: 고급/온프렘 시나리오용 숨겨진 apiBaseUrl\n const override = anyConfig.apiBaseUrl;\n if (override && typeof override === \"string\") {\n return override.replace(/\\/+$/, \"\");\n }\n\n // 기본: 퍼블릭 SaaS 프로덕션 엔드포인트\n return DEFAULT_API_BASE_URL;\n}\n\n\n\n\n\n\n","/**\n * WebAuthn configuration constants\n * Shared between passkey enrollment and authentication\n */\n\n/**\n * Authenticator selection criteria for passkey creation\n * - authenticatorAttachment: 'platform' - prioritize built-in authenticators (Touch ID, Face ID, Windows Hello)\n * - userVerification: 'required' - always require user gesture (biometric/PIN)\n * - residentKey: 'required' - always create discoverable credentials (stored in iCloud/platform)\n * \n * Note: 'required' ensures passkeys are always saved to iCloud Keychain/Windows Hello/etc.\n * This is necessary for passkeys to be synced across devices and properly stored.\n */\nexport const AUTHENTICATOR_SELECTION: AuthenticatorSelectionCriteria = {\n authenticatorAttachment: 'platform',\n userVerification: 'required',\n residentKey: 'required',\n};\n\n/**\n * Authenticator transports for passkey authentication\n * - 'internal': Platform authenticator (Touch ID, Face ID, Windows Hello) - ONLY option\n * \n * Note: We only use 'internal' to force platform authenticators and prevent QR code fallback.\n * This ensures consistent UX between enrollment and authentication.\n */\nexport const AUTHENTICATOR_TRANSPORTS: AuthenticatorTransport[] = ['internal'];\n\n/**\n * Credential mediation for passkey authentication\n * - 'required': Force immediate user prompt (no silent authentication)\n * - This ensures consistent behavior with enrollment and prevents unexpected QR code prompts\n */\nexport const CREDENTIAL_MEDIATION: CredentialMediationRequirement = 'required';\n\n/**\n * User verification requirement for passkey authentication\n * - 'required': Always require user gesture (biometric/PIN)\n * - Consistent with enrollment settings\n */\nexport const USER_VERIFICATION: UserVerificationRequirement = 'required';\n\n/**\n * Timeout for WebAuthn operations (in milliseconds)\n * - 60 seconds should be enough for user to complete authentication\n */\nexport const WEBAUTHN_TIMEOUT = 60000;\n\n/**\n * Public key credential parameters for passkey creation\n * - ES256 (P-256) algorithm\n */\nexport const PUBKEY_CRED_PARAMS: PublicKeyCredentialParameters[] = [\n {\n type: 'public-key',\n alg: -7, // ES256 (P-256)\n },\n];\n\n/**\n * Attestation conveyance preference\n * - 'direct': Request attestation from authenticator\n */\nexport const ATTESTATION: AttestationConveyancePreference = 'direct';\n\n","/**\n * Passkey adapter for WebAuthn\n * Implements PasskeyProviderPort interface\n */\n\nimport type { PasskeyProviderPort } from \"@volr/sdk-core\";\nimport { CREDENTIAL_MEDIATION, USER_VERIFICATION } from \"@/config/webauthn\";\n\n/**\n * Passkey adapter options\n */\nexport type PasskeyAdapterOptions = {\n rpId?: string; // Relying Party ID (default: window.location.hostname)\n rpName?: string; // Relying Party Name\n userDisplayName?: string;\n userHandle?: Uint8Array; // User handle (optional)\n};\n\n/**\n * Create passkey adapter\n */\nexport function createPasskeyAdapter(\n options: PasskeyAdapterOptions = {}\n): PasskeyProviderPort {\n const rpId =\n options.rpId ||\n (typeof window !== \"undefined\" ? window.location.hostname : \"localhost\");\n\n return {\n async getPublicKey() {\n // Get existing credential or create new one\n const credential = await navigator.credentials.get({\n publicKey: {\n challenge: new Uint8Array(32), // Dummy challenge for getting public key\n allowCredentials: [], // Empty = any credential\n userVerification: \"required\",\n },\n });\n\n if (!credential || !(\"response\" in credential)) {\n throw new Error(\"Failed to get passkey credential\");\n }\n\n // Note: getPublicKey() is not available in standard WebAuthn API\n // For MVP, we'll extract public key from credential.id or use a workaround\n // This is a placeholder - actual implementation would need credential creation response\n throw new Error(\n \"getPublicKey not implemented - use credential creation response\"\n );\n },\n\n async signP256(msgHash32: Uint8Array) {\n if (msgHash32.length !== 32) {\n throw new Error(\"Message hash must be 32 bytes\");\n }\n\n // Get credential\n const credential = await navigator.credentials.get({\n publicKey: {\n challenge: msgHash32 as BufferSource,\n allowCredentials: [], // Empty = any credential\n userVerification: \"required\",\n },\n });\n\n if (!credential || !(\"response\" in credential)) {\n throw new Error(\"Failed to get passkey credential for signing\");\n }\n\n const response = credential.response as AuthenticatorAssertionResponse;\n const signature = response.signature;\n\n // Parse signature (DER format)\n // Convert DER signature to r and s (32 bytes each)\n // DER format: 0x30 || length || 0x02 || rLength || r || 0x02 || sLength || s\n const derSignature = new Uint8Array(signature);\n\n if (derSignature[0] !== 0x30) {\n throw new Error(\"Invalid DER signature format\");\n }\n\n // Parse r\n let offset = 2; // Skip 0x30 and length\n if (derSignature[offset] !== 0x02) {\n throw new Error(\"Invalid DER signature: expected r marker\");\n }\n offset++;\n const rLength = derSignature[offset++];\n const rBytes = derSignature.slice(offset, offset + rLength);\n offset += rLength;\n\n // Parse s\n if (derSignature[offset] !== 0x02) {\n throw new Error(\"Invalid DER signature: expected s marker\");\n }\n offset++;\n const sLength = derSignature[offset++];\n const sBytes = derSignature.slice(offset, offset + sLength);\n\n // Pad to 32 bytes if needed\n const r = new Uint8Array(32);\n const s = new Uint8Array(32);\n\n if (rBytes.length > 32 || sBytes.length > 32) {\n throw new Error(\"Signature r or s exceeds 32 bytes\");\n }\n\n r.set(rBytes, 32 - rBytes.length);\n s.set(sBytes, 32 - sBytes.length);\n\n return { r, s };\n },\n\n async authenticate(prfInput: { salt: Uint8Array; credentialId?: string }) {\n // credentialId is required for non-discoverable credentials\n if (!prfInput.credentialId) {\n throw new Error(\n \"[PasskeyAdapter] credentialId is required for authentication. \" +\n \"This usually means the passkey was not properly registered or user data is incomplete. \" +\n \"Please re-enroll your passkey.\"\n );\n }\n\n // Build allowCredentials with credentialId\n // Convert hex string to Uint8Array (credentialId is stored as hex during enrollment)\n //\n // 등록 시: credential.rawId (ArrayBuffer) → hex string\n // Array.from(new Uint8Array(credential.rawId))\n // .map((b) => b.toString(16).padStart(2, '0'))\n // .join('')\n //\n // 인증 시: hex string → Uint8Array (역변환)\n // hexString.match(/.{1,2}/g)!.map((byte) => parseInt(byte, 16))\n\n // Remove 0x prefix if present\n const hexString = prfInput.credentialId.startsWith(\"0x\")\n ? prfInput.credentialId.slice(2)\n : prfInput.credentialId;\n\n // Validate hex string format\n if (!/^[0-9a-fA-F]+$/.test(hexString)) {\n console.error(\n \"[PasskeyAdapter] Invalid credentialId format (not hex):\",\n prfInput.credentialId\n );\n throw new Error(\n `[PasskeyAdapter] Invalid credentialId format. Expected hex string, got: ${prfInput.credentialId}`\n );\n }\n\n // Ensure even length (pad with leading zero if odd)\n // hex string은 항상 짝수 길이여야 함 (각 바이트는 2자리 hex)\n const normalizedHex =\n hexString.length % 2 === 0 ? hexString : \"0\" + hexString;\n\n // Convert hex string to Uint8Array\n // 주의: match()가 null을 반환할 수 있으므로 체크 필요\n const hexPairs = normalizedHex.match(/.{1,2}/g);\n if (!hexPairs) {\n throw new Error(\n `[PasskeyAdapter] Failed to parse hex string: ${normalizedHex}`\n );\n }\n\n const credIdBytes = new Uint8Array(\n hexPairs.map((byte) => parseInt(byte, 16))\n );\n\n // 변환 검증: hex string을 다시 변환해서 원본과 일치하는지 확인\n const reconvertedHex = Array.from(credIdBytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n\n if (reconvertedHex.toLowerCase() !== normalizedHex.toLowerCase()) {\n throw new Error(\n `[PasskeyAdapter] credentialId conversion failed. Original: ${normalizedHex}, Reconverted: ${reconvertedHex}`\n );\n }\n\n const allowCredentials = [\n {\n id: credIdBytes,\n type: \"public-key\" as const,\n },\n ];\n\n // Trigger WebAuthn with PRF extension\n // Use same configuration as enrollment for consistency\n let credential: PublicKeyCredential | null = null;\n try {\n credential = (await navigator.credentials.get({\n publicKey: {\n challenge: crypto.getRandomValues(new Uint8Array(32)),\n rpId,\n allowCredentials,\n userVerification: USER_VERIFICATION, // Shared constant\n extensions: {\n prf: {\n eval: {\n first: prfInput.salt.buffer as ArrayBuffer,\n },\n },\n },\n },\n mediation: CREDENTIAL_MEDIATION, // Use shared constant\n })) as PublicKeyCredential | null;\n } catch (error: any) {\n console.error(\"[PasskeyAdapter] WebAuthn get() failed:\", error);\n console.error(\"[PasskeyAdapter] Error name:\", error?.name);\n console.error(\"[PasskeyAdapter] Error message:\", error?.message);\n\n // Provide more specific error messages\n if (error?.name === \"NotAllowedError\") {\n throw new Error(\n \"[PasskeyAdapter] User cancelled the passkey prompt or authentication was denied. \" +\n \"Please try again and complete the authentication.\"\n );\n } else if (\n error?.name === \"NotFoundError\" ||\n error?.name === \"InvalidStateError\"\n ) {\n throw new Error(\n \"[PasskeyAdapter] No passkey found matching the provided credentialId. \" +\n \"This may happen if the passkey was deleted or the credentialId is incorrect. \" +\n \"Please re-enroll your passkey.\"\n );\n } else if (error?.name === \"NotSupportedError\") {\n throw new Error(\n \"[PasskeyAdapter] WebAuthn PRF extension is not supported by this browser or device. \" +\n \"Please use a browser that supports WebAuthn PRF extension (Chrome 108+, Edge 108+, Safari 16.4+).\"\n );\n }\n\n throw new Error(\n `[PasskeyAdapter] WebAuthn authentication failed: ${\n error?.message || \"Unknown error\"\n }`\n );\n }\n\n if (!credential || !credential.response) {\n console.error(\n \"[PasskeyAdapter] credential is null or missing response\"\n );\n throw new Error(\n \"[PasskeyAdapter] Failed to get passkey credential for PRF. \" +\n \"The passkey prompt may have been cancelled or no matching credential was found.\"\n );\n }\n\n // Extract PRF output from extension results\n const extensionResults = credential.getClientExtensionResults();\n\n if (\n !extensionResults.prf ||\n !extensionResults.prf.results ||\n !extensionResults.prf.results.first\n ) {\n throw new Error(\n \"[PasskeyAdapter] PRF extension not supported or PRF output missing\"\n );\n }\n\n const prfOutputBuffer = extensionResults.prf.results.first as ArrayBuffer;\n const prfOutput = new Uint8Array(prfOutputBuffer);\n\n // Convert credential.rawId (ArrayBuffer) to base64url string\n const credentialIdBytes = new Uint8Array(credential.rawId);\n const credentialIdBase64 = btoa(String.fromCharCode(...credentialIdBytes))\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=/g, \"\");\n\n console.log(\"[PasskeyAdapter] WebAuthn prompt completed successfully\");\n\n return {\n prfOutput,\n credentialId: credentialIdBase64,\n };\n },\n };\n}\n","/**\n * Passkey restoration (headless)\n * Restore passkey provider from stored credential and encrypted blob\n */\n\nimport type { APIClient } from '@/headless/client';\nimport type { PrfInput, WalletProviderPort } from '@volr/sdk-core';\nimport { createPasskeyProvider } from '@volr/sdk-core';\nimport { createPasskeyAdapter } from '@/adapters/passkey';\nimport { safeStorage } from '@/utils/ssr';\nimport { STORAGE_KEYS } from '@volr/shared/constants/storage';\n\nexport interface RestorePasskeyParams {\n /** APIClient instance for backend communication */\n client: APIClient;\n /** User ID */\n userId: string;\n /** Blob URL (S3 key) */\n blobUrl: string;\n /** PRF input */\n prfInput: PrfInput;\n /** Credential ID (optional, will try to get from localStorage) */\n credentialId?: string;\n}\n\nexport interface RestorePasskeyResult {\n /** Restored provider */\n provider: WalletProviderPort;\n}\n\n/**\n * Restore passkey provider from stored credential and encrypted blob\n */\nexport async function restorePasskey(\n params: RestorePasskeyParams\n): Promise<RestorePasskeyResult> {\n const {\n client,\n userId,\n blobUrl,\n prfInput,\n credentialId: providedCredentialId,\n } = params;\n\n // Get credentialId: prioritize provided > prfInput > localStorage\n const credentialId =\n providedCredentialId || \n prfInput.credentialId || \n safeStorage.getItem(STORAGE_KEYS.credentialId);\n \n if (!credentialId) {\n throw new Error(\n 'Credential ID not found. Please provide credentialId in params, prfInput, or ensure it is stored in localStorage. ' +\n 'If you recently enrolled a passkey, try refreshing the page or re-enrolling.'\n );\n }\n\n console.log('[restorePasskey] Using credentialId:', credentialId ? 'present' : 'MISSING');\n console.log('[restorePasskey] credentialId source:', \n providedCredentialId ? 'params' : \n prfInput.credentialId ? 'prfInput' : \n 'localStorage'\n );\n console.log('[restorePasskey] prfInput:', prfInput);\n\n // Step 1: Ensure access token is fresh\n console.log('[restorePasskey] Step 1: Ensuring access token is fresh...');\n const currentToken = client.getAccessToken();\n if (!currentToken) {\n console.log('[restorePasskey] No access token found, calling /auth/refresh...');\n try {\n await client.post('/auth/refresh', {});\n console.log('[restorePasskey] Access token refreshed successfully');\n } catch (error) {\n console.error('[restorePasskey] Failed to refresh access token:', error);\n throw new Error('Failed to refresh access token. Please log in again.');\n }\n }\n\n // Step 2: Download blob via backend proxy (to avoid CORS issues)\n console.log('[restorePasskey] Step 2: Downloading blob via backend proxy for blobUrl:', blobUrl);\n \n // Ensure API key is set (required for /blob/download endpoint)\n const apiKey = client.getApiKey();\n if (!apiKey) {\n console.error('[restorePasskey] API key not set in client. This is required for blob download.');\n throw new Error(\n 'API key not configured. Please ensure VolrProvider is initialized with projectApiKey in config.'\n );\n }\n console.log('[restorePasskey] API key is set:', apiKey ? 'present' : 'MISSING');\n \n // Use APIClient (axios) so that:\n // - X-API-Key and Authorization headers are applied automatically\n // - 401 is handled via interceptor (refresh, then retry)\n const arrayBuffer = await client.postBinary('/blob/download', { key: blobUrl });\n const blobBytes = new Uint8Array(arrayBuffer);\n\n // Step 3: Parse blob (cipher + nonce)\n // Blob format: cipher (first N bytes) + nonce (last 12 bytes)\n const nonceLength = 12;\n const cipherLength = blobBytes.length - nonceLength;\n\n if (cipherLength <= 0) {\n throw new Error('Invalid blob format: blob too small');\n }\n\n const cipher = blobBytes.slice(0, cipherLength);\n const nonce = blobBytes.slice(cipherLength);\n\n // Step 4: Build AAD (same format as enrollment)\n const keyStorageType = 'passkey';\n const version = 'v1';\n const aadBytes = new TextEncoder().encode(\n `volr/master-seed/v1|${userId}|${keyStorageType}|${version}`\n );\n\n // Step 5: Create passkey adapter\n const passkeyAdapter = createPasskeyAdapter({\n rpId:\n typeof window !== 'undefined' ? window.location.hostname : 'localhost',\n rpName: 'Volr',\n });\n\n // Step 6: Create passkey provider\n // Ensure prfInput includes credentialId for authentication\n const provider = createPasskeyProvider(passkeyAdapter, {\n prfInput: {\n ...prfInput,\n credentialId, // Add credentialId to prfInput\n },\n encryptedBlob: {\n cipher,\n nonce,\n },\n aad: aadBytes,\n });\n\n console.log('[restorePasskey] Provider created with credentialId:', credentialId);\n\n return {\n provider,\n };\n}\n\n","/**\n * VolrProvider component\n */\n\nimport {\n useMemo,\n useState,\n useEffect,\n useCallback,\n useRef,\n type ReactNode,\n} from \"react\";\nimport { VolrContext, InternalAuthContext } from \"@/react/context\";\nimport type {\n VolrConfig,\n VolrContextValue,\n InternalAuthContextType,\n VolrUser,\n} from \"@/react/context\";\nimport { APIClient } from \"@/headless/client\";\nimport { SessionSync } from \"@/headless/auth-sync\";\nimport { safeStorage } from \"@/utils/ssr\";\nimport { resolveApiBaseUrl } from \"@/config/backend\";\nimport { restorePasskey } from \"@/headless/passkey-restore\";\nimport type {\n PrecheckInput,\n PrecheckQuote,\n RelayInput,\n RelayResult,\n WalletProviderPort,\n} from \"@volr/sdk-core\";\nimport type { AuthRefreshResponseDto } from \"@/types/api\";\nimport { STORAGE_KEYS } from '@volr/shared/constants/storage';\n\n/**\n * Recursively serialize BigInt to string for JSON\n */\nfunction serializeBigIntDeep(obj: any): any {\n if (obj === null || obj === undefined) {\n return obj;\n }\n if (typeof obj === \"bigint\") {\n return obj.toString();\n }\n if (Array.isArray(obj)) {\n return obj.map(serializeBigIntDeep);\n }\n if (typeof obj === \"object\") {\n const result: any = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result[key] = serializeBigIntDeep(obj[key]);\n }\n }\n return result;\n }\n return obj;\n}\n\n/**\n * VolrProvider props\n */\nexport type VolrProviderProps = {\n config: VolrConfig;\n children: ReactNode;\n};\n\n/**\n * VolrProvider component\n */\nexport function VolrProvider({ config, children }: VolrProviderProps) {\n // Hard enforcement: always prompt per transaction (TTL = 0)\n // Do not allow background auto-restore without user gesture\n const REQUIRE_USER_GESTURE_TO_RESTORE = true;\n // Check for duplicate providers\n const providerCountRef = useRef(0);\n useEffect(() => {\n providerCountRef.current++;\n if (providerCountRef.current > 1) {\n console.warn(\n \"Multiple VolrProvider components detected. This may cause session synchronization issues.\"\n );\n }\n return () => {\n providerCountRef.current--;\n };\n }, []);\n\n // Create API client with stable dependencies\n const apiBaseUrl = resolveApiBaseUrl(config);\n const client = useMemo(() => {\n if (!config.projectApiKey) {\n throw new Error(\n \"VolrProvider requires config.projectApiKey. Please set VITE_PROJECT_API_KEY environment variable or provide projectApiKey in config.\"\n );\n }\n return new APIClient({\n baseUrl: apiBaseUrl,\n apiKey: config.projectApiKey,\n });\n }, [apiBaseUrl, config.projectApiKey]);\n\n // Session state\n const [user, setUser] = useState<VolrUser | null>(() => {\n // SSR-safe: read from storage on mount\n if (typeof window === \"undefined\") return null;\n const userStr = safeStorage.getItem(STORAGE_KEYS.user);\n if (!userStr || userStr === \"undefined\" || userStr === \"null\") {\n return null;\n }\n try {\n return JSON.parse(userStr);\n } catch {\n return null;\n }\n });\n\n const [provider, setProviderState] = useState<WalletProviderPort | null>(\n null\n );\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const [chainId] = useState(config.defaultChainId);\n\n // Track access token state for internal context\n const [accessToken, setAccessTokenState] = useState<string | null>(() => {\n return client.getAccessToken();\n });\n\n // Session sync\n const syncRef = useRef<SessionSync | null>(null);\n useEffect(() => {\n syncRef.current = new SessionSync();\n const unsubscribe = syncRef.current.subscribe((event) => {\n if (event.type === \"LOGIN\") {\n client.setAccessToken(event.payload.accessToken);\n setAccessTokenState(event.payload.accessToken);\n setUser(event.payload.user);\n safeStorage.setItem(\n STORAGE_KEYS.user,\n JSON.stringify(event.payload.user)\n );\n client.setApiKey(config.projectApiKey);\n } else if (event.type === \"LOGOUT\") {\n client.setAccessToken(null);\n setAccessTokenState(null);\n setUser(null);\n setProviderState(null);\n safeStorage.removeItem(STORAGE_KEYS.user);\n safeStorage.removeItem(STORAGE_KEYS.provider);\n } else if (event.type === \"REFRESH\") {\n client.setAccessToken(event.payload.accessToken);\n setAccessTokenState(event.payload.accessToken);\n } else if (event.type === \"PROVIDER_SET\") {\n setUser((prev) => ({\n ...prev,\n keyStorageType: event.payload.keyStorageType,\n address: event.payload.address,\n }));\n safeStorage.setItem(STORAGE_KEYS.provider, event.payload.keyStorageType);\n }\n });\n\n return () => {\n unsubscribe();\n syncRef.current?.destroy();\n };\n }, [client, config.projectApiKey]);\n\n // Set provider function (defined before recover to avoid dependency issues)\n const setProvider = useCallback(\n async (newProvider: WalletProviderPort) => {\n try {\n setError(null);\n // Do NOT call getAddress() here - it triggers non-interactive ensureSession\n // which uses simulation mode instead of actual WebAuthn PRF.\n // Address will be fetched from backend via /auth/refresh below.\n\n // Extract keyStorageType from provider\n // WalletProviderPort interface includes keyStorageType property\n const keyStorageType = newProvider.keyStorageType;\n\n // Note: Provider registration is handled by usePasskeyEnrollment and useMpcConnection hooks\n // setProvider only sets the provider in context after it's already registered\n\n // Update state (provider is ready after ensureSession completes)\n setProviderState(newProvider);\n\n // Refresh user data from backend to get complete user info (blobUrl, prfInput, etc.)\n try {\n const refreshResponse = await client.post<AuthRefreshResponseDto>(\n \"/auth/refresh\",\n {}\n );\n\n if (refreshResponse.user) {\n console.log(\n \"[Provider] setProvider: User data refreshed from backend:\",\n refreshResponse.user\n );\n setUser(refreshResponse.user);\n safeStorage.setItem(\n STORAGE_KEYS.user,\n JSON.stringify(refreshResponse.user)\n );\n } else {\n // Fallback: update with partial data (keyStorageType only)\n setUser((prev) => ({\n ...prev,\n keyStorageType,\n }));\n safeStorage.setItem(\n STORAGE_KEYS.user,\n JSON.stringify({\n ...user,\n keyStorageType,\n })\n );\n }\n } catch (error) {\n console.warn(\n \"[Provider] setProvider: Failed to refresh user data, using partial update:\",\n error\n );\n // Fallback: update with partial data (keyStorageType only)\n setUser((prev) => ({\n ...prev,\n keyStorageType,\n }));\n safeStorage.setItem(\n STORAGE_KEYS.user,\n JSON.stringify({\n ...user,\n keyStorageType,\n })\n );\n }\n\n safeStorage.setItem(STORAGE_KEYS.provider, keyStorageType);\n\n // Broadcast to other tabs\n // Note: address will be populated after /auth/refresh completes\n syncRef.current?.broadcast({\n type: \"PROVIDER_SET\",\n payload: {\n keyStorageType,\n },\n });\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(\"Failed to set provider\");\n setError(error);\n throw error;\n }\n },\n [client, user]\n );\n\n // Auto-recover on mount (only once)\n const hasRecoveredRef = useRef(false);\n const restorationAttemptedRef = useRef(false);\n useEffect(() => {\n // Always refresh user data on mount, but skip provider restoration if interactive-only mode\n if (config.autoRecoverOnLogin !== false && !hasRecoveredRef.current) {\n hasRecoveredRef.current = true; // Mark as attempted to prevent multiple calls\n const recover = async () => {\n try {\n setIsLoading(true);\n // Try to refresh token (cookie-based, no body needed)\n const response = await client.post<AuthRefreshResponseDto>(\n \"/auth/refresh\",\n {}\n );\n\n // Debug: Log the response\n console.log(\"[Provider] /auth/refresh response:\", response);\n\n // If successful, token is set by client\n const refreshedToken = client.getAccessToken();\n if (refreshedToken) {\n // Update user from response or load from storage\n if (response.user) {\n console.log(\n \"[Provider] Setting user from response:\",\n response.user\n );\n console.log(\"[Provider] User fields:\", {\n id: response.user.id,\n email: response.user.email,\n accountId: response.user.accountId,\n evmAddress: response.user.evmAddress,\n signerType: response.user.signerType,\n keyStorageType: response.user.keyStorageType,\n walletConnector: response.user.walletConnector,\n blobUrl: response.user.blobUrl,\n prfInput: response.user.prfInput,\n credentialId: response.user.credentialId,\n });\n setUser(response.user);\n safeStorage.setItem(\n STORAGE_KEYS.user,\n JSON.stringify(response.user)\n );\n\n // Auto-restore provider if user has passkey but provider is not set\n // TTL=0 mode: Skip automatic provider restoration (requires user gesture)\n // Provider will be restored on-demand during transaction (in useVolrWallet)\n if (!REQUIRE_USER_GESTURE_TO_RESTORE) {\n // Only auto-restore if interactive mode is disabled\n const shouldRestore =\n response.user.keyStorageType === \"passkey\" &&\n response.user.blobUrl && // Must be non-null\n response.user.prfInput && // Must be non-null\n response.user.id;\n\n if (shouldRestore && !restorationAttemptedRef.current) {\n restorationAttemptedRef.current = true;\n\n try {\n console.log(\n \"[Provider] Auto-restoring passkey provider...\"\n );\n // Check current provider state before restoring\n // Use functional update to get current state synchronously\n let shouldProceed = false;\n setProviderState((currentProvider) => {\n shouldProceed = !currentProvider;\n return currentProvider; // Return unchanged\n });\n\n if (shouldProceed) {\n // Restore provider and await it (block until complete)\n const { provider: restoredProvider } =\n await restorePasskey({\n client,\n userId: response.user!.id!,\n blobUrl: response.user!.blobUrl!,\n prfInput: response.user!.prfInput!,\n credentialId: response.user!.credentialId,\n });\n\n await setProvider(restoredProvider);\n console.log(\n \"[Provider] Passkey provider restored successfully\"\n );\n }\n } catch (error) {\n console.error(\n \"[Provider] Failed to auto-restore provider:\",\n error\n );\n restorationAttemptedRef.current = false; // Allow retry on error\n }\n } else if (\n response.user.keyStorageType === \"passkey\" &&\n (!response.user.blobUrl || !response.user.prfInput)\n ) {\n // Log warning if passkey user but missing restoration data\n console.warn(\n \"[Provider] Passkey user detected but missing blobUrl or prfInput. User needs to re-enroll passkey.\"\n );\n }\n } else {\n // TTL=0 mode: Log that provider restoration is deferred\n if (response.user.keyStorageType === \"passkey\") {\n console.log(\n \"[Provider] TTL=0 mode: Provider restoration deferred until transaction (requires user gesture)\"\n );\n if (!response.user.blobUrl || !response.user.prfInput) {\n console.warn(\n \"[Provider] Passkey user detected but missing blobUrl or prfInput. User needs to re-enroll passkey.\"\n );\n }\n }\n }\n } else {\n console.log(\n \"[Provider] No user in response, loading from storage\"\n );\n const userStr = safeStorage.getItem(STORAGE_KEYS.user);\n if (userStr) {\n try {\n const storedUser = JSON.parse(userStr);\n console.log(\n \"[Provider] Loaded user from storage:\",\n storedUser\n );\n setUser(storedUser);\n } catch {\n // Invalid JSON, clear it\n safeStorage.removeItem(STORAGE_KEYS.user);\n }\n }\n }\n // Update access token state\n setAccessTokenState(refreshedToken);\n }\n } catch {\n // Refresh failed, clear state\n client.setAccessToken(null);\n setAccessTokenState(null);\n setUser(null);\n setProviderState(null);\n safeStorage.removeItem(STORAGE_KEYS.user);\n safeStorage.removeItem(STORAGE_KEYS.provider);\n } finally {\n setIsLoading(false);\n }\n };\n recover();\n } else {\n setIsLoading(false);\n }\n }, [client, config.autoRecoverOnLogin]);\n\n // Precheck function\n const precheck = useCallback(\n async (input: PrecheckInput): Promise<PrecheckQuote> => {\n try {\n setError(null);\n // Ensure access token exists (refresh via cookie if missing)\n if (!client.getAccessToken()) {\n try {\n await client.post(\"/auth/refresh\", {});\n } catch {\n // ignore; request below will trigger interceptor-based refresh on 401\n }\n }\n const response = await client.post<{ quote: PrecheckQuote }>(\n \"/wallet/precheck\",\n input\n );\n return response.quote;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(\"Precheck failed\");\n const diag = (err as any)?.response?.data?.error?.developerDiagnostics;\n if (diag) {\n // Surface diagnostics for developers\n console.error(\"[volr][precheck] developerDiagnostics:\", diag);\n }\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n // Relay function\n const relay = useCallback(\n async (\n input: RelayInput,\n opts?: { idempotencyKey?: string }\n ): Promise<RelayResult> => {\n try {\n setError(null);\n // Ensure access token exists (refresh via cookie if missing)\n if (!client.getAccessToken()) {\n try {\n await client.post(\"/auth/refresh\", {});\n } catch {\n // ignore; request below will trigger interceptor-based refresh on 401\n }\n }\n const idempotencyKey =\n opts?.idempotencyKey ??\n (typeof crypto !== \"undefined\" && crypto.randomUUID\n ? crypto.randomUUID()\n : `${Date.now()}-${Math.random()}`);\n\n // Serialize BigInt to string for JSON\n const serializedInput = serializeBigIntDeep(input);\n\n const response = await client.post<RelayResult>(\n \"/wallet/relay\",\n serializedInput,\n idempotencyKey\n );\n return response;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(\"Relay failed\");\n const diag = (err as any)?.response?.data?.error?.developerDiagnostics;\n if (diag) {\n console.error(\"[volr][relay] developerDiagnostics:\", diag);\n }\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n // Logout function\n const logout = useCallback(async () => {\n try {\n setError(null);\n client.setAccessToken(null);\n setUser(null);\n setProviderState(null);\n safeStorage.removeItem(STORAGE_KEYS.user);\n safeStorage.removeItem(STORAGE_KEYS.accessToken);\n safeStorage.removeItem(STORAGE_KEYS.provider);\n\n // Broadcast to other tabs\n syncRef.current?.broadcast({ type: \"LOGOUT\" });\n } catch (err) {\n const error = err instanceof Error ? err : new Error(\"Logout failed\");\n setError(error);\n throw error;\n }\n }, [client]);\n\n // External wallet provider event listeners\n useEffect(() => {\n // Only set up listeners for external wallet users\n if (!user) return;\n\n // Check if window.ethereum is available\n if (typeof window === \"undefined\" || !(window as any).ethereum) {\n return;\n }\n\n const ethereum = (window as any).ethereum;\n\n // accountsChanged: Force logout for security\n const handleAccountsChanged = (accounts: string[]) => {\n console.log(\"[Provider] accountsChanged event:\", accounts);\n\n if (accounts.length === 0) {\n // User disconnected wallet\n console.warn(\"[Provider] Wallet disconnected, logging out...\");\n setTimeout(() => logout(), 3000); // 3 second delay\n } else if (\n user.evmAddress &&\n accounts[0].toLowerCase() !== user.evmAddress.toLowerCase()\n ) {\n // Account switched to different address\n console.warn(\"[Provider] Account changed, logging out in 3 seconds...\");\n setTimeout(() => logout(), 3000); // 3 second delay\n }\n };\n\n // chainChanged: Update context\n const handleChainChanged = (chainIdHex: string) => {\n const newChainId = parseInt(chainIdHex, 16);\n console.log(\"[Provider] chainChanged event:\", newChainId);\n\n // Update user's last used chain\n setUser((prev) =>\n prev ? { ...prev, lastWalletChainId: newChainId } : null\n );\n\n // Reload page to avoid state inconsistency (recommended by MetaMask)\n window.location.reload();\n };\n\n // disconnect: Clear provider\n const handleDisconnect = () => {\n console.log(\"[Provider] disconnect event\");\n setProviderState(null);\n safeStorage.removeItem(STORAGE_KEYS.provider);\n };\n\n // Register listeners\n ethereum.on(\"accountsChanged\", handleAccountsChanged);\n ethereum.on(\"chainChanged\", handleChainChanged);\n ethereum.on(\"disconnect\", handleDisconnect);\n\n // Cleanup\n return () => {\n ethereum.removeListener(\"accountsChanged\", handleAccountsChanged);\n ethereum.removeListener(\"chainChanged\", handleChainChanged);\n ethereum.removeListener(\"disconnect\", handleDisconnect);\n };\n }, [user, logout, setUser]);\n\n // Public context value\n const publicValue: VolrContextValue = useMemo(\n () => ({\n config,\n user,\n provider,\n setProvider,\n setUser: (newUser) => {\n setUser(newUser);\n if (newUser) {\n safeStorage.setItem(STORAGE_KEYS.user, JSON.stringify(newUser));\n } else {\n safeStorage.removeItem(STORAGE_KEYS.user);\n }\n },\n chainId,\n precheck,\n relay,\n logout,\n isLoading,\n error,\n }),\n [\n config,\n user,\n provider,\n setProvider,\n chainId,\n precheck,\n relay,\n logout,\n isLoading,\n error,\n ]\n );\n\n // Internal context value\n const internalValue: InternalAuthContextType = useMemo(\n () => ({\n session: {\n accessToken,\n refreshToken: null, // Cookie-based, opaque\n },\n refreshAccessToken: async () => {\n await client.post(\"/auth/refresh\", {});\n // Access token will be updated via auto-recover effect or session sync\n const token = client.getAccessToken();\n setAccessTokenState(token);\n },\n setAccessToken: (token: string) => {\n client.setAccessToken(token);\n setAccessTokenState(token);\n },\n client, // Expose APIClient instance\n }),\n [client, accessToken]\n );\n\n return (\n <VolrContext.Provider value={publicValue}>\n <InternalAuthContext.Provider value={internalValue}>\n {children}\n </InternalAuthContext.Provider>\n </VolrContext.Provider>\n );\n}\n","/**\n * useVolr hook - Access Volr context\n */\n\nimport { useContext } from 'react';\nimport { VolrContext } from '@/react/context';\n\n/**\n * Get Volr context value\n * @throws Error if used outside VolrProvider\n */\nexport function useVolr() {\n const context = useContext(VolrContext);\n if (!context) {\n throw new Error('useVolr must be used within VolrProvider');\n }\n return context;\n}\n\n","/**\n * Input validation utilities\n */\n\nimport type { PrecheckInput, RelayInput, Call } from '@volr/sdk-core';\n\n/**\n * Default validation limits\n */\nexport const DEFAULT_LIMITS = {\n MAX_CALLS: 8,\n MAX_GAS_LIMIT: 10_000_000n,\n MAX_DATA_BYTES: 100_000,\n} as const;\n\n/**\n * Validation config (can be overridden)\n */\nexport type ValidationConfig = {\n maxCalls?: number;\n maxGasLimit?: bigint;\n maxDataBytes?: number;\n};\n\n/**\n * Validate policyId format (0x + 32 bytes)\n */\nexport function validatePolicyId(policyId: string): void {\n if (!/^0x[a-fA-F0-9]{64}$/.test(policyId)) {\n throw new Error('policyId must be 0x-prefixed 32-byte hex string');\n }\n}\n\n/**\n * Validate call value (must be 0)\n */\nexport function validateCallValue(value: bigint): void {\n if (value !== 0n) {\n throw new Error('call.value must be 0 (policy does not allow ETH transfers)');\n }\n}\n\n/**\n * Validate calls array\n */\nexport function validateCalls(\n calls: Call[],\n config: ValidationConfig = {}\n): void {\n const maxCalls = config.maxCalls ?? DEFAULT_LIMITS.MAX_CALLS;\n const maxGasLimit = config.maxGasLimit ?? DEFAULT_LIMITS.MAX_GAS_LIMIT;\n const maxDataBytes = config.maxDataBytes ?? DEFAULT_LIMITS.MAX_DATA_BYTES;\n\n if (!calls || calls.length === 0) {\n throw new Error('calls must not be empty');\n }\n\n if (calls.length > maxCalls) {\n throw new Error(`calls.length (${calls.length}) exceeds maximum (${maxCalls})`);\n }\n\n for (const call of calls) {\n // Validate value\n validateCallValue(call.value);\n\n // Validate gasLimit\n if (call.gasLimit <= 0n) {\n throw new Error('call.gasLimit must be > 0');\n }\n if (call.gasLimit > maxGasLimit) {\n throw new Error(`call.gasLimit (${call.gasLimit}) exceeds maximum (${maxGasLimit})`);\n }\n\n // Validate data length\n const dataBytes = call.data.startsWith('0x')\n ? (call.data.length - 2) / 2\n : call.data.length / 2;\n if (dataBytes > maxDataBytes) {\n throw new Error(`call.data length (${dataBytes} bytes) exceeds maximum (${maxDataBytes} bytes)`);\n }\n\n // Validate target\n if (!call.target.startsWith('0x') || call.target.length !== 42) {\n throw new Error('call.target must be valid Ethereum address');\n }\n }\n}\n\n/**\n * Validate precheck input\n */\nexport function validatePrecheckInput(\n input: PrecheckInput,\n config: ValidationConfig = {}\n): void {\n // Validate policyId\n validatePolicyId(input.auth.policyId);\n\n // Validate calls\n validateCalls(input.calls, config);\n\n // Validate expiresAt\n const now = Math.floor(Date.now() / 1000);\n const skew = 60;\n if (input.auth.expiresAt <= now + skew) {\n throw new Error('auth.expiresAt must be > now + 60s');\n }\n\n // Validate nonce\n if (input.auth.nonce < 0n) {\n throw new Error('auth.nonce must be >= 0');\n }\n}\n\n/**\n * Validate relay input\n */\nexport function validateRelayInput(\n input: RelayInput,\n config: ValidationConfig = {}\n): void {\n // Validate chainId (forbid chainId=0)\n if (input.chainId === 0) {\n throw new Error('chainId cannot be 0');\n }\n\n // Validate precheck input (auth + calls)\n validatePrecheckInput(\n {\n auth: input.auth,\n calls: input.calls,\n },\n config\n );\n\n // Validate authorizationList length (must be exactly 1)\n if (!input.authorizationList || input.authorizationList.length !== 1) {\n throw new Error('authorizationList must have exactly 1 element');\n }\n\n // Validate authorization tuple address matches invoker address\n const authTuple = input.authorizationList[0];\n // This validation ensures the tuple structure is correct\n\n // Validate sessionSig format\n if (!input.sessionSig.startsWith('0x') || input.sessionSig.length !== 132) {\n throw new Error('sessionSig must be 65-byte hex string (0x + 130 hex chars)');\n }\n}\n\n","/**\n * usePrecheck hook - Precheck transaction batch\n */\n\nimport { useState, useCallback } from 'react';\nimport { useVolr } from '@/hooks/useVolr';\nimport { validatePrecheckInput } from '@/utils/validation';\nimport type { PrecheckInput, PrecheckQuote } from '@volr/sdk-core';\n\n/**\n * usePrecheck return type\n */\nexport type UsePrecheckReturn = {\n precheck: (input: PrecheckInput) => Promise<PrecheckQuote>;\n isLoading: boolean;\n error: Error | null;\n};\n\n/**\n * usePrecheck hook\n */\nexport function usePrecheck(): UsePrecheckReturn {\n const { precheck: precheckContext } = useVolr();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const precheck = useCallback(\n async (input: PrecheckInput): Promise<PrecheckQuote> => {\n try {\n setIsLoading(true);\n setError(null);\n\n // Validate input\n validatePrecheckInput(input);\n\n // Call context function\n return await precheckContext(input);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Precheck failed');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [precheckContext]\n );\n\n return {\n precheck,\n isLoading,\n error,\n };\n}\n\n","/**\n * useInternalAuth hook - Access internal auth context\n */\n\nimport { useContext } from 'react';\nimport { InternalAuthContext } from '@/react/context';\n\n/**\n * Get internal auth context value\n * @throws Error if used outside VolrProvider\n */\nexport function useInternalAuth() {\n const context = useContext(InternalAuthContext);\n if (!context) {\n throw new Error('useInternalAuth must be used within VolrProvider');\n }\n return context;\n}\n\n\n","/**\n * useRelay hook - Relay transaction batch\n */\n\nimport { useState, useCallback } from \"react\";\nimport { useVolr } from \"@/hooks/useVolr\";\nimport { useInternalAuth } from \"@/hooks/useInternalAuth\";\nimport {\n signSession,\n signAuthorization,\n getAuthNonce,\n type ExtendedRPCClient,\n} from \"@volr/sdk-core\";\nimport { validateRelayInput } from \"@/utils/validation\";\nimport type { RelayInput, RelayResult, SignerPort } from \"@volr/sdk-core\";\nimport type { NetworkDto } from \"@/types/api\";\n\n/**\n * useRelay return type\n */\nexport type UseRelayReturn = {\n relay: (\n input: Omit<RelayInput, \"sessionSig\" | \"authorizationList\">,\n opts?: {\n signer: SignerPort;\n rpcClient?: ExtendedRPCClient;\n idempotencyKey?: string;\n }\n ) => Promise<RelayResult>;\n isLoading: boolean;\n error: Error | null;\n};\n\n/**\n * useRelay hook\n */\nexport function useRelay(): UseRelayReturn {\n const { relay: relayContext } = useVolr();\n const { client } = useInternalAuth();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const relay = useCallback(\n async (\n input: Omit<RelayInput, \"sessionSig\" | \"authorizationList\">,\n opts?: {\n signer: SignerPort;\n rpcClient?: ExtendedRPCClient;\n idempotencyKey?: string;\n }\n ): Promise<RelayResult> => {\n if (!opts?.signer) {\n throw new Error(\"signer is required\");\n }\n\n try {\n setIsLoading(true);\n setError(null);\n\n // Validate chainId (forbid chainId=0)\n if (input.chainId === 0) {\n throw new Error(\"chainId cannot be 0\");\n }\n\n // 1. Get invoker address from backend (required for both signing + authorization)\n const networkData = await client.get<NetworkDto>(\n `/networks/${input.chainId}`\n );\n\n const invokerAddress = networkData.invokerAddress;\n if (!invokerAddress) {\n throw new Error(\n `Invoker address not configured for chainId ${input.chainId}`\n );\n }\n\n // 2. Sign session (requires invoker address for domain binding)\n // EIP-7702: User EOA가 verifyingContract가 됩니다.\n const { sessionSig } = await signSession({\n signer: opts.signer,\n from: input.from,\n auth: input.auth,\n calls: input.calls,\n invokerAddress: input.from, \n });\n\n // 3. Get auth nonce (sponsored mode)\n if (!opts.rpcClient) {\n throw new Error(\"rpcClient is required for relay\");\n }\n const authNonce = await getAuthNonce(\n opts.rpcClient,\n input.from,\n \"sponsored\"\n );\n \n \n\n // 4. Sign authorization tuple (EIP-7702 path)\n // invokerAddress가 있으면 EIP-7702를 지원하는 것으로 간주\n const authorizationTuple = await signAuthorization({\n signer: opts.signer,\n chainId: input.chainId,\n address: invokerAddress,\n nonce: authNonce,\n });\n\n // 5. Validate invoker address matches authorization tuple\n if (\n authorizationTuple.address.toLowerCase() !==\n invokerAddress.toLowerCase()\n ) {\n throw new Error(\n `Authorization tuple address mismatch: expected ${invokerAddress}, got ${authorizationTuple.address}`\n );\n }\n\n // 6. Build relay input with authorization tuple\n const relayInput: RelayInput = {\n ...input,\n sessionSig,\n authorizationList: [authorizationTuple],\n };\n\n // 7. Validate relay input\n validateRelayInput(relayInput);\n\n // 8. Call relay context function\n return await relayContext(relayInput, {\n idempotencyKey: opts.idempotencyKey,\n });\n } catch (err) {\n const error = err instanceof Error ? err : new Error(\"Relay failed\");\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [relayContext, client]\n );\n\n return {\n relay,\n isLoading,\n error,\n };\n}\n","/**\n * Hex string normalization utilities\n */\n\n/**\n * Normalize hex string to lowercase with 0x prefix\n * Ensures consistent format for hashing and comparison\n */\nexport function normalizeHex(value: `0x${string}` | string): `0x${string}` {\n const hex = value.startsWith('0x') ? value.slice(2) : value;\n return `0x${hex.toLowerCase()}` as `0x${string}`;\n}\n\n/**\n * Normalize multiple hex strings\n */\nexport function normalizeHexArray(values: (`0x${string}` | string)[]): `0x${string}`[] {\n return values.map(normalizeHex);\n}\n\n\n\n\n\n\n\n","/**\n * Call builder utilities for better developer experience\n */\n\nimport { encodeFunctionData, type Abi, type Address } from 'viem';\nimport type { Call } from '@volr/sdk-core';\n\n/**\n * Options for building a call from function data\n */\nexport type BuildCallOptions = {\n target: Address;\n abi: Abi;\n functionName: string;\n args?: readonly unknown[];\n value?: bigint;\n gasLimit?: bigint;\n /**\n * Estimate gas automatically (future feature)\n * Currently noop - will use precheck result to inject gasLimit\n */\n estimateGas?: boolean;\n};\n\n/**\n * Build a Call object from function data (auto-encodes data)\n * \n * @example\n * ```ts\n * const call = buildCall({\n * target: '0x...',\n * abi: erc20Abi,\n * functionName: 'transfer',\n * args: ['0x...', BigInt(1000000)],\n * value: BigInt(0),\n * gasLimit: BigInt(100000),\n * estimateGas: true, // Future: will auto-estimate from precheck\n * });\n * ```\n */\nexport function buildCall(options: BuildCallOptions): Call {\n const data = encodeFunctionData({\n abi: options.abi,\n functionName: options.functionName,\n args: options.args,\n });\n\n // Future: if estimateGas=true, will use precheck result to set gasLimit\n // For now, this is a noop. Gas estimation is handled during the sendTransaction flow.\n if (options.estimateGas) {\n // Pass\n }\n\n return {\n target: options.target,\n data,\n value: options.value ?? BigInt(0),\n gasLimit: options.gasLimit ?? BigInt(0),\n };\n}\n\n/**\n * Build multiple calls from function data\n * \n * @example\n * ```ts\n * const calls = buildCalls([\n * {\n * target: tokenAddress,\n * abi: erc20Abi,\n * functionName: 'approve',\n * args: [spender, amount],\n * gasLimit: BigInt(50000),\n * },\n * {\n * target: routerAddress,\n * abi: routerAbi,\n * functionName: 'swap',\n * args: [tokenIn, tokenOut, amountIn],\n * gasLimit: BigInt(200000),\n * },\n * ]);\n * ```\n */\nexport function buildCalls(options: BuildCallOptions[]): Call[] {\n return options.map(buildCall);\n}\n\n","import type { Address, PublicClient } from 'viem';\nimport type { ExtendedRPCClient } from '@volr/sdk-core';\n\n/**\n * Create ExtendedRPCClient from viem PublicClient\n */\nexport function createExtendedRPCClient(publicClient: PublicClient): ExtendedRPCClient {\n return {\n call: async (args: { to: `0x${string}`; data: `0x${string}` }) => {\n const result = await publicClient.call({\n to: args.to,\n data: args.data,\n });\n return (result?.data || '0x') as `0x${string}`;\n },\n getTransactionCount: async (address: Address, blockTag?: 'pending' | 'latest') => {\n const count = await publicClient.getTransactionCount({\n address,\n blockTag: blockTag || 'pending',\n });\n return BigInt(count);\n },\n };\n}\n\n\n\n","import type { APIClient } from '@/headless/client';\n\n/**\n * Network info cache (in-memory)\n */\nconst networkCache = new Map<\n number,\n { rpcUrl?: string; name?: string; timestamp: number }\n>();\nconst CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes\n\ntype CreateGetRpcUrlDeps = {\n client: APIClient;\n rpcOverrides?: Record<string, string>;\n};\n\n/**\n * Factory to create a getRpcUrl resolver bound to provided deps.\n * Priority: 1) rpcOverrides 2) Backend API (cached)\n */\nexport function createGetRpcUrl(deps: CreateGetRpcUrlDeps) {\n const { client, rpcOverrides } = deps;\n\n return async function getRpcUrl(chainId: number): Promise<string> {\n // Check overrides first\n const overrideUrl = rpcOverrides?.[chainId.toString()];\n if (overrideUrl) {\n return overrideUrl;\n }\n\n // Check cache\n const cached = networkCache.get(chainId);\n if (cached && cached.rpcUrl && Date.now() - cached.timestamp < CACHE_TTL_MS) {\n return cached.rpcUrl;\n }\n\n // Fetch from backend API\n const response = await client.get<{\n chainId: number;\n name: string;\n rpcUrl?: string;\n }>(`/networks/${chainId}?includeRpcUrl=true`);\n\n if (!response.rpcUrl) {\n throw new Error(\n `RPC URL not available for chainId ${chainId}. Please provide it in config.rpcOverrides[${chainId}]`\n );\n }\n\n networkCache.set(chainId, {\n rpcUrl: response.rpcUrl,\n name: response.name,\n timestamp: Date.now(),\n });\n\n return response.rpcUrl;\n };\n}\n\nexport type NetworkInfo = {\n name: string;\n rpcUrl?: string;\n};\n\ntype CreateGetNetworkInfoDeps = {\n client: APIClient;\n rpcOverrides?: Record<string, string>;\n};\n\n/**\n * Factory to create a getNetworkInfo resolver bound to provided deps.\n * Returns chain name and optionally RPC URL.\n * Priority: 1) rpcOverrides (for RPC URL) 2) Backend API (cached)\n */\nexport function createGetNetworkInfo(deps: CreateGetNetworkInfoDeps) {\n const { client } = deps;\n\n return async function getNetworkInfo(\n chainId: number,\n includeRpcUrl = false\n ): Promise<NetworkInfo> {\n // Check cache first\n const cached = networkCache.get(chainId);\n if (cached && Date.now() - cached.timestamp < CACHE_TTL_MS) {\n return {\n name: cached.name || `Chain ${chainId}`,\n rpcUrl: includeRpcUrl ? cached.rpcUrl : undefined,\n };\n }\n\n // Fetch from backend API\n const response = await client.get<{\n chainId: number;\n name: string;\n rpcUrl?: string;\n }>(`/networks/${chainId}${includeRpcUrl ? \"?includeRpcUrl=true\" : \"\"}`);\n\n // Update cache\n networkCache.set(chainId, {\n name: response.name,\n rpcUrl: response.rpcUrl,\n timestamp: Date.now(),\n });\n\n return {\n name: response.name,\n rpcUrl: includeRpcUrl ? response.rpcUrl : undefined,\n };\n };\n}\n\n\n\n","import type { Call } from '@volr/sdk-core';\nimport { ZERO_HASH } from '@volr/sdk-core';\n\n/**\n * Validate policyId format (must be 32 bytes = 64 hex chars + 0x prefix)\n * Zero policyId (0x0000...0000) is not allowed.\n */\nexport function validatePolicyId(policyId: `0x${string}` | undefined): void {\n if (!policyId) {\n // policyId가 없으면 백엔드에서 자동으로 계산하므로 허용\n return;\n }\n if (!policyId.startsWith('0x')) {\n throw new Error('policyId must start with 0x');\n }\n const hexPart = policyId.slice(2);\n if (hexPart.length !== 64) {\n throw new Error(`policyId must be 32 bytes (64 hex chars), got ${hexPart.length / 2} bytes`);\n }\n if (!/^[0-9a-f]+$/i.test(hexPart)) {\n throw new Error('policyId must be valid hex string');\n }\n // Zero policyId는 허용하지 않음\n if (policyId.toLowerCase() === ZERO_HASH.toLowerCase()) {\n throw new Error('Zero policyId is not allowed. Omit policyId to use project-specific policyId from backend.');\n }\n}\n\n/**\n * Validate calls array\n */\nexport function validateCalls(calls: Call[]): void {\n if (calls.length === 0) {\n throw new Error('calls array must not be empty');\n }\n if (calls.length > 8) {\n throw new Error('calls array must not exceed 8 items');\n }\n for (const call of calls) {\n if (call.value > 0n) {\n console.warn('Call has non-zero value. Most policies forbid ETH transfers.');\n }\n }\n}\n\n\n\n","import { getAddress } from 'viem';\nimport { normalizeHex } from '@/utils/normalize';\nimport type { Call } from '@volr/sdk-core';\n\nexport function defaultGasLimit(data: `0x${string}`): bigint {\n const normalized = normalizeHex(data);\n return normalized === '0x' || normalized === '0x0' ? 21000n : 100000n;\n}\n\nexport function normalizeCall(call: Call): Call {\n const normalizedTarget = getAddress(call.target);\n const normalizedData = normalizeHex(call.data);\n const value = call.value ?? 0n;\n const gasLimit = call.gasLimit && call.gasLimit > 0n ? call.gasLimit : defaultGasLimit(normalizedData);\n\n return {\n target: normalizedTarget,\n data: normalizedData,\n value,\n gasLimit,\n };\n}\n\nexport function normalizeCalls(calls: Call[]): Call[] {\n return calls.map(normalizeCall);\n}\n\n\n\n","import type { Address, PublicClient } from 'viem';\nimport type { Call } from '@volr/sdk-core';\n\nfunction extractErrorMessage(err: unknown): string {\n if (err && typeof err === 'object') {\n const e = err as any;\n const parts: string[] = [];\n if (typeof e.shortMessage === 'string') parts.push(e.shortMessage);\n if (typeof e.message === 'string') parts.push(e.message);\n if (typeof e.cause?.message === 'string') parts.push(e.cause.message);\n if (typeof e.details === 'string') parts.push(e.details);\n const msg = parts.filter(Boolean).join(' | ');\n if (msg) return msg;\n }\n try {\n return String(err);\n } catch {\n return 'Unknown error';\n }\n}\n\nfunction isIgnorableFundingError(err: unknown, message: string): boolean {\n const m = message.toLowerCase();\n const e = err as any;\n const name = typeof e?.name === 'string' ? e.name.toLowerCase() : '';\n \n // Check for viem-specific error classes first (most reliable)\n // viem throws InsufficientFundsError for balance issues\n if (name === 'insufficientfundserror' || name.includes('insufficientfunds')) {\n return true;\n }\n \n // Check error code if available (viem uses error codes)\n // Common codes: INSUFFICIENT_FUNDS, UNPREDICTABLE_GAS_LIMIT (for reverts)\n if (typeof e?.code === 'string') {\n const code = e.code.toLowerCase();\n // Explicitly exclude revert-related error codes\n if (code.includes('execution_reverted') || code.includes('call_exception')) {\n return false; // This is a revert, not a funding issue\n }\n if (code.includes('insufficient_funds')) {\n return true;\n }\n }\n \n // Check for specific funding error messages (must be precise)\n // Only match messages that explicitly mention balance/funds issues\n const fundingPatterns = [\n 'insufficient funds for gas * price',\n 'insufficient funds for gas',\n 'for gas * price + value',\n 'not enough funds for l1 fee',\n 'insufficient funds for l1 fee',\n 'insufficient balance for gas',\n 'account balance too low',\n ];\n \n // Must match a funding pattern AND not contain revert indicators\n const hasFundingPattern = fundingPatterns.some(pattern => m.includes(pattern));\n const hasRevertIndicator = m.includes('revert') || \n m.includes('execution reverted') ||\n m.includes('call exception') ||\n m.includes('vm execution error');\n \n // Only ignore if it's a funding pattern AND not a revert\n return hasFundingPattern && !hasRevertIndicator;\n}\n\nexport async function preflightEstimate(\n publicClient: PublicClient,\n from: Address,\n calls: Call[],\n opts?: { tolerateFundingErrors?: boolean }\n): Promise<void> {\n for (let i = 0; i < calls.length; i++) {\n const c = calls[i]!;\n try {\n await publicClient.estimateGas({\n account: from,\n to: c.target,\n data: c.data,\n value: c.value ?? 0n,\n });\n } catch (e) {\n const message = extractErrorMessage(e);\n const tolerateFunding = opts?.tolerateFundingErrors !== false;\n \n // Check if this is an ignorable funding error\n const isFundingError = isIgnorableFundingError(e, message);\n \n if (tolerateFunding && isFundingError) {\n // Before ignoring, run a static call to ensure the contract logic itself doesn't revert.\n try {\n await publicClient.call({\n account: from,\n to: c.target,\n data: c.data,\n value: c.value ?? 0n,\n });\n // Static call succeeded, so this really is just a funding issue (no logic revert).\n console.log(\n `[preflightEstimate] Ignoring funding error for call #${i} (target ${c.target}): ${message}`\n );\n continue;\n } catch (callError) {\n const callMessage = extractErrorMessage(callError);\n console.error(\n `[preflightEstimate] Static call after funding error also failed for call #${i} (target ${c.target}):`,\n {\n originalError: { message, errorName: (e as any)?.name, errorCode: (e as any)?.code },\n callError: {\n message: callMessage,\n name: (callError as any)?.name,\n code: (callError as any)?.code,\n },\n }\n );\n throw new Error(\n `Preflight failed (call #${i} target ${c.target}): ${callMessage}`\n );\n }\n }\n \n // For non-funding errors (e.g., logic reverts), surface early to avoid prompting passkey.\n console.error(\n `[preflightEstimate] Preflight failed for call #${i} (target ${c.target}):`,\n {\n message,\n errorName: (e as any)?.name,\n errorCode: (e as any)?.code,\n isFundingError,\n tolerateFunding,\n }\n );\n throw new Error(`Preflight failed (call #${i} target ${c.target}): ${message}`);\n }\n }\n}\n\n\n","import { selectSigner, type SignerPort, type WalletProviderPort, type SelectSignerContext } from '@volr/sdk-core';\nimport { restorePasskey } from '@/headless/passkey-restore';\nimport type { APIClient } from '@/headless/client';\nimport type { VolrUser } from '@/react/context';\n\nexport async function resolveSigner(input: {\n explicitSigner?: SignerPort;\n provider: WalletProviderPort | null;\n chainId: number;\n client: APIClient;\n user: VolrUser | null | undefined;\n setProvider: (p: WalletProviderPort) => Promise<void> | void;\n}): Promise<{ signer: SignerPort; activeProvider: WalletProviderPort | null }> {\n const { explicitSigner, provider, chainId, client, user, setProvider } = input;\n\n if (explicitSigner) {\n return { signer: explicitSigner, activeProvider: null };\n }\n\n if (provider) {\n await provider.ensureSession({ interactive: true, force: true });\n const signerContext: SelectSignerContext = {\n provider,\n chainId,\n // Citrea testnet (5115) doesn't support P-256\n p256Hint: false,\n };\n const signer = await selectSigner(signerContext);\n return { signer, activeProvider: provider };\n }\n\n // Try restore passkey provider\n if (user?.keyStorageType === 'passkey' && user.blobUrl && user.prfInput && user.id) {\n const { provider: restoredProvider } = await restorePasskey({\n client,\n userId: user.id,\n blobUrl: user.blobUrl,\n prfInput: user.prfInput,\n credentialId: user.credentialId,\n });\n\n await setProvider(restoredProvider);\n\n await restoredProvider.ensureSession({ interactive: true, force: true });\n const signerContext: SelectSignerContext = {\n provider: restoredProvider,\n chainId,\n p256Hint: false,\n };\n const signer = await selectSigner(signerContext);\n return { signer, activeProvider: restoredProvider };\n }\n\n throw new Error(\n 'No wallet provider configured. Please set up a Passkey provider to sign transactions. SIWE is authentication-only.'\n );\n}\n\n\n\n","/**\n * Default constants for wallet facade\n */\n\n/**\n * Default session expiry time in seconds (15 minutes)\n */\nexport const DEFAULT_EXPIRES_IN_SEC = 900;\n\n/**\n * Default relay mode\n */\nexport const DEFAULT_MODE: 'sponsored' | 'self' = 'sponsored';\n\n/**\n * Generate default idempotency key\n * Uses crypto.randomUUID() if available, otherwise falls back to time+random\n */\nexport function defaultIdempotencyKey(): string {\n const c = (globalThis as any).crypto;\n return c?.randomUUID?.() ?? `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;\n}\n\n\n\n\n\n\n\n","import type { Call, SessionAuth, PrecheckQuote } from '@volr/sdk-core';\nimport { ZERO_HASH } from '@volr/sdk-core';\nimport { normalizeHex } from '@/utils/normalize';\nimport { DEFAULT_EXPIRES_IN_SEC } from '@/utils/defaults';\n\n// EIP-7702 오버헤드 및 Invoker 로직 비용을 고려한 버퍼\nconst GAS_CAP_BUFFER = 150_000n;\n\nexport function computeTotalGasCap(calls: Call[]): bigint {\n return calls.reduce((sum, c) => sum + (c.gasLimit ?? 0n), 0n) + GAS_CAP_BUFFER;\n}\n\nexport function buildTempAuth(input: {\n chainId: number;\n from: `0x${string}`;\n policyId: `0x${string}`;\n calls: Call[];\n expiresInSec?: number;\n sessionId?: bigint;\n policySnapshotHash?: `0x${string}`;\n gasLimitMax?: bigint;\n maxFeePerGas?: bigint;\n maxPriorityFeePerGas?: bigint;\n}): SessionAuth {\n const expiresAt = Math.floor(Date.now() / 1000) + (input.expiresInSec ?? DEFAULT_EXPIRES_IN_SEC);\n const totalGasCap = computeTotalGasCap(input.calls);\n \n // Default values for required fields\n const sessionId = input.sessionId ?? 0n;\n const policySnapshotHash = input.policySnapshotHash ?? ZERO_HASH;\n const gasLimitMax = input.gasLimitMax ?? totalGasCap;\n const maxFeePerGas = input.maxFeePerGas ?? 1000000000n; // 1 gwei default\n const maxPriorityFeePerGas = input.maxPriorityFeePerGas ?? 1000000n; // 0.001 gwei default\n\n return {\n chainId: input.chainId,\n sessionKey: input.from,\n sessionId,\n expiresAt,\n policyId: normalizeHex(input.policyId),\n nonce: 0n,\n policySnapshotHash,\n gasLimitMax,\n maxFeePerGas,\n maxPriorityFeePerGas,\n totalGasCap,\n };\n}\n\nexport function finalizeAuthWithNonce(tempAuth: SessionAuth, quote?: PrecheckQuote): SessionAuth {\n let finalNonce: bigint;\n if (quote?.currentOpNonce !== undefined && quote.currentOpNonce !== null && quote.currentOpNonce !== '') {\n const currentNonce = BigInt(quote.currentOpNonce);\n finalNonce = currentNonce + 1n;\n } else {\n finalNonce = BigInt(Math.floor(Date.now() / 1000));\n }\n\n const finalAuth = {\n ...tempAuth,\n nonce: finalNonce,\n };\n\n // Update policyId from backend (always provided, project-specific policyId)\n if (quote?.policyId) {\n finalAuth.policyId = normalizeHex(quote.policyId);\n }\n\n // Update policySnapshotHash from backend (always provided, zero hash if policy not initialized)\n if (quote?.policySnapshotHash) {\n finalAuth.policySnapshotHash = quote.policySnapshotHash;\n }\n\n return finalAuth;\n}\n\n\n\n","import type { APIClient } from '@/headless/client';\nimport type { RelayResult } from '@volr/sdk-core';\nimport type { TransactionResponse } from '@/types/transactions';\n\n/**\n * Poll transaction status until CONFIRMED or FAILED\n */\nexport async function pollTransactionStatus(\n txId: string,\n client: APIClient,\n maxAttempts = 60,\n intervalMs = 5000\n): Promise<RelayResult> {\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n const response = await client.get<TransactionResponse>(`/wallet/transactions/${txId}`);\n const { status, txHash } = response;\n\n if (status === 'CONFIRMED') {\n console.log(`[pollTransactionStatus] Transaction ${txId} confirmed with txHash ${txHash}`);\n return {\n txId,\n status: 'CONFIRMED',\n txHash: txHash as `0x${string}`,\n };\n }\n\n if (status === 'FAILED') {\n console.error(`[pollTransactionStatus] Transaction ${txId} failed`);\n const diag = response.meta?.developerDiagnostics;\n if (diag) {\n console.error('[volr][relay] developerDiagnostics:', diag);\n }\n return {\n txId,\n status: 'FAILED',\n txHash: txHash as `0x${string}` | undefined,\n };\n }\n\n console.log(`[pollTransactionStatus] Transaction ${txId} is ${status}, attempt ${attempt + 1}/${maxAttempts}`);\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n } catch (error) {\n console.error(`[pollTransactionStatus] Error polling transaction ${txId}:`, error);\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n }\n\n console.warn(`[pollTransactionStatus] Polling timeout for transaction ${txId}`);\n return {\n txId,\n status: 'PENDING',\n };\n}\n\n\n\n","import type { Address, PublicClient } from 'viem';\nimport type {\n Call,\n ExtendedRPCClient,\n PrecheckInput,\n PrecheckQuote,\n RelayInput,\n RelayResult,\n SignerPort,\n WalletProviderPort,\n} from '@volr/sdk-core';\nimport { ZERO_HASH } from '@volr/sdk-core';\nimport type { APIClient } from '@/headless/client';\nimport type { VolrUser } from '@/react/context';\nimport type { SendTxOptions } from '@/types/wallet';\nimport type { AuthRefreshResponseDto } from '@/types/api';\nimport { validatePolicyId, validateCalls } from '@/utils/tx-validation';\nimport { normalizeCalls } from '@/wallet/normalize';\nimport { preflightEstimate } from '@/wallet/preflight';\nimport { resolveSigner } from '@/wallet/signer';\nimport { buildTempAuth, finalizeAuthWithNonce } from '@/wallet/auth';\nimport { defaultIdempotencyKey, DEFAULT_EXPIRES_IN_SEC } from '@/utils/defaults';\nimport { pollTransactionStatus } from '@/utils/tx-polling';\n\ntype RelayFn = (\n input: Omit<RelayInput, 'sessionSig' | 'authorizationList'>,\n opts: { signer: SignerPort; rpcClient: ExtendedRPCClient; idempotencyKey?: string }\n) => Promise<RelayResult>;\n\nexport async function sendCalls(args: {\n chainId: number;\n from: Address;\n calls: Call[];\n opts: SendTxOptions;\n deps: {\n publicClient: PublicClient;\n rpcClient: ExtendedRPCClient;\n precheck: (input: PrecheckInput) => Promise<PrecheckQuote>;\n relay: RelayFn;\n client: APIClient;\n user: VolrUser | null;\n provider: WalletProviderPort | null;\n setProvider: (p: WalletProviderPort) => Promise<void> | void;\n };\n}): Promise<RelayResult> {\n const { chainId, from, calls, opts, deps } = args;\n\n if (chainId === 0) {\n throw new Error('chainId cannot be 0');\n }\n\n // Zero policyId는 undefined로 취급 (백엔드에서 프로젝트별 policyId를 받아옴)\n const effectivePolicyId =\n opts.policyId?.toLowerCase() === ZERO_HASH.toLowerCase()\n ? undefined\n : opts.policyId;\n\n validatePolicyId(effectivePolicyId);\n const normalizedFrom = from;\n const normalizedCalls = normalizeCalls(calls);\n validateCalls(normalizedCalls);\n\n // Ensure user data is fresh before resolving signer\n // This prevents first transaction failures when provider hasn't been restored yet\n let currentUser = deps.user;\n if (deps.user?.keyStorageType === 'passkey' && !deps.provider) {\n try {\n const refreshResponse = await deps.client.post<AuthRefreshResponseDto>(\n '/auth/refresh',\n {},\n );\n if (refreshResponse.user) {\n // Use refreshed user data for resolveSigner\n currentUser = refreshResponse.user as VolrUser;\n }\n } catch (error) {\n // If refresh fails, continue anyway - resolveSigner will handle it\n console.warn(\n '[sendCalls] Failed to refresh user data before transaction:',\n error,\n );\n }\n }\n\n if (opts.preflight !== false) {\n const tolerateFundingErrors = (opts.mode ?? 'sponsored') !== 'self';\n await preflightEstimate(\n deps.publicClient,\n normalizedFrom,\n normalizedCalls,\n { tolerateFundingErrors },\n );\n }\n\n // policyId가 없거나 zero이면 precheck를 먼저 호출해서 프로젝트별 policyId를 받습니다.\n // 이 단계에서는 signer를 아직 resolve하지 않으므로 패스키 프롬프트가 뜨지 않는다.\n let projectPolicyId: `0x${string}`;\n if (!effectivePolicyId) {\n // 임시 auth로 precheck 호출 (policyId는 zero hash로 설정)\n const tempAuthForPrecheck = buildTempAuth({\n chainId,\n from: normalizedFrom,\n policyId: ZERO_HASH,\n calls: normalizedCalls,\n expiresInSec: opts.expiresInSec ?? DEFAULT_EXPIRES_IN_SEC,\n });\n\n let precheckQuote: PrecheckQuote;\n try {\n // 정책이 없거나 잘못 구성된 경우, 여기서 바로 4xx 에러를 받도록 그대로 전파한다.\n precheckQuote = await deps.precheck({\n auth: tempAuthForPrecheck,\n calls: normalizedCalls,\n });\n } catch (err) {\n // AxiosError 등 원본 에러 객체를 그대로 던져서 error.response.data.error.code 를 소비자가 볼 수 있게 한다.\n throw err instanceof Error ? err : new Error(String(err));\n }\n\n // 타입 정의에는 policyId가 있지만, 런타임에서 확인\n const quotePolicyId = (precheckQuote as any).policyId as\n | `0x${string}`\n | undefined;\n if (!quotePolicyId) {\n throw new Error('Backend did not return policyId in precheck response');\n }\n projectPolicyId = quotePolicyId;\n } else {\n projectPolicyId = effectivePolicyId;\n }\n\n const tempAuth = buildTempAuth({\n chainId,\n from: normalizedFrom,\n policyId: projectPolicyId,\n calls: normalizedCalls,\n expiresInSec: opts.expiresInSec ?? DEFAULT_EXPIRES_IN_SEC,\n });\n\n let quote: PrecheckQuote | undefined;\n try {\n // 두 번째 precheck에서도 정책/시뮬레이션 레벨의 문제를 서명 전에 최대한 잡는다.\n quote = await deps.precheck({ auth: tempAuth, calls: normalizedCalls });\n } catch (err) {\n console.warn('[useVolrWallet] Precheck failed:', err);\n // 여기서는 기존 동작을 유지하여 quote 없이도 진행하되,\n // 정책 미초기화(WALLET_POLICY_NOT_INITIALIZED) 같은 치명적 에러는 첫 번째 precheck에서 이미 막힌다.\n }\n\n const auth = finalizeAuthWithNonce(tempAuth, quote);\n const idempotencyKey = opts.idempotencyKey ?? defaultIdempotencyKey();\n\n // Signer 및 provider는 모든 사전 검증(preflight / precheck)이 끝난 뒤에만 준비한다.\n // 이렇게 해야 어차피 실패할 트랜잭션에서 패스키 프롬프트가 뜨지 않는다.\n let signer: SignerPort;\n let activeProvider: WalletProviderPort | null = null;\n\n try {\n const resolved = await resolveSigner({\n explicitSigner: opts.signer,\n provider: deps.provider,\n chainId,\n client: deps.client,\n user: currentUser,\n setProvider: deps.setProvider,\n });\n signer = resolved.signer;\n activeProvider = resolved.activeProvider;\n\n const result = await deps.relay(\n { chainId, from: normalizedFrom, auth, calls: normalizedCalls },\n { signer, rpcClient: deps.rpcClient, idempotencyKey },\n );\n\n if (result.status === 'QUEUED' || result.status === 'PENDING') {\n console.log(\n `[useVolrWallet] Transaction ${result.txId} is ${result.status}, starting polling...`,\n );\n return await pollTransactionStatus(result.txId, deps.client);\n }\n return result;\n } finally {\n if (activeProvider && activeProvider.lock) {\n try {\n await activeProvider.lock();\n } catch {\n // ignore lock errors\n }\n }\n }\n}\n\n\n","/**\n * useVolrWallet hook - Developer-friendly facade for wallet operations\n */\n\nimport { useCallback } from 'react';\nimport { useVolr } from '@/hooks/useVolr';\nimport { usePrecheck } from '@/hooks/usePrecheck';\nimport { useRelay } from '@/hooks/useRelay';\nimport { useInternalAuth } from '@/hooks/useInternalAuth';\nimport {\n type ExtendedRPCClient,\n type Call,\n type RelayResult,\n} from '@volr/sdk-core';\nimport { createPublicClient, http, type PublicClient, getAddress } from 'viem';\nimport { normalizeHex } from '@/utils/normalize';\nimport { buildCalls, type BuildCallOptions } from '@/utils/call-builder';\nimport { createExtendedRPCClient } from '@/utils/rpc';\nimport type { SendTxOptions } from '@/types/wallet';\nimport { createGetRpcUrl } from '@/utils/network';\nimport { sendCalls } from '@/wallet/sender';\n\n/**\n * sendBatch function overloads\n */\ntype SendBatchOverloads = {\n /**\n * Send a batch of pre-built Call objects\n * @param calls - Array of Call objects with target, data, value, gasLimit\n * @param opts - Transaction options including policyId, expiresInSec, from\n * @example\n * ```ts\n * const calls: Call[] = [\n * { target: '0x...', data: '0x...', value: 0n, gasLimit: 100000n }\n * ];\n * await evm(chainId).sendBatch(calls, { policyId: '0x...' });\n * ```\n */\n (calls: Call[], opts: SendTxOptions & { from?: `0x${string}` }): Promise<RelayResult>;\n /**\n * Send a batch by providing BuildCallOptions - calls will be built internally\n * @param calls - Array of BuildCallOptions with target, abi, functionName, args\n * @param opts - Transaction options including policyId, expiresInSec, from\n * @example\n * ```ts\n * await evm(chainId).sendBatch(\n * [\n * {\n * target: tokenAddress,\n * abi: erc20Abi,\n * functionName: 'transfer',\n * args: [recipient, amount],\n * gasLimit: 100000n,\n * }\n * ],\n * { policyId: '0x...' }\n * );\n * ```\n */\n (calls: BuildCallOptions[], opts: SendTxOptions & { from?: `0x${string}` }): Promise<RelayResult>;\n};\n\n/**\n * useVolrWallet hook return type\n */\nexport type UseVolrWalletReturn = {\n evm: (chainId: number) => {\n readContract: <\n TAbi extends readonly unknown[],\n TFunctionName extends string,\n TReturnType = Awaited<ReturnType<PublicClient['readContract']>>\n >(\n args: Parameters<PublicClient['readContract']>[0] & {\n abi: TAbi;\n functionName: TFunctionName;\n }\n ) => Promise<TReturnType>;\n sendTransaction: (\n tx: { to: `0x${string}`; data: `0x${string}`; value?: bigint },\n opts: SendTxOptions\n ) => Promise<RelayResult>;\n sendBatch: SendBatchOverloads;\n };\n};\n\n/**\n * useVolrWallet hook - Developer-friendly facade\n */\nexport function useVolrWallet(): UseVolrWalletReturn {\n const { user, config, provider, setProvider } = useVolr();\n const { precheck } = usePrecheck();\n const { relay } = useRelay();\n const { client } = useInternalAuth();\n\n // Get RPC URL resolver bound to current deps\n const getRpcUrl = useCallback(\n createGetRpcUrl({ client, rpcOverrides: config.rpcOverrides }),\n [client, config.rpcOverrides]\n );\n\n const evm = useCallback(\n (chainId: number) => {\n // Validate chainId (forbid chainId=0)\n if (chainId === 0) {\n throw new Error('chainId cannot be 0');\n }\n\n // Create a promise-based wrapper that resolves RPC URL lazily\n let publicClient: PublicClient | null = null;\n let extendedRpcClient: ExtendedRPCClient | null = null;\n\n const ensureRpcClient = async () => {\n if (!publicClient) {\n // Get RPC URL (from config override or backend API)\n const rpcUrl = await getRpcUrl(chainId);\n \n publicClient = createPublicClient({\n transport: http(rpcUrl),\n });\n extendedRpcClient = createExtendedRPCClient(publicClient);\n }\n return { publicClient, extendedRpcClient };\n };\n\n return {\n readContract: async <\n TAbi extends readonly unknown[],\n TFunctionName extends string,\n TReturnType = Awaited<ReturnType<PublicClient['readContract']>>\n >(\n args: Parameters<PublicClient['readContract']>[0] & {\n abi: TAbi;\n functionName: TFunctionName;\n }\n ): Promise<TReturnType> => {\n const { publicClient: client } = await ensureRpcClient();\n // viem's readContract has complex type inference that requires type assertion\n // We use 'unknown' instead of 'any' for better type safety\n return client.readContract(args as Parameters<PublicClient['readContract']>[0]) as Promise<TReturnType>;\n },\n\n sendTransaction: async (\n tx: { to: `0x${string}`; data: `0x${string}`; value?: bigint; gasLimit?: bigint },\n opts: SendTxOptions\n ) => {\n const { publicClient, extendedRpcClient: rpcClient } = await ensureRpcClient();\n\n const from = opts.from ?? user?.evmAddress;\n if (!from) {\n throw new Error(\n 'from address is required. Provide it in opts.from or set user.evmAddress in VolrProvider. ' +\n 'If you haven\\'t set up a wallet provider yet, please complete the onboarding flow.'\n );\n }\n\n // Build minimal call; normalization and gas defaults applied downstream\n const call: Call = {\n target: getAddress(tx.to),\n data: normalizeHex(tx.data),\n value: tx.value ?? 0n,\n gasLimit: tx.gasLimit ?? 0n,\n };\n\n return await sendCalls({\n chainId,\n from: getAddress(from),\n calls: [call],\n opts,\n deps: {\n publicClient: publicClient!,\n rpcClient: rpcClient!,\n precheck,\n relay,\n client,\n user: user ?? null,\n provider: provider ?? null,\n setProvider,\n },\n });\n },\n\n sendBatch: (async (\n calls: Call[] | BuildCallOptions[],\n opts: SendTxOptions & { from?: `0x${string}` }\n ): Promise<RelayResult> => {\n const { publicClient, extendedRpcClient: rpcClient } = await ensureRpcClient();\n\n const from = opts.from ?? user?.evmAddress;\n if (!from) {\n throw new Error(\n 'from address is required. Provide it in opts.from or set user.evmAddress in VolrProvider. ' +\n 'If you haven\\'t set up a wallet provider yet, please complete the onboarding flow.'\n );\n }\n\n // Type guard: Check if calls is Call[] (has 'data' property) or BuildCallOptions[] (has 'abi' property)\n const isCallArray = (calls: Call[] | BuildCallOptions[]): calls is Call[] => {\n return Array.isArray(calls) && calls.length > 0 && 'data' in calls[0] && !('abi' in calls[0]);\n };\n\n const builtCalls: Call[] = isCallArray(calls)\n ? calls\n : buildCalls(calls);\n\n return await sendCalls({\n chainId,\n from: getAddress(from),\n calls: builtCalls.map((c) => ({\n target: getAddress(c.target),\n data: normalizeHex(c.data),\n value: c.value ?? 0n,\n gasLimit: c.gasLimit ?? 0n,\n })),\n opts,\n deps: {\n publicClient: publicClient!,\n rpcClient: rpcClient!,\n precheck,\n relay,\n client,\n user: user ?? null,\n provider: provider ?? null,\n setProvider,\n },\n });\n }) as SendBatchOverloads,\n };\n },\n [user, config, provider, precheck, relay, getRpcUrl]\n );\n\n return { evm };\n}\n\n","/**\n * Shared axios instance for Volr SDK\n */\n\nimport axios, { AxiosInstance } from 'axios';\n\n/**\n * Create a configured axios instance\n */\nexport function createAxiosInstance(baseUrl: string, apiKey?: string | null): AxiosInstance {\n const instance = axios.create({\n baseURL: baseUrl.replace(/\\/+$/, ''), // Remove trailing slashes\n withCredentials: true, // Include cookies\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n // Request interceptor: Add API key if available\n instance.interceptors.request.use((config) => {\n if (apiKey) {\n config.headers['X-API-Key'] = apiKey;\n }\n return config;\n });\n\n // Response interceptor: Handle errors consistently\n instance.interceptors.response.use(\n (response) => response,\n (error) => {\n // Axios automatically parses JSON, so we can access error.response.data directly\n if (error.response?.data) {\n const errorData = error.response.data;\n if (errorData.error?.message) {\n error.message = errorData.error.message;\n }\n }\n return Promise.reject(error);\n }\n );\n\n return instance;\n}\n\n/**\n * Update API key for an existing axios instance\n */\nexport function updateAxiosApiKey(instance: AxiosInstance, apiKey: string | null): void {\n instance.interceptors.request.clear();\n instance.interceptors.request.use((config) => {\n if (apiKey) {\n config.headers['X-API-Key'] = apiKey;\n }\n return config;\n });\n}\n\n","/**\n * useVolrLogin hook - Login handlers for various authentication methods\n */\n\nimport { useCallback, useMemo } from \"react\";\nimport { useVolr } from \"@/hooks/useVolr\";\nimport { useInternalAuth } from \"@/hooks/useInternalAuth\";\nimport { safeStorage } from \"@/utils/ssr\";\nimport { STORAGE_KEYS } from \"@volr/shared/constants/storage\";\nimport { createAxiosInstance } from \"@/utils/axios\";\nimport { KeyStorageType, SignerType, VolrUser } from \"@/react/context\";\nimport { resolveApiBaseUrl } from \"@/config/backend\";\nimport type { UserDto } from \"@/types/api\";\n\nexport type SocialProvider = \"google\" | \"twitter\" | \"apple\";\n\n/**\n * Authentication result after successful login/verification\n */\nexport interface AuthResult {\n userId: string;\n isNewUser: boolean;\n /** Key storage type: 'passkey' or 'mpc'. Null if user hasn't set up key storage yet. */\n keyStorageType: KeyStorageType | null;\n /** Signer type: how the user signs transactions */\n signerType?: SignerType | null;\n /** Access token for API authentication. Always present after successful login. */\n accessToken: string;\n}\n\nexport interface UseVolrLoginReturn {\n requestEmailCode: (email: string) => Promise<void>;\n verifyEmailCode: (email: string, code: string) => Promise<AuthResult>;\n handleSocialLogin: (provider: SocialProvider) => Promise<void>;\n requestSiweNonce: () => Promise<string>;\n verifySiweSignature: (\n message: string,\n signature: string,\n options?: {\n walletConnector?: string;\n chainId?: number;\n }\n ) => Promise<AuthResult>;\n handlePasskeyComplete: () => Promise<void>;\n}\n\n/**\n * useVolrLogin hook\n * Provides login handlers for email, social, wallet, and passkey authentication\n */\nexport function useVolrLogin(): UseVolrLoginReturn {\n const { config, setUser } = useVolr();\n const { refreshAccessToken, setAccessToken } = useInternalAuth();\n\n // Normalize backend UserDto -> VolrUser used in context\n const toVolrUser = useCallback((u: UserDto): VolrUser => {\n return {\n id: u.id,\n email: u.email,\n accountId: u.accountId ?? undefined,\n evmAddress: u.evmAddress as `0x${string}` | undefined,\n keyStorageType: u.keyStorageType ?? undefined,\n signerType: u.signerType ?? undefined,\n walletConnector: u.walletConnector ?? undefined,\n lastWalletChainId: u.lastWalletChainId ?? undefined,\n blobUrl: u.blobUrl ?? undefined,\n prfInput: u.prfInput ?? undefined,\n credentialId: u.credentialId ?? undefined,\n };\n }, []);\n\n // Resolve backend base URL (prod default, optional hidden override)\n const apiBaseUrl = resolveApiBaseUrl(config);\n\n // Create axios instance with config\n const api = useMemo(\n () => createAxiosInstance(apiBaseUrl, config.projectApiKey),\n [apiBaseUrl, config.projectApiKey]\n );\n\n const requestEmailCode = useCallback(\n async (email: string) => {\n const normalizedEmail = email.trim().toLowerCase();\n if (!normalizedEmail || !normalizedEmail.includes(\"@\")) {\n throw new Error(\"Invalid email address\");\n }\n const response = await api.post(\"/auth/email/send\", {\n email: normalizedEmail,\n });\n if (!response.data?.ok) {\n throw new Error(\n response.data?.error?.message || \"Failed to send verification code\"\n );\n }\n safeStorage.setItem(STORAGE_KEYS.lastEmail, normalizedEmail);\n },\n [api]\n );\n\n const verifyEmailCode = useCallback(\n async (email: string, code: string): Promise<AuthResult> => {\n const normalizedEmail = email.trim().toLowerCase();\n if (!normalizedEmail || !normalizedEmail.includes(\"@\")) {\n throw new Error(\"Invalid email address\");\n }\n\n const normalizedCode = code.trim();\n if (!/^\\d{6}$/.test(normalizedCode)) {\n throw new Error(\"Invalid code format\");\n }\n\n const response = await api.post(\"/auth/email/verify\", {\n email: normalizedEmail,\n code: normalizedCode,\n });\n\n if (!response.data?.ok) {\n throw new Error(\n response.data?.error?.message || \"Invalid verification code\"\n );\n }\n\n const verifyData = response.data;\n const userFromServer: UserDto | undefined = verifyData?.data?.user;\n const isNewUser: boolean = !!verifyData?.data?.isNewUser;\n const accessToken: string = verifyData?.data?.accessToken || \"\";\n\n if (!accessToken) {\n throw new Error(\n \"Access token is required but was not provided by the server\"\n );\n }\n\n // Set access token in APIClient\n setAccessToken(accessToken);\n\n // Establish session (access token) from refresh cookie set by backend\n await refreshAccessToken();\n\n if (userFromServer) {\n setUser(toVolrUser(userFromServer));\n } else {\n // Minimal fallback (shouldn't happen)\n setUser({ id: \"\", email: normalizedEmail });\n }\n\n return {\n userId: userFromServer?.id || \"\",\n isNewUser,\n keyStorageType:\n (userFromServer?.keyStorageType as KeyStorageType | undefined) ??\n null,\n signerType:\n (userFromServer?.signerType as SignerType | undefined) ?? null,\n accessToken,\n };\n },\n [api, refreshAccessToken, setAccessToken, setUser, toVolrUser]\n );\n\n const handleSocialLogin = useCallback(\n async (provider: SocialProvider) => {\n // Start OAuth flow\n if (typeof window !== \"undefined\") {\n const baseUrl = apiBaseUrl.replace(/\\/+$/, \"\");\n window.location.href = `${baseUrl}/auth/${provider}`;\n }\n },\n [apiBaseUrl]\n );\n\n const requestSiweNonce = useCallback(async (): Promise<string> => {\n const response = await api.get(\"/auth/siwe/nonce\");\n if (!response.data?.ok) {\n throw new Error(\n response.data?.error?.message || \"Failed to generate nonce\"\n );\n }\n return response.data.data.nonce;\n }, [api]);\n\n const verifySiweSignature = useCallback(\n async (\n message: string,\n signature: string,\n options?: {\n walletConnector?: string;\n chainId?: number;\n }\n ): Promise<AuthResult> => {\n try {\n const response = await api.post(\"/auth/siwe/verify\", {\n message,\n signature,\n walletConnector: options?.walletConnector,\n chainId: options?.chainId,\n });\n\n if (!response.data?.ok) {\n console.error(\n \"[verifySiweSignature] Backend returned error:\",\n response.data\n );\n throw new Error(\n response.data?.error?.message || \"Invalid SIWE signature\"\n );\n }\n\n const verifyData = response.data;\n const userFromServer: UserDto | undefined = verifyData?.data?.user;\n const isNewUser: boolean = !!verifyData?.data?.isNewUser;\n const accessToken: string = verifyData?.data?.accessToken || \"\";\n\n if (!accessToken) {\n throw new Error(\n \"Access token is required but was not provided by the server\"\n );\n }\n\n // Set access token in APIClient\n setAccessToken(accessToken);\n\n // Establish session (access token) from refresh cookie set by backend\n await refreshAccessToken();\n\n if (userFromServer) {\n setUser(toVolrUser(userFromServer));\n }\n\n return {\n userId: userFromServer?.id || \"\",\n isNewUser,\n keyStorageType:\n (userFromServer?.keyStorageType as KeyStorageType | undefined) ??\n null,\n signerType:\n (userFromServer?.signerType as SignerType | undefined) ?? null,\n accessToken,\n };\n } catch (error: any) {\n console.error(\"[verifySiweSignature] Error details:\", {\n message: error.message,\n response: error.response?.data,\n status: error.response?.status,\n });\n throw error;\n }\n },\n [api, refreshAccessToken, setAccessToken, setUser, toVolrUser]\n );\n\n const handlePasskeyComplete = useCallback(async () => {\n // No-op: passkey enrollment flow is handled in react-ui and provider.setProvider\n }, []);\n\n return {\n requestEmailCode,\n verifyEmailCode,\n handleSocialLogin,\n requestSiweNonce,\n verifySiweSignature,\n handlePasskeyComplete,\n };\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useVolr } from \"@/hooks/useVolr\";\nimport { useInternalAuth } from \"@/hooks/useInternalAuth\";\nimport { createAxiosInstance } from \"@/utils/axios\";\nimport { VolrUser } from \"@/react/context\";\nimport type { UserDto } from \"@/types/api\";\nimport { resolveApiBaseUrl } from \"@/config/backend\";\n\nexport interface UseVolrAuthCallbackOptions {\n onSuccess?: (user: VolrUser) => void;\n onError?: (error: string) => void;\n}\n\nexport interface UseVolrAuthCallbackReturn {\n isLoading: boolean;\n error: string | null;\n isNewUser: boolean;\n user: VolrUser | null;\n}\n\nexport function useVolrAuthCallback(\n options: UseVolrAuthCallbackOptions = {}\n): UseVolrAuthCallbackReturn {\n const { config, setUser } = useVolr();\n const { refreshAccessToken, setAccessToken } = useInternalAuth();\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [isNewUser, setIsNewUser] = useState(false);\n const [user, setLocalUser] = useState<VolrUser | null>(null);\n\n // Helper to normalize UserDto -> VolrUser (same as useVolrLogin)\n const toVolrUser = useCallback((u: UserDto): VolrUser => {\n return {\n id: u.id,\n email: u.email,\n accountId: u.accountId ?? undefined,\n evmAddress: u.evmAddress as `0x${string}` | undefined,\n keyStorageType: u.keyStorageType ?? undefined,\n signerType: u.signerType ?? undefined,\n walletConnector: u.walletConnector ?? undefined,\n lastWalletChainId: u.lastWalletChainId ?? undefined,\n blobUrl: u.blobUrl ?? undefined,\n prfInput: u.prfInput ?? undefined,\n credentialId: u.credentialId ?? undefined,\n };\n }, []);\n\n const apiBaseUrl = resolveApiBaseUrl(config);\n\n useEffect(() => {\n const handleCallback = async () => {\n if (typeof window === \"undefined\") return;\n\n const searchParams = new URLSearchParams(window.location.search);\n const success = searchParams.get(\"success\");\n const errorParam = searchParams.get(\"error\");\n const userId = searchParams.get(\"userId\");\n const isNew = searchParams.get(\"isNewUser\") === \"true\";\n\n // If there's an error parameter, stop immediately\n if (errorParam) {\n const errorMsg = `Authentication failed: ${errorParam}`;\n setError(errorMsg);\n setIsLoading(false);\n options.onError?.(errorMsg);\n return;\n }\n\n // If not success or missing user ID, do nothing (or treat as error)\n if (success !== \"true\" || !userId) {\n const errorMsg = \"Invalid callback parameters\";\n setError(errorMsg);\n setIsLoading(false);\n options.onError?.(errorMsg);\n return;\n }\n\n try {\n setIsNewUser(isNew);\n\n // 1. Refresh token to get access token (cookie based)\n // The backend redirects to callback AFTER setting the refresh token cookie\n await refreshAccessToken();\n\n // 2. Fetch user details\n const api = createAxiosInstance(\n apiBaseUrl,\n config.projectApiKey\n );\n // We need to get the access token that refreshAccessToken just set\n // However, refreshAccessToken sets it in internal state/client.\n // createAxiosInstance will check client.getAccessToken() or localStorage if persisted.\n // But refreshAccessToken saves it.\n\n // Better approach: refreshAccessToken returns the token or we can get it from client.\n // But refreshAccessToken is void. It sets state in APIClient.\n \n // We can call /auth/refresh explicitly if we want the token, \n // but refreshAccessToken already does that and sets it.\n \n // Fetch user onboarding/details status to confirm full user object\n // Or we can just use the user object returned by refreshAccessToken if it was exposed.\n // internalAuth exposes `user` but it updates context asynchronously.\n \n // Let's fetch user profile or onboarding status to ensure we have fresh data\n const userRes = await api.get(`/auth/onboarding/${userId}`);\n \n if (!userRes.data?.ok) {\n throw new Error(\"Failed to fetch user details\");\n }\n\n // We need full user object, but onboarding endpoint returns status.\n // Let's rely on what refreshAccessToken fetched. \n // The useInternalAuth hook updates the global user context.\n // But we also want to return it here.\n \n // Since refreshAccessToken updates the context, we can just wait a tick or\n // rely on the context update. However, for this hook to return the user *now*,\n // we might want to fetch it or check the context.\n \n // Actually, `refreshAccessToken` calls `/auth/refresh` which returns the User object.\n // But `useInternalAuth` implementation of `refreshAccessToken` swallows the return value\n // and just calls `setUser` and `setAccessToken`.\n \n // To make this robust, we can manually call refresh here if we want the data immediately\n // or trust that `refreshAccessToken` did its job.\n // Let's trust `refreshAccessToken` and try to get the user from context? \n // No, context update might be slow.\n \n // Let's manually call /auth/refresh to get the user data directly to return it.\n const refreshRes = await api.post(\"/auth/refresh\");\n if (!refreshRes.data?.ok) {\n throw new Error(\"Failed to refresh session\");\n }\n \n const userData = refreshRes.data.data.user;\n const accessToken = refreshRes.data.data.accessToken;\n \n setAccessToken(accessToken); // Ensure it's set\n const volrUser = toVolrUser(userData);\n setUser(volrUser); // Update global context\n setLocalUser(volrUser); // Update local state\n\n setIsLoading(false);\n options.onSuccess?.(volrUser);\n\n } catch (err: any) {\n console.error(\"Callback error:\", err);\n const errorMsg = err.message || \"Failed to complete authentication\";\n setError(errorMsg);\n setIsLoading(false);\n options.onError?.(errorMsg);\n }\n };\n\n handleCallback();\n }, [apiBaseUrl, config.projectApiKey, refreshAccessToken, setAccessToken, setUser, toVolrUser]);\n\n return {\n isLoading,\n error,\n isNewUser,\n user,\n };\n}\n\n\n","/**\n * useDepositListener - Polls for incoming deposits (native or ERC-20) on EVM chains.\n * - Uses JSON-RPC via configured rpcOverrides in VolrConfig or fetches from backend API.\n * - No wallet/provider required.\n */\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useVolr } from \"@/hooks/useVolr\";\nimport { useInternalAuth } from \"@/hooks/useInternalAuth\";\nimport { createGetRpcUrl } from \"@/utils/network\";\n\ntype Erc20Token = {\n address: `0x${string}`;\n decimals: number;\n};\n\nexport type DepositAsset =\n | { kind: \"native\" }\n | { kind: \"erc20\"; token: Erc20Token };\n\nexport type DepositStatus =\n | { state: \"idle\" }\n | { state: \"listening\"; balance: bigint }\n | {\n state: \"detected\";\n previousBalance: bigint;\n newBalance: bigint;\n delta: bigint;\n }\n | { state: \"error\"; message: string };\n\ntype JsonRpcRequest = {\n jsonrpc: \"2.0\";\n id: number;\n method: string;\n params?: any[];\n};\n\nasync function jsonRpc<T>(\n rpcUrl: string,\n method: string,\n params: any[]\n): Promise<T> {\n const payload: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id: Date.now(),\n method,\n params,\n };\n const res = await fetch(rpcUrl, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n if (!res.ok) {\n throw new Error(`RPC ${method} failed: ${res.status} ${res.statusText}`);\n }\n const body = await res.json();\n if (body.error) {\n throw new Error(body.error.message || \"RPC error\");\n }\n return body.result as T;\n}\n\nfunction hexToBigInt(hex: string | null | undefined): bigint {\n if (!hex) return 0n;\n return BigInt(hex);\n}\n\nfunction pad32(address: `0x${string}`): string {\n return `0x${address.toLowerCase().replace(/^0x/, \"\").padStart(64, \"0\")}`;\n}\n\nfunction balanceOfCalldata(address: `0x${string}`): `0x${string}` {\n // function balanceOf(address) -> 0x70a08231 + 32-bytes address\n const selector = \"0x70a08231\";\n return `${selector}${pad32(address).slice(2)}` as `0x${string}`;\n}\n\nexport function useDepositListener(input: {\n chainId: number;\n asset: DepositAsset;\n address: `0x${string}`;\n pollIntervalMs?: number;\n}): DepositStatus {\n const { config } = useVolr();\n const { client } = useInternalAuth();\n const [status, setStatus] = useState<DepositStatus>({ state: \"idle\" });\n const intervalRef = useRef<number | null>(null);\n const rpcUrlRef = useRef<string | null>(null);\n\n // Get RPC URL resolver bound to current deps\n const getRpcUrl = useCallback(\n createGetRpcUrl({ client, rpcOverrides: config.rpcOverrides }),\n [client, config.rpcOverrides]\n );\n\n useEffect(() => {\n let cancelled = false;\n\n const fetchBalance = async (): Promise<bigint> => {\n try {\n if (!rpcUrlRef.current) {\n throw new Error(\"RPC URL not initialized\");\n }\n const rpcUrl = rpcUrlRef.current;\n\n if (input.asset.kind === \"native\") {\n const result = await jsonRpc<string>(rpcUrl, \"eth_getBalance\", [\n input.address,\n \"latest\",\n ]);\n return hexToBigInt(result);\n } else {\n const data = balanceOfCalldata(input.address);\n const result = await jsonRpc<string>(rpcUrl, \"eth_call\", [\n { to: input.asset.token.address, data },\n \"latest\",\n ]);\n return hexToBigInt(result);\n }\n } catch (err: any) {\n throw new Error(\n err?.message || \"Failed to fetch balance from RPC endpoint\"\n );\n }\n };\n\n const start = async () => {\n try {\n // Initialize RPC URL first\n if (!rpcUrlRef.current) {\n rpcUrlRef.current = await getRpcUrl(input.chainId);\n console.log(\"[DepositListener] RPC URL:\", rpcUrlRef.current);\n }\n \n const initial = await fetchBalance();\n console.log(\"[DepositListener] Initial balance:\", initial.toString());\n if (cancelled) return;\n setStatus({ state: \"listening\", balance: initial });\n } catch (e: any) {\n console.error(\"[DepositListener] Error:\", e);\n if (cancelled) return;\n setStatus({ state: \"error\", message: e.message || String(e) });\n return;\n }\n\n const intervalMs = input.pollIntervalMs ?? config.deposit?.pollIntervalMs ?? 6000;\n console.log(\"[DepositListener] Polling interval:\", intervalMs, \"ms\");\n intervalRef.current = window.setInterval(async () => {\n try {\n const current = await fetchBalance();\n console.log(\"[DepositListener] Current balance:\", current.toString());\n if (cancelled) return;\n setStatus((prev) => {\n if (prev.state === \"listening\") {\n if (current > prev.balance) {\n console.log(\"[DepositListener] ✅ DEPOSIT DETECTED! Previous:\", prev.balance.toString(), \"New:\", current.toString());\n return {\n state: \"detected\",\n previousBalance: prev.balance,\n newBalance: current,\n delta: current - prev.balance,\n };\n }\n if (current !== prev.balance) {\n console.log(\"[DepositListener] ⚠️ Balance changed (decreased or other). Previous:\", prev.balance.toString(), \"New:\", current.toString());\n // balance decreased or changed - still report change\n return {\n state: \"detected\",\n previousBalance: prev.balance,\n newBalance: current,\n delta: current - prev.balance,\n };\n }\n return prev;\n }\n if (prev.state === \"detected\") {\n console.log(\"[DepositListener] Resuming listening from new balance:\", current.toString());\n // After detection, continue listening from new balance\n return { state: \"listening\", balance: current };\n }\n return prev;\n });\n } catch (err: any) {\n console.error(\"[DepositListener] Polling error:\", err);\n if (cancelled) return;\n setStatus({ state: \"error\", message: err.message || String(err) });\n }\n }, intervalMs);\n };\n\n start();\n\n return () => {\n cancelled = true;\n rpcUrlRef.current = null; // Reset RPC URL on cleanup\n if (intervalRef.current !== null) {\n clearInterval(intervalRef.current);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [getRpcUrl, input.chainId, input.address, JSON.stringify(input.asset)]);\n\n return status;\n}\n\n\n","/**\n * Passkey enrollment (headless)\n * WebAuthn credential creation, encryption, blob upload, provider registration\n */\n\nimport type { APIClient } from '@/headless/client';\nimport type { PrfInput, WrapKey } from '@volr/sdk-core';\nimport {\n deriveWrapKey,\n sealMasterSeed,\n createMasterKeyProvider,\n deriveEvmKey,\n uploadBlob,\n} from '@volr/sdk-core';\nimport {\n AUTHENTICATOR_SELECTION,\n PUBKEY_CRED_PARAMS,\n WEBAUTHN_TIMEOUT,\n ATTESTATION,\n} from '@/config/webauthn';\nimport type { UserDto } from '@/types/api';\n\nexport interface EnrollPasskeyParams {\n /** APIClient instance for backend communication */\n client: APIClient;\n /** Base URL for API calls */\n baseUrl: string;\n /** Project API key */\n apiKey: string;\n /** User ID (required) */\n userId: string;\n /** User email (required) */\n userEmail: string;\n /** Project ID (required) */\n projectId: string;\n /** Relying Party ID (default: window.location.hostname) */\n rpId?: string;\n /** Relying Party Name (default: 'Volr') */\n rpName?: string;\n}\n\nexport interface EnrollPasskeyResult {\n /** Credential ID (hex string) */\n credentialId: string;\n /** Blob URL (S3 key) */\n blobUrl: string;\n /** PRF input */\n prfInput: PrfInput;\n /** Ethereum address */\n address: `0x${string}`;\n /** Encrypted blob data */\n encryptedBlob: {\n cipher: Uint8Array;\n nonce: Uint8Array;\n };\n /** Additional authenticated data */\n aad: Uint8Array;\n /** Updated user information from backend */\n user?: UserDto;\n}\n\n/**\n * Enroll passkey: WebAuthn credential creation, encryption, blob upload, provider registration\n */\nexport async function enrollPasskey(\n params: EnrollPasskeyParams\n): Promise<EnrollPasskeyResult> {\n const {\n client,\n baseUrl,\n apiKey,\n userId,\n userEmail,\n projectId,\n rpId = typeof window !== 'undefined' ? window.location.hostname : 'localhost',\n rpName = 'Volr',\n } = params;\n\n // Validate required parameters\n if (!userId) {\n throw new Error('userId is required');\n }\n if (!userEmail) {\n throw new Error('userEmail is required');\n }\n if (!projectId) {\n throw new Error('projectId is required');\n }\n if (!baseUrl) {\n throw new Error('baseUrl is required');\n }\n if (!apiKey) {\n throw new Error('apiKey is required');\n }\n\n // Step 1: WebAuthn credential creation\n if (!navigator.credentials || !navigator.credentials.create) {\n throw new Error('WebAuthn API is not supported');\n }\n\n const challenge = new Uint8Array(32);\n crypto.getRandomValues(challenge);\n\n const userHandle = new TextEncoder().encode(userId);\n\n // Build PRF input for salt derivation (before credential creation)\n const tempCredentialId = 'temp-' + Date.now(); // Temporary ID for PRF salt\n const origin =\n typeof window !== 'undefined' ? window.location.origin : 'https://localhost';\n \n const tempPrfInput: PrfInput = {\n origin,\n projectId,\n credentialId: tempCredentialId,\n };\n \n // Derive PRF salt from prfInput\n const prfSalt = deriveWrapKey(tempPrfInput);\n\n const publicKeyCredentialCreationOptions: PublicKeyCredentialCreationOptions = {\n challenge,\n rp: {\n name: rpName,\n id: rpId,\n },\n user: {\n id: userHandle,\n name: userEmail,\n displayName: userEmail,\n },\n pubKeyCredParams: PUBKEY_CRED_PARAMS,\n authenticatorSelection: AUTHENTICATOR_SELECTION,\n timeout: WEBAUTHN_TIMEOUT,\n attestation: ATTESTATION,\n extensions: {\n prf: {\n eval: {\n first: prfSalt.buffer as ArrayBuffer,\n },\n },\n },\n };\n\n const credential = (await navigator.credentials.create({\n publicKey: publicKeyCredentialCreationOptions,\n })) as PublicKeyCredential | null;\n\n if (!credential || !('response' in credential)) {\n throw new Error('Failed to create passkey credential');\n }\n\n const credentialId = Array.from(new Uint8Array(credential.rawId))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n\n // Step 2: Extract PRF output from WebAuthn response\n const extensionResults = credential.getClientExtensionResults();\n if (!extensionResults.prf || !extensionResults.prf.results || !extensionResults.prf.results.first) {\n throw new Error('PRF extension not supported or PRF output missing. Please use a browser that supports WebAuthn PRF extension.');\n }\n\n const prfOutputBuffer = extensionResults.prf.results.first as ArrayBuffer;\n const prfOutput = new Uint8Array(prfOutputBuffer);\n\n // Step 3: Build PRF input (for storage)\n const prfInput: PrfInput = {\n origin,\n projectId,\n credentialId,\n };\n\n // Step 4: Use PRF output as wrap key (not deriveWrapKey!)\n const wrapKey = prfOutput as unknown as WrapKey;\n\n // Step 4: Generate master seed and encrypt\n const masterKeyProvider = createMasterKeyProvider();\n const masterSeedHandle = await masterKeyProvider.generate();\n\n try {\n // Build AAD with userId, keyStorageType, version\n // Format: volr/master-seed/v1|userId|keyStorageType|version\n const keyStorageType = 'passkey';\n const version = 'v1';\n const aadBytes = new TextEncoder().encode(\n `volr/master-seed/v1|${userId}|${keyStorageType}|${version}`\n );\n\n // Encrypt master seed\n const encryptedBlob = await sealMasterSeed(\n masterSeedHandle.bytes,\n wrapKey,\n aadBytes\n );\n\n // Step 5: Prepare encrypted blob for upload\n // Convert Uint8Array to Blob for upload\n const blob = new Blob(\n [\n encryptedBlob.cipher as unknown as BlobPart,\n encryptedBlob.nonce as unknown as BlobPart,\n ],\n {\n type: 'application/octet-stream',\n }\n );\n\n // Step 6: Upload blob via APIClient\n const accessToken = client.getAccessToken();\n if (!accessToken) {\n throw new Error('Access token is required for blob upload');\n }\n\n // Use core's uploadBlob function (it will create its own axios instance)\n const { key: blobUrl } = await uploadBlob({\n baseUrl,\n apiKey,\n accessToken,\n blob,\n // Don't pass axiosInstance - let uploadBlob create its own\n });\n\n if (!blobUrl) {\n throw new Error('Failed to upload blob: missing key');\n }\n\n // Step 7: Get address from master seed (for registration)\n const keypair = deriveEvmKey({ masterSeed: masterSeedHandle.bytes });\n const address = keypair.address;\n\n // Step 8: Register provider with backend (via APIClient)\n const registerResponse = await client.post<{ id: string; user?: UserDto }>('/wallet/provider/register', {\n keyStorageType: 'passkey',\n credentialId,\n blobUrl,\n prfInput: {\n origin,\n projectId,\n credentialId,\n },\n address,\n });\n\n return {\n credentialId,\n blobUrl,\n prfInput,\n address,\n encryptedBlob: {\n cipher: encryptedBlob.cipher,\n nonce: encryptedBlob.nonce,\n },\n aad: aadBytes,\n user: registerResponse.user,\n };\n } finally {\n masterSeedHandle.destroy();\n }\n}\n\n","/**\n * usePasskeyEnrollment hook\n * React-specific logic for passkey enrollment\n */\n\nimport { useState, useCallback, useRef } from \"react\";\nimport { useVolr } from \"@/hooks/useVolr\";\nimport { useInternalAuth } from \"@/hooks/useInternalAuth\";\nimport { enrollPasskey } from \"@/headless/passkey-enrollment\";\nimport { createPasskeyProvider } from \"@volr/sdk-core\";\nimport { createPasskeyAdapter } from \"@/adapters/passkey\";\nimport { safeStorage } from \"@/utils/ssr\";\nimport { STORAGE_KEYS } from \"@volr/shared/constants/storage\";\nimport { resolveApiBaseUrl } from \"@/config/backend\";\n\nexport type PasskeyEnrollmentStep =\n | 'idle'\n | 'creating'\n | 'encrypting'\n | 'uploading'\n | 'registering';\n\nexport interface UsePasskeyEnrollmentReturn {\n /** Start passkey enrollment */\n enroll: () => Promise<void>;\n /** Current enrollment step */\n step: PasskeyEnrollmentStep;\n /** Whether enrollment is in progress */\n isEnrolling: boolean;\n /** Error message if enrollment failed */\n error: Error | null;\n}\n\n/**\n * usePasskeyEnrollment hook\n * Provides passkey enrollment functionality\n */\nexport function usePasskeyEnrollment(): UsePasskeyEnrollmentReturn {\n const { config, setProvider, setUser, user } = useVolr();\n const { client } = useInternalAuth();\n const [step, setStep] = useState<PasskeyEnrollmentStep>(\"idle\");\n const [isEnrolling, setIsEnrolling] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const isEnrollingRef = useRef(false);\n\n // Use APIClient from context instead of creating a new instance\n\n const apiBaseUrl = resolveApiBaseUrl(config);\n\n const enroll = useCallback(async () => {\n // Prevent double execution\n if (isEnrollingRef.current || isEnrolling) return;\n isEnrollingRef.current = true;\n\n setIsEnrolling(true);\n setError(null);\n setStep(\"creating\");\n\n try {\n // Validate user\n if (!user?.id) {\n throw new Error(\"User ID is required for passkey enrollment\");\n }\n if (!user?.email) {\n throw new Error(\"User email is required for passkey enrollment\");\n }\n\n // Get access token from client (always use latest value from APIClient)\n const accessToken = client.getAccessToken();\n if (!accessToken) {\n throw new Error(\n \"Access token is required for passkey enrollment. Please login first.\"\n );\n }\n\n // Get project ID from config (or use user.id as fallback)\n // Note: projectId should ideally come from config, but for now we use user.id\n const projectId = user.id;\n\n setStep(\"encrypting\");\n\n // Enroll passkey\n const result = await enrollPasskey({\n client,\n baseUrl: apiBaseUrl,\n apiKey: config.projectApiKey,\n userId: user.id,\n userEmail: user.email,\n projectId,\n });\n\n setStep(\"registering\");\n\n // Store credentialId in localStorage\n if (typeof window !== \"undefined\") {\n safeStorage.setItem(STORAGE_KEYS.credentialId, result.credentialId);\n }\n\n // Create passkey adapter\n const passkeyAdapter = createPasskeyAdapter({\n rpId:\n typeof window !== \"undefined\"\n ? window.location.hostname\n : \"localhost\",\n rpName: \"Volr\",\n });\n\n // Create passkey provider\n const provider = createPasskeyProvider(passkeyAdapter, {\n prfInput: result.prfInput,\n encryptedBlob: result.encryptedBlob,\n aad: result.aad,\n });\n\n // Update user state immediately for UI (no need to wait for refresh)\n // Prefer backend-returned user (includes evmAddress), otherwise populate from local result\n if (result.user) {\n setUser(result.user);\n } else {\n // Functional updater is not supported by setUser; compute next value eagerly\n const nextUser = {\n ...(user as any),\n id: user.id,\n email: user.email,\n keyStorageType: \"passkey\" as const,\n evmAddress: result.address as `0x${string}`,\n blobUrl: result.blobUrl,\n prfInput: result.prfInput,\n credentialId: result.credentialId,\n };\n setUser(nextUser);\n }\n\n // Set provider in context (this will also refresh user data from backend)\n await setProvider(provider);\n\n setStep('idle');\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(\"Failed to enroll passkey\");\n setError(error);\n setStep(\"idle\");\n throw error;\n } finally {\n setIsEnrolling(false);\n isEnrollingRef.current = false;\n }\n }, [apiBaseUrl, client, config.projectApiKey, user, setProvider, setUser, isEnrolling]);\n\n return {\n enroll,\n step,\n isEnrolling,\n error,\n };\n}\n\n","/**\n * MPC transport (headless)\n * Backend proxy for MPC operations\n */\n\nimport type { APIClient } from '@/headless/client';\nimport type { MpcTransport } from '@volr/sdk-core';\n\nexport interface CreateBackendMpcTransportParams {\n /** APIClient instance for backend communication */\n client: APIClient;\n}\n\n/**\n * Create MPC transport that uses backend proxy\n */\nexport function createBackendMpcTransport(\n params: CreateBackendMpcTransportParams\n): MpcTransport {\n const { client } = params;\n\n let currentSessionToken: string | undefined;\n let cachedAddress: `0x${string}` | undefined;\n\n return {\n async ensureSession() {\n if (currentSessionToken) {\n return; // Session already established\n }\n\n // Call backend proxy to create MPC session\n const response = await client.post<{ sessionToken: string }>(\n '/wallet/mpc/connect',\n {}\n );\n currentSessionToken = response.sessionToken;\n },\n\n async getAddress(): Promise<`0x${string}`> {\n if (cachedAddress) {\n return cachedAddress;\n }\n\n await this.ensureSession();\n\n const response = await client.get<{ address: `0x${string}` }>(\n '/wallet/mpc/address'\n );\n cachedAddress = response.address;\n return cachedAddress;\n },\n\n async signMessage(hash32: Uint8Array): Promise<{\n r: Uint8Array;\n s: Uint8Array;\n yParity: 0 | 1;\n }> {\n await this.ensureSession();\n\n const hashHex = Array.from(hash32)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n\n const response = await client.post<{\n r: string;\n s: string;\n yParity: 0 | 1;\n }>('/wallet/mpc/sign', {\n hash: hashHex,\n });\n\n // Convert hex strings to Uint8Array\n const rHex = response.r.startsWith('0x') ? response.r.slice(2) : response.r;\n const sHex = response.s.startsWith('0x') ? response.s.slice(2) : response.s;\n\n const r = new Uint8Array(32);\n const s = new Uint8Array(32);\n\n for (let i = 0; i < 32; i++) {\n r[i] = parseInt(rHex.slice(i * 2, i * 2 + 2), 16);\n s[i] = parseInt(sHex.slice(i * 2, i * 2 + 2), 16);\n }\n\n return {\n r,\n s,\n yParity: response.yParity,\n };\n },\n\n async signTypedData(input: {\n domain: any;\n types: any;\n message: any;\n }): Promise<`0x${string}`> {\n await this.ensureSession();\n\n const response = await client.post<{ signature: `0x${string}` }>(\n '/wallet/mpc/sign-typed',\n {\n domain: input.domain,\n types: input.types,\n message: input.message,\n }\n );\n return response.signature;\n },\n\n async getPublicKey(): Promise<Uint8Array> {\n await this.ensureSession();\n\n const response = await client.get<{ publicKey: string }>(\n '/wallet/mpc/public-key'\n );\n const pubKeyHex = response.publicKey.startsWith('0x')\n ? response.publicKey.slice(2)\n : response.publicKey;\n const pubKey = new Uint8Array(65);\n\n for (let i = 0; i < 65; i++) {\n pubKey[i] = parseInt(pubKeyHex.slice(i * 2, i * 2 + 2), 16);\n }\n\n return pubKey;\n },\n };\n}\n\n","/**\n * Wallet provider registration (headless)\n * Register wallet provider with backend\n */\n\nimport type { APIClient } from '@/headless/client';\nimport type { PrfInput } from '@volr/sdk-core';\n\nexport interface RegisterWalletProviderParams {\n /** APIClient instance for backend communication */\n client: APIClient;\n /** Key storage type */\n keyStorageType: 'passkey' | 'mpc';\n /** Ethereum address */\n address: `0x${string}`;\n /** Credential ID (required for passkey) */\n credentialId?: string;\n /** Blob URL (required for passkey) */\n blobUrl?: string;\n /** PRF input (required for passkey) */\n prfInput?: PrfInput;\n}\n\n/**\n * Register wallet provider with backend\n */\nexport async function registerWalletProvider(\n params: RegisterWalletProviderParams\n): Promise<void> {\n const { client, keyStorageType, address, credentialId, blobUrl, prfInput } =\n params;\n\n // Validate required parameters\n if (!keyStorageType) {\n throw new Error('keyStorageType is required');\n }\n if (!address) {\n throw new Error('address is required');\n }\n\n // For passkey, validate additional required fields\n if (keyStorageType === 'passkey') {\n if (!credentialId) {\n throw new Error('credentialId is required for passkey');\n }\n if (!blobUrl) {\n throw new Error('blobUrl is required for passkey');\n }\n if (!prfInput) {\n throw new Error('prfInput is required for passkey');\n }\n }\n\n // Register provider\n await client.post('/wallet/provider/register', {\n keyStorageType,\n address,\n ...(keyStorageType === 'passkey' && {\n credentialId,\n blobUrl,\n prfInput,\n }),\n });\n}\n\n","/**\n * useMpcConnection hook\n * React-specific logic for MPC connection\n */\n\nimport { useState, useCallback } from 'react';\nimport { useVolr } from '@/hooks/useVolr';\nimport { useInternalAuth } from '@/hooks/useInternalAuth';\nimport { createBackendMpcTransport } from '@/headless/mpc-transport';\nimport { registerWalletProvider } from '@/headless/wallet-provider';\nimport { createMpcProvider } from '@volr/sdk-core';\n\nexport type MpcConnectionStep = 'idle' | 'connecting' | 'registering';\n\nexport interface UseMpcConnectionReturn {\n /** Start MPC connection */\n connect: () => Promise<void>;\n /** Current connection step */\n step: MpcConnectionStep;\n /** Whether connection is in progress */\n isConnecting: boolean;\n /** Error message if connection failed */\n error: Error | null;\n}\n\n/**\n * useMpcConnection hook\n * Provides MPC connection functionality\n */\nexport function useMpcConnection(): UseMpcConnectionReturn {\n const { setProvider } = useVolr();\n const { client } = useInternalAuth();\n const [step, setStep] = useState<MpcConnectionStep>('idle');\n const [isConnecting, setIsConnecting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const connect = useCallback(async () => {\n if (isConnecting) return;\n\n setIsConnecting(true);\n setError(null);\n setStep('connecting');\n\n try {\n // Step 1: Create MPC transport (backend proxy)\n const transport = createBackendMpcTransport({ client });\n\n // Step 2: Ensure session is established\n await transport.ensureSession();\n\n // Step 3: Get address\n const address = await transport.getAddress();\n\n // Step 4: Register provider with backend\n setStep('registering');\n await registerWalletProvider({\n client,\n keyStorageType: 'mpc',\n address,\n });\n\n // Step 5: Create MPC provider\n const provider = createMpcProvider(transport);\n\n // Step 6: Set provider in context\n await setProvider(provider);\n\n setStep('idle');\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to connect to MPC provider');\n setError(error);\n setStep('idle');\n throw error;\n } finally {\n setIsConnecting(false);\n }\n }, [client, setProvider, isConnecting]);\n\n return {\n connect,\n step,\n isConnecting,\n error,\n };\n}\n\n","/**\n * Blob helpers (headless)\n * - Presign + direct PUT upload to S3\n */\nimport { createAxiosInstance } from '@/utils/axios';\n\nexport async function uploadBlobViaPresign(params: {\n baseUrl: string;\n apiKey: string;\n blob: Blob;\n contentType?: string;\n}): Promise<{ s3Key: string }> {\n const { baseUrl, apiKey, blob, contentType = 'application/octet-stream' } = params;\n\n const api = createAxiosInstance(baseUrl, apiKey);\n\n // 1) Get presigned PUT URL\n const presignResponse = await api.post('/blob/presign', {\n op: 'put',\n contentType,\n });\n const presignData = presignResponse.data?.data || presignResponse.data;\n const uploadUrl: string = presignData.url;\n const s3Key: string = presignData.s3Key;\n\n // 2) Upload using fetch (must include signed headers)\n const putRes = await fetch(uploadUrl, {\n method: 'PUT',\n body: blob,\n headers: {\n 'Content-Type': contentType,\n 'x-amz-server-side-encryption': 'AES256',\n },\n mode: 'cors',\n });\n\n if (!putRes.ok) {\n const text = await putRes.text().catch(() => '');\n throw new Error(`Failed to upload to S3 (${putRes.status}): ${text || putRes.statusText}`);\n }\n\n return { s3Key };\n}\n\n\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/react/context.tsx","../src/utils/errors.ts","../src/utils/ssr.ts","../../shared/src/constants/storage.ts","../src/headless/client.ts","../src/headless/auth-sync.ts","../src/config/backend.ts","../src/config/webauthn.ts","../src/adapters/passkey.ts","../src/headless/passkey-restore.ts","../src/react/Provider.tsx","../src/hooks/useVolr.ts","../src/utils/validation.ts","../src/hooks/usePrecheck.ts","../src/hooks/useInternalAuth.ts","../src/hooks/useRelay.ts","../src/utils/normalize.ts","../src/utils/call-builder.ts","../src/utils/rpc.ts","../src/utils/network.ts","../src/utils/tx-validation.ts","../src/wallet/normalize.ts","../src/wallet/preflight.ts","../src/wallet/signer.ts","../src/utils/defaults.ts","../src/wallet/auth.ts","../src/utils/tx-polling.ts","../src/wallet/sender.ts","../src/hooks/useVolrWallet.ts","../src/utils/axios.ts","../src/hooks/useVolrLogin.ts","../src/hooks/useVolrAuthCallback.ts","../src/hooks/useDepositListener.ts","../src/headless/passkey-enrollment.ts","../src/hooks/usePasskeyEnrollment.ts","../src/headless/mpc-transport.ts","../src/headless/wallet-provider.ts","../src/hooks/useMpcConnection.ts","../src/headless/blobs.ts"],"names":["createContext","VolrError","axios","config","createPasskeyProvider","useRef","useEffect","useMemo","useState","useCallback","error","jsx","useContext","signSession","getAuthNonce","signAuthorization","encodeFunctionData","validatePolicyId","ZERO_HASH","validateCalls","getAddress","selectSigner","createPublicClient","http","client","publicClient","calls","deriveWrapKey","createMasterKeyProvider","sealMasterSeed","uploadBlob","deriveEvmKey","createMpcProvider"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * React context for Volr\n */\n\nimport { createContext } from \"react\";\nimport type {\n PrecheckInput,\n PrecheckQuote,\n RelayInput,\n RelayResult,\n WalletProviderPort,\n} from \"@volr/sdk-core\";\nimport type { APIClient } from \"@/headless/client\";\nimport type { PrfInputDto } from \"@/types/api\";\n\n// Import provider types directly from core (will be available after build)\nexport type KeyStorageType = \"passkey\" | \"mpc\";\nexport type SignerType = \"passkey\" | \"external_wallet\" | \"mpc\";\n\n// Re-export WalletProviderPort for convenience\nexport type { WalletProviderPort };\n\n/**\n * ERC-20 token configuration\n */\nexport interface Erc20Token {\n address: `0x${string}`;\n symbol: string;\n decimals: number;\n iconUrl?: string;\n}\n\n/**\n * Deposit asset configuration (native or ERC-20)\n */\nexport interface DepositAsset {\n chainId: number;\n token: \"native\" | Erc20Token;\n}\n\n/**\n * Deposit/Topup configuration\n */\nexport interface DepositConfig {\n supportedAssets: DepositAsset[];\n pollIntervalMs?: number; // default: 6000\n}\n\n/**\n * User information\n */\nexport interface VolrUser {\n id?: string;\n email?: string;\n accountId?: string; // CAIP-10 format (e.g., eip155:1:0xAbC...)\n evmAddress?: `0x${string}`; // EVM address for convenience\n keyStorageType?: KeyStorageType;\n signerType?: SignerType; // How the user signs transactions\n walletConnector?: string; // EIP-6963 rdns (e.g., \"io.metamask\")\n lastWalletChainId?: number; // Last used chain ID\n // Passkey restoration fields (optional, only present for passkey users)\n blobUrl?: string;\n prfInput?: PrfInputDto;\n credentialId?: string;\n}\n\n/**\n * Volr configuration\n */\nexport type VolrConfig = {\n defaultChainId: number; // required\n projectApiKey: string;\n rpcOverrides?: Record<string, string>; // optional\n autoRecoverOnLogin?: boolean; // default true\n providerPolicy?: {\n enforceOnFirstLogin?: boolean; // default true\n };\n /**\n * Deposit/Topup configuration for multi-chain, multi-token support\n */\n deposit?: DepositConfig;\n};\n\n/**\n * Public context value\n */\nexport type VolrContextValue = {\n config: VolrConfig;\n user: VolrUser | null;\n provider: WalletProviderPort | null;\n setProvider: (provider: WalletProviderPort) => Promise<void>;\n setUser: (user: VolrUser | null) => void;\n chainId: number;\n precheck: (input: PrecheckInput) => Promise<PrecheckQuote>;\n relay: (\n input: RelayInput,\n opts?: { idempotencyKey?: string }\n ) => Promise<RelayResult>;\n logout: () => Promise<void>;\n isLoading: boolean;\n error: Error | null;\n};\n\n/**\n * Internal auth context (for advanced use)\n */\nexport type InternalAuthContextType = {\n // Internal session state\n session: {\n accessToken: string | null;\n refreshToken: string | null; // opaque, cookie-based\n };\n // Internal methods\n refreshAccessToken: () => Promise<void>;\n setAccessToken: (token: string) => void;\n // APIClient instance for backend communication\n client: APIClient;\n};\n\n/**\n * Public Volr context\n */\nexport const VolrContext = createContext<VolrContextValue | null>(null);\n\n/**\n * Internal auth context (for advanced use)\n */\nexport const InternalAuthContext =\n createContext<InternalAuthContextType | null>(null);\n","/**\n * Error mapping utilities\n * Maps backend envelope errors to SDK errors\n */\n\nimport { VolrError } from '@volr/sdk-core';\n\n/**\n * Backend error envelope\n */\nexport type BackendError = {\n ok: false;\n error: {\n code: string;\n message: string;\n };\n};\n\n/**\n * Backend response envelope\n */\nexport type BackendResponse<T> =\n | { ok: true; data: T }\n | BackendError;\n\n/**\n * Error code constants\n */\nexport const ERROR_CODES = {\n COMMON_VALIDATION: 'COMMON_VALIDATION',\n COMMON_INTERNAL_ERROR: 'COMMON_INTERNAL_ERROR',\n AUTH_NOT_FOUND: 'AUTH_NOT_FOUND',\n AUTH_INVALID_TOKEN: 'AUTH_INVALID_TOKEN',\n NET_NOT_FOUND: 'NET_NOT_FOUND',\n WALLET_INVALID_EXPIRY: 'WALLET_INVALID_EXPIRY',\n WALLET_INVALID_NONCE: 'WALLET_INVALID_NONCE',\n WALLET_INVALID_POLICY_ID: 'WALLET_INVALID_POLICY_ID',\n WALLET_EMPTY_CALLS: 'WALLET_EMPTY_CALLS',\n WALLET_INVALID_CALL: 'WALLET_INVALID_CALL',\n WALLET_GAS_LIMIT_EXCEEDED: 'WALLET_GAS_LIMIT_EXCEEDED',\n WALLET_MAX_CALLS_EXCEEDED: 'WALLET_MAX_CALLS_EXCEEDED',\n WALLET_CALL_DATA_TOO_LARGE: 'WALLET_CALL_DATA_TOO_LARGE',\n WALLET_CALL_GAS_LIMIT_EXCEEDED: 'WALLET_CALL_GAS_LIMIT_EXCEEDED',\n WALLET_INVALID_VALUE: 'WALLET_INVALID_VALUE',\n WALLET_INVALID_AUTHORIZATION_LIST: 'WALLET_INVALID_AUTHORIZATION_LIST',\n WALLET_INVALID_INVOKER_ADDRESS: 'WALLET_INVALID_INVOKER_ADDRESS',\n WALLET_AUTH_CHAIN_ID_ZERO_NOT_ALLOWED: 'WALLET_AUTH_CHAIN_ID_ZERO_NOT_ALLOWED',\n WALLET_CHAIN_ID_MISMATCH: 'WALLET_CHAIN_ID_MISMATCH',\n WALLET_SIGNATURE_INVALID: 'WALLET_SIGNATURE_INVALID',\n WALLET_IDEMPOTENT_MISMATCH: 'WALLET_IDEMPOTENT_MISMATCH',\n WALLET_GAS_PRICE_CAP_EXCEEDED: 'WALLET_GAS_PRICE_CAP_EXCEEDED',\n} as const;\n\n/**\n * Map backend error to SDK error\n */\nexport function mapBackendError(error: BackendError['error']): VolrError {\n return new VolrError(error.code, error.message);\n}\n\n/**\n * Check if response is an error\n */\nexport function isErrorResponse<T>(\n response: BackendResponse<T>\n): response is BackendError {\n return !response.ok;\n}\n\n/**\n * Extract data from response or throw error\n */\nexport function unwrapResponse<T>(response: BackendResponse<T>): T {\n if (isErrorResponse(response)) {\n throw mapBackendError(response.error);\n }\n return response.data;\n}\n\n\n\n\n\n\n\n","/**\n * SSR-safe utilities\n */\n\n/**\n * Check if code is running in browser\n */\nexport function isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * Safe localStorage access (SSR-safe)\n */\nexport const safeStorage = {\n getItem(key: string): string | null {\n if (!isBrowser()) {\n return null;\n }\n try {\n const value = localStorage.getItem(key);\n // Filter out invalid JSON strings\n if (!value || value === 'undefined' || value === 'null') {\n return null;\n }\n return value;\n } catch {\n return null;\n }\n },\n\n setItem(key: string, value: string): void {\n if (!isBrowser()) {\n return;\n }\n try {\n localStorage.setItem(key, value);\n } catch {\n // Ignore errors (quota exceeded, etc.)\n }\n },\n\n removeItem(key: string): void {\n if (!isBrowser()) {\n return;\n }\n try {\n localStorage.removeItem(key);\n } catch {\n // Ignore errors\n }\n },\n\n clear(): void {\n if (!isBrowser()) {\n return;\n }\n try {\n localStorage.clear();\n } catch {\n // Ignore errors\n }\n },\n};\n\n","export const STORAGE_KEYS = {\n accessToken: 'volr:accessToken',\n user: 'volr:user',\n provider: 'volr:provider',\n credentialId: 'volr:credentialId',\n selectedProject: 'volr:selectedProject',\n lastEmail: 'volr:lastEmail',\n} as const;\n\nexport const STORAGE_CHANNELS = {\n session: 'volr:session',\n} as const;\n\n","/**\n * API client with automatic token refresh\n */\n\nimport type { BackendResponse } from '@/utils/errors';\nimport { unwrapResponse, isErrorResponse } from '@/utils/errors';\nimport { safeStorage } from '@/utils/ssr';\nimport axios, { AxiosInstance, AxiosError, InternalAxiosRequestConfig } from 'axios';\nimport { STORAGE_KEYS } from '@volr/shared/constants/storage';\n\n/**\n * API client configuration\n */\nexport type APIClientConfig = {\n baseUrl: string;\n apiKey?: string; // Optional, can be set later via setApiKey\n};\n\n/**\n * API client\n */\nexport class APIClient {\n private refreshPromise: Promise<void> | null = null;\n private accessToken: string | null = null;\n private apiKey: string | null = null;\n private api: AxiosInstance;\n\n constructor(config: APIClientConfig) {\n this.apiKey = config.apiKey || null;\n // Load access token from storage\n this.accessToken = safeStorage.getItem(STORAGE_KEYS.accessToken);\n\n // Create axios instance\n this.api = axios.create({\n baseURL: config.baseUrl.replace(/\\/+$/, ''),\n withCredentials: true,\n headers: {\n 'Content-Type': 'application/json',\n },\n transformRequest: [\n (data) => {\n // Transform BigInt to string before JSON serialization\n if (data && typeof data === 'object') {\n return JSON.stringify(data, (_, value) =>\n typeof value === 'bigint' ? value.toString() : value\n );\n }\n return data;\n },\n ],\n });\n\n // Request interceptor: Add API key and access token\n this.api.interceptors.request.use((config) => {\n // Ensure headers object exists\n if (!config.headers) {\n config.headers = {} as any;\n }\n \n // Set X-API-Key header (required for all authenticated requests)\n if (this.apiKey) {\n config.headers['X-API-Key'] = this.apiKey;\n } else {\n console.warn('[APIClient] X-API-Key not set. Some endpoints may fail.');\n }\n \n // Set Authorization header (for authenticated requests)\n if (this.accessToken) {\n config.headers['Authorization'] = `Bearer ${this.accessToken}`;\n }\n \n return config;\n });\n\n // Response interceptor: Handle 401 and refresh token\n this.api.interceptors.response.use(\n (response) => response,\n async (error: AxiosError<BackendResponse<any>>) => {\n const originalRequest = error.config as InternalAxiosRequestConfig & { _retry?: boolean };\n\n // Handle 401: try refresh once\n if (error.response?.status === 401 && !originalRequest._retry) {\n originalRequest._retry = true;\n try {\n await this.refreshAccessToken();\n if (this.accessToken) {\n originalRequest.headers['Authorization'] = `Bearer ${this.accessToken}`;\n }\n return this.api(originalRequest);\n } catch (refreshError) {\n return Promise.reject(refreshError);\n }\n }\n\n return Promise.reject(error);\n }\n );\n }\n\n /**\n * Set API key\n */\n setApiKey(apiKey: string | null): void {\n this.apiKey = apiKey;\n }\n\n /**\n * Get API key\n */\n getApiKey(): string | null {\n return this.apiKey;\n }\n\n /**\n * Set access token\n */\n setAccessToken(token: string | null): void {\n this.accessToken = token;\n if (token) {\n safeStorage.setItem(STORAGE_KEYS.accessToken, token);\n } else {\n safeStorage.removeItem(STORAGE_KEYS.accessToken);\n }\n }\n\n /**\n * Get access token\n */\n getAccessToken(): string | null {\n return this.accessToken;\n }\n\n /**\n * Refresh access token (single-flight)\n */\n private async refreshAccessToken(): Promise<void> {\n // Single-flight: if already refreshing, wait for that promise\n if (this.refreshPromise) {\n return this.refreshPromise;\n }\n\n this.refreshPromise = (async () => {\n try {\n // Use this.api instead of direct axios.post to ensure interceptors (X-API-Key header) are applied\n const response = await this.api.post<BackendResponse<{ accessToken: string; user?: { id: string; email: string } }>>(\n '/auth/refresh',\n {}\n );\n\n const data = response.data;\n\n if (isErrorResponse(data)) {\n // Refresh failed, clear token\n this.setAccessToken(null);\n safeStorage.removeItem(STORAGE_KEYS.user);\n throw new Error(data.error.message);\n }\n\n this.setAccessToken(data.data.accessToken);\n \n // Update user if provided\n if (data.data.user) {\n safeStorage.setItem(STORAGE_KEYS.user, JSON.stringify(data.data.user));\n }\n } finally {\n this.refreshPromise = null;\n }\n })();\n\n return this.refreshPromise;\n }\n\n /**\n * Make API request with automatic retry on 401\n */\n async request<T>(\n endpoint: string,\n options: RequestInit = {},\n idempotencyKey?: string\n ): Promise<T> {\n // Normalize endpoint: ensure it starts with /\n const normalizedEndpoint = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\n \n const config: any = {\n method: options.method || 'GET',\n url: normalizedEndpoint,\n };\n\n // Add body if present\n if (options.body) {\n config.data = typeof options.body === 'string' ? JSON.parse(options.body) : options.body;\n }\n\n // Add idempotency key if present\n if (idempotencyKey) {\n config.headers = {\n ...config.headers,\n 'Idempotency-Key': idempotencyKey,\n };\n }\n\n const response = await this.api.request<BackendResponse<T>>(config);\n return unwrapResponse(response.data);\n }\n\n /**\n * POST request\n */\n async post<T>(\n endpoint: string,\n body: any,\n idempotencyKey?: string\n ): Promise<T> {\n const normalizedEndpoint = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\n const config: any = {\n method: 'POST',\n url: normalizedEndpoint,\n data: body,\n };\n\n if (idempotencyKey) {\n config.headers = {\n 'Idempotency-Key': idempotencyKey,\n };\n }\n\n const response = await this.api.request<BackendResponse<T>>(config);\n return unwrapResponse(response.data);\n }\n\n /**\n * POST request that returns raw binary (ArrayBuffer)\n * - Uses axios instance with interceptors (auto 401 refresh)\n * - Applies X-API-Key and Authorization automatically\n */\n async postBinary(endpoint: string, body: any): Promise<ArrayBuffer> {\n const normalizedEndpoint = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\n \n // Ensure API key is set (required for authenticated endpoints)\n if (!this.apiKey) {\n throw new Error(\n 'API key not configured. Please ensure VolrProvider is initialized with projectApiKey in config.'\n );\n }\n \n const response = await this.api.request<ArrayBuffer>({\n method: 'POST',\n url: normalizedEndpoint,\n data: body,\n responseType: 'arraybuffer',\n headers: {\n 'X-API-Key': this.apiKey, // Explicitly set API key header\n ...(this.accessToken && { Authorization: `Bearer ${this.accessToken}` }),\n },\n });\n return response.data;\n }\n\n /**\n * GET request\n */\n async get<T>(endpoint: string): Promise<T> {\n const normalizedEndpoint = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\n const response = await this.api.get<BackendResponse<T>>(normalizedEndpoint);\n return unwrapResponse(response.data);\n }\n}\n\n","/**\n * Session synchronization across tabs using BroadcastChannel and localStorage\n */\n\nimport { safeStorage } from '@/utils/ssr';\nimport type { SessionEvent } from '@/headless/types';\nimport { STORAGE_CHANNELS, STORAGE_KEYS } from '@volr/shared/constants/storage';\n\n/**\n * Session sync manager\n */\nexport class SessionSync {\n private channel: BroadcastChannel | null = null;\n private listeners: Set<(event: SessionEvent) => void> = new Set();\n\n constructor() {\n if (typeof window !== 'undefined' && 'BroadcastChannel' in window) {\n this.channel = new BroadcastChannel(STORAGE_CHANNELS.session);\n this.channel.onmessage = (e: MessageEvent<SessionEvent>) => {\n this.handleChannelMessage(e.data);\n };\n }\n\n // Listen to localStorage changes (for same-origin tabs)\n if (typeof window !== 'undefined') {\n window.addEventListener('storage', (e) => {\n if (e.key === STORAGE_KEYS.accessToken || e.key === STORAGE_KEYS.user) {\n this.notifyListeners({\n type: 'REFRESH',\n payload: {\n accessToken: safeStorage.getItem(STORAGE_KEYS.accessToken) || '',\n },\n });\n }\n });\n }\n }\n\n /**\n * Subscribe to session events\n */\n subscribe(listener: (event: SessionEvent) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n /**\n * Broadcast session event to other tabs\n */\n broadcast(event: SessionEvent): void {\n if (this.channel) {\n this.channel.postMessage(event);\n }\n }\n\n /**\n * Handle channel message\n */\n private handleChannelMessage(event: SessionEvent): void {\n this.notifyListeners(event);\n }\n\n /**\n * Notify all listeners\n */\n private notifyListeners(event: SessionEvent): void {\n for (const listener of this.listeners) {\n try {\n listener(event);\n } catch (error) {\n console.error('SessionSync listener error:', error);\n }\n }\n }\n\n /**\n * Cleanup\n */\n destroy(): void {\n if (this.channel) {\n this.channel.close();\n this.channel = null;\n }\n this.listeners.clear();\n }\n}\n\n","/**\n * Backend API base URL configuration for Volr React SDK\n *\n * 일반 SDK 사용자는 별도 설정 없이 항상 프로덕션 SaaS 엔드포인트를 사용합니다.\n * (https://api.volr.io)\n *\n * 고급/내부 사용 시에는 VolrConfig 타입에 노출되지 않은 `apiBaseUrl` 필드를\n * 런타임에서 주입하여 오버라이드할 수 있습니다.\n */\n\nimport type { VolrConfig } from \"@/react/context\";\n\n/**\n * Public SaaS 기본 API 엔드포인트\n */\nexport const DEFAULT_API_BASE_URL = \"https://api.volr.io\";\n\n/**\n * VolrConfig로부터 실제로 사용할 API base URL을 해석합니다.\n *\n * - 일반 유저: 항상 DEFAULT_API_BASE_URL 을 사용\n * - 고급/내부: `config` 객체에 `apiBaseUrl` 필드를 (any 캐스팅 등으로)\n * 주입하면 해당 값을 우선 사용\n */\nexport function resolveApiBaseUrl(config: VolrConfig): string {\n const anyConfig = config as any;\n // 1순위: 내부 개발용 오버라이드 (__devApiBaseUrl)\n const devOverride = anyConfig.__devApiBaseUrl;\n if (devOverride && typeof devOverride === \"string\") {\n return devOverride.replace(/\\/+$/, \"\");\n }\n\n // 2순위: 고급/온프렘 시나리오용 숨겨진 apiBaseUrl\n const override = anyConfig.apiBaseUrl;\n if (override && typeof override === \"string\") {\n return override.replace(/\\/+$/, \"\");\n }\n\n // 기본: 퍼블릭 SaaS 프로덕션 엔드포인트\n return DEFAULT_API_BASE_URL;\n}\n\n\n\n\n\n\n","/**\n * WebAuthn configuration constants\n * Shared between passkey enrollment and authentication\n */\n\n/**\n * Authenticator selection criteria for passkey creation\n * - authenticatorAttachment: 'platform' - prioritize built-in authenticators (Touch ID, Face ID, Windows Hello)\n * - userVerification: 'required' - always require user gesture (biometric/PIN)\n * - residentKey: 'required' - always create discoverable credentials (stored in iCloud/platform)\n * \n * Note: 'required' ensures passkeys are always saved to iCloud Keychain/Windows Hello/etc.\n * This is necessary for passkeys to be synced across devices and properly stored.\n */\nexport const AUTHENTICATOR_SELECTION: AuthenticatorSelectionCriteria = {\n authenticatorAttachment: 'platform',\n userVerification: 'required',\n residentKey: 'required',\n};\n\n/**\n * Authenticator transports for passkey authentication\n * - 'internal': Platform authenticator (Touch ID, Face ID, Windows Hello) - ONLY option\n * \n * Note: We only use 'internal' to force platform authenticators and prevent QR code fallback.\n * This ensures consistent UX between enrollment and authentication.\n */\nexport const AUTHENTICATOR_TRANSPORTS: AuthenticatorTransport[] = ['internal'];\n\n/**\n * Credential mediation for passkey authentication\n * - 'required': Force immediate user prompt (no silent authentication)\n * - This ensures consistent behavior with enrollment and prevents unexpected QR code prompts\n */\nexport const CREDENTIAL_MEDIATION: CredentialMediationRequirement = 'required';\n\n/**\n * User verification requirement for passkey authentication\n * - 'required': Always require user gesture (biometric/PIN)\n * - Consistent with enrollment settings\n */\nexport const USER_VERIFICATION: UserVerificationRequirement = 'required';\n\n/**\n * Timeout for WebAuthn operations (in milliseconds)\n * - 60 seconds should be enough for user to complete authentication\n */\nexport const WEBAUTHN_TIMEOUT = 60000;\n\n/**\n * Public key credential parameters for passkey creation\n * - ES256 (P-256) algorithm\n */\nexport const PUBKEY_CRED_PARAMS: PublicKeyCredentialParameters[] = [\n {\n type: 'public-key',\n alg: -7, // ES256 (P-256)\n },\n];\n\n/**\n * Attestation conveyance preference\n * - 'direct': Request attestation from authenticator\n */\nexport const ATTESTATION: AttestationConveyancePreference = 'direct';\n\n","/**\n * Passkey adapter for WebAuthn\n * Implements PasskeyProviderPort interface\n */\n\nimport type { PasskeyProviderPort } from \"@volr/sdk-core\";\nimport { CREDENTIAL_MEDIATION, USER_VERIFICATION } from \"@/config/webauthn\";\n\n/**\n * Passkey adapter options\n */\nexport type PasskeyAdapterOptions = {\n rpId?: string; // Relying Party ID (default: window.location.hostname)\n rpName?: string; // Relying Party Name\n userDisplayName?: string;\n userHandle?: Uint8Array; // User handle (optional)\n};\n\n/**\n * Create passkey adapter\n */\nexport function createPasskeyAdapter(\n options: PasskeyAdapterOptions = {}\n): PasskeyProviderPort {\n const rpId =\n options.rpId ||\n (typeof window !== \"undefined\" ? window.location.hostname : \"localhost\");\n\n return {\n async getPublicKey() {\n // Get existing credential or create new one\n const credential = await navigator.credentials.get({\n publicKey: {\n challenge: new Uint8Array(32), // Dummy challenge for getting public key\n allowCredentials: [], // Empty = any credential\n userVerification: \"required\",\n },\n });\n\n if (!credential || !(\"response\" in credential)) {\n throw new Error(\"Failed to get passkey credential\");\n }\n\n // Note: getPublicKey() is not available in standard WebAuthn API\n // For MVP, we'll extract public key from credential.id or use a workaround\n // This is a placeholder - actual implementation would need credential creation response\n throw new Error(\n \"getPublicKey not implemented - use credential creation response\"\n );\n },\n\n async signP256(msgHash32: Uint8Array) {\n if (msgHash32.length !== 32) {\n throw new Error(\"Message hash must be 32 bytes\");\n }\n\n // Get credential\n const credential = await navigator.credentials.get({\n publicKey: {\n challenge: msgHash32 as BufferSource,\n allowCredentials: [], // Empty = any credential\n userVerification: \"required\",\n },\n });\n\n if (!credential || !(\"response\" in credential)) {\n throw new Error(\"Failed to get passkey credential for signing\");\n }\n\n const response = credential.response as AuthenticatorAssertionResponse;\n const signature = response.signature;\n\n // Parse signature (DER format)\n // Convert DER signature to r and s (32 bytes each)\n // DER format: 0x30 || length || 0x02 || rLength || r || 0x02 || sLength || s\n const derSignature = new Uint8Array(signature);\n\n if (derSignature[0] !== 0x30) {\n throw new Error(\"Invalid DER signature format\");\n }\n\n // Parse r\n let offset = 2; // Skip 0x30 and length\n if (derSignature[offset] !== 0x02) {\n throw new Error(\"Invalid DER signature: expected r marker\");\n }\n offset++;\n const rLength = derSignature[offset++];\n const rBytes = derSignature.slice(offset, offset + rLength);\n offset += rLength;\n\n // Parse s\n if (derSignature[offset] !== 0x02) {\n throw new Error(\"Invalid DER signature: expected s marker\");\n }\n offset++;\n const sLength = derSignature[offset++];\n const sBytes = derSignature.slice(offset, offset + sLength);\n\n // Pad to 32 bytes if needed\n const r = new Uint8Array(32);\n const s = new Uint8Array(32);\n\n if (rBytes.length > 32 || sBytes.length > 32) {\n throw new Error(\"Signature r or s exceeds 32 bytes\");\n }\n\n r.set(rBytes, 32 - rBytes.length);\n s.set(sBytes, 32 - sBytes.length);\n\n return { r, s };\n },\n\n async authenticate(prfInput: { salt: Uint8Array; credentialId?: string }) {\n // credentialId is required for non-discoverable credentials\n if (!prfInput.credentialId) {\n throw new Error(\n \"[PasskeyAdapter] credentialId is required for authentication. \" +\n \"This usually means the passkey was not properly registered or user data is incomplete. \" +\n \"Please re-enroll your passkey.\"\n );\n }\n\n // Build allowCredentials with credentialId\n // Convert hex string to Uint8Array (credentialId is stored as hex during enrollment)\n //\n // 등록 시: credential.rawId (ArrayBuffer) → hex string\n // Array.from(new Uint8Array(credential.rawId))\n // .map((b) => b.toString(16).padStart(2, '0'))\n // .join('')\n //\n // 인증 시: hex string → Uint8Array (역변환)\n // hexString.match(/.{1,2}/g)!.map((byte) => parseInt(byte, 16))\n\n // Remove 0x prefix if present\n const hexString = prfInput.credentialId.startsWith(\"0x\")\n ? prfInput.credentialId.slice(2)\n : prfInput.credentialId;\n\n // Validate hex string format\n if (!/^[0-9a-fA-F]+$/.test(hexString)) {\n console.error(\n \"[PasskeyAdapter] Invalid credentialId format (not hex):\",\n prfInput.credentialId\n );\n throw new Error(\n `[PasskeyAdapter] Invalid credentialId format. Expected hex string, got: ${prfInput.credentialId}`\n );\n }\n\n // Ensure even length (pad with leading zero if odd)\n // hex string은 항상 짝수 길이여야 함 (각 바이트는 2자리 hex)\n const normalizedHex =\n hexString.length % 2 === 0 ? hexString : \"0\" + hexString;\n\n // Convert hex string to Uint8Array\n // 주의: match()가 null을 반환할 수 있으므로 체크 필요\n const hexPairs = normalizedHex.match(/.{1,2}/g);\n if (!hexPairs) {\n throw new Error(\n `[PasskeyAdapter] Failed to parse hex string: ${normalizedHex}`\n );\n }\n\n const credIdBytes = new Uint8Array(\n hexPairs.map((byte) => parseInt(byte, 16))\n );\n\n // 변환 검증: hex string을 다시 변환해서 원본과 일치하는지 확인\n const reconvertedHex = Array.from(credIdBytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n\n if (reconvertedHex.toLowerCase() !== normalizedHex.toLowerCase()) {\n throw new Error(\n `[PasskeyAdapter] credentialId conversion failed. Original: ${normalizedHex}, Reconverted: ${reconvertedHex}`\n );\n }\n\n const allowCredentials = [\n {\n id: credIdBytes,\n type: \"public-key\" as const,\n },\n ];\n\n // Trigger WebAuthn with PRF extension\n // Use same configuration as enrollment for consistency\n let credential: PublicKeyCredential | null = null;\n try {\n credential = (await navigator.credentials.get({\n publicKey: {\n challenge: crypto.getRandomValues(new Uint8Array(32)),\n rpId,\n allowCredentials,\n userVerification: USER_VERIFICATION, // Shared constant\n extensions: {\n prf: {\n eval: {\n first: prfInput.salt.buffer as ArrayBuffer,\n },\n },\n },\n },\n mediation: CREDENTIAL_MEDIATION, // Use shared constant\n })) as PublicKeyCredential | null;\n } catch (error: any) {\n console.error(\"[PasskeyAdapter] WebAuthn get() failed:\", error);\n console.error(\"[PasskeyAdapter] Error name:\", error?.name);\n console.error(\"[PasskeyAdapter] Error message:\", error?.message);\n\n // Provide more specific error messages\n if (error?.name === \"NotAllowedError\") {\n throw new Error(\n \"[PasskeyAdapter] User cancelled the passkey prompt or authentication was denied. \" +\n \"Please try again and complete the authentication.\"\n );\n } else if (\n error?.name === \"NotFoundError\" ||\n error?.name === \"InvalidStateError\"\n ) {\n throw new Error(\n \"[PasskeyAdapter] No passkey found matching the provided credentialId. \" +\n \"This may happen if the passkey was deleted or the credentialId is incorrect. \" +\n \"Please re-enroll your passkey.\"\n );\n } else if (error?.name === \"NotSupportedError\") {\n throw new Error(\n \"[PasskeyAdapter] WebAuthn PRF extension is not supported by this browser or device. \" +\n \"Please use a browser that supports WebAuthn PRF extension (Chrome 108+, Edge 108+, Safari 16.4+).\"\n );\n }\n\n throw new Error(\n `[PasskeyAdapter] WebAuthn authentication failed: ${\n error?.message || \"Unknown error\"\n }`\n );\n }\n\n if (!credential || !credential.response) {\n console.error(\n \"[PasskeyAdapter] credential is null or missing response\"\n );\n throw new Error(\n \"[PasskeyAdapter] Failed to get passkey credential for PRF. \" +\n \"The passkey prompt may have been cancelled or no matching credential was found.\"\n );\n }\n\n // Extract PRF output from extension results\n const extensionResults = credential.getClientExtensionResults();\n\n if (\n !extensionResults.prf ||\n !extensionResults.prf.results ||\n !extensionResults.prf.results.first\n ) {\n throw new Error(\n \"[PasskeyAdapter] PRF extension not supported or PRF output missing\"\n );\n }\n\n const prfOutputBuffer = extensionResults.prf.results.first as ArrayBuffer;\n const prfOutput = new Uint8Array(prfOutputBuffer);\n\n // Convert credential.rawId (ArrayBuffer) to base64url string\n const credentialIdBytes = new Uint8Array(credential.rawId);\n const credentialIdBase64 = btoa(String.fromCharCode(...credentialIdBytes))\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=/g, \"\");\n\n console.log(\"[PasskeyAdapter] WebAuthn prompt completed successfully\");\n\n return {\n prfOutput,\n credentialId: credentialIdBase64,\n };\n },\n };\n}\n","/**\n * Passkey restoration (headless)\n * Restore passkey provider from stored credential and encrypted blob\n */\n\nimport type { APIClient } from '@/headless/client';\nimport type { PrfInput, WalletProviderPort } from '@volr/sdk-core';\nimport { createPasskeyProvider } from '@volr/sdk-core';\nimport { createPasskeyAdapter } from '@/adapters/passkey';\nimport { safeStorage } from '@/utils/ssr';\nimport { STORAGE_KEYS } from '@volr/shared/constants/storage';\n\nexport interface RestorePasskeyParams {\n /** APIClient instance for backend communication */\n client: APIClient;\n /** User ID */\n userId: string;\n /** Blob URL (S3 key) */\n blobUrl: string;\n /** PRF input */\n prfInput: PrfInput;\n /** Credential ID (optional, will try to get from localStorage) */\n credentialId?: string;\n}\n\nexport interface RestorePasskeyResult {\n /** Restored provider */\n provider: WalletProviderPort;\n}\n\n/**\n * Restore passkey provider from stored credential and encrypted blob\n */\nexport async function restorePasskey(\n params: RestorePasskeyParams\n): Promise<RestorePasskeyResult> {\n const {\n client,\n userId,\n blobUrl,\n prfInput,\n credentialId: providedCredentialId,\n } = params;\n\n // Get credentialId: prioritize provided > prfInput > localStorage\n const credentialId =\n providedCredentialId || \n prfInput.credentialId || \n safeStorage.getItem(STORAGE_KEYS.credentialId);\n \n if (!credentialId) {\n throw new Error(\n 'Credential ID not found. Please provide credentialId in params, prfInput, or ensure it is stored in localStorage. ' +\n 'If you recently enrolled a passkey, try refreshing the page or re-enrolling.'\n );\n }\n\n console.log('[restorePasskey] Using credentialId:', credentialId ? 'present' : 'MISSING');\n console.log('[restorePasskey] credentialId source:', \n providedCredentialId ? 'params' : \n prfInput.credentialId ? 'prfInput' : \n 'localStorage'\n );\n console.log('[restorePasskey] prfInput:', prfInput);\n\n // Step 1: Ensure access token is fresh\n console.log('[restorePasskey] Step 1: Ensuring access token is fresh...');\n const currentToken = client.getAccessToken();\n if (!currentToken) {\n console.log('[restorePasskey] No access token found, calling /auth/refresh...');\n try {\n await client.post('/auth/refresh', {});\n console.log('[restorePasskey] Access token refreshed successfully');\n } catch (error) {\n console.error('[restorePasskey] Failed to refresh access token:', error);\n throw new Error('Failed to refresh access token. Please log in again.');\n }\n }\n\n // Step 2: Download blob via backend proxy (to avoid CORS issues)\n console.log('[restorePasskey] Step 2: Downloading blob via backend proxy for blobUrl:', blobUrl);\n \n // Ensure API key is set (required for /blob/download endpoint)\n const apiKey = client.getApiKey();\n if (!apiKey) {\n console.error('[restorePasskey] API key not set in client. This is required for blob download.');\n throw new Error(\n 'API key not configured. Please ensure VolrProvider is initialized with projectApiKey in config.'\n );\n }\n console.log('[restorePasskey] API key is set:', apiKey ? 'present' : 'MISSING');\n \n // Use APIClient (axios) so that:\n // - X-API-Key and Authorization headers are applied automatically\n // - 401 is handled via interceptor (refresh, then retry)\n const arrayBuffer = await client.postBinary('/blob/download', { key: blobUrl });\n const blobBytes = new Uint8Array(arrayBuffer);\n\n // Step 3: Parse blob (cipher + nonce)\n // Blob format: cipher (first N bytes) + nonce (last 12 bytes)\n const nonceLength = 12;\n const cipherLength = blobBytes.length - nonceLength;\n\n if (cipherLength <= 0) {\n throw new Error('Invalid blob format: blob too small');\n }\n\n const cipher = blobBytes.slice(0, cipherLength);\n const nonce = blobBytes.slice(cipherLength);\n\n // Step 4: Build AAD (same format as enrollment)\n const keyStorageType = 'passkey';\n const version = 'v1';\n const aadBytes = new TextEncoder().encode(\n `volr/master-seed/v1|${userId}|${keyStorageType}|${version}`\n );\n\n // Step 5: Create passkey adapter\n const passkeyAdapter = createPasskeyAdapter({\n rpId:\n typeof window !== 'undefined' ? window.location.hostname : 'localhost',\n rpName: 'Volr',\n });\n\n // Step 6: Create passkey provider\n // Ensure prfInput includes credentialId for authentication\n const provider = createPasskeyProvider(passkeyAdapter, {\n prfInput: {\n ...prfInput,\n credentialId, // Add credentialId to prfInput\n },\n encryptedBlob: {\n cipher,\n nonce,\n },\n aad: aadBytes,\n });\n\n console.log('[restorePasskey] Provider created with credentialId:', credentialId);\n\n return {\n provider,\n };\n}\n\n","/**\n * VolrProvider component\n */\n\nimport {\n useMemo,\n useState,\n useEffect,\n useCallback,\n useRef,\n type ReactNode,\n} from \"react\";\nimport { VolrContext, InternalAuthContext } from \"@/react/context\";\nimport type {\n VolrConfig,\n VolrContextValue,\n InternalAuthContextType,\n VolrUser,\n} from \"@/react/context\";\nimport { APIClient } from \"@/headless/client\";\nimport { SessionSync } from \"@/headless/auth-sync\";\nimport { safeStorage } from \"@/utils/ssr\";\nimport { resolveApiBaseUrl } from \"@/config/backend\";\nimport { restorePasskey } from \"@/headless/passkey-restore\";\nimport type {\n PrecheckInput,\n PrecheckQuote,\n RelayInput,\n RelayResult,\n WalletProviderPort,\n} from \"@volr/sdk-core\";\nimport type { AuthRefreshResponseDto } from \"@/types/api\";\nimport { STORAGE_KEYS } from '@volr/shared/constants/storage';\n\n/**\n * Recursively serialize BigInt to string for JSON\n */\nfunction serializeBigIntDeep(obj: any): any {\n if (obj === null || obj === undefined) {\n return obj;\n }\n if (typeof obj === \"bigint\") {\n return obj.toString();\n }\n if (Array.isArray(obj)) {\n return obj.map(serializeBigIntDeep);\n }\n if (typeof obj === \"object\") {\n const result: any = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result[key] = serializeBigIntDeep(obj[key]);\n }\n }\n return result;\n }\n return obj;\n}\n\n/**\n * VolrProvider props\n */\nexport type VolrProviderProps = {\n config: VolrConfig;\n children: ReactNode;\n};\n\n/**\n * VolrProvider component\n */\nexport function VolrProvider({ config, children }: VolrProviderProps) {\n // Hard enforcement: always prompt per transaction (TTL = 0)\n // Do not allow background auto-restore without user gesture\n const REQUIRE_USER_GESTURE_TO_RESTORE = true;\n // Check for duplicate providers\n const providerCountRef = useRef(0);\n useEffect(() => {\n providerCountRef.current++;\n if (providerCountRef.current > 1) {\n console.warn(\n \"Multiple VolrProvider components detected. This may cause session synchronization issues.\"\n );\n }\n return () => {\n providerCountRef.current--;\n };\n }, []);\n\n // Create API client with stable dependencies\n const apiBaseUrl = resolveApiBaseUrl(config);\n const client = useMemo(() => {\n if (!config.projectApiKey) {\n throw new Error(\n \"VolrProvider requires config.projectApiKey. Please set VITE_PROJECT_API_KEY environment variable or provide projectApiKey in config.\"\n );\n }\n return new APIClient({\n baseUrl: apiBaseUrl,\n apiKey: config.projectApiKey,\n });\n }, [apiBaseUrl, config.projectApiKey]);\n\n // Session state\n const [user, setUser] = useState<VolrUser | null>(() => {\n // SSR-safe: read from storage on mount\n if (typeof window === \"undefined\") return null;\n const userStr = safeStorage.getItem(STORAGE_KEYS.user);\n if (!userStr || userStr === \"undefined\" || userStr === \"null\") {\n return null;\n }\n try {\n return JSON.parse(userStr);\n } catch {\n return null;\n }\n });\n\n const [provider, setProviderState] = useState<WalletProviderPort | null>(\n null\n );\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const [chainId] = useState(config.defaultChainId);\n\n // Track access token state for internal context\n const [accessToken, setAccessTokenState] = useState<string | null>(() => {\n return client.getAccessToken();\n });\n\n // Session sync\n const syncRef = useRef<SessionSync | null>(null);\n useEffect(() => {\n syncRef.current = new SessionSync();\n const unsubscribe = syncRef.current.subscribe((event) => {\n if (event.type === \"LOGIN\") {\n client.setAccessToken(event.payload.accessToken);\n setAccessTokenState(event.payload.accessToken);\n setUser(event.payload.user);\n safeStorage.setItem(\n STORAGE_KEYS.user,\n JSON.stringify(event.payload.user)\n );\n client.setApiKey(config.projectApiKey);\n } else if (event.type === \"LOGOUT\") {\n client.setAccessToken(null);\n setAccessTokenState(null);\n setUser(null);\n setProviderState(null);\n safeStorage.removeItem(STORAGE_KEYS.user);\n safeStorage.removeItem(STORAGE_KEYS.provider);\n } else if (event.type === \"REFRESH\") {\n client.setAccessToken(event.payload.accessToken);\n setAccessTokenState(event.payload.accessToken);\n } else if (event.type === \"PROVIDER_SET\") {\n setUser((prev) => ({\n ...prev,\n keyStorageType: event.payload.keyStorageType,\n address: event.payload.address,\n }));\n safeStorage.setItem(STORAGE_KEYS.provider, event.payload.keyStorageType);\n }\n });\n\n return () => {\n unsubscribe();\n syncRef.current?.destroy();\n };\n }, [client, config.projectApiKey]);\n\n // Set provider function (defined before recover to avoid dependency issues)\n const setProvider = useCallback(\n async (newProvider: WalletProviderPort) => {\n try {\n setError(null);\n // Do NOT call getAddress() here - it triggers non-interactive ensureSession\n // which uses simulation mode instead of actual WebAuthn PRF.\n // Address will be fetched from backend via /auth/refresh below.\n\n // Extract keyStorageType from provider\n // WalletProviderPort interface includes keyStorageType property\n const keyStorageType = newProvider.keyStorageType;\n\n // Note: Provider registration is handled by usePasskeyEnrollment and useMpcConnection hooks\n // setProvider only sets the provider in context after it's already registered\n\n // Update state (provider is ready after ensureSession completes)\n setProviderState(newProvider);\n\n // Refresh user data from backend to get complete user info (blobUrl, prfInput, etc.)\n try {\n const refreshResponse = await client.post<AuthRefreshResponseDto>(\n \"/auth/refresh\",\n {}\n );\n\n if (refreshResponse.user) {\n console.log(\n \"[Provider] setProvider: User data refreshed from backend:\",\n refreshResponse.user\n );\n setUser(refreshResponse.user);\n safeStorage.setItem(\n STORAGE_KEYS.user,\n JSON.stringify(refreshResponse.user)\n );\n } else {\n // Fallback: update with partial data (keyStorageType only)\n setUser((prev) => ({\n ...prev,\n keyStorageType,\n }));\n safeStorage.setItem(\n STORAGE_KEYS.user,\n JSON.stringify({\n ...user,\n keyStorageType,\n })\n );\n }\n } catch (error) {\n console.warn(\n \"[Provider] setProvider: Failed to refresh user data, using partial update:\",\n error\n );\n // Fallback: update with partial data (keyStorageType only)\n setUser((prev) => ({\n ...prev,\n keyStorageType,\n }));\n safeStorage.setItem(\n STORAGE_KEYS.user,\n JSON.stringify({\n ...user,\n keyStorageType,\n })\n );\n }\n\n safeStorage.setItem(STORAGE_KEYS.provider, keyStorageType);\n\n // Broadcast to other tabs\n // Note: address will be populated after /auth/refresh completes\n syncRef.current?.broadcast({\n type: \"PROVIDER_SET\",\n payload: {\n keyStorageType,\n },\n });\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(\"Failed to set provider\");\n setError(error);\n throw error;\n }\n },\n [client, user]\n );\n\n // Auto-recover on mount (only once)\n const hasRecoveredRef = useRef(false);\n const restorationAttemptedRef = useRef(false);\n useEffect(() => {\n // Always refresh user data on mount, but skip provider restoration if interactive-only mode\n if (config.autoRecoverOnLogin !== false && !hasRecoveredRef.current) {\n hasRecoveredRef.current = true; // Mark as attempted to prevent multiple calls\n const recover = async () => {\n try {\n setIsLoading(true);\n // Try to refresh token (cookie-based, no body needed)\n const response = await client.post<AuthRefreshResponseDto>(\n \"/auth/refresh\",\n {}\n );\n\n // Debug: Log the response\n console.log(\"[Provider] /auth/refresh response:\", response);\n\n // If successful, token is set by client\n const refreshedToken = client.getAccessToken();\n if (refreshedToken) {\n // Update user from response or load from storage\n if (response.user) {\n console.log(\n \"[Provider] Setting user from response:\",\n response.user\n );\n console.log(\"[Provider] User fields:\", {\n id: response.user.id,\n email: response.user.email,\n accountId: response.user.accountId,\n evmAddress: response.user.evmAddress,\n signerType: response.user.signerType,\n keyStorageType: response.user.keyStorageType,\n walletConnector: response.user.walletConnector,\n blobUrl: response.user.blobUrl,\n prfInput: response.user.prfInput,\n credentialId: response.user.credentialId,\n });\n setUser(response.user);\n safeStorage.setItem(\n STORAGE_KEYS.user,\n JSON.stringify(response.user)\n );\n\n // Auto-restore provider if user has passkey but provider is not set\n // TTL=0 mode: Skip automatic provider restoration (requires user gesture)\n // Provider will be restored on-demand during transaction (in useVolrWallet)\n if (!REQUIRE_USER_GESTURE_TO_RESTORE) {\n // Only auto-restore if interactive mode is disabled\n const shouldRestore =\n response.user.keyStorageType === \"passkey\" &&\n response.user.blobUrl && // Must be non-null\n response.user.prfInput && // Must be non-null\n response.user.id;\n\n if (shouldRestore && !restorationAttemptedRef.current) {\n restorationAttemptedRef.current = true;\n\n try {\n console.log(\n \"[Provider] Auto-restoring passkey provider...\"\n );\n // Check current provider state before restoring\n // Use functional update to get current state synchronously\n let shouldProceed = false;\n setProviderState((currentProvider) => {\n shouldProceed = !currentProvider;\n return currentProvider; // Return unchanged\n });\n\n if (shouldProceed) {\n // Restore provider and await it (block until complete)\n const { provider: restoredProvider } =\n await restorePasskey({\n client,\n userId: response.user!.id!,\n blobUrl: response.user!.blobUrl!,\n prfInput: response.user!.prfInput!,\n credentialId: response.user!.credentialId,\n });\n\n await setProvider(restoredProvider);\n console.log(\n \"[Provider] Passkey provider restored successfully\"\n );\n }\n } catch (error) {\n console.error(\n \"[Provider] Failed to auto-restore provider:\",\n error\n );\n restorationAttemptedRef.current = false; // Allow retry on error\n }\n } else if (\n response.user.keyStorageType === \"passkey\" &&\n (!response.user.blobUrl || !response.user.prfInput)\n ) {\n // Log warning if passkey user but missing restoration data\n console.warn(\n \"[Provider] Passkey user detected but missing blobUrl or prfInput. User needs to re-enroll passkey.\"\n );\n }\n } else {\n // TTL=0 mode: Log that provider restoration is deferred\n if (response.user.keyStorageType === \"passkey\") {\n console.log(\n \"[Provider] TTL=0 mode: Provider restoration deferred until transaction (requires user gesture)\"\n );\n if (!response.user.blobUrl || !response.user.prfInput) {\n console.warn(\n \"[Provider] Passkey user detected but missing blobUrl or prfInput. User needs to re-enroll passkey.\"\n );\n }\n }\n }\n } else {\n console.log(\n \"[Provider] No user in response, loading from storage\"\n );\n const userStr = safeStorage.getItem(STORAGE_KEYS.user);\n if (userStr) {\n try {\n const storedUser = JSON.parse(userStr);\n console.log(\n \"[Provider] Loaded user from storage:\",\n storedUser\n );\n setUser(storedUser);\n } catch {\n // Invalid JSON, clear it\n safeStorage.removeItem(STORAGE_KEYS.user);\n }\n }\n }\n // Update access token state\n setAccessTokenState(refreshedToken);\n }\n } catch {\n // Refresh failed, clear state\n client.setAccessToken(null);\n setAccessTokenState(null);\n setUser(null);\n setProviderState(null);\n safeStorage.removeItem(STORAGE_KEYS.user);\n safeStorage.removeItem(STORAGE_KEYS.provider);\n } finally {\n setIsLoading(false);\n }\n };\n recover();\n } else {\n setIsLoading(false);\n }\n }, [client, config.autoRecoverOnLogin]);\n\n // Precheck function\n const precheck = useCallback(\n async (input: PrecheckInput): Promise<PrecheckQuote> => {\n try {\n setError(null);\n // Ensure access token exists (refresh via cookie if missing)\n if (!client.getAccessToken()) {\n try {\n await client.post(\"/auth/refresh\", {});\n } catch {\n // ignore; request below will trigger interceptor-based refresh on 401\n }\n }\n const response = await client.post<{ quote: PrecheckQuote }>(\n \"/wallet/precheck\",\n input\n );\n return response.quote;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(\"Precheck failed\");\n const diag = (err as any)?.response?.data?.error?.developerDiagnostics;\n if (diag) {\n // Surface diagnostics for developers\n console.error(\"[volr][precheck] developerDiagnostics:\", diag);\n }\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n // Relay function\n const relay = useCallback(\n async (\n input: RelayInput,\n opts?: { idempotencyKey?: string }\n ): Promise<RelayResult> => {\n try {\n setError(null);\n // Ensure access token exists (refresh via cookie if missing)\n if (!client.getAccessToken()) {\n try {\n await client.post(\"/auth/refresh\", {});\n } catch {\n // ignore; request below will trigger interceptor-based refresh on 401\n }\n }\n const idempotencyKey =\n opts?.idempotencyKey ??\n (typeof crypto !== \"undefined\" && crypto.randomUUID\n ? crypto.randomUUID()\n : `${Date.now()}-${Math.random()}`);\n\n // Serialize BigInt to string for JSON\n const serializedInput = serializeBigIntDeep(input);\n\n const response = await client.post<RelayResult>(\n \"/wallet/relay\",\n serializedInput,\n idempotencyKey\n );\n return response;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(\"Relay failed\");\n const diag = (err as any)?.response?.data?.error?.developerDiagnostics;\n if (diag) {\n console.error(\"[volr][relay] developerDiagnostics:\", diag);\n }\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n // Logout function\n const logout = useCallback(async () => {\n try {\n setError(null);\n client.setAccessToken(null);\n setUser(null);\n setProviderState(null);\n safeStorage.removeItem(STORAGE_KEYS.user);\n safeStorage.removeItem(STORAGE_KEYS.accessToken);\n safeStorage.removeItem(STORAGE_KEYS.provider);\n\n // Broadcast to other tabs\n syncRef.current?.broadcast({ type: \"LOGOUT\" });\n } catch (err) {\n const error = err instanceof Error ? err : new Error(\"Logout failed\");\n setError(error);\n throw error;\n }\n }, [client]);\n\n // External wallet provider event listeners\n useEffect(() => {\n // Only set up listeners for external wallet users\n if (!user) return;\n\n // Check if window.ethereum is available\n if (typeof window === \"undefined\" || !(window as any).ethereum) {\n return;\n }\n\n const ethereum = (window as any).ethereum;\n\n // accountsChanged: Force logout for security\n const handleAccountsChanged = (accounts: string[]) => {\n console.log(\"[Provider] accountsChanged event:\", accounts);\n\n if (accounts.length === 0) {\n // User disconnected wallet\n console.warn(\"[Provider] Wallet disconnected, logging out...\");\n setTimeout(() => logout(), 3000); // 3 second delay\n } else if (\n user.evmAddress &&\n accounts[0].toLowerCase() !== user.evmAddress.toLowerCase()\n ) {\n // Account switched to different address\n console.warn(\"[Provider] Account changed, logging out in 3 seconds...\");\n setTimeout(() => logout(), 3000); // 3 second delay\n }\n };\n\n // chainChanged: Update context\n const handleChainChanged = (chainIdHex: string) => {\n const newChainId = parseInt(chainIdHex, 16);\n console.log(\"[Provider] chainChanged event:\", newChainId);\n\n // Update user's last used chain\n setUser((prev) =>\n prev ? { ...prev, lastWalletChainId: newChainId } : null\n );\n\n // Reload page to avoid state inconsistency (recommended by MetaMask)\n window.location.reload();\n };\n\n // disconnect: Clear provider\n const handleDisconnect = () => {\n console.log(\"[Provider] disconnect event\");\n setProviderState(null);\n safeStorage.removeItem(STORAGE_KEYS.provider);\n };\n\n // Register listeners\n ethereum.on(\"accountsChanged\", handleAccountsChanged);\n ethereum.on(\"chainChanged\", handleChainChanged);\n ethereum.on(\"disconnect\", handleDisconnect);\n\n // Cleanup\n return () => {\n ethereum.removeListener(\"accountsChanged\", handleAccountsChanged);\n ethereum.removeListener(\"chainChanged\", handleChainChanged);\n ethereum.removeListener(\"disconnect\", handleDisconnect);\n };\n }, [user, logout, setUser]);\n\n // Public context value\n const publicValue: VolrContextValue = useMemo(\n () => ({\n config,\n user,\n provider,\n setProvider,\n setUser: (newUser) => {\n setUser(newUser);\n if (newUser) {\n safeStorage.setItem(STORAGE_KEYS.user, JSON.stringify(newUser));\n } else {\n safeStorage.removeItem(STORAGE_KEYS.user);\n }\n },\n chainId,\n precheck,\n relay,\n logout,\n isLoading,\n error,\n }),\n [\n config,\n user,\n provider,\n setProvider,\n chainId,\n precheck,\n relay,\n logout,\n isLoading,\n error,\n ]\n );\n\n // Internal context value\n const internalValue: InternalAuthContextType = useMemo(\n () => ({\n session: {\n accessToken,\n refreshToken: null, // Cookie-based, opaque\n },\n refreshAccessToken: async () => {\n await client.post(\"/auth/refresh\", {});\n // Access token will be updated via auto-recover effect or session sync\n const token = client.getAccessToken();\n setAccessTokenState(token);\n },\n setAccessToken: (token: string) => {\n client.setAccessToken(token);\n setAccessTokenState(token);\n },\n client, // Expose APIClient instance\n }),\n [client, accessToken]\n );\n\n return (\n <VolrContext.Provider value={publicValue}>\n <InternalAuthContext.Provider value={internalValue}>\n {children}\n </InternalAuthContext.Provider>\n </VolrContext.Provider>\n );\n}\n","/**\n * useVolr hook - Access Volr context\n */\n\nimport { useContext } from 'react';\nimport { VolrContext } from '@/react/context';\n\n/**\n * Get Volr context value\n * @throws Error if used outside VolrProvider\n */\nexport function useVolr() {\n const context = useContext(VolrContext);\n if (!context) {\n throw new Error('useVolr must be used within VolrProvider');\n }\n return context;\n}\n\n","/**\n * Input validation utilities\n */\n\nimport type { PrecheckInput, RelayInput, Call } from '@volr/sdk-core';\n\n/**\n * Default validation limits\n */\nexport const DEFAULT_LIMITS = {\n MAX_CALLS: 8,\n MAX_GAS_LIMIT: 10_000_000n,\n MAX_DATA_BYTES: 100_000,\n} as const;\n\n/**\n * Validation config (can be overridden)\n */\nexport type ValidationConfig = {\n maxCalls?: number;\n maxGasLimit?: bigint;\n maxDataBytes?: number;\n};\n\n/**\n * Validate policyId format (0x + 32 bytes)\n */\nexport function validatePolicyId(policyId: string): void {\n if (!/^0x[a-fA-F0-9]{64}$/.test(policyId)) {\n throw new Error('policyId must be 0x-prefixed 32-byte hex string');\n }\n}\n\n/**\n * Validate call value (must be 0)\n */\nexport function validateCallValue(value: bigint): void {\n if (value !== 0n) {\n throw new Error('call.value must be 0 (policy does not allow ETH transfers)');\n }\n}\n\n/**\n * Validate calls array\n */\nexport function validateCalls(\n calls: Call[],\n config: ValidationConfig = {}\n): void {\n const maxCalls = config.maxCalls ?? DEFAULT_LIMITS.MAX_CALLS;\n const maxGasLimit = config.maxGasLimit ?? DEFAULT_LIMITS.MAX_GAS_LIMIT;\n const maxDataBytes = config.maxDataBytes ?? DEFAULT_LIMITS.MAX_DATA_BYTES;\n\n if (!calls || calls.length === 0) {\n throw new Error('calls must not be empty');\n }\n\n if (calls.length > maxCalls) {\n throw new Error(`calls.length (${calls.length}) exceeds maximum (${maxCalls})`);\n }\n\n for (const call of calls) {\n // Validate value\n validateCallValue(call.value);\n\n // Validate gasLimit\n if (call.gasLimit <= 0n) {\n throw new Error('call.gasLimit must be > 0');\n }\n if (call.gasLimit > maxGasLimit) {\n throw new Error(`call.gasLimit (${call.gasLimit}) exceeds maximum (${maxGasLimit})`);\n }\n\n // Validate data length\n const dataBytes = call.data.startsWith('0x')\n ? (call.data.length - 2) / 2\n : call.data.length / 2;\n if (dataBytes > maxDataBytes) {\n throw new Error(`call.data length (${dataBytes} bytes) exceeds maximum (${maxDataBytes} bytes)`);\n }\n\n // Validate target\n if (!call.target.startsWith('0x') || call.target.length !== 42) {\n throw new Error('call.target must be valid Ethereum address');\n }\n }\n}\n\n/**\n * Validate precheck input\n */\nexport function validatePrecheckInput(\n input: PrecheckInput,\n config: ValidationConfig = {}\n): void {\n // Validate policyId\n validatePolicyId(input.auth.policyId);\n\n // Validate calls\n validateCalls(input.calls, config);\n\n // Validate expiresAt\n const now = Math.floor(Date.now() / 1000);\n const skew = 60;\n if (input.auth.expiresAt <= now + skew) {\n throw new Error('auth.expiresAt must be > now + 60s');\n }\n\n // Validate nonce\n if (input.auth.nonce < 0n) {\n throw new Error('auth.nonce must be >= 0');\n }\n}\n\n/**\n * Validate relay input\n */\nexport function validateRelayInput(\n input: RelayInput,\n config: ValidationConfig = {}\n): void {\n // Validate chainId (forbid chainId=0)\n if (input.chainId === 0) {\n throw new Error('chainId cannot be 0');\n }\n\n // Validate precheck input (auth + calls)\n validatePrecheckInput(\n {\n auth: input.auth,\n calls: input.calls,\n },\n config\n );\n\n // Validate authorizationList length (must be exactly 1)\n if (!input.authorizationList || input.authorizationList.length !== 1) {\n throw new Error('authorizationList must have exactly 1 element');\n }\n\n // Validate authorization tuple address matches invoker address\n const authTuple = input.authorizationList[0];\n // This validation ensures the tuple structure is correct\n\n // Validate sessionSig format\n if (!input.sessionSig.startsWith('0x') || input.sessionSig.length !== 132) {\n throw new Error('sessionSig must be 65-byte hex string (0x + 130 hex chars)');\n }\n}\n\n","/**\n * usePrecheck hook - Precheck transaction batch\n */\n\nimport { useState, useCallback } from 'react';\nimport { useVolr } from '@/hooks/useVolr';\nimport { validatePrecheckInput } from '@/utils/validation';\nimport type { PrecheckInput, PrecheckQuote } from '@volr/sdk-core';\n\n/**\n * usePrecheck return type\n */\nexport type UsePrecheckReturn = {\n precheck: (input: PrecheckInput) => Promise<PrecheckQuote>;\n isLoading: boolean;\n error: Error | null;\n};\n\n/**\n * usePrecheck hook\n */\nexport function usePrecheck(): UsePrecheckReturn {\n const { precheck: precheckContext } = useVolr();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const precheck = useCallback(\n async (input: PrecheckInput): Promise<PrecheckQuote> => {\n try {\n setIsLoading(true);\n setError(null);\n\n // Validate input\n validatePrecheckInput(input);\n\n // Call context function\n return await precheckContext(input);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Precheck failed');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [precheckContext]\n );\n\n return {\n precheck,\n isLoading,\n error,\n };\n}\n\n","/**\n * useInternalAuth hook - Access internal auth context\n */\n\nimport { useContext } from 'react';\nimport { InternalAuthContext } from '@/react/context';\n\n/**\n * Get internal auth context value\n * @throws Error if used outside VolrProvider\n */\nexport function useInternalAuth() {\n const context = useContext(InternalAuthContext);\n if (!context) {\n throw new Error('useInternalAuth must be used within VolrProvider');\n }\n return context;\n}\n\n\n","/**\n * useRelay hook - Relay transaction batch\n */\n\nimport { useState, useCallback } from \"react\";\nimport { useVolr } from \"@/hooks/useVolr\";\nimport { useInternalAuth } from \"@/hooks/useInternalAuth\";\nimport {\n signSession,\n signAuthorization,\n getAuthNonce,\n type ExtendedRPCClient,\n} from \"@volr/sdk-core\";\nimport { validateRelayInput } from \"@/utils/validation\";\nimport type { RelayInput, RelayResult, SignerPort } from \"@volr/sdk-core\";\nimport type { NetworkDto } from \"@/types/api\";\n\n/**\n * useRelay return type\n */\nexport type UseRelayReturn = {\n relay: (\n input: Omit<RelayInput, \"sessionSig\" | \"authorizationList\">,\n opts?: {\n signer: SignerPort;\n rpcClient?: ExtendedRPCClient;\n idempotencyKey?: string;\n }\n ) => Promise<RelayResult>;\n isLoading: boolean;\n error: Error | null;\n};\n\n/**\n * useRelay hook\n */\nexport function useRelay(): UseRelayReturn {\n const { relay: relayContext } = useVolr();\n const { client } = useInternalAuth();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const relay = useCallback(\n async (\n input: Omit<RelayInput, \"sessionSig\" | \"authorizationList\">,\n opts?: {\n signer: SignerPort;\n rpcClient?: ExtendedRPCClient;\n idempotencyKey?: string;\n }\n ): Promise<RelayResult> => {\n if (!opts?.signer) {\n throw new Error(\"signer is required\");\n }\n\n try {\n setIsLoading(true);\n setError(null);\n\n // Validate chainId (forbid chainId=0)\n if (input.chainId === 0) {\n throw new Error(\"chainId cannot be 0\");\n }\n\n // 1. Get invoker address from backend (required for both signing + authorization)\n const networkData = await client.get<NetworkDto>(\n `/networks/${input.chainId}`\n );\n\n const invokerAddress = networkData.invokerAddress;\n if (!invokerAddress) {\n throw new Error(\n `Invoker address not configured for chainId ${input.chainId}`\n );\n }\n\n // 2. Sign session (requires invoker address for domain binding)\n // EIP-7702: User EOA가 verifyingContract가 됩니다.\n const { sessionSig } = await signSession({\n signer: opts.signer,\n from: input.from,\n auth: input.auth,\n calls: input.calls,\n invokerAddress: input.from, \n });\n\n // 3. Get auth nonce (sponsored mode)\n if (!opts.rpcClient) {\n throw new Error(\"rpcClient is required for relay\");\n }\n const authNonce = await getAuthNonce(\n opts.rpcClient,\n input.from,\n \"sponsored\"\n );\n \n \n\n // 4. Sign authorization tuple (EIP-7702 path)\n // invokerAddress가 있으면 EIP-7702를 지원하는 것으로 간주\n const authorizationTuple = await signAuthorization({\n signer: opts.signer,\n chainId: input.chainId,\n address: invokerAddress,\n nonce: authNonce,\n });\n\n // 5. Validate invoker address matches authorization tuple\n if (\n authorizationTuple.address.toLowerCase() !==\n invokerAddress.toLowerCase()\n ) {\n throw new Error(\n `Authorization tuple address mismatch: expected ${invokerAddress}, got ${authorizationTuple.address}`\n );\n }\n\n // 6. Build relay input with authorization tuple\n const relayInput: RelayInput = {\n ...input,\n sessionSig,\n authorizationList: [authorizationTuple],\n };\n\n // 7. Validate relay input\n validateRelayInput(relayInput);\n\n // 8. Call relay context function\n return await relayContext(relayInput, {\n idempotencyKey: opts.idempotencyKey,\n });\n } catch (err) {\n const error = err instanceof Error ? err : new Error(\"Relay failed\");\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [relayContext, client]\n );\n\n return {\n relay,\n isLoading,\n error,\n };\n}\n","/**\n * Hex string normalization utilities\n */\n\n/**\n * Normalize hex string to lowercase with 0x prefix\n * Ensures consistent format for hashing and comparison\n */\nexport function normalizeHex(value: `0x${string}` | string): `0x${string}` {\n const hex = value.startsWith('0x') ? value.slice(2) : value;\n return `0x${hex.toLowerCase()}` as `0x${string}`;\n}\n\n/**\n * Normalize multiple hex strings\n */\nexport function normalizeHexArray(values: (`0x${string}` | string)[]): `0x${string}`[] {\n return values.map(normalizeHex);\n}\n\n\n\n\n\n\n\n","/**\n * Call builder utilities for better developer experience\n */\n\nimport { encodeFunctionData, type Abi, type Address } from 'viem';\nimport type { Call } from '@volr/sdk-core';\n\n/**\n * Options for building a call from function data\n */\nexport type BuildCallOptions = {\n target: Address;\n abi: Abi;\n functionName: string;\n args?: readonly unknown[];\n value?: bigint;\n gasLimit?: bigint;\n /**\n * Estimate gas automatically (future feature)\n * Currently noop - will use precheck result to inject gasLimit\n */\n estimateGas?: boolean;\n};\n\n/**\n * Build a Call object from function data (auto-encodes data)\n * \n * @example\n * ```ts\n * const call = buildCall({\n * target: '0x...',\n * abi: erc20Abi,\n * functionName: 'transfer',\n * args: ['0x...', BigInt(1000000)],\n * value: BigInt(0),\n * gasLimit: BigInt(100000),\n * estimateGas: true, // Future: will auto-estimate from precheck\n * });\n * ```\n */\nexport function buildCall(options: BuildCallOptions): Call {\n const data = encodeFunctionData({\n abi: options.abi,\n functionName: options.functionName,\n args: options.args,\n });\n\n // Future: if estimateGas=true, will use precheck result to set gasLimit\n // For now, this is a noop. Gas estimation is handled during the sendTransaction flow.\n if (options.estimateGas) {\n // Pass\n }\n\n return {\n target: options.target,\n data,\n value: options.value ?? BigInt(0),\n gasLimit: options.gasLimit ?? BigInt(0),\n };\n}\n\n/**\n * Build multiple calls from function data\n * \n * @example\n * ```ts\n * const calls = buildCalls([\n * {\n * target: tokenAddress,\n * abi: erc20Abi,\n * functionName: 'approve',\n * args: [spender, amount],\n * gasLimit: BigInt(50000),\n * },\n * {\n * target: routerAddress,\n * abi: routerAbi,\n * functionName: 'swap',\n * args: [tokenIn, tokenOut, amountIn],\n * gasLimit: BigInt(200000),\n * },\n * ]);\n * ```\n */\nexport function buildCalls(options: BuildCallOptions[]): Call[] {\n return options.map(buildCall);\n}\n\n","import type { Address, PublicClient } from 'viem';\nimport type { ExtendedRPCClient } from '@volr/sdk-core';\n\n/**\n * Create ExtendedRPCClient from viem PublicClient\n */\nexport function createExtendedRPCClient(publicClient: PublicClient): ExtendedRPCClient {\n return {\n call: async (args: { to: `0x${string}`; data: `0x${string}` }) => {\n const result = await publicClient.call({\n to: args.to,\n data: args.data,\n });\n return (result?.data || '0x') as `0x${string}`;\n },\n getTransactionCount: async (address: Address, blockTag?: 'pending' | 'latest') => {\n const count = await publicClient.getTransactionCount({\n address,\n blockTag: blockTag || 'pending',\n });\n return BigInt(count);\n },\n };\n}\n\n\n\n","import type { APIClient } from '@/headless/client';\n\n/**\n * Network info cache (in-memory)\n */\nconst networkCache = new Map<\n number,\n { rpcUrl?: string; name?: string; timestamp: number }\n>();\nconst CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes\n\ntype CreateGetRpcUrlDeps = {\n client: APIClient;\n rpcOverrides?: Record<string, string>;\n};\n\n/**\n * Factory to create a getRpcUrl resolver bound to provided deps.\n * Priority: 1) rpcOverrides 2) Backend API (cached)\n */\nexport function createGetRpcUrl(deps: CreateGetRpcUrlDeps) {\n const { client, rpcOverrides } = deps;\n\n return async function getRpcUrl(chainId: number): Promise<string> {\n // Check overrides first\n const overrideUrl = rpcOverrides?.[chainId.toString()];\n if (overrideUrl) {\n return overrideUrl;\n }\n\n // Check cache\n const cached = networkCache.get(chainId);\n if (cached && cached.rpcUrl && Date.now() - cached.timestamp < CACHE_TTL_MS) {\n return cached.rpcUrl;\n }\n\n // Fetch from backend API\n const response = await client.get<{\n chainId: number;\n name: string;\n rpcUrl?: string;\n }>(`/networks/${chainId}?includeRpcUrl=true`);\n\n if (!response.rpcUrl) {\n throw new Error(\n `RPC URL not available for chainId ${chainId}. Please provide it in config.rpcOverrides[${chainId}]`\n );\n }\n\n networkCache.set(chainId, {\n rpcUrl: response.rpcUrl,\n name: response.name,\n timestamp: Date.now(),\n });\n\n return response.rpcUrl;\n };\n}\n\nexport type NetworkInfo = {\n name: string;\n rpcUrl?: string;\n};\n\ntype CreateGetNetworkInfoDeps = {\n client: APIClient;\n rpcOverrides?: Record<string, string>;\n};\n\n/**\n * Factory to create a getNetworkInfo resolver bound to provided deps.\n * Returns chain name and optionally RPC URL.\n * Priority: 1) rpcOverrides (for RPC URL) 2) Backend API (cached)\n */\nexport function createGetNetworkInfo(deps: CreateGetNetworkInfoDeps) {\n const { client } = deps;\n\n return async function getNetworkInfo(\n chainId: number,\n includeRpcUrl = false\n ): Promise<NetworkInfo> {\n // Check cache first\n const cached = networkCache.get(chainId);\n if (cached && Date.now() - cached.timestamp < CACHE_TTL_MS) {\n return {\n name: cached.name || `Chain ${chainId}`,\n rpcUrl: includeRpcUrl ? cached.rpcUrl : undefined,\n };\n }\n\n // Fetch from backend API\n const response = await client.get<{\n chainId: number;\n name: string;\n rpcUrl?: string;\n }>(`/networks/${chainId}${includeRpcUrl ? \"?includeRpcUrl=true\" : \"\"}`);\n\n // Update cache\n networkCache.set(chainId, {\n name: response.name,\n rpcUrl: response.rpcUrl,\n timestamp: Date.now(),\n });\n\n return {\n name: response.name,\n rpcUrl: includeRpcUrl ? response.rpcUrl : undefined,\n };\n };\n}\n\n\n\n","import type { Call } from '@volr/sdk-core';\nimport { ZERO_HASH } from '@volr/sdk-core';\n\n/**\n * Validate policyId format (must be 32 bytes = 64 hex chars + 0x prefix)\n * Zero policyId (0x0000...0000) is not allowed.\n */\nexport function validatePolicyId(policyId: `0x${string}` | undefined): void {\n if (!policyId) {\n // policyId가 없으면 백엔드에서 자동으로 계산하므로 허용\n return;\n }\n if (!policyId.startsWith('0x')) {\n throw new Error('policyId must start with 0x');\n }\n const hexPart = policyId.slice(2);\n if (hexPart.length !== 64) {\n throw new Error(`policyId must be 32 bytes (64 hex chars), got ${hexPart.length / 2} bytes`);\n }\n if (!/^[0-9a-f]+$/i.test(hexPart)) {\n throw new Error('policyId must be valid hex string');\n }\n // Zero policyId는 허용하지 않음\n if (policyId.toLowerCase() === ZERO_HASH.toLowerCase()) {\n throw new Error('Zero policyId is not allowed. Omit policyId to use project-specific policyId from backend.');\n }\n}\n\n/**\n * Validate calls array\n */\nexport function validateCalls(calls: Call[]): void {\n if (calls.length === 0) {\n throw new Error('calls array must not be empty');\n }\n if (calls.length > 8) {\n throw new Error('calls array must not exceed 8 items');\n }\n for (const call of calls) {\n if (call.value > 0n) {\n console.warn('Call has non-zero value. Most policies forbid ETH transfers.');\n }\n }\n}\n\n\n\n","import { getAddress } from 'viem';\nimport { normalizeHex } from '@/utils/normalize';\nimport type { Call } from '@volr/sdk-core';\n\nexport function defaultGasLimit(data: `0x${string}`): bigint {\n const normalized = normalizeHex(data);\n return normalized === '0x' || normalized === '0x0' ? 21000n : 100000n;\n}\n\nexport function normalizeCall(call: Call): Call {\n const normalizedTarget = getAddress(call.target);\n const normalizedData = normalizeHex(call.data);\n const value = call.value ?? 0n;\n const gasLimit = call.gasLimit && call.gasLimit > 0n ? call.gasLimit : defaultGasLimit(normalizedData);\n\n return {\n target: normalizedTarget,\n data: normalizedData,\n value,\n gasLimit,\n };\n}\n\nexport function normalizeCalls(calls: Call[]): Call[] {\n return calls.map(normalizeCall);\n}\n\n\n\n","import type { Address, PublicClient } from 'viem';\nimport type { Call } from '@volr/sdk-core';\n\nfunction extractErrorMessage(err: unknown): string {\n if (err && typeof err === 'object') {\n const e = err as any;\n const parts: string[] = [];\n if (typeof e.shortMessage === 'string') parts.push(e.shortMessage);\n if (typeof e.message === 'string') parts.push(e.message);\n if (typeof e.cause?.message === 'string') parts.push(e.cause.message);\n if (typeof e.details === 'string') parts.push(e.details);\n const msg = parts.filter(Boolean).join(' | ');\n if (msg) return msg;\n }\n try {\n return String(err);\n } catch {\n return 'Unknown error';\n }\n}\n\nfunction isIgnorableFundingError(err: unknown, message: string): boolean {\n const m = message.toLowerCase();\n const e = err as any;\n const name = typeof e?.name === 'string' ? e.name.toLowerCase() : '';\n \n // Check for viem-specific error classes first (most reliable)\n // viem throws InsufficientFundsError for balance issues\n if (name === 'insufficientfundserror' || name.includes('insufficientfunds')) {\n return true;\n }\n \n // Check error code if available (viem uses error codes)\n // Common codes: INSUFFICIENT_FUNDS, UNPREDICTABLE_GAS_LIMIT (for reverts)\n if (typeof e?.code === 'string') {\n const code = e.code.toLowerCase();\n // Explicitly exclude revert-related error codes\n if (code.includes('execution_reverted') || code.includes('call_exception')) {\n return false; // This is a revert, not a funding issue\n }\n if (code.includes('insufficient_funds')) {\n return true;\n }\n }\n \n // Check for specific funding error messages (must be precise)\n // Only match messages that explicitly mention balance/funds issues\n const fundingPatterns = [\n 'insufficient funds for gas * price',\n 'insufficient funds for gas',\n 'for gas * price + value',\n 'not enough funds for l1 fee',\n 'insufficient funds for l1 fee',\n 'insufficient balance for gas',\n 'account balance too low',\n ];\n \n // Must match a funding pattern AND not contain revert indicators\n const hasFundingPattern = fundingPatterns.some(pattern => m.includes(pattern));\n const hasRevertIndicator = m.includes('revert') || \n m.includes('execution reverted') ||\n m.includes('call exception') ||\n m.includes('vm execution error');\n \n // Only ignore if it's a funding pattern AND not a revert\n return hasFundingPattern && !hasRevertIndicator;\n}\n\nexport async function preflightEstimate(\n publicClient: PublicClient,\n from: Address,\n calls: Call[],\n opts?: { tolerateFundingErrors?: boolean }\n): Promise<void> {\n for (let i = 0; i < calls.length; i++) {\n const c = calls[i]!;\n try {\n await publicClient.estimateGas({\n account: from,\n to: c.target,\n data: c.data,\n value: c.value ?? 0n,\n });\n } catch (e) {\n const message = extractErrorMessage(e);\n const tolerateFunding = opts?.tolerateFundingErrors !== false;\n \n // Check if this is an ignorable funding error\n const isFundingError = isIgnorableFundingError(e, message);\n \n if (tolerateFunding && isFundingError) {\n // Before ignoring, run a static call to ensure the contract logic itself doesn't revert.\n try {\n await publicClient.call({\n account: from,\n to: c.target,\n data: c.data,\n value: c.value ?? 0n,\n });\n // Static call succeeded, so this really is just a funding issue (no logic revert).\n console.log(\n `[preflightEstimate] Ignoring funding error for call #${i} (target ${c.target}): ${message}`\n );\n continue;\n } catch (callError) {\n const callMessage = extractErrorMessage(callError);\n console.error(\n `[preflightEstimate] Static call after funding error also failed for call #${i} (target ${c.target}):`,\n {\n originalError: { message, errorName: (e as any)?.name, errorCode: (e as any)?.code },\n callError: {\n message: callMessage,\n name: (callError as any)?.name,\n code: (callError as any)?.code,\n },\n }\n );\n throw new Error(\n `Preflight failed (call #${i} target ${c.target}): ${callMessage}`\n );\n }\n }\n \n // For non-funding errors (e.g., logic reverts), surface early to avoid prompting passkey.\n console.error(\n `[preflightEstimate] Preflight failed for call #${i} (target ${c.target}):`,\n {\n message,\n errorName: (e as any)?.name,\n errorCode: (e as any)?.code,\n isFundingError,\n tolerateFunding,\n }\n );\n throw new Error(`Preflight failed (call #${i} target ${c.target}): ${message}`);\n }\n }\n}\n\n\n","import { selectSigner, type SignerPort, type WalletProviderPort, type SelectSignerContext } from '@volr/sdk-core';\nimport { restorePasskey } from '@/headless/passkey-restore';\nimport type { APIClient } from '@/headless/client';\nimport type { VolrUser } from '@/react/context';\n\nexport async function resolveSigner(input: {\n explicitSigner?: SignerPort;\n provider: WalletProviderPort | null;\n chainId: number;\n client: APIClient;\n user: VolrUser | null | undefined;\n setProvider: (p: WalletProviderPort) => Promise<void> | void;\n}): Promise<{ signer: SignerPort; activeProvider: WalletProviderPort | null }> {\n const { explicitSigner, provider, chainId, client, user, setProvider } = input;\n\n if (explicitSigner) {\n return { signer: explicitSigner, activeProvider: null };\n }\n\n if (provider) {\n await provider.ensureSession({ interactive: true, force: true });\n const signerContext: SelectSignerContext = {\n provider,\n chainId,\n // Citrea testnet (5115) doesn't support P-256\n p256Hint: false,\n };\n const signer = await selectSigner(signerContext);\n return { signer, activeProvider: provider };\n }\n\n // Try restore passkey provider\n if (user?.keyStorageType === 'passkey' && user.blobUrl && user.prfInput && user.id) {\n const { provider: restoredProvider } = await restorePasskey({\n client,\n userId: user.id,\n blobUrl: user.blobUrl,\n prfInput: user.prfInput,\n credentialId: user.credentialId,\n });\n\n await setProvider(restoredProvider);\n\n await restoredProvider.ensureSession({ interactive: true, force: true });\n const signerContext: SelectSignerContext = {\n provider: restoredProvider,\n chainId,\n p256Hint: false,\n };\n const signer = await selectSigner(signerContext);\n return { signer, activeProvider: restoredProvider };\n }\n\n throw new Error(\n 'No wallet provider configured. Please set up a Passkey provider to sign transactions. SIWE is authentication-only.'\n );\n}\n\n\n\n","/**\n * Default constants for wallet facade\n */\n\n/**\n * Default session expiry time in seconds (15 minutes)\n */\nexport const DEFAULT_EXPIRES_IN_SEC = 900;\n\n/**\n * Default relay mode\n */\nexport const DEFAULT_MODE: 'sponsored' | 'self' = 'sponsored';\n\n/**\n * Generate default idempotency key\n * Uses crypto.randomUUID() if available, otherwise falls back to time+random\n */\nexport function defaultIdempotencyKey(): string {\n const c = (globalThis as any).crypto;\n return c?.randomUUID?.() ?? `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;\n}\n\n\n\n\n\n\n\n","import type { Call, SessionAuth, PrecheckQuote } from '@volr/sdk-core';\nimport { ZERO_HASH } from '@volr/sdk-core';\nimport { normalizeHex } from '@/utils/normalize';\nimport { DEFAULT_EXPIRES_IN_SEC } from '@/utils/defaults';\n\n// EIP-7702 오버헤드 및 Invoker 로직 비용을 고려한 버퍼\nconst GAS_CAP_BUFFER = 150_000n;\n\nexport function computeTotalGasCap(calls: Call[]): bigint {\n return calls.reduce((sum, c) => sum + (c.gasLimit ?? 0n), 0n) + GAS_CAP_BUFFER;\n}\n\nexport function buildTempAuth(input: {\n chainId: number;\n from: `0x${string}`;\n policyId: `0x${string}`;\n calls: Call[];\n expiresInSec?: number;\n sessionId?: bigint;\n policySnapshotHash?: `0x${string}`;\n gasLimitMax?: bigint;\n maxFeePerGas?: bigint;\n maxPriorityFeePerGas?: bigint;\n}): SessionAuth {\n const expiresAt = Math.floor(Date.now() / 1000) + (input.expiresInSec ?? DEFAULT_EXPIRES_IN_SEC);\n const totalGasCap = computeTotalGasCap(input.calls);\n \n // Default values for required fields\n const sessionId = input.sessionId ?? 0n;\n const policySnapshotHash = input.policySnapshotHash ?? ZERO_HASH;\n const gasLimitMax = input.gasLimitMax ?? totalGasCap;\n const maxFeePerGas = input.maxFeePerGas ?? 1000000000n; // 1 gwei default\n const maxPriorityFeePerGas = input.maxPriorityFeePerGas ?? 1000000n; // 0.001 gwei default\n\n return {\n chainId: input.chainId,\n sessionKey: input.from,\n sessionId,\n expiresAt,\n policyId: normalizeHex(input.policyId),\n nonce: 0n,\n policySnapshotHash,\n gasLimitMax,\n maxFeePerGas,\n maxPriorityFeePerGas,\n totalGasCap,\n };\n}\n\nexport function finalizeAuthWithNonce(tempAuth: SessionAuth, quote?: PrecheckQuote): SessionAuth {\n let finalNonce: bigint;\n if (quote?.currentOpNonce !== undefined && quote.currentOpNonce !== null && quote.currentOpNonce !== '') {\n const currentNonce = BigInt(quote.currentOpNonce);\n finalNonce = currentNonce + 1n;\n } else {\n finalNonce = BigInt(Math.floor(Date.now() / 1000));\n }\n\n const finalAuth = {\n ...tempAuth,\n nonce: finalNonce,\n };\n\n // Update policyId from backend (always provided, project-specific policyId)\n if (quote?.policyId) {\n finalAuth.policyId = normalizeHex(quote.policyId);\n }\n\n // Update policySnapshotHash from backend (always provided, zero hash if policy not initialized)\n if (quote?.policySnapshotHash) {\n finalAuth.policySnapshotHash = quote.policySnapshotHash;\n }\n\n return finalAuth;\n}\n\n\n\n","import type { APIClient } from '@/headless/client';\nimport type { RelayResult } from '@volr/sdk-core';\nimport type { TransactionResponse } from '@/types/transactions';\n\n/**\n * Poll transaction status until CONFIRMED or FAILED\n */\nexport async function pollTransactionStatus(\n txId: string,\n client: APIClient,\n maxAttempts = 60,\n intervalMs = 5000\n): Promise<RelayResult> {\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n const response = await client.get<TransactionResponse>(`/wallet/transactions/${txId}`);\n const { status, txHash } = response;\n\n if (status === 'CONFIRMED') {\n console.log(`[pollTransactionStatus] Transaction ${txId} confirmed with txHash ${txHash}`);\n return {\n txId,\n status: 'CONFIRMED',\n txHash: txHash as `0x${string}`,\n };\n }\n\n if (status === 'FAILED') {\n console.error(`[pollTransactionStatus] Transaction ${txId} failed`);\n const diag = response.meta?.developerDiagnostics;\n if (diag) {\n console.error('[volr][relay] developerDiagnostics:', diag);\n }\n return {\n txId,\n status: 'FAILED',\n txHash: txHash as `0x${string}` | undefined,\n };\n }\n\n console.log(`[pollTransactionStatus] Transaction ${txId} is ${status}, attempt ${attempt + 1}/${maxAttempts}`);\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n } catch (error) {\n console.error(`[pollTransactionStatus] Error polling transaction ${txId}:`, error);\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n }\n\n console.warn(`[pollTransactionStatus] Polling timeout for transaction ${txId}`);\n return {\n txId,\n status: 'PENDING',\n };\n}\n\n\n\n","import type { Address, PublicClient } from 'viem';\nimport type {\n Call,\n ExtendedRPCClient,\n PrecheckInput,\n PrecheckQuote,\n RelayInput,\n RelayResult,\n SignerPort,\n WalletProviderPort,\n} from '@volr/sdk-core';\nimport { ZERO_HASH } from '@volr/sdk-core';\nimport type { APIClient } from '@/headless/client';\nimport type { VolrUser } from '@/react/context';\nimport type { SendTxOptions } from '@/types/wallet';\nimport type { AuthRefreshResponseDto } from '@/types/api';\nimport { validatePolicyId, validateCalls } from '@/utils/tx-validation';\nimport { normalizeCalls } from '@/wallet/normalize';\nimport { preflightEstimate } from '@/wallet/preflight';\nimport { resolveSigner } from '@/wallet/signer';\nimport { buildTempAuth, finalizeAuthWithNonce } from '@/wallet/auth';\nimport { defaultIdempotencyKey, DEFAULT_EXPIRES_IN_SEC } from '@/utils/defaults';\nimport { pollTransactionStatus } from '@/utils/tx-polling';\n\ntype RelayFn = (\n input: Omit<RelayInput, 'sessionSig' | 'authorizationList'>,\n opts: { signer: SignerPort; rpcClient: ExtendedRPCClient; idempotencyKey?: string }\n) => Promise<RelayResult>;\n\nexport async function sendCalls(args: {\n chainId: number;\n from: Address;\n calls: Call[];\n opts: SendTxOptions;\n deps: {\n publicClient: PublicClient;\n rpcClient: ExtendedRPCClient;\n precheck: (input: PrecheckInput) => Promise<PrecheckQuote>;\n relay: RelayFn;\n client: APIClient;\n user: VolrUser | null;\n provider: WalletProviderPort | null;\n setProvider: (p: WalletProviderPort) => Promise<void> | void;\n };\n}): Promise<RelayResult> {\n const { chainId, from, calls, opts, deps } = args;\n\n if (chainId === 0) {\n throw new Error('chainId cannot be 0');\n }\n\n // Zero policyId는 undefined로 취급 (백엔드에서 프로젝트별 policyId를 받아옴)\n const effectivePolicyId =\n opts.policyId?.toLowerCase() === ZERO_HASH.toLowerCase()\n ? undefined\n : opts.policyId;\n\n validatePolicyId(effectivePolicyId);\n const normalizedFrom = from;\n const normalizedCalls = normalizeCalls(calls);\n validateCalls(normalizedCalls);\n\n // Ensure user data is fresh before resolving signer\n // This prevents first transaction failures when provider hasn't been restored yet\n let currentUser = deps.user;\n if (deps.user?.keyStorageType === 'passkey' && !deps.provider) {\n try {\n const refreshResponse = await deps.client.post<AuthRefreshResponseDto>(\n '/auth/refresh',\n {},\n );\n if (refreshResponse.user) {\n // Use refreshed user data for resolveSigner\n currentUser = refreshResponse.user as VolrUser;\n }\n } catch (error) {\n // If refresh fails, continue anyway - resolveSigner will handle it\n console.warn(\n '[sendCalls] Failed to refresh user data before transaction:',\n error,\n );\n }\n }\n\n if (opts.preflight !== false) {\n const tolerateFundingErrors = (opts.mode ?? 'sponsored') !== 'self';\n await preflightEstimate(\n deps.publicClient,\n normalizedFrom,\n normalizedCalls,\n { tolerateFundingErrors },\n );\n }\n\n // policyId가 없거나 zero이면 precheck를 먼저 호출해서 프로젝트별 policyId를 받습니다.\n // 이 단계에서는 signer를 아직 resolve하지 않으므로 패스키 프롬프트가 뜨지 않는다.\n let projectPolicyId: `0x${string}`;\n if (!effectivePolicyId) {\n // 임시 auth로 precheck 호출 (policyId는 zero hash로 설정)\n const tempAuthForPrecheck = buildTempAuth({\n chainId,\n from: normalizedFrom,\n policyId: ZERO_HASH,\n calls: normalizedCalls,\n expiresInSec: opts.expiresInSec ?? DEFAULT_EXPIRES_IN_SEC,\n });\n\n let precheckQuote: PrecheckQuote;\n try {\n // 정책이 없거나 잘못 구성된 경우, 여기서 바로 4xx 에러를 받도록 그대로 전파한다.\n precheckQuote = await deps.precheck({\n auth: tempAuthForPrecheck,\n calls: normalizedCalls,\n });\n } catch (err) {\n // AxiosError 등 원본 에러 객체를 그대로 던져서 error.response.data.error.code 를 소비자가 볼 수 있게 한다.\n throw err instanceof Error ? err : new Error(String(err));\n }\n\n // 타입 정의에는 policyId가 있지만, 런타임에서 확인\n const quotePolicyId = (precheckQuote as any).policyId as\n | `0x${string}`\n | undefined;\n if (!quotePolicyId) {\n throw new Error('Backend did not return policyId in precheck response');\n }\n projectPolicyId = quotePolicyId;\n } else {\n projectPolicyId = effectivePolicyId;\n }\n\n const tempAuth = buildTempAuth({\n chainId,\n from: normalizedFrom,\n policyId: projectPolicyId,\n calls: normalizedCalls,\n expiresInSec: opts.expiresInSec ?? DEFAULT_EXPIRES_IN_SEC,\n });\n\n let quote: PrecheckQuote | undefined;\n try {\n // 두 번째 precheck에서도 정책/시뮬레이션 레벨의 문제를 서명 전에 최대한 잡는다.\n quote = await deps.precheck({ auth: tempAuth, calls: normalizedCalls });\n } catch (err) {\n console.warn('[useVolrWallet] Precheck failed:', err);\n // 여기서는 기존 동작을 유지하여 quote 없이도 진행하되,\n // 정책 미초기화(WALLET_POLICY_NOT_INITIALIZED) 같은 치명적 에러는 첫 번째 precheck에서 이미 막힌다.\n }\n\n const auth = finalizeAuthWithNonce(tempAuth, quote);\n const idempotencyKey = opts.idempotencyKey ?? defaultIdempotencyKey();\n\n // Signer 및 provider는 모든 사전 검증(preflight / precheck)이 끝난 뒤에만 준비한다.\n // 이렇게 해야 어차피 실패할 트랜잭션에서 패스키 프롬프트가 뜨지 않는다.\n let signer: SignerPort;\n let activeProvider: WalletProviderPort | null = null;\n\n try {\n const resolved = await resolveSigner({\n explicitSigner: opts.signer,\n provider: deps.provider,\n chainId,\n client: deps.client,\n user: currentUser,\n setProvider: deps.setProvider,\n });\n signer = resolved.signer;\n activeProvider = resolved.activeProvider;\n\n const result = await deps.relay(\n { chainId, from: normalizedFrom, auth, calls: normalizedCalls },\n { signer, rpcClient: deps.rpcClient, idempotencyKey },\n );\n\n if (result.status === 'QUEUED' || result.status === 'PENDING') {\n console.log(\n `[useVolrWallet] Transaction ${result.txId} is ${result.status}, starting polling...`,\n );\n return await pollTransactionStatus(result.txId, deps.client);\n }\n return result;\n } finally {\n if (activeProvider && activeProvider.lock) {\n try {\n await activeProvider.lock();\n } catch {\n // ignore lock errors\n }\n }\n }\n}\n\n\n","/**\n * useVolrWallet hook - Developer-friendly facade for wallet operations\n */\n\nimport { useCallback } from 'react';\nimport { useVolr } from '@/hooks/useVolr';\nimport { usePrecheck } from '@/hooks/usePrecheck';\nimport { useRelay } from '@/hooks/useRelay';\nimport { useInternalAuth } from '@/hooks/useInternalAuth';\nimport {\n type ExtendedRPCClient,\n type Call,\n type RelayResult,\n} from '@volr/sdk-core';\nimport { createPublicClient, http, type PublicClient, getAddress } from 'viem';\nimport { normalizeHex } from '@/utils/normalize';\nimport { buildCalls, type BuildCallOptions } from '@/utils/call-builder';\nimport { createExtendedRPCClient } from '@/utils/rpc';\nimport type { SendTxOptions } from '@/types/wallet';\nimport { createGetRpcUrl } from '@/utils/network';\nimport { sendCalls } from '@/wallet/sender';\n\n/**\n * sendBatch function overloads\n */\ntype SendBatchOverloads = {\n /**\n * Send a batch of pre-built Call objects\n * @param calls - Array of Call objects with target, data, value, gasLimit\n * @param opts - Transaction options including policyId, expiresInSec, from\n * @example\n * ```ts\n * const calls: Call[] = [\n * { target: '0x...', data: '0x...', value: 0n, gasLimit: 100000n }\n * ];\n * await evm(chainId).sendBatch(calls, { policyId: '0x...' });\n * ```\n */\n (calls: Call[], opts: SendTxOptions & { from?: `0x${string}` }): Promise<RelayResult>;\n /**\n * Send a batch by providing BuildCallOptions - calls will be built internally\n * @param calls - Array of BuildCallOptions with target, abi, functionName, args\n * @param opts - Transaction options including policyId, expiresInSec, from\n * @example\n * ```ts\n * await evm(chainId).sendBatch(\n * [\n * {\n * target: tokenAddress,\n * abi: erc20Abi,\n * functionName: 'transfer',\n * args: [recipient, amount],\n * gasLimit: 100000n,\n * }\n * ],\n * { policyId: '0x...' }\n * );\n * ```\n */\n (calls: BuildCallOptions[], opts: SendTxOptions & { from?: `0x${string}` }): Promise<RelayResult>;\n};\n\n/**\n * useVolrWallet hook return type\n */\nexport type UseVolrWalletReturn = {\n evm: (chainId: number) => {\n readContract: <\n TAbi extends readonly unknown[],\n TFunctionName extends string,\n TReturnType = Awaited<ReturnType<PublicClient['readContract']>>\n >(\n args: Parameters<PublicClient['readContract']>[0] & {\n abi: TAbi;\n functionName: TFunctionName;\n }\n ) => Promise<TReturnType>;\n sendTransaction: (\n tx: { to: `0x${string}`; data: `0x${string}`; value?: bigint },\n opts: SendTxOptions\n ) => Promise<RelayResult>;\n sendBatch: SendBatchOverloads;\n };\n};\n\n/**\n * useVolrWallet hook - Developer-friendly facade\n */\nexport function useVolrWallet(): UseVolrWalletReturn {\n const { user, config, provider, setProvider } = useVolr();\n const { precheck } = usePrecheck();\n const { relay } = useRelay();\n const { client } = useInternalAuth();\n\n // Get RPC URL resolver bound to current deps\n const getRpcUrl = useCallback(\n createGetRpcUrl({ client, rpcOverrides: config.rpcOverrides }),\n [client, config.rpcOverrides]\n );\n\n const evm = useCallback(\n (chainId: number) => {\n // Validate chainId (forbid chainId=0)\n if (chainId === 0) {\n throw new Error('chainId cannot be 0');\n }\n\n // Create a promise-based wrapper that resolves RPC URL lazily\n let publicClient: PublicClient | null = null;\n let extendedRpcClient: ExtendedRPCClient | null = null;\n\n const ensureRpcClient = async () => {\n if (!publicClient) {\n // Get RPC URL (from config override or backend API)\n const rpcUrl = await getRpcUrl(chainId);\n \n publicClient = createPublicClient({\n transport: http(rpcUrl),\n });\n extendedRpcClient = createExtendedRPCClient(publicClient);\n }\n return { publicClient, extendedRpcClient };\n };\n\n return {\n readContract: async <\n TAbi extends readonly unknown[],\n TFunctionName extends string,\n TReturnType = Awaited<ReturnType<PublicClient['readContract']>>\n >(\n args: Parameters<PublicClient['readContract']>[0] & {\n abi: TAbi;\n functionName: TFunctionName;\n }\n ): Promise<TReturnType> => {\n const { publicClient: client } = await ensureRpcClient();\n // viem's readContract has complex type inference that requires type assertion\n // We use 'unknown' instead of 'any' for better type safety\n return client.readContract(args as Parameters<PublicClient['readContract']>[0]) as Promise<TReturnType>;\n },\n\n sendTransaction: async (\n tx: { to: `0x${string}`; data: `0x${string}`; value?: bigint; gasLimit?: bigint },\n opts: SendTxOptions\n ) => {\n const { publicClient, extendedRpcClient: rpcClient } = await ensureRpcClient();\n\n const from = opts.from ?? user?.evmAddress;\n if (!from) {\n throw new Error(\n 'from address is required. Provide it in opts.from or set user.evmAddress in VolrProvider. ' +\n 'If you haven\\'t set up a wallet provider yet, please complete the onboarding flow.'\n );\n }\n\n // Build minimal call; normalization and gas defaults applied downstream\n const call: Call = {\n target: getAddress(tx.to),\n data: normalizeHex(tx.data),\n value: tx.value ?? 0n,\n gasLimit: tx.gasLimit ?? 0n,\n };\n\n return await sendCalls({\n chainId,\n from: getAddress(from),\n calls: [call],\n opts,\n deps: {\n publicClient: publicClient!,\n rpcClient: rpcClient!,\n precheck,\n relay,\n client,\n user: user ?? null,\n provider: provider ?? null,\n setProvider,\n },\n });\n },\n\n sendBatch: (async (\n calls: Call[] | BuildCallOptions[],\n opts: SendTxOptions & { from?: `0x${string}` }\n ): Promise<RelayResult> => {\n const { publicClient, extendedRpcClient: rpcClient } = await ensureRpcClient();\n\n const from = opts.from ?? user?.evmAddress;\n if (!from) {\n throw new Error(\n 'from address is required. Provide it in opts.from or set user.evmAddress in VolrProvider. ' +\n 'If you haven\\'t set up a wallet provider yet, please complete the onboarding flow.'\n );\n }\n\n // Type guard: Check if calls is Call[] (has 'data' property) or BuildCallOptions[] (has 'abi' property)\n const isCallArray = (calls: Call[] | BuildCallOptions[]): calls is Call[] => {\n return Array.isArray(calls) && calls.length > 0 && 'data' in calls[0] && !('abi' in calls[0]);\n };\n\n const builtCalls: Call[] = isCallArray(calls)\n ? calls\n : buildCalls(calls);\n\n return await sendCalls({\n chainId,\n from: getAddress(from),\n calls: builtCalls.map((c) => ({\n target: getAddress(c.target),\n data: normalizeHex(c.data),\n value: c.value ?? 0n,\n gasLimit: c.gasLimit ?? 0n,\n })),\n opts,\n deps: {\n publicClient: publicClient!,\n rpcClient: rpcClient!,\n precheck,\n relay,\n client,\n user: user ?? null,\n provider: provider ?? null,\n setProvider,\n },\n });\n }) as SendBatchOverloads,\n };\n },\n [user, config, provider, precheck, relay, getRpcUrl]\n );\n\n return { evm };\n}\n\n","/**\n * Shared axios instance for Volr SDK\n */\n\nimport axios, { AxiosInstance } from 'axios';\n\n/**\n * Create a configured axios instance\n */\nexport function createAxiosInstance(baseUrl: string, apiKey?: string | null): AxiosInstance {\n const instance = axios.create({\n baseURL: baseUrl.replace(/\\/+$/, ''), // Remove trailing slashes\n withCredentials: true, // Include cookies\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n // Request interceptor: Add API key if available\n instance.interceptors.request.use((config) => {\n if (apiKey) {\n config.headers['X-API-Key'] = apiKey;\n }\n return config;\n });\n\n // Response interceptor: Handle errors consistently\n instance.interceptors.response.use(\n (response) => response,\n (error) => {\n // Axios automatically parses JSON, so we can access error.response.data directly\n if (error.response?.data) {\n const errorData = error.response.data;\n if (errorData.error?.message) {\n error.message = errorData.error.message;\n }\n }\n return Promise.reject(error);\n }\n );\n\n return instance;\n}\n\n/**\n * Update API key for an existing axios instance\n */\nexport function updateAxiosApiKey(instance: AxiosInstance, apiKey: string | null): void {\n instance.interceptors.request.clear();\n instance.interceptors.request.use((config) => {\n if (apiKey) {\n config.headers['X-API-Key'] = apiKey;\n }\n return config;\n });\n}\n\n","/**\n * useVolrLogin hook - Login handlers for various authentication methods\n */\n\nimport { useCallback, useMemo } from \"react\";\nimport { useVolr } from \"@/hooks/useVolr\";\nimport { useInternalAuth } from \"@/hooks/useInternalAuth\";\nimport { safeStorage } from \"@/utils/ssr\";\nimport { STORAGE_KEYS } from \"@volr/shared/constants/storage\";\nimport { createAxiosInstance } from \"@/utils/axios\";\nimport { KeyStorageType, SignerType, VolrUser } from \"@/react/context\";\nimport { resolveApiBaseUrl } from \"@/config/backend\";\nimport type { UserDto } from \"@/types/api\";\n\nexport type SocialProvider = \"google\" | \"twitter\" | \"apple\";\n\n/**\n * Authentication result after successful login/verification\n */\nexport interface AuthResult {\n userId: string;\n isNewUser: boolean;\n /** Key storage type: 'passkey' or 'mpc'. Null if user hasn't set up key storage yet. */\n keyStorageType: KeyStorageType | null;\n /** Signer type: how the user signs transactions */\n signerType?: SignerType | null;\n /** Access token for API authentication. Always present after successful login. */\n accessToken: string;\n}\n\nexport interface UseVolrLoginReturn {\n requestEmailCode: (email: string) => Promise<void>;\n verifyEmailCode: (email: string, code: string) => Promise<AuthResult>;\n handleSocialLogin: (provider: SocialProvider) => Promise<void>;\n requestSiweNonce: () => Promise<string>;\n verifySiweSignature: (\n message: string,\n signature: string,\n options?: {\n walletConnector?: string;\n chainId?: number;\n }\n ) => Promise<AuthResult>;\n handlePasskeyComplete: () => Promise<void>;\n}\n\n/**\n * useVolrLogin hook\n * Provides login handlers for email, social, wallet, and passkey authentication\n */\nexport function useVolrLogin(): UseVolrLoginReturn {\n const { config, setUser } = useVolr();\n const { setAccessToken } = useInternalAuth();\n\n // Normalize backend UserDto -> VolrUser used in context\n const toVolrUser = useCallback((u: UserDto): VolrUser => {\n return {\n id: u.id,\n email: u.email,\n accountId: u.accountId ?? undefined,\n evmAddress: u.evmAddress as `0x${string}` | undefined,\n keyStorageType: u.keyStorageType ?? undefined,\n signerType: u.signerType ?? undefined,\n walletConnector: u.walletConnector ?? undefined,\n lastWalletChainId: u.lastWalletChainId ?? undefined,\n blobUrl: u.blobUrl ?? undefined,\n prfInput: u.prfInput ?? undefined,\n credentialId: u.credentialId ?? undefined,\n };\n }, []);\n\n // Resolve backend base URL (prod default, optional hidden override)\n const apiBaseUrl = resolveApiBaseUrl(config);\n\n // Create axios instance with config\n const api = useMemo(\n () => createAxiosInstance(apiBaseUrl, config.projectApiKey),\n [apiBaseUrl, config.projectApiKey]\n );\n\n const requestEmailCode = useCallback(\n async (email: string) => {\n const normalizedEmail = email.trim().toLowerCase();\n if (!normalizedEmail || !normalizedEmail.includes(\"@\")) {\n throw new Error(\"Invalid email address\");\n }\n const response = await api.post(\"/auth/email/send\", {\n email: normalizedEmail,\n });\n if (!response.data?.ok) {\n throw new Error(\n response.data?.error?.message || \"Failed to send verification code\"\n );\n }\n safeStorage.setItem(STORAGE_KEYS.lastEmail, normalizedEmail);\n },\n [api]\n );\n\n const verifyEmailCode = useCallback(\n async (email: string, code: string): Promise<AuthResult> => {\n const normalizedEmail = email.trim().toLowerCase();\n if (!normalizedEmail || !normalizedEmail.includes(\"@\")) {\n throw new Error(\"Invalid email address\");\n }\n\n const normalizedCode = code.trim();\n if (!/^\\d{6}$/.test(normalizedCode)) {\n throw new Error(\"Invalid code format\");\n }\n\n const response = await api.post(\"/auth/email/verify\", {\n email: normalizedEmail,\n code: normalizedCode,\n });\n\n if (!response.data?.ok) {\n throw new Error(\n response.data?.error?.message || \"Invalid verification code\"\n );\n }\n\n const verifyData = response.data;\n const userFromServer: UserDto | undefined = verifyData?.data?.user;\n const isNewUser: boolean = !!verifyData?.data?.isNewUser;\n const accessToken: string = verifyData?.data?.accessToken || \"\";\n\n if (!accessToken) {\n throw new Error(\n \"Access token is required but was not provided by the server\"\n );\n }\n\n // Set access token in APIClient (verify API already returns accessToken, no need to call refresh)\n setAccessToken(accessToken);\n\n if (userFromServer) {\n setUser(toVolrUser(userFromServer));\n } else {\n // Minimal fallback (shouldn't happen)\n setUser({ id: \"\", email: normalizedEmail });\n }\n\n return {\n userId: userFromServer?.id || \"\",\n isNewUser,\n keyStorageType:\n (userFromServer?.keyStorageType as KeyStorageType | undefined) ??\n null,\n signerType:\n (userFromServer?.signerType as SignerType | undefined) ?? null,\n accessToken,\n };\n },\n [api, setAccessToken, setUser, toVolrUser]\n );\n\n const handleSocialLogin = useCallback(\n async (provider: SocialProvider) => {\n // Start OAuth flow\n if (typeof window !== \"undefined\") {\n const baseUrl = apiBaseUrl.replace(/\\/+$/, \"\");\n window.location.href = `${baseUrl}/auth/${provider}`;\n }\n },\n [apiBaseUrl]\n );\n\n const requestSiweNonce = useCallback(async (): Promise<string> => {\n const response = await api.get(\"/auth/siwe/nonce\");\n if (!response.data?.ok) {\n throw new Error(\n response.data?.error?.message || \"Failed to generate nonce\"\n );\n }\n return response.data.data.nonce;\n }, [api]);\n\n const verifySiweSignature = useCallback(\n async (\n message: string,\n signature: string,\n options?: {\n walletConnector?: string;\n chainId?: number;\n }\n ): Promise<AuthResult> => {\n try {\n const response = await api.post(\"/auth/siwe/verify\", {\n message,\n signature,\n walletConnector: options?.walletConnector,\n chainId: options?.chainId,\n });\n\n if (!response.data?.ok) {\n console.error(\n \"[verifySiweSignature] Backend returned error:\",\n response.data\n );\n throw new Error(\n response.data?.error?.message || \"Invalid SIWE signature\"\n );\n }\n\n const verifyData = response.data;\n const userFromServer: UserDto | undefined = verifyData?.data?.user;\n const isNewUser: boolean = !!verifyData?.data?.isNewUser;\n const accessToken: string = verifyData?.data?.accessToken || \"\";\n\n if (!accessToken) {\n throw new Error(\n \"Access token is required but was not provided by the server\"\n );\n }\n\n // Set access token in APIClient (verify API already returns accessToken, no need to call refresh)\n setAccessToken(accessToken);\n\n if (userFromServer) {\n setUser(toVolrUser(userFromServer));\n }\n\n return {\n userId: userFromServer?.id || \"\",\n isNewUser,\n keyStorageType:\n (userFromServer?.keyStorageType as KeyStorageType | undefined) ??\n null,\n signerType:\n (userFromServer?.signerType as SignerType | undefined) ?? null,\n accessToken,\n };\n } catch (error: any) {\n console.error(\"[verifySiweSignature] Error details:\", {\n message: error.message,\n response: error.response?.data,\n status: error.response?.status,\n });\n throw error;\n }\n },\n [api, setAccessToken, setUser, toVolrUser]\n );\n\n const handlePasskeyComplete = useCallback(async () => {\n // No-op: passkey enrollment flow is handled in react-ui and provider.setProvider\n }, []);\n\n return {\n requestEmailCode,\n verifyEmailCode,\n handleSocialLogin,\n requestSiweNonce,\n verifySiweSignature,\n handlePasskeyComplete,\n };\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useVolr } from \"@/hooks/useVolr\";\nimport { useInternalAuth } from \"@/hooks/useInternalAuth\";\nimport { createAxiosInstance } from \"@/utils/axios\";\nimport { VolrUser } from \"@/react/context\";\nimport type { UserDto } from \"@/types/api\";\nimport { resolveApiBaseUrl } from \"@/config/backend\";\n\nexport interface UseVolrAuthCallbackOptions {\n onSuccess?: (user: VolrUser) => void;\n onError?: (error: string) => void;\n}\n\nexport interface UseVolrAuthCallbackReturn {\n isLoading: boolean;\n error: string | null;\n isNewUser: boolean;\n user: VolrUser | null;\n}\n\nexport function useVolrAuthCallback(\n options: UseVolrAuthCallbackOptions = {}\n): UseVolrAuthCallbackReturn {\n const { config, setUser } = useVolr();\n const { refreshAccessToken, setAccessToken } = useInternalAuth();\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [isNewUser, setIsNewUser] = useState(false);\n const [user, setLocalUser] = useState<VolrUser | null>(null);\n\n // Helper to normalize UserDto -> VolrUser (same as useVolrLogin)\n const toVolrUser = useCallback((u: UserDto): VolrUser => {\n return {\n id: u.id,\n email: u.email,\n accountId: u.accountId ?? undefined,\n evmAddress: u.evmAddress as `0x${string}` | undefined,\n keyStorageType: u.keyStorageType ?? undefined,\n signerType: u.signerType ?? undefined,\n walletConnector: u.walletConnector ?? undefined,\n lastWalletChainId: u.lastWalletChainId ?? undefined,\n blobUrl: u.blobUrl ?? undefined,\n prfInput: u.prfInput ?? undefined,\n credentialId: u.credentialId ?? undefined,\n };\n }, []);\n\n const apiBaseUrl = resolveApiBaseUrl(config);\n\n useEffect(() => {\n const handleCallback = async () => {\n if (typeof window === \"undefined\") return;\n\n const searchParams = new URLSearchParams(window.location.search);\n const success = searchParams.get(\"success\");\n const errorParam = searchParams.get(\"error\");\n const userId = searchParams.get(\"userId\");\n const isNew = searchParams.get(\"isNewUser\") === \"true\";\n\n // If there's an error parameter, stop immediately\n if (errorParam) {\n const errorMsg = `Authentication failed: ${errorParam}`;\n setError(errorMsg);\n setIsLoading(false);\n options.onError?.(errorMsg);\n return;\n }\n\n // If not success or missing user ID, do nothing (or treat as error)\n if (success !== \"true\" || !userId) {\n const errorMsg = \"Invalid callback parameters\";\n setError(errorMsg);\n setIsLoading(false);\n options.onError?.(errorMsg);\n return;\n }\n\n try {\n setIsNewUser(isNew);\n\n // 1. Refresh token to get access token (cookie based)\n // The backend redirects to callback AFTER setting the refresh token cookie\n await refreshAccessToken();\n\n // 2. Fetch user details\n const api = createAxiosInstance(\n apiBaseUrl,\n config.projectApiKey\n );\n // We need to get the access token that refreshAccessToken just set\n // However, refreshAccessToken sets it in internal state/client.\n // createAxiosInstance will check client.getAccessToken() or localStorage if persisted.\n // But refreshAccessToken saves it.\n\n // Better approach: refreshAccessToken returns the token or we can get it from client.\n // But refreshAccessToken is void. It sets state in APIClient.\n \n // We can call /auth/refresh explicitly if we want the token, \n // but refreshAccessToken already does that and sets it.\n \n // Fetch user onboarding/details status to confirm full user object\n // Or we can just use the user object returned by refreshAccessToken if it was exposed.\n // internalAuth exposes `user` but it updates context asynchronously.\n \n // Let's fetch user profile or onboarding status to ensure we have fresh data\n const userRes = await api.get(`/auth/onboarding/${userId}`);\n \n if (!userRes.data?.ok) {\n throw new Error(\"Failed to fetch user details\");\n }\n\n // We need full user object, but onboarding endpoint returns status.\n // Let's rely on what refreshAccessToken fetched. \n // The useInternalAuth hook updates the global user context.\n // But we also want to return it here.\n \n // Since refreshAccessToken updates the context, we can just wait a tick or\n // rely on the context update. However, for this hook to return the user *now*,\n // we might want to fetch it or check the context.\n \n // Actually, `refreshAccessToken` calls `/auth/refresh` which returns the User object.\n // But `useInternalAuth` implementation of `refreshAccessToken` swallows the return value\n // and just calls `setUser` and `setAccessToken`.\n \n // To make this robust, we can manually call refresh here if we want the data immediately\n // or trust that `refreshAccessToken` did its job.\n // Let's trust `refreshAccessToken` and try to get the user from context? \n // No, context update might be slow.\n \n // Let's manually call /auth/refresh to get the user data directly to return it.\n const refreshRes = await api.post(\"/auth/refresh\");\n if (!refreshRes.data?.ok) {\n throw new Error(\"Failed to refresh session\");\n }\n \n const userData = refreshRes.data.data.user;\n const accessToken = refreshRes.data.data.accessToken;\n \n setAccessToken(accessToken); // Ensure it's set\n const volrUser = toVolrUser(userData);\n setUser(volrUser); // Update global context\n setLocalUser(volrUser); // Update local state\n\n setIsLoading(false);\n options.onSuccess?.(volrUser);\n\n } catch (err: any) {\n console.error(\"Callback error:\", err);\n const errorMsg = err.message || \"Failed to complete authentication\";\n setError(errorMsg);\n setIsLoading(false);\n options.onError?.(errorMsg);\n }\n };\n\n handleCallback();\n }, [apiBaseUrl, config.projectApiKey, refreshAccessToken, setAccessToken, setUser, toVolrUser]);\n\n return {\n isLoading,\n error,\n isNewUser,\n user,\n };\n}\n\n\n","/**\n * useDepositListener - Polls for incoming deposits (native or ERC-20) on EVM chains.\n * - Uses JSON-RPC via configured rpcOverrides in VolrConfig or fetches from backend API.\n * - No wallet/provider required.\n */\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useVolr } from \"@/hooks/useVolr\";\nimport { useInternalAuth } from \"@/hooks/useInternalAuth\";\nimport { createGetRpcUrl } from \"@/utils/network\";\n\ntype Erc20Token = {\n address: `0x${string}`;\n decimals: number;\n};\n\nexport type DepositAsset =\n | { kind: \"native\" }\n | { kind: \"erc20\"; token: Erc20Token };\n\nexport type DepositStatus =\n | { state: \"idle\" }\n | { state: \"listening\"; balance: bigint }\n | {\n state: \"detected\";\n previousBalance: bigint;\n newBalance: bigint;\n delta: bigint;\n }\n | { state: \"error\"; message: string };\n\ntype JsonRpcRequest = {\n jsonrpc: \"2.0\";\n id: number;\n method: string;\n params?: any[];\n};\n\nasync function jsonRpc<T>(\n rpcUrl: string,\n method: string,\n params: any[]\n): Promise<T> {\n const payload: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id: Date.now(),\n method,\n params,\n };\n const res = await fetch(rpcUrl, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n if (!res.ok) {\n throw new Error(`RPC ${method} failed: ${res.status} ${res.statusText}`);\n }\n const body = await res.json();\n if (body.error) {\n throw new Error(body.error.message || \"RPC error\");\n }\n return body.result as T;\n}\n\nfunction hexToBigInt(hex: string | null | undefined): bigint {\n if (!hex) return 0n;\n return BigInt(hex);\n}\n\nfunction pad32(address: `0x${string}`): string {\n return `0x${address.toLowerCase().replace(/^0x/, \"\").padStart(64, \"0\")}`;\n}\n\nfunction balanceOfCalldata(address: `0x${string}`): `0x${string}` {\n // function balanceOf(address) -> 0x70a08231 + 32-bytes address\n const selector = \"0x70a08231\";\n return `${selector}${pad32(address).slice(2)}` as `0x${string}`;\n}\n\nexport function useDepositListener(input: {\n chainId: number;\n asset: DepositAsset;\n address: `0x${string}`;\n pollIntervalMs?: number;\n}): DepositStatus {\n const { config } = useVolr();\n const { client } = useInternalAuth();\n const [status, setStatus] = useState<DepositStatus>({ state: \"idle\" });\n const intervalRef = useRef<number | null>(null);\n const rpcUrlRef = useRef<string | null>(null);\n\n // Get RPC URL resolver bound to current deps\n const getRpcUrl = useCallback(\n createGetRpcUrl({ client, rpcOverrides: config.rpcOverrides }),\n [client, config.rpcOverrides]\n );\n\n useEffect(() => {\n let cancelled = false;\n\n const fetchBalance = async (): Promise<bigint> => {\n try {\n if (!rpcUrlRef.current) {\n throw new Error(\"RPC URL not initialized\");\n }\n const rpcUrl = rpcUrlRef.current;\n\n if (input.asset.kind === \"native\") {\n const result = await jsonRpc<string>(rpcUrl, \"eth_getBalance\", [\n input.address,\n \"latest\",\n ]);\n return hexToBigInt(result);\n } else {\n const data = balanceOfCalldata(input.address);\n const result = await jsonRpc<string>(rpcUrl, \"eth_call\", [\n { to: input.asset.token.address, data },\n \"latest\",\n ]);\n return hexToBigInt(result);\n }\n } catch (err: any) {\n throw new Error(\n err?.message || \"Failed to fetch balance from RPC endpoint\"\n );\n }\n };\n\n const start = async () => {\n try {\n // Initialize RPC URL first\n if (!rpcUrlRef.current) {\n rpcUrlRef.current = await getRpcUrl(input.chainId);\n console.log(\"[DepositListener] RPC URL:\", rpcUrlRef.current);\n }\n \n const initial = await fetchBalance();\n console.log(\"[DepositListener] Initial balance:\", initial.toString());\n if (cancelled) return;\n setStatus({ state: \"listening\", balance: initial });\n } catch (e: any) {\n console.error(\"[DepositListener] Error:\", e);\n if (cancelled) return;\n setStatus({ state: \"error\", message: e.message || String(e) });\n return;\n }\n\n const intervalMs = input.pollIntervalMs ?? config.deposit?.pollIntervalMs ?? 6000;\n console.log(\"[DepositListener] Polling interval:\", intervalMs, \"ms\");\n intervalRef.current = window.setInterval(async () => {\n try {\n const current = await fetchBalance();\n console.log(\"[DepositListener] Current balance:\", current.toString());\n if (cancelled) return;\n setStatus((prev) => {\n if (prev.state === \"listening\") {\n if (current > prev.balance) {\n console.log(\"[DepositListener] ✅ DEPOSIT DETECTED! Previous:\", prev.balance.toString(), \"New:\", current.toString());\n return {\n state: \"detected\",\n previousBalance: prev.balance,\n newBalance: current,\n delta: current - prev.balance,\n };\n }\n if (current !== prev.balance) {\n console.log(\"[DepositListener] ⚠️ Balance changed (decreased or other). Previous:\", prev.balance.toString(), \"New:\", current.toString());\n // balance decreased or changed - still report change\n return {\n state: \"detected\",\n previousBalance: prev.balance,\n newBalance: current,\n delta: current - prev.balance,\n };\n }\n return prev;\n }\n if (prev.state === \"detected\") {\n console.log(\"[DepositListener] Resuming listening from new balance:\", current.toString());\n // After detection, continue listening from new balance\n return { state: \"listening\", balance: current };\n }\n return prev;\n });\n } catch (err: any) {\n console.error(\"[DepositListener] Polling error:\", err);\n if (cancelled) return;\n setStatus({ state: \"error\", message: err.message || String(err) });\n }\n }, intervalMs);\n };\n\n start();\n\n return () => {\n cancelled = true;\n rpcUrlRef.current = null; // Reset RPC URL on cleanup\n if (intervalRef.current !== null) {\n clearInterval(intervalRef.current);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [getRpcUrl, input.chainId, input.address, JSON.stringify(input.asset)]);\n\n return status;\n}\n\n\n","/**\n * Passkey enrollment (headless)\n * WebAuthn credential creation, encryption, blob upload, provider registration\n */\n\nimport type { APIClient } from '@/headless/client';\nimport type { PrfInput, WrapKey } from '@volr/sdk-core';\nimport {\n deriveWrapKey,\n sealMasterSeed,\n createMasterKeyProvider,\n deriveEvmKey,\n uploadBlob,\n} from '@volr/sdk-core';\nimport {\n AUTHENTICATOR_SELECTION,\n PUBKEY_CRED_PARAMS,\n WEBAUTHN_TIMEOUT,\n ATTESTATION,\n} from '@/config/webauthn';\nimport type { UserDto } from '@/types/api';\n\nexport interface EnrollPasskeyParams {\n /** APIClient instance for backend communication */\n client: APIClient;\n /** Base URL for API calls */\n baseUrl: string;\n /** Project API key */\n apiKey: string;\n /** User ID (required) */\n userId: string;\n /** User email (required) */\n userEmail: string;\n /** Project ID (required) */\n projectId: string;\n /** Relying Party ID (default: window.location.hostname) */\n rpId?: string;\n /** Relying Party Name (default: 'Volr') */\n rpName?: string;\n}\n\nexport interface EnrollPasskeyResult {\n /** Credential ID (hex string) */\n credentialId: string;\n /** Blob URL (S3 key) */\n blobUrl: string;\n /** PRF input */\n prfInput: PrfInput;\n /** Ethereum address */\n address: `0x${string}`;\n /** Encrypted blob data */\n encryptedBlob: {\n cipher: Uint8Array;\n nonce: Uint8Array;\n };\n /** Additional authenticated data */\n aad: Uint8Array;\n /** Updated user information from backend */\n user?: UserDto;\n}\n\n/**\n * Enroll passkey: WebAuthn credential creation, encryption, blob upload, provider registration\n */\nexport async function enrollPasskey(\n params: EnrollPasskeyParams\n): Promise<EnrollPasskeyResult> {\n const {\n client,\n baseUrl,\n apiKey,\n userId,\n userEmail,\n projectId,\n rpId = typeof window !== 'undefined' ? window.location.hostname : 'localhost',\n rpName = 'Volr',\n } = params;\n\n // Validate required parameters\n if (!userId) {\n throw new Error('userId is required');\n }\n if (!userEmail) {\n throw new Error('userEmail is required');\n }\n if (!projectId) {\n throw new Error('projectId is required');\n }\n if (!baseUrl) {\n throw new Error('baseUrl is required');\n }\n if (!apiKey) {\n throw new Error('apiKey is required');\n }\n\n // Step 1: WebAuthn credential creation\n if (!navigator.credentials || !navigator.credentials.create) {\n throw new Error('WebAuthn API is not supported');\n }\n\n const challenge = new Uint8Array(32);\n crypto.getRandomValues(challenge);\n\n const userHandle = new TextEncoder().encode(userId);\n\n // Build PRF input for salt derivation (before credential creation)\n const tempCredentialId = 'temp-' + Date.now(); // Temporary ID for PRF salt\n const origin =\n typeof window !== 'undefined' ? window.location.origin : 'https://localhost';\n \n const tempPrfInput: PrfInput = {\n origin,\n projectId,\n credentialId: tempCredentialId,\n };\n \n // Derive PRF salt from prfInput\n const prfSalt = deriveWrapKey(tempPrfInput);\n\n const publicKeyCredentialCreationOptions: PublicKeyCredentialCreationOptions = {\n challenge,\n rp: {\n name: rpName,\n id: rpId,\n },\n user: {\n id: userHandle,\n name: userEmail,\n displayName: userEmail,\n },\n pubKeyCredParams: PUBKEY_CRED_PARAMS,\n authenticatorSelection: AUTHENTICATOR_SELECTION,\n timeout: WEBAUTHN_TIMEOUT,\n attestation: ATTESTATION,\n extensions: {\n prf: {\n eval: {\n first: prfSalt.buffer as ArrayBuffer,\n },\n },\n },\n };\n\n const credential = (await navigator.credentials.create({\n publicKey: publicKeyCredentialCreationOptions,\n })) as PublicKeyCredential | null;\n\n if (!credential || !('response' in credential)) {\n throw new Error('Failed to create passkey credential');\n }\n\n const credentialId = Array.from(new Uint8Array(credential.rawId))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n\n // Step 2: Extract PRF output from WebAuthn response\n const extensionResults = credential.getClientExtensionResults();\n if (!extensionResults.prf || !extensionResults.prf.results || !extensionResults.prf.results.first) {\n throw new Error('PRF extension not supported or PRF output missing. Please use a browser that supports WebAuthn PRF extension.');\n }\n\n const prfOutputBuffer = extensionResults.prf.results.first as ArrayBuffer;\n const prfOutput = new Uint8Array(prfOutputBuffer);\n\n // Step 3: Build PRF input (for storage)\n const prfInput: PrfInput = {\n origin,\n projectId,\n credentialId,\n };\n\n // Step 4: Use PRF output as wrap key (not deriveWrapKey!)\n const wrapKey = prfOutput as unknown as WrapKey;\n\n // Step 4: Generate master seed and encrypt\n const masterKeyProvider = createMasterKeyProvider();\n const masterSeedHandle = await masterKeyProvider.generate();\n\n try {\n // Build AAD with userId, keyStorageType, version\n // Format: volr/master-seed/v1|userId|keyStorageType|version\n const keyStorageType = 'passkey';\n const version = 'v1';\n const aadBytes = new TextEncoder().encode(\n `volr/master-seed/v1|${userId}|${keyStorageType}|${version}`\n );\n\n // Encrypt master seed\n const encryptedBlob = await sealMasterSeed(\n masterSeedHandle.bytes,\n wrapKey,\n aadBytes\n );\n\n // Step 5: Prepare encrypted blob for upload\n // Convert Uint8Array to Blob for upload\n const blob = new Blob(\n [\n encryptedBlob.cipher as unknown as BlobPart,\n encryptedBlob.nonce as unknown as BlobPart,\n ],\n {\n type: 'application/octet-stream',\n }\n );\n\n // Step 6: Upload blob via APIClient\n const accessToken = client.getAccessToken();\n if (!accessToken) {\n throw new Error('Access token is required for blob upload');\n }\n\n // Use core's uploadBlob function (it will create its own axios instance)\n const { key: blobUrl } = await uploadBlob({\n baseUrl,\n apiKey,\n accessToken,\n blob,\n // Don't pass axiosInstance - let uploadBlob create its own\n });\n\n if (!blobUrl) {\n throw new Error('Failed to upload blob: missing key');\n }\n\n // Step 7: Get address from master seed (for registration)\n const keypair = deriveEvmKey({ masterSeed: masterSeedHandle.bytes });\n const address = keypair.address;\n\n // Step 8: Register provider with backend (via APIClient)\n const registerResponse = await client.post<{ id: string; user?: UserDto }>('/wallet/provider/register', {\n keyStorageType: 'passkey',\n credentialId,\n blobUrl,\n prfInput: {\n origin,\n projectId,\n credentialId,\n },\n address,\n });\n\n return {\n credentialId,\n blobUrl,\n prfInput,\n address,\n encryptedBlob: {\n cipher: encryptedBlob.cipher,\n nonce: encryptedBlob.nonce,\n },\n aad: aadBytes,\n user: registerResponse.user,\n };\n } finally {\n masterSeedHandle.destroy();\n }\n}\n\n","/**\n * usePasskeyEnrollment hook\n * React-specific logic for passkey enrollment\n */\n\nimport { useState, useCallback, useRef } from \"react\";\nimport { useVolr } from \"@/hooks/useVolr\";\nimport { useInternalAuth } from \"@/hooks/useInternalAuth\";\nimport { enrollPasskey } from \"@/headless/passkey-enrollment\";\nimport { createPasskeyProvider } from \"@volr/sdk-core\";\nimport { createPasskeyAdapter } from \"@/adapters/passkey\";\nimport { safeStorage } from \"@/utils/ssr\";\nimport { STORAGE_KEYS } from \"@volr/shared/constants/storage\";\nimport { resolveApiBaseUrl } from \"@/config/backend\";\n\nexport type PasskeyEnrollmentStep =\n | 'idle'\n | 'creating'\n | 'encrypting'\n | 'uploading'\n | 'registering';\n\nexport interface UsePasskeyEnrollmentReturn {\n /** Start passkey enrollment */\n enroll: () => Promise<void>;\n /** Current enrollment step */\n step: PasskeyEnrollmentStep;\n /** Whether enrollment is in progress */\n isEnrolling: boolean;\n /** Error message if enrollment failed */\n error: Error | null;\n}\n\n/**\n * usePasskeyEnrollment hook\n * Provides passkey enrollment functionality\n */\nexport function usePasskeyEnrollment(): UsePasskeyEnrollmentReturn {\n const { config, setProvider, setUser, user } = useVolr();\n const { client } = useInternalAuth();\n const [step, setStep] = useState<PasskeyEnrollmentStep>(\"idle\");\n const [isEnrolling, setIsEnrolling] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const isEnrollingRef = useRef(false);\n\n // Use APIClient from context instead of creating a new instance\n\n const apiBaseUrl = resolveApiBaseUrl(config);\n\n const enroll = useCallback(async () => {\n // Prevent double execution\n if (isEnrollingRef.current || isEnrolling) return;\n isEnrollingRef.current = true;\n\n setIsEnrolling(true);\n setError(null);\n setStep(\"creating\");\n\n try {\n // Validate user\n if (!user?.id) {\n throw new Error(\"User ID is required for passkey enrollment\");\n }\n if (!user?.email) {\n throw new Error(\"User email is required for passkey enrollment\");\n }\n\n // Get access token from client (always use latest value from APIClient)\n const accessToken = client.getAccessToken();\n if (!accessToken) {\n throw new Error(\n \"Access token is required for passkey enrollment. Please login first.\"\n );\n }\n\n // Get project ID from config (or use user.id as fallback)\n // Note: projectId should ideally come from config, but for now we use user.id\n const projectId = user.id;\n\n setStep(\"encrypting\");\n\n // Enroll passkey\n const result = await enrollPasskey({\n client,\n baseUrl: apiBaseUrl,\n apiKey: config.projectApiKey,\n userId: user.id,\n userEmail: user.email,\n projectId,\n });\n\n setStep(\"registering\");\n\n // Store credentialId in localStorage\n if (typeof window !== \"undefined\") {\n safeStorage.setItem(STORAGE_KEYS.credentialId, result.credentialId);\n }\n\n // Create passkey adapter\n const passkeyAdapter = createPasskeyAdapter({\n rpId:\n typeof window !== \"undefined\"\n ? window.location.hostname\n : \"localhost\",\n rpName: \"Volr\",\n });\n\n // Create passkey provider\n const provider = createPasskeyProvider(passkeyAdapter, {\n prfInput: result.prfInput,\n encryptedBlob: result.encryptedBlob,\n aad: result.aad,\n });\n\n // Update user state immediately for UI (no need to wait for refresh)\n // Prefer backend-returned user (includes evmAddress), otherwise populate from local result\n if (result.user) {\n setUser(result.user);\n } else {\n // Functional updater is not supported by setUser; compute next value eagerly\n const nextUser = {\n ...(user as any),\n id: user.id,\n email: user.email,\n keyStorageType: \"passkey\" as const,\n evmAddress: result.address as `0x${string}`,\n blobUrl: result.blobUrl,\n prfInput: result.prfInput,\n credentialId: result.credentialId,\n };\n setUser(nextUser);\n }\n\n // Set provider in context (this will also refresh user data from backend)\n await setProvider(provider);\n\n setStep('idle');\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(\"Failed to enroll passkey\");\n setError(error);\n setStep(\"idle\");\n throw error;\n } finally {\n setIsEnrolling(false);\n isEnrollingRef.current = false;\n }\n }, [apiBaseUrl, client, config.projectApiKey, user, setProvider, setUser, isEnrolling]);\n\n return {\n enroll,\n step,\n isEnrolling,\n error,\n };\n}\n\n","/**\n * MPC transport (headless)\n * Backend proxy for MPC operations\n */\n\nimport type { APIClient } from '@/headless/client';\nimport type { MpcTransport } from '@volr/sdk-core';\n\nexport interface CreateBackendMpcTransportParams {\n /** APIClient instance for backend communication */\n client: APIClient;\n}\n\n/**\n * Create MPC transport that uses backend proxy\n */\nexport function createBackendMpcTransport(\n params: CreateBackendMpcTransportParams\n): MpcTransport {\n const { client } = params;\n\n let currentSessionToken: string | undefined;\n let cachedAddress: `0x${string}` | undefined;\n\n return {\n async ensureSession() {\n if (currentSessionToken) {\n return; // Session already established\n }\n\n // Call backend proxy to create MPC session\n const response = await client.post<{ sessionToken: string }>(\n '/wallet/mpc/connect',\n {}\n );\n currentSessionToken = response.sessionToken;\n },\n\n async getAddress(): Promise<`0x${string}`> {\n if (cachedAddress) {\n return cachedAddress;\n }\n\n await this.ensureSession();\n\n const response = await client.get<{ address: `0x${string}` }>(\n '/wallet/mpc/address'\n );\n cachedAddress = response.address;\n return cachedAddress;\n },\n\n async signMessage(hash32: Uint8Array): Promise<{\n r: Uint8Array;\n s: Uint8Array;\n yParity: 0 | 1;\n }> {\n await this.ensureSession();\n\n const hashHex = Array.from(hash32)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n\n const response = await client.post<{\n r: string;\n s: string;\n yParity: 0 | 1;\n }>('/wallet/mpc/sign', {\n hash: hashHex,\n });\n\n // Convert hex strings to Uint8Array\n const rHex = response.r.startsWith('0x') ? response.r.slice(2) : response.r;\n const sHex = response.s.startsWith('0x') ? response.s.slice(2) : response.s;\n\n const r = new Uint8Array(32);\n const s = new Uint8Array(32);\n\n for (let i = 0; i < 32; i++) {\n r[i] = parseInt(rHex.slice(i * 2, i * 2 + 2), 16);\n s[i] = parseInt(sHex.slice(i * 2, i * 2 + 2), 16);\n }\n\n return {\n r,\n s,\n yParity: response.yParity,\n };\n },\n\n async signTypedData(input: {\n domain: any;\n types: any;\n message: any;\n }): Promise<`0x${string}`> {\n await this.ensureSession();\n\n const response = await client.post<{ signature: `0x${string}` }>(\n '/wallet/mpc/sign-typed',\n {\n domain: input.domain,\n types: input.types,\n message: input.message,\n }\n );\n return response.signature;\n },\n\n async getPublicKey(): Promise<Uint8Array> {\n await this.ensureSession();\n\n const response = await client.get<{ publicKey: string }>(\n '/wallet/mpc/public-key'\n );\n const pubKeyHex = response.publicKey.startsWith('0x')\n ? response.publicKey.slice(2)\n : response.publicKey;\n const pubKey = new Uint8Array(65);\n\n for (let i = 0; i < 65; i++) {\n pubKey[i] = parseInt(pubKeyHex.slice(i * 2, i * 2 + 2), 16);\n }\n\n return pubKey;\n },\n };\n}\n\n","/**\n * Wallet provider registration (headless)\n * Register wallet provider with backend\n */\n\nimport type { APIClient } from '@/headless/client';\nimport type { PrfInput } from '@volr/sdk-core';\n\nexport interface RegisterWalletProviderParams {\n /** APIClient instance for backend communication */\n client: APIClient;\n /** Key storage type */\n keyStorageType: 'passkey' | 'mpc';\n /** Ethereum address */\n address: `0x${string}`;\n /** Credential ID (required for passkey) */\n credentialId?: string;\n /** Blob URL (required for passkey) */\n blobUrl?: string;\n /** PRF input (required for passkey) */\n prfInput?: PrfInput;\n}\n\n/**\n * Register wallet provider with backend\n */\nexport async function registerWalletProvider(\n params: RegisterWalletProviderParams\n): Promise<void> {\n const { client, keyStorageType, address, credentialId, blobUrl, prfInput } =\n params;\n\n // Validate required parameters\n if (!keyStorageType) {\n throw new Error('keyStorageType is required');\n }\n if (!address) {\n throw new Error('address is required');\n }\n\n // For passkey, validate additional required fields\n if (keyStorageType === 'passkey') {\n if (!credentialId) {\n throw new Error('credentialId is required for passkey');\n }\n if (!blobUrl) {\n throw new Error('blobUrl is required for passkey');\n }\n if (!prfInput) {\n throw new Error('prfInput is required for passkey');\n }\n }\n\n // Register provider\n await client.post('/wallet/provider/register', {\n keyStorageType,\n address,\n ...(keyStorageType === 'passkey' && {\n credentialId,\n blobUrl,\n prfInput,\n }),\n });\n}\n\n","/**\n * useMpcConnection hook\n * React-specific logic for MPC connection\n */\n\nimport { useState, useCallback } from 'react';\nimport { useVolr } from '@/hooks/useVolr';\nimport { useInternalAuth } from '@/hooks/useInternalAuth';\nimport { createBackendMpcTransport } from '@/headless/mpc-transport';\nimport { registerWalletProvider } from '@/headless/wallet-provider';\nimport { createMpcProvider } from '@volr/sdk-core';\n\nexport type MpcConnectionStep = 'idle' | 'connecting' | 'registering';\n\nexport interface UseMpcConnectionReturn {\n /** Start MPC connection */\n connect: () => Promise<void>;\n /** Current connection step */\n step: MpcConnectionStep;\n /** Whether connection is in progress */\n isConnecting: boolean;\n /** Error message if connection failed */\n error: Error | null;\n}\n\n/**\n * useMpcConnection hook\n * Provides MPC connection functionality\n */\nexport function useMpcConnection(): UseMpcConnectionReturn {\n const { setProvider } = useVolr();\n const { client } = useInternalAuth();\n const [step, setStep] = useState<MpcConnectionStep>('idle');\n const [isConnecting, setIsConnecting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const connect = useCallback(async () => {\n if (isConnecting) return;\n\n setIsConnecting(true);\n setError(null);\n setStep('connecting');\n\n try {\n // Step 1: Create MPC transport (backend proxy)\n const transport = createBackendMpcTransport({ client });\n\n // Step 2: Ensure session is established\n await transport.ensureSession();\n\n // Step 3: Get address\n const address = await transport.getAddress();\n\n // Step 4: Register provider with backend\n setStep('registering');\n await registerWalletProvider({\n client,\n keyStorageType: 'mpc',\n address,\n });\n\n // Step 5: Create MPC provider\n const provider = createMpcProvider(transport);\n\n // Step 6: Set provider in context\n await setProvider(provider);\n\n setStep('idle');\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to connect to MPC provider');\n setError(error);\n setStep('idle');\n throw error;\n } finally {\n setIsConnecting(false);\n }\n }, [client, setProvider, isConnecting]);\n\n return {\n connect,\n step,\n isConnecting,\n error,\n };\n}\n\n","/**\n * Blob helpers (headless)\n * - Presign + direct PUT upload to S3\n */\nimport { createAxiosInstance } from '@/utils/axios';\n\nexport async function uploadBlobViaPresign(params: {\n baseUrl: string;\n apiKey: string;\n blob: Blob;\n contentType?: string;\n}): Promise<{ s3Key: string }> {\n const { baseUrl, apiKey, blob, contentType = 'application/octet-stream' } = params;\n\n const api = createAxiosInstance(baseUrl, apiKey);\n\n // 1) Get presigned PUT URL\n const presignResponse = await api.post('/blob/presign', {\n op: 'put',\n contentType,\n });\n const presignData = presignResponse.data?.data || presignResponse.data;\n const uploadUrl: string = presignData.url;\n const s3Key: string = presignData.s3Key;\n\n // 2) Upload using fetch (must include signed headers)\n const putRes = await fetch(uploadUrl, {\n method: 'PUT',\n body: blob,\n headers: {\n 'Content-Type': contentType,\n 'x-amz-server-side-encryption': 'AES256',\n },\n mode: 'cors',\n });\n\n if (!putRes.ok) {\n const text = await putRes.text().catch(() => '');\n throw new Error(`Failed to upload to S3 (${putRes.status}): ${text || putRes.statusText}`);\n }\n\n return { s3Key };\n}\n\n\n\n"]}
|