@explorins/pers-signer 1.0.27 → 1.0.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/utils/jwt.ts","../src/config/constants.ts","../src/utils/environment.ts","../src/platform/HttpClient.ts","../src/core/ServiceState.ts","../src/core/AuthenticationService.ts","../src/core/WalletService.ts","../src/core/SigningService.ts","../src/core/PersService.ts","../src/core/HealthService.ts","../src/utils/signature.ts","../src/types/transaction-types.ts","../src/types/error-types.ts","../src/types/status.ts","../src/core/KeyWallet.ts","../src/transaction/TransactionErrorHandler.ts","../src/transaction/TransactionValidator.ts","../src/transaction/WebAuthnCoordinator.ts","../src/transaction/TransactionSigningService.ts","../src/transaction/TransactionSubmissionHandler.ts","../src/platform/ConfigProvider.ts","../src/utils/encoding.ts","../src/platform/WebAuthnProvider.browser.ts","../src/platform/WebAuthnProvider.reactnative.ts","../src/utils/user-cache.ts","../src/sdk/PersSignerSDK.ts"],"sourcesContent":["/**\r\n * JWT Utility Functions\r\n * \r\n * Browser-compatible JWT handling without external dependencies\r\n */\r\n\r\n// JWT types\r\nexport interface JWTPayload {\r\n iss?: string;\r\n email?: string;\r\n identifierEmail?: string;\r\n userId?: string;\r\n tenantId?: string;\r\n transactionId?: string;\r\n exp?: number;\r\n [key: string]: any;\r\n}\r\n\r\nexport interface JWTExtractionResult {\r\n payload: JWTPayload | null;\r\n isExpired: boolean;\r\n}\r\n\r\n/**\r\n * Extract and validate JWT token payload\r\n * Uses a browser-compatible approach without external dependencies\r\n */\r\nexport function extractJWTFromToken(jwtToken: string): JWTExtractionResult {\r\n if (!jwtToken) {\r\n return { payload: null, isExpired: false };\r\n }\r\n\r\n try {\r\n // Use a more compatible JWT decoding approach\r\n // Split JWT into parts\r\n const parts = jwtToken.split('.');\r\n if (parts.length !== 3) {\r\n throw new Error('Invalid JWT format');\r\n }\r\n \r\n // Decode the payload (middle part)\r\n const payload = JSON.parse(atob(parts[1])) as JWTPayload;\r\n \r\n // Check expiration\r\n const isExpired = payload.exp ? Date.now() >= payload.exp * 1000 : false;\r\n \r\n return { payload, isExpired };\r\n } catch (error) {\r\n console.warn('JWT decode failed:', error);\r\n return { payload: null, isExpired: false };\r\n }\r\n}\r\n\r\n/**\r\n * Check if a JWT token is expired\r\n */\r\nexport function isJWTExpired(jwtToken: string): boolean {\r\n const { isExpired } = extractJWTFromToken(jwtToken);\r\n return isExpired;\r\n}\r\n\r\n/**\r\n * Get JWT payload without validation\r\n */\r\nexport function getJWTPayload(jwtToken: string): JWTPayload | null {\r\n const { payload } = extractJWTFromToken(jwtToken);\r\n return payload;\r\n}","/**\r\n * PERS Signer SDK Constants\r\n * \r\n * These are stable configuration values for the PERS blockchain signing infrastructure.\r\n * These values should remain consistent across deployments and environments.\r\n * \r\n * Values are taken from the .env configuration to maintain consistency.\r\n */\r\n\r\nexport const SIGNER_CONFIG = {\r\n /**\r\n * Default API URL for the PERS signer backend service\r\n * This is the production endpoint that handles WebAuthn operations and transaction signing\r\n */\r\n DEFAULT_SIGNER_API_URL: 'https://signer-api.pers.ninja/v1',\r\n\r\n /**\r\n * Staging/Development API URL for the PERS signer backend service\r\n * Used as fallback when production signer API is unavailable\r\n */\r\n STAGING_SIGNER_API_URL: 'https://signer-api-staging.pers.ninja/v1',\r\n // STAGING_SIGNER_API_URL: 'http://localhost:8080/v1',\r\n\r\n /**\r\n * PERS Platform API URLs\r\n */\r\n DEFAULT_PERS_API_URL: 'https://api.pers.ninja/v2',\r\n STAGING_PERS_API_URL: 'https://dev.api.pers.ninja/v2',\r\n // STAGING_PERS_API_URL: 'https://explorins-loyalty.ngrok.io',\r\n\r\n /**\r\n * Default relying party name for WebAuthn operations\r\n * This appears in the browser's authentication prompts\r\n */\r\n DEFAULT_RELYING_PARTY_NAME: 'PERS Signer',\r\n DEFAULT_RELYING_PARTY_ID: 'signer.pers.ninja',\r\n /**\r\n * API endpoints for different operations\r\n */\r\n ENDPOINTS: {\r\n AUTH: '/auth',\r\n WALLETS: '/wallets',\r\n TRANSACTIONS: '/transactions',\r\n HEALTH: '/health',\r\n },\r\n} as const;\r\n\r\n/**\r\n * Shared provider constants for blockchain networks\r\n */\r\n\r\n// Default fallback provider for Sepolia testnet (no API key required)\r\nexport const DEFAULT_FALLBACK_PROVIDER = 'https://ethereum-sepolia.publicnode.com';\r\n\r\n/**\r\n * WebAuthn configuration constants\r\n */\r\nexport const WEBAUTHN_CONFIG = {\r\n /**\r\n * Timeout for WebAuthn operations (in milliseconds)\r\n */\r\n TIMEOUT: 60000,\r\n\r\n /**\r\n * User verification requirement\r\n * 'preferred' - ask for verification if available\r\n * 'required' - require verification\r\n * 'discouraged' - don't ask for verification\r\n */\r\n USER_VERIFICATION: 'preferred' as const,\r\n\r\n /**\r\n * Authenticator attachment preference\r\n */\r\n AUTHENTICATOR_ATTACHMENT: 'platform' as const,\r\n} as const;","import { extractJWTFromToken } from '../utils/jwt';\r\nimport { SIGNER_CONFIG } from '../config/constants';\r\n// import serviceState from '../core/ServiceState';\r\n\r\n/**\r\n * Detects the environment (Staging vs Production) based on the JWT token issuer.\r\n * Updates the global service state accordingly.\r\n * \r\n * @param token - The JWT token to inspect\r\n * @returns boolean - True if staging was detected, false if production or unknown\r\n */\r\nexport function detectStagingEnvironmentFromToken(token: string): boolean {\r\n const { payload } = extractJWTFromToken(token);\r\n\r\n if (payload?.iss) {\r\n // Check if issuer matches staging URL\r\n if (payload.iss === SIGNER_CONFIG.STAGING_PERS_API_URL\r\n || SIGNER_CONFIG.STAGING_PERS_API_URL.includes(payload.iss)\r\n || SIGNER_CONFIG.STAGING_SIGNER_API_URL.includes(payload.iss)\r\n // Temporary additional checks for known staging issuers\r\n // || 'https://signer-api-staging.pers.ninja'.includes(payload.iss)\r\n // || 'https://dev.api.pers.ninja/v2'.includes(payload.iss)\r\n ) {\r\n return true;\r\n /* } else if (payload.iss === SIGNER_CONFIG.DEFAULT_PERS_API_URL || \r\n SIGNER_CONFIG.DEFAULT_PERS_API_URL.includes(payload.iss)) {\r\n // Explicitly production\r\n return false; */\r\n }\r\n }\r\n \r\n return false;\r\n}\r\n","/**\r\n * Platform-agnostic HTTP client abstraction\r\n * Provides a consistent interface for HTTP requests across platforms\r\n */\r\n\r\nexport interface HttpResponse<T = any> {\r\n data: T;\r\n status: number;\r\n statusText: string;\r\n headers: Record<string, string>;\r\n}\r\n\r\nexport interface HttpRequestOptions {\r\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\r\n headers?: Record<string, string>;\r\n body?: any;\r\n timeout?: number;\r\n}\r\n\r\nexport interface HttpClient {\r\n request<T = any>(url: string, options: HttpRequestOptions): Promise<HttpResponse<T>>;\r\n get<T = any>(url: string, headers?: Record<string, string>): Promise<HttpResponse<T>>;\r\n post<T = any>(url: string, data?: any, headers?: Record<string, string>): Promise<HttpResponse<T>>;\r\n put<T = any>(url: string, data?: any, headers?: Record<string, string>): Promise<HttpResponse<T>>;\r\n delete<T = any>(url: string, headers?: Record<string, string>): Promise<HttpResponse<T>>;\r\n}\r\n\r\n/**\r\n * Fetch-based HTTP client for web environments\r\n */\r\nexport class FetchHttpClient implements HttpClient {\r\n private defaultHeaders: Record<string, string> = {\r\n 'content-type': 'application/json',\r\n };\r\n\r\n async request<T = any>(url: string, options: HttpRequestOptions): Promise<HttpResponse<T>> {\r\n const headers = { ...this.defaultHeaders, ...options.headers };\r\n \r\n const fetchOptions: RequestInit = {\r\n method: options.method,\r\n headers,\r\n };\r\n\r\n if (options.body && options.method !== 'GET') {\r\n fetchOptions.body = typeof options.body === 'string' \r\n ? options.body \r\n : JSON.stringify(options.body);\r\n }\r\n\r\n // Add timeout support if provided\r\n if (options.timeout) {\r\n const controller = new AbortController();\r\n fetchOptions.signal = controller.signal;\r\n setTimeout(() => controller.abort(), options.timeout);\r\n }\r\n\r\n const response = await fetch(url, fetchOptions);\r\n \r\n // Check if response is actually JSON before parsing\r\n const responseText = await response.text();\r\n \r\n let data: T;\r\n try {\r\n data = JSON.parse(responseText) as T;\r\n } catch (parseError) {\r\n console.error('[HttpClient] JSON parse error:', parseError);\r\n console.error('[HttpClient] Failed to parse response text:', responseText);\r\n throw new Error(`Failed to parse JSON response: ${parseError instanceof Error ? parseError.message : 'Unknown error'}`);\r\n }\r\n\r\n return {\r\n data,\r\n status: response.status,\r\n statusText: response.statusText,\r\n headers: Object.fromEntries(response.headers.entries()),\r\n };\r\n }\r\n\r\n async get<T = any>(url: string, headers?: Record<string, string>): Promise<HttpResponse<T>> {\r\n return this.request<T>(url, { method: 'GET', headers });\r\n }\r\n\r\n async post<T = any>(url: string, data?: any, headers?: Record<string, string>): Promise<HttpResponse<T>> {\r\n return this.request<T>(url, { method: 'POST', body: data, headers });\r\n }\r\n\r\n async put<T = any>(url: string, data?: any, headers?: Record<string, string>): Promise<HttpResponse<T>> {\r\n return this.request<T>(url, { method: 'PUT', body: data, headers });\r\n }\r\n\r\n async delete<T = any>(url: string, headers?: Record<string, string>): Promise<HttpResponse<T>> {\r\n return this.request<T>(url, { method: 'DELETE', headers });\r\n }\r\n}\r\n\r\n/**\r\n * Global HTTP client instance\r\n */\r\nlet globalHttpClient: HttpClient | null = null;\r\n\r\n/**\r\n * Set the global HTTP client\r\n */\r\nexport function setHttpClient(client: HttpClient): void {\r\n globalHttpClient = client;\r\n}\r\n\r\n/**\r\n * Get the current HTTP client\r\n */\r\nexport function getHttpClient(): HttpClient {\r\n if (!globalHttpClient) {\r\n // Auto-initialize with fetch client for web environments\r\n globalHttpClient = new FetchHttpClient();\r\n }\r\n return globalHttpClient;\r\n}","/**\r\n * Shared service state for managing staging mode across all signer services\r\n * Ensures consistent API endpoint usage when fallback to staging is required\r\n */\r\n\r\nimport { SIGNER_CONFIG } from '../config/constants';\r\n\r\n/**\r\n * Helper function to get signer API URL with fallback logic\r\n * @param useStaging Whether to use staging environment URL\r\n */\r\nexport const getSignerApiUrl = (useStaging: boolean = false): string => {\r\n \r\n if (useStaging) {\r\n return SIGNER_CONFIG.STAGING_SIGNER_API_URL;\r\n }\r\n return SIGNER_CONFIG.DEFAULT_SIGNER_API_URL;\r\n};","import { detectStagingEnvironmentFromToken } from '../utils/environment';\r\nimport { getHttpClient } from '../platform/HttpClient';\r\nimport { \r\n LoginRequest,\r\n LoginResponse,\r\n JWTLoginResponse,\r\n VerifyTokenResponse,\r\n RegisterRequest,\r\n RegisterResponse,\r\n VerifyTokenRequest\r\n} from '../types/signer-api-types';\r\nimport type { WebAuthnProvider } from '../platform/WebAuthnProvider.types';\r\nimport { ExtendedPersSignerConfig } from '../sdk/PersSignerSDK';\r\nimport { AuthenticatedUser } from '../types';\r\nimport { getSignerApiUrl } from './ServiceState';\r\n\r\n/**\r\n * Authentication service for user login and registration\r\n * Uses constructor-based dependency injection for WebAuthn provider\r\n * Updated for new v1 API endpoints\r\n */\r\nexport class AuthenticationService {\r\n private signerToken: string | null = null;\r\n\r\n private webAuthnProvider: WebAuthnProvider;\r\n \r\n constructor(config: ExtendedPersSignerConfig) {\r\n this.webAuthnProvider = config.webAuthnProvider;\r\n }\r\n\r\n /**\r\n * Login with PERS token to get signer JWT\r\n * @param persToken - PERS JWT from PERS authentication\r\n * @returns Promise resolving to login response or provider challenge data\r\n */\r\n async loginWithPersToken(persToken: string): Promise<JWTLoginResponse | unknown> {\r\n const httpClient = getHttpClient();\r\n \r\n // Detect environment from token before making request\r\n const isStaging = detectStagingEnvironmentFromToken(persToken);\r\n try {\r\n const requestBody: LoginRequest = {\r\n authToken: persToken\r\n };\r\n\r\n // Try request with detected environment\r\n let response: any;\r\n try {\r\n response = await httpClient.post<LoginResponse>(\r\n `${getSignerApiUrl(isStaging)}/auth/login`,\r\n requestBody\r\n // Note: Login endpoint doesn't require Authorization header (public endpoint)\r\n );\r\n } catch (productionError: any) {\r\n // We now rely on detectEnvironment() to set the correct environment beforehand.\r\n // If the request fails, it's likely a genuine error (network, auth, server),\r\n // not an environment mismatch. Therefore, we should NOT fallback blindly.\r\n throw productionError;\r\n }\r\n \r\n const backendResponse = response.data;\r\n \r\n if (backendResponse && backendResponse.success) {\r\n // Check if it's JWT response\r\n if ('access_token' in backendResponse) {\r\n // JWT response - set token and return\r\n this.signerToken = backendResponse.access_token;\r\n return backendResponse as JWTLoginResponse;\r\n }\r\n }\r\n\r\n // Handle expected \"User Not Found\" case gracefully\r\n if (backendResponse && (backendResponse.error === 'user_not_found' || backendResponse.status === 404)) {\r\n // This is not a system error, just a signal that we need to register\r\n throw new Error('user_not_found');\r\n }\r\n \r\n console.error('[AuthenticationService] Invalid response - no success or success=false:', backendResponse);\r\n throw new Error('Login failed: Invalid response format');\r\n } catch (error: any) {\r\n // Don't log \"user_not_found\" as an error since it's part of the normal flow for new users\r\n if (error.message !== 'user_not_found') {\r\n console.error(`[AuthenticationService] PERS token login failed:`, error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Verify signer token validity\r\n * @param token - Signer JWT to verify\r\n * @returns Promise resolving to verification result\r\n */\r\n async verifyToken(token: string): Promise<VerifyTokenResponse> {\r\n const httpClient = getHttpClient();\r\n \r\n try {\r\n const requestBody: VerifyTokenRequest = {\r\n token\r\n };\r\n\r\n // Detect environment from token (if possible, though verify usually uses signer token which might differ)\r\n // But usually we want to verify against the environment we are configured for.\r\n // Since verifyToken is often called with a stored token, we might not have the PERS token here.\r\n // However, if we have a token, we can try to detect.\r\n // For now, let's stick to serviceState, but we should probably be consistent.\r\n // If verifyToken is called, we assume the environment is already set or we use the token to check.\r\n \r\n // Let's check if the token itself gives a hint (if it's a signer token, it has an issuer too)\r\n const isStaging = detectStagingEnvironmentFromToken(token);\r\n\r\n const response = await httpClient.post<VerifyTokenResponse>(\r\n `${getSignerApiUrl(isStaging)}/auth/verify`,\r\n requestBody,\r\n { Authorization: `Bearer ${token}` }\r\n );\r\n \r\n const verifyData = response.data;\r\n \r\n if (!verifyData.valid) {\r\n throw new Error('Token verification failed');\r\n }\r\n \r\n return verifyData;\r\n } catch (error) {\r\n console.error(`[AuthenticationService] Token verification failed:`, error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Register user with unified flow\r\n * @param persToken - PERS JWT token\r\n * @returns Promise resolving to authenticated user data\r\n */\r\n async registerUser(persToken: string): Promise<JWTLoginResponse> {\r\n const httpClient = getHttpClient();\r\n const isStaging = detectStagingEnvironmentFromToken(persToken);\r\n const apiUrl = getSignerApiUrl(isStaging);\r\n\r\n try {\r\n // Step 1: Initialize registration\r\n const initRequest: RegisterRequest = {\r\n authToken: persToken\r\n };\r\n\r\n const initResponse = await httpClient.post<RegisterResponse>(\r\n `${apiUrl}/auth/register`,\r\n initRequest\r\n );\r\n\r\n const initData = initResponse.data;\r\n\r\n // Check if challenge is required\r\n if (initData && initData.data && initData.data.status === 'challenge_required') {\r\n const { challenge, state } = initData.data;\r\n\r\n if (!state) {\r\n throw new Error('Registration failed: Missing state in challenge response');\r\n }\r\n\r\n // Sign the challenge\r\n // Backend now returns a full WebAuthn options object in the 'challenge' field\r\n const signedChallenge = await this.webAuthnProvider.create(challenge as any);\r\n\r\n // Step 2: Complete registration\r\n const completeRequest: RegisterRequest = {\r\n authToken: persToken,\r\n signedChallenge,\r\n state\r\n };\r\n\r\n const completeResponse = await httpClient.post<RegisterResponse>(\r\n `${apiUrl}/auth/register`,\r\n completeRequest\r\n );\r\n\r\n const completeData = completeResponse.data;\r\n\r\n if (completeData.success && completeData.access_token) {\r\n return completeData as unknown as JWTLoginResponse;\r\n }\r\n \r\n throw new Error('Registration completion failed: No access token returned');\r\n } else if (initData.success && initData.access_token) {\r\n // Direct success\r\n return initData as unknown as JWTLoginResponse;\r\n }\r\n\r\n throw new Error('Registration failed: Invalid response format');\r\n\r\n } catch (error) {\r\n console.error('[AuthenticationService] Registration failed:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Get current signer token\r\n * @returns The current signer JWT token\r\n */\r\n getSignerToken(): string | null {\r\n return this.signerToken;\r\n }\r\n\r\n /**\r\n * Set signer token (for external token management)\r\n * @param token - Signer JWT token\r\n */\r\n setSignerToken(token: string): void {\r\n this.signerToken = token;\r\n }\r\n\r\n\r\n /**\r\n * Combined authentication flow - handles both login and registration\r\n * @param identifier - User identifier (email/userId)\r\n * @param persAccessToken - PERS JWT token for authentication\r\n * @param webAuthnProvider - WebAuthn provider for credential creation\r\n * @param relyingPartyConfig - Configuration for WebAuthn relying party\r\n * @returns Promise resolving to authenticated user with signer token\r\n */\r\n public async combinedAuthentication(identifier: string, persAccessToken: string): Promise<AuthenticatedUser> {\r\n try {\r\n // Step 1: Try to login with PERS token first (this will get signer JWT if user exists)\r\n let signerToken: string;\r\n \r\n try {\r\n const loginResult = await this.loginWithPersToken(persAccessToken);\r\n \r\n // Extract token from login result\r\n if (loginResult && typeof loginResult === 'object' && 'access_token' in loginResult) {\r\n signerToken = (loginResult as any).access_token;\r\n } else {\r\n throw new Error('Invalid login response format');\r\n }\r\n } catch (loginError) {\r\n \r\n // Step 2: User doesn't exist - register with v1 API (Unified Flow)\r\n try {\r\n const registerResult = await this.registerUser(persAccessToken);\r\n \r\n if (registerResult && registerResult.access_token) {\r\n signerToken = registerResult.access_token;\r\n } else {\r\n throw new Error('Registration successful but no access token returned');\r\n }\r\n } catch (registerError) {\r\n console.error(`[AuthenticationService] Registration failed for ${identifier}:`, registerError);\r\n throw registerError;\r\n }\r\n }\r\n\r\n const user: AuthenticatedUser = {\r\n identifier: identifier,\r\n signerAuthToken: signerToken,\r\n persAccessToken: persAccessToken,\r\n expiresAt: Date.now() + 300000 // 5 minutes\r\n };\r\n \r\n return user;\r\n } catch (error) {\r\n console.error(`[PersSignerSDK] Combined authentication failed for ${identifier}:`, error);\r\n throw new Error(`Combined authentication failed: ${error}`);\r\n }\r\n }\r\n}","import { getHttpClient } from '../platform/HttpClient';\r\nimport { \r\n ListWalletsRequest,\r\n ListWalletsResponse,\r\n Wallet\r\n} from '../types/signer-api-types';\r\nimport { detectStagingEnvironmentFromToken } from '../utils/environment';\r\nimport { getSignerApiUrl } from './ServiceState';\r\n\r\n/**\r\n * Wallet management service\r\n * Updated for v1 API endpoints per migration reference\r\n */\r\nexport class WalletService {\r\n \r\n /**\r\n * List all wallets for authenticated user\r\n * @param signerToken - Signer JWT token\r\n * @returns Promise resolving to wallet data\r\n */\r\n static async listWallets(signerToken: string): Promise<Wallet[]> {\r\n const httpClient = getHttpClient();\r\n\r\n const isStaging = detectStagingEnvironmentFromToken(signerToken);\r\n \r\n try {\r\n const requestBody: ListWalletsRequest = {};\r\n\r\n const response = await httpClient.post<ListWalletsResponse>(\r\n `${getSignerApiUrl(isStaging)}/wallets/list`,\r\n requestBody,\r\n { Authorization: `Bearer ${signerToken}` }\r\n );\r\n \r\n const backendResponse = response.data;\r\n \r\n if (backendResponse.success && backendResponse.data) {\r\n return backendResponse.data.items;\r\n }\r\n \r\n throw new Error('Failed to list wallets: Invalid response');\r\n } catch (error) {\r\n console.error('[WalletService] Error listing wallets:', error);\r\n throw error;\r\n }\r\n }\r\n}","import { getHttpClient } from '../platform/HttpClient';\r\nimport type { WebAuthnProvider, WebAuthnSignChallenge } from '../platform/WebAuthnProvider.types';\r\nimport { \r\n SigningRequest,\r\n HashSigningRequest,\r\n TypedDataSigningRequest \r\n} from '../types/key-service-types';\r\nimport { \r\n SignWalletRequest,\r\n SignWalletResponse,\r\n CompleteSignatureResponse\r\n} from '../types/signer-api-types';\r\nimport { detectStagingEnvironmentFromToken } from '../utils/environment';\r\nimport { getSignerApiUrl } from './ServiceState';\r\n\r\n/**\r\n * Signing service for cryptographic operations\r\n * Handles hash signing and typed data signing with WebAuthn\r\n * Uses constructor-based dependency injection for WebAuthn provider\r\n */\r\nexport class SigningService {\r\n private webAuthnProvider: WebAuthnProvider;\r\n\r\n constructor(webAuthnProvider: WebAuthnProvider) {\r\n this.webAuthnProvider = webAuthnProvider;\r\n }\r\n \r\n /**\r\n * Sign a hash using the specified wallet\r\n * @param authToken - Authentication token\r\n * @param walletId - Wallet identifier\r\n * @param hash - Hash to sign\r\n * @returns Promise resolving to signature response\r\n */\r\n async signHash(\r\n authToken: string,\r\n walletId: string,\r\n hash: string\r\n ): Promise<CompleteSignatureResponse['data']> {\r\n const request: HashSigningRequest = {\r\n kind: \"Hash\",\r\n hash,\r\n };\r\n return await this.signRequest(authToken, walletId, request);\r\n }\r\n\r\n /**\r\n * Sign EIP-712 typed data using the specified wallet\r\n * @param authToken - Authentication token\r\n * @param walletId - Wallet identifier\r\n * @param domain - EIP-712 domain\r\n * @param types - EIP-712 types definition\r\n * @param value - Data to sign\r\n * @returns Promise resolving to signature response\r\n */\r\n async signTypedData(\r\n authToken: string,\r\n walletId: string,\r\n domain: any,\r\n types: Record<string, any[]>,\r\n value: Record<string, any>\r\n ): Promise<CompleteSignatureResponse['data']> {\r\n const request: TypedDataSigningRequest = {\r\n blockchainKind: \"Evm\",\r\n kind: \"Eip712\",\r\n types,\r\n domain,\r\n message: value\r\n };\r\n return await this.signRequest(authToken, walletId, request);\r\n }\r\n\r\n /**\r\n * Generic signing method that handles the complete signing flow\r\n * @param authToken - Authentication token\r\n * @param walletId - Wallet identifier\r\n * @param request - Signing request object\r\n * @returns Promise resolving to signature response\r\n */\r\n private async signRequest(\r\n authToken: string,\r\n walletId: string,\r\n request: SigningRequest\r\n ): Promise<CompleteSignatureResponse['data']> {\r\n const httpClient = getHttpClient();\r\n\r\n const isStaging = detectStagingEnvironmentFromToken(authToken);\r\n \r\n try {\r\n // Step 1: Initial signing request\r\n const signRequest: SignWalletRequest = {\r\n walletId,\r\n payload: request\r\n };\r\n \r\n const response = await httpClient.post<SignWalletResponse>(\r\n `${getSignerApiUrl(isStaging)}/wallets/sign`,\r\n signRequest,\r\n { Authorization: `Bearer ${authToken}` }\r\n );\r\n \r\n let backendResponse = response.data;\r\n \r\n if (!backendResponse.success || !backendResponse.data) {\r\n console.error('[SigningService] Sign response invalid:', backendResponse);\r\n throw new Error('Signature initialization failed');\r\n }\r\n \r\n // Step 2: Handle challenge if required\r\n if (backendResponse.data.status === 'challenge_required') {\r\n const challenge = backendResponse.data.challenge as WebAuthnSignChallenge;\r\n \r\n // Sign the challenge using WebAuthn\r\n const assertion = await this.webAuthnProvider.sign(challenge);\r\n \r\n // Step 3: Complete signing with signed challenge\r\n const completeRequest: SignWalletRequest = {\r\n walletId,\r\n payload: request,\r\n signedChallenge: {\r\n challengeIdentifier: challenge.challengeIdentifier || challenge.challenge,\r\n ...assertion\r\n }\r\n };\r\n \r\n const completeResponse = await httpClient.post<SignWalletResponse>(\r\n `${getSignerApiUrl(isStaging)}/wallets/sign`,\r\n completeRequest,\r\n { Authorization: `Bearer ${authToken}` }\r\n );\r\n\r\n backendResponse = completeResponse.data;\r\n }\r\n\r\n if (backendResponse.success && backendResponse.data && backendResponse.data.status === 'completed') {\r\n // Cast to expected return type - assuming backend returns compatible structure\r\n return backendResponse.data as unknown as CompleteSignatureResponse['data'];\r\n }\r\n \r\n console.error('[SigningService] Complete response invalid:', backendResponse);\r\n throw new Error('Signature completion failed');\r\n \r\n } catch (error) {\r\n console.error(`[SigningService] Signing failed for wallet ${walletId}:`, error);\r\n throw error;\r\n }\r\n }\r\n \r\n /**\r\n * Sign multiple requests in batch (when backend supports it)\r\n * @param authToken - Authentication token\r\n * @param walletId - Wallet identifier\r\n * @param requests - Array of signing requests\r\n * @returns Promise resolving to array of signature responses\r\n */\r\n async signBatch(\r\n authToken: string,\r\n walletId: string,\r\n requests: SigningRequest[]\r\n ): Promise<CompleteSignatureResponse['data'][]> {\r\n // For now, process sequentially. Could be optimized for parallel processing\r\n const results: CompleteSignatureResponse['data'][] = [];\r\n \r\n for (const request of requests) {\r\n const result = await this.signRequest(authToken, walletId, request);\r\n results.push(result);\r\n }\r\n \r\n return results;\r\n }\r\n}","import { SessionAuthContextResponseDTO } from '@explorins/pers-shared/browser';\r\nimport { TenantPublicDTO, TransactionFormat, TRANSACTION_FORMATS, TransactionRequestResponseDTO, TransactionSubmissionRequestDTO } from '../types/pers-types';\r\nimport { detectStagingEnvironmentFromToken } from '../utils/environment';\r\n\r\nimport { SIGNER_CONFIG } from '../config/constants';\r\n\r\n/**\r\n * Service for interacting with PERS (Phygital Experience Rewards System) backend API\r\n */\r\n\r\n\r\n/**\r\n * Configuration interface for PERS API\r\n */\r\nexport interface PersApiConfig {\r\n baseUrl: string;\r\n projectKey?: string; // Now optional, will be retrieved from tenant\r\n}\r\n\r\n/**\r\n * Error response from the PERS API\r\n */\r\nexport interface PersApiError {\r\n status: number;\r\n message: string;\r\n error?: any;\r\n}\r\n\r\n/**\r\n * Get PERS API base URL with staging option\r\n * @param useStaging Whether to use staging environment URL\r\n */\r\nconst getPersApiUrl = (useStaging: boolean = false): string => {\r\n if (useStaging) {\r\n return SIGNER_CONFIG.STAGING_PERS_API_URL;\r\n }\r\n \r\n return SIGNER_CONFIG.DEFAULT_PERS_API_URL;\r\n};\r\n\r\n/**\r\n * Default PERS API configuration\r\n * Can be overridden by applications using the shared library\r\n */\r\nexport const DEFAULT_PERS_CONFIG: PersApiConfig = {\r\n baseUrl: getPersApiUrl(),\r\n // projectKey removed - will be retrieved from tenant\r\n};\r\n\r\ninterface CachedTenantData {\r\n tenant: TenantPublicDTO;\r\n cachedAt: number;\r\n expiresAt: number;\r\n}\r\n\r\nexport class PersService {\r\n private static config: PersApiConfig = DEFAULT_PERS_CONFIG;\r\n private static tenantCache: Map<string, CachedTenantData> = new Map();\r\n private static currentProjectKey: string | null = null;\r\n private static currentTenantId: string | null = null;\r\n private static readonly TENANT_CACHE_TTL = 24 * 60 * 60 * 1000; // 24 hours - tenant configs are essentially static\r\n\r\n /**\r\n * Configure the PERS API settings\r\n * @param config - The configuration object\r\n */\r\n static configure(config: Partial<PersApiConfig>) {\r\n this.config = { ...this.config, ...config };\r\n }\r\n\r\n\r\n\r\n /**\r\n * Get current configuration\r\n */\r\n static getConfig(): PersApiConfig {\r\n return { ...this.config };\r\n }\r\n\r\n /**\r\n * Get tenant information by tenant ID\r\n * @param tenantId - The tenant ID to retrieve\r\n * @param authToken - Optional auth token for authentication\r\n * @returns Promise with tenant public information\r\n */\r\n static async getTenantById(tenantId: string, authToken: string): Promise<TenantPublicDTO> {\r\n // Check memory cache first with expiration\r\n const cached = this.tenantCache.get(tenantId);\r\n if (cached && Date.now() < cached.expiresAt) {\r\n return cached.tenant;\r\n }\r\n\r\n try {\r\n const headers: Record<string, string> = {\r\n 'accept': 'application/json',\r\n 'Content-Type': 'application/json'\r\n };\r\n\r\n let url = this.config.baseUrl;\r\n\r\n // Add auth token if provided and detect environment\r\n if (authToken) {\r\n headers['Authorization'] = `Bearer ${authToken}`;\r\n const isStaging = detectStagingEnvironmentFromToken(authToken);\r\n url = getPersApiUrl(isStaging);\r\n }\r\n\r\n // Try request\r\n const response = await fetch(`${url}/tenants/${tenantId}`, {\r\n method: 'GET',\r\n headers\r\n });\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n throw {\r\n status: response.status,\r\n message: errorData.message || `Failed to fetch tenant ${tenantId}`,\r\n error: errorData\r\n } as PersApiError;\r\n }\r\n\r\n const tenantData = await response.json() as TenantPublicDTO;\r\n\r\n // Cache the tenant data with expiration\r\n const now = Date.now();\r\n this.tenantCache.set(tenantId, {\r\n tenant: tenantData,\r\n cachedAt: now,\r\n expiresAt: now + this.TENANT_CACHE_TTL\r\n });\r\n \r\n // Update current project key (check multiple possible property names)\r\n this.currentProjectKey = (tenantData as any).projectKey || (tenantData as any).projectApiKey || (tenantData as any).apiKey;\r\n this.currentTenantId = tenantId;\r\n \r\n return tenantData;\r\n } catch (error: any) {\r\n console.error('Error fetching tenant:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Initialize tenant configuration from JWT\r\n * @param tenantId - The tenant ID from JWT payload\r\n * @param authToken - Optional auth token for authentication\r\n * @returns Promise with tenant information\r\n */\r\n static async initializeTenant(tenantId: string, authToken: string): Promise<TenantPublicDTO> {\r\n const tenantData = await this.getTenantById(tenantId, authToken);\r\n \r\n // Update service configuration with tenant's project key\r\n const projectKey = tenantData.projectApiKey;\r\n if (projectKey) {\r\n this.currentProjectKey = projectKey;\r\n this.currentTenantId = tenantId;\r\n }\r\n \r\n return tenantData;\r\n }\r\n\r\n /**\r\n * Ensure tenant is initialized and current, with automatic revalidation\r\n * @param tenantId - The tenant ID to ensure is initialized\r\n * @param authToken - Optional auth token for authentication\r\n * @returns Promise with tenant information\r\n */\r\n static async ensureTenantInitialized(tenantId: string, authToken: string): Promise<TenantPublicDTO> {\r\n // Check if we already have the right tenant initialized and it's still valid\r\n const cached = this.tenantCache.get(tenantId);\r\n if (this.currentTenantId === tenantId && cached && Date.now() < cached.expiresAt) {\r\n return cached.tenant;\r\n }\r\n\r\n // Initialize or refresh tenant data\r\n return await this.initializeTenant(tenantId, authToken);\r\n }\r\n\r\n /**\r\n * Get the current project key (either from tenant or fallback)\r\n * @param tenantId - Optional tenant ID to ensure is initialized\r\n * @returns The project key to use for API calls\r\n */\r\n private static async getProjectKey(tenantId: string, authToken: string): Promise<string> {\r\n // If tenantId provided and different from current, initialize it\r\n if (tenantId && this.currentTenantId !== tenantId) {\r\n await this.ensureTenantInitialized(tenantId, authToken);\r\n }\r\n \r\n if (this.currentProjectKey) {\r\n return this.currentProjectKey;\r\n }\r\n \r\n if (this.config.projectKey) {\r\n return this.config.projectKey;\r\n }\r\n \r\n console.error('No project key available. Current tenant cache:', Array.from(this.tenantCache.keys()));\r\n throw new Error('No project key available. Please initialize tenant or configure project key.');\r\n }\r\n\r\n /**\r\n * Clear tenant cache and reset project key\r\n */\r\n static clearTenantCache(): void {\r\n this.tenantCache.clear();\r\n this.currentProjectKey = null;\r\n this.currentTenantId = null;\r\n }\r\n\r\n /**\r\n * Authenticates a user with the PERS backend using their auth token\r\n * \r\n * @param authToken - The authentication token received from backend after login/registration\r\n * @param tenantId - Optional tenant ID for automatic initialization\r\n * @returns A promise that resolves to the authentication response\r\n * @throws If the request fails\r\n */\r\n static async authenticateUser(authToken: string, tenantId: string): Promise<SessionAuthContextResponseDTO> {\r\n try {\r\n const projectKey = await this.getProjectKey(tenantId, authToken);\r\n \r\n const headers: Record<string, string> = {\r\n 'accept': 'application/json',\r\n 'x-project-key': projectKey,\r\n 'Content-Type': 'application/json'\r\n };\r\n\r\n // Detect environment from token\r\n const isStaging = detectStagingEnvironmentFromToken(authToken);\r\n let response = await fetch(`${getPersApiUrl(isStaging)}/auth/token`, {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify({ authToken })\r\n }); \r\n\r\n const data = await response.json();\r\n if (!response.ok) {\r\n throw {\r\n status: response.status,\r\n message: data.message || 'Authentication with PERS backend failed',\r\n error: data\r\n } as PersApiError;\r\n }\r\n \r\n console.info('[PERS] User authentication successful');\r\n return data as SessionAuthContextResponseDTO;\r\n } catch (error: any) {\r\n // Rethrow a structured error\r\n throw {\r\n status: error.status || 500,\r\n message: error.message || 'Failed to authenticate with PERS backend',\r\n error\r\n } as PersApiError;\r\n }\r\n }\r\n\r\n /**\r\n * Submits a transaction by calling the backend endpoint\r\n *\r\n * @param transactionId - The ID of the transaction to submit\r\n * @param signedTransactionOrSignature - The signed transaction data or EIP-712 signature\r\n * @param persAccessToken - The PERS access token for authentication (Bearer)\r\n * @param submissionType - The transaction format type\r\n * @param tenantId - Optional tenant ID for automatic initialization\r\n * @returns A promise that resolves to the transaction submission response\r\n * @throws If the request fails\r\n */\r\n static async submitTransaction(\r\n transactionId: string, \r\n signedTransactionOrSignature: string, \r\n persAccessToken: string,\r\n submissionType: TransactionFormat,\r\n tenantId: string\r\n ): Promise<TransactionRequestResponseDTO> {\r\n try {\r\n // Map TransactionFormat to the backend's expected submission type\r\n const dto: TransactionSubmissionRequestDTO = {\r\n transactionId,\r\n type: submissionType,\r\n ...(submissionType === TRANSACTION_FORMATS.EIP_712\r\n ? { signature: signedTransactionOrSignature }\r\n : { signedTransaction: signedTransactionOrSignature }\r\n )\r\n };\r\n\r\n // Detect environment from token\r\n const isStaging = detectStagingEnvironmentFromToken(persAccessToken);\r\n\r\n // UPDATED: /transaction/auth/submit/${transactionId} → /transactions/${transactionId}/submit\r\n const res = await fetch(`${getPersApiUrl(isStaging)}/transactions/submit`, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n 'x-project-key': await this.getProjectKey(tenantId, persAccessToken),\r\n Authorization: `Bearer ${persAccessToken}`,\r\n },\r\n body: JSON.stringify(dto),\r\n });\r\n \r\n const response = await res.json();\r\n \r\n if (!res.ok) {\r\n // Throw structured error with the backend response\r\n throw {\r\n status: res.status,\r\n message: response.message || \"Failed to submit transaction\",\r\n error: response\r\n } as PersApiError;\r\n }\r\n \r\n return response as TransactionRequestResponseDTO;\r\n } catch (error: any) {\r\n // Rethrow a structured error\r\n throw {\r\n status: error.status || 500,\r\n message: error.message || 'Failed to submit transaction to PERS backend',\r\n error\r\n } as PersApiError;\r\n }\r\n }\r\n\r\n /**\r\n * Fetches a prepared transaction for signing by transactionId\r\n * @param transactionId - The transaction ID to fetch\r\n * @param persAccessToken - The PERS access token for authentication (Bearer)\r\n * @param tenantId - Optional tenant ID for automatic initialization\r\n * @returns The prepared transaction data\r\n * @throws If the request fails\r\n */\r\n static async fetchPreparedTransaction(transactionId: string, persAccessToken: string, tenantId: string): Promise<TransactionRequestResponseDTO> {\r\n try {\r\n // Detect environment from token\r\n const isStaging = detectStagingEnvironmentFromToken(persAccessToken);\r\n\r\n // ✅ UPDATED: /transaction/auth/prepare-signing/${transactionId} → /transactions/${transactionId}/prepare\r\n const res = await fetch(\r\n `${getPersApiUrl(isStaging)}/transactions/${transactionId}/prepare`,\r\n {\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"x-project-key\": await this.getProjectKey(tenantId, persAccessToken),\r\n Authorization: `Bearer ${persAccessToken}`,\r\n },\r\n }\r\n );\r\n \r\n const response = await res.json();\r\n \r\n if (!res.ok) {\r\n // Throw structured error with the backend response\r\n throw {\r\n status: res.status,\r\n message: response.message || \"Failed to fetch prepared transaction\",\r\n error: response\r\n } as PersApiError;\r\n }\r\n \r\n return response as TransactionRequestResponseDTO;\r\n } catch (error: any) {\r\n // Rethrow a structured error\r\n throw {\r\n status: error.status || 500,\r\n message: error.message || 'Failed to fetch prepared transaction from PERS backend',\r\n error\r\n } as PersApiError;\r\n }\r\n }\r\n\r\n /**\r\n * Helper method to determine if transaction data is available for signing\r\n * @param transactionResponse - Response from prepare or fetch transaction\r\n * @returns boolean indicating if transaction can be signed\r\n */\r\n static isTransactionReadyForSigning(transactionResponse: TransactionRequestResponseDTO): boolean {\r\n return transactionResponse.signingData !== null && transactionResponse.signingData !== undefined;\r\n }\r\n \r\n /**\r\n * Helper method to get transaction data from response\r\n * @param transactionResponse - Response from prepare or fetch transaction\r\n * @returns The transaction data ready for signing\r\n * @throws If transaction data is not available\r\n */\r\n static getTransactionDataForSigning(transactionResponse: TransactionRequestResponseDTO) {\r\n if (!transactionResponse.signingData) {\r\n throw new Error('Transaction data is not ready for signing');\r\n }\r\n return transactionResponse.signingData!;\r\n }\r\n}\r\n","import { getHttpClient } from '../platform/HttpClient';\r\nimport { HealthCheckResponse } from '../types/signer-api-types';\r\nimport { getSignerApiUrl } from './ServiceState';\r\n\r\n/**\r\n * Health check service for signer API\r\n * Handles health check operations for the new v1 API\r\n */\r\nexport class HealthService {\r\n \r\n /**\r\n * Perform health check on the signer API\r\n * @returns Promise resolving to health check result\r\n */\r\n static async checkHealth(): Promise<HealthCheckResponse> {\r\n const httpClient = getHttpClient();\r\n \r\n try {\r\n const response = await httpClient.get<HealthCheckResponse>(\r\n `${getSignerApiUrl()}/health`\r\n );\r\n \r\n return response.data;\r\n } catch (error) {\r\n console.error('[HealthService] Health check failed:', error);\r\n // Return failed health check instead of throwing\r\n return {\r\n success: false\r\n };\r\n }\r\n }\r\n}","import { Signature } from 'ethers';\r\nimport { CompleteSignatureResponse } from '../types/signer-api-types';\r\n\r\n// Legacy signature response interface for backward compatibility\r\nexport interface GenerateSignatureResponse {\r\n status: 'Signed' | 'Failed' | 'Pending';\r\n signature?: {\r\n r: string;\r\n s: string;\r\n recid: number;\r\n };\r\n error?: string;\r\n}\r\n\r\nexport class WalletError extends Error {\r\n constructor(public code: number, message: string, public details?: any) {\r\n super(message);\r\n this.name = 'WalletError';\r\n }\r\n}\r\n\r\n/**\r\n * Adapter function to convert backend signature response to legacy format\r\n * Handles both structured (EIP-712) and string (Hex/Base64) signature formats\r\n */\r\nexport const adaptSignatureResponse = (newResponse: CompleteSignatureResponse['data']): GenerateSignatureResponse => {\r\n if (!newResponse.signature) {\r\n console.error('[SignatureUtils] No signature in response:', newResponse);\r\n throw new Error('Signature missing from response');\r\n }\r\n \r\n // Handle structured signature format (typically from EIP-712 signing)\r\n if (typeof newResponse.signature === 'object' && !Array.isArray(newResponse.signature) && 'r' in newResponse.signature) {\r\n const sig = newResponse.signature as { r: string; s: string; recid: number };\r\n const { r, s, recid } = sig;\r\n \r\n return {\r\n status: 'Signed' as const,\r\n signature: {\r\n r,\r\n s,\r\n recid // Use recid directly from backend\r\n }\r\n };\r\n }\r\n \r\n // Handle string signature format\r\n if (typeof newResponse.signature === 'string') {\r\n const signature = newResponse.signature as string;\r\n\r\n // 1. Standard Hex Signature (0x + 32 bytes r + 32 bytes s + 1 byte v)\r\n if (signature.startsWith('0x') && signature.length === 132) {\r\n const r = '0x' + signature.slice(2, 66);\r\n const s = '0x' + signature.slice(66, 130);\r\n const v = parseInt(signature.slice(130, 132), 16);\r\n const recid = v >= 27 ? v - 27 : v;\r\n \r\n return {\r\n status: 'Signed' as const,\r\n signature: { r, s, recid }\r\n };\r\n }\r\n\r\n // 2. Base64 Encoded JSON\r\n // The backend sometimes returns a Base64 string containing the JSON signature object\r\n try {\r\n const decoded = atob(signature);\r\n const jsonSig = JSON.parse(decoded);\r\n \r\n if (typeof jsonSig === 'object' && jsonSig !== null && jsonSig.signature?.r && jsonSig.signature?.s) {\r\n return {\r\n status: 'Signed' as const,\r\n signature: {\r\n r: jsonSig.signature.r,\r\n s: jsonSig.signature.s,\r\n // Use nullish coalescing (??) because recid can be 0\r\n recid: jsonSig.signature.recid ?? jsonSig.signature.yParity ?? 0\r\n }\r\n };\r\n }\r\n } catch {\r\n // Not a valid Base64 JSON signature, continue to error\r\n }\r\n \r\n console.error('[SignatureUtils] Invalid string signature format:', signature.substring(0, 100));\r\n throw new Error(`Invalid string signature format. Expected 132-char hex or Base64 JSON.`);\r\n }\r\n \r\n console.error('[SignatureUtils] Invalid signature format - expected structured object or string:', typeof newResponse.signature);\r\n throw new Error('Invalid signature format in response - expected structured object or string from backend');\r\n};\r\n\r\nexport const assertSigned = (res: GenerateSignatureResponse) => {\r\n if (res.status === \"Failed\") {\r\n throw new WalletError(-1, \"signing failed\", res);\r\n } else if (res.status !== \"Signed\") {\r\n throw new WalletError(\r\n -1,\r\n \"cannot complete signing synchronously because this wallet action requires policy approval\",\r\n res\r\n );\r\n }\r\n};\r\n\r\nexport const combineSignature = (res: GenerateSignatureResponse): string => {\r\n if (!res.signature) {\r\n console.error('[SignatureUtils] No signature in response for combining:', res);\r\n throw new WalletError(-1, \"signature missing\", res);\r\n }\r\n\r\n const { r, s, recid } = res.signature;\r\n \r\n const ethersSignature = Signature.from({\r\n r,\r\n s,\r\n v: recid ? 0x1c : 0x1b, // Assuming 0x1c for chain_id > 0, 0x1b otherwise. Backend usually provides recid.\r\n });\r\n \r\n return ethersSignature.serialized;\r\n};\r\n","import { CounterfactualWalletTransactionResponse, TransactionStatus } from '@explorins/pers-shared/browser';\r\nimport { LegacyTransaction } from '@explorins/web3-ts/types';\r\n\r\n/**\r\n * Combined transaction status type that includes both PERS and additional statuses\r\n */\r\nexport type CombinedTransactionStatus = TransactionStatus;\r\n\r\n/**\r\n * Transaction statuses that allow signing\r\n */\r\nexport const SIGNABLE_STATUSES = [TransactionStatus.PENDING_SIGNATURE, TransactionStatus.CREATED] as const;\r\n\r\n/**\r\n * Transaction status information for UI display\r\n */\r\nexport interface TransactionStatusInfo {\r\n transactionId: string;\r\n transactionStatus: CombinedTransactionStatus;\r\n message: string;\r\n}\r\n\r\n/**\r\n * Transaction signing result\r\n */\r\nexport interface TransactionSigningResult {\r\n success: boolean;\r\n transactionId: string;\r\n // transactionHash?: string;\r\n signature?: string;\r\n signingData?: CounterfactualWalletTransactionResponse | LegacyTransaction\r\n error?: string;\r\n statusInfo?: TransactionStatusInfo;\r\n // shouldRedirect?: boolean;\r\n // redirectUrl?: string;\r\n shouldShowStatus?: boolean;\r\n}\r\n\r\n/**\r\n * Transaction submission result for internal processing\r\n */\r\nexport interface SubmissionResult {\r\n submitResult: import('../types/pers-types').TransactionRequestResponseDTO;\r\n shouldRedirect: boolean;\r\n redirectUrl?: string;\r\n transactionHash: string | null;\r\n success: boolean;\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Metadata for transaction parameters - string values only\r\n */\r\n/* export interface TransactionMetadata {\r\n [key: string]: string;\r\n} */\r\n\r\n/**\r\n * Authentication tokens required for transaction signing\r\n */\r\nexport interface SigningAuthTokens {\r\n signerAuthToken: string;\r\n persAccessToken: string;\r\n}\r\n\r\n/**\r\n * Transaction signing parameters\r\n */\r\nexport interface TransactionSigningParams {\r\n transactionId: string;\r\n tenantId: string;\r\n authTokens: SigningAuthTokens;\r\n ethersProviderUrl: string;\r\n returnUrl?: string;\r\n // metadata?: TransactionMetadata;\r\n // Optional wallet error state (eliminates need for localStorage)\r\n // walletRegistrationFailed?: boolean;\r\n // walletErrorDetails?: string;\r\n}","/**\r\n * Error codes for transaction signing operations\r\n */\r\nexport enum TransactionSigningErrorCode {\r\n INVALID_TOKENS = 'INVALID_TOKENS',\r\n TRANSACTION_NOT_FOUND = 'TRANSACTION_NOT_FOUND',\r\n TRANSACTION_NOT_PENDING = 'TRANSACTION_NOT_PENDING',\r\n WALLET_NOT_AVAILABLE = 'WALLET_NOT_AVAILABLE',\r\n WEBAUTHN_OPERATION_IN_PROGRESS = 'WEBAUTHN_OPERATION_IN_PROGRESS',\r\n SIGNING_CANCELLED = 'SIGNING_CANCELLED',\r\n PERS_AUTH_FAILED = 'PERS_AUTH_FAILED',\r\n AUTH_FAILED = 'AUTH_FAILED',\r\n TRANSACTION_NOT_READY = 'TRANSACTION_NOT_READY',\r\n SUBMISSION_FAILED = 'SUBMISSION_FAILED',\r\n SERVER_ERROR = 'SERVER_ERROR',\r\n UNKNOWN_ERROR = 'UNKNOWN_ERROR'\r\n}\r\n\r\n/**\r\n * Structured error for transaction signing operations\r\n */\r\nexport interface TransactionSigningError extends Error {\r\n code: TransactionSigningErrorCode;\r\n transactionId?: string;\r\n originalError?: unknown;\r\n}","/**\r\n * Signing status types for type-safe status updates\r\n * Using const pattern instead of enum for better bundling compatibility\r\n */\r\nexport const SigningStatus = {\r\n INITIALIZING: 'initializing',\r\n AUTHENTICATING: 'authenticating',\r\n PREPARING: 'preparing',\r\n SIGNING: 'signing',\r\n SUBMITTING: 'submitting',\r\n COMPLETED: 'completed',\r\n ERROR: 'error',\r\n EXPIRED: 'expired'\r\n} as const;\r\n\r\n/**\r\n * Type for signing status values\r\n */\r\nexport type SigningStatus = typeof SigningStatus[keyof typeof SigningStatus];\r\n\r\n/**\r\n * Status update data interface\r\n */\r\nexport interface StatusUpdateData {\r\n transactionId?: string;\r\n transactionHash?: string;\r\n error?: string;\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * Status update callback interface for tracking transaction progress\r\n * \r\n * @interface StatusCallback\r\n * @property {function} onStatusUpdate - Callback function that receives type-safe status updates\r\n */\r\nexport interface StatusCallback {\r\n onStatusUpdate?: (status: SigningStatus, message: string, data?: StatusUpdateData) => void;\r\n}","import { \r\n adaptSignatureResponse, \r\n assertSigned,\r\n combineSignature\r\n} from '../utils/signature';\r\nimport { WalletMetadata } from '../types/wallet-types';\r\n\r\nimport {\r\n AbstractSigner,\r\n Provider,\r\n Transaction,\r\n TransactionLike,\r\n TransactionRequest,\r\n TypedDataDomain,\r\n TypedDataField,\r\n computeAddress,\r\n getAddress,\r\n keccak256,\r\n resolveAddress,\r\n resolveProperties,\r\n toUtf8Bytes,\r\n} from \"ethers\";\r\nimport { SigningService } from \"./SigningService\";\r\nimport { \r\n AnyTransactionData, \r\n TRANSACTION_FORMATS,\r\n LegacyTransaction, \r\n EIP2930Transaction, \r\n EIP1559Transaction, \r\n EIP712TransactionData\r\n} from \"../types\";\r\n\r\ntype WalletOptions = {\r\n wallet: WalletMetadata;\r\n authToken: string;\r\n signingService: SigningService;\r\n};\r\n\r\nexport class KeyWallet extends AbstractSigner {\r\n private address?: string;\r\n private authToken: string;\r\n private metadata: WalletMetadata;\r\n private signingService: SigningService;\r\n\r\n constructor(private options: WalletOptions, provider?: Provider | null) {\r\n super(provider);\r\n this.metadata = options.wallet;\r\n this.authToken = options.authToken;\r\n this.signingService = options.signingService;\r\n }\r\n\r\n public connect(provider: Provider | null): KeyWallet {\r\n const copy = new KeyWallet(this.options, provider);\r\n copy.address = this.address;\r\n copy.metadata = this.metadata;\r\n copy.authToken = this.authToken;\r\n return copy;\r\n }\r\n\r\n public async getAddress(): Promise<string> {\r\n if (this.address) {\r\n return this.address; // Return cached address if available\r\n }\r\n // Compute and cache the address if not already available\r\n this.address = computeAddress(`0x${this.metadata.signingKey.publicKey}`);\r\n return this.address;\r\n }\r\n\r\n private async signHash(hash: string): Promise<string> {\r\n const rawRes = await this.signingService.signHash(\r\n this.authToken,\r\n this.metadata.id,\r\n hash\r\n );\r\n \r\n const res = adaptSignatureResponse(rawRes);\r\n assertSigned(res);\r\n const combinedSignature = combineSignature(res);\r\n \r\n return combinedSignature;\r\n }\r\n\r\n public async signTransaction(tx: TransactionRequest): Promise<string> {\r\n // Resolve any addresses\r\n const { to, from } = await resolveProperties({\r\n to: tx.to ? resolveAddress(tx.to, this.provider) : undefined,\r\n from: tx.from ? resolveAddress(tx.from, this.provider) : undefined,\r\n });\r\n\r\n if (to != null) {\r\n tx.to = to;\r\n }\r\n if (from != null) {\r\n tx.from = from;\r\n }\r\n\r\n if (tx.from != null) {\r\n if (getAddress(<string>tx.from) !== (await this.getAddress())) {\r\n throw new Error(\"transaction from address mismatch\");\r\n }\r\n delete tx.from;\r\n }\r\n\r\n const btx = Transaction.from(<TransactionLike<string>>tx);\r\n const signature = await this.signHash(btx.unsignedHash);\r\n\r\n // Populate the signature\r\n const signedTx = Transaction.from(btx);\r\n signedTx.signature = signature;\r\n\r\n return signedTx.serialized;\r\n }\r\n\r\n public async signMessage(message: string | Uint8Array): Promise<string> {\r\n if (typeof message === \"string\") {\r\n message = toUtf8Bytes(message);\r\n }\r\n\r\n const hash = keccak256(message);\r\n return this.signHash(hash);\r\n }\r\n\r\n public async signTypedData(\r\n domain: TypedDataDomain,\r\n types: Record<string, TypedDataField[]>,\r\n value: Record<string, any>\r\n ): Promise<string> {\r\n try {\r\n // Use native EIP-712 support with correct structure\r\n const rawRes = await this.signingService.signTypedData(\r\n this.authToken,\r\n this.metadata.id,\r\n domain,\r\n types,\r\n value\r\n );\r\n \r\n const res = adaptSignatureResponse(rawRes);\r\n assertSigned(res);\r\n const combinedSignature = combineSignature(res);\r\n \r\n return combinedSignature;\r\n } catch (error) {\r\n console.error('[KeyWallet] EIP-712 signing failed:', error);\r\n throw new Error(`EIP-712 signing failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n }\r\n\r\n /**\r\n * Signs a PERS transaction based on its format\r\n * Handles different transaction types: Legacy, EIP-2930, EIP-1559, and EIP-712\r\n * @param transactionData - The transaction data from PERS API\r\n * @returns The signature string\r\n */\r\n public async signPersTransaction(transactionData: AnyTransactionData): Promise<string> {\r\n switch (transactionData.format) {\r\n case TRANSACTION_FORMATS.LEGACY: {\r\n const legacyTx = transactionData as LegacyTransaction;\r\n const ethersTransaction: TransactionRequest = {\r\n to: legacyTx.to,\r\n value: legacyTx.value,\r\n data: legacyTx.data,\r\n gasLimit: legacyTx.gas,\r\n gasPrice: legacyTx.gasPrice,\r\n nonce: legacyTx.nonce,\r\n chainId: legacyTx.chainId,\r\n type: 0\r\n };\r\n return await this.signTransaction(ethersTransaction);\r\n }\r\n\r\n case TRANSACTION_FORMATS.EIP_2930: {\r\n const eip2930Tx = transactionData as EIP2930Transaction;\r\n const ethersTransaction: TransactionRequest = {\r\n to: eip2930Tx.to,\r\n value: eip2930Tx.value,\r\n data: eip2930Tx.data,\r\n gasLimit: eip2930Tx.gas,\r\n gasPrice: eip2930Tx.gasPrice,\r\n nonce: eip2930Tx.nonce,\r\n chainId: eip2930Tx.chainId,\r\n accessList: eip2930Tx.accessList,\r\n type: 1\r\n };\r\n return await this.signTransaction(ethersTransaction);\r\n }\r\n\r\n case TRANSACTION_FORMATS.EIP_1559: {\r\n const eip1559Tx = transactionData as EIP1559Transaction;\r\n const ethersTransaction: TransactionRequest = {\r\n to: eip1559Tx.to,\r\n value: eip1559Tx.value,\r\n data: eip1559Tx.data,\r\n gasLimit: eip1559Tx.gas,\r\n maxFeePerGas: eip1559Tx.maxFeePerGas,\r\n maxPriorityFeePerGas: eip1559Tx.maxPriorityFeePerGas,\r\n nonce: eip1559Tx.nonce,\r\n chainId: eip1559Tx.chainId,\r\n type: 2\r\n };\r\n return await this.signTransaction(ethersTransaction);\r\n }\r\n\r\n case TRANSACTION_FORMATS.EIP_712: {\r\n const eip712Data = transactionData as EIP712TransactionData;\r\n const typedData = eip712Data.typedData;\r\n\r\n // Sign the EIP-712 structured data with only Transaction and its dependencies\r\n // Backend expects only the types that are actually used by the primary type\r\n const transactionTypes = {\r\n Transaction: typedData.types.Transaction\r\n };\r\n \r\n // Sign the EIP-712 structured data\r\n return await this.signTypedData(\r\n typedData.domain,\r\n transactionTypes,\r\n typedData.message\r\n );\r\n }\r\n\r\n default:\r\n throw new Error(`Unsupported transaction format: ${(transactionData as any).format}`);\r\n }\r\n }\r\n}\r\n","import { TransactionStatus } from '@explorins/pers-shared/browser';\r\nimport { \r\n CombinedTransactionStatus, \r\n TransactionStatusInfo \r\n} from '../types/transaction-types';\r\nimport { \r\n TransactionSigningErrorCode, \r\n TransactionSigningError \r\n} from '../types/error-types';\r\n\r\n/**\r\n * Handles all error-related operations for transaction signing\r\n */\r\nexport class TransactionErrorHandler {\r\n \r\n /**\r\n * Get user-friendly status messages for transaction statuses\r\n * @param status - The transaction status\r\n * @returns Human-readable message explaining the status\r\n */\r\n static getStatusMessage(status: CombinedTransactionStatus): string {\r\n // Validate input parameter\r\n if (!status || typeof status !== 'string') {\r\n return 'Transaction status is unknown and cannot be processed.';\r\n }\r\n\r\n const normalizedStatus = status.toLowerCase();\r\n \r\n switch (normalizedStatus) {\r\n // PERS TransactionStatus enum values\r\n case TransactionStatus.SUCCEEDED.toLowerCase():\r\n return 'This transaction has already been completed successfully.';\r\n case TransactionStatus.PROCESSING.toLowerCase():\r\n case TransactionStatus.BROADCASTED.toLowerCase():\r\n return 'This transaction is currently being processed on the blockchain.';\r\n case TransactionStatus.FAILED.toLowerCase():\r\n return 'This transaction has failed and cannot be processed.';\r\n case TransactionStatus.PENDING_SIGNATURE.toLowerCase():\r\n case TransactionStatus.CREATED.toLowerCase():\r\n return 'This transaction is ready to be signed.';\r\n \r\n // Additional status values\r\n case TransactionStatus.CANCELLED.toLowerCase():\r\n return 'This transaction has been cancelled and cannot be signed.';\r\n case TransactionStatus.EXPIRED.toLowerCase():\r\n return 'This transaction has expired and can no longer be signed.';\r\n \r\n default:\r\n return `This transaction is in \"${status}\" state and cannot be signed at this time.`;\r\n }\r\n }\r\n\r\n /**\r\n * Safely convert string status to TransactionStatus enum\r\n * @param statusString - The status string to convert\r\n * @returns A valid TransactionStatus enum value\r\n */\r\n static parseTransactionStatus(statusString: string): CombinedTransactionStatus {\r\n // Normalize the input string to uppercase to match enum values\r\n const normalizedStatus = statusString.trim().toUpperCase();\r\n \r\n // Check if the normalized status exists in the TransactionStatus enum\r\n const enumValues = Object.values(TransactionStatus) as string[];\r\n const matchingStatus = enumValues.find(value => value.toUpperCase() === normalizedStatus);\r\n \r\n // Return the matching status or a fallback\r\n return (matchingStatus as CombinedTransactionStatus) || TransactionStatus.FAILED;\r\n }\r\n\r\n /**\r\n * Create a structured transaction signing error\r\n * @param code - Error code\r\n * @param message - Error message\r\n * @param transactionId - Optional transaction ID\r\n * @param originalError - Original error that caused this\r\n * @returns Structured error object\r\n */\r\n static createError(\r\n code: TransactionSigningErrorCode,\r\n message: string,\r\n transactionId?: string,\r\n originalError?: unknown\r\n ): TransactionSigningError {\r\n const error = new Error(message) as TransactionSigningError;\r\n error.code = code;\r\n error.transactionId = transactionId;\r\n error.originalError = originalError;\r\n return error;\r\n }\r\n\r\n /**\r\n * Create transaction status info object for UI display\r\n * @param transactionId - The transaction ID\r\n * @param status - The transaction status\r\n * @param customMessage - Optional custom message, otherwise uses default status message\r\n * @returns TransactionStatusInfo object\r\n */\r\n static createStatusInfo(\r\n transactionId: string,\r\n status: CombinedTransactionStatus,\r\n customMessage?: string\r\n ): TransactionStatusInfo {\r\n return {\r\n transactionId,\r\n transactionStatus: status,\r\n message: customMessage || this.getStatusMessage(status)\r\n };\r\n }\r\n\r\n /**\r\n * Handle TRANSACTION_NOT_PENDING error from PERS API\r\n * Consolidates the duplicate error handling logic\r\n * @param error - The error object from PERS API\r\n * @param transactionId - The transaction ID\r\n * @returns Never (always throws)\r\n * @throws Object with shouldShowStatus and statusInfo\r\n */\r\n static handleTransactionNotPendingError(\r\n error: { \r\n status?: number; \r\n error?: { code?: string; message?: string; /* developerMessage?: string */ }; \r\n code?: string; \r\n message?: string; \r\n // developerMessage?: string \r\n },\r\n transactionId: string\r\n ): never {\r\n // Extract error data - could be in error.error or directly in error\r\n const errorData = error.error || error;\r\n \r\n // Default to FAILED since we can't determine exact status without parsing messages\r\n // The backend message will be displayed to the user\r\n const actualStatus = TransactionStatus.FAILED;\r\n \r\n // Create status info for UI\r\n const statusInfo = this.createStatusInfo(\r\n transactionId,\r\n actualStatus,\r\n errorData.message || this.getStatusMessage(actualStatus)\r\n );\r\n \r\n // Return status info instead of storing in localStorage\r\n // Throw special error that UI can handle\r\n throw { shouldShowStatus: true, statusInfo };\r\n }\r\n\r\n /**\r\n * Process PERS API errors and handle TRANSACTION_NOT_PENDING cases\r\n * @param err - The caught error from PERS API\r\n * @param transactionId - The transaction ID\r\n * @throws Either the original error or a structured status error\r\n */\r\n static processPersApiError(err: unknown, transactionId: string): never {\r\n // Handle structured PERS error response\r\n const error = err as { \r\n status?: number; \r\n error?: { code?: string; message?: string; /* developerMessage?: string */ }; \r\n code?: string; \r\n message?: string; \r\n // developerMessage?: string \r\n };\r\n \r\n // Check for TRANSACTION_NOT_PENDING error in different possible structures\r\n const isNotPendingError = \r\n (error.status && error.error && error.error.code === 'TRANSACTION_NOT_PENDING') ||\r\n (error.code === 'TRANSACTION_NOT_PENDING') ||\r\n (error.error && error.error.code === 'TRANSACTION_NOT_PENDING');\r\n \r\n if (isNotPendingError) {\r\n this.handleTransactionNotPendingError(error, transactionId);\r\n }\r\n \r\n // Handle specific HTTP status codes with user-friendly messages\r\n if (error.status) {\r\n switch (error.status) {\r\n case 404:\r\n throw this.createError(\r\n TransactionSigningErrorCode.TRANSACTION_NOT_FOUND,\r\n `Transaction ${transactionId} not found. It may have expired or been processed already.`,\r\n transactionId,\r\n err\r\n );\r\n case 500:\r\n throw this.createError(\r\n TransactionSigningErrorCode.SERVER_ERROR,\r\n `Server error while processing transaction ${transactionId}. The transaction may no longer be available or may have already been signed.`,\r\n transactionId,\r\n err\r\n );\r\n case 401:\r\n case 403:\r\n throw this.createError(\r\n TransactionSigningErrorCode.AUTH_FAILED,\r\n 'Authentication failed. Please refresh the page and try again.',\r\n transactionId,\r\n err\r\n );\r\n }\r\n }\r\n \r\n // Re-throw other errors as-is\r\n throw err;\r\n }\r\n}","import { TransactionSigningErrorCode } from '../types/error-types';\r\nimport { \r\n SigningAuthTokens, \r\n TransactionSigningParams \r\n} from '../types/transaction-types';\r\nimport { TransactionErrorHandler } from './TransactionErrorHandler';\r\n\r\n/**\r\n * Handles all validation operations for transaction signing\r\n */\r\nexport class TransactionValidator {\r\n \r\n /**\r\n * Validate transaction signing parameters\r\n * @param params - Transaction signing parameters to validate\r\n * @throws TransactionSigningError if validation fails\r\n */\r\n static validateSigningParams(params: TransactionSigningParams): void {\r\n if (!params) {\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.INVALID_TOKENS,\r\n 'Transaction signing parameters are required'\r\n );\r\n }\r\n\r\n if (!params.transactionId || typeof params.transactionId !== 'string') {\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.INVALID_TOKENS,\r\n 'Valid transaction ID is required'\r\n );\r\n }\r\n\r\n if (!params.authTokens) {\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.INVALID_TOKENS,\r\n 'Authentication tokens are required',\r\n params.transactionId\r\n );\r\n }\r\n\r\n if (!params.authTokens.signerAuthToken || !params.authTokens.persAccessToken) {\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.INVALID_TOKENS,\r\n 'Both signer and PERS authentication tokens are required',\r\n params.transactionId\r\n );\r\n }\r\n\r\n if (!params.ethersProviderUrl || typeof params.ethersProviderUrl !== 'string') {\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.INVALID_TOKENS,\r\n 'Ethers provider URL is required',\r\n params.transactionId\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Validate authentication tokens passed as parameters\r\n * @param authTokens - The authentication tokens to validate\r\n * @returns true if valid, throws error if invalid\r\n */\r\n static validateAuthTokens(authTokens: SigningAuthTokens): boolean {\r\n if (!authTokens.persAccessToken || !authTokens.signerAuthToken) {\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.INVALID_TOKENS,\r\n 'Both PERS access token and signer auth token are required'\r\n );\r\n }\r\n \r\n return true;\r\n }\r\n}","/**\r\n * Extended window interface for WebAuthn flags\r\n */\r\ninterface ExtendedWindow extends Window {\r\n // landingAuthenticationInProgress?: boolean;\r\n webAuthnOperationInProgress?: boolean;\r\n}\r\n\r\n/**\r\n * Utility class for coordinating WebAuthn operations to prevent conflicts\r\n * Manages global state flags to ensure only one WebAuthn operation runs at a time\r\n */\r\nexport class WebAuthnCoordinator {\r\n\r\n /**\r\n * Check if a WebAuthn operation is currently in progress\r\n * @returns True if an operation is in progress, false otherwise\r\n */\r\n static checkConcurrentOperations(): boolean {\r\n if (typeof window !== 'undefined') {\r\n return Boolean((window as ExtendedWindow).webAuthnOperationInProgress);\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Set the WebAuthn operation in progress flag\r\n * @param inProgress - Whether an operation is in progress\r\n */\r\n static setOperationInProgress(inProgress: boolean): void {\r\n if (typeof window !== 'undefined') {\r\n (window as ExtendedWindow).webAuthnOperationInProgress = inProgress;\r\n }\r\n }\r\n}","import { JsonRpcProvider } from 'ethers';\r\nimport { CounterfactualWalletTransactionResponse, TransactionStatus } from '@explorins/pers-shared/browser';\r\nimport { LegacyTransaction, TransactionRequestResponseDTO } from '../types/pers-types';\r\nimport { WalletService } from '../core/WalletService';\r\nimport { PersService } from '../core/PersService';\r\nimport { SigningService } from '../core/SigningService';\r\nimport { KeyWallet } from '../core/KeyWallet';\r\nimport { GetWalletResponse } from '../types/wallet-types';\r\nimport { TransactionErrorHandler } from './TransactionErrorHandler';\r\nimport { TransactionValidator } from './TransactionValidator';\r\nimport { WebAuthnCoordinator } from './WebAuthnCoordinator';\r\nimport type { WebAuthnProvider } from '../platform/WebAuthnProvider.types';\r\nimport { TransactionSigningErrorCode } from '../types/error-types';\r\nimport { \r\n CombinedTransactionStatus, \r\n SIGNABLE_STATUSES, \r\n TransactionStatusInfo, \r\n TransactionSigningResult, \r\n SigningAuthTokens, \r\n TransactionSigningParams \r\n} from '../types/transaction-types';\r\nimport { ExtendedPersSignerConfig } from '../sdk/PersSignerSDK';\r\nimport { Wallet } from '../types/signer-api-types';\r\nimport { DEFAULT_FALLBACK_PROVIDER } from '../config/constants';\r\n\r\n/**\r\n * Service for orchestrating transaction signing operations\r\n * Handles the complete flow from transaction preparation to submission\r\n * Uses constructor-based dependency injection for WebAuthn provider\r\n */\r\nexport class TransactionSigningService {\r\n private webAuthnProvider: WebAuthnProvider;\r\n\r\n constructor(config: ExtendedPersSignerConfig) {\r\n this.webAuthnProvider = config.webAuthnProvider;\r\n }\r\n\r\n /**\r\n * Prepare transaction for signing - fetch and validate\r\n */\r\n private async prepareTransaction(\r\n transactionId: string, \r\n authTokens: SigningAuthTokens,\r\n tenantId: string\r\n ): Promise<{ preparedTransaction: TransactionRequestResponseDTO; updatedTokens: SigningAuthTokens }> {\r\n let preparedTransaction: TransactionRequestResponseDTO;\r\n try {\r\n preparedTransaction = await PersService.fetchPreparedTransaction(transactionId, authTokens.persAccessToken, tenantId);\r\n } catch (err: unknown) {\r\n // Use TransactionErrorHandler to process PERS API errors\r\n // This function never returns (throws an error), so execution won't continue past this line\r\n TransactionErrorHandler.processPersApiError(err, transactionId);\r\n // The line below will never be reached due to the throw above, but TypeScript needs it for type safety\r\n throw err;\r\n }\r\n // Check transaction status - only process signable transactions\r\n const transactionStatus = preparedTransaction.transactionStatus as CombinedTransactionStatus;\r\n \r\n // Validate transaction status is signable\r\n const isSignable = SIGNABLE_STATUSES.some(status => status === transactionStatus);\r\n if (!isSignable) {\r\n // Create status info for UI using TransactionErrorHandler\r\n const statusInfo = TransactionErrorHandler.createStatusInfo(transactionId, transactionStatus);\r\n \r\n throw { shouldShowStatus: true, statusInfo };\r\n }\r\n\r\n // Authenticate with PERS using backend signer token to set up signing account\r\n let updatedPersAccessToken = authTokens.persAccessToken;\r\n try {\r\n const persSignerAuth = await PersService.authenticateUser(authTokens.signerAuthToken, tenantId);\r\n \r\n // Update PERS access token with the new one that has signing account linked\r\n const newPersAccessToken = persSignerAuth.accessToken;\r\n if (newPersAccessToken) {\r\n updatedPersAccessToken = newPersAccessToken;\r\n }\r\n } catch (persSignerError: unknown) {\r\n const errorMessage = persSignerError instanceof Error ? persSignerError.message : String(persSignerError);\r\n console.error('❌ Failed to authenticate with PERS using signer token:', persSignerError);\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.PERS_AUTH_FAILED,\r\n `Failed to set up signing account: ${errorMessage}`,\r\n transactionId,\r\n persSignerError\r\n );\r\n }\r\n\r\n // If transaction is 'created' status but doesn't have signingData, fetch again with wallet-enabled token\r\n if (transactionStatus === TransactionStatus.CREATED && !PersService.isTransactionReadyForSigning(preparedTransaction)) {\r\n preparedTransaction = await PersService.fetchPreparedTransaction(transactionId, updatedPersAccessToken, tenantId);\r\n }\r\n \r\n if (!PersService.isTransactionReadyForSigning(preparedTransaction)) {\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.TRANSACTION_NOT_READY,\r\n 'Transaction is not ready for signing',\r\n transactionId\r\n );\r\n }\r\n\r\n return { \r\n preparedTransaction, \r\n updatedTokens: { ...authTokens, persAccessToken: updatedPersAccessToken }\r\n };\r\n }\r\n\r\n /**\r\n * Validate and prepare wallet for signing\r\n */\r\n private async prepareWallet(\r\n authTokens: SigningAuthTokens, \r\n ethersProviderUrl: string\r\n ): Promise<KeyWallet> {\r\n // Wallet validation will be handled through API responses - no localStorage needed\r\n \r\n let walletListResult: Wallet[];\r\n try {\r\n // Use new WalletService API with signer token\r\n walletListResult = await WalletService.listWallets(authTokens.signerAuthToken);\r\n } catch (error) {\r\n console.error('[TransactionSigningService] Wallet list API failed:', error);\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.WALLET_NOT_AVAILABLE,\r\n 'Failed to retrieve wallet information. Please refresh the page and try again.',\r\n undefined,\r\n error\r\n );\r\n }\r\n \r\n const wallets = walletListResult || [];\r\n \r\n if (!wallets?.length) {\r\n console.error('[TransactionSigningService] No wallets found in response:', walletListResult);\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.WALLET_NOT_AVAILABLE,\r\n 'No wallet found for transaction signing. Please refresh the page and complete account setup.'\r\n );\r\n }\r\n\r\n // Create SigningService with injected WebAuthn provider\r\n const signingService = new SigningService(this.webAuthnProvider);\r\n\r\n // Create wallet instance with provider fallback logic\r\n let provider: JsonRpcProvider;\r\n try {\r\n // Try primary provider first\r\n console.info(`[TransactionSigningService] Attempting to connect to primary provider: ${ethersProviderUrl}`);\r\n provider = new JsonRpcProvider(ethersProviderUrl);\r\n // Test the connection with a simple call\r\n await provider.getNetwork();\r\n console.info(`[TransactionSigningService] Successfully connected to primary provider`);\r\n } catch (primaryError) {\r\n console.warn(`[TransactionSigningService] Primary provider failed, falling back to: ${DEFAULT_FALLBACK_PROVIDER}`, primaryError);\r\n try {\r\n provider = new JsonRpcProvider(DEFAULT_FALLBACK_PROVIDER);\r\n // Test the fallback connection\r\n await provider.getNetwork();\r\n console.info(`[TransactionSigningService] Successfully connected to fallback provider`);\r\n } catch (fallbackError) {\r\n console.error(`[TransactionSigningService] Both primary and fallback providers failed`, { primaryError, fallbackError });\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.WALLET_NOT_AVAILABLE,\r\n 'Unable to connect to Ethereum network. Please check your internet connection and try again.',\r\n undefined,\r\n fallbackError\r\n );\r\n }\r\n }\r\n\r\n const wallet = new KeyWallet({\r\n authToken: authTokens.signerAuthToken,\r\n wallet: wallets[0] as unknown as GetWalletResponse & { boundToEvmNetwork: boolean },\r\n signingService: signingService,\r\n }).connect(provider);\r\n\r\n return wallet;\r\n }\r\n\r\n /**\r\n * Execute the transaction signing with WebAuthn coordination\r\n */\r\n private async executeTransactionSigning(\r\n wallet: KeyWallet,\r\n // preparedTransaction: TransactionRequestResponseDTO,\r\n signingData: CounterfactualWalletTransactionResponse | LegacyTransaction\r\n ): Promise<string> {\r\n // Check for concurrent WebAuthn operations\r\n if (WebAuthnCoordinator.checkConcurrentOperations()) {\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.WEBAUTHN_OPERATION_IN_PROGRESS,\r\n 'Another WebAuthn operation is in progress. Please wait and try again.'\r\n );\r\n }\r\n \r\n // Set WebAuthn operation flag for transaction signing\r\n WebAuthnCoordinator.setOperationInProgress(true);\r\n \r\n try {\r\n // const signingData = PersService.getTransactionDataForSigning(preparedTransaction);\r\n const signature = await wallet.signPersTransaction(signingData);\r\n return signature;\r\n } catch (signingError: unknown) {\r\n // Handle WebAuthn-specific errors\r\n const errorMessage = signingError instanceof Error ? signingError.message : String(signingError);\r\n if (errorMessage?.includes('NotAllowedError') || \r\n errorMessage?.includes('timed out') || \r\n errorMessage?.includes('not allowed')) {\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.SIGNING_CANCELLED,\r\n 'Transaction signing was cancelled or timed out. Please try again and complete the biometric authentication when prompted.',\r\n undefined,\r\n signingError\r\n );\r\n }\r\n throw signingError;\r\n } finally {\r\n // Clear WebAuthn operation flag\r\n WebAuthnCoordinator.setOperationInProgress(false);\r\n }\r\n }\r\n\r\n async getPersSigningData(data: {\r\n transactionId: string,\r\n authTokens: SigningAuthTokens,\r\n tenantId: string\r\n }){\r\n // Step 1: Prepare transaction for signing\r\n const { preparedTransaction } = await this.prepareTransaction(data.transactionId, data.authTokens, data.tenantId);\r\n // const signingData = PersService.getTransactionDataForSigning(preparedTransaction);\r\n const signingData = PersService.getTransactionDataForSigning(preparedTransaction); \r\n return signingData;\r\n }\r\n\r\n /**\r\n * Main transaction signing orchestration method\r\n * Handles the complete flow from preparation to submission\r\n * @param params - Transaction signing parameters\r\n * @returns Promise resolving to transaction signing result\r\n * @throws TransactionSigningError for validation and operation failures\r\n */\r\n async signTransaction(\r\n params: TransactionSigningParams,\r\n signingData: CounterfactualWalletTransactionResponse | LegacyTransaction\r\n\r\n ): Promise<TransactionSigningResult> {\r\n // Validate input parameters first using TransactionValidator\r\n TransactionValidator.validateSigningParams(params);\r\n \r\n const { transactionId, authTokens, ethersProviderUrl } = params;\r\n \r\n console.info(`[TransactionSigningService] Starting signature process for ${transactionId}`);\r\n \r\n try {\r\n \r\n \r\n // Step 2: Prepare wallet for signing\r\n const wallet = await this.prepareWallet(authTokens, ethersProviderUrl);\r\n\r\n // Step 3: Execute transaction signing\r\n const signature = await this.executeTransactionSigning(wallet, signingData);\r\n \r\n console.info(`[TransactionSigningService] Completed signing successfully: ${transactionId}`);\r\n \r\n return {\r\n success: true,\r\n transactionId,\r\n signingData,\r\n // transactionHash: submitResult.transaction?.transactionHash ?? undefined,\r\n signature,\r\n };\r\n \r\n } catch (error: unknown) {\r\n console.error(`[TransactionSigningService] Signing failed for ${transactionId}:`, error);\r\n \r\n // Handle special cases\r\n const structuredError = error as { shouldShowStatus?: boolean; statusInfo?: TransactionStatusInfo };\r\n if (structuredError.shouldShowStatus && structuredError.statusInfo) {\r\n return {\r\n success: false,\r\n transactionId,\r\n shouldShowStatus: true,\r\n statusInfo: structuredError.statusInfo,\r\n error: structuredError.statusInfo.message\r\n };\r\n }\r\n \r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n return {\r\n success: false,\r\n transactionId,\r\n error: errorMessage\r\n };\r\n }\r\n }\r\n}","\r\n/**\r\n * Handles transaction submission, success flows, and redirect logic\r\n */\r\nexport class TransactionSubmissionHandler {\r\n \r\n /**\r\n * Create redirect URL with transaction parameters\r\n * @param returnUrl - Base return URL\r\n * @param transactionHash - Transaction hash to include\r\n * @param metadata - Optional metadata to include as parameters\r\n * @returns Promise resolving to the complete redirect URL\r\n */\r\n static async createRedirectUrl(\r\n returnUrl: string,\r\n transactionHash: string,\r\n ): Promise<string> {\r\n const additionalParams: Record<string, string> = {\r\n txHash: transactionHash,\r\n success: 'true'\r\n };\r\n\r\n // Build URL with required params\r\n const paramKeys = ['transactionId', 'returnUrl', 'jwt', 'token'];\r\n const url = new URL(returnUrl, window.location.origin);\r\n // Add required params if present in additionalParams\r\n paramKeys.forEach(key => {\r\n if (additionalParams[key]) {\r\n url.searchParams.set(key, additionalParams[key]);\r\n }\r\n });\r\n // Add all other params\r\n Object.entries(additionalParams).forEach(([key, value]) => {\r\n if (!paramKeys.includes(key)) {\r\n url.searchParams.set(key, value);\r\n }\r\n });\r\n return url.toString();\r\n }\r\n}","/**\r\n * Platform-agnostic configuration provider\r\n * Abstracts environment variable access for cross-platform compatibility\r\n */\r\n\r\nexport interface PlatformConfig {\r\n apiUrl: string;\r\n appId?: string;\r\n relyingParty: {\r\n id: string;\r\n name: string;\r\n origin?: string;\r\n };\r\n}\r\n\r\nexport interface ConfigProvider {\r\n getServiceConfig(): PlatformConfig;\r\n}\r\n\r\n/**\r\n * Web platform configuration provider\r\n * Uses provided configuration instead of environment variables\r\n */\r\nexport class WebConfigProvider implements ConfigProvider {\r\n constructor(private config: PlatformConfig) {}\r\n\r\n getServiceConfig(): PlatformConfig {\r\n return this.config;\r\n }\r\n}\r\n\r\n/**\r\n * React Native configuration provider\r\n * Uses process.env or custom config for React Native environments\r\n */\r\nexport class ReactNativeConfigProvider implements ConfigProvider {\r\n constructor(private config: PlatformConfig) {}\r\n\r\n getServiceConfig(): PlatformConfig {\r\n return this.config;\r\n }\r\n}\r\n\r\n/**\r\n * Static configuration provider for testing or custom setups\r\n */\r\nexport class StaticConfigProvider implements ConfigProvider {\r\n constructor(private config: PlatformConfig) {}\r\n\r\n getServiceConfig(): PlatformConfig {\r\n return this.config;\r\n }\r\n}\r\n\r\n/**\r\n * Global config provider instance\r\n */\r\nlet globalConfigProvider: ConfigProvider | null = null;\r\n\r\n/**\r\n * Set the global configuration provider\r\n */\r\nexport function setConfigProvider(provider: ConfigProvider): void {\r\n globalConfigProvider = provider;\r\n}\r\n\r\n/**\r\n * Get the current configuration provider\r\n * Requires explicit initialization with setConfigProvider\r\n */\r\nexport function getConfigProvider(): ConfigProvider {\r\n if (!globalConfigProvider) {\r\n throw new Error('Configuration provider not initialized. Call setConfigProvider() first with your configuration.');\r\n }\r\n return globalConfigProvider;\r\n}\r\n\r\n/**\r\n * Get the service configuration\r\n */\r\nexport function getServiceConfig(): PlatformConfig {\r\n return getConfigProvider().getServiceConfig();\r\n}","/**\r\n * Base64URL encoding/decoding utilities\r\n * Used for WebAuthn credential ID and challenge handling\r\n */\r\n\r\n/**\r\n * Converts a Base64URL string to an ArrayBuffer\r\n * @param base64 - The Base64URL string\r\n * @returns The decoded ArrayBuffer\r\n */\r\nexport function base64UrlToBuffer(base64: string): ArrayBuffer {\r\n if (!base64 || typeof base64 !== 'string') {\r\n throw new Error(`base64UrlToBuffer expected non-empty string, got ${typeof base64}: ${base64}`);\r\n }\r\n const padding = '='.repeat((4 - base64.length % 4) % 4);\r\n const base64Standard = (base64 + padding)\r\n .replace(/\\-/g, '+')\r\n .replace(/_/g, '/');\r\n const rawData = atob(base64Standard);\r\n const outputArray = new Uint8Array(rawData.length);\r\n for (let i = 0; i < rawData.length; ++i) {\r\n outputArray[i] = rawData.charCodeAt(i);\r\n }\r\n return outputArray.buffer;\r\n}\r\n\r\n/**\r\n * Converts an ArrayBuffer to a Base64URL string\r\n * @param buffer - The ArrayBuffer to encode\r\n * @returns The Base64URL string\r\n */\r\nexport function bufferToBase64Url(buffer: ArrayBuffer): string {\r\n const bytes = new Uint8Array(buffer);\r\n let binary = '';\r\n for (let i = 0; i < bytes.byteLength; i++) {\r\n binary += String.fromCharCode(bytes[i]);\r\n }\r\n return btoa(binary)\r\n .replace(/\\+/g, '-')\r\n .replace(/\\//g, '_')\r\n .replace(/=+$/, '');\r\n}\r\n\r\n/**\r\n * Ensures a string is Base64URL encoded (replaces +/ with -_)\r\n */\r\nexport function toBase64Url(str: string): string {\r\n return str\r\n .replace(/\\+/g, '-')\r\n .replace(/\\//g, '_')\r\n .replace(/=+$/, '');\r\n}\r\n","/**\r\n * Browser-specific WebAuthn provider using native browser APIs\r\n * Fully agnostic implementation without external SDK dependencies\r\n */\r\n\r\nimport { SIGNER_CONFIG } from '../config/constants';\r\nimport { base64UrlToBuffer, bufferToBase64Url } from '../utils/encoding';\r\nimport type { \r\n WebAuthnProvider, \r\n WebAuthnConfig, \r\n WebAuthnCreateChallenge, \r\n WebAuthnSignChallenge,\r\n WebAuthnAttestation,\r\n WebAuthnAssertion\r\n} from './WebAuthnProvider.types';\r\n\r\nclass BrowserWebAuthnProvider implements WebAuthnProvider {\r\n private config: WebAuthnConfig;\r\n\r\n constructor(config: WebAuthnConfig) {\r\n this.config = config;\r\n }\r\n\r\n async create(challenge: WebAuthnCreateChallenge): Promise<WebAuthnAttestation> {\r\n try {\r\n if (!challenge?.challenge || !challenge?.user?.id) {\r\n throw new Error('WebAuthn create missing required challenge fields');\r\n }\r\n\r\n // Ensure user.id is within the 64-byte limit required by WebAuthn spec\r\n let userIdBuffer = base64UrlToBuffer(challenge.user.id);\r\n if (userIdBuffer.byteLength > 64) {\r\n console.warn('WebAuthn user.id exceeds 64 bytes, truncating to avoid 1Password errors...');\r\n userIdBuffer = userIdBuffer.slice(0, 64);\r\n }\r\n\r\n // 1. Prepare options for navigator.credentials.create\r\n // We construct authenticatorSelection manually to ensure no conflicting legacy properties are present\r\n const authenticatorSelection: AuthenticatorSelectionCriteria = {\r\n residentKey: 'required', // Force Passkey (discoverable credential)\r\n // requireResidentKey: true, // REMOVED: Legacy property that can cause conflicts with 1Password\r\n userVerification: challenge.authenticatorSelection?.userVerification || 'preferred',\r\n };\r\n\r\n const publicKey: PublicKeyCredentialCreationOptions = {\r\n challenge: base64UrlToBuffer(challenge.challenge),\r\n rp: {\r\n id: challenge.rp?.id || this.config.relyingParty.id,\r\n name: challenge.rp?.name || this.config.relyingParty.name,\r\n },\r\n user: {\r\n id: userIdBuffer,\r\n name: challenge.user.name,\r\n displayName: challenge.user.displayName,\r\n },\r\n pubKeyCredParams: challenge.pubKeyCredParams,\r\n authenticatorSelection,\r\n attestation: 'none',\r\n timeout: challenge.timeout || 60000,\r\n excludeCredentials: challenge.excludeCredentials?.map((cred) => ({\r\n id: base64UrlToBuffer(cred.id),\r\n type: 'public-key',\r\n transports: cred.transports,\r\n })),\r\n };\r\n\r\n // console.log('WebAuthn create options:', publicKey);\r\n // console.log('WebAuthn create challenge:', challenge);\r\n // console.log('this.config', this.config)\r\n\r\n // 2. Call the browser's native WebAuthn API\r\n const credential = await navigator.credentials.create({ publicKey }) as PublicKeyCredential;\r\n \r\n if (!credential) throw new Error('WebAuthn registration request returned null');\r\n\r\n // 3. Convert response to agnostic format\r\n const response = credential.response as AuthenticatorAttestationResponse;\r\n\r\n return {\r\n id: credential.id,\r\n clientDataJSON: bufferToBase64Url(response.clientDataJSON),\r\n attestationObject: bufferToBase64Url(response.attestationObject),\r\n };\r\n\r\n } catch (error: any) {\r\n console.error('Failed to create credential with WebAuthn (Native):', error);\r\n throw new Error(`WebAuthn registration failed: ${error.message || 'Unknown error'}`);\r\n }\r\n }\r\n\r\n async sign(challenge: WebAuthnSignChallenge): Promise<WebAuthnAssertion> {\r\n try {\r\n // 1. Prepare options for navigator.credentials.get\r\n const publicKey: PublicKeyCredentialRequestOptions = {\r\n challenge: base64UrlToBuffer(challenge.challenge),\r\n rpId: challenge.rpId || this.config.relyingParty.id,\r\n userVerification: challenge.userVerification || 'preferred', \r\n timeout: 60000,\r\n allowCredentials: challenge.allowCredentials?.webauthn?.map((cred) => ({\r\n id: base64UrlToBuffer(cred.id),\r\n type: 'public-key',\r\n // Omit transports to allow 1Password/cross-platform authenticators to work\r\n // even if the credential was originally registered with a specific transport\r\n // transports: cred.transports,\r\n }))\r\n };\r\n\r\n // 2. Call the browser's native WebAuthn API\r\n const credential = await navigator.credentials.get({ publicKey }) as PublicKeyCredential;\r\n \r\n if (!credential) throw new Error('WebAuthn request returned null');\r\n\r\n // 3. Convert response to agnostic format\r\n const response = credential.response as AuthenticatorAssertionResponse;\r\n\r\n return {\r\n kind: 'Fido2',\r\n credentialAssertion: {\r\n credId: credential.id,\r\n clientData: bufferToBase64Url(response.clientDataJSON),\r\n authenticatorData: bufferToBase64Url(response.authenticatorData),\r\n signature: bufferToBase64Url(response.signature),\r\n userHandle: response.userHandle ? bufferToBase64Url(response.userHandle) : undefined\r\n }\r\n };\r\n\r\n } catch (error: any) {\r\n console.error('Failed to sign with WebAuthn (Native):', error);\r\n if (error.name === 'NotAllowedError') {\r\n throw new Error(`Passkey request denied. Ensure the passkey was created on ${this.config.relyingParty.id}.`);\r\n }\r\n throw error;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Get WebAuthn provider for browser environments\r\n */\r\nexport async function getBrowserWebAuthnProvider(): Promise<WebAuthnProvider> {\r\n const config: WebAuthnConfig = {\r\n relyingParty: {\r\n id: typeof window !== 'undefined' ? window.location.hostname : SIGNER_CONFIG.DEFAULT_RELYING_PARTY_ID,\r\n name: SIGNER_CONFIG.DEFAULT_RELYING_PARTY_NAME,\r\n origin: typeof window !== 'undefined' ? window.location.origin : SIGNER_CONFIG.DEFAULT_RELYING_PARTY_ID,\r\n }\r\n };\r\n \r\n return new BrowserWebAuthnProvider(config)\r\n}","/**\r\n * React Native-specific WebAuthn provider using react-native-passkey\r\n * Fully agnostic implementation without external SDK dependencies\r\n * Falls back to browser implementation for React Native Web (Expo Web)\r\n */\r\n\r\nimport { SIGNER_CONFIG } from '../config/constants';\r\nimport { toBase64Url } from '../utils/encoding';\r\nimport type { \r\n WebAuthnProvider, \r\n WebAuthnConfig, \r\n WebAuthnCreateChallenge, \r\n WebAuthnSignChallenge,\r\n WebAuthnAttestation,\r\n WebAuthnAssertion\r\n} from './WebAuthnProvider.types';\r\n\r\nclass ReactNativeWebAuthnProvider implements WebAuthnProvider {\r\n private config: WebAuthnConfig;\r\n\r\n constructor(config: WebAuthnConfig) {\r\n this.config = config;\r\n }\r\n\r\n private async getPasskeyLibrary() {\r\n try {\r\n // Dynamic import to avoid hard dependency\r\n // @ts-ignore - Optional dependency\r\n const { Passkey } = await import('react-native-passkey');\r\n return Passkey;\r\n } catch (error: any) {\r\n // Check if this is React Native Web where react-native-passkey doesn't work\r\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\r\n throw new Error('WEB_FALLBACK_NEEDED');\r\n }\r\n \r\n throw new Error(\r\n `Native passkey dependency missing. Please install 'react-native-passkey' in your app:\\n\\n` +\r\n `npm install react-native-passkey\\n` +\r\n `npx pod-install ios\\n\\n` +\r\n `For Expo projects, you may need to use development builds.\\n` +\r\n `See setup guide: https://github.com/f-23/react-native-passkey#installation`\r\n );\r\n }\r\n }\r\n\r\n private async handleWebFallback(operation: 'create' | 'sign', challenge: any): Promise<any> {\r\n console.log(`Falling back to browser WebAuthn for React Native Web (${operation})...`);\r\n try {\r\n // Import and use browser WebAuthn provider\r\n const { getBrowserWebAuthnProvider } = await import('./WebAuthnProvider.browser');\r\n const browserProvider = await getBrowserWebAuthnProvider();\r\n return await browserProvider[operation](challenge);\r\n } catch (browserError: any) {\r\n console.error(`Browser WebAuthn fallback also failed for ${operation}:`, browserError);\r\n throw new Error(`WebAuthn ${operation} failed: React Native Web fallback failed (${browserError.message}).`);\r\n }\r\n }\r\n\r\n async create(challenge: WebAuthnCreateChallenge): Promise<WebAuthnAttestation> {\r\n try {\r\n const Passkey = await this.getPasskeyLibrary();\r\n\r\n // Prepare request for react-native-passkey\r\n // Note: react-native-passkey expects Base64URL strings, not Buffers\r\n \r\n // Ensure user.id is within the 64-byte limit required by WebAuthn spec\r\n // Note: challenge.user.id is already a string here, but we need to check its decoded length\r\n // However, for simplicity in RN, we can just trust the server or do a basic length check on the string\r\n // If it's a very long string, it might be an issue.\r\n // But let's focus on aligning the authenticatorSelection first.\r\n\r\n const authenticatorSelection = {\r\n residentKey: 'required', // Force Passkey (discoverable credential)\r\n userVerification: challenge.authenticatorSelection?.userVerification || 'preferred',\r\n // Explicitly undefined to avoid issues, though JS objects don't usually include undefined keys in JSON\r\n // But react-native-passkey might handle it differently.\r\n };\r\n\r\n // Ensure rp.id is present\r\n const rpId = challenge.rp?.id || this.config.relyingParty.id;\r\n if (!rpId) {\r\n console.error('[RNWebAuthn] Missing RP ID in challenge or config');\r\n throw new Error('Missing RP ID');\r\n }\r\n\r\n const request = {\r\n challenge: toBase64Url(challenge.challenge), // Ensure Base64URL\r\n pubKeyCredParams: challenge.pubKeyCredParams,\r\n rp: {\r\n id: rpId,\r\n name: challenge.rp?.name || this.config.relyingParty.name,\r\n },\r\n user: {\r\n displayName: challenge.user.displayName,\r\n id: toBase64Url(challenge.user.id), // Ensure Base64URL\r\n name: challenge.user.name,\r\n },\r\n attestation: 'none', // Force 'none' as in web\r\n excludeCredentials: challenge.excludeCredentials?.map((v) => ({\r\n id: toBase64Url(v.id), // Ensure Base64URL\r\n type: v.type,\r\n transports: v.transports\r\n })) as any, // Cast to any to avoid strict type mismatch with react-native-passkey types\r\n authenticatorSelection,\r\n timeout: challenge.timeout || 60000,\r\n };\r\n\r\n console.log('[RNWebAuthn] Calling Passkey.create with:', JSON.stringify(request, null, 2));\r\n\r\n const result = await Passkey.create(request);\r\n\r\n console.log('[RNWebAuthn] Passkey.create success:', JSON.stringify(result, null, 2));\r\n\r\n return {\r\n id: result.id,\r\n clientDataJSON: result.response.clientDataJSON,\r\n attestationObject: result.response.attestationObject,\r\n };\r\n } catch (error: any) {\r\n if (error.message === 'WEB_FALLBACK_NEEDED') {\r\n return this.handleWebFallback('create', challenge);\r\n }\r\n console.error('Failed to create credential with react-native-passkey:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n async sign(challenge: WebAuthnSignChallenge): Promise<WebAuthnAssertion> {\r\n try {\r\n const Passkey = await this.getPasskeyLibrary();\r\n\r\n // Prepare request for react-native-passkey\r\n const request = {\r\n challenge: toBase64Url(challenge.challenge), // Ensure Base64URL\r\n allowCredentials: challenge.allowCredentials?.webauthn?.map((cred) => ({\r\n id: toBase64Url(cred.id), // Ensure Base64URL\r\n type: 'public-key',\r\n // Omit transports to allow 1Password/cross-platform authenticators to work\r\n // transports: cred.transports, \r\n })) as any,\r\n rpId: challenge.rpId || this.config.relyingParty.id,\r\n userVerification: challenge.userVerification || 'preferred',\r\n timeout: challenge.timeout || 60000,\r\n };\r\n\r\n console.log('[RNWebAuthn] Calling Passkey.get (sign) with:', JSON.stringify(request, null, 2));\r\n\r\n const credential = await Passkey.get(request);\r\n\r\n console.log('[RNWebAuthn] Passkey.get success:', JSON.stringify(credential, null, 2));\r\n\r\n return {\r\n kind: 'Fido2',\r\n credentialAssertion: {\r\n credId: credential.id,\r\n clientData: credential.response.clientDataJSON,\r\n authenticatorData: credential.response.authenticatorData,\r\n signature: credential.response.signature,\r\n userHandle: credential.response.userHandle,\r\n },\r\n };\r\n } catch (error: any) {\r\n if (error.message === 'WEB_FALLBACK_NEEDED') {\r\n return this.handleWebFallback('sign', challenge);\r\n }\r\n console.error('Failed to sign with react-native-passkey:', error);\r\n throw error;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Get WebAuthn provider for React Native environments\r\n */\r\nexport async function getReactNativeWebAuthnProvider(): Promise<WebAuthnProvider> {\r\n const config: WebAuthnConfig = {\r\n relyingParty: {\r\n id: SIGNER_CONFIG.DEFAULT_RELYING_PARTY_ID,\r\n name: SIGNER_CONFIG.DEFAULT_RELYING_PARTY_NAME,\r\n }\r\n };\r\n \r\n return new ReactNativeWebAuthnProvider(config);\r\n}","/**\r\n * In-memory User Cache\r\n * \r\n * Provides secure, storage-free user authentication caching\r\n * Uses memory-only storage with TTL expiration for security\r\n */\r\n\r\nimport type { AuthenticatedUser } from '../types';\r\n\r\ninterface CachedUser {\r\n user: AuthenticatedUser;\r\n expiresAt: number;\r\n}\r\n\r\n/**\r\n * In-memory user cache with TTL expiration\r\n * Security-first approach - no persistent storage\r\n */\r\nexport class UserCache {\r\n private static cache = new Map<string, CachedUser>();\r\n private static readonly DEFAULT_TTL_MS = 300000; // 5 minutes\r\n \r\n /**\r\n * Get cached user by identifier\r\n * @param identifier - User identifier (email/userId)\r\n * @returns Cached user or null if not found/expired\r\n */\r\n static get(identifier: string): AuthenticatedUser | null {\r\n const cached = this.cache.get(identifier);\r\n \r\n if (!cached) {\r\n return null;\r\n }\r\n \r\n // Check if expired\r\n if (Date.now() > cached.expiresAt) {\r\n this.cache.delete(identifier);\r\n return null;\r\n }\r\n \r\n return cached.user;\r\n }\r\n \r\n /**\r\n * Cache user with TTL\r\n * @param identifier - User identifier\r\n * @param user - Authenticated user data\r\n * @param ttlMs - Time to live in milliseconds (default: 5 minutes)\r\n */\r\n static set(identifier: string, user: AuthenticatedUser, ttlMs: number = this.DEFAULT_TTL_MS): void {\r\n this.cache.set(identifier, {\r\n user,\r\n expiresAt: Date.now() + ttlMs\r\n });\r\n }\r\n \r\n /**\r\n * Remove user from cache\r\n * @param identifier - User identifier\r\n */\r\n static delete(identifier: string): boolean {\r\n return this.cache.delete(identifier);\r\n }\r\n \r\n /**\r\n * Clear all cached users\r\n */\r\n static clear(): void {\r\n this.cache.clear();\r\n }\r\n \r\n /**\r\n * Get cache size (for debugging)\r\n */\r\n static size(): number {\r\n return this.cache.size;\r\n }\r\n \r\n /**\r\n * Clean up expired entries\r\n */\r\n static cleanup(): number {\r\n const now = Date.now();\r\n let cleaned = 0;\r\n \r\n for (const [identifier, cached] of this.cache.entries()) {\r\n if (now > cached.expiresAt) {\r\n this.cache.delete(identifier);\r\n cleaned++;\r\n }\r\n }\r\n \r\n return cleaned;\r\n }\r\n}","/**\r\n * PERS Blockchain Signer SDK\r\n * \r\n * A lightweight blockchain transaction signing SDK with WebAuthn authentication.\r\n * Provides 5 focused methods for complete transaction lifecycle management:\r\n * \r\n * 1. loginUser(jwtToken) - Authenticate user with 5-minute caching\r\n * 2. signTransaction(signingData, jwtToken) - Sign transactions with auto-login\r\n * 3. submitTransaction(signedTx, jwtToken) - Submit signed transactions to blockchain\r\n * 4. signPersTransaction(jwtToken) - Legacy one-liner for backward compatibility\r\n * 5. signAndSubmitPersTransaction(jwtToken) - Complete sign + submit flow\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createPersSignerSDK } from '@explorins/pers-signer';\r\n * \r\n * const sdk = createPersSignerSDK({\r\n * webAuthnProvider: myWebAuthnProvider,\r\n * ethersProviderUrl: 'https://ethereum-rpc.com'\r\n * });\r\n * \r\n * // Quick sign and submit\r\n * const result = await sdk.signAndSubmitPersTransaction(jwtToken);\r\n * if (result.success) {\r\n * console.log('Transaction submitted:', result.transactionHash);\r\n * }\r\n * ```\r\n */\r\n\r\nimport { AuthenticationService, PersService } from '../core';\r\nimport { TransactionSigningService } from '../transaction';\r\nimport { setConfigProvider, WebConfigProvider } from '../platform/ConfigProvider';\r\nimport { DEFAULT_FALLBACK_PROVIDER, SIGNER_CONFIG } from '../config/constants';\r\nimport { extractJWTFromToken } from '../utils/jwt';\r\nimport { UserCache } from '../utils/user-cache';\r\nimport type { WebAuthnProvider } from '../platform/WebAuthnProvider.types';\r\nimport type { \r\n AuthenticatedUser,\r\n LegacyTransaction, \r\n} from '../types';\r\nimport { SubmissionResult, TransactionSigningResult } from '../shared';\r\nimport { CounterfactualWalletTransactionResponse } from '@explorins/pers-shared';\r\nimport { SigningStatus, StatusUpdateData, StatusCallback } from '../types/status';\r\n\r\n/**\r\n * Configuration interface for the PERS Signer SDK\r\n * \r\n * @interface PersSignerConfig\r\n * @property {string} [tenantId] - Optional tenant identifier for multi-tenant applications\r\n * @property {string} [ethersProviderUrl] - Custom Ethereum RPC provider URL\r\n * @property {WebAuthnProvider} webAuthnProvider - WebAuthn provider for secure authentication\r\n * @property {string} [apiUrl] - Custom API base URL (defaults to production)\r\n * @property {string} [relyingPartyName] - WebAuthn relying party name for authentication\r\n * @property {StatusCallback} [globalStatusCallback] - Optional global status callback for all operations\r\n */\r\nexport interface ExtendedPersSignerConfig {\r\n // tenantId?: string;\r\n ethersProviderUrl?: string;\r\n webAuthnProvider: WebAuthnProvider;\r\n apiUrl?: string;\r\n relyingPartyName?: string;\r\n globalStatusCallback?: StatusCallback;\r\n}\r\n\r\nexport interface PersSignerConfig extends Omit<ExtendedPersSignerConfig, 'webAuthnProvider'> {}\r\n\r\n/**\r\n * PERS Blockchain Signer SDK Class\r\n * \r\n * Main SDK class providing blockchain transaction signing capabilities with WebAuthn authentication.\r\n * Implements a clean 5-method API for complete transaction lifecycle management.\r\n * \r\n * Features:\r\n * - WebAuthn-based secure authentication\r\n * - 5-minute user session caching\r\n * - Automatic transaction data fetching\r\n * - Blockchain transaction signing and submission\r\n * - Multi-tenant support\r\n * \r\n * @class PersSignerSDK\r\n */\r\nexport class PersSignerSDK {\r\n private config: ExtendedPersSignerConfig;\r\n private authenticationService: AuthenticationService;\r\n private transactionSigningService: TransactionSigningService;\r\n\r\n /**\r\n * Initialize the PERS Signer SDK\r\n * \r\n * @param {ExtendedPersSignerConfig} config - SDK configuration object\r\n * @throws {Error} If required configuration is missing\r\n */\r\n constructor(config: ExtendedPersSignerConfig) {\r\n // console.log('DEBUG: v1.2.0')\r\n this.config = config;\r\n \r\n setConfigProvider(new WebConfigProvider({\r\n apiUrl: config.apiUrl || SIGNER_CONFIG.DEFAULT_SIGNER_API_URL,\r\n relyingParty: {\r\n id: typeof window !== 'undefined' ? window.location.hostname : 'localhost',\r\n name: config.relyingPartyName || SIGNER_CONFIG.DEFAULT_RELYING_PARTY_NAME,\r\n origin: typeof window !== 'undefined' ? window.location.origin : undefined,\r\n },\r\n }));\r\n \r\n this.authenticationService = new AuthenticationService(this.config);\r\n this.transactionSigningService = new TransactionSigningService(config);\r\n }\r\n\r\n /**\r\n * Helper method to trigger both global and method-specific status callbacks\r\n * @private\r\n */\r\n private triggerStatusUpdate(status: SigningStatus, message: string, data?: StatusUpdateData, methodCallback?: StatusCallback) {\r\n // Call method-specific callback first (higher priority)\r\n methodCallback?.onStatusUpdate?.(status, message, data);\r\n \r\n // Then call global callback if no method-specific callback provided\r\n if (!methodCallback && this.config.globalStatusCallback) {\r\n this.config.globalStatusCallback.onStatusUpdate?.(status, message, data);\r\n }\r\n }\r\n\r\n /**\r\n * Authenticate user and cache session for 5 minutes\r\n * \r\n * Validates JWT token, authenticates with both signer and PERS backends,\r\n * and caches the authenticated user session to avoid repeated authentication.\r\n * \r\n * @param {string} jwtToken - JWT token containing user identifier and tenant info\r\n * @param {StatusCallback} [statusCallback] - Optional callback for status updates\r\n * @returns {Promise<AuthenticatedUser>} Authenticated user with access tokens\r\n * @throws {Error} If JWT is invalid, expired, or authentication fails\r\n * \r\n * @example\r\n * ```typescript\r\n * try {\r\n * const user = await sdk.loginUser(jwtToken, {\r\n * onStatusUpdate: (status, message) => console.log(`${status}: ${message}`)\r\n * });\r\n * console.log('Authenticated:', user.identifier);\r\n * } catch (error) {\r\n * console.error('Authentication failed:', error.message);\r\n * }\r\n * ```\r\n */\r\n async loginUser(jwtToken: string, statusCallback?: StatusCallback): Promise<AuthenticatedUser> {\r\n if (!jwtToken || typeof jwtToken !== 'string') {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'JWT token is required and must be a string', undefined, statusCallback);\r\n throw new Error('JWT token is required and must be a string');\r\n }\r\n\r\n this.triggerStatusUpdate(SigningStatus.INITIALIZING, 'Validating JWT token...', undefined, statusCallback);\r\n\r\n const { payload, isExpired } = extractJWTFromToken(jwtToken);\r\n \r\n if (!payload || isExpired) {\r\n this.triggerStatusUpdate(SigningStatus.EXPIRED, 'JWT token is invalid or expired', undefined, statusCallback);\r\n throw new Error('Invalid or expired JWT token');\r\n }\r\n\r\n const identifier = payload.identifierEmail || payload.email || payload.userId;\r\n \r\n if (!identifier) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'JWT token missing user identifier', undefined, statusCallback);\r\n throw new Error('JWT token missing user identifier (identifierEmail, email, or userId)');\r\n }\r\n\r\n this.triggerStatusUpdate(SigningStatus.AUTHENTICATING, 'Checking authentication cache...', undefined, statusCallback);\r\n\r\n // Check cache first\r\n const cachedUser = UserCache.get(identifier);\r\n if (cachedUser && Date.now() < cachedUser.expiresAt) {\r\n this.triggerStatusUpdate(SigningStatus.COMPLETED, 'Authentication retrieved from cache', undefined, statusCallback);\r\n return cachedUser;\r\n }\r\n\r\n try {\r\n this.triggerStatusUpdate(SigningStatus.AUTHENTICATING, 'Authenticating user with WebAuthn...', undefined, statusCallback);\r\n \r\n // Authenticate and cache\r\n const user = await this.authenticationService.combinedAuthentication(\r\n identifier,\r\n jwtToken,\r\n );\r\n\r\n UserCache.set(identifier, user);\r\n\r\n this.triggerStatusUpdate(SigningStatus.COMPLETED, 'User authentication completed successfully', undefined, statusCallback);\r\n return user;\r\n } catch (error) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, `Authentication failed: ${error instanceof Error ? error.message : 'Unknown error'}`, undefined, statusCallback);\r\n throw new Error(`Authentication failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n }\r\n\r\n /**\r\n * Sign a PERS transaction (legacy compatibility method)\r\n * \r\n * Automatically handles user authentication, transaction data fetching,\r\n * and transaction signing in a single call. This is the legacy method\r\n * maintained for backward compatibility.\r\n * \r\n * @param {string} jwtToken - JWT token containing transaction ID and user info\r\n * @param {StatusCallback} [statusCallback] - Optional callback for status updates\r\n * @returns {Promise<TransactionSigningResult>} Signing result with signature and metadata\r\n * @throws {Error} If authentication fails, transaction ID missing, or signing fails\r\n * \r\n * @example\r\n * ```typescript\r\n * try {\r\n * const result = await sdk.signPersTransaction(jwtToken, {\r\n * onStatusUpdate: (status, message) => console.log(`${status}: ${message}`)\r\n * });\r\n * if (result.success) {\r\n * console.log('Transaction signed:', result.signature);\r\n * }\r\n * } catch (error) {\r\n * console.error('Signing failed:', error.message);\r\n * }\r\n * ```\r\n */\r\n async signPersTransaction(jwtToken: string, statusCallback?: StatusCallback): Promise<TransactionSigningResult> {\r\n if (!jwtToken || typeof jwtToken !== 'string') {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'JWT token is required and must be a string', undefined, statusCallback);\r\n throw new Error('JWT token is required and must be a string');\r\n }\r\n\r\n this.triggerStatusUpdate(SigningStatus.AUTHENTICATING, 'Authenticating user...', undefined, statusCallback);\r\n const user = await this.loginUser(jwtToken, statusCallback);\r\n \r\n this.triggerStatusUpdate(SigningStatus.PREPARING, 'Extracting transaction information...', undefined, statusCallback);\r\n const { payload } = extractJWTFromToken(jwtToken);\r\n\r\n if (!payload?.transactionId) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'JWT token missing transactionId in payload', undefined, statusCallback);\r\n throw new Error('JWT token missing transactionId in payload');\r\n }\r\n\r\n if(!payload.tenantId) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'JWT token missing tenantId in payload', undefined, statusCallback);\r\n throw new Error('JWT token missing tenantId in payload');\r\n }\r\n \r\n const authTokens = {\r\n signerAuthToken: user.signerAuthToken,\r\n persAccessToken: user.persAccessToken\r\n };\r\n \r\n try {\r\n this.triggerStatusUpdate(SigningStatus.PREPARING, 'Fetching transaction data from PERS backend...', undefined, statusCallback);\r\n \r\n const persSigningData = await this.transactionSigningService.getPersSigningData({\r\n transactionId: payload.transactionId,\r\n authTokens,\r\n tenantId: payload.tenantId\r\n });\r\n \r\n this.triggerStatusUpdate(SigningStatus.SIGNING, 'Signing transaction with device security...', undefined, statusCallback);\r\n const result = await this.signTransaction(persSigningData, jwtToken, statusCallback);\r\n\r\n if (!result.success) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, result.error || 'Transaction signing failed', undefined, statusCallback);\r\n throw new Error(result.error || 'Transaction signing failed');\r\n }\r\n\r\n this.triggerStatusUpdate(SigningStatus.COMPLETED, 'Transaction signed successfully', {\r\n transactionId: payload.transactionId,\r\n signature: result.signature\r\n }, statusCallback);\r\n \r\n return result;\r\n } catch (error) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, `PERS transaction signing failed: ${error instanceof Error ? error.message : 'Unknown error'}`, undefined, statusCallback);\r\n throw new Error(`PERS transaction signing failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n }\r\n\r\n /**\r\n * Sign a transaction with provided signing data\r\n * \r\n * Low-level method to sign transactions when you already have the signing data.\r\n * Automatically handles user authentication and applies the blockchain signature.\r\n * \r\n * @param {CounterfactualWalletTransactionResponse | LegacyTransaction} signingData - Transaction data to sign\r\n * @param {string} jwtToken - JWT token containing transaction ID and user info\r\n * @param {StatusCallback} [statusCallback] - Optional callback for status updates\r\n * @returns {Promise<TransactionSigningResult>} Signing result with signature and metadata\r\n * @throws {Error} If authentication fails, transaction ID missing, or signing fails\r\n * \r\n * @example\r\n * ```typescript\r\n * const signingData = await getTransactionData(transactionId);\r\n * const result = await sdk.signTransaction(signingData, jwtToken, {\r\n * onStatusUpdate: (status, message) => console.log(`${status}: ${message}`)\r\n * });\r\n * console.log('Signed transaction:', result.signature);\r\n * ```\r\n */\r\n async signTransaction(signingData: CounterfactualWalletTransactionResponse | LegacyTransaction, jwtToken: string, statusCallback?: StatusCallback): Promise<TransactionSigningResult> {\r\n if (!signingData) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'Signing data is required', undefined, statusCallback);\r\n throw new Error('Signing data is required');\r\n }\r\n if (!jwtToken || typeof jwtToken !== 'string') {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'JWT token is required and must be a string', undefined, statusCallback);\r\n throw new Error('JWT token is required and must be a string');\r\n }\r\n\r\n this.triggerStatusUpdate(SigningStatus.AUTHENTICATING, 'Authenticating user for transaction signing...', undefined, statusCallback);\r\n const user = await this.loginUser(jwtToken, statusCallback);\r\n \r\n this.triggerStatusUpdate(SigningStatus.PREPARING, 'Preparing transaction for signing...', undefined, statusCallback);\r\n const { payload } = extractJWTFromToken(jwtToken);\r\n\r\n if (!payload?.transactionId) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'JWT token missing transactionId in payload', undefined, statusCallback);\r\n throw new Error('JWT token missing transactionId in payload');\r\n }\r\n\r\n if(!payload.tenantId) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'JWT token missing tenantId in payload', undefined, statusCallback);\r\n throw new Error('JWT token missing tenantId in payload');\r\n }\r\n\r\n const authTokens = {\r\n signerAuthToken: user.signerAuthToken,\r\n persAccessToken: user.persAccessToken\r\n };\r\n\r\n try {\r\n this.triggerStatusUpdate(SigningStatus.SIGNING, 'Signing transaction with cryptographic signature...', undefined, statusCallback);\r\n \r\n const result = await this.transactionSigningService.signTransaction({\r\n transactionId: payload.transactionId,\r\n tenantId: payload.tenantId,\r\n authTokens,\r\n ethersProviderUrl: this.config.ethersProviderUrl ?? DEFAULT_FALLBACK_PROVIDER\r\n }, signingData);\r\n\r\n this.triggerStatusUpdate(SigningStatus.COMPLETED, 'Transaction signed successfully', {\r\n transactionId: payload.transactionId,\r\n signature: result.signature\r\n }, statusCallback);\r\n\r\n return result;\r\n } catch (error) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, `Transaction signing failed: ${error instanceof Error ? error.message : 'Unknown error'}`, undefined, statusCallback);\r\n throw new Error(`Transaction signing failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n }\r\n\r\n /**\r\n * Complete transaction flow: sign and submit in one call\r\n * \r\n * Convenience method that combines signing and submission into a single operation.\r\n * This is the recommended method for most use cases as it handles the complete\r\n * transaction lifecycle automatically.\r\n * \r\n * @param {string} jwtToken - JWT token containing transaction ID and user info\r\n * @param {StatusCallback} [statusCallback] - Optional callback for status updates\r\n * @returns {Promise<SubmissionResult>} Submission result with transaction hash and status\r\n * @throws {Error} If authentication, signing, or submission fails\r\n * \r\n * @example\r\n * ```typescript\r\n * try {\r\n * const result = await sdk.signAndSubmitPersTransaction(jwtToken, {\r\n * onStatusUpdate: (status, message) => {\r\n * console.log(`Status: ${status} - ${message}`);\r\n * }\r\n * });\r\n * if (result.success) {\r\n * console.log('Transaction completed:', result.transactionHash);\r\n * if (result.shouldRedirect) {\r\n * window.location.href = result.redirectUrl;\r\n * }\r\n * }\r\n * } catch (error) {\r\n * console.error('Transaction failed:', error.message);\r\n * }\r\n * ```\r\n */\r\n async signAndSubmitPersTransaction(jwtToken: string, statusCallback?: StatusCallback): Promise<SubmissionResult> {\r\n if (!jwtToken || typeof jwtToken !== 'string') {\r\n throw new Error('JWT token is required and must be a string');\r\n }\r\n\r\n try {\r\n // Extract transaction ID for status updates\r\n // Sign the transaction (handles its own status updates)\r\n const signedTx = await this.signPersTransaction(jwtToken, statusCallback);\r\n \r\n // Submit the transaction (handles its own status updates) \r\n const submittedTx = await this.submitTransaction(signedTx, jwtToken, statusCallback);\r\n \r\n this.triggerStatusUpdate(SigningStatus.COMPLETED, 'Transaction completed successfully!', {\r\n transactionHash: submittedTx.transactionHash || undefined,\r\n transactionId: submittedTx.submitResult.transaction.id\r\n }, statusCallback);\r\n \r\n return submittedTx;\r\n } catch (error) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, `Transaction failed: ${error instanceof Error ? error.message : 'Unknown error'}`, undefined, statusCallback);\r\n throw new Error(`Sign and submit transaction failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n }\r\n /**\r\n * Submit a signed transaction to the blockchain\r\n * \r\n * Takes a signed transaction result and submits it to the blockchain network.\r\n * Returns detailed submission results including transaction hash and any\r\n * redirect information for UI flows.\r\n * \r\n * @param {TransactionSigningResult} signingResult - Result from a successful transaction signing\r\n * @param {string} jwtToken - JWT token containing tenant and user info\r\n * @param {StatusCallback} [statusCallback] - Optional callback for status updates\r\n * @returns {Promise<SubmissionResult>} Submission result with transaction hash and status\r\n * @throws {Error} If signing result is invalid, JWT is missing tenantId, or submission fails\r\n * \r\n * @example\r\n * ```typescript\r\n * const signedTx = await sdk.signPersTransaction(jwtToken);\r\n * const result = await sdk.submitTransaction(signedTx, jwtToken, {\r\n * onStatusUpdate: (status, message) => console.log(`${status}: ${message}`)\r\n * });\r\n * console.log('Transaction submitted:', result.transactionHash);\r\n * ```\r\n */\r\n async submitTransaction(signingResult: TransactionSigningResult, jwtToken: string, statusCallback?: StatusCallback): Promise<SubmissionResult> {\r\n if (!signingResult) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'Signing result is required', undefined, statusCallback);\r\n throw new Error('Signing result is required');\r\n }\r\n if (!jwtToken || typeof jwtToken !== 'string') {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'JWT token is required and must be a string', undefined, statusCallback);\r\n throw new Error('JWT token is required and must be a string');\r\n }\r\n\r\n if (!signingResult.success || !signingResult.signature || !signingResult.signingData) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'Invalid signing result: must be successful with signature and signing data', undefined, statusCallback);\r\n throw new Error('Invalid signing result: must be successful with signature and signing data');\r\n }\r\n\r\n this.triggerStatusUpdate(SigningStatus.PREPARING, 'Preparing transaction for blockchain submission...', undefined, statusCallback);\r\n \r\n const { payload } = extractJWTFromToken(jwtToken);\r\n\r\n if (!payload?.tenantId) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'JWT token missing tenantId in payload', undefined, statusCallback);\r\n throw new Error('JWT token missing tenantId in payload');\r\n }\r\n\r\n this.triggerStatusUpdate(SigningStatus.AUTHENTICATING, 'Re-authenticating for submission...', undefined, statusCallback);\r\n const user = await this.loginUser(jwtToken, statusCallback);\r\n\r\n try {\r\n this.triggerStatusUpdate(SigningStatus.SUBMITTING, 'Submitting signed transaction to blockchain network...', undefined, statusCallback);\r\n \r\n const submitResult = await PersService.submitTransaction(\r\n signingResult.transactionId,\r\n signingResult.signature,\r\n user.persAccessToken,\r\n signingResult.signingData.format,\r\n payload.tenantId\r\n );\r\n \r\n this.triggerStatusUpdate(SigningStatus.COMPLETED, 'Transaction submitted successfully to blockchain', {\r\n transactionHash: submitResult.transaction.transactionHash || undefined,\r\n transactionId: signingResult.transactionId\r\n }, statusCallback);\r\n \r\n // Transform response to SubmissionResult\r\n return {\r\n success: true,\r\n transactionHash: submitResult.transaction.transactionHash,\r\n shouldRedirect: false, // Can be configured based on business requirements\r\n redirectUrl: undefined, // Can be set based on business logic\r\n error: undefined,\r\n submitResult: submitResult\r\n };\r\n } catch (error) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, `Transaction submission failed: ${error instanceof Error ? error.message : 'Unknown error'}`, undefined, statusCallback);\r\n throw new Error(`Transaction submission failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n }\r\n\r\n /**\r\n * Clear user authentication cache\r\n * \r\n * Removes all cached user sessions, forcing fresh authentication\r\n * on the next method call. Useful for logout scenarios or when\r\n * switching between different user contexts.\r\n * \r\n * @example\r\n * ```typescript\r\n * // Clear cache on user logout\r\n * sdk.clearCache();\r\n * console.log('User cache cleared');\r\n * ```\r\n */\r\n clearCache(): void {\r\n UserCache.clear();\r\n }\r\n}\r\n\r\n/**\r\n * Create a new PERS Signer SDK instance\r\n * \r\n * Factory function to create and configure a new SDK instance with the provided\r\n * configuration. This is the recommended way to initialize the SDK.\r\n * \r\n * @param {PersSignerConfig} config - SDK configuration object\r\n * @returns {PersSignerSDK} Configured SDK instance ready for use\r\n * @throws {Error} If required configuration is missing or invalid\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createPersSignerSDK, getWebAuthnProvider } from '@explorins/pers-signer';\r\n * \r\n * const webAuthnProvider = await getWebAuthnProvider();\r\n * const sdk = createPersSignerSDK({\r\n * webAuthnProvider,\r\n * ethersProviderUrl: 'https://mainnet.infura.io/v3/YOUR_KEY',\r\n * tenantId: 'your-tenant-id'\r\n * });\r\n * ```\r\n */\r\nexport function createPersSignerSDK(config: ExtendedPersSignerConfig): PersSignerSDK {\r\n return new PersSignerSDK(config);\r\n}\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/utils/jwt.ts","../src/config/constants.ts","../src/utils/environment.ts","../src/platform/HttpClient.ts","../src/core/ServiceState.ts","../src/core/AuthenticationService.ts","../src/core/WalletService.ts","../src/core/SigningService.ts","../src/core/PersService.ts","../src/core/HealthService.ts","../src/utils/signature.ts","../src/types/transaction-types.ts","../src/types/error-types.ts","../src/types/status.ts","../src/core/KeyWallet.ts","../src/transaction/TransactionErrorHandler.ts","../src/transaction/TransactionValidator.ts","../src/transaction/WebAuthnCoordinator.ts","../src/transaction/TransactionSigningService.ts","../src/transaction/TransactionSubmissionHandler.ts","../src/platform/ConfigProvider.ts","../src/platform/WebAuthnConfig.ts","../src/utils/encoding.ts","../src/platform/WebAuthnProvider.browser.ts","../src/platform/WebAuthnProvider.reactnative.ts","../src/utils/user-cache.ts","../src/sdk/PersSignerSDK.ts"],"sourcesContent":["/**\r\n * JWT Utility Functions\r\n * \r\n * Browser-compatible JWT handling without external dependencies\r\n */\r\n\r\n// JWT types\r\nexport interface JWTPayload {\r\n iss?: string;\r\n email?: string;\r\n identifierEmail?: string;\r\n userId?: string;\r\n tenantId?: string;\r\n transactionId?: string;\r\n exp?: number;\r\n [key: string]: any;\r\n}\r\n\r\nexport interface JWTExtractionResult {\r\n payload: JWTPayload | null;\r\n isExpired: boolean;\r\n}\r\n\r\n/**\r\n * Extract and validate JWT token payload\r\n * Uses a browser-compatible approach without external dependencies\r\n */\r\nexport function extractJWTFromToken(jwtToken: string): JWTExtractionResult {\r\n if (!jwtToken) {\r\n return { payload: null, isExpired: false };\r\n }\r\n\r\n try {\r\n // Use a more compatible JWT decoding approach\r\n // Split JWT into parts\r\n const parts = jwtToken.split('.');\r\n if (parts.length !== 3) {\r\n throw new Error('Invalid JWT format');\r\n }\r\n \r\n // Decode the payload (middle part)\r\n const payload = JSON.parse(atob(parts[1])) as JWTPayload;\r\n \r\n // Check expiration\r\n const isExpired = payload.exp ? Date.now() >= payload.exp * 1000 : false;\r\n \r\n return { payload, isExpired };\r\n } catch (error) {\r\n console.warn('JWT decode failed:', error);\r\n return { payload: null, isExpired: false };\r\n }\r\n}\r\n\r\n/**\r\n * Check if a JWT token is expired\r\n */\r\nexport function isJWTExpired(jwtToken: string): boolean {\r\n const { isExpired } = extractJWTFromToken(jwtToken);\r\n return isExpired;\r\n}\r\n\r\n/**\r\n * Get JWT payload without validation\r\n */\r\nexport function getJWTPayload(jwtToken: string): JWTPayload | null {\r\n const { payload } = extractJWTFromToken(jwtToken);\r\n return payload;\r\n}","/**\r\n * PERS Signer SDK Constants\r\n * \r\n * These are stable configuration values for the PERS blockchain signing infrastructure.\r\n * These values should remain consistent across deployments and environments.\r\n * \r\n * Values are taken from the .env configuration to maintain consistency.\r\n */\r\n\r\nexport const SIGNER_CONFIG = {\r\n /**\r\n * Default API URL for the PERS signer backend service\r\n * This is the production endpoint that handles WebAuthn operations and transaction signing\r\n */\r\n DEFAULT_SIGNER_API_URL: 'https://signer-api.pers.ninja/v1',\r\n\r\n /**\r\n * Staging/Development API URL for the PERS signer backend service\r\n * Used as fallback when production signer API is unavailable\r\n */\r\n STAGING_SIGNER_API_URL: 'https://signer-api-staging.pers.ninja/v1',\r\n\r\n /**\r\n * PERS Platform API URLs\r\n */\r\n DEFAULT_PERS_API_URL: 'https://api.pers.ninja/v2',\r\n STAGING_PERS_API_URL: 'https://dev.api.pers.ninja/v2',\r\n\r\n /**\r\n * Default relying party name for WebAuthn operations\r\n * This appears in the browser's authentication prompts\r\n */\r\n DEFAULT_RELYING_PARTY_NAME: 'PERS Signer',\r\n DEFAULT_RELYING_PARTY_ID: 'signer.pers.ninja',\r\n /**\r\n * API endpoints for different operations\r\n */\r\n ENDPOINTS: {\r\n AUTH: '/auth',\r\n WALLETS: '/wallets',\r\n TRANSACTIONS: '/transactions',\r\n HEALTH: '/health',\r\n },\r\n} as const;\r\n\r\n/**\r\n * Shared provider constants for blockchain networks\r\n */\r\n\r\n// Default fallback provider for Sepolia testnet (no API key required)\r\nexport const DEFAULT_FALLBACK_PROVIDER = 'https://ethereum-sepolia.publicnode.com';\r\n\r\n/**\r\n * WebAuthn configuration constants\r\n */\r\nexport const WEBAUTHN_CONFIG = {\r\n /**\r\n * Timeout for WebAuthn operations (in milliseconds)\r\n */\r\n TIMEOUT: 60000,\r\n\r\n /**\r\n * User verification requirement\r\n * 'preferred' - ask for verification if available\r\n * 'required' - require verification\r\n * 'discouraged' - don't ask for verification\r\n */\r\n USER_VERIFICATION: 'preferred' as const,\r\n\r\n /**\r\n * Resident key requirement (Passkeys)\r\n */\r\n RESIDENT_KEY: 'required' as const,\r\n\r\n /**\r\n * Authenticator attachment preference\r\n */\r\n AUTHENTICATOR_ATTACHMENT: 'platform' as const,\r\n} as const;","import { extractJWTFromToken } from '../utils/jwt';\r\nimport { SIGNER_CONFIG } from '../config/constants';\r\n\r\n/**\r\n * Detects the environment (Staging vs Production) based on the JWT token issuer.\r\n * Updates the global service state accordingly.\r\n * \r\n * @param token - The JWT token to inspect\r\n * @returns boolean - True if staging was detected, false if production or unknown\r\n */\r\nexport function detectStagingEnvironmentFromToken(token: string): boolean {\r\n const { payload } = extractJWTFromToken(token);\r\n\r\n if (payload?.iss) {\r\n // Check if issuer matches staging URL\r\n if (payload.iss === SIGNER_CONFIG.STAGING_PERS_API_URL\r\n || SIGNER_CONFIG.STAGING_PERS_API_URL.includes(payload.iss)\r\n || SIGNER_CONFIG.STAGING_SIGNER_API_URL.includes(payload.iss)\r\n ) {\r\n return true;\r\n }\r\n }\r\n \r\n return false;\r\n}\r\n","/**\r\n * Platform-agnostic HTTP client abstraction\r\n * Provides a consistent interface for HTTP requests across platforms\r\n */\r\n\r\nexport interface HttpResponse<T = any> {\r\n data: T;\r\n status: number;\r\n statusText: string;\r\n headers: Record<string, string>;\r\n}\r\n\r\nexport interface HttpRequestOptions {\r\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\r\n headers?: Record<string, string>;\r\n body?: any;\r\n timeout?: number;\r\n}\r\n\r\nexport interface HttpClient {\r\n request<T = any>(url: string, options: HttpRequestOptions): Promise<HttpResponse<T>>;\r\n get<T = any>(url: string, headers?: Record<string, string>): Promise<HttpResponse<T>>;\r\n post<T = any>(url: string, data?: any, headers?: Record<string, string>): Promise<HttpResponse<T>>;\r\n put<T = any>(url: string, data?: any, headers?: Record<string, string>): Promise<HttpResponse<T>>;\r\n delete<T = any>(url: string, headers?: Record<string, string>): Promise<HttpResponse<T>>;\r\n}\r\n\r\n/**\r\n * Fetch-based HTTP client for web environments\r\n */\r\nexport class FetchHttpClient implements HttpClient {\r\n private defaultHeaders: Record<string, string> = {\r\n 'content-type': 'application/json',\r\n };\r\n\r\n async request<T = any>(url: string, options: HttpRequestOptions): Promise<HttpResponse<T>> {\r\n const headers = { ...this.defaultHeaders, ...options.headers };\r\n \r\n const fetchOptions: RequestInit = {\r\n method: options.method,\r\n headers,\r\n };\r\n\r\n if (options.body && options.method !== 'GET') {\r\n fetchOptions.body = typeof options.body === 'string' \r\n ? options.body \r\n : JSON.stringify(options.body);\r\n }\r\n\r\n // Add timeout support if provided\r\n if (options.timeout) {\r\n const controller = new AbortController();\r\n fetchOptions.signal = controller.signal;\r\n setTimeout(() => controller.abort(), options.timeout);\r\n }\r\n\r\n const response = await fetch(url, fetchOptions);\r\n \r\n // Check if response is actually JSON before parsing\r\n const responseText = await response.text();\r\n \r\n let data: T;\r\n try {\r\n data = JSON.parse(responseText) as T;\r\n } catch (parseError) {\r\n console.error('[HttpClient] JSON parse error:', parseError);\r\n console.error('[HttpClient] Failed to parse response text:', responseText);\r\n throw new Error(`Failed to parse JSON response: ${parseError instanceof Error ? parseError.message : 'Unknown error'}`);\r\n }\r\n\r\n return {\r\n data,\r\n status: response.status,\r\n statusText: response.statusText,\r\n headers: Object.fromEntries(response.headers.entries()),\r\n };\r\n }\r\n\r\n async get<T = any>(url: string, headers?: Record<string, string>): Promise<HttpResponse<T>> {\r\n return this.request<T>(url, { method: 'GET', headers });\r\n }\r\n\r\n async post<T = any>(url: string, data?: any, headers?: Record<string, string>): Promise<HttpResponse<T>> {\r\n return this.request<T>(url, { method: 'POST', body: data, headers });\r\n }\r\n\r\n async put<T = any>(url: string, data?: any, headers?: Record<string, string>): Promise<HttpResponse<T>> {\r\n return this.request<T>(url, { method: 'PUT', body: data, headers });\r\n }\r\n\r\n async delete<T = any>(url: string, headers?: Record<string, string>): Promise<HttpResponse<T>> {\r\n return this.request<T>(url, { method: 'DELETE', headers });\r\n }\r\n}\r\n\r\n/**\r\n * Global HTTP client instance\r\n */\r\nlet globalHttpClient: HttpClient | null = null;\r\n\r\n/**\r\n * Set the global HTTP client\r\n */\r\nexport function setHttpClient(client: HttpClient): void {\r\n globalHttpClient = client;\r\n}\r\n\r\n/**\r\n * Get the current HTTP client\r\n */\r\nexport function getHttpClient(): HttpClient {\r\n if (!globalHttpClient) {\r\n // Auto-initialize with fetch client for web environments\r\n globalHttpClient = new FetchHttpClient();\r\n }\r\n return globalHttpClient;\r\n}","/**\r\n * Shared service state for managing staging mode across all signer services\r\n * Ensures consistent API endpoint usage when fallback to staging is required\r\n */\r\n\r\nimport { SIGNER_CONFIG } from '../config/constants';\r\n\r\n/**\r\n * Helper function to get signer API URL with fallback logic\r\n * @param useStaging Whether to use staging environment URL\r\n */\r\nexport const getSignerApiUrl = (useStaging: boolean = false): string => {\r\n \r\n if (useStaging) {\r\n return SIGNER_CONFIG.STAGING_SIGNER_API_URL;\r\n }\r\n return SIGNER_CONFIG.DEFAULT_SIGNER_API_URL;\r\n};","import { detectStagingEnvironmentFromToken } from '../utils/environment';\r\nimport { getHttpClient } from '../platform/HttpClient';\r\nimport { \r\n LoginRequest,\r\n LoginResponse,\r\n JWTLoginResponse,\r\n VerifyTokenResponse,\r\n RegisterRequest,\r\n RegisterResponse,\r\n VerifyTokenRequest\r\n} from '../types/signer-api-types';\r\nimport type { WebAuthnProvider } from '../platform/WebAuthnProvider.types';\r\nimport { ExtendedPersSignerConfig } from '../sdk/PersSignerSDK';\r\nimport { AuthenticatedUser } from '../types';\r\nimport { getSignerApiUrl } from './ServiceState';\r\n\r\n/**\r\n * Authentication service for user login and registration\r\n * Uses constructor-based dependency injection for WebAuthn provider\r\n * Updated for new v1 API endpoints\r\n */\r\nexport class AuthenticationService {\r\n private signerToken: string | null = null;\r\n\r\n private webAuthnProvider: WebAuthnProvider;\r\n \r\n constructor(config: ExtendedPersSignerConfig) {\r\n this.webAuthnProvider = config.webAuthnProvider;\r\n }\r\n\r\n /**\r\n * Login with PERS token to get signer JWT\r\n * @param persToken - PERS JWT from PERS authentication\r\n * @returns Promise resolving to login response or provider challenge data\r\n */\r\n async loginWithPersToken(persToken: string): Promise<JWTLoginResponse | unknown> {\r\n const httpClient = getHttpClient();\r\n \r\n // Detect environment from token before making request\r\n const isStaging = detectStagingEnvironmentFromToken(persToken);\r\n try {\r\n const requestBody: LoginRequest = {\r\n authToken: persToken\r\n };\r\n\r\n // Try request with detected environment\r\n let response: any;\r\n try {\r\n response = await httpClient.post<LoginResponse>(\r\n `${getSignerApiUrl(isStaging)}/auth/login`,\r\n requestBody\r\n // Note: Login endpoint doesn't require Authorization header (public endpoint)\r\n );\r\n } catch (productionError: any) {\r\n // We now rely on detectEnvironment() to set the correct environment beforehand.\r\n // If the request fails, it's likely a genuine error (network, auth, server),\r\n // not an environment mismatch. Therefore, we should NOT fallback blindly.\r\n throw productionError;\r\n }\r\n \r\n const backendResponse = response.data;\r\n \r\n if (backendResponse && backendResponse.success) {\r\n // Check if it's JWT response\r\n if ('access_token' in backendResponse) {\r\n // JWT response - set token and return\r\n this.signerToken = backendResponse.access_token;\r\n return backendResponse as JWTLoginResponse;\r\n }\r\n }\r\n\r\n // Handle expected \"User Not Found\" case gracefully\r\n if (backendResponse && (backendResponse.error === 'user_not_found' || backendResponse.status === 404)) {\r\n // This is not a system error, just a signal that we need to register\r\n throw new Error('user_not_found');\r\n }\r\n \r\n console.error('[AuthenticationService] Invalid response - no success or success=false:', backendResponse);\r\n throw new Error('Login failed: Invalid response format');\r\n } catch (error: any) {\r\n // Don't log \"user_not_found\" as an error since it's part of the normal flow for new users\r\n if (error.message !== 'user_not_found') {\r\n console.error(`[AuthenticationService] PERS token login failed:`, error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Verify signer token validity\r\n * @param token - Signer JWT to verify\r\n * @returns Promise resolving to verification result\r\n */\r\n async verifyToken(token: string): Promise<VerifyTokenResponse> {\r\n const httpClient = getHttpClient();\r\n \r\n try {\r\n const requestBody: VerifyTokenRequest = {\r\n token\r\n };\r\n\r\n // Detect environment from token (if possible, though verify usually uses signer token which might differ)\r\n // But usually we want to verify against the environment we are configured for.\r\n // Since verifyToken is often called with a stored token, we might not have the PERS token here.\r\n // However, if we have a token, we can try to detect.\r\n // For now, let's stick to serviceState, but we should probably be consistent.\r\n // If verifyToken is called, we assume the environment is already set or we use the token to check.\r\n \r\n // Let's check if the token itself gives a hint (if it's a signer token, it has an issuer too)\r\n const isStaging = detectStagingEnvironmentFromToken(token);\r\n\r\n const response = await httpClient.post<VerifyTokenResponse>(\r\n `${getSignerApiUrl(isStaging)}/auth/verify`,\r\n requestBody,\r\n { Authorization: `Bearer ${token}` }\r\n );\r\n \r\n const verifyData = response.data;\r\n \r\n if (!verifyData.valid) {\r\n throw new Error('Token verification failed');\r\n }\r\n \r\n return verifyData;\r\n } catch (error) {\r\n console.error(`[AuthenticationService] Token verification failed:`, error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Register user with unified flow\r\n * @param persToken - PERS JWT token\r\n * @returns Promise resolving to authenticated user data\r\n */\r\n async registerUser(persToken: string): Promise<JWTLoginResponse> {\r\n const httpClient = getHttpClient();\r\n const isStaging = detectStagingEnvironmentFromToken(persToken);\r\n const apiUrl = getSignerApiUrl(isStaging);\r\n\r\n try {\r\n // Step 1: Initialize registration\r\n const initRequest: RegisterRequest = {\r\n authToken: persToken\r\n };\r\n\r\n const initResponse = await httpClient.post<RegisterResponse>(\r\n `${apiUrl}/auth/register`,\r\n initRequest\r\n );\r\n\r\n const initData = initResponse.data;\r\n\r\n // Check if challenge is required\r\n if (initData && initData.data && initData.data.status === 'challenge_required') {\r\n const { challenge, state } = initData.data;\r\n\r\n if (!state) {\r\n throw new Error('Registration failed: Missing state in challenge response');\r\n }\r\n\r\n // Sign the challenge\r\n // Backend now returns a full WebAuthn options object in the 'challenge' field\r\n const signedChallenge = await this.webAuthnProvider.create(challenge as any);\r\n\r\n // Step 2: Complete registration\r\n const completeRequest: RegisterRequest = {\r\n authToken: persToken,\r\n signedChallenge,\r\n state\r\n };\r\n\r\n const completeResponse = await httpClient.post<RegisterResponse>(\r\n `${apiUrl}/auth/register`,\r\n completeRequest\r\n );\r\n\r\n const completeData = completeResponse.data;\r\n\r\n if (completeData.success && completeData.access_token) {\r\n return completeData as unknown as JWTLoginResponse;\r\n }\r\n \r\n throw new Error('Registration completion failed: No access token returned');\r\n } else if (initData.success && initData.access_token) {\r\n // Direct success\r\n return initData as unknown as JWTLoginResponse;\r\n }\r\n\r\n throw new Error('Registration failed: Invalid response format');\r\n\r\n } catch (error) {\r\n console.error('[AuthenticationService] Registration failed:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Get current signer token\r\n * @returns The current signer JWT token\r\n */\r\n getSignerToken(): string | null {\r\n return this.signerToken;\r\n }\r\n\r\n /**\r\n * Set signer token (for external token management)\r\n * @param token - Signer JWT token\r\n */\r\n setSignerToken(token: string): void {\r\n this.signerToken = token;\r\n }\r\n\r\n\r\n /**\r\n * Combined authentication flow - handles both login and registration\r\n * @param identifier - User identifier (email/userId)\r\n * @param persAccessToken - PERS JWT token for authentication\r\n * @param webAuthnProvider - WebAuthn provider for credential creation\r\n * @param relyingPartyConfig - Configuration for WebAuthn relying party\r\n * @returns Promise resolving to authenticated user with signer token\r\n */\r\n public async combinedAuthentication(identifier: string, persAccessToken: string): Promise<AuthenticatedUser> {\r\n try {\r\n // Step 1: Try to login with PERS token first (this will get signer JWT if user exists)\r\n let signerToken: string | null = null;\r\n \r\n try {\r\n const loginResult = await this.loginWithPersToken(persAccessToken);\r\n \r\n // Extract token from login result\r\n if (loginResult && typeof loginResult === 'object' && 'access_token' in loginResult) {\r\n signerToken = (loginResult as any).access_token;\r\n } else {\r\n throw new Error('Invalid login response format');\r\n }\r\n } catch (loginError) {\r\n \r\n // Step 2: User doesn't exist - register with v1 API (Unified Flow)\r\n try {\r\n // Only proceed to registration if the error is explicitly 'user_not_found'\r\n const errorMessage = loginError instanceof Error ? loginError.message : String(loginError);\r\n if (errorMessage !== 'user_not_found') {\r\n throw loginError;\r\n }\r\n\r\n const registerResult = await this.registerUser(persAccessToken);\r\n \r\n if (registerResult && registerResult.access_token) {\r\n signerToken = registerResult.access_token;\r\n } else {\r\n throw new Error('Registration successful but no access token returned');\r\n }\r\n } catch (registerError) {\r\n console.error(`[AuthenticationService] Registration failed for ${identifier}:`, registerError);\r\n // Explicitly rethrow to abort the entire authentication process\r\n throw registerError;\r\n }\r\n }\r\n\r\n if (!signerToken) {\r\n throw new Error('Authentication failed: Unable to obtain signer token');\r\n }\r\n\r\n const user: AuthenticatedUser = {\r\n identifier: identifier,\r\n signerAuthToken: signerToken,\r\n persAccessToken: persAccessToken,\r\n expiresAt: Date.now() + 300000 // 5 minutes\r\n };\r\n \r\n return user;\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n console.error(`[PersSignerSDK] Combined authentication failed for ${identifier}:`, errorMessage);\r\n throw new Error(`Combined authentication failed: ${errorMessage}`);\r\n }\r\n }\r\n}","import { getHttpClient } from '../platform/HttpClient';\r\nimport { \r\n ListWalletsRequest,\r\n ListWalletsResponse,\r\n Wallet\r\n} from '../types/signer-api-types';\r\nimport { detectStagingEnvironmentFromToken } from '../utils/environment';\r\nimport { getSignerApiUrl } from './ServiceState';\r\n\r\n/**\r\n * Wallet management service\r\n * Updated for v1 API endpoints per migration reference\r\n */\r\nexport class WalletService {\r\n \r\n /**\r\n * List all wallets for authenticated user\r\n * @param signerToken - Signer JWT token\r\n * @returns Promise resolving to wallet data\r\n */\r\n static async listWallets(signerToken: string): Promise<Wallet[]> {\r\n const httpClient = getHttpClient();\r\n\r\n const isStaging = detectStagingEnvironmentFromToken(signerToken);\r\n \r\n try {\r\n const requestBody: ListWalletsRequest = {};\r\n\r\n const response = await httpClient.post<ListWalletsResponse>(\r\n `${getSignerApiUrl(isStaging)}/wallets/list`,\r\n requestBody,\r\n { Authorization: `Bearer ${signerToken}` }\r\n );\r\n \r\n const backendResponse = response.data;\r\n \r\n if (backendResponse.success && backendResponse.data) {\r\n return backendResponse.data.items;\r\n }\r\n \r\n throw new Error('Failed to list wallets: Invalid response');\r\n } catch (error) {\r\n console.error('[WalletService] Error listing wallets:', error);\r\n throw error;\r\n }\r\n }\r\n}","import { getHttpClient } from '../platform/HttpClient';\r\nimport type { WebAuthnProvider, WebAuthnSignChallenge } from '../platform/WebAuthnProvider.types';\r\nimport { \r\n SigningRequest,\r\n HashSigningRequest,\r\n TypedDataSigningRequest \r\n} from '../types/key-service-types';\r\nimport { \r\n SignWalletRequest,\r\n SignWalletResponse,\r\n CompleteSignatureResponse\r\n} from '../types/signer-api-types';\r\nimport { detectStagingEnvironmentFromToken } from '../utils/environment';\r\nimport { getSignerApiUrl } from './ServiceState';\r\n\r\n/**\r\n * Signing service for cryptographic operations\r\n * Handles hash signing and typed data signing with WebAuthn\r\n * Uses constructor-based dependency injection for WebAuthn provider\r\n */\r\nexport class SigningService {\r\n private webAuthnProvider: WebAuthnProvider;\r\n\r\n constructor(webAuthnProvider: WebAuthnProvider) {\r\n this.webAuthnProvider = webAuthnProvider;\r\n }\r\n \r\n /**\r\n * Sign a hash using the specified wallet\r\n * @param authToken - Authentication token\r\n * @param walletId - Wallet identifier\r\n * @param hash - Hash to sign\r\n * @returns Promise resolving to signature response\r\n */\r\n async signHash(\r\n authToken: string,\r\n walletId: string,\r\n hash: string\r\n ): Promise<CompleteSignatureResponse['data']> {\r\n const request: HashSigningRequest = {\r\n kind: \"Hash\",\r\n hash,\r\n };\r\n return await this.signRequest(authToken, walletId, request);\r\n }\r\n\r\n /**\r\n * Sign EIP-712 typed data using the specified wallet\r\n * @param authToken - Authentication token\r\n * @param walletId - Wallet identifier\r\n * @param domain - EIP-712 domain\r\n * @param types - EIP-712 types definition\r\n * @param value - Data to sign\r\n * @returns Promise resolving to signature response\r\n */\r\n async signTypedData(\r\n authToken: string,\r\n walletId: string,\r\n domain: any,\r\n types: Record<string, any[]>,\r\n value: Record<string, any>\r\n ): Promise<CompleteSignatureResponse['data']> {\r\n const request: TypedDataSigningRequest = {\r\n blockchainKind: \"Evm\",\r\n kind: \"Eip712\",\r\n types,\r\n domain,\r\n message: value\r\n };\r\n return await this.signRequest(authToken, walletId, request);\r\n }\r\n\r\n /**\r\n * Generic signing method that handles the complete signing flow\r\n * @param authToken - Authentication token\r\n * @param walletId - Wallet identifier\r\n * @param request - Signing request object\r\n * @returns Promise resolving to signature response\r\n */\r\n private async signRequest(\r\n authToken: string,\r\n walletId: string,\r\n request: SigningRequest\r\n ): Promise<CompleteSignatureResponse['data']> {\r\n const httpClient = getHttpClient();\r\n\r\n const isStaging = detectStagingEnvironmentFromToken(authToken);\r\n \r\n try {\r\n // Step 1: Initial signing request\r\n const signRequest: SignWalletRequest = {\r\n walletId,\r\n payload: request\r\n };\r\n \r\n const response = await httpClient.post<SignWalletResponse>(\r\n `${getSignerApiUrl(isStaging)}/wallets/sign`,\r\n signRequest,\r\n { Authorization: `Bearer ${authToken}` }\r\n );\r\n \r\n let backendResponse = response.data;\r\n \r\n if (!backendResponse.success || !backendResponse.data) {\r\n console.error('[SigningService] Sign response invalid:', backendResponse);\r\n throw new Error('Signature initialization failed');\r\n }\r\n \r\n // Step 2: Handle challenge if required\r\n if (backendResponse.data.status === 'challenge_required') {\r\n const challenge = backendResponse.data.challenge as WebAuthnSignChallenge;\r\n \r\n // Sign the challenge using WebAuthn\r\n const assertion = await this.webAuthnProvider.sign(challenge);\r\n \r\n // Step 3: Complete signing with signed challenge\r\n const completeRequest: SignWalletRequest = {\r\n walletId,\r\n payload: request,\r\n signedChallenge: {\r\n challengeIdentifier: challenge.challengeIdentifier || challenge.challenge,\r\n ...assertion\r\n }\r\n };\r\n \r\n const completeResponse = await httpClient.post<SignWalletResponse>(\r\n `${getSignerApiUrl(isStaging)}/wallets/sign`,\r\n completeRequest,\r\n { Authorization: `Bearer ${authToken}` }\r\n );\r\n\r\n backendResponse = completeResponse.data;\r\n }\r\n\r\n if (backendResponse.success && backendResponse.data && backendResponse.data.status === 'completed') {\r\n // Cast to expected return type - assuming backend returns compatible structure\r\n return backendResponse.data as unknown as CompleteSignatureResponse['data'];\r\n }\r\n \r\n console.error('[SigningService] Complete response invalid:', backendResponse);\r\n throw new Error('Signature completion failed');\r\n \r\n } catch (error) {\r\n console.error(`[SigningService] Signing failed for wallet ${walletId}:`, error);\r\n throw error;\r\n }\r\n }\r\n \r\n /**\r\n * Sign multiple requests in batch (when backend supports it)\r\n * @param authToken - Authentication token\r\n * @param walletId - Wallet identifier\r\n * @param requests - Array of signing requests\r\n * @returns Promise resolving to array of signature responses\r\n */\r\n async signBatch(\r\n authToken: string,\r\n walletId: string,\r\n requests: SigningRequest[]\r\n ): Promise<CompleteSignatureResponse['data'][]> {\r\n // For now, process sequentially. Could be optimized for parallel processing\r\n const results: CompleteSignatureResponse['data'][] = [];\r\n \r\n for (const request of requests) {\r\n const result = await this.signRequest(authToken, walletId, request);\r\n results.push(result);\r\n }\r\n \r\n return results;\r\n }\r\n}","import { SessionAuthContextResponseDTO } from '@explorins/pers-shared/browser';\r\nimport { TenantPublicDTO, TransactionFormat, TRANSACTION_FORMATS, TransactionRequestResponseDTO, TransactionSubmissionRequestDTO } from '../types/pers-types';\r\nimport { detectStagingEnvironmentFromToken } from '../utils/environment';\r\n\r\nimport { SIGNER_CONFIG } from '../config/constants';\r\n\r\n/**\r\n * Service for interacting with PERS (Phygital Experience Rewards System) backend API\r\n */\r\n\r\n\r\n/**\r\n * Configuration interface for PERS API\r\n */\r\nexport interface PersApiConfig {\r\n baseUrl: string;\r\n projectKey?: string; // Now optional, will be retrieved from tenant\r\n}\r\n\r\n/**\r\n * Error response from the PERS API\r\n */\r\nexport interface PersApiError {\r\n status: number;\r\n message: string;\r\n error?: any;\r\n}\r\n\r\n/**\r\n * Get PERS API base URL with staging option\r\n * @param useStaging Whether to use staging environment URL\r\n */\r\nconst getPersApiUrl = (useStaging: boolean = false): string => {\r\n if (useStaging) {\r\n return SIGNER_CONFIG.STAGING_PERS_API_URL;\r\n }\r\n \r\n return SIGNER_CONFIG.DEFAULT_PERS_API_URL;\r\n};\r\n\r\n/**\r\n * Default PERS API configuration\r\n * Can be overridden by applications using the shared library\r\n */\r\nexport const DEFAULT_PERS_CONFIG: PersApiConfig = {\r\n baseUrl: getPersApiUrl(),\r\n // projectKey removed - will be retrieved from tenant\r\n};\r\n\r\ninterface CachedTenantData {\r\n tenant: TenantPublicDTO;\r\n cachedAt: number;\r\n expiresAt: number;\r\n}\r\n\r\nexport class PersService {\r\n private static config: PersApiConfig = DEFAULT_PERS_CONFIG;\r\n private static tenantCache: Map<string, CachedTenantData> = new Map();\r\n private static currentProjectKey: string | null = null;\r\n private static currentTenantId: string | null = null;\r\n private static readonly TENANT_CACHE_TTL = 24 * 60 * 60 * 1000; // 24 hours - tenant configs are essentially static\r\n\r\n /**\r\n * Configure the PERS API settings\r\n * @param config - The configuration object\r\n */\r\n static configure(config: Partial<PersApiConfig>) {\r\n this.config = { ...this.config, ...config };\r\n }\r\n\r\n\r\n\r\n /**\r\n * Get current configuration\r\n */\r\n static getConfig(): PersApiConfig {\r\n return { ...this.config };\r\n }\r\n\r\n /**\r\n * Get tenant information by tenant ID\r\n * @param tenantId - The tenant ID to retrieve\r\n * @param authToken - Optional auth token for authentication\r\n * @returns Promise with tenant public information\r\n */\r\n static async getTenantById(tenantId: string, authToken: string): Promise<TenantPublicDTO> {\r\n // Check memory cache first with expiration\r\n const cached = this.tenantCache.get(tenantId);\r\n if (cached && Date.now() < cached.expiresAt) {\r\n return cached.tenant;\r\n }\r\n\r\n try {\r\n const headers: Record<string, string> = {\r\n 'accept': 'application/json',\r\n 'Content-Type': 'application/json'\r\n };\r\n\r\n let url = this.config.baseUrl;\r\n\r\n // Add auth token if provided and detect environment\r\n if (authToken) {\r\n headers['Authorization'] = `Bearer ${authToken}`;\r\n const isStaging = detectStagingEnvironmentFromToken(authToken);\r\n url = getPersApiUrl(isStaging);\r\n }\r\n\r\n // Try request\r\n const response = await fetch(`${url}/tenants/${tenantId}`, {\r\n method: 'GET',\r\n headers\r\n });\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n throw {\r\n status: response.status,\r\n message: errorData.message || `Failed to fetch tenant ${tenantId}`,\r\n error: errorData\r\n } as PersApiError;\r\n }\r\n\r\n const tenantData = await response.json() as TenantPublicDTO;\r\n\r\n // Cache the tenant data with expiration\r\n const now = Date.now();\r\n this.tenantCache.set(tenantId, {\r\n tenant: tenantData,\r\n cachedAt: now,\r\n expiresAt: now + this.TENANT_CACHE_TTL\r\n });\r\n \r\n // Update current project key (check multiple possible property names)\r\n this.currentProjectKey = (tenantData as any).projectKey || (tenantData as any).projectApiKey || (tenantData as any).apiKey;\r\n this.currentTenantId = tenantId;\r\n \r\n return tenantData;\r\n } catch (error: any) {\r\n console.error('Error fetching tenant:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Initialize tenant configuration from JWT\r\n * @param tenantId - The tenant ID from JWT payload\r\n * @param authToken - Optional auth token for authentication\r\n * @returns Promise with tenant information\r\n */\r\n static async initializeTenant(tenantId: string, authToken: string): Promise<TenantPublicDTO> {\r\n const tenantData = await this.getTenantById(tenantId, authToken);\r\n \r\n // Update service configuration with tenant's project key\r\n const projectKey = tenantData.projectApiKey;\r\n if (projectKey) {\r\n this.currentProjectKey = projectKey;\r\n this.currentTenantId = tenantId;\r\n }\r\n \r\n return tenantData;\r\n }\r\n\r\n /**\r\n * Ensure tenant is initialized and current, with automatic revalidation\r\n * @param tenantId - The tenant ID to ensure is initialized\r\n * @param authToken - Optional auth token for authentication\r\n * @returns Promise with tenant information\r\n */\r\n static async ensureTenantInitialized(tenantId: string, authToken: string): Promise<TenantPublicDTO> {\r\n // Check if we already have the right tenant initialized and it's still valid\r\n const cached = this.tenantCache.get(tenantId);\r\n if (this.currentTenantId === tenantId && cached && Date.now() < cached.expiresAt) {\r\n return cached.tenant;\r\n }\r\n\r\n // Initialize or refresh tenant data\r\n return await this.initializeTenant(tenantId, authToken);\r\n }\r\n\r\n /**\r\n * Get the current project key (either from tenant or fallback)\r\n * @param tenantId - Optional tenant ID to ensure is initialized\r\n * @returns The project key to use for API calls\r\n */\r\n private static async getProjectKey(tenantId: string, authToken: string): Promise<string> {\r\n // If tenantId provided and different from current, initialize it\r\n if (tenantId && this.currentTenantId !== tenantId) {\r\n await this.ensureTenantInitialized(tenantId, authToken);\r\n }\r\n \r\n if (this.currentProjectKey) {\r\n return this.currentProjectKey;\r\n }\r\n \r\n if (this.config.projectKey) {\r\n return this.config.projectKey;\r\n }\r\n \r\n console.error('No project key available. Current tenant cache:', Array.from(this.tenantCache.keys()));\r\n throw new Error('No project key available. Please initialize tenant or configure project key.');\r\n }\r\n\r\n /**\r\n * Clear tenant cache and reset project key\r\n */\r\n static clearTenantCache(): void {\r\n this.tenantCache.clear();\r\n this.currentProjectKey = null;\r\n this.currentTenantId = null;\r\n }\r\n\r\n /**\r\n * Authenticates a user with the PERS backend using their auth token\r\n * \r\n * @param authToken - The authentication token received from backend after login/registration\r\n * @param tenantId - Optional tenant ID for automatic initialization\r\n * @returns A promise that resolves to the authentication response\r\n * @throws If the request fails\r\n */\r\n static async authenticateUser(authToken: string, tenantId: string): Promise<SessionAuthContextResponseDTO> {\r\n try {\r\n const projectKey = await this.getProjectKey(tenantId, authToken);\r\n \r\n const headers: Record<string, string> = {\r\n 'accept': 'application/json',\r\n 'x-project-key': projectKey,\r\n 'Content-Type': 'application/json'\r\n };\r\n\r\n // Detect environment from token\r\n const isStaging = detectStagingEnvironmentFromToken(authToken);\r\n let response = await fetch(`${getPersApiUrl(isStaging)}/auth/token`, {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify({ authToken })\r\n }); \r\n\r\n const data = await response.json();\r\n if (!response.ok) {\r\n throw {\r\n status: response.status,\r\n message: data.message || 'Authentication with PERS backend failed',\r\n error: data\r\n } as PersApiError;\r\n }\r\n \r\n console.info('[PERS] User authentication successful');\r\n return data as SessionAuthContextResponseDTO;\r\n } catch (error: any) {\r\n // Rethrow a structured error\r\n throw {\r\n status: error.status || 500,\r\n message: error.message || 'Failed to authenticate with PERS backend',\r\n error\r\n } as PersApiError;\r\n }\r\n }\r\n\r\n /**\r\n * Submits a transaction by calling the backend endpoint\r\n *\r\n * @param transactionId - The ID of the transaction to submit\r\n * @param signedTransactionOrSignature - The signed transaction data or EIP-712 signature\r\n * @param persAccessToken - The PERS access token for authentication (Bearer)\r\n * @param submissionType - The transaction format type\r\n * @param tenantId - Optional tenant ID for automatic initialization\r\n * @returns A promise that resolves to the transaction submission response\r\n * @throws If the request fails\r\n */\r\n static async submitTransaction(\r\n transactionId: string, \r\n signedTransactionOrSignature: string, \r\n persAccessToken: string,\r\n submissionType: TransactionFormat,\r\n tenantId: string\r\n ): Promise<TransactionRequestResponseDTO> {\r\n try {\r\n // Map TransactionFormat to the backend's expected submission type\r\n const dto: TransactionSubmissionRequestDTO = {\r\n transactionId,\r\n type: submissionType,\r\n ...(submissionType === TRANSACTION_FORMATS.EIP_712\r\n ? { signature: signedTransactionOrSignature }\r\n : { signedTransaction: signedTransactionOrSignature }\r\n )\r\n };\r\n\r\n // Detect environment from token\r\n const isStaging = detectStagingEnvironmentFromToken(persAccessToken);\r\n\r\n // UPDATED: /transaction/auth/submit/${transactionId} → /transactions/${transactionId}/submit\r\n const res = await fetch(`${getPersApiUrl(isStaging)}/transactions/submit`, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n 'x-project-key': await this.getProjectKey(tenantId, persAccessToken),\r\n Authorization: `Bearer ${persAccessToken}`,\r\n },\r\n body: JSON.stringify(dto),\r\n });\r\n \r\n const response = await res.json();\r\n \r\n if (!res.ok) {\r\n // Throw structured error with the backend response\r\n throw {\r\n status: res.status,\r\n message: response.message || \"Failed to submit transaction\",\r\n error: response\r\n } as PersApiError;\r\n }\r\n \r\n return response as TransactionRequestResponseDTO;\r\n } catch (error: any) {\r\n // Rethrow a structured error\r\n throw {\r\n status: error.status || 500,\r\n message: error.message || 'Failed to submit transaction to PERS backend',\r\n error\r\n } as PersApiError;\r\n }\r\n }\r\n\r\n /**\r\n * Fetches a prepared transaction for signing by transactionId\r\n * @param transactionId - The transaction ID to fetch\r\n * @param persAccessToken - The PERS access token for authentication (Bearer)\r\n * @param tenantId - Optional tenant ID for automatic initialization\r\n * @returns The prepared transaction data\r\n * @throws If the request fails\r\n */\r\n static async fetchPreparedTransaction(transactionId: string, persAccessToken: string, tenantId: string): Promise<TransactionRequestResponseDTO> {\r\n try {\r\n // Detect environment from token\r\n const isStaging = detectStagingEnvironmentFromToken(persAccessToken);\r\n\r\n // ✅ UPDATED: /transaction/auth/prepare-signing/${transactionId} → /transactions/${transactionId}/prepare\r\n const res = await fetch(\r\n `${getPersApiUrl(isStaging)}/transactions/${transactionId}/prepare`,\r\n {\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"x-project-key\": await this.getProjectKey(tenantId, persAccessToken),\r\n Authorization: `Bearer ${persAccessToken}`,\r\n },\r\n }\r\n );\r\n \r\n const response = await res.json();\r\n \r\n if (!res.ok) {\r\n // Throw structured error with the backend response\r\n throw {\r\n status: res.status,\r\n message: response.message || \"Failed to fetch prepared transaction\",\r\n error: response\r\n } as PersApiError;\r\n }\r\n \r\n return response as TransactionRequestResponseDTO;\r\n } catch (error: any) {\r\n // Rethrow a structured error\r\n throw {\r\n status: error.status || 500,\r\n message: error.message || 'Failed to fetch prepared transaction from PERS backend',\r\n error\r\n } as PersApiError;\r\n }\r\n }\r\n\r\n /**\r\n * Helper method to determine if transaction data is available for signing\r\n * @param transactionResponse - Response from prepare or fetch transaction\r\n * @returns boolean indicating if transaction can be signed\r\n */\r\n static isTransactionReadyForSigning(transactionResponse: TransactionRequestResponseDTO): boolean {\r\n return transactionResponse.signingData !== null && transactionResponse.signingData !== undefined;\r\n }\r\n \r\n /**\r\n * Helper method to get transaction data from response\r\n * @param transactionResponse - Response from prepare or fetch transaction\r\n * @returns The transaction data ready for signing\r\n * @throws If transaction data is not available\r\n */\r\n static getTransactionDataForSigning(transactionResponse: TransactionRequestResponseDTO) {\r\n if (!transactionResponse.signingData) {\r\n throw new Error('Transaction data is not ready for signing');\r\n }\r\n return transactionResponse.signingData!;\r\n }\r\n}\r\n","import { getHttpClient } from '../platform/HttpClient';\r\nimport { HealthCheckResponse } from '../types/signer-api-types';\r\nimport { getSignerApiUrl } from './ServiceState';\r\n\r\n/**\r\n * Health check service for signer API\r\n * Handles health check operations for the new v1 API\r\n */\r\nexport class HealthService {\r\n \r\n /**\r\n * Perform health check on the signer API\r\n * @returns Promise resolving to health check result\r\n */\r\n static async checkHealth(): Promise<HealthCheckResponse> {\r\n const httpClient = getHttpClient();\r\n \r\n try {\r\n const response = await httpClient.get<HealthCheckResponse>(\r\n `${getSignerApiUrl()}/health`\r\n );\r\n \r\n return response.data;\r\n } catch (error) {\r\n console.error('[HealthService] Health check failed:', error);\r\n // Return failed health check instead of throwing\r\n return {\r\n success: false\r\n };\r\n }\r\n }\r\n}","import { Signature } from 'ethers';\r\nimport { CompleteSignatureResponse } from '../types/signer-api-types';\r\n\r\n// Legacy signature response interface for backward compatibility\r\nexport interface GenerateSignatureResponse {\r\n status: 'Signed' | 'Failed' | 'Pending';\r\n signature?: {\r\n r: string;\r\n s: string;\r\n recid: number;\r\n };\r\n error?: string;\r\n}\r\n\r\nexport class WalletError extends Error {\r\n constructor(public code: number, message: string, public details?: any) {\r\n super(message);\r\n this.name = 'WalletError';\r\n }\r\n}\r\n\r\n/**\r\n * Adapter function to convert backend signature response to legacy format\r\n * Handles both structured (EIP-712) and string (Hex/Base64) signature formats\r\n */\r\nexport const adaptSignatureResponse = (newResponse: CompleteSignatureResponse['data']): GenerateSignatureResponse => {\r\n if (!newResponse.signature) {\r\n console.error('[SignatureUtils] No signature in response:', newResponse);\r\n throw new Error('Signature missing from response');\r\n }\r\n \r\n // Handle structured signature format (typically from EIP-712 signing)\r\n if (typeof newResponse.signature === 'object' && !Array.isArray(newResponse.signature) && 'r' in newResponse.signature) {\r\n const sig = newResponse.signature as { r: string; s: string; recid: number };\r\n const { r, s, recid } = sig;\r\n \r\n return {\r\n status: 'Signed' as const,\r\n signature: {\r\n r,\r\n s,\r\n recid // Use recid directly from backend\r\n }\r\n };\r\n }\r\n \r\n // Handle string signature format\r\n if (typeof newResponse.signature === 'string') {\r\n const signature = newResponse.signature as string;\r\n\r\n // 1. Standard Hex Signature (0x + 32 bytes r + 32 bytes s + 1 byte v)\r\n if (signature.startsWith('0x') && signature.length === 132) {\r\n const r = '0x' + signature.slice(2, 66);\r\n const s = '0x' + signature.slice(66, 130);\r\n const v = parseInt(signature.slice(130, 132), 16);\r\n const recid = v >= 27 ? v - 27 : v;\r\n \r\n return {\r\n status: 'Signed' as const,\r\n signature: { r, s, recid }\r\n };\r\n }\r\n\r\n // 2. Base64 Encoded JSON\r\n // The backend sometimes returns a Base64 string containing the JSON signature object\r\n try {\r\n const decoded = atob(signature);\r\n const jsonSig = JSON.parse(decoded);\r\n \r\n if (typeof jsonSig === 'object' && jsonSig !== null && jsonSig.signature?.r && jsonSig.signature?.s) {\r\n return {\r\n status: 'Signed' as const,\r\n signature: {\r\n r: jsonSig.signature.r,\r\n s: jsonSig.signature.s,\r\n // Use nullish coalescing (??) because recid can be 0\r\n recid: jsonSig.signature.recid ?? jsonSig.signature.yParity ?? 0\r\n }\r\n };\r\n }\r\n } catch {\r\n // Not a valid Base64 JSON signature, continue to error\r\n }\r\n \r\n console.error('[SignatureUtils] Invalid string signature format:', signature.substring(0, 100));\r\n throw new Error(`Invalid string signature format. Expected 132-char hex or Base64 JSON.`);\r\n }\r\n \r\n console.error('[SignatureUtils] Invalid signature format - expected structured object or string:', typeof newResponse.signature);\r\n throw new Error('Invalid signature format in response - expected structured object or string from backend');\r\n};\r\n\r\nexport const assertSigned = (res: GenerateSignatureResponse) => {\r\n if (res.status === \"Failed\") {\r\n throw new WalletError(-1, \"signing failed\", res);\r\n } else if (res.status !== \"Signed\") {\r\n throw new WalletError(\r\n -1,\r\n \"cannot complete signing synchronously because this wallet action requires policy approval\",\r\n res\r\n );\r\n }\r\n};\r\n\r\nexport const combineSignature = (res: GenerateSignatureResponse): string => {\r\n if (!res.signature) {\r\n console.error('[SignatureUtils] No signature in response for combining:', res);\r\n throw new WalletError(-1, \"signature missing\", res);\r\n }\r\n\r\n const { r, s, recid } = res.signature;\r\n \r\n const ethersSignature = Signature.from({\r\n r,\r\n s,\r\n v: recid ? 0x1c : 0x1b, // Assuming 0x1c for chain_id > 0, 0x1b otherwise. Backend usually provides recid.\r\n });\r\n \r\n return ethersSignature.serialized;\r\n};\r\n","import { CounterfactualWalletTransactionResponse, TransactionStatus } from '@explorins/pers-shared/browser';\r\nimport { LegacyTransaction } from '@explorins/web3-ts/types';\r\n\r\n/**\r\n * Combined transaction status type that includes both PERS and additional statuses\r\n */\r\nexport type CombinedTransactionStatus = TransactionStatus;\r\n\r\n/**\r\n * Transaction statuses that allow signing\r\n */\r\nexport const SIGNABLE_STATUSES = [TransactionStatus.PENDING_SIGNATURE, TransactionStatus.CREATED] as const;\r\n\r\n/**\r\n * Transaction status information for UI display\r\n */\r\nexport interface TransactionStatusInfo {\r\n transactionId: string;\r\n transactionStatus: CombinedTransactionStatus;\r\n message: string;\r\n}\r\n\r\n/**\r\n * Transaction signing result\r\n */\r\nexport interface TransactionSigningResult {\r\n success: boolean;\r\n transactionId: string;\r\n // transactionHash?: string;\r\n signature?: string;\r\n signingData?: CounterfactualWalletTransactionResponse | LegacyTransaction\r\n error?: string;\r\n statusInfo?: TransactionStatusInfo;\r\n // shouldRedirect?: boolean;\r\n // redirectUrl?: string;\r\n shouldShowStatus?: boolean;\r\n}\r\n\r\n/**\r\n * Transaction submission result for internal processing\r\n */\r\nexport interface SubmissionResult {\r\n submitResult: import('../types/pers-types').TransactionRequestResponseDTO;\r\n shouldRedirect: boolean;\r\n redirectUrl?: string;\r\n transactionHash: string | null;\r\n success: boolean;\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Metadata for transaction parameters - string values only\r\n */\r\n/* export interface TransactionMetadata {\r\n [key: string]: string;\r\n} */\r\n\r\n/**\r\n * Authentication tokens required for transaction signing\r\n */\r\nexport interface SigningAuthTokens {\r\n signerAuthToken: string;\r\n persAccessToken: string;\r\n}\r\n\r\n/**\r\n * Transaction signing parameters\r\n */\r\nexport interface TransactionSigningParams {\r\n transactionId: string;\r\n tenantId: string;\r\n authTokens: SigningAuthTokens;\r\n ethersProviderUrl: string;\r\n returnUrl?: string;\r\n // metadata?: TransactionMetadata;\r\n // Optional wallet error state (eliminates need for localStorage)\r\n // walletRegistrationFailed?: boolean;\r\n // walletErrorDetails?: string;\r\n}","/**\r\n * Error codes for transaction signing operations\r\n */\r\nexport enum TransactionSigningErrorCode {\r\n INVALID_TOKENS = 'INVALID_TOKENS',\r\n TRANSACTION_NOT_FOUND = 'TRANSACTION_NOT_FOUND',\r\n TRANSACTION_NOT_PENDING = 'TRANSACTION_NOT_PENDING',\r\n WALLET_NOT_AVAILABLE = 'WALLET_NOT_AVAILABLE',\r\n WEBAUTHN_OPERATION_IN_PROGRESS = 'WEBAUTHN_OPERATION_IN_PROGRESS',\r\n SIGNING_CANCELLED = 'SIGNING_CANCELLED',\r\n PERS_AUTH_FAILED = 'PERS_AUTH_FAILED',\r\n AUTH_FAILED = 'AUTH_FAILED',\r\n TRANSACTION_NOT_READY = 'TRANSACTION_NOT_READY',\r\n SUBMISSION_FAILED = 'SUBMISSION_FAILED',\r\n SERVER_ERROR = 'SERVER_ERROR',\r\n UNKNOWN_ERROR = 'UNKNOWN_ERROR'\r\n}\r\n\r\n/**\r\n * Structured error for transaction signing operations\r\n */\r\nexport interface TransactionSigningError extends Error {\r\n code: TransactionSigningErrorCode;\r\n transactionId?: string;\r\n originalError?: unknown;\r\n}","/**\r\n * Signing status types for type-safe status updates\r\n * Using const pattern instead of enum for better bundling compatibility\r\n */\r\nexport const SigningStatus = {\r\n INITIALIZING: 'initializing',\r\n AUTHENTICATING: 'authenticating',\r\n PREPARING: 'preparing',\r\n SIGNING: 'signing',\r\n SUBMITTING: 'submitting',\r\n COMPLETED: 'completed',\r\n ERROR: 'error',\r\n EXPIRED: 'expired'\r\n} as const;\r\n\r\n/**\r\n * Type for signing status values\r\n */\r\nexport type SigningStatus = typeof SigningStatus[keyof typeof SigningStatus];\r\n\r\n/**\r\n * Status update data interface\r\n */\r\nexport interface StatusUpdateData {\r\n transactionId?: string;\r\n transactionHash?: string;\r\n error?: string;\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * Status update callback interface for tracking transaction progress\r\n * \r\n * @interface StatusCallback\r\n * @property {function} onStatusUpdate - Callback function that receives type-safe status updates\r\n */\r\nexport interface StatusCallback {\r\n onStatusUpdate?: (status: SigningStatus, message: string, data?: StatusUpdateData) => void;\r\n}","import { \r\n adaptSignatureResponse, \r\n assertSigned,\r\n combineSignature\r\n} from '../utils/signature';\r\nimport { WalletMetadata } from '../types/wallet-types';\r\n\r\nimport {\r\n AbstractSigner,\r\n Provider,\r\n Transaction,\r\n TransactionLike,\r\n TransactionRequest,\r\n TypedDataDomain,\r\n TypedDataField,\r\n computeAddress,\r\n getAddress,\r\n keccak256,\r\n resolveAddress,\r\n resolveProperties,\r\n toUtf8Bytes,\r\n} from \"ethers\";\r\nimport { SigningService } from \"./SigningService\";\r\nimport { \r\n AnyTransactionData, \r\n TRANSACTION_FORMATS,\r\n LegacyTransaction, \r\n EIP2930Transaction, \r\n EIP1559Transaction, \r\n EIP712TransactionData\r\n} from \"../types\";\r\n\r\ntype WalletOptions = {\r\n wallet: WalletMetadata;\r\n authToken: string;\r\n signingService: SigningService;\r\n};\r\n\r\nexport class KeyWallet extends AbstractSigner {\r\n private address?: string;\r\n private authToken: string;\r\n private metadata: WalletMetadata;\r\n private signingService: SigningService;\r\n\r\n constructor(private options: WalletOptions, provider?: Provider | null) {\r\n super(provider);\r\n this.metadata = options.wallet;\r\n this.authToken = options.authToken;\r\n this.signingService = options.signingService;\r\n }\r\n\r\n public connect(provider: Provider | null): KeyWallet {\r\n const copy = new KeyWallet(this.options, provider);\r\n copy.address = this.address;\r\n copy.metadata = this.metadata;\r\n copy.authToken = this.authToken;\r\n return copy;\r\n }\r\n\r\n public async getAddress(): Promise<string> {\r\n if (this.address) {\r\n return this.address; // Return cached address if available\r\n }\r\n // Compute and cache the address if not already available\r\n this.address = computeAddress(`0x${this.metadata.signingKey.publicKey}`);\r\n return this.address;\r\n }\r\n\r\n private async signHash(hash: string): Promise<string> {\r\n const rawRes = await this.signingService.signHash(\r\n this.authToken,\r\n this.metadata.id,\r\n hash\r\n );\r\n \r\n const res = adaptSignatureResponse(rawRes);\r\n assertSigned(res);\r\n const combinedSignature = combineSignature(res);\r\n \r\n return combinedSignature;\r\n }\r\n\r\n public async signTransaction(tx: TransactionRequest): Promise<string> {\r\n // Resolve any addresses\r\n const { to, from } = await resolveProperties({\r\n to: tx.to ? resolveAddress(tx.to, this.provider) : undefined,\r\n from: tx.from ? resolveAddress(tx.from, this.provider) : undefined,\r\n });\r\n\r\n if (to != null) {\r\n tx.to = to;\r\n }\r\n if (from != null) {\r\n tx.from = from;\r\n }\r\n\r\n if (tx.from != null) {\r\n if (getAddress(<string>tx.from) !== (await this.getAddress())) {\r\n throw new Error(\"transaction from address mismatch\");\r\n }\r\n delete tx.from;\r\n }\r\n\r\n const btx = Transaction.from(<TransactionLike<string>>tx);\r\n const signature = await this.signHash(btx.unsignedHash);\r\n\r\n // Populate the signature\r\n const signedTx = Transaction.from(btx);\r\n signedTx.signature = signature;\r\n\r\n return signedTx.serialized;\r\n }\r\n\r\n public async signMessage(message: string | Uint8Array): Promise<string> {\r\n if (typeof message === \"string\") {\r\n message = toUtf8Bytes(message);\r\n }\r\n\r\n const hash = keccak256(message);\r\n return this.signHash(hash);\r\n }\r\n\r\n public async signTypedData(\r\n domain: TypedDataDomain,\r\n types: Record<string, TypedDataField[]>,\r\n value: Record<string, any>\r\n ): Promise<string> {\r\n try {\r\n // Use native EIP-712 support with correct structure\r\n const rawRes = await this.signingService.signTypedData(\r\n this.authToken,\r\n this.metadata.id,\r\n domain,\r\n types,\r\n value\r\n );\r\n \r\n const res = adaptSignatureResponse(rawRes);\r\n assertSigned(res);\r\n const combinedSignature = combineSignature(res);\r\n \r\n return combinedSignature;\r\n } catch (error) {\r\n console.error('[KeyWallet] EIP-712 signing failed:', error);\r\n throw new Error(`EIP-712 signing failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n }\r\n\r\n /**\r\n * Signs a PERS transaction based on its format\r\n * Handles different transaction types: Legacy, EIP-2930, EIP-1559, and EIP-712\r\n * @param transactionData - The transaction data from PERS API\r\n * @returns The signature string\r\n */\r\n public async signPersTransaction(transactionData: AnyTransactionData): Promise<string> {\r\n switch (transactionData.format) {\r\n case TRANSACTION_FORMATS.LEGACY: {\r\n const legacyTx = transactionData as LegacyTransaction;\r\n const ethersTransaction: TransactionRequest = {\r\n to: legacyTx.to,\r\n value: legacyTx.value,\r\n data: legacyTx.data,\r\n gasLimit: legacyTx.gas,\r\n gasPrice: legacyTx.gasPrice,\r\n nonce: legacyTx.nonce,\r\n chainId: legacyTx.chainId,\r\n type: 0\r\n };\r\n return await this.signTransaction(ethersTransaction);\r\n }\r\n\r\n case TRANSACTION_FORMATS.EIP_2930: {\r\n const eip2930Tx = transactionData as EIP2930Transaction;\r\n const ethersTransaction: TransactionRequest = {\r\n to: eip2930Tx.to,\r\n value: eip2930Tx.value,\r\n data: eip2930Tx.data,\r\n gasLimit: eip2930Tx.gas,\r\n gasPrice: eip2930Tx.gasPrice,\r\n nonce: eip2930Tx.nonce,\r\n chainId: eip2930Tx.chainId,\r\n accessList: eip2930Tx.accessList,\r\n type: 1\r\n };\r\n return await this.signTransaction(ethersTransaction);\r\n }\r\n\r\n case TRANSACTION_FORMATS.EIP_1559: {\r\n const eip1559Tx = transactionData as EIP1559Transaction;\r\n const ethersTransaction: TransactionRequest = {\r\n to: eip1559Tx.to,\r\n value: eip1559Tx.value,\r\n data: eip1559Tx.data,\r\n gasLimit: eip1559Tx.gas,\r\n maxFeePerGas: eip1559Tx.maxFeePerGas,\r\n maxPriorityFeePerGas: eip1559Tx.maxPriorityFeePerGas,\r\n nonce: eip1559Tx.nonce,\r\n chainId: eip1559Tx.chainId,\r\n type: 2\r\n };\r\n return await this.signTransaction(ethersTransaction);\r\n }\r\n\r\n case TRANSACTION_FORMATS.EIP_712: {\r\n const eip712Data = transactionData as EIP712TransactionData;\r\n const typedData = eip712Data.typedData;\r\n\r\n // Sign the EIP-712 structured data with only Transaction and its dependencies\r\n // Backend expects only the types that are actually used by the primary type\r\n const transactionTypes = {\r\n Transaction: typedData.types.Transaction\r\n };\r\n \r\n // Sign the EIP-712 structured data\r\n return await this.signTypedData(\r\n typedData.domain,\r\n transactionTypes,\r\n typedData.message\r\n );\r\n }\r\n\r\n default:\r\n throw new Error(`Unsupported transaction format: ${(transactionData as any).format}`);\r\n }\r\n }\r\n}\r\n","import { TransactionStatus } from '@explorins/pers-shared/browser';\r\nimport { \r\n CombinedTransactionStatus, \r\n TransactionStatusInfo \r\n} from '../types/transaction-types';\r\nimport { \r\n TransactionSigningErrorCode, \r\n TransactionSigningError \r\n} from '../types/error-types';\r\n\r\n/**\r\n * Handles all error-related operations for transaction signing\r\n */\r\nexport class TransactionErrorHandler {\r\n \r\n /**\r\n * Get user-friendly status messages for transaction statuses\r\n * @param status - The transaction status\r\n * @returns Human-readable message explaining the status\r\n */\r\n static getStatusMessage(status: CombinedTransactionStatus): string {\r\n // Validate input parameter\r\n if (!status || typeof status !== 'string') {\r\n return 'Transaction status is unknown and cannot be processed.';\r\n }\r\n\r\n const normalizedStatus = status.toLowerCase();\r\n \r\n switch (normalizedStatus) {\r\n // PERS TransactionStatus enum values\r\n case TransactionStatus.SUCCEEDED.toLowerCase():\r\n return 'This transaction has already been completed successfully.';\r\n case TransactionStatus.PROCESSING.toLowerCase():\r\n case TransactionStatus.BROADCASTED.toLowerCase():\r\n return 'This transaction is currently being processed on the blockchain.';\r\n case TransactionStatus.FAILED.toLowerCase():\r\n return 'This transaction has failed and cannot be processed.';\r\n case TransactionStatus.PENDING_SIGNATURE.toLowerCase():\r\n case TransactionStatus.CREATED.toLowerCase():\r\n return 'This transaction is ready to be signed.';\r\n \r\n // Additional status values\r\n case TransactionStatus.CANCELLED.toLowerCase():\r\n return 'This transaction has been cancelled and cannot be signed.';\r\n case TransactionStatus.EXPIRED.toLowerCase():\r\n return 'This transaction has expired and can no longer be signed.';\r\n \r\n default:\r\n return `This transaction is in \"${status}\" state and cannot be signed at this time.`;\r\n }\r\n }\r\n\r\n /**\r\n * Safely convert string status to TransactionStatus enum\r\n * @param statusString - The status string to convert\r\n * @returns A valid TransactionStatus enum value\r\n */\r\n static parseTransactionStatus(statusString: string): CombinedTransactionStatus {\r\n // Normalize the input string to uppercase to match enum values\r\n const normalizedStatus = statusString.trim().toUpperCase();\r\n \r\n // Check if the normalized status exists in the TransactionStatus enum\r\n const enumValues = Object.values(TransactionStatus) as string[];\r\n const matchingStatus = enumValues.find(value => value.toUpperCase() === normalizedStatus);\r\n \r\n // Return the matching status or a fallback\r\n return (matchingStatus as CombinedTransactionStatus) || TransactionStatus.FAILED;\r\n }\r\n\r\n /**\r\n * Create a structured transaction signing error\r\n * @param code - Error code\r\n * @param message - Error message\r\n * @param transactionId - Optional transaction ID\r\n * @param originalError - Original error that caused this\r\n * @returns Structured error object\r\n */\r\n static createError(\r\n code: TransactionSigningErrorCode,\r\n message: string,\r\n transactionId?: string,\r\n originalError?: unknown\r\n ): TransactionSigningError {\r\n const error = new Error(message) as TransactionSigningError;\r\n error.code = code;\r\n error.transactionId = transactionId;\r\n error.originalError = originalError;\r\n return error;\r\n }\r\n\r\n /**\r\n * Create transaction status info object for UI display\r\n * @param transactionId - The transaction ID\r\n * @param status - The transaction status\r\n * @param customMessage - Optional custom message, otherwise uses default status message\r\n * @returns TransactionStatusInfo object\r\n */\r\n static createStatusInfo(\r\n transactionId: string,\r\n status: CombinedTransactionStatus,\r\n customMessage?: string\r\n ): TransactionStatusInfo {\r\n return {\r\n transactionId,\r\n transactionStatus: status,\r\n message: customMessage || this.getStatusMessage(status)\r\n };\r\n }\r\n\r\n /**\r\n * Handle TRANSACTION_NOT_PENDING error from PERS API\r\n * Consolidates the duplicate error handling logic\r\n * @param error - The error object from PERS API\r\n * @param transactionId - The transaction ID\r\n * @returns Never (always throws)\r\n * @throws Object with shouldShowStatus and statusInfo\r\n */\r\n static handleTransactionNotPendingError(\r\n error: { \r\n status?: number; \r\n error?: { code?: string; message?: string; /* developerMessage?: string */ }; \r\n code?: string; \r\n message?: string; \r\n // developerMessage?: string \r\n },\r\n transactionId: string\r\n ): never {\r\n // Extract error data - could be in error.error or directly in error\r\n const errorData = error.error || error;\r\n \r\n // Default to FAILED since we can't determine exact status without parsing messages\r\n // The backend message will be displayed to the user\r\n const actualStatus = TransactionStatus.FAILED;\r\n \r\n // Create status info for UI\r\n const statusInfo = this.createStatusInfo(\r\n transactionId,\r\n actualStatus,\r\n errorData.message || this.getStatusMessage(actualStatus)\r\n );\r\n \r\n // Return status info instead of storing in localStorage\r\n // Throw special error that UI can handle\r\n throw { shouldShowStatus: true, statusInfo };\r\n }\r\n\r\n /**\r\n * Process PERS API errors and handle TRANSACTION_NOT_PENDING cases\r\n * @param err - The caught error from PERS API\r\n * @param transactionId - The transaction ID\r\n * @throws Either the original error or a structured status error\r\n */\r\n static processPersApiError(err: unknown, transactionId: string): never {\r\n // Handle structured PERS error response\r\n const error = err as { \r\n status?: number; \r\n error?: { code?: string; message?: string; /* developerMessage?: string */ }; \r\n code?: string; \r\n message?: string; \r\n // developerMessage?: string \r\n };\r\n \r\n // Check for TRANSACTION_NOT_PENDING error in different possible structures\r\n const isNotPendingError = \r\n (error.status && error.error && error.error.code === 'TRANSACTION_NOT_PENDING') ||\r\n (error.code === 'TRANSACTION_NOT_PENDING') ||\r\n (error.error && error.error.code === 'TRANSACTION_NOT_PENDING');\r\n \r\n if (isNotPendingError) {\r\n this.handleTransactionNotPendingError(error, transactionId);\r\n }\r\n \r\n // Handle specific HTTP status codes with user-friendly messages\r\n if (error.status) {\r\n switch (error.status) {\r\n case 404:\r\n throw this.createError(\r\n TransactionSigningErrorCode.TRANSACTION_NOT_FOUND,\r\n `Transaction ${transactionId} not found. It may have expired or been processed already.`,\r\n transactionId,\r\n err\r\n );\r\n case 500:\r\n throw this.createError(\r\n TransactionSigningErrorCode.SERVER_ERROR,\r\n `Server error while processing transaction ${transactionId}. The transaction may no longer be available or may have already been signed.`,\r\n transactionId,\r\n err\r\n );\r\n case 401:\r\n case 403:\r\n throw this.createError(\r\n TransactionSigningErrorCode.AUTH_FAILED,\r\n 'Authentication failed. Please refresh the page and try again.',\r\n transactionId,\r\n err\r\n );\r\n }\r\n }\r\n \r\n // Re-throw other errors as-is\r\n throw err;\r\n }\r\n}","import { TransactionSigningErrorCode } from '../types/error-types';\r\nimport { \r\n SigningAuthTokens, \r\n TransactionSigningParams \r\n} from '../types/transaction-types';\r\nimport { TransactionErrorHandler } from './TransactionErrorHandler';\r\n\r\n/**\r\n * Handles all validation operations for transaction signing\r\n */\r\nexport class TransactionValidator {\r\n \r\n /**\r\n * Validate transaction signing parameters\r\n * @param params - Transaction signing parameters to validate\r\n * @throws TransactionSigningError if validation fails\r\n */\r\n static validateSigningParams(params: TransactionSigningParams): void {\r\n if (!params) {\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.INVALID_TOKENS,\r\n 'Transaction signing parameters are required'\r\n );\r\n }\r\n\r\n if (!params.transactionId || typeof params.transactionId !== 'string') {\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.INVALID_TOKENS,\r\n 'Valid transaction ID is required'\r\n );\r\n }\r\n\r\n if (!params.authTokens) {\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.INVALID_TOKENS,\r\n 'Authentication tokens are required',\r\n params.transactionId\r\n );\r\n }\r\n\r\n if (!params.authTokens.signerAuthToken || !params.authTokens.persAccessToken) {\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.INVALID_TOKENS,\r\n 'Both signer and PERS authentication tokens are required',\r\n params.transactionId\r\n );\r\n }\r\n\r\n if (!params.ethersProviderUrl || typeof params.ethersProviderUrl !== 'string') {\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.INVALID_TOKENS,\r\n 'Ethers provider URL is required',\r\n params.transactionId\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Validate authentication tokens passed as parameters\r\n * @param authTokens - The authentication tokens to validate\r\n * @returns true if valid, throws error if invalid\r\n */\r\n static validateAuthTokens(authTokens: SigningAuthTokens): boolean {\r\n if (!authTokens.persAccessToken || !authTokens.signerAuthToken) {\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.INVALID_TOKENS,\r\n 'Both PERS access token and signer auth token are required'\r\n );\r\n }\r\n \r\n return true;\r\n }\r\n}","/**\r\n * Extended window interface for WebAuthn flags\r\n */\r\ninterface ExtendedWindow extends Window {\r\n // landingAuthenticationInProgress?: boolean;\r\n webAuthnOperationInProgress?: boolean;\r\n}\r\n\r\n/**\r\n * Utility class for coordinating WebAuthn operations to prevent conflicts\r\n * Manages global state flags to ensure only one WebAuthn operation runs at a time\r\n */\r\nexport class WebAuthnCoordinator {\r\n\r\n /**\r\n * Check if a WebAuthn operation is currently in progress\r\n * @returns True if an operation is in progress, false otherwise\r\n */\r\n static checkConcurrentOperations(): boolean {\r\n if (typeof window !== 'undefined') {\r\n return Boolean((window as ExtendedWindow).webAuthnOperationInProgress);\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Set the WebAuthn operation in progress flag\r\n * @param inProgress - Whether an operation is in progress\r\n */\r\n static setOperationInProgress(inProgress: boolean): void {\r\n if (typeof window !== 'undefined') {\r\n (window as ExtendedWindow).webAuthnOperationInProgress = inProgress;\r\n }\r\n }\r\n}","import { JsonRpcProvider } from 'ethers';\r\nimport { CounterfactualWalletTransactionResponse, TransactionStatus } from '@explorins/pers-shared/browser';\r\nimport { LegacyTransaction, TransactionRequestResponseDTO } from '../types/pers-types';\r\nimport { WalletService } from '../core/WalletService';\r\nimport { PersService } from '../core/PersService';\r\nimport { SigningService } from '../core/SigningService';\r\nimport { KeyWallet } from '../core/KeyWallet';\r\nimport { GetWalletResponse } from '../types/wallet-types';\r\nimport { TransactionErrorHandler } from './TransactionErrorHandler';\r\nimport { TransactionValidator } from './TransactionValidator';\r\nimport { WebAuthnCoordinator } from './WebAuthnCoordinator';\r\nimport type { WebAuthnProvider } from '../platform/WebAuthnProvider.types';\r\nimport { TransactionSigningErrorCode } from '../types/error-types';\r\nimport { \r\n CombinedTransactionStatus, \r\n SIGNABLE_STATUSES, \r\n TransactionStatusInfo, \r\n TransactionSigningResult, \r\n SigningAuthTokens, \r\n TransactionSigningParams \r\n} from '../types/transaction-types';\r\nimport { ExtendedPersSignerConfig } from '../sdk/PersSignerSDK';\r\nimport { Wallet } from '../types/signer-api-types';\r\nimport { DEFAULT_FALLBACK_PROVIDER } from '../config/constants';\r\n\r\n/**\r\n * Service for orchestrating transaction signing operations\r\n * Handles the complete flow from transaction preparation to submission\r\n * Uses constructor-based dependency injection for WebAuthn provider\r\n */\r\nexport class TransactionSigningService {\r\n private webAuthnProvider: WebAuthnProvider;\r\n\r\n constructor(config: ExtendedPersSignerConfig) {\r\n this.webAuthnProvider = config.webAuthnProvider;\r\n }\r\n\r\n /**\r\n * Prepare transaction for signing - fetch and validate\r\n */\r\n private async prepareTransaction(\r\n transactionId: string, \r\n authTokens: SigningAuthTokens,\r\n tenantId: string\r\n ): Promise<{ preparedTransaction: TransactionRequestResponseDTO; updatedTokens: SigningAuthTokens }> {\r\n let preparedTransaction: TransactionRequestResponseDTO;\r\n try {\r\n preparedTransaction = await PersService.fetchPreparedTransaction(transactionId, authTokens.persAccessToken, tenantId);\r\n } catch (err: unknown) {\r\n // Use TransactionErrorHandler to process PERS API errors\r\n // This function never returns (throws an error), so execution won't continue past this line\r\n TransactionErrorHandler.processPersApiError(err, transactionId);\r\n // The line below will never be reached due to the throw above, but TypeScript needs it for type safety\r\n throw err;\r\n }\r\n // Check transaction status - only process signable transactions\r\n const transactionStatus = preparedTransaction.transactionStatus as CombinedTransactionStatus;\r\n \r\n // Validate transaction status is signable\r\n const isSignable = SIGNABLE_STATUSES.some(status => status === transactionStatus);\r\n if (!isSignable) {\r\n // Create status info for UI using TransactionErrorHandler\r\n const statusInfo = TransactionErrorHandler.createStatusInfo(transactionId, transactionStatus);\r\n \r\n throw { shouldShowStatus: true, statusInfo };\r\n }\r\n\r\n // Authenticate with PERS using backend signer token to set up signing account\r\n let updatedPersAccessToken = authTokens.persAccessToken;\r\n try {\r\n const persSignerAuth = await PersService.authenticateUser(authTokens.signerAuthToken, tenantId);\r\n \r\n // Update PERS access token with the new one that has signing account linked\r\n const newPersAccessToken = persSignerAuth.accessToken;\r\n if (newPersAccessToken) {\r\n updatedPersAccessToken = newPersAccessToken;\r\n }\r\n } catch (persSignerError: unknown) {\r\n const errorMessage = persSignerError instanceof Error ? persSignerError.message : String(persSignerError);\r\n console.error('❌ Failed to authenticate with PERS using signer token:', persSignerError);\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.PERS_AUTH_FAILED,\r\n `Failed to set up signing account: ${errorMessage}`,\r\n transactionId,\r\n persSignerError\r\n );\r\n }\r\n\r\n // If transaction is 'created' status but doesn't have signingData, fetch again with wallet-enabled token\r\n if (transactionStatus === TransactionStatus.CREATED && !PersService.isTransactionReadyForSigning(preparedTransaction)) {\r\n preparedTransaction = await PersService.fetchPreparedTransaction(transactionId, updatedPersAccessToken, tenantId);\r\n }\r\n \r\n if (!PersService.isTransactionReadyForSigning(preparedTransaction)) {\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.TRANSACTION_NOT_READY,\r\n 'Transaction is not ready for signing',\r\n transactionId\r\n );\r\n }\r\n\r\n return { \r\n preparedTransaction, \r\n updatedTokens: { ...authTokens, persAccessToken: updatedPersAccessToken }\r\n };\r\n }\r\n\r\n /**\r\n * Validate and prepare wallet for signing\r\n */\r\n private async prepareWallet(\r\n authTokens: SigningAuthTokens, \r\n ethersProviderUrl: string\r\n ): Promise<KeyWallet> {\r\n // Wallet validation will be handled through API responses - no localStorage needed\r\n \r\n let walletListResult: Wallet[];\r\n try {\r\n // Use new WalletService API with signer token\r\n walletListResult = await WalletService.listWallets(authTokens.signerAuthToken);\r\n } catch (error) {\r\n console.error('[TransactionSigningService] Wallet list API failed:', error);\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.WALLET_NOT_AVAILABLE,\r\n 'Failed to retrieve wallet information. Please refresh the page and try again.',\r\n undefined,\r\n error\r\n );\r\n }\r\n \r\n const wallets = walletListResult || [];\r\n \r\n if (!wallets?.length) {\r\n console.error('[TransactionSigningService] No wallets found in response:', walletListResult);\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.WALLET_NOT_AVAILABLE,\r\n 'No wallet found for transaction signing. Please refresh the page and complete account setup.'\r\n );\r\n }\r\n\r\n // Create SigningService with injected WebAuthn provider\r\n const signingService = new SigningService(this.webAuthnProvider);\r\n\r\n // Create wallet instance with provider fallback logic\r\n let provider: JsonRpcProvider;\r\n try {\r\n // Try primary provider first\r\n //console.info(`[TransactionSigningService] Attempting to connect to primary provider: ${ethersProviderUrl}`);\r\n provider = new JsonRpcProvider(ethersProviderUrl);\r\n // Test the connection with a simple call\r\n await provider.getNetwork();\r\n //console.info(`[TransactionSigningService] Successfully connected to primary provider`);\r\n } catch (primaryError) {\r\n console.warn(`[TransactionSigningService] Primary provider failed, falling back to: ${DEFAULT_FALLBACK_PROVIDER}`, primaryError);\r\n try {\r\n provider = new JsonRpcProvider(DEFAULT_FALLBACK_PROVIDER);\r\n // Test the fallback connection\r\n await provider.getNetwork();\r\n //console.info(`[TransactionSigningService] Successfully connected to fallback provider`);\r\n } catch (fallbackError) {\r\n console.error(`[TransactionSigningService] Both primary and fallback providers failed`, { primaryError, fallbackError });\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.WALLET_NOT_AVAILABLE,\r\n 'Unable to connect to Ethereum network. Please check your internet connection and try again.',\r\n undefined,\r\n fallbackError\r\n );\r\n }\r\n }\r\n\r\n const wallet = new KeyWallet({\r\n authToken: authTokens.signerAuthToken,\r\n wallet: wallets[0] as unknown as GetWalletResponse & { boundToEvmNetwork: boolean },\r\n signingService: signingService,\r\n }).connect(provider);\r\n\r\n return wallet;\r\n }\r\n\r\n /**\r\n * Execute the transaction signing with WebAuthn coordination\r\n */\r\n private async executeTransactionSigning(\r\n wallet: KeyWallet,\r\n // preparedTransaction: TransactionRequestResponseDTO,\r\n signingData: CounterfactualWalletTransactionResponse | LegacyTransaction\r\n ): Promise<string> {\r\n // Check for concurrent WebAuthn operations\r\n if (WebAuthnCoordinator.checkConcurrentOperations()) {\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.WEBAUTHN_OPERATION_IN_PROGRESS,\r\n 'Another WebAuthn operation is in progress. Please wait and try again.'\r\n );\r\n }\r\n \r\n // Set WebAuthn operation flag for transaction signing\r\n WebAuthnCoordinator.setOperationInProgress(true);\r\n \r\n try {\r\n // const signingData = PersService.getTransactionDataForSigning(preparedTransaction);\r\n const signature = await wallet.signPersTransaction(signingData);\r\n return signature;\r\n } catch (signingError: unknown) {\r\n // Handle WebAuthn-specific errors\r\n const errorMessage = signingError instanceof Error ? signingError.message : String(signingError);\r\n if (errorMessage?.includes('NotAllowedError') || \r\n errorMessage?.includes('timed out') || \r\n errorMessage?.includes('not allowed')) {\r\n throw TransactionErrorHandler.createError(\r\n TransactionSigningErrorCode.SIGNING_CANCELLED,\r\n 'Transaction signing was cancelled or timed out. Please try again and complete the biometric authentication when prompted.',\r\n undefined,\r\n signingError\r\n );\r\n }\r\n throw signingError;\r\n } finally {\r\n // Clear WebAuthn operation flag\r\n WebAuthnCoordinator.setOperationInProgress(false);\r\n }\r\n }\r\n\r\n async getPersSigningData(data: {\r\n transactionId: string,\r\n authTokens: SigningAuthTokens,\r\n tenantId: string\r\n }){\r\n // Step 1: Prepare transaction for signing\r\n const { preparedTransaction } = await this.prepareTransaction(data.transactionId, data.authTokens, data.tenantId);\r\n // const signingData = PersService.getTransactionDataForSigning(preparedTransaction);\r\n const signingData = PersService.getTransactionDataForSigning(preparedTransaction); \r\n return signingData;\r\n }\r\n\r\n /**\r\n * Main transaction signing orchestration method\r\n * Handles the complete flow from preparation to submission\r\n * @param params - Transaction signing parameters\r\n * @returns Promise resolving to transaction signing result\r\n * @throws TransactionSigningError for validation and operation failures\r\n */\r\n async signTransaction(\r\n params: TransactionSigningParams,\r\n signingData: CounterfactualWalletTransactionResponse | LegacyTransaction\r\n\r\n ): Promise<TransactionSigningResult> {\r\n // Validate input parameters first using TransactionValidator\r\n TransactionValidator.validateSigningParams(params);\r\n \r\n const { transactionId, authTokens, ethersProviderUrl } = params;\r\n \r\n // console.info(`[TransactionSigningService] Starting signature process for ${transactionId}`);\r\n \r\n try {\r\n \r\n \r\n // Step 2: Prepare wallet for signing\r\n const wallet = await this.prepareWallet(authTokens, ethersProviderUrl);\r\n\r\n // Step 3: Execute transaction signing\r\n const signature = await this.executeTransactionSigning(wallet, signingData);\r\n \r\n // console.info(`[TransactionSigningService] Completed signing successfully: ${transactionId}`);\r\n \r\n return {\r\n success: true,\r\n transactionId,\r\n signingData,\r\n // transactionHash: submitResult.transaction?.transactionHash ?? undefined,\r\n signature,\r\n };\r\n \r\n } catch (error: unknown) {\r\n console.error(`[TransactionSigningService] Signing failed for ${transactionId}:`, error);\r\n \r\n // Handle special cases\r\n const structuredError = error as { shouldShowStatus?: boolean; statusInfo?: TransactionStatusInfo };\r\n if (structuredError.shouldShowStatus && structuredError.statusInfo) {\r\n return {\r\n success: false,\r\n transactionId,\r\n shouldShowStatus: true,\r\n statusInfo: structuredError.statusInfo,\r\n error: structuredError.statusInfo.message\r\n };\r\n }\r\n \r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n return {\r\n success: false,\r\n transactionId,\r\n error: errorMessage\r\n };\r\n }\r\n }\r\n}","\r\n/**\r\n * Handles transaction submission, success flows, and redirect logic\r\n */\r\nexport class TransactionSubmissionHandler {\r\n \r\n /**\r\n * Create redirect URL with transaction parameters\r\n * @param returnUrl - Base return URL\r\n * @param transactionHash - Transaction hash to include\r\n * @param metadata - Optional metadata to include as parameters\r\n * @returns Promise resolving to the complete redirect URL\r\n */\r\n static async createRedirectUrl(\r\n returnUrl: string,\r\n transactionHash: string,\r\n ): Promise<string> {\r\n const additionalParams: Record<string, string> = {\r\n txHash: transactionHash,\r\n success: 'true'\r\n };\r\n\r\n // Build URL with required params\r\n const paramKeys = ['transactionId', 'returnUrl', 'jwt', 'token'];\r\n const url = new URL(returnUrl, window.location.origin);\r\n // Add required params if present in additionalParams\r\n paramKeys.forEach(key => {\r\n if (additionalParams[key]) {\r\n url.searchParams.set(key, additionalParams[key]);\r\n }\r\n });\r\n // Add all other params\r\n Object.entries(additionalParams).forEach(([key, value]) => {\r\n if (!paramKeys.includes(key)) {\r\n url.searchParams.set(key, value);\r\n }\r\n });\r\n return url.toString();\r\n }\r\n}","/**\r\n * Platform-agnostic configuration provider\r\n * Abstracts environment variable access for cross-platform compatibility\r\n */\r\n\r\nexport interface PlatformConfig {\r\n apiUrl: string;\r\n appId?: string;\r\n relyingParty: {\r\n id: string;\r\n name: string;\r\n origin?: string;\r\n };\r\n}\r\n\r\nexport interface ConfigProvider {\r\n getServiceConfig(): PlatformConfig;\r\n}\r\n\r\n/**\r\n * Web platform configuration provider\r\n * Uses provided configuration instead of environment variables\r\n */\r\nexport class WebConfigProvider implements ConfigProvider {\r\n constructor(private config: PlatformConfig) {}\r\n\r\n getServiceConfig(): PlatformConfig {\r\n return this.config;\r\n }\r\n}\r\n\r\n/**\r\n * React Native configuration provider\r\n * Uses process.env or custom config for React Native environments\r\n */\r\nexport class ReactNativeConfigProvider implements ConfigProvider {\r\n constructor(private config: PlatformConfig) {}\r\n\r\n getServiceConfig(): PlatformConfig {\r\n return this.config;\r\n }\r\n}\r\n\r\n/**\r\n * Static configuration provider for testing or custom setups\r\n */\r\nexport class StaticConfigProvider implements ConfigProvider {\r\n constructor(private config: PlatformConfig) {}\r\n\r\n getServiceConfig(): PlatformConfig {\r\n return this.config;\r\n }\r\n}\r\n\r\n/**\r\n * Global config provider instance\r\n */\r\nlet globalConfigProvider: ConfigProvider | null = null;\r\n\r\n/**\r\n * Set the global configuration provider\r\n */\r\nexport function setConfigProvider(provider: ConfigProvider): void {\r\n globalConfigProvider = provider;\r\n}\r\n\r\n/**\r\n * Get the current configuration provider\r\n * Requires explicit initialization with setConfigProvider\r\n */\r\nexport function getConfigProvider(): ConfigProvider {\r\n if (!globalConfigProvider) {\r\n throw new Error('Configuration provider not initialized. Call setConfigProvider() first with your configuration.');\r\n }\r\n return globalConfigProvider;\r\n}\r\n\r\n/**\r\n * Get the service configuration\r\n */\r\nexport function getServiceConfig(): PlatformConfig {\r\n return getConfigProvider().getServiceConfig();\r\n}","import { SIGNER_CONFIG } from '../config/constants';\r\nimport type { WebAuthnConfig } from './WebAuthnProvider.types';\r\n\r\n/**\r\n * Get the WebAuthn configuration based on the current environment.\r\n * This logic is shared between browser and React Native implementations\r\n * to ensure consistent behavior while respecting platform differences.\r\n */\r\nexport function getWebAuthnConfig(): WebAuthnConfig {\r\n // Check if running in a browser environment with window.location available\r\n // We use a safe check that won't crash in React Native\r\n const isBrowser = typeof window !== 'undefined' && !!window.location && !!window.location.hostname;\r\n\r\n return {\r\n relyingParty: {\r\n // In browser, prefer the actual hostname to avoid RP ID mismatch errors\r\n // In React Native, use the configured default RP ID\r\n id: isBrowser ? window.location.hostname : SIGNER_CONFIG.DEFAULT_RELYING_PARTY_ID,\r\n \r\n name: SIGNER_CONFIG.DEFAULT_RELYING_PARTY_NAME,\r\n \r\n // In browser, use the actual origin\r\n // In React Native, fallback to the default RP ID (or a configured origin if added later)\r\n origin: isBrowser ? window.location.origin : SIGNER_CONFIG.DEFAULT_RELYING_PARTY_ID,\r\n }\r\n };\r\n}\r\n","/**\r\n * Base64URL encoding/decoding utilities\r\n * Used for WebAuthn credential ID and challenge handling\r\n */\r\n\r\n/**\r\n * Converts a Base64URL string to an ArrayBuffer\r\n * @param base64 - The Base64URL string\r\n * @returns The decoded ArrayBuffer\r\n */\r\nexport function base64UrlToBuffer(base64: string): ArrayBuffer {\r\n if (!base64 || typeof base64 !== 'string') {\r\n throw new Error(`base64UrlToBuffer expected non-empty string, got ${typeof base64}: ${base64}`);\r\n }\r\n const padding = '='.repeat((4 - base64.length % 4) % 4);\r\n const base64Standard = (base64 + padding)\r\n .replace(/\\-/g, '+')\r\n .replace(/_/g, '/');\r\n const rawData = atob(base64Standard);\r\n const outputArray = new Uint8Array(rawData.length);\r\n for (let i = 0; i < rawData.length; ++i) {\r\n outputArray[i] = rawData.charCodeAt(i);\r\n }\r\n return outputArray.buffer;\r\n}\r\n\r\n/**\r\n * Converts an ArrayBuffer to a Base64URL string\r\n * @param buffer - The ArrayBuffer to encode\r\n * @returns The Base64URL string\r\n */\r\nexport function bufferToBase64Url(buffer: ArrayBuffer): string {\r\n const bytes = new Uint8Array(buffer);\r\n let binary = '';\r\n for (let i = 0; i < bytes.byteLength; i++) {\r\n binary += String.fromCharCode(bytes[i]);\r\n }\r\n return btoa(binary)\r\n .replace(/\\+/g, '-')\r\n .replace(/\\//g, '_')\r\n .replace(/=+$/, '');\r\n}\r\n\r\n/**\r\n * Ensures a string is Base64URL encoded (replaces +/ with -_)\r\n */\r\nexport function toBase64Url(str: string): string {\r\n return str\r\n .replace(/\\+/g, '-')\r\n .replace(/\\//g, '_')\r\n .replace(/=+$/, '');\r\n}\r\n","/**\r\n * Browser-specific WebAuthn provider using native browser APIs\r\n * Fully agnostic implementation without external SDK dependencies\r\n */\r\n\r\nimport { WEBAUTHN_CONFIG } from '../config/constants';\r\nimport { getWebAuthnConfig } from './WebAuthnConfig';\r\nimport { base64UrlToBuffer, bufferToBase64Url } from '../utils/encoding';\r\nimport type { \r\n WebAuthnProvider, \r\n WebAuthnConfig, \r\n WebAuthnCreateChallenge, \r\n WebAuthnSignChallenge,\r\n WebAuthnAttestation,\r\n WebAuthnAssertion\r\n} from './WebAuthnProvider.types';\r\n\r\nclass BrowserWebAuthnProvider implements WebAuthnProvider {\r\n private config: WebAuthnConfig;\r\n\r\n constructor(config: WebAuthnConfig) {\r\n this.config = config;\r\n }\r\n\r\n async create(challenge: WebAuthnCreateChallenge): Promise<WebAuthnAttestation> {\r\n try {\r\n if (!challenge?.challenge || !challenge?.user?.id) {\r\n throw new Error('WebAuthn create missing required challenge fields');\r\n }\r\n\r\n // Ensure user.id is within the 64-byte limit required by WebAuthn spec\r\n let userIdBuffer = base64UrlToBuffer(challenge.user.id);\r\n if (userIdBuffer.byteLength > 64) {\r\n console.warn('WebAuthn user.id exceeds 64 bytes, truncating to avoid 1Password errors...');\r\n userIdBuffer = userIdBuffer.slice(0, 64);\r\n }\r\n\r\n // 1. Prepare options for navigator.credentials.create\r\n // We construct authenticatorSelection manually to ensure no conflicting legacy properties are present\r\n const authenticatorSelection: AuthenticatorSelectionCriteria = {\r\n residentKey: WEBAUTHN_CONFIG.RESIDENT_KEY, // Force Passkey (discoverable credential)\r\n userVerification: challenge.authenticatorSelection?.userVerification || WEBAUTHN_CONFIG.USER_VERIFICATION,\r\n };\r\n\r\n const publicKey: PublicKeyCredentialCreationOptions = {\r\n challenge: base64UrlToBuffer(challenge.challenge),\r\n rp: {\r\n id: challenge.rp?.id || this.config.relyingParty.id,\r\n name: challenge.rp?.name || this.config.relyingParty.name,\r\n },\r\n user: {\r\n id: userIdBuffer,\r\n name: challenge.user.name,\r\n displayName: challenge.user.displayName,\r\n },\r\n pubKeyCredParams: challenge.pubKeyCredParams,\r\n authenticatorSelection,\r\n attestation: 'none',\r\n timeout: challenge.timeout || WEBAUTHN_CONFIG.TIMEOUT,\r\n excludeCredentials: challenge.excludeCredentials?.map((cred) => ({\r\n id: base64UrlToBuffer(cred.id),\r\n type: 'public-key',\r\n transports: cred.transports,\r\n })),\r\n };\r\n\r\n // 2. Call the browser's native WebAuthn API\r\n const credential = await navigator.credentials.create({ publicKey }) as PublicKeyCredential;\r\n \r\n if (!credential) throw new Error('WebAuthn registration request returned null');\r\n\r\n // 3. Convert response to agnostic format\r\n const response = credential.response as AuthenticatorAttestationResponse;\r\n\r\n return {\r\n id: credential.id,\r\n clientDataJSON: bufferToBase64Url(response.clientDataJSON),\r\n attestationObject: bufferToBase64Url(response.attestationObject),\r\n };\r\n\r\n } catch (error: any) {\r\n console.error('Failed to create credential with WebAuthn (Native):', error);\r\n throw new Error(`WebAuthn registration failed: ${error.message || 'Unknown error'}`);\r\n }\r\n }\r\n\r\n async sign(challenge: WebAuthnSignChallenge): Promise<WebAuthnAssertion> {\r\n try {\r\n // 1. Prepare options for navigator.credentials.get\r\n const publicKey: PublicKeyCredentialRequestOptions = {\r\n challenge: base64UrlToBuffer(challenge.challenge),\r\n rpId: challenge.rpId || this.config.relyingParty.id,\r\n userVerification: challenge.userVerification || WEBAUTHN_CONFIG.USER_VERIFICATION, \r\n timeout: WEBAUTHN_CONFIG.TIMEOUT,\r\n allowCredentials: challenge.allowCredentials?.webauthn?.map((cred) => ({\r\n id: base64UrlToBuffer(cred.id),\r\n type: 'public-key',\r\n // Omit transports to allow 1Password/cross-platform authenticators to work\r\n // even if the credential was originally registered with a specific transport\r\n // transports: cred.transports,\r\n }))\r\n };\r\n\r\n // 2. Call the browser's native WebAuthn API\r\n const credential = await navigator.credentials.get({ publicKey }) as PublicKeyCredential;\r\n \r\n if (!credential) throw new Error('WebAuthn request returned null');\r\n\r\n // 3. Convert response to agnostic format\r\n const response = credential.response as AuthenticatorAssertionResponse;\r\n\r\n return {\r\n kind: 'Fido2',\r\n credentialAssertion: {\r\n credId: credential.id,\r\n clientData: bufferToBase64Url(response.clientDataJSON),\r\n authenticatorData: bufferToBase64Url(response.authenticatorData),\r\n signature: bufferToBase64Url(response.signature),\r\n userHandle: response.userHandle ? bufferToBase64Url(response.userHandle) : undefined\r\n }\r\n };\r\n\r\n } catch (error: any) {\r\n console.error('Failed to sign with WebAuthn (Native):', error);\r\n if (error.name === 'NotAllowedError') {\r\n throw new Error(`Passkey request denied. Ensure the passkey was created on ${this.config.relyingParty.id}.`);\r\n }\r\n throw error;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Get WebAuthn provider for browser environments\r\n */\r\nexport async function getBrowserWebAuthnProvider(): Promise<WebAuthnProvider> {\r\n const config = getWebAuthnConfig();\r\n \r\n return new BrowserWebAuthnProvider(config)\r\n}","/**\r\n * React Native-specific WebAuthn provider using react-native-passkey\r\n * Fully agnostic implementation without external SDK dependencies\r\n * Falls back to browser implementation for React Native Web (Expo Web)\r\n */\r\n\r\nimport { WEBAUTHN_CONFIG } from '../config/constants';\r\nimport { getWebAuthnConfig } from './WebAuthnConfig';\r\nimport { toBase64Url } from '../utils/encoding';\r\nimport type { \r\n WebAuthnProvider, \r\n WebAuthnConfig, \r\n WebAuthnCreateChallenge, \r\n WebAuthnSignChallenge,\r\n WebAuthnAttestation,\r\n WebAuthnAssertion\r\n} from './WebAuthnProvider.types';\r\n\r\nclass ReactNativeWebAuthnProvider implements WebAuthnProvider {\r\n private config: WebAuthnConfig;\r\n private passkeyLibrary: any = null;\r\n\r\n constructor(config: WebAuthnConfig) {\r\n this.config = config;\r\n }\r\n\r\n private async getPasskeyLibrary() {\r\n if (this.passkeyLibrary) {\r\n return this.passkeyLibrary;\r\n }\r\n\r\n try {\r\n // Dynamic import to avoid hard dependency\r\n // @ts-ignore - Optional dependency\r\n const { Passkey } = await import('react-native-passkey');\r\n this.passkeyLibrary = Passkey;\r\n return Passkey;\r\n } catch (error: any) {\r\n // Check if this is React Native Web where react-native-passkey doesn't work\r\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\r\n throw new Error('WEB_FALLBACK_NEEDED');\r\n }\r\n \r\n throw new Error(\r\n `Native passkey dependency missing. Please install 'react-native-passkey' in your app:\\n\\n` +\r\n `npm install react-native-passkey\\n` +\r\n `npx pod-install ios\\n\\n` +\r\n `For Expo projects, you may need to use development builds.\\n` +\r\n `See setup guide: https://github.com/f-23/react-native-passkey#installation`\r\n );\r\n }\r\n }\r\n\r\n private async handleWebFallback(operation: 'create' | 'sign', challenge: any): Promise<any> {\r\n try {\r\n // Import and use browser WebAuthn provider\r\n const { getBrowserWebAuthnProvider } = await import('./WebAuthnProvider.browser');\r\n const browserProvider = await getBrowserWebAuthnProvider();\r\n return await browserProvider[operation](challenge);\r\n } catch (browserError: any) {\r\n console.error(`Browser WebAuthn fallback also failed for ${operation}:`, browserError);\r\n throw new Error(`WebAuthn ${operation} failed: React Native Web fallback failed (${browserError.message}).`);\r\n }\r\n }\r\n\r\n async create(challenge: WebAuthnCreateChallenge): Promise<WebAuthnAttestation> {\r\n try {\r\n const Passkey = await this.getPasskeyLibrary();\r\n\r\n // Prepare request for react-native-passkey\r\n // Note: react-native-passkey expects Base64URL strings, not Buffers\r\n \r\n // Ensure user.id is within the 64-byte limit required by WebAuthn spec\r\n // Note: challenge.user.id is already a string here, but we need to check its decoded length\r\n // However, for simplicity in RN, we can just trust the server or do a basic length check on the string\r\n // If it's a very long string, it might be an issue.\r\n // But let's focus on aligning the authenticatorSelection first.\r\n\r\n const authenticatorSelection = {\r\n residentKey: WEBAUTHN_CONFIG.RESIDENT_KEY, // Force Passkey (discoverable credential)\r\n userVerification: challenge.authenticatorSelection?.userVerification || WEBAUTHN_CONFIG.USER_VERIFICATION,\r\n // Explicitly undefined to avoid issues, though JS objects don't usually include undefined keys in JSON\r\n // But react-native-passkey might handle it differently.\r\n };\r\n\r\n // Ensure rp.id is present\r\n const rpId = challenge.rp?.id || this.config.relyingParty.id;\r\n if (!rpId) {\r\n console.error('[RNWebAuthn] Missing RP ID in challenge or config');\r\n throw new Error('Missing RP ID');\r\n }\r\n\r\n const request = {\r\n challenge: toBase64Url(challenge.challenge), // Ensure Base64URL\r\n pubKeyCredParams: challenge.pubKeyCredParams,\r\n rp: {\r\n id: rpId,\r\n name: challenge.rp?.name || this.config.relyingParty.name,\r\n },\r\n user: {\r\n displayName: challenge.user.displayName,\r\n id: toBase64Url(challenge.user.id), // Ensure Base64URL\r\n name: challenge.user.name,\r\n },\r\n attestation: 'none', // Force 'none' as in web\r\n excludeCredentials: challenge.excludeCredentials?.map((v) => ({\r\n id: toBase64Url(v.id), // Ensure Base64URL\r\n type: v.type,\r\n transports: v.transports\r\n })) as any, // Cast to any to avoid strict type mismatch with react-native-passkey types\r\n authenticatorSelection,\r\n timeout: challenge.timeout || WEBAUTHN_CONFIG.TIMEOUT,\r\n };\r\n\r\n const result = await Passkey.create(request);\r\n\r\n return {\r\n id: result.id,\r\n clientDataJSON: result.response.clientDataJSON,\r\n attestationObject: result.response.attestationObject,\r\n };\r\n } catch (error: any) {\r\n if (error.message === 'WEB_FALLBACK_NEEDED') {\r\n return this.handleWebFallback('create', challenge);\r\n }\r\n console.error('Failed to create credential with react-native-passkey:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n async sign(challenge: WebAuthnSignChallenge): Promise<WebAuthnAssertion> {\r\n try {\r\n const Passkey = await this.getPasskeyLibrary();\r\n\r\n // Prepare request for react-native-passkey\r\n const request = {\r\n challenge: toBase64Url(challenge.challenge), // Ensure Base64URL\r\n allowCredentials: challenge.allowCredentials?.webauthn?.map((cred) => ({\r\n id: toBase64Url(cred.id), // Ensure Base64URL\r\n type: 'public-key',\r\n // Omit transports to allow 1Password/cross-platform authenticators to work\r\n // transports: cred.transports, \r\n })) as any,\r\n rpId: challenge.rpId || this.config.relyingParty.id,\r\n userVerification: challenge.userVerification || WEBAUTHN_CONFIG.USER_VERIFICATION,\r\n timeout: challenge.timeout || WEBAUTHN_CONFIG.TIMEOUT,\r\n };\r\n\r\n const credential = await Passkey.get(request);\r\n\r\n return {\r\n kind: 'Fido2',\r\n credentialAssertion: {\r\n credId: credential.id,\r\n clientData: credential.response.clientDataJSON,\r\n authenticatorData: credential.response.authenticatorData,\r\n signature: credential.response.signature,\r\n userHandle: credential.response.userHandle,\r\n },\r\n };\r\n } catch (error: any) {\r\n if (error.message === 'WEB_FALLBACK_NEEDED') {\r\n return this.handleWebFallback('sign', challenge);\r\n }\r\n console.error('Failed to sign with react-native-passkey:', error);\r\n throw error;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Get WebAuthn provider for React Native environments\r\n */\r\nexport async function getReactNativeWebAuthnProvider(): Promise<WebAuthnProvider> {\r\n const config = getWebAuthnConfig();\r\n \r\n return new ReactNativeWebAuthnProvider(config);\r\n}","/**\r\n * In-memory User Cache\r\n * \r\n * Provides secure, storage-free user authentication caching\r\n * Uses memory-only storage with TTL expiration for security\r\n */\r\n\r\nimport type { AuthenticatedUser } from '../types';\r\n\r\ninterface CachedUser {\r\n user: AuthenticatedUser;\r\n expiresAt: number;\r\n}\r\n\r\n/**\r\n * In-memory user cache with TTL expiration\r\n * Security-first approach - no persistent storage\r\n */\r\nexport class UserCache {\r\n private static cache = new Map<string, CachedUser>();\r\n private static readonly DEFAULT_TTL_MS = 300000; // 5 minutes\r\n \r\n /**\r\n * Get cached user by identifier\r\n * @param identifier - User identifier (email/userId)\r\n * @returns Cached user or null if not found/expired\r\n */\r\n static get(identifier: string): AuthenticatedUser | null {\r\n const cached = this.cache.get(identifier);\r\n \r\n if (!cached) {\r\n return null;\r\n }\r\n \r\n // Check if expired\r\n if (Date.now() > cached.expiresAt) {\r\n this.cache.delete(identifier);\r\n return null;\r\n }\r\n \r\n return cached.user;\r\n }\r\n \r\n /**\r\n * Cache user with TTL\r\n * @param identifier - User identifier\r\n * @param user - Authenticated user data\r\n * @param ttlMs - Time to live in milliseconds (default: 5 minutes)\r\n */\r\n static set(identifier: string, user: AuthenticatedUser, ttlMs: number = this.DEFAULT_TTL_MS): void {\r\n this.cache.set(identifier, {\r\n user,\r\n expiresAt: Date.now() + ttlMs\r\n });\r\n }\r\n \r\n /**\r\n * Remove user from cache\r\n * @param identifier - User identifier\r\n */\r\n static delete(identifier: string): boolean {\r\n return this.cache.delete(identifier);\r\n }\r\n \r\n /**\r\n * Clear all cached users\r\n */\r\n static clear(): void {\r\n this.cache.clear();\r\n }\r\n \r\n /**\r\n * Get cache size (for debugging)\r\n */\r\n static size(): number {\r\n return this.cache.size;\r\n }\r\n \r\n /**\r\n * Clean up expired entries\r\n */\r\n static cleanup(): number {\r\n const now = Date.now();\r\n let cleaned = 0;\r\n \r\n for (const [identifier, cached] of this.cache.entries()) {\r\n if (now > cached.expiresAt) {\r\n this.cache.delete(identifier);\r\n cleaned++;\r\n }\r\n }\r\n \r\n return cleaned;\r\n }\r\n}","/**\r\n * PERS Blockchain Signer SDK\r\n * \r\n * A lightweight blockchain transaction signing SDK with WebAuthn authentication.\r\n * Provides 5 focused methods for complete transaction lifecycle management:\r\n * \r\n * 1. loginUser(jwtToken) - Authenticate user with 5-minute caching\r\n * 2. signTransaction(signingData, jwtToken) - Sign transactions with auto-login\r\n * 3. submitTransaction(signedTx, jwtToken) - Submit signed transactions to blockchain\r\n * 4. signPersTransaction(jwtToken) - Legacy one-liner for backward compatibility\r\n * 5. signAndSubmitPersTransaction(jwtToken) - Complete sign + submit flow\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createPersSignerSDK } from '@explorins/pers-signer';\r\n * \r\n * const sdk = createPersSignerSDK({\r\n * webAuthnProvider: myWebAuthnProvider,\r\n * ethersProviderUrl: 'https://ethereum-rpc.com'\r\n * });\r\n * \r\n * // Quick sign and submit\r\n * const result = await sdk.signAndSubmitPersTransaction(jwtToken);\r\n * if (result.success) {\r\n * console.log('Transaction submitted:', result.transactionHash);\r\n * }\r\n * ```\r\n */\r\n\r\nimport { AuthenticationService, PersService } from '../core';\r\nimport { TransactionSigningService } from '../transaction';\r\nimport { setConfigProvider, WebConfigProvider } from '../platform/ConfigProvider';\r\nimport { DEFAULT_FALLBACK_PROVIDER, SIGNER_CONFIG } from '../config/constants';\r\nimport { extractJWTFromToken } from '../utils/jwt';\r\nimport { UserCache } from '../utils/user-cache';\r\nimport type { WebAuthnProvider } from '../platform/WebAuthnProvider.types';\r\nimport type { \r\n AuthenticatedUser,\r\n LegacyTransaction, \r\n} from '../types';\r\nimport { SubmissionResult, TransactionSigningResult } from '../shared';\r\nimport { CounterfactualWalletTransactionResponse } from '@explorins/pers-shared';\r\nimport { SigningStatus, StatusUpdateData, StatusCallback } from '../types/status';\r\n\r\n/**\r\n * Configuration interface for the PERS Signer SDK\r\n * \r\n * @interface PersSignerConfig\r\n * @property {string} [tenantId] - Optional tenant identifier for multi-tenant applications\r\n * @property {string} [ethersProviderUrl] - Custom Ethereum RPC provider URL\r\n * @property {WebAuthnProvider} webAuthnProvider - WebAuthn provider for secure authentication\r\n * @property {string} [apiUrl] - Custom API base URL (defaults to production)\r\n * @property {string} [relyingPartyName] - WebAuthn relying party name for authentication\r\n * @property {StatusCallback} [globalStatusCallback] - Optional global status callback for all operations\r\n */\r\nexport interface ExtendedPersSignerConfig {\r\n // tenantId?: string;\r\n ethersProviderUrl?: string;\r\n webAuthnProvider: WebAuthnProvider;\r\n apiUrl?: string;\r\n relyingPartyName?: string;\r\n globalStatusCallback?: StatusCallback;\r\n}\r\n\r\nexport interface PersSignerConfig extends Omit<ExtendedPersSignerConfig, 'webAuthnProvider'> {}\r\n\r\n/**\r\n * PERS Blockchain Signer SDK Class\r\n * \r\n * Main SDK class providing blockchain transaction signing capabilities with WebAuthn authentication.\r\n * Implements a clean 5-method API for complete transaction lifecycle management.\r\n * \r\n * Features:\r\n * - WebAuthn-based secure authentication\r\n * - 5-minute user session caching\r\n * - Automatic transaction data fetching\r\n * - Blockchain transaction signing and submission\r\n * - Multi-tenant support\r\n * \r\n * @class PersSignerSDK\r\n */\r\nexport class PersSignerSDK {\r\n private config: ExtendedPersSignerConfig;\r\n private authenticationService: AuthenticationService;\r\n private transactionSigningService: TransactionSigningService;\r\n\r\n /**\r\n * Initialize the PERS Signer SDK\r\n * \r\n * @param {ExtendedPersSignerConfig} config - SDK configuration object\r\n * @throws {Error} If required configuration is missing\r\n */\r\n constructor(config: ExtendedPersSignerConfig) {\r\n this.config = config;\r\n \r\n setConfigProvider(new WebConfigProvider({\r\n apiUrl: config.apiUrl || SIGNER_CONFIG.DEFAULT_SIGNER_API_URL,\r\n relyingParty: {\r\n id: typeof window !== 'undefined' ? window.location.hostname : 'localhost',\r\n name: config.relyingPartyName || SIGNER_CONFIG.DEFAULT_RELYING_PARTY_NAME,\r\n origin: typeof window !== 'undefined' ? window.location.origin : undefined,\r\n },\r\n }));\r\n \r\n this.authenticationService = new AuthenticationService(this.config);\r\n this.transactionSigningService = new TransactionSigningService(config);\r\n }\r\n\r\n /**\r\n * Helper method to trigger both global and method-specific status callbacks\r\n * @private\r\n */\r\n private triggerStatusUpdate(status: SigningStatus, message: string, data?: StatusUpdateData, methodCallback?: StatusCallback) {\r\n // Call method-specific callback first (higher priority)\r\n methodCallback?.onStatusUpdate?.(status, message, data);\r\n \r\n // Then call global callback if no method-specific callback provided\r\n if (!methodCallback && this.config.globalStatusCallback) {\r\n this.config.globalStatusCallback.onStatusUpdate?.(status, message, data);\r\n }\r\n }\r\n\r\n /**\r\n * Authenticate user and cache session for 5 minutes\r\n * \r\n * Validates JWT token, authenticates with both signer and PERS backends,\r\n * and caches the authenticated user session to avoid repeated authentication.\r\n * \r\n * @param {string} jwtToken - JWT token containing user identifier and tenant info\r\n * @param {StatusCallback} [statusCallback] - Optional callback for status updates\r\n * @returns {Promise<AuthenticatedUser>} Authenticated user with access tokens\r\n * @throws {Error} If JWT is invalid, expired, or authentication fails\r\n * \r\n * @example\r\n * ```typescript\r\n * try {\r\n * const user = await sdk.loginUser(jwtToken, {\r\n * onStatusUpdate: (status, message) => console.log(`${status}: ${message}`)\r\n * });\r\n * console.log('Authenticated:', user.identifier);\r\n * } catch (error) {\r\n * console.error('Authentication failed:', error.message);\r\n * }\r\n * ```\r\n */\r\n async loginUser(jwtToken: string, statusCallback?: StatusCallback): Promise<AuthenticatedUser> {\r\n if (!jwtToken || typeof jwtToken !== 'string') {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'JWT token is required and must be a string', undefined, statusCallback);\r\n throw new Error('JWT token is required and must be a string');\r\n }\r\n\r\n this.triggerStatusUpdate(SigningStatus.INITIALIZING, 'Validating JWT token...', undefined, statusCallback);\r\n\r\n const { payload, isExpired } = extractJWTFromToken(jwtToken);\r\n \r\n if (!payload || isExpired) {\r\n this.triggerStatusUpdate(SigningStatus.EXPIRED, 'JWT token is invalid or expired', undefined, statusCallback);\r\n throw new Error('Invalid or expired JWT token');\r\n }\r\n\r\n const identifier = payload.identifierEmail || payload.email || payload.userId;\r\n \r\n if (!identifier) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'JWT token missing user identifier', undefined, statusCallback);\r\n throw new Error('JWT token missing user identifier (identifierEmail, email, or userId)');\r\n }\r\n\r\n this.triggerStatusUpdate(SigningStatus.AUTHENTICATING, 'Checking authentication cache...', undefined, statusCallback);\r\n\r\n // Check cache first\r\n const cachedUser = UserCache.get(identifier);\r\n if (cachedUser && Date.now() < cachedUser.expiresAt) {\r\n this.triggerStatusUpdate(SigningStatus.COMPLETED, 'Authentication retrieved from cache', undefined, statusCallback);\r\n return cachedUser;\r\n }\r\n\r\n try {\r\n this.triggerStatusUpdate(SigningStatus.AUTHENTICATING, 'Authenticating user with WebAuthn...', undefined, statusCallback);\r\n \r\n // Authenticate and cache\r\n const user = await this.authenticationService.combinedAuthentication(\r\n identifier,\r\n jwtToken,\r\n );\r\n\r\n UserCache.set(identifier, user);\r\n\r\n this.triggerStatusUpdate(SigningStatus.COMPLETED, 'User authentication completed successfully', undefined, statusCallback);\r\n return user;\r\n } catch (error) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, `Authentication failed: ${error instanceof Error ? error.message : 'Unknown error'}`, undefined, statusCallback);\r\n throw new Error(`Authentication failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n }\r\n\r\n /**\r\n * Sign a PERS transaction (legacy compatibility method)\r\n * \r\n * Automatically handles user authentication, transaction data fetching,\r\n * and transaction signing in a single call. This is the legacy method\r\n * maintained for backward compatibility.\r\n * \r\n * @param {string} jwtToken - JWT token containing transaction ID and user info\r\n * @param {StatusCallback} [statusCallback] - Optional callback for status updates\r\n * @returns {Promise<TransactionSigningResult>} Signing result with signature and metadata\r\n * @throws {Error} If authentication fails, transaction ID missing, or signing fails\r\n * \r\n * @example\r\n * ```typescript\r\n * try {\r\n * const result = await sdk.signPersTransaction(jwtToken, {\r\n * onStatusUpdate: (status, message) => console.log(`${status}: ${message}`)\r\n * });\r\n * if (result.success) {\r\n * console.log('Transaction signed:', result.signature);\r\n * }\r\n * } catch (error) {\r\n * console.error('Signing failed:', error.message);\r\n * }\r\n * ```\r\n */\r\n async signPersTransaction(jwtToken: string, statusCallback?: StatusCallback): Promise<TransactionSigningResult> {\r\n if (!jwtToken || typeof jwtToken !== 'string') {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'JWT token is required and must be a string', undefined, statusCallback);\r\n throw new Error('JWT token is required and must be a string');\r\n }\r\n\r\n this.triggerStatusUpdate(SigningStatus.AUTHENTICATING, 'Authenticating user...', undefined, statusCallback);\r\n const user = await this.loginUser(jwtToken, statusCallback);\r\n \r\n this.triggerStatusUpdate(SigningStatus.PREPARING, 'Extracting transaction information...', undefined, statusCallback);\r\n const { payload } = extractJWTFromToken(jwtToken);\r\n\r\n if (!payload?.transactionId) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'JWT token missing transactionId in payload', undefined, statusCallback);\r\n throw new Error('JWT token missing transactionId in payload');\r\n }\r\n\r\n if(!payload.tenantId) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'JWT token missing tenantId in payload', undefined, statusCallback);\r\n throw new Error('JWT token missing tenantId in payload');\r\n }\r\n \r\n const authTokens = {\r\n signerAuthToken: user.signerAuthToken,\r\n persAccessToken: user.persAccessToken\r\n };\r\n \r\n try {\r\n this.triggerStatusUpdate(SigningStatus.PREPARING, 'Fetching transaction data from PERS backend...', undefined, statusCallback);\r\n \r\n const persSigningData = await this.transactionSigningService.getPersSigningData({\r\n transactionId: payload.transactionId,\r\n authTokens,\r\n tenantId: payload.tenantId\r\n });\r\n \r\n this.triggerStatusUpdate(SigningStatus.SIGNING, 'Signing transaction with device security...', undefined, statusCallback);\r\n const result = await this.signTransaction(persSigningData, jwtToken, statusCallback);\r\n\r\n if (!result.success) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, result.error || 'Transaction signing failed', undefined, statusCallback);\r\n throw new Error(result.error || 'Transaction signing failed');\r\n }\r\n\r\n this.triggerStatusUpdate(SigningStatus.COMPLETED, 'Transaction signed successfully', {\r\n transactionId: payload.transactionId,\r\n signature: result.signature\r\n }, statusCallback);\r\n \r\n return result;\r\n } catch (error) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, `PERS transaction signing failed: ${error instanceof Error ? error.message : 'Unknown error'}`, undefined, statusCallback);\r\n throw new Error(`PERS transaction signing failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n }\r\n\r\n /**\r\n * Sign a transaction with provided signing data\r\n * \r\n * Low-level method to sign transactions when you already have the signing data.\r\n * Automatically handles user authentication and applies the blockchain signature.\r\n * \r\n * @param {CounterfactualWalletTransactionResponse | LegacyTransaction} signingData - Transaction data to sign\r\n * @param {string} jwtToken - JWT token containing transaction ID and user info\r\n * @param {StatusCallback} [statusCallback] - Optional callback for status updates\r\n * @returns {Promise<TransactionSigningResult>} Signing result with signature and metadata\r\n * @throws {Error} If authentication fails, transaction ID missing, or signing fails\r\n * \r\n * @example\r\n * ```typescript\r\n * const signingData = await getTransactionData(transactionId);\r\n * const result = await sdk.signTransaction(signingData, jwtToken, {\r\n * onStatusUpdate: (status, message) => console.log(`${status}: ${message}`)\r\n * });\r\n * console.log('Signed transaction:', result.signature);\r\n * ```\r\n */\r\n async signTransaction(signingData: CounterfactualWalletTransactionResponse | LegacyTransaction, jwtToken: string, statusCallback?: StatusCallback): Promise<TransactionSigningResult> {\r\n if (!signingData) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'Signing data is required', undefined, statusCallback);\r\n throw new Error('Signing data is required');\r\n }\r\n if (!jwtToken || typeof jwtToken !== 'string') {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'JWT token is required and must be a string', undefined, statusCallback);\r\n throw new Error('JWT token is required and must be a string');\r\n }\r\n\r\n this.triggerStatusUpdate(SigningStatus.AUTHENTICATING, 'Authenticating user for transaction signing...', undefined, statusCallback);\r\n const user = await this.loginUser(jwtToken, statusCallback);\r\n \r\n this.triggerStatusUpdate(SigningStatus.PREPARING, 'Preparing transaction for signing...', undefined, statusCallback);\r\n const { payload } = extractJWTFromToken(jwtToken);\r\n\r\n if (!payload?.transactionId) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'JWT token missing transactionId in payload', undefined, statusCallback);\r\n throw new Error('JWT token missing transactionId in payload');\r\n }\r\n\r\n if(!payload.tenantId) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'JWT token missing tenantId in payload', undefined, statusCallback);\r\n throw new Error('JWT token missing tenantId in payload');\r\n }\r\n\r\n const authTokens = {\r\n signerAuthToken: user.signerAuthToken,\r\n persAccessToken: user.persAccessToken\r\n };\r\n\r\n try {\r\n this.triggerStatusUpdate(SigningStatus.SIGNING, 'Signing transaction with cryptographic signature...', undefined, statusCallback);\r\n \r\n const result = await this.transactionSigningService.signTransaction({\r\n transactionId: payload.transactionId,\r\n tenantId: payload.tenantId,\r\n authTokens,\r\n ethersProviderUrl: this.config.ethersProviderUrl ?? DEFAULT_FALLBACK_PROVIDER\r\n }, signingData);\r\n\r\n if (result.success) {\r\n this.triggerStatusUpdate(SigningStatus.COMPLETED, 'Transaction signed successfully', {\r\n transactionId: payload.transactionId,\r\n signature: result.signature\r\n }, statusCallback);\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, `Transaction signing failed: ${error instanceof Error ? error.message : 'Unknown error'}`, undefined, statusCallback);\r\n throw new Error(`Transaction signing failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n }\r\n\r\n /**\r\n * Complete transaction flow: sign and submit in one call\r\n * \r\n * Convenience method that combines signing and submission into a single operation.\r\n * This is the recommended method for most use cases as it handles the complete\r\n * transaction lifecycle automatically.\r\n * \r\n * @param {string} jwtToken - JWT token containing transaction ID and user info\r\n * @param {StatusCallback} [statusCallback] - Optional callback for status updates\r\n * @returns {Promise<SubmissionResult>} Submission result with transaction hash and status\r\n * @throws {Error} If authentication, signing, or submission fails\r\n * \r\n * @example\r\n * ```typescript\r\n * try {\r\n * const result = await sdk.signAndSubmitPersTransaction(jwtToken, {\r\n * onStatusUpdate: (status, message) => {\r\n * console.log(`Status: ${status} - ${message}`);\r\n * }\r\n * });\r\n * if (result.success) {\r\n * console.log('Transaction completed:', result.transactionHash);\r\n * if (result.shouldRedirect) {\r\n * window.location.href = result.redirectUrl;\r\n * }\r\n * }\r\n * } catch (error) {\r\n * console.error('Transaction failed:', error.message);\r\n * }\r\n * ```\r\n */\r\n async signAndSubmitPersTransaction(jwtToken: string, statusCallback?: StatusCallback): Promise<SubmissionResult> {\r\n if (!jwtToken || typeof jwtToken !== 'string') {\r\n throw new Error('JWT token is required and must be a string');\r\n }\r\n\r\n try {\r\n // Extract transaction ID for status updates\r\n // Sign the transaction (handles its own status updates)\r\n const signedTx = await this.signPersTransaction(jwtToken, statusCallback);\r\n \r\n // Submit the transaction (handles its own status updates) \r\n const submittedTx = await this.submitTransaction(signedTx, jwtToken, statusCallback);\r\n \r\n this.triggerStatusUpdate(SigningStatus.COMPLETED, 'Transaction completed successfully!', {\r\n transactionHash: submittedTx.transactionHash || undefined,\r\n transactionId: submittedTx.submitResult.transaction.id\r\n }, statusCallback);\r\n \r\n return submittedTx;\r\n } catch (error) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, `Transaction failed: ${error instanceof Error ? error.message : 'Unknown error'}`, undefined, statusCallback);\r\n throw new Error(`Sign and submit transaction failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n }\r\n /**\r\n * Submit a signed transaction to the blockchain\r\n * \r\n * Takes a signed transaction result and submits it to the blockchain network.\r\n * Returns detailed submission results including transaction hash and any\r\n * redirect information for UI flows.\r\n * \r\n * @param {TransactionSigningResult} signingResult - Result from a successful transaction signing\r\n * @param {string} jwtToken - JWT token containing tenant and user info\r\n * @param {StatusCallback} [statusCallback] - Optional callback for status updates\r\n * @returns {Promise<SubmissionResult>} Submission result with transaction hash and status\r\n * @throws {Error} If signing result is invalid, JWT is missing tenantId, or submission fails\r\n * \r\n * @example\r\n * ```typescript\r\n * const signedTx = await sdk.signPersTransaction(jwtToken);\r\n * const result = await sdk.submitTransaction(signedTx, jwtToken, {\r\n * onStatusUpdate: (status, message) => console.log(`${status}: ${message}`)\r\n * });\r\n * console.log('Transaction submitted:', result.transactionHash);\r\n * ```\r\n */\r\n async submitTransaction(signingResult: TransactionSigningResult, jwtToken: string, statusCallback?: StatusCallback): Promise<SubmissionResult> {\r\n if (!signingResult) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'Signing result is required', undefined, statusCallback);\r\n throw new Error('Signing result is required');\r\n }\r\n if (!jwtToken || typeof jwtToken !== 'string') {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'JWT token is required and must be a string', undefined, statusCallback);\r\n throw new Error('JWT token is required and must be a string');\r\n }\r\n\r\n if (!signingResult.success || !signingResult.signature || !signingResult.signingData) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'Invalid signing result: must be successful with signature and signing data', undefined, statusCallback);\r\n throw new Error('Invalid signing result: must be successful with signature and signing data');\r\n }\r\n\r\n this.triggerStatusUpdate(SigningStatus.PREPARING, 'Preparing transaction for blockchain submission...', undefined, statusCallback);\r\n \r\n const { payload } = extractJWTFromToken(jwtToken);\r\n\r\n if (!payload?.tenantId) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, 'JWT token missing tenantId in payload', undefined, statusCallback);\r\n throw new Error('JWT token missing tenantId in payload');\r\n }\r\n\r\n this.triggerStatusUpdate(SigningStatus.AUTHENTICATING, 'Re-authenticating for submission...', undefined, statusCallback);\r\n const user = await this.loginUser(jwtToken, statusCallback);\r\n\r\n try {\r\n this.triggerStatusUpdate(SigningStatus.SUBMITTING, 'Submitting signed transaction to blockchain network...', undefined, statusCallback);\r\n \r\n const submitResult = await PersService.submitTransaction(\r\n signingResult.transactionId,\r\n signingResult.signature,\r\n user.persAccessToken,\r\n signingResult.signingData.format,\r\n payload.tenantId\r\n );\r\n \r\n this.triggerStatusUpdate(SigningStatus.COMPLETED, 'Transaction submitted successfully to blockchain', {\r\n transactionHash: submitResult.transaction.transactionHash || undefined,\r\n transactionId: signingResult.transactionId\r\n }, statusCallback);\r\n \r\n // Transform response to SubmissionResult\r\n return {\r\n success: true,\r\n transactionHash: submitResult.transaction.transactionHash,\r\n shouldRedirect: false, // Can be configured based on business requirements\r\n redirectUrl: undefined, // Can be set based on business logic\r\n error: undefined,\r\n submitResult: submitResult\r\n };\r\n } catch (error) {\r\n this.triggerStatusUpdate(SigningStatus.ERROR, `Transaction submission failed: ${error instanceof Error ? error.message : 'Unknown error'}`, undefined, statusCallback);\r\n throw new Error(`Transaction submission failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n }\r\n\r\n /**\r\n * Clear user authentication cache\r\n * \r\n * Removes all cached user sessions, forcing fresh authentication\r\n * on the next method call. Useful for logout scenarios or when\r\n * switching between different user contexts.\r\n * \r\n * @example\r\n * ```typescript\r\n * // Clear cache on user logout\r\n * sdk.clearCache();\r\n * console.log('User cache cleared');\r\n * ```\r\n */\r\n clearCache(): void {\r\n UserCache.clear();\r\n }\r\n}\r\n\r\n/**\r\n * Create a new PERS Signer SDK instance\r\n * \r\n * Factory function to create and configure a new SDK instance with the provided\r\n * configuration. This is the recommended way to initialize the SDK.\r\n * \r\n * @param {PersSignerConfig} config - SDK configuration object\r\n * @returns {PersSignerSDK} Configured SDK instance ready for use\r\n * @throws {Error} If required configuration is missing or invalid\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createPersSignerSDK, getWebAuthnProvider } from '@explorins/pers-signer';\r\n * \r\n * const webAuthnProvider = await getWebAuthnProvider();\r\n * const sdk = createPersSignerSDK({\r\n * webAuthnProvider,\r\n * ethersProviderUrl: 'https://mainnet.infura.io/v3/YOUR_KEY',\r\n * tenantId: 'your-tenant-id'\r\n * });\r\n * ```\r\n */\r\nexport function createPersSignerSDK(config: ExtendedPersSignerConfig): PersSignerSDK {\r\n return new PersSignerSDK(config);\r\n}\r\n"],"names":[],"mappings":"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"}