@lumiapassport/ui-kit 1.13.9 → 1.13.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -4
- package/dist/iframe/index.html +1 -1
- package/dist/iframe/main.js +286 -29
- package/dist/iframe/main.js.map +1 -1
- package/dist/index.cjs +367 -574
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +439 -647
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
package/dist/iframe/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/iframe/lib/backup/crypto-utils.ts","../../src/iframe/lib/backup/server-backup.ts","../../src/iframe/lib/backup/local-backup.ts","../../../../node_modules/.pnpm/viem@2.38.0_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.22.4/node_modules/viem/utils/data/isHex.ts","../../../../node_modules/.pnpm/viem@2.38.0_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.22.4/node_modules/viem/utils/data/size.ts","../../../../node_modules/.pnpm/viem@2.38.0_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.22.4/node_modules/viem/errors/version.ts","../../../../node_modules/.pnpm/viem@2.38.0_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.22.4/node_modules/viem/errors/base.ts","../../../../node_modules/.pnpm/viem@2.38.0_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.22.4/node_modules/viem/errors/data.ts","../../../../node_modules/.pnpm/viem@2.38.0_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.22.4/node_modules/viem/utils/data/pad.ts","../../../../node_modules/.pnpm/viem@2.38.0_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.22.4/node_modules/viem/errors/encoding.ts","../../../../node_modules/.pnpm/viem@2.38.0_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.22.4/node_modules/viem/utils/encoding/fromHex.ts","../../../../node_modules/.pnpm/viem@2.38.0_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.22.4/node_modules/viem/utils/encoding/toHex.ts","../../../../node_modules/.pnpm/viem@2.38.0_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.22.4/node_modules/viem/utils/encoding/toBytes.ts","../../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/src/_u64.ts","../../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/src/utils.ts","../../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/src/sha3.ts","../../../../node_modules/.pnpm/viem@2.38.0_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.22.4/node_modules/viem/utils/hash/keccak256.ts","../../src/iframe/templates/template-engine.ts","../../src/iframe/templates/html/authorization.html","../../src/iframe/templates/html/ready-indicator.html","../../src/iframe/templates/template-loader.ts","../../src/iframe/templates/data/authorization-template-data.ts","../../src/iframe/templates/data/ready-indicator-data.ts","../../src/iframe/lib/authorization-manager.ts","../../src/iframe/lib/token-refresh-client.ts","../../src/iframe/lib/backup-manager.ts","../../src/iframe/lib/backup/cloud-backup.ts","../../src/iframe/lib/backup/cloudStorage.ts","../../../../node_modules/.pnpm/dkls23-wasm@0.1.1/node_modules/dkls23-wasm/pkg-web/dkls23_wasm.js","../../../../node_modules/.pnpm/viem@2.38.0_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.22.4/node_modules/viem/index.ts","../../src/iframe/lib/dkg-manager.ts","../../src/iframe/lib/secure-messenger.ts","../../src/iframe/lib/session-manager.ts","../../src/iframe/lib/storage-manager.ts","../../src/iframe/lib/trusted-apps-manager.ts","../../src/iframe/lib/signing-manager.ts","../../src/iframe/main.ts"],"sourcesContent":["/**\n * Shared cryptographic utilities for backup operations\n */\n\nimport type { KeyshareBackupData } from '../types';\n\nexport interface EncryptedBackup {\n encryptedData: string;\n iv: string;\n salt: string;\n version: string;\n encryptionMethod: 'passkey' | 'password';\n credentialId?: string;\n}\n\nexport interface EnvelopeEncryptedShare {\n encryptedDEK: string;\n encryptedKeyshare: string;\n iv: string;\n salt: string;\n version: string;\n}\n\n/**\n * Convert base64 string to Uint8Array\n */\nexport function base64ToBytes(base64: string): Uint8Array {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n}\n\n/**\n * Convert Uint8Array to base64 string\n */\nexport function bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n const len = bytes.byteLength;\n for (let i = 0; i < len; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Convert Uint8Array to hex string\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Derive encryption key from password using PBKDF2\n */\nexport async function deriveKeyFromPassword(\n password: string,\n salt: Uint8Array\n): Promise<CryptoKey> {\n const encoder = new TextEncoder();\n const passwordKey = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n { name: 'PBKDF2' },\n false,\n ['deriveBits', 'deriveKey']\n );\n\n return crypto.subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt: salt,\n iterations: 150000,\n hash: 'SHA-256',\n },\n passwordKey,\n { name: 'AES-GCM', length: 256 },\n false,\n ['encrypt', 'decrypt']\n );\n}\n\n/**\n * Derive KEK (Key Encryption Key) from passkey using PRF extension\n */\nexport async function deriveKEKFromPasskey(\n userId: string,\n requiredCredentialId?: string\n): Promise<{ kek: ArrayBuffer; credentialId: string }> {\n const challenge = crypto.getRandomValues(new Uint8Array(32));\n\n const allowCredentials = requiredCredentialId\n ? [\n {\n type: 'public-key' as const,\n id: base64ToBytes(requiredCredentialId),\n transports: ['internal'] as AuthenticatorTransport[],\n },\n ]\n : undefined;\n\n const credential = (await navigator.credentials.get({\n publicKey: {\n challenge,\n rpId: window.location.hostname,\n userVerification: 'required',\n allowCredentials,\n extensions: {\n prf: {\n eval: {\n first: new TextEncoder().encode(`backup-kek-${userId}`),\n },\n },\n },\n },\n })) as any;\n\n if (!credential?.getClientExtensionResults) {\n throw new Error('Passkey authentication failed');\n }\n\n const prfResults = credential.getClientExtensionResults();\n if (!prfResults?.prf?.results?.first) {\n throw new Error('PRF extension not supported or failed');\n }\n\n const resultCredentialId = bytesToBase64(new Uint8Array(credential.rawId));\n\n return {\n kek: prfResults.prf.results.first,\n credentialId: resultCredentialId,\n };\n}\n\n/**\n * Derive backup password from passkey using PRF extension\n */\nexport async function deriveBackupPasswordFromPasskey(\n userId: string,\n credentialId?: string\n): Promise<{ password: string; credentialId: string }> {\n const challenge = crypto.getRandomValues(new Uint8Array(32));\n\n const allowCredentials = credentialId\n ? [\n {\n type: 'public-key' as const,\n id: base64ToBytes(credentialId),\n transports: ['internal'] as AuthenticatorTransport[],\n },\n ]\n : undefined;\n\n const credential = (await navigator.credentials.get({\n publicKey: {\n challenge,\n rpId: window.location.hostname,\n userVerification: 'required',\n allowCredentials,\n extensions: {\n prf: {\n eval: {\n first: new TextEncoder().encode(`backup-password-${userId}`),\n },\n },\n },\n },\n })) as any;\n\n if (!credential?.getClientExtensionResults) {\n throw new Error('Passkey authentication failed');\n }\n\n const prfResults = credential.getClientExtensionResults();\n if (!prfResults?.prf?.results?.first) {\n throw new Error('PRF extension not supported or failed');\n }\n\n const prfOutput = new Uint8Array(prfResults.prf.results.first);\n const password = bytesToBase64(prfOutput);\n const resultCredentialId = bytesToBase64(\n new Uint8Array(credential.rawId)\n );\n\n return { password, credentialId: resultCredentialId };\n}\n\n/**\n * Encrypt keyshare data using password or passkey\n */\nexport async function encryptKeyshare(\n data: KeyshareBackupData,\n password: string,\n encryptionMethod: 'passkey' | 'password',\n credentialId?: string\n): Promise<any> {\n const encoder = new TextEncoder();\n const plaintext = JSON.stringify(data);\n const salt = crypto.getRandomValues(new Uint8Array(16));\n const passwordKey = await crypto.subtle.importKey('raw', encoder.encode(password), 'PBKDF2', false, ['deriveBits']);\n const keyMaterial = await crypto.subtle.deriveBits({ name: 'PBKDF2', salt, iterations: 100000, hash: 'SHA-256' }, passwordKey, 256);\n const key = await crypto.subtle.importKey('raw', keyMaterial, 'AES-GCM', false, ['encrypt']);\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encryptedData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, encoder.encode(plaintext));\n\n // Create checksum\n const checksumData = `${data.userId}:${data.sessionId}:${encryptionMethod}`;\n const checksumBuffer = await crypto.subtle.digest('SHA-256', encoder.encode(checksumData));\n const checksum = bytesToBase64(new Uint8Array(checksumBuffer));\n\n const timestamp = Date.now();\n\n return {\n data: bytesToBase64(new Uint8Array(encryptedData)),\n iv: bytesToBase64(iv),\n salt: bytesToBase64(salt),\n version: '1.0',\n checksum,\n magic: 'LUMIA_BACKUP_V1',\n encryptionMethod,\n createdAt: timestamp,\n credentialId: encryptionMethod === 'passkey' ? credentialId : undefined,\n };\n}\n\n/**\n * Encrypt keyshare using envelope encryption with passkey-derived KEK\n */\nexport async function envelopeEncryptKeyshare(\n data: KeyshareBackupData,\n userId: string\n): Promise<EnvelopeEncryptedShare> {\n // Derive KEK from passkey and get credential ID\n const { kek: kekBytes, credentialId } = await deriveKEKFromPasskey(userId);\n console.log('[envelopeEncryptKeyshare] Using credential ID for encryption:', credentialId);\n\n const dek = crypto.getRandomValues(new Uint8Array(32));\n const kek = await crypto.subtle.importKey('raw', kekBytes, 'AES-GCM', false, ['encrypt']);\n\n const plaintext = JSON.stringify(data);\n const plaintextBytes = new TextEncoder().encode(plaintext);\n const dekCryptoKey = await crypto.subtle.importKey('raw', dek, 'AES-GCM', false, ['encrypt']);\n\n const dataIv = crypto.getRandomValues(new Uint8Array(12));\n const encryptedData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: dataIv }, dekCryptoKey, plaintextBytes);\n\n const wrapIv = crypto.getRandomValues(new Uint8Array(12));\n const wrappedDekData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: wrapIv }, kek, dek);\n\n const ciphertextWithIv = new Uint8Array(dataIv.length + encryptedData.byteLength);\n ciphertextWithIv.set(dataIv, 0);\n ciphertextWithIv.set(new Uint8Array(encryptedData), dataIv.length);\n\n const wrappedDekWithIv = new Uint8Array(wrapIv.length + wrappedDekData.byteLength);\n wrappedDekWithIv.set(wrapIv, 0);\n wrappedDekWithIv.set(new Uint8Array(wrappedDekData), wrapIv.length);\n\n return {\n ciphertext_share: bytesToBase64(ciphertextWithIv),\n wrapped_dek: bytesToBase64(wrappedDekWithIv),\n kdf: { prf: 'webauthn-prf', hkdf: 'hkdf-sha256', info: 'client-share' },\n alg: { data: 'aes-256-gcm', wrap: 'aes-256-gcm' },\n aad: { userId: data.userId, version: 1, deviceId: 'lumia-ui-kit' },\n createdAt: new Date().toISOString(),\n expiresAt: null,\n encryptionMethod: 'passkey',\n credentialId: credentialId || undefined\n };\n}\n\n/**\n * Encrypt keyshare using envelope encryption with password-derived KEK\n */\nexport async function envelopeEncryptKeyshareWithPassword(\n data: KeyshareBackupData,\n password: string\n): Promise<EnvelopeEncryptedShare> {\n console.log('[envelopeEncryptKeyshareWithPassword] Encrypting with password');\n\n // Generate DEK and derive KEK from password\n const dek = crypto.getRandomValues(new Uint8Array(32));\n const salt = crypto.getRandomValues(new Uint8Array(16));\n const kekKey = await deriveKeyFromPassword(password, salt);\n\n const plaintext = JSON.stringify(data);\n const plaintextBytes = new TextEncoder().encode(plaintext);\n const dekCryptoKey = await crypto.subtle.importKey('raw', dek, 'AES-GCM', false, ['encrypt']);\n\n const dataIv = crypto.getRandomValues(new Uint8Array(12));\n const encryptedData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: dataIv }, dekCryptoKey, plaintextBytes);\n\n const wrapIv = crypto.getRandomValues(new Uint8Array(12));\n const wrappedDekData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: wrapIv }, kekKey, dek);\n\n const ciphertextWithIv = new Uint8Array(dataIv.length + encryptedData.byteLength);\n ciphertextWithIv.set(dataIv, 0);\n ciphertextWithIv.set(new Uint8Array(encryptedData), dataIv.length);\n\n const wrappedDekWithIv = new Uint8Array(salt.length + wrapIv.length + wrappedDekData.byteLength);\n wrappedDekWithIv.set(salt, 0);\n wrappedDekWithIv.set(wrapIv, salt.length);\n wrappedDekWithIv.set(new Uint8Array(wrappedDekData), salt.length + wrapIv.length);\n\n return {\n ciphertext_share: bytesToBase64(ciphertextWithIv),\n wrapped_dek: bytesToBase64(wrappedDekWithIv),\n kdf: { prf: 'pbkdf2', hkdf: 'hkdf-sha256', info: 'client-share' },\n alg: { data: 'aes-256-gcm', wrap: 'aes-256-gcm' },\n aad: { userId: data.userId, version: 1, deviceId: 'lumia-ui-kit' },\n createdAt: new Date().toISOString(),\n expiresAt: null,\n encryptionMethod: 'password'\n };\n}\n\n/**\n * Decrypt keyshare using envelope encryption with passkey-derived KEK\n */\nexport async function envelopeDecryptKeyshare(\n envelope: any,\n userId: string\n): Promise<KeyshareBackupData> {\n console.log('[iframe][envelopeDecryptKeyshare] Starting decryption process');\n console.log('[iframe][envelopeDecryptKeyshare] Envelope credential ID:', envelope.credentialId);\n\n console.log('[iframe][envelopeDecryptKeyshare] Deriving KEK from passkey...');\n const { kek: kekBytes } = await deriveKEKFromPasskey(userId, envelope.credentialId);\n console.log('[iframe][envelopeDecryptKeyshare] KEK bytes length:', kekBytes.byteLength);\n\n console.log('[iframe][envelopeDecryptKeyshare] Importing KEK as crypto key...');\n const kek = await crypto.subtle.importKey('raw', kekBytes, 'AES-GCM', false, ['decrypt']);\n\n console.log('[iframe][envelopeDecryptKeyshare] Decrypting wrapped DEK...');\n const wrappedDekWithIv = base64ToBytes(envelope.wrapped_dek);\n console.log('[iframe][envelopeDecryptKeyshare] Wrapped DEK with IV length:', wrappedDekWithIv.length);\n const wrapIv = wrappedDekWithIv.slice(0, 12);\n const wrappedDekData = wrappedDekWithIv.slice(12);\n console.log('[iframe][envelopeDecryptKeyshare] Wrap IV length:', wrapIv.length, 'Wrapped DEK data length:', wrappedDekData.length);\n\n try {\n const dekBytes = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: wrapIv }, kek, wrappedDekData);\n console.log('[iframe][envelopeDecryptKeyshare] DEK decrypted successfully, length:', dekBytes.byteLength);\n\n console.log('[iframe][envelopeDecryptKeyshare] Importing DEK as crypto key...');\n const dekCryptoKey = await crypto.subtle.importKey('raw', dekBytes, 'AES-GCM', false, ['decrypt']);\n\n console.log('[iframe][envelopeDecryptKeyshare] Decrypting main data...');\n const ciphertextWithIv = base64ToBytes(envelope.ciphertext_share);\n console.log('[iframe][envelopeDecryptKeyshare] Ciphertext with IV length:', ciphertextWithIv.length);\n const dataIv = ciphertextWithIv.slice(0, 12);\n const encryptedData = ciphertextWithIv.slice(12);\n console.log('[iframe][envelopeDecryptKeyshare] Data IV length:', dataIv.length, 'Encrypted data length:', encryptedData.length);\n\n const decryptedData = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: dataIv }, dekCryptoKey, encryptedData);\n console.log('[iframe][envelopeDecryptKeyshare] Main data decrypted successfully, length:', decryptedData.byteLength);\n\n console.log('[iframe][envelopeDecryptKeyshare] Parsing JSON...');\n const plaintext = new TextDecoder().decode(decryptedData);\n const result = JSON.parse(plaintext) as KeyshareBackupData;\n console.log('[iframe][envelopeDecryptKeyshare] Decryption completed successfully');\n return result;\n } catch (error) {\n console.error('[iframe][envelopeDecryptKeyshare] Decryption failed:', error);\n if (error instanceof Error && error.name === 'OperationError') {\n const credentialHint = envelope.credentialId\n ? `The backup requires a specific passkey (ID: ${envelope.credentialId.slice(-8)}...)`\n : 'The backup was encrypted with a different passkey than the one you selected';\n throw new Error(`Passkey mismatch: ${credentialHint}. If you have multiple passkeys, please try again and select the correct passkey that was used when creating this backup.`);\n }\n throw new Error('Failed to decrypt keyshare: ' + (error instanceof Error ? error.message : String(error)));\n }\n}\n\n/**\n * Decrypt keyshare using envelope encryption with password-derived KEK\n */\nexport async function envelopeDecryptKeyshareWithPassword(\n envelope: any,\n password: string\n): Promise<KeyshareBackupData> {\n console.log('[iframe][envelopeDecryptKeyshareWithPassword] Starting password-based decryption');\n\n const wrappedDekWithSaltAndIv = base64ToBytes(envelope.wrapped_dek);\n\n // Extract salt (16 bytes), wrapIv (12 bytes), and wrapped DEK data\n const salt = wrappedDekWithSaltAndIv.slice(0, 16);\n const wrapIv = wrappedDekWithSaltAndIv.slice(16, 28);\n const wrappedDekData = wrappedDekWithSaltAndIv.slice(28);\n\n console.log('[iframe][envelopeDecryptKeyshareWithPassword] Salt length:', salt.length, 'Wrap IV length:', wrapIv.length, 'Wrapped DEK data length:', wrappedDekData.length);\n\n try {\n // Derive KEK from password using the same salt\n const kekKey = await deriveKeyFromPassword(password, salt);\n\n // Decrypt the DEK\n const dekBytes = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: wrapIv }, kekKey, wrappedDekData);\n console.log('[iframe][envelopeDecryptKeyshareWithPassword] DEK decrypted successfully, length:', dekBytes.byteLength);\n\n // Import DEK as crypto key\n const dekCryptoKey = await crypto.subtle.importKey('raw', dekBytes, 'AES-GCM', false, ['decrypt']);\n\n // Decrypt main data\n const ciphertextWithIv = base64ToBytes(envelope.ciphertext_share);\n const dataIv = ciphertextWithIv.slice(0, 12);\n const encryptedData = ciphertextWithIv.slice(12);\n\n const decryptedData = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: dataIv }, dekCryptoKey, encryptedData);\n console.log('[iframe][envelopeDecryptKeyshareWithPassword] Main data decrypted successfully');\n\n const plaintext = new TextDecoder().decode(decryptedData);\n const result = JSON.parse(plaintext) as KeyshareBackupData;\n console.log('[iframe][envelopeDecryptKeyshareWithPassword] Decryption completed successfully');\n return result;\n } catch (error) {\n console.error('[iframe][envelopeDecryptKeyshareWithPassword] Decryption failed:', error);\n if (error instanceof Error && error.name === 'OperationError') {\n throw new Error('Incorrect password: Unable to decrypt the backup with the provided password.');\n }\n throw new Error('Failed to decrypt keyshare with password: ' + (error instanceof Error ? error.message : String(error)));\n }\n}\n\n/**\n * Decrypt keyshare from local file backup\n * Uses 100,000 PBKDF2 iterations for backward compatibility with file backups\n */\nexport async function decryptKeyshare(\n encryptedBackup: any,\n password: string\n): Promise<KeyshareBackupData> {\n console.log('[iframe][decryptKeyshare] Starting file backup decryption');\n\n // Validate backup format and version\n if (encryptedBackup.magic && encryptedBackup.magic !== 'LUMIA_BACKUP_V1') {\n throw new Error('Invalid backup file format');\n }\n if (encryptedBackup.version && encryptedBackup.version !== '1.0') {\n throw new Error(`Unsupported backup version: ${encryptedBackup.version}`);\n }\n\n try {\n const decoder = new TextDecoder();\n\n // Support both old (encryptedData) and new (data) field names for backward compatibility\n const dataField = encryptedBackup.data || encryptedBackup.encryptedData;\n\n // Only decode base64 fields that we know are encrypted\n // Ignore additional metadata fields like userId, createdAt, etc.\n if (!encryptedBackup.salt || !encryptedBackup.iv || !dataField) {\n console.error('[iframe][decryptKeyshare] Backup structure:', Object.keys(encryptedBackup));\n throw new Error('Missing required encrypted backup fields (salt, iv, data/encryptedData)');\n }\n\n const salt = base64ToBytes(encryptedBackup.salt);\n const iv = base64ToBytes(encryptedBackup.iv);\n const encryptedData = base64ToBytes(dataField);\n\n // Derive key from password using PBKDF2 with 100,000 iterations (for file backups)\n const encoder = new TextEncoder();\n const passwordKey = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits']\n );\n\n const keyMaterial = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations: 100000, // File backups use 100,000 iterations\n hash: 'SHA-256',\n },\n passwordKey,\n 256\n );\n\n const key = await crypto.subtle.importKey(\n 'raw',\n keyMaterial,\n 'AES-GCM',\n false,\n ['decrypt']\n );\n\n const decryptedData = await crypto.subtle.decrypt(\n { name: 'AES-GCM', iv },\n key,\n encryptedData\n );\n\n const plaintext = decoder.decode(decryptedData);\n const backupData = JSON.parse(plaintext) as KeyshareBackupData;\n\n // Verify checksum if present\n if (encryptedBackup.checksum) {\n const expected = `${backupData.userId}:${backupData.sessionId}:${encryptedBackup.encryptionMethod || 'password'}`;\n const expectedBuf = await crypto.subtle.digest('SHA-256', encoder.encode(expected));\n const expectedChecksum = bytesToBase64(new Uint8Array(expectedBuf));\n\n if (expectedChecksum !== encryptedBackup.checksum) {\n throw new Error('Backup integrity check failed - file may be corrupted or tampered with');\n }\n }\n\n console.log('[iframe][decryptKeyshare] File backup decrypted successfully');\n return backupData;\n } catch (error: any) {\n const message = error?.message || String(error);\n const name = error?.name || 'Error';\n\n if (name === 'OperationError' || message.includes('decrypt')) {\n throw new Error('Incorrect password - unable to decrypt backup file');\n }\n if (error instanceof SyntaxError || message.includes('JSON')) {\n throw new Error('Corrupted backup file - decryption succeeded but data is invalid');\n }\n\n throw new Error(`Failed to decrypt backup: ${message}`);\n }\n}\n","/**\n * Server backup operations using ShareVault API\n */\n\nimport type { KeyshareBackupData } from '../types';\nimport type { TokenRefreshApiClient } from '../token-refresh-client';\nimport { envelopeEncryptKeyshare, envelopeEncryptKeyshareWithPassword } from './crypto-utils';\n\nconst SHARE_VAULT_URL =\n (typeof (window as any).__LUMIA_SERVICES__ !== 'undefined' &&\n (window as any).__LUMIA_SERVICES__?.shareVaultUrl) ||\n 'https://api.lumiapassport.com/vault';\n\nconst TSS_URL =\n (typeof (window as any).__LUMIA_SERVICES__ !== 'undefined' &&\n (window as any).__LUMIA_SERVICES__?.tssUrl) ||\n 'https://api.lumiapassport.com/tss';\n\n/**\n * Get ShareVault token from TSS\n */\nasync function getShareVaultToken(scopes: string[], accessToken?: string): Promise<string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add Authorization header if token is provided\n if (accessToken) {\n headers['Authorization'] = `Bearer ${accessToken}`;\n }\n\n const response = await fetch(`${TSS_URL}/api/auth/token/exchange`, {\n method: 'POST',\n headers,\n credentials: 'include',\n body: JSON.stringify({\n scopes,\n audience: 'lumia-passport-share-vault-service',\n ttl: 300,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to get Share Vault token: ${response.status}`);\n }\n\n const data = await response.json();\n if (!data?.resourceToken) {\n throw new Error('Invalid token response');\n }\n\n return data.resourceToken;\n}\n\n/**\n * Upload encrypted share to ShareVault\n */\nasync function uploadShareToVault(encryptedShare: any, accessToken?: string): Promise<void> {\n const token = await getShareVaultToken(['share:put'], accessToken);\n const idempotencyKey = crypto.randomUUID ? crypto.randomUUID() : `backup-${Date.now()}`;\n\n const response = await fetch(`${SHARE_VAULT_URL}/v1/shares/me`, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${token}`,\n 'Idempotency-Key': idempotencyKey,\n },\n body: JSON.stringify(encryptedShare),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Failed to upload share: ${response.status} ${response.statusText} - ${errorText}`);\n }\n}\n\n/**\n * Backup keyshare to server using ShareVault API\n */\nexport async function backupToServer(\n data: KeyshareBackupData,\n tokenClient: TokenRefreshApiClient,\n password?: string,\n accessToken?: string\n): Promise<void> {\n let encryptedShare: any;\n\n if (password) {\n encryptedShare = await envelopeEncryptKeyshareWithPassword(data, password);\n } else {\n encryptedShare = await envelopeEncryptKeyshare(data, data.userId);\n }\n\n await uploadShareToVault(encryptedShare, accessToken);\n}\n\n/**\n * Download encrypted share from ShareVault\n */\nasync function downloadShareFromVault(accessToken?: string): Promise<any> {\n const token = await getShareVaultToken(['share:get'], accessToken);\n\n const response = await fetch(`${SHARE_VAULT_URL}/v1/shares/me`, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'X-Client-Device-Id': 'lumia-ui-kit',\n 'X-Client-Device-Name': 'Lumia UI Kit',\n },\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error('No backup found on server for this user');\n }\n const errorText = await response.text();\n throw new Error(`Failed to download share: ${response.status} ${response.statusText} - ${errorText}`);\n }\n\n const envelope = await response.json();\n if (!envelope.ciphertext_share || !envelope.wrapped_dek || !envelope.kdf || !envelope.alg || !envelope.aad) {\n throw new Error('Invalid envelope structure received from Share Vault');\n }\n\n return envelope;\n}\n\n/**\n * Restore keyshare from server using ShareVault API\n */\nexport async function restoreFromServer(\n userId: string,\n tokenClient: TokenRefreshApiClient,\n password?: string,\n accessToken?: string\n): Promise<KeyshareBackupData> {\n console.log('[iframe][restoreFromServer] Starting restore for userId:', userId);\n console.log('[iframe][restoreFromServer] Using password:', !!password);\n\n // Download encrypted share from vault\n console.log('[iframe][restoreFromServer] Downloading share from vault...');\n const envelope = await downloadShareFromVault(accessToken);\n\n console.log('[iframe][restoreFromServer] Envelope encryption method:', envelope.encryptionMethod);\n\n // Import decrypt functions from crypto-utils\n const { envelopeDecryptKeyshare, envelopeDecryptKeyshareWithPassword } = await import('./crypto-utils');\n\n // Decrypt based on encryption method or user preference\n const backupData = password\n ? await envelopeDecryptKeyshareWithPassword(envelope, password)\n : await envelopeDecryptKeyshare(envelope, userId);\n\n if (backupData.userId !== userId) {\n throw new Error('Server backup does not match current user');\n }\n\n console.log('[iframe][restoreFromServer] Decryption successful, returning backup data');\n return backupData;\n}\n","/**\n * Local file backup operations\n */\n\nimport type { KeyshareBackupData } from '../types';\nimport { encryptKeyshare, deriveBackupPasswordFromPasskey } from './crypto-utils';\n\n/**\n * Backup keyshare to local file (download as JSON)\n */\nexport async function backupToLocalFile(\n data: KeyshareBackupData,\n password?: string\n): Promise<void> {\n let encryptionPassword = password;\n let credentialId: string | undefined;\n\n if (!encryptionPassword) {\n const result = await deriveBackupPasswordFromPasskey(data.userId);\n encryptionPassword = result.password;\n credentialId = result.credentialId;\n }\n\n const encrypted = await encryptKeyshare(\n data,\n encryptionPassword,\n password ? 'password' : 'passkey',\n credentialId\n );\n\n const backupData = {\n ...encrypted,\n userId: data.userId,\n createdAt: data.createdAt,\n };\n\n const blob = new Blob([JSON.stringify(backupData, null, 2)], {\n type: 'application/json',\n });\n\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `lumia-passport-backup-${data.userId}-${Date.now()}.json`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n}\n\n/**\n * Restore keyshare from local file\n */\nexport async function restoreFromLocalFile(\n fileContent: string,\n userId: string,\n password?: string\n): Promise<KeyshareBackupData> {\n console.log('[iframe][restoreFromLocalFile] Starting restore from local file');\n\n const encryptedBackup = JSON.parse(fileContent);\n\n let decryptionPassword: string;\n let credentialId: string | undefined;\n\n if (password) {\n // Use provided password\n decryptionPassword = password;\n } else {\n // Use passkey-derived password, with specific credentialId if available\n const credentialIdFromBackup =\n encryptedBackup.encryptionMethod === 'passkey'\n ? encryptedBackup.credentialId\n : undefined;\n const result = await deriveBackupPasswordFromPasskey(\n userId,\n credentialIdFromBackup\n ).catch(() => {\n throw new Error(\n 'Restore requires either password or passkey authentication'\n );\n });\n decryptionPassword = result.password;\n credentialId = result.credentialId;\n }\n\n // Import decrypt function\n const { decryptKeyshare } = await import('./crypto-utils');\n const backupData = await decryptKeyshare(encryptedBackup, decryptionPassword);\n\n if (backupData.userId !== userId) {\n throw new Error('Backup file does not match current user');\n }\n\n console.log('[iframe][restoreFromLocalFile] Restore successful');\n return backupData;\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\n\nexport type IsHexErrorType = ErrorType\n\nexport function isHex(\n value: unknown,\n { strict = true }: { strict?: boolean | undefined } = {},\n): value is Hex {\n if (!value) return false\n if (typeof value !== 'string') return false\n return strict ? /^0x[0-9a-fA-F]*$/.test(value) : value.startsWith('0x')\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\n\nimport { type IsHexErrorType, isHex } from './isHex.js'\n\nexport type SizeErrorType = IsHexErrorType | ErrorType\n\n/**\n * @description Retrieves the size of the value (in bytes).\n *\n * @param value The value (hex or byte array) to retrieve the size of.\n * @returns The size of the value (in bytes).\n */\nexport function size(value: Hex | ByteArray) {\n if (isHex(value, { strict: false })) return Math.ceil((value.length - 2) / 2)\n return value.length\n}\n","export const version = '2.38.0'\n","import { version } from './version.js'\n\ntype ErrorConfig = {\n getDocsUrl?: ((args: BaseErrorParameters) => string | undefined) | undefined\n version?: string | undefined\n}\n\nlet errorConfig: ErrorConfig = {\n getDocsUrl: ({\n docsBaseUrl,\n docsPath = '',\n docsSlug,\n }: BaseErrorParameters) =>\n docsPath\n ? `${docsBaseUrl ?? 'https://viem.sh'}${docsPath}${\n docsSlug ? `#${docsSlug}` : ''\n }`\n : undefined,\n version: `viem@${version}`,\n}\n\nexport function setErrorConfig(config: ErrorConfig) {\n errorConfig = config\n}\n\ntype BaseErrorParameters = {\n cause?: BaseError | Error | undefined\n details?: string | undefined\n docsBaseUrl?: string | undefined\n docsPath?: string | undefined\n docsSlug?: string | undefined\n metaMessages?: string[] | undefined\n name?: string | undefined\n}\n\nexport type BaseErrorType = BaseError & { name: 'BaseError' }\nexport class BaseError extends Error {\n details: string\n docsPath?: string | undefined\n metaMessages?: string[] | undefined\n shortMessage: string\n version: string\n\n override name = 'BaseError'\n\n constructor(shortMessage: string, args: BaseErrorParameters = {}) {\n const details = (() => {\n if (args.cause instanceof BaseError) return args.cause.details\n if (args.cause?.message) return args.cause.message\n return args.details!\n })()\n const docsPath = (() => {\n if (args.cause instanceof BaseError)\n return args.cause.docsPath || args.docsPath\n return args.docsPath\n })()\n const docsUrl = errorConfig.getDocsUrl?.({ ...args, docsPath })\n\n const message = [\n shortMessage || 'An error occurred.',\n '',\n ...(args.metaMessages ? [...args.metaMessages, ''] : []),\n ...(docsUrl ? [`Docs: ${docsUrl}`] : []),\n ...(details ? [`Details: ${details}`] : []),\n ...(errorConfig.version ? [`Version: ${errorConfig.version}`] : []),\n ].join('\\n')\n\n super(message, args.cause ? { cause: args.cause } : undefined)\n\n this.details = details\n this.docsPath = docsPath\n this.metaMessages = args.metaMessages\n this.name = args.name ?? this.name\n this.shortMessage = shortMessage\n this.version = version\n }\n\n walk(): Error\n walk(fn: (err: unknown) => boolean): Error | null\n walk(fn?: any): any {\n return walk(this, fn)\n }\n}\n\nfunction walk(\n err: unknown,\n fn?: ((err: unknown) => boolean) | undefined,\n): unknown {\n if (fn?.(err)) return err\n if (\n err &&\n typeof err === 'object' &&\n 'cause' in err &&\n err.cause !== undefined\n )\n return walk(err.cause, fn)\n return fn ? null : err\n}\n","import { BaseError } from './base.js'\n\nexport type SliceOffsetOutOfBoundsErrorType = SliceOffsetOutOfBoundsError & {\n name: 'SliceOffsetOutOfBoundsError'\n}\nexport class SliceOffsetOutOfBoundsError extends BaseError {\n constructor({\n offset,\n position,\n size,\n }: { offset: number; position: 'start' | 'end'; size: number }) {\n super(\n `Slice ${\n position === 'start' ? 'starting' : 'ending'\n } at offset \"${offset}\" is out-of-bounds (size: ${size}).`,\n { name: 'SliceOffsetOutOfBoundsError' },\n )\n }\n}\n\nexport type SizeExceedsPaddingSizeErrorType = SizeExceedsPaddingSizeError & {\n name: 'SizeExceedsPaddingSizeError'\n}\nexport class SizeExceedsPaddingSizeError extends BaseError {\n constructor({\n size,\n targetSize,\n type,\n }: {\n size: number\n targetSize: number\n type: 'hex' | 'bytes'\n }) {\n super(\n `${type.charAt(0).toUpperCase()}${type\n .slice(1)\n .toLowerCase()} size (${size}) exceeds padding size (${targetSize}).`,\n { name: 'SizeExceedsPaddingSizeError' },\n )\n }\n}\n\nexport type InvalidBytesLengthErrorType = InvalidBytesLengthError & {\n name: 'InvalidBytesLengthError'\n}\nexport class InvalidBytesLengthError extends BaseError {\n constructor({\n size,\n targetSize,\n type,\n }: {\n size: number\n targetSize: number\n type: 'hex' | 'bytes'\n }) {\n super(\n `${type.charAt(0).toUpperCase()}${type\n .slice(1)\n .toLowerCase()} is expected to be ${targetSize} ${type} long, but is ${size} ${type} long.`,\n { name: 'InvalidBytesLengthError' },\n )\n }\n}\n","import {\n SizeExceedsPaddingSizeError,\n type SizeExceedsPaddingSizeErrorType,\n} from '../../errors/data.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\n\ntype PadOptions = {\n dir?: 'left' | 'right' | undefined\n size?: number | null | undefined\n}\nexport type PadReturnType<value extends ByteArray | Hex> = value extends Hex\n ? Hex\n : ByteArray\n\nexport type PadErrorType = PadHexErrorType | PadBytesErrorType | ErrorType\n\nexport function pad<value extends ByteArray | Hex>(\n hexOrBytes: value,\n { dir, size = 32 }: PadOptions = {},\n): PadReturnType<value> {\n if (typeof hexOrBytes === 'string')\n return padHex(hexOrBytes, { dir, size }) as PadReturnType<value>\n return padBytes(hexOrBytes, { dir, size }) as PadReturnType<value>\n}\n\nexport type PadHexErrorType = SizeExceedsPaddingSizeErrorType | ErrorType\n\nexport function padHex(hex_: Hex, { dir, size = 32 }: PadOptions = {}) {\n if (size === null) return hex_\n const hex = hex_.replace('0x', '')\n if (hex.length > size * 2)\n throw new SizeExceedsPaddingSizeError({\n size: Math.ceil(hex.length / 2),\n targetSize: size,\n type: 'hex',\n })\n\n return `0x${hex[dir === 'right' ? 'padEnd' : 'padStart'](\n size * 2,\n '0',\n )}` as Hex\n}\n\nexport type PadBytesErrorType = SizeExceedsPaddingSizeErrorType | ErrorType\n\nexport function padBytes(\n bytes: ByteArray,\n { dir, size = 32 }: PadOptions = {},\n) {\n if (size === null) return bytes\n if (bytes.length > size)\n throw new SizeExceedsPaddingSizeError({\n size: bytes.length,\n targetSize: size,\n type: 'bytes',\n })\n const paddedBytes = new Uint8Array(size)\n for (let i = 0; i < size; i++) {\n const padEnd = dir === 'right'\n paddedBytes[padEnd ? i : size - i - 1] =\n bytes[padEnd ? i : bytes.length - i - 1]\n }\n return paddedBytes\n}\n","import type { ByteArray, Hex } from '../types/misc.js'\n\nimport { BaseError } from './base.js'\n\nexport type IntegerOutOfRangeErrorType = IntegerOutOfRangeError & {\n name: 'IntegerOutOfRangeError'\n}\nexport class IntegerOutOfRangeError extends BaseError {\n constructor({\n max,\n min,\n signed,\n size,\n value,\n }: {\n max?: string | undefined\n min: string\n signed?: boolean | undefined\n size?: number | undefined\n value: string\n }) {\n super(\n `Number \"${value}\" is not in safe ${\n size ? `${size * 8}-bit ${signed ? 'signed' : 'unsigned'} ` : ''\n }integer range ${max ? `(${min} to ${max})` : `(above ${min})`}`,\n { name: 'IntegerOutOfRangeError' },\n )\n }\n}\n\nexport type InvalidBytesBooleanErrorType = InvalidBytesBooleanError & {\n name: 'InvalidBytesBooleanError'\n}\nexport class InvalidBytesBooleanError extends BaseError {\n constructor(bytes: ByteArray) {\n super(\n `Bytes value \"${bytes}\" is not a valid boolean. The bytes array must contain a single byte of either a 0 or 1 value.`,\n {\n name: 'InvalidBytesBooleanError',\n },\n )\n }\n}\n\nexport type InvalidHexBooleanErrorType = InvalidHexBooleanError & {\n name: 'InvalidHexBooleanError'\n}\nexport class InvalidHexBooleanError extends BaseError {\n constructor(hex: Hex) {\n super(\n `Hex value \"${hex}\" is not a valid boolean. The hex value must be \"0x0\" (false) or \"0x1\" (true).`,\n { name: 'InvalidHexBooleanError' },\n )\n }\n}\n\nexport type InvalidHexValueErrorType = InvalidHexValueError & {\n name: 'InvalidHexValueError'\n}\nexport class InvalidHexValueError extends BaseError {\n constructor(value: Hex) {\n super(\n `Hex value \"${value}\" is an odd length (${value.length}). It must be an even length.`,\n { name: 'InvalidHexValueError' },\n )\n }\n}\n\nexport type SizeOverflowErrorType = SizeOverflowError & {\n name: 'SizeOverflowError'\n}\nexport class SizeOverflowError extends BaseError {\n constructor({ givenSize, maxSize }: { givenSize: number; maxSize: number }) {\n super(\n `Size cannot exceed ${maxSize} bytes. Given size: ${givenSize} bytes.`,\n { name: 'SizeOverflowError' },\n )\n }\n}\n","import {\n InvalidHexBooleanError,\n type InvalidHexBooleanErrorType,\n SizeOverflowError,\n type SizeOverflowErrorType,\n} from '../../errors/encoding.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type SizeErrorType, size as size_ } from '../data/size.js'\nimport { type TrimErrorType, trim } from '../data/trim.js'\n\nimport { type HexToBytesErrorType, hexToBytes } from './toBytes.js'\n\nexport type AssertSizeErrorType =\n | SizeOverflowErrorType\n | SizeErrorType\n | ErrorType\n\nexport function assertSize(\n hexOrBytes: Hex | ByteArray,\n { size }: { size: number },\n): void {\n if (size_(hexOrBytes) > size)\n throw new SizeOverflowError({\n givenSize: size_(hexOrBytes),\n maxSize: size,\n })\n}\n\nexport type FromHexParameters<\n to extends 'string' | 'bigint' | 'number' | 'bytes' | 'boolean',\n> =\n | to\n | {\n /** Size (in bytes) of the hex value. */\n size?: number | undefined\n /** Type to convert to. */\n to: to\n }\n\nexport type FromHexReturnType<to> = to extends 'string'\n ? string\n : to extends 'bigint'\n ? bigint\n : to extends 'number'\n ? number\n : to extends 'bytes'\n ? ByteArray\n : to extends 'boolean'\n ? boolean\n : never\n\nexport type FromHexErrorType =\n | HexToNumberErrorType\n | HexToBigIntErrorType\n | HexToBoolErrorType\n | HexToStringErrorType\n | HexToBytesErrorType\n | ErrorType\n\n/**\n * Decodes a hex string into a string, number, bigint, boolean, or byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex\n * - Example: https://viem.sh/docs/utilities/fromHex#usage\n *\n * @param hex Hex string to decode.\n * @param toOrOpts Type to convert to or options.\n * @returns Decoded value.\n *\n * @example\n * import { fromHex } from 'viem'\n * const data = fromHex('0x1a4', 'number')\n * // 420\n *\n * @example\n * import { fromHex } from 'viem'\n * const data = fromHex('0x48656c6c6f20576f726c6421', 'string')\n * // 'Hello world'\n *\n * @example\n * import { fromHex } from 'viem'\n * const data = fromHex('0x48656c6c6f20576f726c64210000000000000000000000000000000000000000', {\n * size: 32,\n * to: 'string'\n * })\n * // 'Hello world'\n */\nexport function fromHex<\n to extends 'string' | 'bigint' | 'number' | 'bytes' | 'boolean',\n>(hex: Hex, toOrOpts: FromHexParameters<to>): FromHexReturnType<to> {\n const opts = typeof toOrOpts === 'string' ? { to: toOrOpts } : toOrOpts\n const to = opts.to\n\n if (to === 'number') return hexToNumber(hex, opts) as FromHexReturnType<to>\n if (to === 'bigint') return hexToBigInt(hex, opts) as FromHexReturnType<to>\n if (to === 'string') return hexToString(hex, opts) as FromHexReturnType<to>\n if (to === 'boolean') return hexToBool(hex, opts) as FromHexReturnType<to>\n return hexToBytes(hex, opts) as FromHexReturnType<to>\n}\n\nexport type HexToBigIntOpts = {\n /** Whether or not the number of a signed representation. */\n signed?: boolean | undefined\n /** Size (in bytes) of the hex value. */\n size?: number | undefined\n}\n\nexport type HexToBigIntErrorType = AssertSizeErrorType | ErrorType\n\n/**\n * Decodes a hex value into a bigint.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex#hextobigint\n *\n * @param hex Hex value to decode.\n * @param opts Options.\n * @returns BigInt value.\n *\n * @example\n * import { hexToBigInt } from 'viem'\n * const data = hexToBigInt('0x1a4', { signed: true })\n * // 420n\n *\n * @example\n * import { hexToBigInt } from 'viem'\n * const data = hexToBigInt('0x00000000000000000000000000000000000000000000000000000000000001a4', { size: 32 })\n * // 420n\n */\nexport function hexToBigInt(hex: Hex, opts: HexToBigIntOpts = {}): bigint {\n const { signed } = opts\n\n if (opts.size) assertSize(hex, { size: opts.size })\n\n const value = BigInt(hex)\n if (!signed) return value\n\n const size = (hex.length - 2) / 2\n const max = (1n << (BigInt(size) * 8n - 1n)) - 1n\n if (value <= max) return value\n\n return value - BigInt(`0x${'f'.padStart(size * 2, 'f')}`) - 1n\n}\n\nexport type HexToBoolOpts = {\n /** Size (in bytes) of the hex value. */\n size?: number | undefined\n}\n\nexport type HexToBoolErrorType =\n | AssertSizeErrorType\n | InvalidHexBooleanErrorType\n | TrimErrorType\n | ErrorType\n\n/**\n * Decodes a hex value into a boolean.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex#hextobool\n *\n * @param hex Hex value to decode.\n * @param opts Options.\n * @returns Boolean value.\n *\n * @example\n * import { hexToBool } from 'viem'\n * const data = hexToBool('0x01')\n * // true\n *\n * @example\n * import { hexToBool } from 'viem'\n * const data = hexToBool('0x0000000000000000000000000000000000000000000000000000000000000001', { size: 32 })\n * // true\n */\nexport function hexToBool(hex_: Hex, opts: HexToBoolOpts = {}): boolean {\n let hex = hex_\n if (opts.size) {\n assertSize(hex, { size: opts.size })\n hex = trim(hex)\n }\n if (trim(hex) === '0x00') return false\n if (trim(hex) === '0x01') return true\n throw new InvalidHexBooleanError(hex)\n}\n\nexport type HexToNumberOpts = HexToBigIntOpts\n\nexport type HexToNumberErrorType = HexToBigIntErrorType | ErrorType\n\n/**\n * Decodes a hex string into a number.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex#hextonumber\n *\n * @param hex Hex value to decode.\n * @param opts Options.\n * @returns Number value.\n *\n * @example\n * import { hexToNumber } from 'viem'\n * const data = hexToNumber('0x1a4')\n * // 420\n *\n * @example\n * import { hexToNumber } from 'viem'\n * const data = hexToBigInt('0x00000000000000000000000000000000000000000000000000000000000001a4', { size: 32 })\n * // 420\n */\nexport function hexToNumber(hex: Hex, opts: HexToNumberOpts = {}): number {\n return Number(hexToBigInt(hex, opts))\n}\n\nexport type HexToStringOpts = {\n /** Size (in bytes) of the hex value. */\n size?: number | undefined\n}\n\nexport type HexToStringErrorType =\n | AssertSizeErrorType\n | HexToBytesErrorType\n | TrimErrorType\n | ErrorType\n\n/**\n * Decodes a hex value into a UTF-8 string.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex#hextostring\n *\n * @param hex Hex value to decode.\n * @param opts Options.\n * @returns String value.\n *\n * @example\n * import { hexToString } from 'viem'\n * const data = hexToString('0x48656c6c6f20576f726c6421')\n * // 'Hello world!'\n *\n * @example\n * import { hexToString } from 'viem'\n * const data = hexToString('0x48656c6c6f20576f726c64210000000000000000000000000000000000000000', {\n * size: 32,\n * })\n * // 'Hello world'\n */\nexport function hexToString(hex: Hex, opts: HexToStringOpts = {}): string {\n let bytes = hexToBytes(hex)\n if (opts.size) {\n assertSize(bytes, { size: opts.size })\n bytes = trim(bytes, { dir: 'right' })\n }\n return new TextDecoder().decode(bytes)\n}\n","import {\n IntegerOutOfRangeError,\n type IntegerOutOfRangeErrorType,\n} from '../../errors/encoding.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type PadErrorType, pad } from '../data/pad.js'\n\nimport { type AssertSizeErrorType, assertSize } from './fromHex.js'\n\nconst hexes = /*#__PURE__*/ Array.from({ length: 256 }, (_v, i) =>\n i.toString(16).padStart(2, '0'),\n)\n\nexport type ToHexParameters = {\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n}\n\nexport type ToHexErrorType =\n | BoolToHexErrorType\n | BytesToHexErrorType\n | NumberToHexErrorType\n | StringToHexErrorType\n | ErrorType\n\n/**\n * Encodes a string, number, bigint, or ByteArray into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex\n * - Example: https://viem.sh/docs/utilities/toHex#usage\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { toHex } from 'viem'\n * const data = toHex('Hello world')\n * // '0x48656c6c6f20776f726c6421'\n *\n * @example\n * import { toHex } from 'viem'\n * const data = toHex(420)\n * // '0x1a4'\n *\n * @example\n * import { toHex } from 'viem'\n * const data = toHex('Hello world', { size: 32 })\n * // '0x48656c6c6f20776f726c64210000000000000000000000000000000000000000'\n */\nexport function toHex(\n value: string | number | bigint | boolean | ByteArray,\n opts: ToHexParameters = {},\n): Hex {\n if (typeof value === 'number' || typeof value === 'bigint')\n return numberToHex(value, opts)\n if (typeof value === 'string') {\n return stringToHex(value, opts)\n }\n if (typeof value === 'boolean') return boolToHex(value, opts)\n return bytesToHex(value, opts)\n}\n\nexport type BoolToHexOpts = {\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n}\n\nexport type BoolToHexErrorType = AssertSizeErrorType | PadErrorType | ErrorType\n\n/**\n * Encodes a boolean into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex#booltohex\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { boolToHex } from 'viem'\n * const data = boolToHex(true)\n * // '0x1'\n *\n * @example\n * import { boolToHex } from 'viem'\n * const data = boolToHex(false)\n * // '0x0'\n *\n * @example\n * import { boolToHex } from 'viem'\n * const data = boolToHex(true, { size: 32 })\n * // '0x0000000000000000000000000000000000000000000000000000000000000001'\n */\nexport function boolToHex(value: boolean, opts: BoolToHexOpts = {}): Hex {\n const hex: Hex = `0x${Number(value)}`\n if (typeof opts.size === 'number') {\n assertSize(hex, { size: opts.size })\n return pad(hex, { size: opts.size })\n }\n return hex\n}\n\nexport type BytesToHexOpts = {\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n}\n\nexport type BytesToHexErrorType = AssertSizeErrorType | PadErrorType | ErrorType\n\n/**\n * Encodes a bytes array into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex#bytestohex\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { bytesToHex } from 'viem'\n * const data = bytesToHex(Uint8Array.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])\n * // '0x48656c6c6f20576f726c6421'\n *\n * @example\n * import { bytesToHex } from 'viem'\n * const data = bytesToHex(Uint8Array.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]), { size: 32 })\n * // '0x48656c6c6f20576f726c64210000000000000000000000000000000000000000'\n */\nexport function bytesToHex(value: ByteArray, opts: BytesToHexOpts = {}): Hex {\n let string = ''\n for (let i = 0; i < value.length; i++) {\n string += hexes[value[i]]\n }\n const hex = `0x${string}` as const\n\n if (typeof opts.size === 'number') {\n assertSize(hex, { size: opts.size })\n return pad(hex, { dir: 'right', size: opts.size })\n }\n return hex\n}\n\nexport type NumberToHexOpts =\n | {\n /** Whether or not the number of a signed representation. */\n signed?: boolean | undefined\n /** The size (in bytes) of the output hex value. */\n size: number\n }\n | {\n signed?: undefined\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n }\n\nexport type NumberToHexErrorType =\n | IntegerOutOfRangeErrorType\n | PadErrorType\n | ErrorType\n\n/**\n * Encodes a number or bigint into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex#numbertohex\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { numberToHex } from 'viem'\n * const data = numberToHex(420)\n * // '0x1a4'\n *\n * @example\n * import { numberToHex } from 'viem'\n * const data = numberToHex(420, { size: 32 })\n * // '0x00000000000000000000000000000000000000000000000000000000000001a4'\n */\nexport function numberToHex(\n value_: number | bigint,\n opts: NumberToHexOpts = {},\n): Hex {\n const { signed, size } = opts\n\n const value = BigInt(value_)\n\n let maxValue: bigint | number | undefined\n if (size) {\n if (signed) maxValue = (1n << (BigInt(size) * 8n - 1n)) - 1n\n else maxValue = 2n ** (BigInt(size) * 8n) - 1n\n } else if (typeof value_ === 'number') {\n maxValue = BigInt(Number.MAX_SAFE_INTEGER)\n }\n\n const minValue = typeof maxValue === 'bigint' && signed ? -maxValue - 1n : 0\n\n if ((maxValue && value > maxValue) || value < minValue) {\n const suffix = typeof value_ === 'bigint' ? 'n' : ''\n throw new IntegerOutOfRangeError({\n max: maxValue ? `${maxValue}${suffix}` : undefined,\n min: `${minValue}${suffix}`,\n signed,\n size,\n value: `${value_}${suffix}`,\n })\n }\n\n const hex = `0x${(\n signed && value < 0 ? (1n << BigInt(size * 8)) + BigInt(value) : value\n ).toString(16)}` as Hex\n if (size) return pad(hex, { size }) as Hex\n return hex\n}\n\nexport type StringToHexOpts = {\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n}\n\nexport type StringToHexErrorType = BytesToHexErrorType | ErrorType\n\nconst encoder = /*#__PURE__*/ new TextEncoder()\n\n/**\n * Encodes a UTF-8 string into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex#stringtohex\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { stringToHex } from 'viem'\n * const data = stringToHex('Hello World!')\n * // '0x48656c6c6f20576f726c6421'\n *\n * @example\n * import { stringToHex } from 'viem'\n * const data = stringToHex('Hello World!', { size: 32 })\n * // '0x48656c6c6f20576f726c64210000000000000000000000000000000000000000'\n */\nexport function stringToHex(value_: string, opts: StringToHexOpts = {}): Hex {\n const value = encoder.encode(value_)\n return bytesToHex(value, opts)\n}\n","import { BaseError } from '../../errors/base.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type IsHexErrorType, isHex } from '../data/isHex.js'\nimport { type PadErrorType, pad } from '../data/pad.js'\n\nimport { type AssertSizeErrorType, assertSize } from './fromHex.js'\nimport {\n type NumberToHexErrorType,\n type NumberToHexOpts,\n numberToHex,\n} from './toHex.js'\n\nconst encoder = /*#__PURE__*/ new TextEncoder()\n\nexport type ToBytesParameters = {\n /** Size of the output bytes. */\n size?: number | undefined\n}\n\nexport type ToBytesErrorType =\n | NumberToBytesErrorType\n | BoolToBytesErrorType\n | HexToBytesErrorType\n | StringToBytesErrorType\n | IsHexErrorType\n | ErrorType\n\n/**\n * Encodes a UTF-8 string, hex value, bigint, number or boolean to a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes\n * - Example: https://viem.sh/docs/utilities/toBytes#usage\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { toBytes } from 'viem'\n * const data = toBytes('Hello world')\n * // Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])\n *\n * @example\n * import { toBytes } from 'viem'\n * const data = toBytes(420)\n * // Uint8Array([1, 164])\n *\n * @example\n * import { toBytes } from 'viem'\n * const data = toBytes(420, { size: 4 })\n * // Uint8Array([0, 0, 1, 164])\n */\nexport function toBytes(\n value: string | bigint | number | boolean | Hex,\n opts: ToBytesParameters = {},\n): ByteArray {\n if (typeof value === 'number' || typeof value === 'bigint')\n return numberToBytes(value, opts)\n if (typeof value === 'boolean') return boolToBytes(value, opts)\n if (isHex(value)) return hexToBytes(value, opts)\n return stringToBytes(value, opts)\n}\n\nexport type BoolToBytesOpts = {\n /** Size of the output bytes. */\n size?: number | undefined\n}\n\nexport type BoolToBytesErrorType =\n | AssertSizeErrorType\n | PadErrorType\n | ErrorType\n\n/**\n * Encodes a boolean into a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes#booltobytes\n *\n * @param value Boolean value to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { boolToBytes } from 'viem'\n * const data = boolToBytes(true)\n * // Uint8Array([1])\n *\n * @example\n * import { boolToBytes } from 'viem'\n * const data = boolToBytes(true, { size: 32 })\n * // Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1])\n */\nexport function boolToBytes(value: boolean, opts: BoolToBytesOpts = {}) {\n const bytes = new Uint8Array(1)\n bytes[0] = Number(value)\n if (typeof opts.size === 'number') {\n assertSize(bytes, { size: opts.size })\n return pad(bytes, { size: opts.size })\n }\n return bytes\n}\n\n// We use very optimized technique to convert hex string to byte array\nconst charCodeMap = {\n zero: 48,\n nine: 57,\n A: 65,\n F: 70,\n a: 97,\n f: 102,\n} as const\n\nfunction charCodeToBase16(char: number) {\n if (char >= charCodeMap.zero && char <= charCodeMap.nine)\n return char - charCodeMap.zero\n if (char >= charCodeMap.A && char <= charCodeMap.F)\n return char - (charCodeMap.A - 10)\n if (char >= charCodeMap.a && char <= charCodeMap.f)\n return char - (charCodeMap.a - 10)\n return undefined\n}\n\nexport type HexToBytesOpts = {\n /** Size of the output bytes. */\n size?: number | undefined\n}\n\nexport type HexToBytesErrorType = AssertSizeErrorType | PadErrorType | ErrorType\n\n/**\n * Encodes a hex string into a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes#hextobytes\n *\n * @param hex Hex string to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { hexToBytes } from 'viem'\n * const data = hexToBytes('0x48656c6c6f20776f726c6421')\n * // Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])\n *\n * @example\n * import { hexToBytes } from 'viem'\n * const data = hexToBytes('0x48656c6c6f20776f726c6421', { size: 32 })\n * // Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])\n */\nexport function hexToBytes(hex_: Hex, opts: HexToBytesOpts = {}): ByteArray {\n let hex = hex_\n if (opts.size) {\n assertSize(hex, { size: opts.size })\n hex = pad(hex, { dir: 'right', size: opts.size })\n }\n\n let hexString = hex.slice(2) as string\n if (hexString.length % 2) hexString = `0${hexString}`\n\n const length = hexString.length / 2\n const bytes = new Uint8Array(length)\n for (let index = 0, j = 0; index < length; index++) {\n const nibbleLeft = charCodeToBase16(hexString.charCodeAt(j++))\n const nibbleRight = charCodeToBase16(hexString.charCodeAt(j++))\n if (nibbleLeft === undefined || nibbleRight === undefined) {\n throw new BaseError(\n `Invalid byte sequence (\"${hexString[j - 2]}${\n hexString[j - 1]\n }\" in \"${hexString}\").`,\n )\n }\n bytes[index] = nibbleLeft * 16 + nibbleRight\n }\n return bytes\n}\n\nexport type NumberToBytesErrorType =\n | NumberToHexErrorType\n | HexToBytesErrorType\n | ErrorType\n\n/**\n * Encodes a number into a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes#numbertobytes\n *\n * @param value Number to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { numberToBytes } from 'viem'\n * const data = numberToBytes(420)\n * // Uint8Array([1, 164])\n *\n * @example\n * import { numberToBytes } from 'viem'\n * const data = numberToBytes(420, { size: 4 })\n * // Uint8Array([0, 0, 1, 164])\n */\nexport function numberToBytes(\n value: bigint | number,\n opts?: NumberToHexOpts | undefined,\n) {\n const hex = numberToHex(value, opts)\n return hexToBytes(hex)\n}\n\nexport type StringToBytesOpts = {\n /** Size of the output bytes. */\n size?: number | undefined\n}\n\nexport type StringToBytesErrorType =\n | AssertSizeErrorType\n | PadErrorType\n | ErrorType\n\n/**\n * Encodes a UTF-8 string into a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes#stringtobytes\n *\n * @param value String to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { stringToBytes } from 'viem'\n * const data = stringToBytes('Hello world!')\n * // Uint8Array([72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 33])\n *\n * @example\n * import { stringToBytes } from 'viem'\n * const data = stringToBytes('Hello world!', { size: 32 })\n * // Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])\n */\nexport function stringToBytes(\n value: string,\n opts: StringToBytesOpts = {},\n): ByteArray {\n const bytes = encoder.encode(value)\n if (typeof opts.size === 'number') {\n assertSize(bytes, { size: opts.size })\n return pad(bytes, { dir: 'right', size: opts.size })\n }\n return bytes\n}\n","/**\n * Internal helpers for u64. BigUint64Array is too slow as per 2025, so we implement it using Uint32Array.\n * @todo re-check https://issues.chromium.org/issues/42212588\n * @module\n */\nconst U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\n\nfunction fromBig(\n n: bigint,\n le = false\n): {\n h: number;\n l: number;\n} {\n if (le) return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\n\nfunction split(lst: bigint[], le = false): Uint32Array[] {\n const len = lst.length;\n let Ah = new Uint32Array(len);\n let Al = new Uint32Array(len);\n for (let i = 0; i < len; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\n\nconst toBig = (h: number, l: number): bigint => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h: number, _l: number, s: number): number => h >>> s;\nconst shrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h: number, l: number, s: number): number => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h: number, l: number, s: number): number => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h: number, l: number, s: number): number => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h: number, l: number): number => l;\nconst rotr32L = (h: number, _l: number): number => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h: number, l: number, s: number): number => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h: number, l: number, s: number): number => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h: number, l: number, s: number): number => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h: number, l: number, s: number): number => (h << (s - 32)) | (l >>> (64 - s));\n\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(\n Ah: number,\n Al: number,\n Bh: number,\n Bl: number\n): {\n h: number;\n l: number;\n} {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al: number, Bl: number, Cl: number): number => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low: number, Ah: number, Bh: number, Ch: number): number =>\n (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al: number, Bl: number, Cl: number, Dl: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number): number =>\n (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al: number, Bl: number, Cl: number, Dl: number, El: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number): number =>\n (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n\n// prettier-ignore\nexport {\n add, add3H, add3L, add4H, add4L, add5H, add5L, fromBig, rotlBH, rotlBL, rotlSH, rotlSL, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL, shrSH, shrSL, split, toBig\n};\n// prettier-ignore\nconst u64: { fromBig: typeof fromBig; split: typeof split; toBig: (h: number, l: number) => bigint; shrSH: (h: number, _l: number, s: number) => number; shrSL: (h: number, l: number, s: number) => number; rotrSH: (h: number, l: number, s: number) => number; rotrSL: (h: number, l: number, s: number) => number; rotrBH: (h: number, l: number, s: number) => number; rotrBL: (h: number, l: number, s: number) => number; rotr32H: (_h: number, l: number) => number; rotr32L: (h: number, _l: number) => number; rotlSH: (h: number, l: number, s: number) => number; rotlSL: (h: number, l: number, s: number) => number; rotlBH: (h: number, l: number, s: number) => number; rotlBL: (h: number, l: number, s: number) => number; add: typeof add; add3L: (Al: number, Bl: number, Cl: number) => number; add3H: (low: number, Ah: number, Bh: number, Ch: number) => number; add4L: (Al: number, Bl: number, Cl: number, Dl: number) => number; add4H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number) => number; add5H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number) => number; add5L: (Al: number, Bl: number, Cl: number, Dl: number, El: number) => number; } = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\n","/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated (2025-04-30), we can just drop the import.\nimport { crypto } from '@noble/hashes/crypto';\n\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n\n/** Asserts something is positive integer. */\nexport function anumber(n: number): void {\n if (!Number.isSafeInteger(n) || n < 0) throw new Error('positive integer expected, got ' + n);\n}\n\n/** Asserts something is Uint8Array. */\nexport function abytes(b: Uint8Array | undefined, ...lengths: number[]): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n\n/** Asserts something is hash */\nexport function ahash(h: IHash): void {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash should be wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n}\n\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance: any, checkFinished = true): void {\n if (instance.destroyed) throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished) throw new Error('Hash#digest() has already been called');\n}\n\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out: any, instance: any): void {\n abytes(out);\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('digestInto() expects output buffer of length at least ' + min);\n }\n}\n\n/** Generic type encompassing 8/16/32-byte arrays - but not 64-byte. */\n// prettier-ignore\nexport type TypedArray = Int8Array | Uint8ClampedArray | Uint8Array |\n Uint16Array | Int16Array | Uint32Array | Int32Array;\n\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr: TypedArray): Uint8Array {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr: TypedArray): Uint32Array {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays: TypedArray[]): void {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr: TypedArray): DataView {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** The rotate right (circular right shift) operation for uint32 */\nexport function rotr(word: number, shift: number): number {\n return (word << (32 - shift)) | (word >>> shift);\n}\n\n/** The rotate left (circular left shift) operation for uint32 */\nexport function rotl(word: number, shift: number): number {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE: boolean = /* @__PURE__ */ (() =>\n new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n\n/** The byte swap operation for uint32 */\nexport function byteSwap(word: number): number {\n return (\n ((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff)\n );\n}\n/** Conditionally byte swap if on a big-endian platform */\nexport const swap8IfBE: (n: number) => number = isLE\n ? (n: number) => n\n : (n: number) => byteSwap(n);\n\n/** @deprecated */\nexport const byteSwapIfBE: typeof swap8IfBE = swap8IfBE;\n/** In place byte swap for Uint32Array */\nexport function byteSwap32(arr: Uint32Array): Uint32Array {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\n\nexport const swap32IfBE: (u: Uint32Array) => Uint32Array = isLE\n ? (u: Uint32Array) => u\n : byteSwap32;\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n // @ts-ignore\n typeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) =>\n i.toString(16).padStart(2, '0')\n);\n\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin) return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 } as const;\nfunction asciiToBase16(ch: number): number | undefined {\n if (ch >= asciis._0 && ch <= asciis._9) return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F) return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f) return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex: string): Uint8Array {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin) return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2) throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nexport const nextTick = async (): Promise<void> => {};\n\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nexport async function asyncLoop(\n iters: number,\n tick: number,\n cb: (i: number) => void\n): Promise<void> {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick) continue;\n await nextTick();\n ts += diff;\n }\n}\n\n// Global symbols, but ts doesn't see them: https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * Converts string to bytes using UTF8 encoding.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nexport function utf8ToBytes(str: string): Uint8Array {\n if (typeof str !== 'string') throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\nexport function bytesToUtf8(bytes: Uint8Array): string {\n return new TextDecoder().decode(bytes);\n}\n\n/** Accepted input of hash functions. Strings are converted to byte arrays. */\nexport type Input = string | Uint8Array;\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nexport function toBytes(data: Input): Uint8Array {\n if (typeof data === 'string') data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n\n/** KDFs can accept string or Uint8Array for user convenience. */\nexport type KDFInput = string | Uint8Array;\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nexport function kdfInputToBytes(data: KDFInput): Uint8Array {\n if (typeof data === 'string') data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n\n/** Copies several Uint8Arrays into one. */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\n\ntype EmptyObj = {};\nexport function checkOpts<T1 extends EmptyObj, T2 extends EmptyObj>(\n defaults: T1,\n opts?: T2\n): T1 & T2 {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options should be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged as T1 & T2;\n}\n\n/** Hash interface. */\nexport type IHash = {\n (data: Uint8Array): Uint8Array;\n blockLen: number;\n outputLen: number;\n create: any;\n};\n\n/** For runtime check if class implements interface */\nexport abstract class Hash<T extends Hash<T>> {\n abstract blockLen: number; // Bytes per block\n abstract outputLen: number; // Bytes in output\n abstract update(buf: Input): this;\n // Writes digest into buf\n abstract digestInto(buf: Uint8Array): void;\n abstract digest(): Uint8Array;\n /**\n * Resets internal state. Makes Hash instance unusable.\n * Reset is impossible for keyed hashes if key is consumed into state. If digest is not consumed\n * by user, they will need to manually call `destroy()` when zeroing is necessary.\n */\n abstract destroy(): void;\n /**\n * Clones hash instance. Unsafe: doesn't check whether `to` is valid. Can be used as `clone()`\n * when no options are passed.\n * Reasons to use `_cloneInto` instead of clone: 1) performance 2) reuse instance => all internal\n * buffers are overwritten => causes buffer overwrite which is used for digest in some cases.\n * There are no guarantees for clean-up because it's impossible in JS.\n */\n abstract _cloneInto(to?: T): T;\n // Safe version that clones internal state\n abstract clone(): T;\n}\n\n/**\n * XOF: streaming API to read digest in chunks.\n * Same as 'squeeze' in keccak/k12 and 'seek' in blake3, but more generic name.\n * When hash used in XOF mode it is up to user to call '.destroy' afterwards, since we cannot\n * destroy state, next call can require more bytes.\n */\nexport type HashXOF<T extends Hash<T>> = Hash<T> & {\n xof(bytes: number): Uint8Array; // Read 'bytes' bytes from digest stream\n xofInto(buf: Uint8Array): Uint8Array; // read buf.length bytes from digest stream into buf\n};\n\n/** Hash function */\nexport type CHash = ReturnType<typeof createHasher>;\n/** Hash function with output */\nexport type CHashO = ReturnType<typeof createOptHasher>;\n/** XOF with output */\nexport type CHashXO = ReturnType<typeof createXOFer>;\n\n/** Wraps hash function, creating an interface on top of it */\nexport function createHasher<T extends Hash<T>>(\n hashCons: () => Hash<T>\n): {\n (msg: Input): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(): Hash<T>;\n} {\n const hashC = (msg: Input): Uint8Array => hashCons().update(toBytes(msg)).digest();\n const tmp = hashCons();\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = () => hashCons();\n return hashC;\n}\n\nexport function createOptHasher<H extends Hash<H>, T extends Object>(\n hashCons: (opts?: T) => Hash<H>\n): {\n (msg: Input, opts?: T): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(opts?: T): Hash<H>;\n} {\n const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({} as T);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: T) => hashCons(opts);\n return hashC;\n}\n\nexport function createXOFer<H extends HashXOF<H>, T extends Object>(\n hashCons: (opts?: T) => HashXOF<H>\n): {\n (msg: Input, opts?: T): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(opts?: T): HashXOF<H>;\n} {\n const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({} as T);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: T) => hashCons(opts);\n return hashC;\n}\nexport const wrapConstructor: typeof createHasher = createHasher;\nexport const wrapConstructorWithOpts: typeof createOptHasher = createOptHasher;\nexport const wrapXOFConstructorWithOpts: typeof createXOFer = createXOFer;\n\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32): Uint8Array {\n if (crypto && typeof crypto.getRandomValues === 'function') {\n return crypto.getRandomValues(new Uint8Array(bytesLength));\n }\n // Legacy Node.js compatibility\n if (crypto && typeof crypto.randomBytes === 'function') {\n return Uint8Array.from(crypto.randomBytes(bytesLength));\n }\n throw new Error('crypto.getRandomValues must be defined');\n}\n","/**\n * SHA3 (keccak) hash function, based on a new \"Sponge function\" design.\n * Different from older hashes, the internal state is bigger than output size.\n *\n * Check out [FIPS-202](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf),\n * [Website](https://keccak.team/keccak.html),\n * [the differences between SHA-3 and Keccak](https://crypto.stackexchange.com/questions/15727/what-are-the-key-differences-between-the-draft-sha-3-standard-and-the-keccak-sub).\n *\n * Check out `sha3-addons` module for cSHAKE, k12, and others.\n * @module\n */\nimport { rotlBH, rotlBL, rotlSH, rotlSL, split } from './_u64.ts';\n// prettier-ignore\nimport {\n abytes, aexists, anumber, aoutput,\n clean, createHasher, createXOFer, Hash,\n swap32IfBE,\n toBytes, u32,\n type CHash, type CHashXO, type HashXOF, type Input\n} from './utils.ts';\n\n// No __PURE__ annotations in sha3 header:\n// EVERYTHING is in fact used on every export.\n// Various per round constants calculations\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\nconst _2n = BigInt(2);\nconst _7n = BigInt(7);\nconst _256n = BigInt(256);\nconst _0x71n = BigInt(0x71);\nconst SHA3_PI: number[] = [];\nconst SHA3_ROTL: number[] = [];\nconst _SHA3_IOTA: bigint[] = [];\nfor (let round = 0, R = _1n, x = 1, y = 0; round < 24; round++) {\n // Pi\n [x, y] = [y, (2 * x + 3 * y) % 5];\n SHA3_PI.push(2 * (5 * y + x));\n // Rotational\n SHA3_ROTL.push((((round + 1) * (round + 2)) / 2) % 64);\n // Iota\n let t = _0n;\n for (let j = 0; j < 7; j++) {\n R = ((R << _1n) ^ ((R >> _7n) * _0x71n)) % _256n;\n if (R & _2n) t ^= _1n << ((_1n << /* @__PURE__ */ BigInt(j)) - _1n);\n }\n _SHA3_IOTA.push(t);\n}\nconst IOTAS = split(_SHA3_IOTA, true);\nconst SHA3_IOTA_H = IOTAS[0];\nconst SHA3_IOTA_L = IOTAS[1];\n\n// Left rotation (without 0, 32, 64)\nconst rotlH = (h: number, l: number, s: number) => (s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s));\nconst rotlL = (h: number, l: number, s: number) => (s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s));\n\n/** `keccakf1600` internal function, additionally allows to adjust round count. */\nexport function keccakP(s: Uint32Array, rounds: number = 24): void {\n const B = new Uint32Array(5 * 2);\n // NOTE: all indices are x2 since we store state as u32 instead of u64 (bigints to slow in js)\n for (let round = 24 - rounds; round < 24; round++) {\n // Theta θ\n for (let x = 0; x < 10; x++) B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];\n for (let x = 0; x < 10; x += 2) {\n const idx1 = (x + 8) % 10;\n const idx0 = (x + 2) % 10;\n const B0 = B[idx0];\n const B1 = B[idx0 + 1];\n const Th = rotlH(B0, B1, 1) ^ B[idx1];\n const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];\n for (let y = 0; y < 50; y += 10) {\n s[x + y] ^= Th;\n s[x + y + 1] ^= Tl;\n }\n }\n // Rho (ρ) and Pi (π)\n let curH = s[2];\n let curL = s[3];\n for (let t = 0; t < 24; t++) {\n const shift = SHA3_ROTL[t];\n const Th = rotlH(curH, curL, shift);\n const Tl = rotlL(curH, curL, shift);\n const PI = SHA3_PI[t];\n curH = s[PI];\n curL = s[PI + 1];\n s[PI] = Th;\n s[PI + 1] = Tl;\n }\n // Chi (χ)\n for (let y = 0; y < 50; y += 10) {\n for (let x = 0; x < 10; x++) B[x] = s[y + x];\n for (let x = 0; x < 10; x++) s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];\n }\n // Iota (ι)\n s[0] ^= SHA3_IOTA_H[round];\n s[1] ^= SHA3_IOTA_L[round];\n }\n clean(B);\n}\n\n/** Keccak sponge function. */\nexport class Keccak extends Hash<Keccak> implements HashXOF<Keccak> {\n protected state: Uint8Array;\n protected pos = 0;\n protected posOut = 0;\n protected finished = false;\n protected state32: Uint32Array;\n protected destroyed = false;\n\n public blockLen: number;\n public suffix: number;\n public outputLen: number;\n protected enableXOF = false;\n protected rounds: number;\n\n // NOTE: we accept arguments in bytes instead of bits here.\n constructor(\n blockLen: number,\n suffix: number,\n outputLen: number,\n enableXOF = false,\n rounds: number = 24\n ) {\n super();\n this.blockLen = blockLen;\n this.suffix = suffix;\n this.outputLen = outputLen;\n this.enableXOF = enableXOF;\n this.rounds = rounds;\n // Can be passed from user as dkLen\n anumber(outputLen);\n // 1600 = 5x5 matrix of 64bit. 1600 bits === 200 bytes\n // 0 < blockLen < 200\n if (!(0 < blockLen && blockLen < 200))\n throw new Error('only keccak-f1600 function is supported');\n this.state = new Uint8Array(200);\n this.state32 = u32(this.state);\n }\n clone(): Keccak {\n return this._cloneInto();\n }\n protected keccak(): void {\n swap32IfBE(this.state32);\n keccakP(this.state32, this.rounds);\n swap32IfBE(this.state32);\n this.posOut = 0;\n this.pos = 0;\n }\n update(data: Input): this {\n aexists(this);\n data = toBytes(data);\n abytes(data);\n const { blockLen, state } = this;\n const len = data.length;\n for (let pos = 0; pos < len; ) {\n const take = Math.min(blockLen - this.pos, len - pos);\n for (let i = 0; i < take; i++) state[this.pos++] ^= data[pos++];\n if (this.pos === blockLen) this.keccak();\n }\n return this;\n }\n protected finish(): void {\n if (this.finished) return;\n this.finished = true;\n const { state, suffix, pos, blockLen } = this;\n // Do the padding\n state[pos] ^= suffix;\n if ((suffix & 0x80) !== 0 && pos === blockLen - 1) this.keccak();\n state[blockLen - 1] ^= 0x80;\n this.keccak();\n }\n protected writeInto(out: Uint8Array): Uint8Array {\n aexists(this, false);\n abytes(out);\n this.finish();\n const bufferOut = this.state;\n const { blockLen } = this;\n for (let pos = 0, len = out.length; pos < len; ) {\n if (this.posOut >= blockLen) this.keccak();\n const take = Math.min(blockLen - this.posOut, len - pos);\n out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);\n this.posOut += take;\n pos += take;\n }\n return out;\n }\n xofInto(out: Uint8Array): Uint8Array {\n // Sha3/Keccak usage with XOF is probably mistake, only SHAKE instances can do XOF\n if (!this.enableXOF) throw new Error('XOF is not possible for this instance');\n return this.writeInto(out);\n }\n xof(bytes: number): Uint8Array {\n anumber(bytes);\n return this.xofInto(new Uint8Array(bytes));\n }\n digestInto(out: Uint8Array): Uint8Array {\n aoutput(out, this);\n if (this.finished) throw new Error('digest() was already called');\n this.writeInto(out);\n this.destroy();\n return out;\n }\n digest(): Uint8Array {\n return this.digestInto(new Uint8Array(this.outputLen));\n }\n destroy(): void {\n this.destroyed = true;\n clean(this.state);\n }\n _cloneInto(to?: Keccak): Keccak {\n const { blockLen, suffix, outputLen, rounds, enableXOF } = this;\n to ||= new Keccak(blockLen, suffix, outputLen, enableXOF, rounds);\n to.state32.set(this.state32);\n to.pos = this.pos;\n to.posOut = this.posOut;\n to.finished = this.finished;\n to.rounds = rounds;\n // Suffix can change in cSHAKE\n to.suffix = suffix;\n to.outputLen = outputLen;\n to.enableXOF = enableXOF;\n to.destroyed = this.destroyed;\n return to;\n }\n}\n\nconst gen = (suffix: number, blockLen: number, outputLen: number) =>\n createHasher(() => new Keccak(blockLen, suffix, outputLen));\n\n/** SHA3-224 hash function. */\nexport const sha3_224: CHash = /* @__PURE__ */ (() => gen(0x06, 144, 224 / 8))();\n/** SHA3-256 hash function. Different from keccak-256. */\nexport const sha3_256: CHash = /* @__PURE__ */ (() => gen(0x06, 136, 256 / 8))();\n/** SHA3-384 hash function. */\nexport const sha3_384: CHash = /* @__PURE__ */ (() => gen(0x06, 104, 384 / 8))();\n/** SHA3-512 hash function. */\nexport const sha3_512: CHash = /* @__PURE__ */ (() => gen(0x06, 72, 512 / 8))();\n\n/** keccak-224 hash function. */\nexport const keccak_224: CHash = /* @__PURE__ */ (() => gen(0x01, 144, 224 / 8))();\n/** keccak-256 hash function. Different from SHA3-256. */\nexport const keccak_256: CHash = /* @__PURE__ */ (() => gen(0x01, 136, 256 / 8))();\n/** keccak-384 hash function. */\nexport const keccak_384: CHash = /* @__PURE__ */ (() => gen(0x01, 104, 384 / 8))();\n/** keccak-512 hash function. */\nexport const keccak_512: CHash = /* @__PURE__ */ (() => gen(0x01, 72, 512 / 8))();\n\nexport type ShakeOpts = { dkLen?: number };\n\nconst genShake = (suffix: number, blockLen: number, outputLen: number) =>\n createXOFer<HashXOF<Keccak>, ShakeOpts>(\n (opts: ShakeOpts = {}) =>\n new Keccak(blockLen, suffix, opts.dkLen === undefined ? outputLen : opts.dkLen, true)\n );\n\n/** SHAKE128 XOF with 128-bit security. */\nexport const shake128: CHashXO = /* @__PURE__ */ (() => genShake(0x1f, 168, 128 / 8))();\n/** SHAKE256 XOF with 256-bit security. */\nexport const shake256: CHashXO = /* @__PURE__ */ (() => genShake(0x1f, 136, 256 / 8))();\n","import { keccak_256 } from '@noble/hashes/sha3'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type IsHexErrorType, isHex } from '../data/isHex.js'\nimport { type ToBytesErrorType, toBytes } from '../encoding/toBytes.js'\nimport { type ToHexErrorType, toHex } from '../encoding/toHex.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type Keccak256Hash<to extends To> =\n | (to extends 'bytes' ? ByteArray : never)\n | (to extends 'hex' ? Hex : never)\n\nexport type Keccak256ErrorType =\n | IsHexErrorType\n | ToBytesErrorType\n | ToHexErrorType\n | ErrorType\n\nexport function keccak256<to extends To = 'hex'>(\n value: Hex | ByteArray,\n to_?: to | undefined,\n): Keccak256Hash<to> {\n const to = to_ || 'hex'\n const bytes = keccak_256(\n isHex(value, { strict: false }) ? toBytes(value) : value,\n )\n if (to === 'bytes') return bytes as Keccak256Hash<to>\n return toHex(bytes) as Keccak256Hash<to>\n}\n","/**\n * Simple HTML Template Engine\n *\n * Supports:\n * - Variable interpolation: {{variable}}\n * - Conditional blocks: {{#if condition}}...{{/if}}\n * - Else blocks: {{#if condition}}...{{else}}...{{/if}}\n *\n * Future enhancements:\n * - {{#each}} loops\n * - {{#unless}} negative conditionals\n * - Nested conditionals\n * - Helper functions\n */\n\nexport interface TemplateData {\n [key: string]: string | boolean | number | null | undefined\n}\n\nexport class TemplateEngine {\n /**\n * Render template with data\n */\n static render(template: string, data: TemplateData): string {\n let html = template\n\n // Process conditional blocks first ({{#if}}...{{/if}})\n html = this.processConditionals(html, data)\n\n // Then process variable interpolation ({{variable}})\n html = this.processVariables(html, data)\n\n return html\n }\n\n /**\n * Process conditional blocks: {{#if condition}}...{{else}}...{{/if}}\n */\n private static processConditionals(html: string, data: TemplateData): string {\n // Match {{#if variable}}...{{else}}...{{/if}} or {{#if variable}}...{{/if}}\n const conditionalRegex = /\\{\\{#if\\s+(\\w+)\\}\\}([\\s\\S]*?)(?:\\{\\{else\\}\\}([\\s\\S]*?))?\\{\\{\\/if\\}\\}/g\n\n return html.replace(conditionalRegex, (match, variable, trueBlock, falseBlock) => {\n const value = data[variable]\n const condition = this.isTruthy(value)\n\n if (condition) {\n return trueBlock || ''\n } else {\n return falseBlock || ''\n }\n })\n }\n\n /**\n * Process variable interpolation: {{variable}}\n */\n private static processVariables(html: string, data: TemplateData): string {\n // Match {{variable}} but not {{#if}} or {{/if}} or {{else}}\n const variableRegex = /\\{\\{(?!#|\\/|else)(\\w+)\\}\\}/g\n\n return html.replace(variableRegex, (match, variable) => {\n const value = data[variable]\n return value !== null && value !== undefined ? String(value) : ''\n })\n }\n\n /**\n * Check if value is truthy (for conditionals)\n */\n private static isTruthy(value: unknown): boolean {\n if (value === null || value === undefined) return false\n if (typeof value === 'boolean') return value\n if (typeof value === 'number') return value !== 0\n if (typeof value === 'string') return value.length > 0\n return true\n }\n}\n\n/**\n * Template helper to escape HTML entities\n */\n// export function escapeHtml(text: string): string {\n// const map: Record<string, string> = {\n// '&': '&',\n// '<': '<',\n// '>': '>',\n// '\"': '"',\n// \"'\": '''\n// }\n// return text.replace(/[&<>\"']/g, (m) => map[m])\n// }\n\n/**\n * Template helper to sanitize HTML attributes\n */\n// export function sanitizeAttribute(value: string): string {\n// // Remove any script-like content\n// return value.replace(/javascript:/gi, '').replace(/on\\w+\\s*=/gi, '')\n// }\n","<div class=\"modal-overlay\">\n <div class=\"modal-content\" style=\"display: flex; flex-direction: column; gap: var(--iframe-gap); align-items: center\">\n <div style=\"display: flex; align-items: center; gap: var(--iframe-gap); justify-content: center\">\n <img\n src=\"./lumia-logo.svg\"\n alt=\"Lumia Passport\"\n style=\"width: 40px; height: 40px; border-radius: 20px; object-fit: cover\"\n />\n\n <span\n style=\"display: block; font-size: var(--iframe-h1-fz); font-weight: var(--iframe-heading-fw); line-height: 150%\"\n >Authorize</span\n >\n </div>\n\n <div style=\"display: flex; align-items: center; gap: var(--iframe-gap); justify-content: center\">\n {{#if displayLogo}}\n <img\n src=\"{{displayLogo}}\"\n alt=\"{{displayName}}\"\n style=\"width: 32px; height: 32px; border-radius: 16px; object-fit: cover\"\n />\n {{else}}\n <span style=\"font-size: 14px; font-weight: 600\">{{displayName}}</span>\n {{/if}}\n\n <span\n style=\"display: block; font-size: var(--iframe-h2-fz); font-weight: var(--iframe-heading-fw); line-height: 150%\"\n >{{displayName}}</span\n >\n </div>\n\n <div class=\"domain-info {{domainStatusClass}}\" style=\"font-size: 12px; text-align: center\">\n <span style=\"font-family: monospace\">{{domainStatusIcon}} {{domainStatusText}} {{origin}}</span>\n </div>\n\n <!-- Permissions box -->\n <details style=\"display: flex; flex-direction: column; width: 100%\">\n <summary\n style=\"\n cursor: pointer;\n text-align: center;\n list-style: none;\n padding: 0 var(--iframe-pd);\n user-select: none;\n font-size: 12px;\n line-height: 20px;\n \"\n >\n Show Permissions\n </summary>\n <div\n data-details-content=\"true\"\n style=\"\n width: 100%;\n padding: var(--iframe-gap);\n border-radius: var(--iframe-el-bdrs);\n background: var(--iframe-info);\n font-size: 10px;\n \"\n >\n <div style=\"margin-bottom: var(--iframe-gap)\">\n <strong>{{displayName}}</strong> by <span class=\"project-owner\">{{displayName}}</span> wants to access your\n <strong>Lumia Passport</strong> account\n </div>\n\n <div style=\"margin-bottom: var(--iframe-gap)\">\n <strong style=\"margin-bottom: var(--iframe-gap)\">Personal user data</strong>\n <ul style=\"list-style: none\">\n <li style=\"padding-left: var(--iframe-pd)\">Wallet address (read-only)</li>\n <li style=\"padding-left: var(--iframe-pd)\">Public transaction history (read-only)</li>\n </ul>\n </div>\n\n <div style=\"width: 100%\">\n <strong style=\"margin-bottom: var(--iframe-gap)\">Permissions</strong>\n <ul style=\"list-style: none\">\n <li style=\"padding-left: var(--iframe-pd)\">Request transaction signatures</li>\n <li style=\"padding-left: var(--iframe-pd)\">Initiate blockchain operations</li>\n </ul>\n </div>\n </div>\n </details>\n\n {{#if showSecurityWarning}}\n <div class=\"security-warning\">\n <strong>⚠️ Warning:</strong> This domain is not verified for {{displayName}}\n <div>Expected: {{expectedDomains}}</div>\n <div>Actual: {{origin}}</div>\n </div>\n {{else}}\n <span style=\"font-size: 10px; color: var(--iframe-text-secondary)\"\n >By continuing you allow the app to use these permissions.</span\n >\n {{/if}}\n\n <!-- Action buttons -->\n <div style=\"display: flex; gap: var(--iframe-gap); width: 100%; align-items: center\">\n <button class=\"cancel-btn\">Cancel</button>\n <button class=\"authorize-btn\" {{authorizeButtonState}}>Continue</button>\n </div>\n\n <!-- Footer notice -->\n <div\n style=\"\n color: var(--iframe-text-secondary);\n font-size: 10px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n align-items: center;\n text-align: center;\n \"\n >\n <span>Authorizing will redirect to <strong>{{origin}}</strong></span>\n <span>You can revoke access at any time in your Lumia Passport settings.</span>\n </div>\n </div>\n</div>\n","<div class=\"ready-indicator\">\n <div class=\"status-icon\">✓</div>\n <h2>Secure Wallet Ready</h2>\n <p>Lumia Passport is ready for secure operations</p>\n <div class=\"info\">\n <div class=\"info-row\">\n <strong>Origin:</strong>\n <span>{{origin}}</span>\n </div>\n <div class=\"info-row\">\n <strong>Status:</strong>\n <span class=\"status-active\">Active</span>\n </div>\n <div class=\"info-row\">\n <strong>Version:</strong>\n <span>{{iframeVersion}}</span>\n </div>\n <div class=\"info-row\">\n <strong>Documentation:</strong>\n <a\n href=\"https://docs.lumiapassport.com/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style=\"color: #667eea; text-decoration: none\"\n >docs.lumiapassport.com</a\n >\n </div>\n </div>\n</div>\n","/**\n * Template Loader\n *\n * Handles loading and caching of HTML templates.\n * In development, templates are loaded dynamically.\n * In production, templates should be bundled as strings.\n */\n\n// Import templates as raw strings (requires proper bundler configuration)\n// For tsup: .html files configured as 'text' loader in tsup.config.ts\nimport authorizationTemplate from './html/authorization.html'\nimport readyIndicatorTemplate from './html/ready-indicator.html'\n\nexport class TemplateLoader {\n private static templateCache: Map<string, string> = new Map()\n\n /** Get template by name */\n static getTemplate(name: string): string {\n // Check cache first\n if (this.templateCache.has(name)) {\n return this.templateCache.get(name)!\n }\n\n // Load from bundled templates\n const template = this.loadBundledTemplate(name)\n\n if (!template) {\n throw new Error(`Template not found: ${name}`)\n }\n\n // Cache for future use\n this.templateCache.set(name, template)\n return template\n }\n\n /** Load bundled template */\n private static loadBundledTemplate(name: string): string | null {\n switch (name) {\n case 'authorization':\n return authorizationTemplate\n\n case 'ready-indicator':\n return readyIndicatorTemplate\n\n default:\n return null\n }\n }\n\n // /** Pre-load all templates (optional optimization) */\n // static preloadTemplates(): void {\n // this.getTemplate('authorization')\n // console.log('[TemplateLoader] Pre-loaded all templates')\n // }\n\n // /** Clear template cache (useful for hot-reloading in development) */\n // static clearCache(): void {\n // this.templateCache.clear()\n // console.log('[TemplateLoader] Cleared template cache')\n // }\n}\n","/**\n * Type-safe template data for authorization modal\n */\n\nimport type { ProjectInfo } from '../../lib/types'\nimport type { TemplateData } from '../template-engine'\n\nexport interface AuthorizationTemplateData extends TemplateData {\n // Display information\n displayName: string\n displayLogo: string\n displayDescription: string\n\n // User information\n userAvatar: string\n userName: string\n\n // Domain verification\n origin: string\n domainStatusClass: string\n domainStatusIcon: string\n domainStatusText: string\n\n // Security warning\n showSecurityWarning: boolean\n expectedDomains: string\n\n // Button state\n authorizeButtonState: string\n}\n\n/**\n * Build template data from project info and metadata\n */\nexport function buildAuthorizationTemplateData(\n project: ProjectInfo,\n origin: string,\n metadata: { name?: string; logo?: string; description?: string } | null,\n userProfile?: { avatar?: string | null; displayName?: string | null }\n): AuthorizationTemplateData {\n const isVerifiedOrigin = project.domains.includes(origin)\n\n // Use metadata if available, fallback to project info\n const displayName = metadata?.name || project.name\n const displayLogo = metadata?.logo || project.logoUrl || ''\n const displayDescription = metadata?.description || ''\n\n // User avatar/logo for right side\n const userAvatar = userProfile?.avatar || ''\n const userName = userProfile?.displayName || 'Lumia Passport'\n\n return {\n // Display\n displayName,\n displayLogo,\n displayDescription,\n\n // User\n userAvatar,\n userName,\n\n // Domain\n origin,\n domainStatusClass: isVerifiedOrigin ? 'verified' : 'unverified',\n domainStatusIcon: isVerifiedOrigin ? '✓' : '⚠️',\n domainStatusText: isVerifiedOrigin ? 'Verified domain:' : 'Unverified domain:',\n\n // Security\n showSecurityWarning: !isVerifiedOrigin,\n expectedDomains: project.domains.join(', '),\n\n // Button\n authorizeButtonState: !isVerifiedOrigin ? 'disabled' : ''\n }\n}\n","import type { TemplateData } from '../template-engine'\n\ninterface MyTemplateData extends TemplateData {\n origin: string\n iframeVersion: string\n}\n\ninterface ReadyIndicatorParams {\n origin: string\n iframeVersion: string\n}\n\nexport function buildReadyIndicatorData(input: ReadyIndicatorParams): MyTemplateData {\n return {\n origin: input.origin,\n iframeVersion: input.iframeVersion\n }\n}\n","/**\n * Authorization Manager for iframe\n *\n * Manages user authorizations for different projects/applications\n * Implements the \"User Authorization Per Project\" security model\n */\n\nimport { buildAuthorizationTemplateData, TemplateEngine, TemplateLoader } from '../templates'\nimport type { ProjectInfo, UserAuthorization } from './types'\n\ninterface ProjectMetadata {\n id: string\n name: string\n description: string\n logo: string\n}\n\ninterface CachedMetadata {\n data: ProjectMetadata\n timestamp: number\n}\n\nexport class AuthorizationManager {\n private readonly STORAGE_KEY_PREFIX = 'auth'\n private readonly METADATA_API_URL = 'https://dashboard.lumiapassport.com/api/public/project'\n private readonly METADATA_CACHE_TTL = 3600000 // 1 hour in milliseconds\n private metadataCache: Map<string, CachedMetadata> = new Map()\n\n constructor() {\n console.log('[iframe][Auth] Initialized')\n }\n\n /**\n * Fetch project metadata from public API (with caching)\n */\n private async fetchProjectMetadata(projectId: string): Promise<ProjectMetadata | null> {\n // Check cache first\n const cached = this.metadataCache.get(projectId)\n const now = Date.now()\n\n if (cached && now - cached.timestamp < this.METADATA_CACHE_TTL) {\n console.log(`[iframe][Auth] Using cached metadata for project: ${cached.data.name}`)\n return cached.data\n }\n\n // Fetch from API\n try {\n const response = await fetch(`${this.METADATA_API_URL}/${projectId}/metadata`)\n\n if (!response.ok) {\n console.warn(`[iframe][Auth] Failed to fetch project metadata: ${response.status}`)\n return null\n }\n\n const metadata: ProjectMetadata = await response.json()\n console.log(`[iframe][Auth] Fetched metadata for project: ${metadata.name}`)\n\n // Cache the result\n this.metadataCache.set(projectId, {\n data: metadata,\n timestamp: now\n })\n\n return metadata\n } catch (error) {\n console.error('[iframe][Auth] Error fetching project metadata:', error)\n return null\n }\n }\n\n /**\n * Check if user has authorized a project\n */\n async checkAuthorization(userId: string, projectId: string): Promise<boolean> {\n const key = this.getAuthKey(userId, projectId)\n const authData = localStorage.getItem(key)\n\n if (!authData) {\n return false\n }\n\n try {\n const auth: UserAuthorization = JSON.parse(authData)\n\n // Check if authorization is still valid (not expired)\n // TODO: Add expiration logic if needed\n\n console.log(`[iframe][Auth] User ${userId} authorized for project ${projectId}`)\n return true\n } catch (error) {\n console.error('[iframe][Auth] Failed to parse authorization:', error)\n return false\n }\n }\n\n /**\n * Store user authorization for a project\n */\n async storeAuthorization(userId: string, projectId: string, origin: string): Promise<void> {\n const auth: UserAuthorization = {\n userId,\n projectId,\n authorizedAt: Date.now(),\n origin\n }\n\n const key = this.getAuthKey(userId, projectId)\n localStorage.setItem(key, JSON.stringify(auth))\n\n console.log(`[iframe][Auth] ✅ Stored authorization: ${userId} -> ${projectId}`)\n }\n\n /**\n * Revoke user authorization for a project\n */\n async revokeAuthorization(userId: string, projectId: string): Promise<void> {\n const key = this.getAuthKey(userId, projectId)\n localStorage.removeItem(key)\n\n console.log(`[iframe][Auth] ✅ Revoked authorization: ${userId} -> ${projectId}`)\n }\n\n /**\n * Get all authorizations for a user\n */\n async getUserAuthorizations(userId: string): Promise<UserAuthorization[]> {\n const authorizations: UserAuthorization[] = []\n const prefix = `${this.STORAGE_KEY_PREFIX}.${userId}.`\n\n // Iterate through localStorage keys\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i)\n if (key && key.startsWith(prefix)) {\n try {\n const authData = localStorage.getItem(key)\n if (authData) {\n const auth: UserAuthorization = JSON.parse(authData)\n authorizations.push(auth)\n }\n } catch (error) {\n console.error(`[iframe][Auth] Failed to parse auth for key ${key}:`, error)\n }\n }\n }\n\n return authorizations\n }\n\n /**\n * Request user authorization with consent screen\n */\n async requestAuthorization(\n project: ProjectInfo,\n origin: string,\n userProfile?: { avatar?: string | null; displayName?: string | null }\n ): Promise<boolean> {\n // Request parent to show iframe\n this.showIframe()\n\n // Fetch project metadata\n const metadata = await this.fetchProjectMetadata(project.id)\n\n return new Promise((resolve) => {\n const modal = this.createAuthorizationModal(project, origin, metadata, userProfile)\n\n const authorizeBtn = modal.querySelector('.authorize-btn') as HTMLButtonElement\n const cancelBtn = modal.querySelector('.cancel-btn') as HTMLButtonElement\n\n const cleanup = (result: boolean) => {\n console.log(`[iframe][Auth] Cleaning up modal, result: ${result}`)\n modal.remove()\n // Request parent to hide iframe\n this.hideIframe()\n console.log(`[iframe][Auth] Resolving with result: ${result}`)\n resolve(result)\n }\n\n authorizeBtn?.addEventListener('click', (e) => {\n console.log(`[iframe][Auth] Authorize button clicked, isTrusted: ${e.isTrusted}`)\n if (e.isTrusted) {\n console.log(`[iframe][Auth] User authorized project: ${project.id}`)\n cleanup(true)\n } else {\n console.warn(`[iframe][Auth] Untrusted click event ignored`)\n }\n })\n\n cancelBtn?.addEventListener('click', () => {\n console.log(`[iframe][Auth] Cancel button clicked`)\n console.log(`[iframe][Auth] User denied authorization for project: ${project.id}`)\n cleanup(false)\n })\n\n // Add modal to body\n document.body.appendChild(modal)\n })\n }\n\n /**\n * Show iframe (notify parent)\n */\n private showIframe(): void {\n if (window.parent !== window) {\n window.parent.postMessage({ type: 'LUMIA_PASSPORT_SHOW_IFRAME', timestamp: Date.now() }, '*')\n console.log('[iframe][Auth] Requested parent to show iframe')\n }\n }\n\n /**\n * Hide iframe (notify parent)\n */\n private hideIframe(): void {\n if (window.parent !== window) {\n window.parent.postMessage({ type: 'LUMIA_PASSPORT_HIDE_IFRAME', timestamp: Date.now() }, '*')\n console.log('[iframe][Auth] Requested parent to hide iframe')\n }\n }\n\n /**\n * Create authorization consent modal\n */\n private createAuthorizationModal(\n project: ProjectInfo,\n origin: string,\n metadata: ProjectMetadata | null,\n userProfile?: { avatar?: string | null; displayName?: string | null }\n ): HTMLElement {\n const modal = document.createElement('div')\n modal.className = 'authorization-modal'\n\n // Build template data\n const templateData = buildAuthorizationTemplateData(project, origin, metadata, userProfile)\n\n // Load and render template\n const template = TemplateLoader.getTemplate('authorization')\n const populatedHTML = TemplateEngine.render(template, templateData)\n\n // Set modal content\n modal.innerHTML = populatedHTML\n\n return modal\n }\n\n /**\n * Get storage key for authorization\n */\n private getAuthKey(userId: string, projectId: string): string {\n return `${this.STORAGE_KEY_PREFIX}.${userId}.${projectId}`\n }\n\n /**\n * Clear all authorizations for a user (for logout/cleanup)\n */\n async clearUserAuthorizations(userId: string): Promise<void> {\n const prefix = `${this.STORAGE_KEY_PREFIX}.${userId}.`\n const keysToRemove: string[] = []\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i)\n if (key && key.startsWith(prefix)) {\n keysToRemove.push(key)\n }\n }\n\n keysToRemove.forEach((key) => localStorage.removeItem(key))\n\n console.log(`[iframe][Auth] ✅ Cleared ${keysToRemove.length} authorizations for user ${userId}`)\n }\n\n /**\n * Get authorization statistics\n */\n getStats(): { total: number; byUser: Record<string, number> } {\n const stats: { total: number; byUser: Record<string, number> } = {\n total: 0,\n byUser: {}\n }\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i)\n if (key && key.startsWith(this.STORAGE_KEY_PREFIX)) {\n stats.total++\n\n // Extract user ID from key: \"auth.{userId}.{projectId}\"\n const parts = key.split('.')\n if (parts.length >= 2) {\n const userId = parts[1]\n stats.byUser[userId] = (stats.byUser[userId] || 0) + 1\n }\n }\n }\n\n return stats\n }\n}\n","/**\n * Token Refresh API Client for iframe\n *\n * Base class for making API calls with automatic token refresh on 401 errors\n */\n\n// Build-time injected variable (declared in globals.d.ts)\ndeclare const __LUMIA_TSS_URL__: string;\n\ninterface TokenRefreshResponse {\n accessToken: string;\n}\n\nexport class TokenRefreshApiClient {\n protected tssUrl: string;\n private pendingTokenRefresh: Promise<string> | null = null;\n\n constructor() {\n this.tssUrl = (typeof __LUMIA_TSS_URL__ !== 'undefined' && __LUMIA_TSS_URL__) || 'https://api.lumiapassport.com/tss';\n }\n\n /**\n * Make API call with automatic token refresh on 401\n */\n protected async apiCall(\n method: string,\n path: string,\n body?: any,\n projectId?: string,\n accessToken?: string\n ): Promise<any> {\n let url = `${this.tssUrl}${path}`;\n\n // Add projectId as query parameter\n if (projectId) {\n const separator = url.includes('?') ? '&' : '?';\n url = `${url}${separator}projectId=${encodeURIComponent(projectId)}`;\n }\n\n // Prepare headers\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add Authorization header if token is provided\n if (accessToken) {\n headers['Authorization'] = `Bearer ${accessToken}`;\n }\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n credentials: 'include', // Send cookies\n });\n\n // Handle 401 - Token expired\n if (response.status === 401 && accessToken) {\n console.log('[iframe][TokenRefresh] Got 401, checking if TOKEN_EXPIRED...');\n\n try {\n const errorData = await response.json();\n\n // Check if it's a TOKEN_EXPIRED error\n if (errorData.error_code === 'TOKEN_EXPIRED' || errorData.action === 'REFRESH_TOKEN') {\n console.log('[iframe][TokenRefresh] TOKEN_EXPIRED detected, requesting new token from parent...');\n\n // Request new token from parent\n const newToken = await this.requestNewTokenFromParent();\n\n if (newToken) {\n console.log('[iframe][TokenRefresh] ✅ Got new token, retrying request...');\n\n // Retry request with new token\n headers['Authorization'] = `Bearer ${newToken}`;\n const retryResponse = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n credentials: 'include',\n });\n\n if (!retryResponse.ok) {\n const retryErrorText = await retryResponse.text();\n throw new Error(`API call failed after token refresh (${retryResponse.status}): ${retryErrorText}`);\n }\n\n return await retryResponse.json();\n } else {\n throw new Error('Failed to refresh access token');\n }\n }\n } catch (parseError) {\n // If we can't parse the error response, treat it as a generic 401\n console.error('[iframe][TokenRefresh] Failed to parse 401 response:', parseError);\n }\n\n // If not TOKEN_EXPIRED or refresh failed, throw original error\n throw new Error(`API call failed (401): Authentication required`);\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`API call failed (${response.status}): ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n console.error(`[iframe][TokenRefresh] API call failed: ${method} ${path}`, error);\n throw error instanceof Error ? error : new Error('Unknown API error');\n }\n }\n\n /**\n * Request new access token from parent window\n */\n private async requestNewTokenFromParent(): Promise<string | null> {\n // If there's already a pending token refresh request, wait for it\n if (this.pendingTokenRefresh) {\n console.log('[iframe][TokenRefresh] Token refresh already in progress, waiting...');\n return this.pendingTokenRefresh;\n }\n\n // Create a new token refresh promise\n this.pendingTokenRefresh = new Promise<string>((resolve, reject) => {\n const messageId = `token_refresh_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error('Token refresh timeout'));\n }, 30000); // 30 second timeout\n\n const messageHandler = (event: MessageEvent) => {\n const message = event.data;\n\n // Check if this is the response to our token refresh request\n if (message && message.type === 'LUMIA_PASSPORT_TOKEN_REFRESHED' && message.messageId === messageId) {\n cleanup();\n\n if (message.accessToken) {\n console.log('[iframe][TokenRefresh] ✅ Received new token from parent');\n resolve(message.accessToken);\n } else if (message.error) {\n console.error('[iframe][TokenRefresh] ❌ Token refresh failed:', message.error);\n reject(new Error(message.error));\n } else {\n reject(new Error('Invalid token refresh response'));\n }\n }\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n window.removeEventListener('message', messageHandler);\n this.pendingTokenRefresh = null;\n };\n\n // Listen for response\n window.addEventListener('message', messageHandler);\n\n // Send token refresh request to parent\n if (window.parent && window.parent !== window) {\n window.parent.postMessage(\n {\n type: 'LUMIA_PASSPORT_REQUEST_NEW_TOKEN',\n messageId,\n timestamp: Date.now(),\n },\n '*' // Parent will validate origin\n );\n console.log('[iframe][TokenRefresh] 📤 Sent LUMIA_PASSPORT_REQUEST_NEW_TOKEN to parent');\n } else {\n cleanup();\n reject(new Error('No parent window available'));\n }\n });\n\n try {\n return await this.pendingTokenRefresh;\n } catch (error) {\n this.pendingTokenRefresh = null;\n console.error('[iframe][TokenRefresh] Token refresh failed:', error);\n return null;\n }\n }\n}\n","/**\n * Keyshare Backup Manager for iframe context\n *\n * Handles encrypted backup of MPC keyshares with support for:\n * - Server backup (ShareVault API)\n * - Cloud backup (Google Drive, etc.)\n * - Local file download\n *\n * All backups are encrypted with AES-256-GCM using either:\n * - Passkey-derived password (secure, requires device)\n * - Custom password (user-provided)\n */\n\nimport type {\n KeyshareBackupData,\n BackupStatus,\n BackupMethod,\n BackupRequest,\n BackupResult,\n} from './types';\nimport { TokenRefreshApiClient } from './token-refresh-client';\nimport { backupToServer } from './backup/server-backup';\nimport { backupToLocalFile } from './backup/local-backup';\nimport { backupToCloud, getCloudProviders } from './backup/cloud-backup';\n\nconst BACKUP_VERSION = '1.0';\n\n/**\n * Main Backup Manager class\n * Orchestrates backup operations across different methods\n */\n\nexport class BackupManager {\n private tokenClient: TokenRefreshApiClient;\n\n constructor() {\n this.tokenClient = new TokenRefreshApiClient();\n console.log('[iframe][BackupManager] Initialized');\n }\n\n /**\n * Get current keyshare data from iframe storage\n */\n private getCurrentKeyshareBackupData(userId: string): KeyshareBackupData | null {\n console.log('[iframe][BackupManager] Getting keyshare data for userId:', userId);\n\n try {\n const keyshareData = localStorage.getItem(`tss.${userId}.keyshare`);\n const sessionId = localStorage.getItem(`tss.${userId}.sessionId`);\n const ownerAddress = localStorage.getItem(`tss.${userId}.ownerAddress`);\n\n console.log('[iframe][BackupManager] localStorage keys check:', {\n hasKeyshare: !!keyshareData,\n hasSession: !!sessionId,\n hasOwner: !!ownerAddress,\n keyshareLength: keyshareData?.length,\n });\n\n if (!keyshareData || !sessionId || !ownerAddress) {\n console.warn('[iframe][BackupManager] Missing keyshare data - cannot create backup');\n return null;\n }\n\n console.log('[iframe][BackupManager] Successfully retrieved all keyshare data');\n\n return {\n userId,\n sessionId,\n keyshare: keyshareData,\n ownerAddress: ownerAddress as `0x${string}`,\n createdAt: Date.now(),\n version: BACKUP_VERSION,\n };\n } catch (error) {\n console.error('[iframe][BackupManager] Error getting keyshare data:', error);\n return null;\n }\n }\n\n /**\n * Get backup status for all methods\n */\n getBackupStatus(userId: string): BackupStatus {\n const statusData = localStorage.getItem(`lumia-passport.backup.status.${userId}`);\n\n if (statusData) {\n try {\n return JSON.parse(statusData);\n } catch (error) {\n console.error('[iframe][BackupManager] Failed to parse backup status:', error);\n }\n }\n\n return {\n server: { lastBackup: undefined, error: undefined },\n cloud: { lastBackup: undefined, error: undefined },\n local: { lastBackup: undefined, error: undefined },\n };\n }\n\n /**\n * Update backup status for a specific method\n */\n private updateBackupStatus(\n userId: string,\n method: BackupMethod,\n status: Partial<BackupStatus[BackupMethod]>\n ): void {\n const currentStatus = this.getBackupStatus(userId);\n currentStatus[method] = { ...currentStatus[method], ...status };\n\n localStorage.setItem(\n `lumia-passport.backup.status.${userId}`,\n JSON.stringify(currentStatus)\n );\n\n console.log(`[iframe][BackupManager] Updated ${method} backup status for ${userId}`);\n }\n\n\n /**\n * Create backup using specified method\n */\n async createBackup(\n userId: string,\n request: BackupRequest,\n accessToken?: string\n ): Promise<BackupResult> {\n console.log('[iframe][BackupManager] Create backup request:', request);\n\n const data = this.getCurrentKeyshareBackupData(userId);\n if (!data) {\n const error = 'No keyshare data found for backup';\n console.error('[iframe][BackupManager]', error);\n return {\n success: false,\n method: request.method,\n timestamp: Date.now(),\n error,\n };\n }\n\n try {\n switch (request.method) {\n case 'server':\n await backupToServer(data, this.tokenClient, request.password, accessToken);\n break;\n\n case 'local':\n await backupToLocalFile(data, request.password);\n break;\n\n case 'cloud':\n await backupToCloud(data, request.cloudProvider, request.password);\n break;\n\n default:\n throw new Error(`Unknown backup method: ${request.method}`);\n }\n\n const timestamp = Date.now();\n this.updateBackupStatus(userId, request.method, {\n lastBackup: timestamp,\n error: undefined,\n });\n\n console.log(`[iframe][BackupManager] ✅ ${request.method} backup completed`);\n\n return {\n success: true,\n method: request.method,\n timestamp,\n };\n } catch (error: any) {\n const errorMessage = error.message || 'Backup failed';\n console.error('[iframe][BackupManager] Backup failed:', errorMessage);\n\n this.updateBackupStatus(userId, request.method, {\n error: errorMessage,\n });\n\n return {\n success: false,\n method: request.method,\n timestamp: Date.now(),\n error: errorMessage,\n };\n }\n }\n\n /**\n * Restore keyshare from server backup\n */\n async restoreFromServer(\n userId: string,\n password?: string,\n accessToken?: string\n ): Promise<KeyshareBackupData> {\n console.log('[iframe][BackupManager] Restore from server request for userId:', userId);\n\n try {\n const { restoreFromServer } = await import('./backup/server-backup');\n const backupData = await restoreFromServer(userId, this.tokenClient, password, accessToken);\n\n console.log('[iframe][BackupManager] ✅ Server restore completed');\n\n // Save keyshare to localStorage\n localStorage.setItem(`tss.${userId}.keyshare`, backupData.keyshare);\n localStorage.setItem(`tss.${userId}.sessionId`, backupData.sessionId);\n localStorage.setItem(`tss.${userId}.ownerAddress`, backupData.ownerAddress);\n\n console.log('[iframe][BackupManager] Keyshare saved to localStorage');\n\n return backupData;\n } catch (error: any) {\n const errorMessage = error.message || 'Restore failed';\n console.error('[iframe][BackupManager] Restore failed:', errorMessage);\n throw error;\n }\n }\n\n /**\n * Encrypt backup data without uploading (for cloud/local backups)\n * Returns encrypted data that parent can upload/download\n */\n async encryptBackupData(\n userId: string,\n password?: string\n ): Promise<any> {\n console.log('[iframe][BackupManager] Encrypting backup data for userId:', userId);\n\n const data = this.getCurrentKeyshareBackupData(userId);\n if (!data) {\n throw new Error('No keyshare data found for backup');\n }\n\n // Import encryption function\n const { encryptKeyshare, deriveBackupPasswordFromPasskey } = await import('./backup/crypto-utils');\n\n let encryptionPassword = password;\n let credentialId: string | undefined;\n\n if (!encryptionPassword) {\n // Use passkey-derived password\n const result = await deriveBackupPasswordFromPasskey(userId);\n encryptionPassword = result.password;\n credentialId = result.credentialId;\n }\n\n const encrypted = await encryptKeyshare(\n data,\n encryptionPassword,\n password ? 'password' : 'passkey',\n credentialId\n );\n\n console.log('[iframe][BackupManager] ✅ Backup data encrypted');\n\n // encryptKeyshare already includes all necessary fields\n return encrypted;\n }\n\n /**\n * Restore keyshare from local file backup\n */\n async restoreFromLocalFile(\n fileContent: string,\n userId: string,\n password?: string\n ): Promise<KeyshareBackupData> {\n console.log('[iframe][BackupManager] Restore from local file request for userId:', userId);\n\n try {\n const { restoreFromLocalFile } = await import('./backup/local-backup');\n const backupData = await restoreFromLocalFile(fileContent, userId, password);\n\n console.log('[iframe][BackupManager] ✅ Local file restore completed');\n\n // Save keyshare to localStorage\n localStorage.setItem(`tss.${userId}.keyshare`, backupData.keyshare);\n localStorage.setItem(`tss.${userId}.sessionId`, backupData.sessionId);\n localStorage.setItem(`tss.${userId}.ownerAddress`, backupData.ownerAddress);\n\n console.log('[iframe][BackupManager] Keyshare saved to localStorage');\n\n return backupData;\n } catch (error: any) {\n const errorMessage = error.message || 'Local file restore failed';\n console.error('[iframe][BackupManager] Local file restore failed:', errorMessage);\n throw error;\n }\n }\n\n /**\n * Get available cloud providers\n */\n getAvailableCloudProviders() {\n return getCloudProviders();\n }\n}\n","/**\n * Cloud backup operations (Google Drive, iCloud, etc.)\n */\n\nimport type { KeyshareBackupData } from '../types';\nimport { encryptKeyshare, deriveBackupPasswordFromPasskey } from './crypto-utils';\nimport { getAvailableCloudProviders } from './cloudStorage';\n\n/**\n * Backup keyshare to cloud provider\n * Currently only Google Drive is supported\n */\nexport async function backupToCloud(\n data: KeyshareBackupData,\n providerId?: string,\n password?: string\n): Promise<void> {\n // Determine encryption method and get password + credential ID\n const encryptionMethod: 'passkey' | 'password' = password ? 'password' : 'passkey';\n let backupPassword: string;\n let credentialId: string | undefined;\n\n if (password) {\n // Use provided password\n backupPassword = password;\n } else {\n // Use passkey-derived password and get the credential ID from the actual passkey used\n const result = await deriveBackupPasswordFromPasskey(data.userId).catch(() => {\n throw new Error('Backup requires either custom password or passkey authentication');\n });\n backupPassword = result.password;\n credentialId = result.credentialId;\n console.log('[backupToCloud] Using credential ID from passkey:', credentialId);\n }\n\n const encryptedBackup = await encryptKeyshare(data, backupPassword, encryptionMethod, credentialId);\n\n const timestamp = Date.now();\n const fileName = `lumia-keyshare-backup-${data.userId}-${timestamp}.json`;\n const fileContent = JSON.stringify(encryptedBackup, null, 2);\n\n const providers = getAvailableCloudProviders();\n\n if (providers.length === 0) {\n throw new Error(\n 'No cloud storage providers available in this environment'\n );\n }\n\n // Use specified provider or first available\n const provider = providerId ? providers.find(p => p.id === providerId) : providers[0];\n\n if (!provider) {\n throw new Error(\n providerId ?\n `Cloud provider '${providerId}' not available`\n : 'No cloud storage provider available'\n );\n }\n\n console.info(`[BACKUP] Using ${provider.name} for cloud backup`);\n\n // Authenticate if not already authenticated\n if (!provider.isAuthenticated()) {\n console.info(`[BACKUP] Authenticating with ${provider.name}`);\n const authenticated = await provider.authenticate();\n if (!authenticated) {\n throw new Error(`Failed to authenticate with ${provider.name}`);\n }\n }\n\n // Upload file to cloud storage\n console.info(`[BACKUP] Uploading backup to ${provider.name}`);\n const fileId = await provider.upload(fileName, fileContent, true);\n\n console.info(`[BACKUP] Successfully uploaded backup to ${provider.name}, file ID: ${fileId}`);\n}\n\n/**\n * Get list of available cloud providers\n */\nexport function getCloudProviders(): Array<{\n id: string;\n name: string;\n available: boolean;\n}> {\n const providers = getAvailableCloudProviders();\n\n return providers.map(p => ({\n id: p.id,\n name: p.name,\n available: p.isAvailable()\n }));\n}\n","// Cloud storage integrations for secure backup files\n// Supports Google Drive, and can be extended for other providers\n\nexport interface CloudStorageProvider {\n name: string;\n id: string;\n icon: string;\n isAvailable: () => boolean;\n authenticate: () => Promise<boolean>;\n upload: (fileName: string, content: string, usePrivateStorage?: boolean) => Promise<string>; // Returns file URL or ID\n isAuthenticated: () => boolean;\n signOut: () => Promise<void>;\n}\n\n// Google Drive integration using Google Identity Services + Google API Client Library\nexport class GoogleDriveProvider implements CloudStorageProvider {\n name = 'Google Drive';\n id = 'google-drive';\n icon = '📁'; // Can be replaced with proper icon\n\n private accessToken: string | null = null;\n private readonly CLIENT_ID = (typeof (window as any).__GOOGLE_DRIVE_CLIENT_ID__ !== 'undefined' &&\n (window as any).__GOOGLE_DRIVE_CLIENT_ID__) || '';\n private readonly DISCOVERY_DOC = 'https://www.googleapis.com/discovery/v1/apis/drive/v3/rest';\n private readonly SCOPES = 'https://www.googleapis.com/auth/drive.file https://www.googleapis.com/auth/drive.appdata';\n\n private gapiInitialized = false;\n private gisInitialized = false;\n\n constructor() {\n this.initializeAPIs();\n }\n\n private async initializeAPIs(): Promise<void> {\n // Load Google APIs\n if (!window.gapi) {\n await this.loadScript('https://apis.google.com/js/api.js');\n }\n\n if (!window.google?.accounts) {\n await this.loadScript('https://accounts.google.com/gsi/client');\n }\n\n // Initialize gapi\n if (!this.gapiInitialized) {\n await new Promise<void>(resolve => {\n window.gapi.load('client', resolve);\n });\n\n await window.gapi.client.init({\n discoveryDocs: [this.DISCOVERY_DOC],\n });\n\n this.gapiInitialized = true;\n console.log('[GoogleDrive] Google API client initialized');\n }\n\n // Initialize Google Identity Services\n if (!this.gisInitialized) {\n this.gisInitialized = true;\n console.log('[GoogleDrive] Google Identity Services initialized');\n }\n }\n\n private loadScript(src: string): Promise<void> {\n return new Promise((resolve, reject) => {\n if (document.querySelector(`script[src=\"${src}\"]`)) {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.src = src;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(`Failed to load ${src}`));\n document.head.appendChild(script);\n });\n }\n\n isAvailable(): boolean {\n return !!this.CLIENT_ID && typeof window !== 'undefined';\n }\n\n async authenticate(): Promise<boolean> {\n if (!this.isAvailable()) {\n throw new Error(\n 'Google Drive integration is not available in this environment'\n );\n }\n\n await this.initializeAPIs();\n\n return new Promise((resolve, reject) => {\n try {\n const tokenClient = window.google.accounts.oauth2.initTokenClient({\n client_id: this.CLIENT_ID,\n scope: this.SCOPES,\n callback: (response: any) => {\n if (response.error) {\n console.error('[GoogleDrive] Authentication error:', response.error);\n reject(new Error(`Google Drive authentication failed: ${response.error}`));\n return;\n }\n\n this.accessToken = response.access_token;\n window.gapi.client.setToken({ access_token: this.accessToken });\n console.log('[GoogleDrive] Successfully authenticated');\n resolve(true);\n },\n });\n\n tokenClient.requestAccessToken({ prompt: 'consent' });\n } catch (error) {\n console.error('[GoogleDrive] Authentication initialization failed:', error);\n reject(new Error(`Google Drive authentication setup failed: ${error}`));\n }\n });\n }\n\n isAuthenticated(): boolean {\n return !!this.accessToken;\n }\n\n async signOut(): Promise<void> {\n if (this.accessToken) {\n window.google?.accounts.oauth2.revoke(this.accessToken);\n this.accessToken = null;\n window.gapi?.client.setToken(null);\n console.log('[GoogleDrive] Signed out successfully');\n }\n }\n\n async upload(fileName: string, content: string, usePrivateStorage: boolean = true): Promise<string> {\n if (!this.isAuthenticated()) {\n throw new Error('Not authenticated with Google Drive');\n }\n\n await this.initializeAPIs();\n\n if (usePrivateStorage) {\n // Try appDataFolder first (private, hidden)\n try {\n const fileId = await this.uploadToAppDataFolder(fileName, content);\n console.log('[GoogleDrive] File uploaded to appDataFolder successfully:', fileId);\n return fileId;\n } catch (error) {\n console.warn('[GoogleDrive] AppDataFolder upload failed, trying fallback to regular folder:', error);\n // Fallback to visible folder if appDataFolder fails\n const fileId = await this.uploadToAppFolder(fileName, content);\n console.log('[GoogleDrive] File uploaded to app folder successfully:', fileId);\n return fileId;\n }\n } else {\n // Upload to \"Lumia Backups\" folder (visible in Drive)\n try {\n const fileId = await this.uploadToAppFolder(fileName, content);\n console.log('[GoogleDrive] File uploaded to app folder successfully:', fileId);\n return fileId;\n } catch (error) {\n console.error('[GoogleDrive] Upload failed:', error);\n throw new Error(\n `Failed to upload to Google Drive: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n }\n\n private async uploadToAppDataFolder(fileName: string, content: string): Promise<string> {\n const metadata = {\n name: fileName,\n parents: ['appDataFolder'], // Store in app-specific folder for privacy\n };\n\n return this.performUpload(metadata, content);\n }\n\n private async uploadToAppFolder(fileName: string, content: string): Promise<string> {\n // First, find or create \"Lumia Backups\" folder\n const folderName = 'Lumia Passport Backups';\n const folderId = await this.findOrCreateFolder(folderName);\n\n const metadata = {\n name: fileName,\n parents: [folderId],\n };\n\n return this.performUpload(metadata, content);\n }\n\n private async findOrCreateFolder(folderName: string): Promise<string> {\n // Search for existing folder\n const searchResponse = await fetch(\n `https://www.googleapis.com/drive/v3/files?q=name='${folderName}' and mimeType='application/vnd.google-apps.folder' and trashed=false`,\n {\n headers: { Authorization: `Bearer ${this.accessToken}` },\n credentials: 'include'\n }\n );\n\n if (!searchResponse.ok) {\n throw new Error(`Failed to search for folder: ${searchResponse.status}`);\n }\n\n const searchResult = await searchResponse.json();\n\n if (searchResult.files && searchResult.files.length > 0) {\n return searchResult.files[0].id; // Return existing folder ID\n }\n\n // Create new folder\n const createResponse = await fetch('https://www.googleapis.com/drive/v3/files', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.accessToken}`,\n 'Content-Type': 'application/json',\n },\n credentials: 'include',\n body: JSON.stringify({\n name: folderName,\n mimeType: 'application/vnd.google-apps.folder',\n }),\n });\n\n if (!createResponse.ok) {\n throw new Error(`Failed to create folder: ${createResponse.status}`);\n }\n\n const createResult = await createResponse.json();\n console.log(`[GoogleDrive] Created folder '${folderName}':`, createResult.id);\n return createResult.id;\n }\n\n private async performUpload(metadata: any, content: string): Promise<string> {\n const form = new FormData();\n form.append('metadata', new Blob([JSON.stringify(metadata)], { type: 'application/json' }));\n form.append('file', new Blob([content], { type: 'application/json' }));\n\n const response = await fetch(\n 'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart',\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.accessToken}`,\n },\n credentials: 'include',\n body: form,\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Google Drive upload failed: ${response.status} ${response.statusText} - ${errorText}`\n );\n }\n\n const result = await response.json();\n return result.id; // Return file ID\n }\n}\n\n// Factory function to get available cloud storage providers\nexport function getAvailableCloudProviders(): CloudStorageProvider[] {\n const providers: CloudStorageProvider[] = [];\n\n // Google Drive\n const googleDrive = new GoogleDriveProvider();\n if (googleDrive.isAvailable()) {\n providers.push(googleDrive);\n }\n\n // Future: Add more providers (Dropbox, OneDrive, etc.)\n\n return providers;\n}\n\n// Type definitions for global APIs\ndeclare global {\n interface Window {\n gapi: any;\n google: any;\n }\n}\n","let wasm;\n\nfunction addToExternrefTable0(obj) {\n const idx = wasm.__externref_table_alloc();\n wasm.__wbindgen_export_2.set(idx, obj);\n return idx;\n}\n\nfunction handleError(f, args) {\n try {\n return f.apply(this, args);\n } catch (e) {\n const idx = addToExternrefTable0(e);\n wasm.__wbindgen_exn_store(idx);\n }\n}\n\nconst cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } );\n\nif (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); };\n\nlet cachedUint8ArrayMemory0 = null;\n\nfunction getUint8ArrayMemory0() {\n if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8ArrayMemory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nfunction isLikeNone(x) {\n return x === undefined || x === null;\n}\n\nfunction debugString(val) {\n // primitive types\n const type = typeof val;\n if (type == 'number' || type == 'boolean' || val == null) {\n return `${val}`;\n }\n if (type == 'string') {\n return `\"${val}\"`;\n }\n if (type == 'symbol') {\n const description = val.description;\n if (description == null) {\n return 'Symbol';\n } else {\n return `Symbol(${description})`;\n }\n }\n if (type == 'function') {\n const name = val.name;\n if (typeof name == 'string' && name.length > 0) {\n return `Function(${name})`;\n } else {\n return 'Function';\n }\n }\n // objects\n if (Array.isArray(val)) {\n const length = val.length;\n let debug = '[';\n if (length > 0) {\n debug += debugString(val[0]);\n }\n for(let i = 1; i < length; i++) {\n debug += ', ' + debugString(val[i]);\n }\n debug += ']';\n return debug;\n }\n // Test for built-in\n const builtInMatches = /\\[object ([^\\]]+)\\]/.exec(toString.call(val));\n let className;\n if (builtInMatches && builtInMatches.length > 1) {\n className = builtInMatches[1];\n } else {\n // Failed to match the standard '[object ClassName]'\n return toString.call(val);\n }\n if (className == 'Object') {\n // we're a user defined class or Object\n // JSON.stringify avoids problems with cycles, and is generally much\n // easier than looping through ownProperties of `val`.\n try {\n return 'Object(' + JSON.stringify(val) + ')';\n } catch (_) {\n return 'Object';\n }\n }\n // errors\n if (val instanceof Error) {\n return `${val.name}: ${val.message}\\n${val.stack}`;\n }\n // TODO we could test for more things here, like `Set`s and `Map`s.\n return className;\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nconst cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } );\n\nconst encodeString = (typeof cachedTextEncoder.encodeInto === 'function'\n ? function (arg, view) {\n return cachedTextEncoder.encodeInto(arg, view);\n}\n : function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n});\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length, 1) >>> 0;\n getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len, 1) >>> 0;\n\n const mem = getUint8ArrayMemory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;\n const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);\n const ret = encodeString(arg, view);\n\n offset += ret.written;\n ptr = realloc(ptr, len, offset, 1) >>> 0;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nlet cachedDataViewMemory0 = null;\n\nfunction getDataViewMemory0() {\n if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) {\n cachedDataViewMemory0 = new DataView(wasm.memory.buffer);\n }\n return cachedDataViewMemory0;\n}\n\nexport function init_panic_hook() {\n wasm.init_panic_hook();\n}\n\n/**\n * Diagnostic function for checking WASM limits\n * @returns {any}\n */\nexport function wasm_memory_info() {\n const ret = wasm.wasm_memory_info();\n return ret;\n}\n\n/**\n * Test function for checking string/data size limits\n * @param {number} size_kb\n * @returns {any}\n */\nexport function test_large_data_limits(size_kb) {\n const ret = wasm.test_large_data_limits(size_kb);\n return ret;\n}\n\n/**\n * Start local side of DKG and return:\n * - serialized local state (for subsequent rounds),\n * - first \"output\" (message) to peer as Msg.\n * @param {number} party_id\n * @param {number} t\n * @param {number} n\n * @param {string} domain_label\n * @returns {any}\n */\nexport function dkg_start(party_id, t, n, domain_label) {\n const ptr0 = passStringToWasm0(domain_label, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dkg_start(party_id, t, n, ptr0, len0);\n return ret;\n}\n\n/**\n * Process incoming message from peer and generate response/final.\n * Return updated state and either new Msg or DKG final.\n * @param {string} state_blob_json\n * @param {string} peer_msg_json\n * @returns {any}\n */\nexport function dkg_handle(state_blob_json, peer_msg_json) {\n const ptr0 = passStringToWasm0(state_blob_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(peer_msg_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.dkg_handle(ptr0, len0, ptr1, len1);\n return ret;\n}\n\n/**\n * @param {string} keyshare_b64\n * @param {string} digest32_b64\n * @param {string} _chain_path\n * @returns {any}\n */\nexport function sign_start(keyshare_b64, digest32_b64, _chain_path) {\n const ptr0 = passStringToWasm0(keyshare_b64, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(digest32_b64, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ptr2 = passStringToWasm0(_chain_path, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len2 = WASM_VECTOR_LEN;\n const ret = wasm.sign_start(ptr0, len0, ptr1, len1, ptr2, len2);\n return ret;\n}\n\n/**\n * Process signing round: return next Msg or ready signature.\n * @param {string} state_blob_json\n * @param {string} peer_msg_json\n * @returns {any}\n */\nexport function sign_handle(state_blob_json, peer_msg_json) {\n const ptr0 = passStringToWasm0(state_blob_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(peer_msg_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.sign_handle(ptr0, len0, ptr1, len1);\n return ret;\n}\n\n/**\n * Auxiliary function for getting EVM address (keccak(pubkey)[12..])\n * @param {string} pk_b64\n * @returns {string}\n */\nexport function evm_address_from_sec1_pubkey_uncompressed(pk_b64) {\n let deferred2_0;\n let deferred2_1;\n try {\n const ptr0 = passStringToWasm0(pk_b64, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.evm_address_from_sec1_pubkey_uncompressed(ptr0, len0);\n deferred2_0 = ret[0];\n deferred2_1 = ret[1];\n return getStringFromWasm0(ret[0], ret[1]);\n } finally {\n wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);\n }\n}\n\nasync function __wbg_load(module, imports) {\n if (typeof Response === 'function' && module instanceof Response) {\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n return await WebAssembly.instantiateStreaming(module, imports);\n\n } catch (e) {\n if (module.headers.get('Content-Type') != 'application/wasm') {\n console.warn(\"`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n\", e);\n\n } else {\n throw e;\n }\n }\n }\n\n const bytes = await module.arrayBuffer();\n return await WebAssembly.instantiate(bytes, imports);\n\n } else {\n const instance = await WebAssembly.instantiate(module, imports);\n\n if (instance instanceof WebAssembly.Instance) {\n return { instance, module };\n\n } else {\n return instance;\n }\n }\n}\n\nfunction __wbg_get_imports() {\n const imports = {};\n imports.wbg = {};\n imports.wbg.__wbg_buffer_609cc3eee51ed158 = function(arg0) {\n const ret = arg0.buffer;\n return ret;\n };\n imports.wbg.__wbg_call_672a4d21634d4a24 = function() { return handleError(function (arg0, arg1) {\n const ret = arg0.call(arg1);\n return ret;\n }, arguments) };\n imports.wbg.__wbg_call_7cccdd69e0791ae2 = function() { return handleError(function (arg0, arg1, arg2) {\n const ret = arg0.call(arg1, arg2);\n return ret;\n }, arguments) };\n imports.wbg.__wbg_crypto_574e78ad8b13b65f = function(arg0) {\n const ret = arg0.crypto;\n return ret;\n };\n imports.wbg.__wbg_getRandomValues_b8f5dbd5f3995a9e = function() { return handleError(function (arg0, arg1) {\n arg0.getRandomValues(arg1);\n }, arguments) };\n imports.wbg.__wbg_msCrypto_a61aeb35a24c1329 = function(arg0) {\n const ret = arg0.msCrypto;\n return ret;\n };\n imports.wbg.__wbg_new_405e22f390576ce2 = function() {\n const ret = new Object();\n return ret;\n };\n imports.wbg.__wbg_new_5e0be73521bc8c17 = function() {\n const ret = new Map();\n return ret;\n };\n imports.wbg.__wbg_new_78feb108b6472713 = function() {\n const ret = new Array();\n return ret;\n };\n imports.wbg.__wbg_new_a12002a7f91c75be = function(arg0) {\n const ret = new Uint8Array(arg0);\n return ret;\n };\n imports.wbg.__wbg_newnoargs_105ed471475aaf50 = function(arg0, arg1) {\n const ret = new Function(getStringFromWasm0(arg0, arg1));\n return ret;\n };\n imports.wbg.__wbg_newwithbyteoffsetandlength_d97e637ebe145a9a = function(arg0, arg1, arg2) {\n const ret = new Uint8Array(arg0, arg1 >>> 0, arg2 >>> 0);\n return ret;\n };\n imports.wbg.__wbg_newwithlength_a381634e90c276d4 = function(arg0) {\n const ret = new Uint8Array(arg0 >>> 0);\n return ret;\n };\n imports.wbg.__wbg_node_905d3e251edff8a2 = function(arg0) {\n const ret = arg0.node;\n return ret;\n };\n imports.wbg.__wbg_process_dc0fbacc7c1c06f7 = function(arg0) {\n const ret = arg0.process;\n return ret;\n };\n imports.wbg.__wbg_randomFillSync_ac0988aba3254290 = function() { return handleError(function (arg0, arg1) {\n arg0.randomFillSync(arg1);\n }, arguments) };\n imports.wbg.__wbg_require_60cc747a6bc5215a = function() { return handleError(function () {\n const ret = module.require;\n return ret;\n }, arguments) };\n imports.wbg.__wbg_set_37837023f3d740e8 = function(arg0, arg1, arg2) {\n arg0[arg1 >>> 0] = arg2;\n };\n imports.wbg.__wbg_set_3fda3bac07393de4 = function(arg0, arg1, arg2) {\n arg0[arg1] = arg2;\n };\n imports.wbg.__wbg_set_65595bdd868b3009 = function(arg0, arg1, arg2) {\n arg0.set(arg1, arg2 >>> 0);\n };\n imports.wbg.__wbg_set_8fc6bf8a5b1071d1 = function(arg0, arg1, arg2) {\n const ret = arg0.set(arg1, arg2);\n return ret;\n };\n imports.wbg.__wbg_static_accessor_GLOBAL_88a902d13a557d07 = function() {\n const ret = typeof global === 'undefined' ? null : global;\n return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);\n };\n imports.wbg.__wbg_static_accessor_GLOBAL_THIS_56578be7e9f832b0 = function() {\n const ret = typeof globalThis === 'undefined' ? null : globalThis;\n return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);\n };\n imports.wbg.__wbg_static_accessor_SELF_37c5d418e4bf5819 = function() {\n const ret = typeof self === 'undefined' ? null : self;\n return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);\n };\n imports.wbg.__wbg_static_accessor_WINDOW_5de37043a91a9c40 = function() {\n const ret = typeof window === 'undefined' ? null : window;\n return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);\n };\n imports.wbg.__wbg_subarray_aa9065fa9dc5df96 = function(arg0, arg1, arg2) {\n const ret = arg0.subarray(arg1 >>> 0, arg2 >>> 0);\n return ret;\n };\n imports.wbg.__wbg_versions_c01dfd4722a88165 = function(arg0) {\n const ret = arg0.versions;\n return ret;\n };\n imports.wbg.__wbindgen_bigint_from_i64 = function(arg0) {\n const ret = arg0;\n return ret;\n };\n imports.wbg.__wbindgen_bigint_from_u64 = function(arg0) {\n const ret = BigInt.asUintN(64, arg0);\n return ret;\n };\n imports.wbg.__wbindgen_debug_string = function(arg0, arg1) {\n const ret = debugString(arg1);\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n };\n imports.wbg.__wbindgen_error_new = function(arg0, arg1) {\n const ret = new Error(getStringFromWasm0(arg0, arg1));\n return ret;\n };\n imports.wbg.__wbindgen_init_externref_table = function() {\n const table = wasm.__wbindgen_export_2;\n const offset = table.grow(4);\n table.set(0, undefined);\n table.set(offset + 0, undefined);\n table.set(offset + 1, null);\n table.set(offset + 2, true);\n table.set(offset + 3, false);\n ;\n };\n imports.wbg.__wbindgen_is_function = function(arg0) {\n const ret = typeof(arg0) === 'function';\n return ret;\n };\n imports.wbg.__wbindgen_is_object = function(arg0) {\n const val = arg0;\n const ret = typeof(val) === 'object' && val !== null;\n return ret;\n };\n imports.wbg.__wbindgen_is_string = function(arg0) {\n const ret = typeof(arg0) === 'string';\n return ret;\n };\n imports.wbg.__wbindgen_is_undefined = function(arg0) {\n const ret = arg0 === undefined;\n return ret;\n };\n imports.wbg.__wbindgen_memory = function() {\n const ret = wasm.memory;\n return ret;\n };\n imports.wbg.__wbindgen_number_new = function(arg0) {\n const ret = arg0;\n return ret;\n };\n imports.wbg.__wbindgen_string_new = function(arg0, arg1) {\n const ret = getStringFromWasm0(arg0, arg1);\n return ret;\n };\n imports.wbg.__wbindgen_throw = function(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n };\n\n return imports;\n}\n\nfunction __wbg_init_memory(imports, memory) {\n\n}\n\nfunction __wbg_finalize_init(instance, module) {\n wasm = instance.exports;\n __wbg_init.__wbindgen_wasm_module = module;\n cachedDataViewMemory0 = null;\n cachedUint8ArrayMemory0 = null;\n\n\n wasm.__wbindgen_start();\n return wasm;\n}\n\nfunction initSync(module) {\n if (wasm !== undefined) return wasm;\n\n\n if (typeof module !== 'undefined') {\n if (Object.getPrototypeOf(module) === Object.prototype) {\n ({module} = module)\n } else {\n console.warn('using deprecated parameters for `initSync()`; pass a single object instead')\n }\n }\n\n const imports = __wbg_get_imports();\n\n __wbg_init_memory(imports);\n\n if (!(module instanceof WebAssembly.Module)) {\n module = new WebAssembly.Module(module);\n }\n\n const instance = new WebAssembly.Instance(module, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nasync function __wbg_init(module_or_path) {\n if (wasm !== undefined) return wasm;\n\n\n if (typeof module_or_path !== 'undefined') {\n if (Object.getPrototypeOf(module_or_path) === Object.prototype) {\n ({module_or_path} = module_or_path)\n } else {\n console.warn('using deprecated parameters for the initialization function; pass a single object instead')\n }\n }\n\n if (typeof module_or_path === 'undefined') {\n module_or_path = new URL('dkls23_wasm_bg.wasm', import.meta.url);\n }\n const imports = __wbg_get_imports();\n\n if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {\n module_or_path = fetch(module_or_path);\n }\n\n __wbg_init_memory(imports);\n\n const { instance, module } = await __wbg_load(await module_or_path, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nexport { initSync };\nexport default __wbg_init;\n","// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport {\n type Abi,\n type AbiEvent,\n type AbiFunction,\n type AbiParameter,\n type AbiParameterKind,\n type AbiParameterToPrimitiveType,\n type AbiStateMutability,\n type Address,\n CircularReferenceError,\n InvalidAbiItemError,\n InvalidAbiParameterError,\n InvalidAbiParametersError,\n InvalidAbiTypeParameterError,\n InvalidFunctionModifierError,\n InvalidModifierError,\n InvalidParameterError,\n InvalidParenthesisError,\n InvalidSignatureError,\n InvalidStructSignatureError,\n type Narrow,\n type ParseAbi,\n type ParseAbiItem,\n type ParseAbiParameter,\n type ParseAbiParameters,\n parseAbi,\n parseAbiItem,\n parseAbiParameter,\n parseAbiParameters,\n SolidityProtectedKeywordError,\n type TypedData,\n type TypedDataDomain,\n type TypedDataParameter,\n UnknownSignatureError,\n UnknownTypeError,\n} from 'abitype'\nexport type {\n BlockOverrides,\n Rpc as RpcBlockOverrides,\n} from 'ox/BlockOverrides'\nexport type {\n RpcEstimateUserOperationGasReturnType,\n RpcGetUserOperationByHashReturnType,\n RpcUserOperation,\n RpcUserOperationReceipt,\n RpcUserOperationRequest,\n} from './account-abstraction/types/rpc.js'\nexport type {\n Account,\n AccountSource,\n CustomSource,\n HDAccount,\n HDOptions,\n JsonRpcAccount,\n LocalAccount,\n PrivateKeyAccount,\n} from './accounts/types.js'\nexport type {\n GetEnsAddressErrorType,\n GetEnsAddressParameters,\n GetEnsAddressReturnType,\n} from './actions/ens/getEnsAddress.js'\nexport type {\n GetEnsAvatarErrorType,\n GetEnsAvatarParameters,\n GetEnsAvatarReturnType,\n} from './actions/ens/getEnsAvatar.js'\nexport type {\n GetEnsNameErrorType,\n GetEnsNameParameters,\n GetEnsNameReturnType,\n} from './actions/ens/getEnsName.js'\nexport type {\n GetEnsResolverErrorType,\n GetEnsResolverParameters,\n GetEnsResolverReturnType,\n} from './actions/ens/getEnsResolver.js'\nexport type {\n GetEnsTextErrorType,\n GetEnsTextParameters,\n GetEnsTextReturnType,\n} from './actions/ens/getEnsText.js'\nexport {\n type GetContractErrorType,\n type GetContractParameters,\n type GetContractReturnType,\n getContract,\n} from './actions/getContract.js'\nexport type {\n CallErrorType,\n CallParameters,\n CallReturnType,\n} from './actions/public/call.js'\nexport type {\n CreateAccessListErrorType,\n CreateAccessListParameters,\n CreateAccessListReturnType,\n} from './actions/public/createAccessList.js'\nexport type {\n CreateBlockFilterErrorType,\n CreateBlockFilterReturnType,\n} from './actions/public/createBlockFilter.js'\nexport type {\n CreateContractEventFilterErrorType,\n CreateContractEventFilterParameters,\n CreateContractEventFilterReturnType,\n} from './actions/public/createContractEventFilter.js'\nexport type {\n CreateEventFilterErrorType,\n CreateEventFilterParameters,\n CreateEventFilterReturnType,\n} from './actions/public/createEventFilter.js'\nexport type {\n CreatePendingTransactionFilterErrorType,\n CreatePendingTransactionFilterReturnType,\n} from './actions/public/createPendingTransactionFilter.js'\nexport type {\n EstimateContractGasErrorType,\n EstimateContractGasParameters,\n EstimateContractGasReturnType,\n} from './actions/public/estimateContractGas.js'\nexport type {\n EstimateFeesPerGasErrorType,\n EstimateFeesPerGasParameters,\n EstimateFeesPerGasReturnType,\n} from './actions/public/estimateFeesPerGas.js'\nexport type {\n EstimateGasErrorType,\n EstimateGasParameters,\n EstimateGasReturnType,\n} from './actions/public/estimateGas.js'\nexport type {\n EstimateMaxPriorityFeePerGasErrorType,\n EstimateMaxPriorityFeePerGasParameters,\n EstimateMaxPriorityFeePerGasReturnType,\n} from './actions/public/estimateMaxPriorityFeePerGas.js'\nexport type {\n GetBalanceErrorType,\n GetBalanceParameters,\n GetBalanceReturnType,\n} from './actions/public/getBalance.js'\nexport type {\n GetBlobBaseFeeErrorType,\n GetBlobBaseFeeReturnType,\n} from './actions/public/getBlobBaseFee.js'\nexport type {\n GetBlockErrorType,\n GetBlockParameters,\n GetBlockReturnType,\n} from './actions/public/getBlock.js'\nexport type {\n GetBlockNumberErrorType,\n GetBlockNumberParameters,\n GetBlockNumberReturnType,\n} from './actions/public/getBlockNumber.js'\nexport type {\n GetBlockTransactionCountErrorType,\n GetBlockTransactionCountParameters,\n GetBlockTransactionCountReturnType,\n} from './actions/public/getBlockTransactionCount.js'\nexport type {\n GetChainIdErrorType,\n GetChainIdReturnType,\n} from './actions/public/getChainId.js'\nexport type {\n /** @deprecated Use `GetCodeErrorType` instead */\n GetCodeErrorType as GetBytecodeErrorType,\n GetCodeErrorType,\n /** @deprecated Use `GetCodeParameters` instead */\n GetCodeParameters as GetBytecodeParameters,\n GetCodeParameters,\n /** @deprecated Use `GetCodeReturnType` instead */\n GetCodeReturnType as GetBytecodeReturnType,\n GetCodeReturnType,\n} from './actions/public/getCode.js'\nexport type {\n GetContractEventsErrorType,\n GetContractEventsParameters,\n GetContractEventsReturnType,\n} from './actions/public/getContractEvents.js'\nexport type {\n GetEip712DomainErrorType,\n GetEip712DomainParameters,\n GetEip712DomainReturnType,\n} from './actions/public/getEip712Domain.js'\nexport type {\n GetFeeHistoryErrorType,\n GetFeeHistoryParameters,\n GetFeeHistoryReturnType,\n} from './actions/public/getFeeHistory.js'\nexport type {\n GetFilterChangesErrorType,\n GetFilterChangesParameters,\n GetFilterChangesReturnType,\n} from './actions/public/getFilterChanges.js'\nexport type {\n GetFilterLogsErrorType,\n GetFilterLogsParameters,\n GetFilterLogsReturnType,\n} from './actions/public/getFilterLogs.js'\nexport type {\n GetGasPriceErrorType,\n GetGasPriceReturnType,\n} from './actions/public/getGasPrice.js'\nexport type {\n GetLogsErrorType,\n GetLogsParameters,\n GetLogsReturnType,\n} from './actions/public/getLogs.js'\nexport type {\n GetProofErrorType,\n GetProofParameters,\n GetProofReturnType,\n} from './actions/public/getProof.js'\nexport type {\n GetStorageAtErrorType,\n GetStorageAtParameters,\n GetStorageAtReturnType,\n} from './actions/public/getStorageAt.js'\nexport type {\n GetTransactionErrorType,\n GetTransactionParameters,\n GetTransactionReturnType,\n} from './actions/public/getTransaction.js'\nexport type {\n GetTransactionConfirmationsErrorType,\n GetTransactionConfirmationsParameters,\n GetTransactionConfirmationsReturnType,\n} from './actions/public/getTransactionConfirmations.js'\nexport type {\n GetTransactionCountErrorType,\n GetTransactionCountParameters,\n GetTransactionCountReturnType,\n} from './actions/public/getTransactionCount.js'\nexport type {\n GetTransactionReceiptErrorType,\n GetTransactionReceiptParameters,\n GetTransactionReceiptReturnType,\n} from './actions/public/getTransactionReceipt.js'\nexport type {\n MulticallErrorType,\n MulticallParameters,\n MulticallReturnType,\n} from './actions/public/multicall.js'\nexport type {\n ReadContractErrorType,\n ReadContractParameters,\n ReadContractReturnType,\n} from './actions/public/readContract.js'\nexport type {\n SimulateBlocksErrorType,\n SimulateBlocksParameters,\n SimulateBlocksReturnType,\n} from './actions/public/simulateBlocks.js'\nexport type {\n SimulateCallsErrorType,\n SimulateCallsParameters,\n SimulateCallsReturnType,\n} from './actions/public/simulateCalls.js'\nexport type {\n GetMutabilityAwareValue,\n SimulateContractErrorType,\n SimulateContractParameters,\n SimulateContractReturnType,\n} from './actions/public/simulateContract.js'\nexport type {\n UninstallFilterErrorType,\n UninstallFilterParameters,\n UninstallFilterReturnType,\n} from './actions/public/uninstallFilter.js'\nexport type {\n VerifyHashErrorType as VerifyHashActionErrorType,\n VerifyHashParameters as VerifyHashActionParameters,\n VerifyHashReturnType as VerifyHashActionReturnType,\n} from './actions/public/verifyHash.js'\nexport type {\n VerifyMessageErrorType as VerifyMessageActionErrorType,\n VerifyMessageParameters as VerifyMessageActionParameters,\n VerifyMessageReturnType as VerifyMessageActionReturnType,\n} from './actions/public/verifyMessage.js'\nexport type {\n VerifyTypedDataErrorType as VerifyTypedDataActionErrorType,\n VerifyTypedDataParameters as VerifyTypedDataActionParameters,\n VerifyTypedDataReturnType as VerifyTypedDataActionReturnType,\n} from './actions/public/verifyTypedData.js'\nexport type {\n ReplacementReason,\n ReplacementReturnType,\n WaitForTransactionReceiptErrorType,\n WaitForTransactionReceiptParameters,\n WaitForTransactionReceiptReturnType,\n} from './actions/public/waitForTransactionReceipt.js'\nexport type {\n OnBlockNumberFn,\n OnBlockNumberParameter,\n WatchBlockNumberErrorType,\n WatchBlockNumberParameters,\n WatchBlockNumberReturnType,\n} from './actions/public/watchBlockNumber.js'\nexport type {\n OnBlock,\n OnBlockParameter,\n WatchBlocksErrorType,\n WatchBlocksParameters,\n WatchBlocksReturnType,\n} from './actions/public/watchBlocks.js'\nexport type {\n WatchContractEventErrorType,\n WatchContractEventOnLogsFn,\n WatchContractEventOnLogsParameter,\n WatchContractEventParameters,\n WatchContractEventReturnType,\n} from './actions/public/watchContractEvent.js'\nexport type {\n WatchEventErrorType,\n WatchEventOnLogsFn,\n WatchEventOnLogsParameter,\n WatchEventParameters,\n WatchEventReturnType,\n} from './actions/public/watchEvent.js'\nexport type {\n OnTransactionsFn,\n OnTransactionsParameter,\n WatchPendingTransactionsErrorType,\n WatchPendingTransactionsParameters,\n WatchPendingTransactionsReturnType,\n} from './actions/public/watchPendingTransactions.js'\nexport type {\n DropTransactionErrorType,\n DropTransactionParameters,\n} from './actions/test/dropTransaction.js'\nexport type {\n DumpStateErrorType,\n DumpStateReturnType,\n} from './actions/test/dumpState.js'\nexport type {\n GetAutomineErrorType,\n GetAutomineReturnType,\n} from './actions/test/getAutomine.js'\nexport type {\n GetTxpoolContentErrorType,\n GetTxpoolContentReturnType,\n} from './actions/test/getTxpoolContent.js'\nexport type {\n GetTxpoolStatusErrorType,\n GetTxpoolStatusReturnType,\n} from './actions/test/getTxpoolStatus.js'\nexport type {\n ImpersonateAccountErrorType,\n ImpersonateAccountParameters,\n} from './actions/test/impersonateAccount.js'\nexport type {\n IncreaseTimeErrorType,\n IncreaseTimeParameters,\n} from './actions/test/increaseTime.js'\nexport type {\n InspectTxpoolErrorType,\n InspectTxpoolReturnType,\n} from './actions/test/inspectTxpool.js'\nexport type {\n LoadStateErrorType,\n LoadStateParameters,\n LoadStateReturnType,\n} from './actions/test/loadState.js'\nexport type { MineErrorType, MineParameters } from './actions/test/mine.js'\nexport type { RemoveBlockTimestampIntervalErrorType } from './actions/test/removeBlockTimestampInterval.js'\nexport type { ResetErrorType, ResetParameters } from './actions/test/reset.js'\nexport type {\n RevertErrorType,\n RevertParameters,\n} from './actions/test/revert.js'\nexport type {\n SendUnsignedTransactionErrorType,\n SendUnsignedTransactionParameters,\n SendUnsignedTransactionReturnType,\n} from './actions/test/sendUnsignedTransaction.js'\nexport type { SetAutomineErrorType } from './actions/test/setAutomine.js'\nexport type {\n SetBalanceErrorType,\n SetBalanceParameters,\n} from './actions/test/setBalance.js'\nexport type {\n SetBlockGasLimitErrorType,\n SetBlockGasLimitParameters,\n} from './actions/test/setBlockGasLimit.js'\nexport type {\n SetBlockTimestampIntervalErrorType,\n SetBlockTimestampIntervalParameters,\n} from './actions/test/setBlockTimestampInterval.js'\nexport type {\n SetCodeErrorType,\n SetCodeParameters,\n} from './actions/test/setCode.js'\nexport type {\n SetCoinbaseErrorType,\n SetCoinbaseParameters,\n} from './actions/test/setCoinbase.js'\nexport type {\n SetIntervalMiningErrorType,\n SetIntervalMiningParameters,\n} from './actions/test/setIntervalMining.js'\nexport type { SetLoggingEnabledErrorType } from './actions/test/setLoggingEnabled.js'\nexport type {\n SetMinGasPriceErrorType,\n SetMinGasPriceParameters,\n} from './actions/test/setMinGasPrice.js'\nexport type {\n SetNextBlockBaseFeePerGasErrorType,\n SetNextBlockBaseFeePerGasParameters,\n} from './actions/test/setNextBlockBaseFeePerGas.js'\nexport type {\n SetNextBlockTimestampErrorType,\n SetNextBlockTimestampParameters,\n} from './actions/test/setNextBlockTimestamp.js'\nexport type {\n SetNonceErrorType,\n SetNonceParameters,\n} from './actions/test/setNonce.js'\nexport type { SetRpcUrlErrorType } from './actions/test/setRpcUrl.js'\nexport type {\n SetStorageAtErrorType,\n SetStorageAtParameters,\n} from './actions/test/setStorageAt.js'\nexport type { SnapshotErrorType } from './actions/test/snapshot.js'\nexport type {\n StopImpersonatingAccountErrorType,\n StopImpersonatingAccountParameters,\n} from './actions/test/stopImpersonatingAccount.js'\nexport type {\n AddChainErrorType,\n AddChainParameters,\n} from './actions/wallet/addChain.js'\nexport type {\n DeployContractErrorType,\n DeployContractParameters,\n DeployContractReturnType,\n} from './actions/wallet/deployContract.js'\nexport type {\n GetAddressesErrorType,\n GetAddressesReturnType,\n} from './actions/wallet/getAddresses.js'\nexport type {\n GetCallsStatusErrorType,\n GetCallsStatusParameters,\n GetCallsStatusReturnType,\n} from './actions/wallet/getCallsStatus.js'\nexport type {\n GetCapabilitiesErrorType,\n GetCapabilitiesParameters,\n GetCapabilitiesReturnType,\n} from './actions/wallet/getCapabilities.js'\nexport type {\n GetPermissionsErrorType,\n GetPermissionsReturnType,\n} from './actions/wallet/getPermissions.js'\nexport type {\n PrepareAuthorizationErrorType,\n PrepareAuthorizationParameters,\n PrepareAuthorizationReturnType,\n} from './actions/wallet/prepareAuthorization.js'\nexport type {\n PrepareTransactionRequestErrorType,\n PrepareTransactionRequestParameters,\n PrepareTransactionRequestParameterType,\n PrepareTransactionRequestRequest,\n PrepareTransactionRequestReturnType,\n} from './actions/wallet/prepareTransactionRequest.js'\nexport type {\n RequestAddressesErrorType,\n RequestAddressesReturnType,\n} from './actions/wallet/requestAddresses.js'\nexport type {\n RequestPermissionsErrorType,\n RequestPermissionsParameters,\n RequestPermissionsReturnType,\n} from './actions/wallet/requestPermissions.js'\nexport type {\n SendCallsErrorType,\n SendCallsParameters,\n SendCallsReturnType,\n} from './actions/wallet/sendCalls.js'\nexport type {\n SendCallsSyncErrorType,\n SendCallsSyncParameters,\n SendCallsSyncReturnType,\n} from './actions/wallet/sendCallsSync.js'\nexport type {\n SendRawTransactionErrorType,\n SendRawTransactionParameters,\n SendRawTransactionReturnType,\n} from './actions/wallet/sendRawTransaction.js'\nexport type {\n SendRawTransactionSyncErrorType,\n SendRawTransactionSyncParameters,\n SendRawTransactionSyncReturnType,\n} from './actions/wallet/sendRawTransactionSync.js'\nexport type {\n SendTransactionErrorType,\n SendTransactionParameters,\n SendTransactionRequest,\n SendTransactionReturnType,\n} from './actions/wallet/sendTransaction.js'\nexport type {\n SendTransactionSyncErrorType,\n SendTransactionSyncParameters,\n SendTransactionSyncRequest,\n SendTransactionSyncReturnType,\n} from './actions/wallet/sendTransactionSync.js'\nexport type {\n ShowCallsStatusErrorType,\n ShowCallsStatusParameters,\n ShowCallsStatusReturnType,\n} from './actions/wallet/showCallsStatus.js'\nexport type {\n SignAuthorizationErrorType,\n SignAuthorizationParameters,\n SignAuthorizationReturnType,\n} from './actions/wallet/signAuthorization.js'\nexport type {\n SignMessageErrorType,\n SignMessageParameters,\n SignMessageReturnType,\n} from './actions/wallet/signMessage.js'\nexport type {\n SignTransactionErrorType,\n SignTransactionParameters,\n SignTransactionReturnType,\n} from './actions/wallet/signTransaction.js'\nexport type {\n SignTypedDataErrorType,\n SignTypedDataParameters,\n SignTypedDataReturnType,\n} from './actions/wallet/signTypedData.js'\nexport type {\n SwitchChainErrorType,\n SwitchChainParameters,\n} from './actions/wallet/switchChain.js'\nexport type {\n WaitForCallsStatusErrorType,\n WaitForCallsStatusParameters,\n WaitForCallsStatusReturnType,\n WaitForCallsStatusTimeoutErrorType,\n} from './actions/wallet/waitForCallsStatus.js'\nexport { WaitForCallsStatusTimeoutError } from './actions/wallet/waitForCallsStatus.js'\nexport type {\n WatchAssetErrorType,\n WatchAssetParameters,\n WatchAssetReturnType,\n} from './actions/wallet/watchAsset.js'\nexport type {\n WriteContractErrorType,\n WriteContractParameters,\n WriteContractReturnType,\n} from './actions/wallet/writeContract.js'\nexport type {\n WriteContractSyncErrorType,\n WriteContractSyncParameters,\n WriteContractSyncReturnType,\n} from './actions/wallet/writeContractSync.js'\nexport {\n type Client,\n type ClientConfig,\n type CreateClientErrorType,\n createClient,\n type MulticallBatchOptions,\n rpcSchema,\n} from './clients/createClient.js'\nexport {\n type CreatePublicClientErrorType,\n createPublicClient,\n type PublicClient,\n type PublicClientConfig,\n} from './clients/createPublicClient.js'\nexport {\n type CreateTestClientErrorType,\n createTestClient,\n type TestClient,\n type TestClientConfig,\n} from './clients/createTestClient.js'\nexport {\n type CreateWalletClientErrorType,\n createWalletClient,\n type WalletClient,\n type WalletClientConfig,\n} from './clients/createWalletClient.js'\nexport {\n type PublicActions,\n publicActions,\n} from './clients/decorators/public.js'\nexport {\n type TestActions,\n testActions,\n} from './clients/decorators/test.js'\nexport {\n type WalletActions,\n walletActions,\n} from './clients/decorators/wallet.js'\nexport {\n type CreateTransportErrorType,\n createTransport,\n type Transport,\n type TransportConfig,\n} from './clients/transports/createTransport.js'\nexport {\n type CustomTransport,\n type CustomTransportConfig,\n type CustomTransportErrorType,\n custom,\n} from './clients/transports/custom.js'\nexport {\n type FallbackTransport,\n type FallbackTransportConfig,\n type FallbackTransportErrorType,\n fallback,\n shouldThrow,\n} from './clients/transports/fallback.js'\nexport {\n type HttpTransport,\n type HttpTransportConfig,\n type HttpTransportErrorType,\n http,\n} from './clients/transports/http.js'\nexport {\n type WebSocketTransport,\n type WebSocketTransportConfig,\n type WebSocketTransportErrorType,\n webSocket,\n} from './clients/transports/webSocket.js'\nexport {\n erc20Abi,\n erc20Abi_bytes32,\n erc721Abi,\n erc1155Abi,\n erc4626Abi,\n erc6492SignatureValidatorAbi,\n /** @deprecated use `erc6492SignatureValidatorAbi` instead. */\n erc6492SignatureValidatorAbi as universalSignatureValidatorAbi,\n multicall3Abi,\n} from './constants/abis.js'\nexport { ethAddress, zeroAddress } from './constants/address.js'\nexport { zeroHash } from './constants/bytes.js'\nexport {\n deploylessCallViaBytecodeBytecode,\n deploylessCallViaFactoryBytecode,\n erc6492SignatureValidatorByteCode,\n /** @deprecated use `erc6492SignatureValidatorByteCode` instead. */\n erc6492SignatureValidatorByteCode as universalSignatureValidatorByteCode,\n} from './constants/contracts.js'\nexport {\n maxInt8,\n maxInt16,\n maxInt24,\n maxInt32,\n maxInt40,\n maxInt48,\n maxInt56,\n maxInt64,\n maxInt72,\n maxInt80,\n maxInt88,\n maxInt96,\n maxInt104,\n maxInt112,\n maxInt120,\n maxInt128,\n maxInt136,\n maxInt144,\n maxInt152,\n maxInt160,\n maxInt168,\n maxInt176,\n maxInt184,\n maxInt192,\n maxInt200,\n maxInt208,\n maxInt216,\n maxInt224,\n maxInt232,\n maxInt240,\n maxInt248,\n maxInt256,\n maxUint8,\n maxUint16,\n maxUint24,\n maxUint32,\n maxUint40,\n maxUint48,\n maxUint56,\n maxUint64,\n maxUint72,\n maxUint80,\n maxUint88,\n maxUint96,\n maxUint104,\n maxUint112,\n maxUint120,\n maxUint128,\n maxUint136,\n maxUint144,\n maxUint152,\n maxUint160,\n maxUint168,\n maxUint176,\n maxUint184,\n maxUint192,\n maxUint200,\n maxUint208,\n maxUint216,\n maxUint224,\n maxUint232,\n maxUint240,\n maxUint248,\n maxUint256,\n minInt8,\n minInt16,\n minInt24,\n minInt32,\n minInt40,\n minInt48,\n minInt56,\n minInt64,\n minInt72,\n minInt80,\n minInt88,\n minInt96,\n minInt104,\n minInt112,\n minInt120,\n minInt128,\n minInt136,\n minInt144,\n minInt152,\n minInt160,\n minInt168,\n minInt176,\n minInt184,\n minInt192,\n minInt200,\n minInt208,\n minInt216,\n minInt224,\n minInt232,\n minInt240,\n minInt248,\n minInt256,\n} from './constants/number.js'\nexport { presignMessagePrefix } from './constants/strings.js'\nexport { etherUnits, gweiUnits, weiUnits } from './constants/unit.js'\nexport {\n AbiConstructorNotFoundError,\n type AbiConstructorNotFoundErrorType,\n AbiConstructorParamsNotFoundError,\n type AbiConstructorParamsNotFoundErrorType,\n AbiDecodingDataSizeInvalidError,\n type AbiDecodingDataSizeInvalidErrorType,\n AbiDecodingDataSizeTooSmallError,\n type AbiDecodingDataSizeTooSmallErrorType,\n AbiDecodingZeroDataError,\n type AbiDecodingZeroDataErrorType,\n AbiEncodingArrayLengthMismatchError,\n type AbiEncodingArrayLengthMismatchErrorType,\n AbiEncodingBytesSizeMismatchError,\n type AbiEncodingBytesSizeMismatchErrorType,\n AbiEncodingLengthMismatchError,\n type AbiEncodingLengthMismatchErrorType,\n AbiErrorInputsNotFoundError,\n type AbiErrorInputsNotFoundErrorType,\n AbiErrorNotFoundError,\n type AbiErrorNotFoundErrorType,\n AbiErrorSignatureNotFoundError,\n type AbiErrorSignatureNotFoundErrorType,\n AbiEventNotFoundError,\n type AbiEventNotFoundErrorType,\n AbiEventSignatureEmptyTopicsError,\n type AbiEventSignatureEmptyTopicsErrorType,\n AbiEventSignatureNotFoundError,\n type AbiEventSignatureNotFoundErrorType,\n AbiFunctionNotFoundError,\n type AbiFunctionNotFoundErrorType,\n AbiFunctionOutputsNotFoundError,\n type AbiFunctionOutputsNotFoundErrorType,\n AbiFunctionSignatureNotFoundError,\n type AbiFunctionSignatureNotFoundErrorType,\n BytesSizeMismatchError,\n type BytesSizeMismatchErrorType,\n DecodeLogDataMismatch,\n type DecodeLogDataMismatchErrorType,\n DecodeLogTopicsMismatch,\n type DecodeLogTopicsMismatchErrorType,\n InvalidAbiDecodingTypeError,\n type InvalidAbiDecodingTypeErrorType,\n InvalidAbiEncodingTypeError,\n type InvalidAbiEncodingTypeErrorType,\n InvalidArrayError,\n type InvalidArrayErrorType,\n InvalidDefinitionTypeError,\n type InvalidDefinitionTypeErrorType,\n UnsupportedPackedAbiType,\n type UnsupportedPackedAbiTypeErrorType,\n} from './errors/abi.js'\nexport {\n InvalidAddressError,\n type InvalidAddressErrorType,\n} from './errors/address.js'\nexport { BaseError, type BaseErrorType, setErrorConfig } from './errors/base.js'\nexport {\n BlockNotFoundError,\n type BlockNotFoundErrorType,\n} from './errors/block.js'\nexport {\n BundleFailedError,\n type BundleFailedErrorType,\n} from './errors/calls.js'\nexport {\n ChainDoesNotSupportContract,\n type ChainDoesNotSupportContractErrorType,\n ChainMismatchError,\n type ChainMismatchErrorType,\n ChainNotFoundError,\n type ChainNotFoundErrorType,\n ClientChainNotConfiguredError,\n type ClientChainNotConfiguredErrorType,\n InvalidChainIdError,\n type InvalidChainIdErrorType,\n} from './errors/chain.js'\nexport {\n CallExecutionError,\n type CallExecutionErrorType,\n ContractFunctionExecutionError,\n type ContractFunctionExecutionErrorType,\n ContractFunctionRevertedError,\n type ContractFunctionRevertedErrorType,\n ContractFunctionZeroDataError,\n type ContractFunctionZeroDataErrorType,\n CounterfactualDeploymentFailedError,\n type CounterfactualDeploymentFailedErrorType,\n RawContractError,\n type RawContractErrorType,\n} from './errors/contract.js'\nexport {\n SizeExceedsPaddingSizeError,\n type SizeExceedsPaddingSizeErrorType,\n SliceOffsetOutOfBoundsError,\n type SliceOffsetOutOfBoundsErrorType,\n} from './errors/data.js'\nexport {\n IntegerOutOfRangeError,\n type IntegerOutOfRangeErrorType,\n InvalidBytesBooleanError,\n type InvalidBytesBooleanErrorType,\n InvalidHexBooleanError,\n type InvalidHexBooleanErrorType,\n InvalidHexValueError,\n type InvalidHexValueErrorType,\n SizeOverflowError,\n type SizeOverflowErrorType,\n} from './errors/encoding.js'\nexport {\n type EnsAvatarInvalidMetadataError,\n type EnsAvatarInvalidMetadataErrorType,\n EnsAvatarInvalidNftUriError,\n type EnsAvatarInvalidNftUriErrorType,\n EnsAvatarUnsupportedNamespaceError,\n type EnsAvatarUnsupportedNamespaceErrorType,\n EnsAvatarUriResolutionError,\n type EnsAvatarUriResolutionErrorType,\n EnsInvalidChainIdError,\n type EnsInvalidChainIdErrorType,\n} from './errors/ens.js'\nexport {\n EstimateGasExecutionError,\n type EstimateGasExecutionErrorType,\n} from './errors/estimateGas.js'\nexport {\n BaseFeeScalarError,\n type BaseFeeScalarErrorType,\n Eip1559FeesNotSupportedError,\n type Eip1559FeesNotSupportedErrorType,\n MaxFeePerGasTooLowError,\n type MaxFeePerGasTooLowErrorType,\n} from './errors/fee.js'\nexport {\n FilterTypeNotSupportedError,\n type FilterTypeNotSupportedErrorType,\n} from './errors/log.js'\nexport {\n ExecutionRevertedError,\n type ExecutionRevertedErrorType,\n FeeCapTooHighError,\n type FeeCapTooHighErrorType,\n FeeCapTooLowError,\n type FeeCapTooLowErrorType,\n InsufficientFundsError,\n type InsufficientFundsErrorType,\n IntrinsicGasTooHighError,\n type IntrinsicGasTooHighErrorType,\n IntrinsicGasTooLowError,\n type IntrinsicGasTooLowErrorType,\n NonceMaxValueError,\n type NonceMaxValueErrorType,\n NonceTooHighError,\n type NonceTooHighErrorType,\n NonceTooLowError,\n type NonceTooLowErrorType,\n TipAboveFeeCapError,\n type TipAboveFeeCapErrorType,\n TransactionTypeNotSupportedError,\n type TransactionTypeNotSupportedErrorType,\n UnknownNodeError,\n type UnknownNodeErrorType,\n} from './errors/node.js'\nexport {\n HttpRequestError,\n type HttpRequestErrorType,\n RpcRequestError,\n type RpcRequestErrorType,\n SocketClosedError,\n type SocketClosedErrorType,\n TimeoutError,\n type TimeoutErrorType,\n WebSocketRequestError,\n type WebSocketRequestErrorType,\n} from './errors/request.js'\nexport {\n AtomicityNotSupportedError,\n type AtomicityNotSupportedErrorType,\n AtomicReadyWalletRejectedUpgradeError,\n type AtomicReadyWalletRejectedUpgradeErrorType,\n BundleTooLargeError,\n type BundleTooLargeErrorType,\n ChainDisconnectedError,\n type ChainDisconnectedErrorType,\n DuplicateIdError,\n type DuplicateIdErrorType,\n InternalRpcError,\n type InternalRpcErrorType,\n InvalidInputRpcError,\n type InvalidInputRpcErrorType,\n InvalidParamsRpcError,\n type InvalidParamsRpcErrorType,\n InvalidRequestRpcError,\n type InvalidRequestRpcErrorType,\n JsonRpcVersionUnsupportedError,\n type JsonRpcVersionUnsupportedErrorType,\n LimitExceededRpcError,\n type LimitExceededRpcErrorType,\n MethodNotFoundRpcError,\n type MethodNotFoundRpcErrorType,\n MethodNotSupportedRpcError,\n type MethodNotSupportedRpcErrorType,\n ParseRpcError,\n type ParseRpcErrorType,\n ProviderDisconnectedError,\n type ProviderDisconnectedErrorType,\n ProviderRpcError,\n type ProviderRpcErrorCode,\n type ProviderRpcErrorType,\n ResourceNotFoundRpcError,\n type ResourceNotFoundRpcErrorType,\n ResourceUnavailableRpcError,\n type ResourceUnavailableRpcErrorType,\n RpcError,\n type RpcErrorCode,\n type RpcErrorType,\n SwitchChainError,\n TransactionRejectedRpcError,\n type TransactionRejectedRpcErrorType,\n UnauthorizedProviderError,\n type UnauthorizedProviderErrorType,\n UnknownBundleIdError,\n type UnknownBundleIdErrorType,\n UnknownRpcError,\n type UnknownRpcErrorType,\n UnsupportedChainIdError,\n type UnsupportedChainIdErrorType,\n UnsupportedNonOptionalCapabilityError,\n type UnsupportedNonOptionalCapabilityErrorType,\n UnsupportedProviderMethodError,\n type UnsupportedProviderMethodErrorType,\n UserRejectedRequestError,\n type UserRejectedRequestErrorType,\n} from './errors/rpc.js'\nexport {\n AccountStateConflictError,\n type AccountStateConflictErrorType,\n StateAssignmentConflictError,\n type StateAssignmentConflictErrorType,\n} from './errors/stateOverride.js'\nexport {\n FeeConflictError,\n type FeeConflictErrorType,\n InvalidLegacyVError,\n type InvalidLegacyVErrorType,\n InvalidSerializableTransactionError,\n type InvalidSerializableTransactionErrorType,\n InvalidSerializedTransactionError,\n type InvalidSerializedTransactionErrorType,\n InvalidSerializedTransactionTypeError,\n type InvalidSerializedTransactionTypeErrorType,\n InvalidStorageKeySizeError,\n type InvalidStorageKeySizeErrorType,\n TransactionExecutionError,\n type TransactionExecutionErrorType,\n TransactionNotFoundError,\n type TransactionNotFoundErrorType,\n TransactionReceiptNotFoundError,\n type TransactionReceiptNotFoundErrorType,\n WaitForTransactionReceiptTimeoutError,\n type WaitForTransactionReceiptTimeoutErrorType,\n} from './errors/transaction.js'\nexport {\n UrlRequiredError,\n type UrlRequiredErrorType,\n} from './errors/transport.js'\nexport {\n InvalidDomainError,\n type InvalidDomainErrorType,\n InvalidPrimaryTypeError,\n type InvalidPrimaryTypeErrorType,\n InvalidStructTypeError,\n type InvalidStructTypeErrorType,\n} from './errors/typedData.js'\nexport {\n InvalidDecimalNumberError,\n type InvalidDecimalNumberErrorType,\n} from './errors/unit.js'\nexport type {\n DeriveAccount,\n HDKey,\n ParseAccount,\n} from './types/account.js'\nexport type {\n Authorization,\n AuthorizationList,\n AuthorizationRequest,\n SerializedAuthorization,\n SerializedAuthorizationList,\n SignedAuthorization,\n SignedAuthorizationList,\n} from './types/authorization.js'\nexport type {\n Block,\n BlockIdentifier,\n BlockNumber,\n BlockTag,\n Uncle,\n} from './types/block.js'\nexport type { Call, Calls } from './types/calls.js'\nexport type {\n Capabilities,\n /** @deprecated Use `Capabilities` instead. */\n Capabilities as WalletCapabilities,\n CapabilitiesSchema,\n /** @deprecated Use `ChainIdToCapabilities` instead. */\n ChainIdToCapabilities as WalletCapabilitiesRecord,\n ChainIdToCapabilities,\n ExtractCapabilities,\n} from './types/capabilities.js'\nexport type {\n Chain,\n ChainConfig,\n ChainContract,\n ChainEstimateFeesPerGasFn,\n ChainEstimateFeesPerGasFnParameters,\n ChainFees,\n ChainFeesFnParameters,\n ChainFormatter,\n ChainFormatters,\n ChainMaxPriorityFeePerGasFn,\n ChainSerializers,\n DeriveChain,\n ExtractChainFormatterExclude,\n ExtractChainFormatterParameters,\n ExtractChainFormatterReturnType,\n GetChainParameter,\n} from './types/chain.js'\nexport type {\n AbiEventParametersToPrimitiveTypes,\n AbiEventParameterToPrimitiveType,\n AbiEventTopicToPrimitiveType,\n AbiItem,\n AbiItemArgs,\n AbiItemName,\n ContractConstructorArgs,\n ContractErrorArgs,\n ContractErrorName,\n ContractEventArgs,\n ContractEventArgsFromTopics,\n ContractEventName,\n ContractFunctionArgs,\n ContractFunctionName,\n ContractFunctionParameters,\n ContractFunctionReturnType,\n EventDefinition,\n ExtractAbiFunctionForArgs,\n ExtractAbiItem,\n ExtractAbiItemForArgs,\n ExtractAbiItemNames,\n GetEventArgs,\n GetValue,\n LogTopicType,\n MaybeAbiEventName,\n MaybeExtractEventArgsFromAbi,\n UnionWiden,\n Widen,\n} from './types/contract.js'\nexport type {\n AddEthereumChainParameter,\n BundlerRpcSchema,\n DebugBundlerRpcSchema,\n EIP1193EventMap,\n EIP1193Events,\n EIP1193Parameters,\n EIP1193Provider,\n EIP1193RequestFn,\n EIP1474Methods,\n NetworkSync,\n PaymasterRpcSchema,\n ProviderConnectInfo,\n ProviderMessage,\n ProviderRpcErrorType as EIP1193ProviderRpcErrorType,\n PublicRpcSchema,\n RpcSchema,\n RpcSchemaOverride,\n TestRpcSchema,\n WalletCallReceipt,\n WalletGetAssetsParameters,\n WalletGetAssetsReturnType,\n WalletGetCallsStatusReturnType,\n WalletGrantPermissionsParameters,\n WalletGrantPermissionsReturnType,\n WalletPermission,\n WalletPermissionCaveat,\n WalletRpcSchema,\n WalletSendCallsParameters,\n WalletSendCallsReturnType,\n WatchAssetParams,\n} from './types/eip1193.js'\nexport { ProviderRpcError as EIP1193ProviderRpcError } from './types/eip1193.js'\nexport type { BlobSidecar, BlobSidecars } from './types/eip4844.js'\nexport type { AssetGateway, AssetGatewayUrls } from './types/ens.js'\nexport type {\n FeeHistory,\n FeeValues,\n FeeValuesEIP1559,\n FeeValuesEIP4844,\n FeeValuesLegacy,\n FeeValuesType,\n} from './types/fee.js'\nexport type { Filter, FilterType } from './types/filter.js'\nexport type { GetTransactionRequestKzgParameter, Kzg } from './types/kzg.js'\nexport type { Log } from './types/log.js'\nexport type {\n ByteArray,\n CompactSignature,\n Hash,\n Hex,\n LogTopic,\n SignableMessage,\n Signature,\n} from './types/misc.js'\nexport type {\n MulticallContracts,\n MulticallResponse,\n MulticallResults,\n} from './types/multicall.js'\nexport type { Register, ResolvedRegister } from './types/register.js'\nexport type {\n Index,\n Quantity,\n RpcAccountStateOverride,\n RpcAuthorization,\n RpcAuthorizationList,\n RpcBlock,\n RpcBlockIdentifier,\n RpcBlockNumber,\n RpcFeeHistory,\n RpcFeeValues,\n RpcLog,\n RpcProof,\n RpcStateMapping,\n RpcStateOverride,\n RpcTransaction,\n RpcTransactionReceipt,\n RpcTransactionRequest,\n RpcUncle,\n Status,\n} from './types/rpc.js'\nexport type {\n StateMapping,\n StateOverride,\n} from './types/stateOverride.js'\nexport type {\n AccessList,\n Transaction,\n TransactionBase,\n TransactionEIP1559,\n TransactionEIP2930,\n TransactionEIP4844,\n TransactionEIP7702,\n TransactionLegacy,\n TransactionReceipt,\n TransactionRequest,\n TransactionRequestBase,\n TransactionRequestEIP1559,\n TransactionRequestEIP2930,\n TransactionRequestEIP4844,\n TransactionRequestEIP7702,\n TransactionRequestGeneric,\n TransactionRequestLegacy,\n TransactionSerializable,\n TransactionSerializableBase,\n TransactionSerializableEIP1559,\n TransactionSerializableEIP2930,\n TransactionSerializableEIP4844,\n TransactionSerializableEIP7702,\n TransactionSerializableGeneric,\n TransactionSerializableLegacy,\n TransactionSerialized,\n TransactionSerializedEIP1559,\n TransactionSerializedEIP2930,\n TransactionSerializedEIP4844,\n TransactionSerializedEIP7702,\n TransactionSerializedGeneric,\n TransactionSerializedLegacy,\n TransactionType,\n} from './types/transaction.js'\nexport type { GetPollOptions, GetTransportConfig } from './types/transport.js'\nexport type { TypedDataDefinition } from './types/typedData.js'\nexport type {\n Assign,\n Branded,\n Evaluate,\n ExactPartial,\n ExactRequired,\n IsNarrowable,\n IsNever,\n IsUndefined,\n IsUnion,\n LooseOmit,\n MaybePartial,\n MaybePromise,\n MaybeRequired,\n Mutable,\n NoInfer,\n NoUndefined,\n Omit,\n OneOf,\n Or,\n PartialBy,\n Prettify,\n RequiredBy,\n Some,\n UnionEvaluate,\n UnionLooseOmit,\n UnionOmit,\n UnionPartialBy,\n UnionPick,\n UnionRequiredBy,\n UnionToTuple,\n ValueOf,\n} from './types/utils.js'\nexport type { Withdrawal } from './types/withdrawal.js'\nexport {\n type DecodeAbiParametersErrorType,\n type DecodeAbiParametersReturnType,\n decodeAbiParameters,\n} from './utils/abi/decodeAbiParameters.js'\nexport {\n type DecodeDeployDataErrorType,\n type DecodeDeployDataParameters,\n type DecodeDeployDataReturnType,\n decodeDeployData,\n} from './utils/abi/decodeDeployData.js'\nexport {\n type DecodeErrorResultErrorType,\n type DecodeErrorResultParameters,\n type DecodeErrorResultReturnType,\n decodeErrorResult,\n} from './utils/abi/decodeErrorResult.js'\nexport {\n type DecodeEventLogErrorType,\n type DecodeEventLogParameters,\n type DecodeEventLogReturnType,\n decodeEventLog,\n} from './utils/abi/decodeEventLog.js'\nexport {\n type DecodeFunctionDataErrorType,\n type DecodeFunctionDataParameters,\n type DecodeFunctionDataReturnType,\n decodeFunctionData,\n} from './utils/abi/decodeFunctionData.js'\nexport {\n type DecodeFunctionResultErrorType,\n type DecodeFunctionResultParameters,\n type DecodeFunctionResultReturnType,\n decodeFunctionResult,\n} from './utils/abi/decodeFunctionResult.js'\nexport {\n type EncodeAbiParametersErrorType,\n type EncodeAbiParametersReturnType,\n encodeAbiParameters,\n} from './utils/abi/encodeAbiParameters.js'\nexport {\n type EncodeDeployDataErrorType,\n type EncodeDeployDataParameters,\n type EncodeDeployDataReturnType,\n encodeDeployData,\n} from './utils/abi/encodeDeployData.js'\nexport {\n type EncodeErrorResultErrorType,\n type EncodeErrorResultParameters,\n type EncodeErrorResultReturnType,\n encodeErrorResult,\n} from './utils/abi/encodeErrorResult.js'\nexport {\n type EncodeEventTopicsErrorType,\n type EncodeEventTopicsParameters,\n type EncodeEventTopicsReturnType,\n encodeEventTopics,\n} from './utils/abi/encodeEventTopics.js'\nexport {\n type EncodeFunctionDataErrorType,\n type EncodeFunctionDataParameters,\n type EncodeFunctionDataReturnType,\n encodeFunctionData,\n} from './utils/abi/encodeFunctionData.js'\nexport {\n type EncodeFunctionResultErrorType,\n type EncodeFunctionResultParameters,\n type EncodeFunctionResultReturnType,\n encodeFunctionResult,\n} from './utils/abi/encodeFunctionResult.js'\nexport {\n type EncodePackedErrorType,\n encodePacked,\n} from './utils/abi/encodePacked.js'\nexport {\n type GetAbiItemErrorType,\n type GetAbiItemParameters,\n type GetAbiItemReturnType,\n getAbiItem,\n} from './utils/abi/getAbiItem.js'\nexport {\n type ParseEventLogsErrorType,\n type ParseEventLogsParameters,\n type ParseEventLogsReturnType,\n parseEventLogs,\n} from './utils/abi/parseEventLogs.js'\nexport {\n type PrepareEncodeFunctionDataErrorType,\n type PrepareEncodeFunctionDataParameters,\n type PrepareEncodeFunctionDataReturnType,\n prepareEncodeFunctionData,\n} from './utils/abi/prepareEncodeFunctionData.js'\nexport {\n type ChecksumAddressErrorType,\n checksumAddress,\n type GetAddressErrorType,\n getAddress,\n} from './utils/address/getAddress.js'\nexport {\n type GetContractAddressOptions,\n type GetCreate2AddressErrorType,\n type GetCreate2AddressOptions,\n type GetCreateAddressErrorType,\n type GetCreateAddressOptions,\n getContractAddress,\n getCreate2Address,\n getCreateAddress,\n} from './utils/address/getContractAddress.js'\nexport {\n type IsAddressErrorType,\n type IsAddressOptions,\n isAddress,\n} from './utils/address/isAddress.js'\nexport {\n type IsAddressEqualErrorType,\n type IsAddressEqualReturnType,\n isAddressEqual,\n} from './utils/address/isAddressEqual.js'\nexport {\n type BlobsToCommitmentsErrorType,\n type BlobsToCommitmentsParameters,\n type BlobsToCommitmentsReturnType,\n blobsToCommitments,\n} from './utils/blob/blobsToCommitments.js'\nexport {\n blobsToProofs,\n type blobsToProofsErrorType,\n type blobsToProofsParameters,\n type blobsToProofsReturnType,\n} from './utils/blob/blobsToProofs.js'\nexport {\n type CommitmentsToVersionedHashesErrorType,\n type CommitmentsToVersionedHashesParameters,\n type CommitmentsToVersionedHashesReturnType,\n commitmentsToVersionedHashes,\n} from './utils/blob/commitmentsToVersionedHashes.js'\nexport {\n type CommitmentToVersionedHashErrorType,\n type CommitmentToVersionedHashParameters,\n type CommitmentToVersionedHashReturnType,\n commitmentToVersionedHash,\n} from './utils/blob/commitmentToVersionedHash.js'\nexport {\n type FromBlobsErrorType,\n type FromBlobsParameters,\n type FromBlobsReturnType,\n fromBlobs,\n} from './utils/blob/fromBlobs.js'\nexport {\n type SidecarsToVersionedHashesErrorType,\n type SidecarsToVersionedHashesParameters,\n type SidecarsToVersionedHashesReturnType,\n sidecarsToVersionedHashes,\n} from './utils/blob/sidecarsToVersionedHashes.js'\nexport {\n type ToBlobSidecarsErrorType,\n type ToBlobSidecarsParameters,\n type ToBlobSidecarsReturnType,\n toBlobSidecars,\n} from './utils/blob/toBlobSidecars.js'\nexport {\n type ToBlobsErrorType,\n type ToBlobsParameters,\n type ToBlobsReturnType,\n toBlobs,\n} from './utils/blob/toBlobs.js'\nexport {\n type CcipRequestErrorType,\n type CcipRequestParameters,\n ccipRequest,\n /** @deprecated Use `ccipRequest`. */\n ccipRequest as ccipFetch,\n type OffchainLookupErrorType,\n offchainLookup,\n offchainLookupAbiItem,\n offchainLookupSignature,\n} from './utils/ccip.js'\nexport {\n type AssertCurrentChainErrorType,\n type AssertCurrentChainParameters,\n assertCurrentChain,\n} from './utils/chain/assertCurrentChain.js'\nexport { defineChain } from './utils/chain/defineChain.js'\nexport {\n type ExtractChainErrorType,\n type ExtractChainParameters,\n type ExtractChainReturnType,\n extractChain,\n} from './utils/chain/extractChain.js'\nexport {\n type GetChainContractAddressErrorType,\n getChainContractAddress,\n} from './utils/chain/getChainContractAddress.js'\nexport {\n type ConcatBytesErrorType,\n type ConcatErrorType,\n type ConcatHexErrorType,\n type ConcatReturnType,\n concat,\n concatBytes,\n concatHex,\n} from './utils/data/concat.js'\nexport { type IsBytesErrorType, isBytes } from './utils/data/isBytes.js'\nexport { type IsHexErrorType, isHex } from './utils/data/isHex.js'\nexport {\n type PadBytesErrorType,\n type PadErrorType,\n type PadHexErrorType,\n type PadReturnType,\n pad,\n padBytes,\n padHex,\n} from './utils/data/pad.js'\nexport { type SizeErrorType, size } from './utils/data/size.js'\nexport {\n type SliceBytesErrorType,\n type SliceErrorType,\n type SliceHexErrorType,\n slice,\n sliceBytes,\n sliceHex,\n} from './utils/data/slice.js'\nexport {\n type TrimErrorType,\n type TrimReturnType,\n trim,\n} from './utils/data/trim.js'\nexport {\n type BytesToBigIntErrorType,\n type BytesToBigIntOpts,\n type BytesToBoolErrorType,\n type BytesToBoolOpts,\n type BytesToNumberErrorType,\n type BytesToNumberOpts,\n type BytesToStringErrorType,\n type BytesToStringOpts,\n bytesToBigInt,\n bytesToBool,\n bytesToNumber,\n bytesToString,\n type FromBytesErrorType,\n type FromBytesParameters,\n fromBytes,\n} from './utils/encoding/fromBytes.js'\nexport {\n type FromHexErrorType,\n fromHex,\n type HexToBigIntErrorType,\n type HexToBoolErrorType,\n type HexToNumberErrorType,\n type HexToStringErrorType,\n hexToBigInt,\n hexToBool,\n hexToNumber,\n hexToString,\n} from './utils/encoding/fromHex.js'\nexport {\n type FromRlpErrorType,\n type FromRlpReturnType,\n fromRlp,\n} from './utils/encoding/fromRlp.js'\nexport {\n type BoolToBytesErrorType,\n type BoolToBytesOpts,\n boolToBytes,\n type HexToBytesErrorType,\n type HexToBytesOpts,\n hexToBytes,\n type NumberToBytesErrorType,\n numberToBytes,\n type StringToBytesErrorType,\n type StringToBytesOpts,\n stringToBytes,\n type ToBytesErrorType,\n type ToBytesParameters,\n toBytes,\n} from './utils/encoding/toBytes.js'\nexport {\n type BoolToHexErrorType,\n type BoolToHexOpts,\n type BytesToHexErrorType,\n type BytesToHexOpts,\n boolToHex,\n bytesToHex,\n type NumberToHexErrorType,\n type NumberToHexOpts,\n numberToHex,\n type StringToHexErrorType,\n type StringToHexOpts,\n stringToHex,\n type ToHexErrorType,\n type ToHexParameters,\n toHex,\n} from './utils/encoding/toHex.js'\nexport {\n type BytesToRlpErrorType,\n bytesToRlp,\n type HexToRlpErrorType,\n hexToRlp,\n type ToRlpErrorType,\n type ToRlpReturnType,\n toRlp,\n} from './utils/encoding/toRlp.js'\nexport { type LabelhashErrorType, labelhash } from './utils/ens/labelhash.js'\nexport { type NamehashErrorType, namehash } from './utils/ens/namehash.js'\nexport {\n type ToCoinTypeError,\n toCoinType,\n} from './utils/ens/toCoinType.js'\nexport {\n type GetContractErrorReturnType,\n getContractError,\n} from './utils/errors/getContractError.js'\nexport {\n type DefineBlockErrorType,\n defineBlock,\n type FormatBlockErrorType,\n type FormattedBlock,\n formatBlock,\n} from './utils/formatters/block.js'\nexport { type FormatLogErrorType, formatLog } from './utils/formatters/log.js'\nexport {\n type DefineTransactionErrorType,\n defineTransaction,\n type FormatTransactionErrorType,\n type FormattedTransaction,\n formatTransaction,\n transactionType,\n} from './utils/formatters/transaction.js'\nexport {\n type DefineTransactionReceiptErrorType,\n defineTransactionReceipt,\n type FormatTransactionReceiptErrorType,\n type FormattedTransactionReceipt,\n formatTransactionReceipt,\n} from './utils/formatters/transactionReceipt.js'\nexport {\n type DefineTransactionRequestErrorType,\n defineTransactionRequest,\n type FormatTransactionRequestErrorType,\n type FormattedTransactionRequest,\n formatTransactionRequest,\n rpcTransactionType,\n} from './utils/formatters/transactionRequest.js'\nexport { type IsHashErrorType, isHash } from './utils/hash/isHash.js'\nexport {\n type Keccak256ErrorType,\n type Keccak256Hash,\n keccak256,\n} from './utils/hash/keccak256.js'\nexport {\n type Ripemd160ErrorType,\n type Ripemd160Hash,\n ripemd160,\n} from './utils/hash/ripemd160.js'\nexport {\n type Sha256ErrorType,\n type Sha256Hash,\n sha256,\n} from './utils/hash/sha256.js'\nexport {\n type ToEventHashErrorType,\n toEventHash,\n} from './utils/hash/toEventHash.js'\nexport {\n type ToEventSelectorErrorType,\n /** @deprecated use `ToEventSelectorErrorType`. */\n type ToEventSelectorErrorType as GetEventSelectorErrorType,\n toEventSelector,\n /** @deprecated use `toEventSelector`. */\n toEventSelector as getEventSelector,\n} from './utils/hash/toEventSelector.js'\nexport {\n type ToEventSignatureErrorType,\n /** @deprecated use `ToEventSignatureErrorType`. */\n type ToEventSignatureErrorType as GetEventSignatureErrorType,\n toEventSignature,\n /** @deprecated use `toEventSignature`. */\n toEventSignature as getEventSignature,\n} from './utils/hash/toEventSignature.js'\nexport {\n type ToFunctionHashErrorType,\n toFunctionHash,\n} from './utils/hash/toFunctionHash.js'\nexport {\n type ToFunctionSelectorErrorType,\n /** @deprecated use `ToFunctionSelectorErrorType`. */\n type ToFunctionSelectorErrorType as GetFunctionSelectorErrorType,\n toFunctionSelector,\n /** @deprecated use `toFunctionSelector`. */\n toFunctionSelector as getFunctionSelector,\n} from './utils/hash/toFunctionSelector.js'\nexport {\n type ToFunctionSignatureErrorType,\n /** @deprecated use `ToFunctionSignatureErrorType`. */\n type ToFunctionSignatureErrorType as GetFunctionSignatureErrorType,\n toFunctionSignature,\n /** @deprecated use `toFunctionSignature`. */\n toFunctionSignature as getFunctionSignature,\n} from './utils/hash/toFunctionSignature.js'\nexport {\n type DefineKzgErrorType,\n type DefineKzgParameters,\n type DefineKzgReturnType,\n defineKzg,\n} from './utils/kzg/defineKzg.js'\nexport {\n type SetupKzgErrorType,\n type SetupKzgParameters,\n type SetupKzgReturnType,\n setupKzg,\n} from './utils/kzg/setupKzg.js'\nexport {\n type CreateNonceManagerParameters,\n createNonceManager,\n type NonceManager,\n type NonceManagerSource,\n nonceManager,\n} from './utils/nonceManager.js'\nexport { withCache } from './utils/promise/withCache.js'\nexport {\n type WithRetryErrorType,\n withRetry,\n} from './utils/promise/withRetry.js'\nexport {\n type WithTimeoutErrorType,\n withTimeout,\n} from './utils/promise/withTimeout.js'\nexport {\n type CompactSignatureToSignatureErrorType,\n compactSignatureToSignature,\n} from './utils/signature/compactSignatureToSignature.js'\nexport {\n type HashMessageErrorType,\n hashMessage,\n} from './utils/signature/hashMessage.js'\nexport {\n type HashDomainErrorType,\n type HashStructErrorType,\n type HashTypedDataErrorType,\n type HashTypedDataParameters,\n type HashTypedDataReturnType,\n hashDomain,\n hashStruct,\n hashTypedData,\n} from './utils/signature/hashTypedData.js'\nexport {\n type IsErc6492SignatureErrorType,\n type IsErc6492SignatureParameters,\n type IsErc6492SignatureReturnType,\n isErc6492Signature,\n} from './utils/signature/isErc6492Signature.js'\nexport {\n type IsErc8010SignatureErrorType,\n type IsErc8010SignatureParameters,\n type IsErc8010SignatureReturnType,\n isErc8010Signature,\n} from './utils/signature/isErc8010Signature.js'\nexport {\n /** @deprecated Use `ParseCompactSignatureErrorType`. */\n type ParseCompactSignatureErrorType as HexToCompactSignatureErrorType,\n type ParseCompactSignatureErrorType,\n /** @deprecated Use `parseCompactSignature`. */\n parseCompactSignature as hexToCompactSignature,\n parseCompactSignature,\n} from './utils/signature/parseCompactSignature.js'\nexport {\n type ParseErc6492SignatureErrorType,\n type ParseErc6492SignatureParameters,\n type ParseErc6492SignatureReturnType,\n parseErc6492Signature,\n} from './utils/signature/parseErc6492Signature.js'\nexport {\n type ParseErc8010SignatureErrorType,\n type ParseErc8010SignatureParameters,\n type ParseErc8010SignatureReturnType,\n parseErc8010Signature,\n} from './utils/signature/parseErc8010Signature.js'\nexport {\n /** @deprecated Use `ParseSignatureErrorType`. */\n type ParseSignatureErrorType as HexToSignatureErrorType,\n type ParseSignatureErrorType,\n /** @deprecated Use `parseSignature`. */\n parseSignature as hexToSignature,\n parseSignature,\n} from './utils/signature/parseSignature.js'\nexport {\n type RecoverAddressErrorType,\n type RecoverAddressParameters,\n type RecoverAddressReturnType,\n recoverAddress,\n} from './utils/signature/recoverAddress.js'\nexport {\n type RecoverMessageAddressErrorType,\n type RecoverMessageAddressParameters,\n type RecoverMessageAddressReturnType,\n recoverMessageAddress,\n} from './utils/signature/recoverMessageAddress.js'\nexport {\n type RecoverPublicKeyErrorType,\n type RecoverPublicKeyParameters,\n type RecoverPublicKeyReturnType,\n recoverPublicKey,\n} from './utils/signature/recoverPublicKey.js'\nexport {\n type RecoverTransactionAddressErrorType,\n type RecoverTransactionAddressParameters,\n type RecoverTransactionAddressReturnType,\n recoverTransactionAddress,\n} from './utils/signature/recoverTransactionAddress.js'\nexport {\n type RecoverTypedDataAddressErrorType,\n type RecoverTypedDataAddressParameters,\n type RecoverTypedDataAddressReturnType,\n recoverTypedDataAddress,\n} from './utils/signature/recoverTypedDataAddress.js'\nexport {\n /** @deprecated Use `SignatureToHexErrorType` instead. */\n type SerializeCompactSignatureErrorType as CompactSignatureToHexErrorType,\n type SerializeCompactSignatureErrorType,\n /** @deprecated Use `serializeCompactSignature` instead. */\n serializeCompactSignature as compactSignatureToHex,\n serializeCompactSignature,\n} from './utils/signature/serializeCompactSignature.js'\nexport {\n type SerializeErc6492SignatureErrorType,\n type SerializeErc6492SignatureParameters,\n type SerializeErc6492SignatureReturnType,\n serializeErc6492Signature,\n} from './utils/signature/serializeErc6492Signature.js'\nexport {\n type SerializeErc8010SignatureErrorType,\n type SerializeErc8010SignatureParameters,\n type SerializeErc8010SignatureReturnType,\n serializeErc8010Signature,\n} from './utils/signature/serializeErc8010Signature.js'\nexport {\n /** @deprecated Use `SignatureToHexErrorType` instead. */\n type SerializeSignatureErrorType as SignatureToHexErrorType,\n type SerializeSignatureErrorType,\n type SerializeSignatureParameters,\n type SerializeSignatureReturnType,\n /** @deprecated Use `serializeSignature` instead. */\n serializeSignature as signatureToHex,\n serializeSignature,\n} from './utils/signature/serializeSignature.js'\nexport {\n type SignatureToCompactSignatureErrorType,\n signatureToCompactSignature,\n} from './utils/signature/signatureToCompactSignature.js'\nexport {\n type ToPrefixedMessageErrorType,\n toPrefixedMessage,\n} from './utils/signature/toPrefixedMessage.js'\nexport {\n type VerifyHashErrorType,\n type VerifyHashParameters,\n type VerifyHashReturnType,\n verifyHash,\n} from './utils/signature/verifyHash.js'\nexport {\n type VerifyMessageErrorType,\n type VerifyMessageParameters,\n type VerifyMessageReturnType,\n verifyMessage,\n} from './utils/signature/verifyMessage.js'\nexport {\n type VerifyTypedDataErrorType,\n type VerifyTypedDataParameters,\n type VerifyTypedDataReturnType,\n verifyTypedData,\n} from './utils/signature/verifyTypedData.js'\nexport { type StringifyErrorType, stringify } from './utils/stringify.js'\nexport {\n type AssertRequestErrorType,\n assertRequest,\n} from './utils/transaction/assertRequest.js'\nexport {\n type AssertTransactionEIP1559ErrorType,\n type AssertTransactionEIP2930ErrorType,\n type AssertTransactionLegacyErrorType,\n assertTransactionEIP1559,\n assertTransactionEIP2930,\n assertTransactionLegacy,\n} from './utils/transaction/assertTransaction.js'\nexport {\n type GetSerializedTransactionType,\n type GetSerializedTransactionTypeErrorType,\n getSerializedTransactionType,\n} from './utils/transaction/getSerializedTransactionType.js'\nexport {\n type GetTransactionType,\n type GetTransactionTypeErrorType,\n getTransactionType,\n} from './utils/transaction/getTransactionType.js'\nexport {\n type ParseTransactionErrorType,\n type ParseTransactionReturnType,\n parseTransaction,\n} from './utils/transaction/parseTransaction.js'\nexport {\n type SerializeAccessListErrorType,\n serializeAccessList,\n} from './utils/transaction/serializeAccessList.js'\nexport {\n type SerializedTransactionReturnType,\n type SerializeTransactionErrorType,\n type SerializeTransactionFn,\n serializeTransaction,\n} from './utils/transaction/serializeTransaction.js'\nexport {\n type DomainSeparatorErrorType,\n domainSeparator,\n type GetTypesForEIP712DomainErrorType,\n getTypesForEIP712Domain,\n type SerializeTypedDataErrorType,\n serializeTypedData,\n type ValidateTypedDataErrorType,\n validateTypedData,\n} from './utils/typedData.js'\nexport {\n type FormatEtherErrorType,\n formatEther,\n} from './utils/unit/formatEther.js'\nexport {\n type FormatGweiErrorType,\n formatGwei,\n} from './utils/unit/formatGwei.js'\nexport {\n type FormatUnitsErrorType,\n formatUnits,\n} from './utils/unit/formatUnits.js'\nexport {\n type ParseEtherErrorType,\n parseEther,\n} from './utils/unit/parseEther.js'\nexport { type ParseGweiErrorType, parseGwei } from './utils/unit/parseGwei.js'\nexport {\n type ParseUnitsErrorType,\n parseUnits,\n} from './utils/unit/parseUnits.js'\n","/**\n * DKG Manager for iframe\n *\n * Handles Distributed Key Generation inside secure iframe context\n * Uses existing dkls23-wasm module and TSS backend\n */\n\nimport init, * as tss from 'dkls23-wasm';\nimport { keccak256 } from 'viem';\nimport type { DKGResult } from './types';\nimport { TokenRefreshApiClient } from './token-refresh-client';\n\nexport class DKGManager extends TokenRefreshApiClient {\n private wasmLoaded: boolean = false;\n\n constructor() {\n super();\n console.log('[iframe][DKG] Initialized with TSS URL:', this.tssUrl);\n }\n\n /**\n * Initialize WASM module\n */\n async initialize(): Promise<void> {\n if (this.wasmLoaded) return;\n\n try {\n await init();\n this.wasmLoaded = true;\n console.log('[iframe][DKG] ✅ WASM module loaded');\n\n // Store WASM API globally for access\n (globalThis as any).__tss_wasm_api__ = tss;\n (globalThis as any).__tss_wasm_active__ = true;\n\n // Log memory info if available\n if (typeof (tss as any).wasm_memory_info === 'function') {\n try {\n const memInfo = (tss as any).wasm_memory_info();\n console.log('[iframe][DKG] WASM memory:', memInfo);\n } catch {}\n }\n } catch (error) {\n this.wasmLoaded = true;\n console.error('[iframe][DKG] Failed to load WASM:', error);\n throw new Error('Failed to initialize TSS WASM module');\n }\n }\n\n /**\n * Perform complete DKG protocol\n */\n async performDKG(userId: string, projectId: string, accessToken?: string): Promise<DKGResult> {\n if (!this.wasmLoaded) {\n await this.initialize();\n }\n\n console.log('[iframe][DKG] Starting DKG for user:', userId, 'projectId:', projectId, 'hasToken:', !!accessToken);\n\n // DKG Parameters (2-of-2 threshold signature)\n const CLIENT_PARTY_ID = 1;\n const THRESHOLD = 2;\n const TOTAL_PARTIES = 2;\n const DOMAIN_LABEL = this.generateDomainLabel(userId);\n\n // Step 1: Client starts DKG locally\n const clientStartResult = (tss as any).dkg_start(\n CLIENT_PARTY_ID,\n THRESHOLD,\n TOTAL_PARTIES,\n DOMAIN_LABEL\n );\n\n if (!Array.isArray(clientStartResult) || clientStartResult.length < 2) {\n throw new Error('Invalid dkg_start result format');\n }\n\n let clientState = clientStartResult[0];\n const clientMsg1 = clientStartResult[1];\n\n console.log('[iframe][DKG] Client started, sending to server...');\n\n // Step 2: Start DKG on server\n const serverStartResponse = await this.apiCall('POST', `/api/tss/${userId}/dkg/start`, {\n threshold: THRESHOLD,\n parties: TOTAL_PARTIES,\n domainLabel: DOMAIN_LABEL,\n }, projectId, accessToken);\n\n const { sessionId, msg1: serverMsg1 } = serverStartResponse;\n\n if (!serverMsg1?.kind || !serverMsg1.data_b64) {\n throw new Error('Invalid server msg1 format');\n }\n\n console.log('[iframe][DKG] Server started, sessionId:', sessionId);\n\n // Step 3: Round 1 - Exchange messages\n console.log('[iframe][DKG] Round 1: Exchanging messages...');\n\n const round1Response = await this.apiCall('POST', `/api/tss/${userId}/dkg/round`, {\n sessionId,\n clientMsg: clientMsg1,\n }, projectId, accessToken);\n\n const serverMsg2 = this.extractServerMessage(round1Response);\n\n const clientR2Result = (tss as any).dkg_handle(\n JSON.stringify({ bytes_b64: clientState.bytes_b64 }),\n JSON.stringify(serverMsg1)\n );\n\n clientState = clientR2Result[0];\n const clientMsg2 = clientR2Result[1];\n\n // Step 4: Round 2\n console.log('[iframe][DKG] Round 2: Exchanging messages...');\n\n const round2Response = await this.apiCall('POST', `/api/tss/${userId}/dkg/round`, {\n sessionId,\n clientMsg: clientMsg2,\n }, projectId, accessToken);\n\n const serverMsg3 = this.extractServerMessage(round2Response);\n\n const clientR3Result = (tss as any).dkg_handle(\n JSON.stringify({ bytes_b64: clientState.bytes_b64 }),\n JSON.stringify(serverMsg2)\n );\n\n clientState = clientR3Result[0];\n const clientMsg3 = clientR3Result[1];\n\n // Step 5: Round 3 (Final)\n console.log('[iframe][DKG] Round 3 (Final): Getting public key...');\n\n const finalResponse = await this.apiCall('POST', `/api/tss/${userId}/dkg/round`, {\n sessionId,\n clientMsg: clientMsg3,\n }, projectId, accessToken);\n\n if (!finalResponse.publicKey && !finalResponse.pubkey) {\n throw new Error('No public key in final response');\n }\n\n const publicKey = finalResponse.publicKey || finalResponse.pubkey;\n\n // Step 6: Final client processing to get keyshare\n console.log('[iframe][DKG] Processing final client keyshare...');\n\n const clientFinalResult = (tss as any).dkg_handle(\n JSON.stringify({ bytes_b64: clientState.bytes_b64 }),\n JSON.stringify(serverMsg3)\n );\n\n if (!Array.isArray(clientFinalResult) || clientFinalResult.length < 3) {\n throw new Error('Invalid final dkg_handle result format');\n }\n\n const clientFinish = clientFinalResult[2];\n\n if (!clientFinish?.keyshare_b64) {\n throw new Error('No keyshare_b64 in final result');\n }\n\n // Derive Ethereum address from public key\n const ownerAddress = this.deriveAddress(publicKey);\n\n console.log('[iframe][DKG] ✅ DKG completed successfully');\n console.log('[iframe][DKG] Owner address:', ownerAddress);\n\n return {\n keyshare: clientFinish,\n ownerAddress,\n sessionId,\n };\n }\n\n /**\n * Derive Ethereum address from uncompressed public key\n */\n private deriveAddress(publicKeyBase64: string): `0x${string}` {\n // Convert base64 to bytes\n const b64decoded = atob(publicKeyBase64);\n const bytes = new Uint8Array(b64decoded.length);\n for (let i = 0; i < b64decoded.length; i++) {\n bytes[i] = b64decoded.charCodeAt(i);\n }\n\n // Remove 0x04 prefix (uncompressed key indicator)\n const pubkeyBytes = bytes.slice(1);\n\n // Convert to hex\n const pubkeyHex = Array.from(pubkeyBytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n\n // Keccak256 hash\n const hash = keccak256(`0x${pubkeyHex}`);\n\n // Take last 20 bytes (40 hex chars)\n const addr = hash.slice(-40);\n\n // Apply EIP-55 checksum\n return this.toChecksumAddress(`0x${addr}`);\n }\n\n /**\n * Apply EIP-55 checksum to address\n */\n private toChecksumAddress(address: string): `0x${string}` {\n const addr = address.toLowerCase().replace('0x', '');\n const encoder = new TextEncoder();\n const addrBytes = encoder.encode(addr);\n const hash = keccak256(addrBytes).replace('0x', '');\n\n let checksumAddress = '0x';\n for (let i = 0; i < addr.length; i++) {\n checksumAddress += parseInt(hash[i], 16) >= 8 ? addr[i].toUpperCase() : addr[i];\n }\n\n return checksumAddress as `0x${string}`;\n }\n\n /**\n * Generate secure domain label for DKG\n */\n private generateDomainLabel(userId: string): string {\n const timestamp = Date.now();\n const randomBytes = new Uint8Array(16);\n crypto.getRandomValues(randomBytes);\n const randomHex = Array.from(randomBytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n\n return `dkls23:2of2:aa:${userId}:${timestamp}:${randomHex}`;\n }\n\n /**\n * Extract server message from response\n */\n private extractServerMessage(response: any): any {\n return response?.msgNext || response?.msg_next || response?.msg || null;\n }\n}\n","/**\n * Secure Messenger for iframe\n *\n * Handles secure postMessage communication with HMAC authentication,\n * replay protection, and origin validation\n */\n\nimport type { SecureMessage } from './types';\n\ninterface PendingMessage {\n resolve: (value: any) => void;\n reject: (error: Error) => void;\n timeout: number;\n}\n\nexport class SecureMessenger {\n private allowedOrigins: Set<string> = new Set();\n private usedNonces: Set<string> = new Set();\n private pendingMessages: Map<string, PendingMessage> = new Map();\n private sessionToken: string | null = null;\n private messageHandlers: Array<(message: SecureMessage, origin: string) => Promise<void>> = [];\n\n private readonly MESSAGE_TIMEOUT = 60000; // 60 seconds\n private readonly NONCE_CLEANUP_INTERVAL = 5 * 60 * 1000; // 5 minutes\n\n // Debug flag: set to true to log all filtered messages (for debugging only)\n private readonly DEBUG_FILTERED_MESSAGES = false;\n\n constructor() {\n // Periodic nonce cleanup\n setInterval(() => this.cleanupOldNonces(), this.NONCE_CLEANUP_INTERVAL);\n }\n\n /**\n * Setup message listener with security validation\n */\n setupListener(handler: (message: SecureMessage, origin: string) => Promise<void>): void {\n this.messageHandlers.push(handler);\n\n window.addEventListener('message', async (event) => {\n try {\n await this.handleIncomingMessage(event);\n } catch (error) {\n console.error('[iframe][Messenger] Error handling message:', error);\n }\n });\n\n console.log('[iframe][Messenger] Message listener setup');\n }\n\n /**\n * Handle incoming postMessage\n */\n private async handleIncomingMessage(event: MessageEvent): Promise<void> {\n const message = event.data;\n const { origin } = event;\n\n // Quick filter: ignore messages that are clearly not ours\n // This prevents spam from browser extensions, dev tools, etc.\n if (!message || typeof message !== 'object' || !message.type) {\n // Silently ignore messages without basic structure\n if (this.DEBUG_FILTERED_MESSAGES && message) {\n console.debug('[iframe][Messenger] Filtered: no type field', message);\n }\n return;\n }\n\n // Check if this looks like our message format\n // Our messages always have: type, messageId, timestamp, nonce\n if (!this.isLumiaMessage(message)) {\n // Silently ignore messages that don't match our protocol\n if (this.DEBUG_FILTERED_MESSAGES) {\n console.debug('[iframe][Messenger] Filtered: not Lumia message', {\n type: message.type,\n origin,\n });\n }\n return;\n }\n\n // Full structure validation for our messages\n if (!this.validateMessageStructure(message)) {\n console.error('[iframe][Messenger] Invalid Lumia Passport message structure:', {\n type: message.type,\n hasMessageId: !!message.messageId,\n hasTimestamp: !!message.timestamp,\n hasNonce: !!message.nonce,\n hasProjectId: !!message.projectId,\n hasData: 'data' in message,\n });\n return;\n }\n\n // For SDK_AUTH, accept HTTPS origins (initial connection)\n // In development, allow localhost/127.0.0.1 over HTTP\n if (message.type === 'SDK_AUTH') {\n const isLocalhost = origin.startsWith('http://localhost:') || origin.startsWith('http://127.0.0.1:');\n const isHttps = origin.startsWith('https://');\n\n if (!isHttps && !isLocalhost) {\n console.error('[iframe][Messenger] Only HTTPS origins allowed (or localhost in dev)');\n return;\n }\n } else {\n // For other messages, validate origin is in allowed list\n if (!this.isAllowedOrigin(origin)) {\n console.error(`[iframe][Messenger] Rejected message from unauthorized origin: ${origin}`);\n return;\n }\n }\n\n // Validate timestamp (must be recent)\n const messageAge = Date.now() - message.timestamp;\n if (messageAge < 0 || messageAge > this.MESSAGE_TIMEOUT) {\n console.error(`[iframe][Messenger] Message timestamp invalid (age: ${messageAge}ms)`);\n return;\n }\n\n // Check nonce uniqueness (prevent replay attacks)\n if (this.usedNonces.has(message.nonce)) {\n console.error('[iframe][Messenger] Nonce already used (replay attack?)');\n return;\n }\n\n // Validate HMAC if session is established\n if (this.sessionToken && message.hmac) {\n const expectedHmac = await this.computeHMAC(message);\n if (!this.constantTimeCompare(expectedHmac, message.hmac)) {\n console.error('[iframe][Messenger] HMAC validation failed');\n return;\n }\n }\n\n // Mark nonce as used\n this.usedNonces.add(message.nonce);\n\n // Handle message\n for (const handler of this.messageHandlers) {\n await handler(message, origin);\n }\n }\n\n /**\n * Send response to parent\n */\n sendResponse(messageId: string, data: any, targetOrigin: string): void {\n if (!window.parent) {\n console.error('[iframe][Messenger] No parent window');\n return;\n }\n\n const response = {\n type: 'LUMIA_PASSPORT_RESPONSE',\n messageId,\n timestamp: Date.now(),\n data,\n };\n\n window.parent.postMessage(response, targetOrigin);\n console.log(`[iframe][Messenger] Sent response to ${targetOrigin}`);\n }\n\n /**\n * Send error to parent\n */\n sendError(messageId: string, error: string, targetOrigin: string): void {\n if (!window.parent) {\n console.error('[iframe][Messenger] No parent window');\n return;\n }\n\n const response = {\n type: 'LUMIA_PASSPORT_ERROR',\n messageId,\n timestamp: Date.now(),\n error,\n };\n\n window.parent.postMessage(response, targetOrigin);\n console.log(`[iframe][Messenger] Sent error to ${targetOrigin}: ${error}`);\n }\n\n /**\n * Add allowed origin\n */\n addAllowedOrigin(origin: string): void {\n this.allowedOrigins.add(origin);\n console.log(`[iframe][Messenger] Added allowed origin: ${origin}`);\n }\n\n /**\n * Remove allowed origin\n */\n removeAllowedOrigin(origin: string): void {\n this.allowedOrigins.delete(origin);\n console.log(`[iframe][Messenger] Removed allowed origin: ${origin}`);\n }\n\n /**\n * Set session token for HMAC\n */\n setSessionToken(token: string): void {\n this.sessionToken = token;\n console.log('[iframe][Messenger] Session token set');\n }\n\n /**\n * Quick check if message looks like Lumia Passport protocol\n * This filters out browser extension messages, dev tools, etc.\n */\n private isLumiaMessage(message: any): boolean {\n // Our messages must have these specific types\n const validTypes = [\n 'SDK_AUTH',\n 'AUTHENTICATE',\n 'START_DKG',\n 'SIGN_TRANSACTION',\n 'SIGN_TYPED_DATA',\n 'GET_ADDRESS',\n 'CHECK_KEYSHARE',\n 'GET_TRUSTED_APPS',\n 'REMOVE_TRUSTED_APP',\n 'CREATE_BACKUP',\n 'ENCRYPT_BACKUP_DATA',\n 'RESTORE_BACKUP',\n 'RESTORE_FROM_FILE',\n 'GET_BACKUP_STATUS',\n 'GET_CLOUD_PROVIDERS',\n 'REQUEST_NEW_TOKEN',\n 'RESPONSE',\n 'ERROR',\n 'TRUSTED_APP_REMOVED',\n 'TOKEN_REFRESHED',\n ];\n\n if (!message.type || !validTypes.includes(message.type)) {\n return false;\n }\n\n // Our messages always have messageId and timestamp\n // This filters out most non-Lumia messages\n return !!(message.messageId && message.timestamp);\n }\n\n /**\n * Validate message structure\n */\n private validateMessageStructure(message: any): boolean {\n return (\n message &&\n typeof message === 'object' &&\n typeof message.type === 'string' &&\n typeof message.messageId === 'string' &&\n typeof message.timestamp === 'number' &&\n typeof message.nonce === 'string' &&\n typeof message.projectId === 'string' &&\n 'data' in message\n );\n }\n\n /**\n * Check if origin is allowed\n */\n private isAllowedOrigin(origin: string): boolean {\n // Check if in allowed list\n if (this.allowedOrigins.has(origin)) {\n return true;\n }\n\n // During initialization, accept HTTPS or localhost\n if (this.allowedOrigins.size === 0) {\n const isLocalhost = origin.startsWith('http://localhost:') || origin.startsWith('http://127.0.0.1:');\n const isHttps = origin.startsWith('https://');\n return isHttps || isLocalhost;\n }\n\n return false;\n }\n\n /**\n * Compute HMAC-SHA256 for message authentication\n */\n private async computeHMAC(message: SecureMessage): Promise<string> {\n if (!this.sessionToken) {\n throw new Error('No session token for HMAC');\n }\n\n const encoder = new TextEncoder();\n const payload = JSON.stringify({\n type: message.type,\n messageId: message.messageId,\n timestamp: message.timestamp,\n nonce: message.nonce,\n data: JSON.stringify(message.data),\n });\n\n const data = encoder.encode(payload);\n const key = encoder.encode(this.sessionToken);\n\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n key,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n\n const signature = await crypto.subtle.sign('HMAC', cryptoKey, data);\n\n return Array.from(new Uint8Array(signature))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n\n /**\n * Constant-time string comparison (prevent timing attacks)\n */\n private constantTimeCompare(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n\n let result = 0;\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n\n return result === 0;\n }\n\n /**\n * Cleanup old nonces to prevent memory growth\n */\n private cleanupOldNonces(): void {\n if (this.usedNonces.size > 1000) {\n // Keep only the most recent 500 nonces\n const noncesArray = Array.from(this.usedNonces);\n this.usedNonces = new Set(noncesArray.slice(-500));\n console.log('[iframe][Messenger] Cleaned up old nonces');\n }\n }\n\n /**\n * Get messenger statistics\n */\n getStats(): {\n allowedOrigins: number;\n usedNonces: number;\n pendingMessages: number;\n } {\n return {\n allowedOrigins: this.allowedOrigins.size,\n usedNonces: this.usedNonces.size,\n pendingMessages: this.pendingMessages.size,\n };\n }\n}\n","/**\n * Session Manager for iframe\n *\n * Manages sessions between iframe and parent applications\n * Each session represents an authenticated connection from a parent origin\n */\n\nimport type { Session } from './types';\n\nexport class SessionManager {\n private sessions: Map<string, Session> = new Map();\n private readonly SESSION_TIMEOUT = 30 * 60 * 1000; // 30 minutes\n\n constructor() {\n // Cleanup expired sessions periodically\n setInterval(() => this.cleanupExpiredSessions(), 5 * 60 * 1000); // Every 5 minutes\n }\n\n /**\n * Create a new session\n */\n createSession(projectId: string, origin: string): string {\n const sessionToken = this.generateSecureToken();\n\n const session: Session = {\n token: sessionToken,\n projectId,\n origin,\n createdAt: Date.now(),\n lastActivity: Date.now(),\n };\n\n this.sessions.set(sessionToken, session);\n\n console.log(`[iframe][Session] Created session for origin: ${origin}`);\n console.log(`[iframe][Session] Project ID: ${projectId}`);\n\n return sessionToken;\n }\n\n /**\n * Validate session token and origin\n */\n validateSession(sessionToken: string, origin: string): boolean {\n const session = this.sessions.get(sessionToken);\n\n if (!session) {\n console.warn(`[iframe][Session] Session not found: ${sessionToken}`);\n return false;\n }\n\n // Check origin matches\n if (session.origin !== origin) {\n console.error(`[iframe][Session] Origin mismatch: expected ${session.origin}, got ${origin}`);\n return false;\n }\n\n // Check session timeout\n const age = Date.now() - session.lastActivity;\n if (age > this.SESSION_TIMEOUT) {\n console.warn(`[iframe][Session] Session expired (age: ${age}ms)`);\n this.sessions.delete(sessionToken);\n return false;\n }\n\n // Update last activity\n session.lastActivity = Date.now();\n\n return true;\n }\n\n /**\n * Get session by token\n */\n getSession(sessionToken: string): Session | null {\n return this.sessions.get(sessionToken) || null;\n }\n\n /**\n * Invalidate session\n */\n invalidateSession(sessionToken: string): void {\n const session = this.sessions.get(sessionToken);\n if (session) {\n console.log(`[iframe][Session] Invalidated session for origin: ${session.origin}`);\n this.sessions.delete(sessionToken);\n }\n }\n\n /**\n * Get all sessions for a project\n */\n getProjectSessions(projectId: string): Session[] {\n return Array.from(this.sessions.values()).filter(\n (session) => session.projectId === projectId\n );\n }\n\n /**\n * Generate cryptographically secure session token\n */\n private generateSecureToken(): string {\n const buffer = new Uint8Array(32);\n crypto.getRandomValues(buffer);\n return Array.from(buffer, (byte) => byte.toString(16).padStart(2, '0')).join('');\n }\n\n /**\n * Cleanup expired sessions\n */\n private cleanupExpiredSessions(): void {\n const now = Date.now();\n let cleanedCount = 0;\n\n for (const [token, session] of this.sessions.entries()) {\n const age = now - session.lastActivity;\n if (age > this.SESSION_TIMEOUT) {\n this.sessions.delete(token);\n cleanedCount++;\n }\n }\n\n if (cleanedCount > 0) {\n console.log(`[iframe][Session] Cleaned up ${cleanedCount} expired sessions`);\n }\n }\n\n /**\n * Check if there is an active session for a given origin\n */\n hasSession(origin: string): boolean {\n const now = Date.now();\n\n for (const session of this.sessions.values()) {\n if (session.origin === origin) {\n // Check if session is not expired\n const age = now - session.lastActivity;\n if (age <= this.SESSION_TIMEOUT) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Get session statistics\n */\n getStats(): { total: number; byProject: Record<string, number> } {\n const stats: { total: number; byProject: Record<string, number> } = {\n total: this.sessions.size,\n byProject: {},\n };\n\n for (const session of this.sessions.values()) {\n stats.byProject[session.projectId] = (stats.byProject[session.projectId] || 0) + 1;\n }\n\n return stats;\n }\n}\n","/**\n * Storage Manager for iframe\n *\n * Manages key shares in ISOLATED localStorage (auth.lumiapassport.com origin)\n * This is the CRITICAL security boundary - keys never leave this origin\n */\n\nimport type { KeyshareData } from './types';\n\nexport class StorageManager {\n private readonly storage: Storage;\n\n constructor() {\n if (typeof window === 'undefined' || !window.localStorage) {\n throw new Error('localStorage not available in iframe');\n }\n this.storage = window.localStorage;\n\n console.log('[iframe][Storage] Initialized');\n console.log('[iframe][Storage] Origin:', window.location.origin);\n }\n\n /**\n * Save keyshare to IFRAME localStorage\n * CRITICAL: This is the secure isolated storage\n */\n saveKeyshare(userId: string, data: KeyshareData): void {\n try {\n const keyshareKey = `tss.${userId}.keyshare`;\n\n // Store keyshare data\n this.storage.setItem(keyshareKey, JSON.stringify({\n keyshare_b64: data.keyshare_b64,\n }));\n\n // Store owner address\n this.storage.setItem(`tss.${userId}.ownerAddress`, data.ownerAddress);\n\n // Store session ID\n this.storage.setItem(`tss.${userId}.sessionId`, data.sessionId);\n\n console.log(`[iframe][Storage] ✅ Saved keyshare for user: ${userId}`);\n console.log(`[iframe][Storage] Storage origin: ${window.location.origin}`);\n } catch (error) {\n console.error('[iframe][Storage] Failed to save keyshare:', error);\n throw new Error(`Failed to save keyshare: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Load keyshare from IFRAME localStorage\n */\n loadKeyshare(userId: string): KeyshareData | null {\n try {\n const keyshareKey = `tss.${userId}.keyshare`;\n const keyshareData = this.storage.getItem(keyshareKey);\n\n if (!keyshareData) {\n console.log(`[iframe][Storage] No keyshare found for user: ${userId}`);\n return null;\n }\n\n const parsed = JSON.parse(keyshareData);\n const ownerAddress = this.storage.getItem(`tss.${userId}.ownerAddress`);\n const sessionId = this.storage.getItem(`tss.${userId}.sessionId`);\n\n if (!ownerAddress || !sessionId) {\n console.error('[iframe][Storage] Missing owner address or session ID');\n return null;\n }\n\n return {\n keyshare_b64: parsed.keyshare_b64,\n ownerAddress: ownerAddress as `0x${string}`,\n sessionId,\n };\n } catch (error) {\n console.error('[iframe][Storage] Failed to load keyshare:', error);\n return null;\n }\n }\n\n /**\n * Check if keyshare exists for user\n */\n hasKeyshare(userId: string): boolean {\n const keyshareKey = `tss.${userId}.keyshare`;\n const ownerAddressKey = `tss.${userId}.ownerAddress`;\n\n const hasKeyshare = this.storage.getItem(keyshareKey) !== null;\n const hasAddress = this.storage.getItem(ownerAddressKey) !== null;\n\n return hasKeyshare && hasAddress;\n }\n\n /**\n * Get owner address for user\n */\n getOwnerAddress(userId: string): `0x${string}` | null {\n const address = this.storage.getItem(`tss.${userId}.ownerAddress`);\n return address ? (address as `0x${string}`) : null;\n }\n\n /**\n * Get session ID for user\n */\n getSessionId(userId: string): string | null {\n return this.storage.getItem(`tss.${userId}.sessionId`);\n }\n\n /**\n * Remove keyshare for user\n */\n removeKeyshare(userId: string): void {\n try {\n this.storage.removeItem(`tss.${userId}.keyshare`);\n this.storage.removeItem(`tss.${userId}.ownerAddress`);\n this.storage.removeItem(`tss.${userId}.sessionId`);\n\n // Remove any DKG-related keys\n const allKeys = Object.keys(this.storage);\n const userKeys = allKeys.filter(key => key.startsWith(`tss.${userId}.`));\n userKeys.forEach(key => this.storage.removeItem(key));\n\n console.log(`[iframe][Storage] ✅ Removed keyshare for user: ${userId}`);\n } catch (error) {\n console.error('[iframe][Storage] Failed to remove keyshare:', error);\n throw new Error(`Failed to remove keyshare: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * List all users with keyshares (for debugging)\n */\n listUsers(): string[] {\n const allKeys = Object.keys(this.storage);\n const keyshareKeys = allKeys.filter(key => key.endsWith('.keyshare'));\n\n return keyshareKeys.map(key => {\n const match = key.match(/^tss\\.(.+)\\.keyshare$/);\n return match ? match[1] : null;\n }).filter(Boolean) as string[];\n }\n\n /**\n * Get storage statistics (for debugging)\n */\n getStats(): { totalKeys: number; users: number; storageSize: number } {\n const allKeys = Object.keys(this.storage);\n const users = this.listUsers();\n\n let storageSize = 0;\n allKeys.forEach(key => {\n const value = this.storage.getItem(key);\n if (value) {\n storageSize += key.length + value.length;\n }\n });\n\n return {\n totalKeys: allKeys.length,\n users: users.length,\n storageSize,\n };\n }\n}\n","/**\n * Trusted Apps Manager\n *\n * Manages list of trusted applications that don't require transaction confirmation\n * Data is stored in iframe's localStorage (isolated from parent domain)\n */\n\nexport interface TrustedApp {\n userId: string;\n projectId: string;\n origin: string;\n trustedAt: number;\n}\n\nconst STORAGE_KEY = 'lumia_passport_trusted_apps';\n\nexport class TrustedAppsManager {\n /**\n * Check if app is trusted by user\n */\n isTrusted(userId: string, projectId: string, origin: string): boolean {\n const trustedApps = this.getTrustedApps();\n const result = trustedApps.some(\n (app) =>\n app.userId === userId &&\n app.projectId === projectId &&\n app.origin === origin\n );\n console.log('[TrustedApps] isTrusted check:', { userId, projectId, origin, result, totalApps: trustedApps.length });\n return result;\n }\n\n /**\n * Add app to trusted list\n */\n addTrustedApp(userId: string, projectId: string, origin: string): void {\n console.log('[TrustedApps] Adding trusted app:', { userId, projectId, origin });\n\n const trustedApps = this.getTrustedApps();\n\n // Check if already trusted\n const exists = trustedApps.some(\n (app) =>\n app.userId === userId &&\n app.projectId === projectId &&\n app.origin === origin\n );\n\n if (exists) {\n console.log('[TrustedApps] App already trusted');\n return;\n }\n\n // Add new trusted app\n trustedApps.push({\n userId,\n projectId,\n origin,\n trustedAt: Date.now(),\n });\n\n this.saveTrustedApps(trustedApps);\n console.log('[TrustedApps] ✅ App added to trusted list');\n }\n\n /**\n * Remove app from trusted list\n */\n removeTrustedApp(userId: string, projectId: string, origin: string): void {\n console.log('[TrustedApps] Removing trusted app:', { userId, projectId, origin });\n\n const trustedApps = this.getTrustedApps();\n const filtered = trustedApps.filter(\n (app) =>\n !(\n app.userId === userId &&\n app.projectId === projectId &&\n app.origin === origin\n )\n );\n\n this.saveTrustedApps(filtered);\n console.log('[TrustedApps] ✅ App removed from trusted list');\n }\n\n /**\n * Get all trusted apps for a user\n */\n getTrustedAppsForUser(userId: string): TrustedApp[] {\n console.log('[TrustedApps] Getting trusted apps for user:', userId);\n const trustedApps = this.getTrustedApps();\n console.log('[TrustedApps] Total apps in storage:', trustedApps.length, trustedApps);\n const filtered = trustedApps.filter((app) => app.userId === userId);\n console.log('[TrustedApps] Filtered apps for user:', filtered.length, filtered);\n return filtered;\n }\n\n /**\n * Clear all trusted apps for a user\n */\n clearTrustedAppsForUser(userId: string): void {\n console.log('[TrustedApps] Clearing all trusted apps for user:', userId);\n\n const trustedApps = this.getTrustedApps();\n const filtered = trustedApps.filter((app) => app.userId !== userId);\n\n this.saveTrustedApps(filtered);\n console.log('[TrustedApps] ✅ Trusted apps cleared for user');\n }\n\n /**\n * Get all trusted apps from storage\n */\n private getTrustedApps(): TrustedApp[] {\n try {\n const data = localStorage.getItem(STORAGE_KEY);\n console.log('[TrustedApps] Raw storage data:', data);\n if (!data) {\n console.log('[TrustedApps] No data in storage');\n return [];\n }\n\n const apps = JSON.parse(data);\n console.log('[TrustedApps] Parsed apps:', apps);\n return Array.isArray(apps) ? apps : [];\n } catch (error) {\n console.error('[TrustedApps] Error reading trusted apps:', error);\n return [];\n }\n }\n\n /**\n * Save trusted apps to storage\n */\n private saveTrustedApps(apps: TrustedApp[]): void {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(apps));\n } catch (error) {\n console.error('[TrustedApps] Error saving trusted apps:', error);\n throw new Error('Failed to save trusted apps');\n }\n }\n}\n","/**\n * Signing Manager for iframe\n *\n * Handles transaction signing with user confirmation inside secure iframe context\n */\n\nimport init, * as tss from 'dkls23-wasm';\nimport type { Transaction, ProjectInfo, RiskAssessment, KeyshareData, SignTypedDataRequest, EIP712TypedData } from './types';\nimport { StorageManager } from './storage-manager';\nimport { TrustedAppsManager } from './trusted-apps-manager';\nimport { TokenRefreshApiClient } from './token-refresh-client';\n\ninterface ProjectMetadata {\n id: string;\n name: string;\n description: string;\n logo: string;\n}\n\ninterface CachedMetadata {\n data: ProjectMetadata;\n timestamp: number;\n}\n\nexport class SigningManager extends TokenRefreshApiClient {\n private wasmLoaded: boolean = false;\n private storage: StorageManager;\n private trustedApps: TrustedAppsManager;\n private explorerUrl: string = 'https://beam-explorer.lumia.org';\n private readonly METADATA_API_URL = 'https://dashboard.lumiapassport.com/api/public/project';\n private readonly METADATA_CACHE_TTL = 3600000; // 1 hour in milliseconds\n private metadataCache: Map<string, CachedMetadata> = new Map();\n\n constructor() {\n super();\n this.storage = new StorageManager();\n this.trustedApps = new TrustedAppsManager();\n }\n\n /**\n * Initialize WASM module\n */\n async initialize(): Promise<void> {\n if (this.wasmLoaded) return;\n\n try {\n await init();\n this.wasmLoaded = true;\n (globalThis as any).__tss_wasm_api__ = tss;\n } catch (error) {\n console.error('[iframe][Sign] Failed to load WASM:', error);\n throw new Error('Failed to initialize signing WASM module');\n }\n }\n\n /**\n * Check if transaction is a minimal safe operation (account deployment)\n *\n * Minimal operations are safe to auto-approve without user consent:\n * - to: 0x0000000000000000000000000000000000000000 (burn address)\n * - value: 0 (no funds transfer)\n * - data: 0x (no contract call)\n *\n * This is used for smart account deployment without spending any funds.\n */\n private isMinimalSafeOperation(transaction: Transaction): boolean {\n const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n const ZERO_VALUE = '0';\n const EMPTY_DATA = '0x';\n\n const to = transaction.to?.toLowerCase();\n const value = transaction.value?.toString() || '0';\n const data = transaction.data?.toLowerCase() || '0x';\n\n const isMinimal =\n to === ZERO_ADDRESS.toLowerCase() &&\n (value === ZERO_VALUE || value === '0x0') &&\n (data === EMPTY_DATA || data === '0x0');\n\n if (isMinimal) {\n console.log('[iframe][Sign] Detected minimal safe operation:', {\n to,\n value,\n data,\n reason: 'Account deployment - no funds at risk'\n });\n }\n\n return isMinimal;\n }\n\n /**\n * Fetch project metadata from public API (with caching)\n */\n private async fetchProjectMetadata(projectId: string): Promise<ProjectMetadata | null> {\n // Check cache first\n const cached = this.metadataCache.get(projectId);\n const now = Date.now();\n\n if (cached && (now - cached.timestamp) < this.METADATA_CACHE_TTL) {\n console.log(`[iframe][Sign] Using cached metadata for project: ${cached.data.name}`);\n return cached.data;\n }\n\n // Fetch from API\n try {\n const response = await fetch(`${this.METADATA_API_URL}/${projectId}/metadata`);\n\n if (!response.ok) {\n console.warn(`[iframe][Sign] Failed to fetch project metadata: ${response.status}`);\n return null;\n }\n\n const metadata: ProjectMetadata = await response.json();\n console.log(`[iframe][Sign] Fetched metadata for project: ${metadata.name}`);\n\n // Cache the result\n this.metadataCache.set(projectId, {\n data: metadata,\n timestamp: now,\n });\n\n return metadata;\n } catch (error) {\n console.error('[iframe][Sign] Error fetching project metadata:', error);\n return null;\n }\n }\n\n /**\n * Sign transaction with user confirmation\n */\n async signTransaction(\n userId: string,\n projectId: string,\n origin: string,\n transaction: Transaction,\n accessToken?: string,\n userProfile?: { avatar?: string | null; displayName?: string | null }\n ): Promise<`0x${string}`> {\n if (!this.wasmLoaded) {\n await this.initialize();\n }\n\n // Load keyshare from IFRAME localStorage\n const keyshareData = this.storage.loadKeyshare(userId);\n if (!keyshareData) {\n throw new Error('No keyshare found. Please complete DKG first.');\n }\n\n // Get project info (TODO: from backend API)\n const projectInfo: ProjectInfo = {\n id: projectId,\n name: 'Application',\n logoUrl: '',\n website: origin,\n domains: [origin],\n };\n\n // Check if this is a minimal safe operation (account deployment)\n const isMinimalOperation = this.isMinimalSafeOperation(transaction);\n\n // Check if app is trusted (auto-approve without confirmation)\n const isTrusted = this.trustedApps.isTrusted(userId, projectId, origin);\n\n // Skip consent for minimal operations (safe account deployment)\n if (!isTrusted && !isMinimalOperation) {\n // Risk assessment\n const risk = await this.assessRisk(transaction);\n\n // Show user confirmation dialog\n const confirmResult = await this.showConfirmationDialog(\n userId,\n projectId,\n projectInfo,\n origin,\n transaction,\n risk,\n userProfile\n );\n\n if (!confirmResult.confirmed) {\n throw new Error('User rejected transaction');\n }\n\n // If user checked \"trust this app\", save it\n if (confirmResult.trustApp) {\n this.trustedApps.addTrustedApp(userId, projectId, origin);\n }\n } else if (isMinimalOperation) {\n console.log('[iframe][Sign] Auto-approving minimal safe operation (account deployment)');\n }\n\n // Use pre-computed digest if provided, otherwise compute hash\n // IMPORTANT: For UserOperations, digest32 is already computed by client\n const digest32 = transaction.digest32 || this.computeTransactionHash(transaction);\n\n // Perform MPC signing\n const signature = await this.performMPCSigning(userId, keyshareData, digest32, projectId, accessToken);\n\n return signature;\n }\n\n /**\n * Perform MPC signing protocol\n */\n private async performMPCSigning(\n userId: string,\n keyshareData: KeyshareData,\n digest32: `0x${string}`,\n projectId: string,\n accessToken?: string\n ): Promise<`0x${string}`> {\n const keyshare = keyshareData.keyshare_b64;\n const sessionId = keyshareData.sessionId;\n\n // Convert digest to base64\n const digestHex = digest32.startsWith('0x') ? digest32.slice(2) : digest32;\n const digestBytes = this.hexToBytes(digestHex);\n const digestB64 = btoa(String.fromCharCode(...digestBytes));\n\n const CHAIN_PATH = 'm';\n\n // Step 1: Client starts signing locally\n const clientSignStartResult = (tss as any).sign_start(keyshare, digestB64, CHAIN_PATH);\n\n if (!Array.isArray(clientSignStartResult) || clientSignStartResult.length < 2) {\n throw new Error('Invalid sign_start result format');\n }\n\n let clientState = clientSignStartResult[0];\n const clientMsg1 = clientSignStartResult[1];\n\n // Step 2: Server starts signing\n const serverStartResponse = await this.apiCall('POST', `/api/tss/${userId}/sign/start`, {\n sessionId,\n digest32,\n chainPath: CHAIN_PATH,\n }, projectId, accessToken);\n\n const serverMsg1 = serverStartResponse.msg1;\n\n if (!serverMsg1?.kind || !serverMsg1.data_b64) {\n throw new Error('Invalid server msg1 format');\n }\n\n // Execute 4-round signing protocol\n // Round 2\n const clientR2Result = (tss as any).sign_handle(\n JSON.stringify({ bytes_b64: clientState.bytes_b64 }),\n JSON.stringify(serverMsg1)\n );\n clientState = clientR2Result[0];\n const clientMsg2 = clientR2Result[1];\n\n const serverR2Response = await this.apiCall('POST', `/api/tss/${userId}/sign/round`, {\n sessionId,\n clientMsg: clientMsg1,\n }, projectId, accessToken);\n const serverMsg2 = this.extractServerMessage(serverR2Response);\n\n // Round 3\n const clientR3Result = (tss as any).sign_handle(\n JSON.stringify({ bytes_b64: clientState.bytes_b64 }),\n JSON.stringify(serverMsg2)\n );\n clientState = clientR3Result[0];\n const clientMsg3 = clientR3Result[1];\n\n const serverR3Response = await this.apiCall('POST', `/api/tss/${userId}/sign/round`, {\n sessionId,\n clientMsg: clientMsg2,\n }, projectId, accessToken);\n const serverMsg3 = this.extractServerMessage(serverR3Response);\n\n // Round 4 (Final)\n const clientFinalResult = (tss as any).sign_handle(\n JSON.stringify({ bytes_b64: clientState.bytes_b64 }),\n JSON.stringify(serverMsg3)\n );\n\n if (!Array.isArray(clientFinalResult) || clientFinalResult.length < 3) {\n throw new Error('Invalid final sign_handle result');\n }\n\n const clientSignature = clientFinalResult[2];\n\n // Send final message to server\n await this.apiCall('POST', `/api/tss/${userId}/sign/round`, {\n sessionId,\n clientMsg: clientMsg3,\n }, projectId, accessToken);\n\n // Format signature\n const signature = this.formatSignature(clientSignature);\n\n return signature;\n }\n\n /**\n * Show transaction confirmation dialog\n */\n private async showConfirmationDialog(\n userId: string,\n projectId: string,\n project: ProjectInfo,\n origin: string,\n transaction: Transaction,\n risk: RiskAssessment,\n userProfile?: { avatar?: string | null; displayName?: string | null }\n ): Promise<{ confirmed: boolean; trustApp: boolean }> {\n // Request parent to show iframe\n this.showIframe();\n\n // Fetch project metadata\n const metadata = await this.fetchProjectMetadata(projectId);\n\n return new Promise((resolve) => {\n const modal = this.createConfirmationModal(userId, projectId, project, origin, transaction, risk, metadata, userProfile);\n\n const confirmBtn = modal.querySelector('.confirm-btn') as HTMLButtonElement;\n const cancelBtn = modal.querySelector('.cancel-btn') as HTMLButtonElement;\n const trustCheckbox = modal.querySelector('.trust-app-checkbox') as HTMLInputElement;\n\n confirmBtn?.addEventListener('click', (e) => {\n if (e.isTrusted) {\n const trustApp = trustCheckbox?.checked || false;\n modal.remove();\n this.hideIframe();\n resolve({ confirmed: true, trustApp });\n }\n });\n\n cancelBtn?.addEventListener('click', () => {\n modal.remove();\n this.hideIframe();\n resolve({ confirmed: false, trustApp: false });\n });\n\n document.body.appendChild(modal);\n });\n }\n\n /**\n * Create confirmation modal UI\n */\n private createConfirmationModal(\n userId: string,\n projectId: string,\n project: ProjectInfo,\n origin: string,\n transaction: Transaction,\n risk: RiskAssessment,\n metadata: ProjectMetadata | null,\n userProfile?: { avatar?: string | null; displayName?: string | null }\n ): HTMLElement {\n const modal = document.createElement('div');\n modal.className = 'transaction-confirmation-modal';\n\n const isVerifiedOrigin = project.domains.includes(origin);\n const isUserOp = !!transaction.userOpDetails;\n\n // User avatar/logo for right side\n const userAvatar = userProfile?.avatar;\n const userName = userProfile?.displayName || 'Lumia Passport';\n\n // Simplified UI - показываем только важное для пользователя\n const isSponsored = isUserOp && !!transaction.userOpDetails?.paymaster;\n const estimatedCost = isSponsored ? '0 (Sponsored)' : 'Free (Sponsored Transaction)';\n\n // Use metadata if available, fallback to project info\n const displayName = metadata?.name || project.name;\n const displayLogo = metadata?.logo || project.logoUrl;\n\n // Get addresses\n const fromAddress = transaction.userOpDetails?.sender;\n const toAddress = transaction.userOpDetails?.callTarget || transaction.to; // Use callTarget from userOpDetails if available\n\n // Format transaction value (convert from wei to readable format)\n const formatValue = (valueWei: string): string => {\n try {\n const value = BigInt(valueWei);\n if (value === 0n) return '0';\n\n // Convert wei to tokens (18 decimals)\n const tokens = Number(value) / 1e18;\n\n // Format with appropriate precision\n if (tokens >= 1) {\n return tokens.toFixed(4).replace(/\\.?0+$/, ''); // Remove trailing zeros\n } else {\n return tokens.toFixed(8).replace(/\\.?0+$/, '');\n }\n } catch {\n return '0';\n }\n };\n\n const transactionValue = transaction.value || '0';\n const formattedValue = formatValue(transactionValue);\n const hasValue = BigInt(transactionValue) > 0n;\n\n modal.innerHTML = `\n <div class=\"modal-overlay\">\n <div class=\"modal-content\">\n <!-- Header with logos -->\n <div class=\"auth-header\">\n <div class=\"logo-container\">\n ${displayLogo ? `<img src=\"${displayLogo}\" alt=\"${displayName}\" class=\"app-logo\" />` : '<div class=\"app-logo-placeholder\"></div>'}\n <div class=\"logo-connector\">\n <svg width=\"24\" height=\"16\" viewBox=\"0 0 24 16\" fill=\"currentColor\">\n <path d=\"M23.7071 8.70711C24.0976 8.31658 24.0976 7.68342 23.7071 7.29289L17.3431 0.928932C16.9526 0.538408 16.3195 0.538408 15.9289 0.928932C15.5384 1.31946 15.5384 1.95262 15.9289 2.34315L21.5858 8L15.9289 13.6569C15.5384 14.0474 15.5384 14.6805 15.9289 15.0711C16.3195 15.4616 16.9526 15.4616 17.3431 15.0711L23.7071 8.70711ZM0 9H23V7H0V9Z\"/>\n </svg>\n </div>\n ${userAvatar ? `<img src=\"${userAvatar}\" alt=\"${userName}\" class=\"lumia-logo user-avatar\" />` : '<img src=\"./lumia-logo.svg\" alt=\"Lumia Passport\" class=\"lumia-logo\" />'}\n </div>\n </div>\n\n <!-- Transaction title -->\n <h2 class=\"auth-title\">Confirm Transaction</h2>\n\n <!-- Application info -->\n <div class=\"auth-description\">\n <div class=\"domain-info ${isVerifiedOrigin ? 'verified' : 'unverified'}\">\n <span class=\"domain-label\">\n ${isVerifiedOrigin ? '✓ Verified:' : '⚠️ Unverified:'}\n </span>\n <span class=\"domain-value\">${origin}</span>\n </div>\n </div>\n\n <!-- Transaction details box -->\n <div class=\"permissions-box\">\n ${fromAddress ? `\n <div class=\"detail-row\" style=\"margin-bottom: 0.5rem;\">\n <div style=\"color: var(--iframe-text-secondary); font-size: 0.875rem; margin-bottom: 0.25rem;\"><strong>From:</strong></div>\n <code style=\"font-size: 0.75rem; word-break: break-all; display: block; color: var(--iframe-text);\">${fromAddress}</code>\n </div>\n ` : ''}\n\n ${toAddress ? `\n <div class=\"detail-row\" style=\"margin-bottom: 0.5rem;\">\n <div style=\"color: var(--iframe-text-secondary); font-size: 0.875rem; margin-bottom: 0.25rem;\"><strong>To:</strong></div>\n <code style=\"font-size: 0.75rem; word-break: break-all; display: block; color: var(--iframe-text);\">${toAddress}</code>\n </div>\n ` : ''}\n\n ${hasValue ? `\n <div class=\"detail-row\" style=\"margin-bottom: 0.5rem;\">\n <span style=\"color: var(--iframe-text-secondary);\"><strong>Amount:</strong></span>\n <strong style=\"color: var(--iframe-text); font-size: 1rem;\">${formattedValue} LUMIA</strong>\n </div>\n ` : ''}\n\n ${isUserOp && transaction.userOpDetails?.callData && transaction.userOpDetails.callData !== '0x' ? `\n <div class=\"detail-row\" style=\"margin-bottom: 0.5rem;\">\n <span style=\"color: var(--iframe-text-secondary);\"><strong>Action:</strong></span>\n <span style=\"color: var(--iframe-text);\">Contract Interaction</span>\n </div>\n ` : ''}\n\n <div class=\"detail-row\" style=\"margin-bottom: 0.5rem;\">\n <span style=\"color: var(--iframe-text-secondary);\"><strong>Estimated Cost:</strong></span>\n <strong style=\"color: #10b981;\">${estimatedCost}</strong>\n </div>\n\n ${isSponsored ? `\n <div class=\"detail-row\" style=\"background: #d1fae5; border-radius: 6px; padding: 0.75rem; margin-top: 0.5rem;\">\n <span style=\"color: #047857;\">✓ Gas fees will be paid by the application (no cost to you)</span>\n </div>\n ` : ''}\n </div>\n\n ${risk.level !== 'LOW' ? `\n <div class=\"security-warning\">\n <strong>⚠️ ${risk.level} RISK</strong>\n ${risk.reasons.map(r => `<div>• ${r}</div>`).join('')}\n </div>\n ` : `\n <div class=\"security-warning\">\n <strong>⚠️ Warning:</strong> Please verify this transaction carefully before confirming.\n </div>\n `}\n\n <div class=\"trust-app-section\">\n <label class=\"trust-app-label\">\n <input type=\"checkbox\" class=\"trust-app-checkbox\" />\n <span>Trust this application and skip confirmation for future transactions</span>\n </label>\n </div>\n\n <!-- Action buttons -->\n <div class=\"actions\">\n <button class=\"cancel-btn\">Reject</button>\n <button class=\"confirm-btn\">Confirm</button>\n </div>\n\n <!-- Footer notice -->\n <div class=\"auth-footer\">\n <p class=\"footer-note\">You can manage trusted applications in your Lumia Passport settings.</p>\n </div>\n </div>\n </div>\n `;\n\n return modal;\n }\n\n /**\n * Assess transaction risk\n *\n * TODO: Implement backend-based risk assessment with real-time price conversion\n * - Get current LUMIA/USD price from API\n * - Calculate transaction value in USD\n * - Use dynamic thresholds based on USD value (e.g., >$100 = HIGH)\n * - Consider additional factors: recipient reputation, contract verification, etc.\n */\n private async assessRisk(transaction: Transaction): Promise<RiskAssessment> {\n const reasons: string[] = [];\n let score = 0;\n\n // Convert wei to LUMIA (18 decimals)\n const valueWei = BigInt(transaction.value || '0');\n const valueLumia = Number(valueWei) / 1e18;\n\n // Check high value (threshold: 10 LUMIA)\n // TODO: Replace with USD-based threshold after implementing backend price conversion\n if (valueLumia > 10) {\n score += 20;\n // Format with appropriate precision\n const formattedValue = valueLumia >= 1\n ? valueLumia.toFixed(4).replace(/\\.?0+$/, '')\n : valueLumia.toFixed(8).replace(/\\.?0+$/, '');\n reasons.push(`High value transaction (${formattedValue} LUMIA)`);\n }\n\n // Check if contract interaction\n if (transaction.data && transaction.data !== '0x' && transaction.data.length > 2) {\n score += 10;\n reasons.push('Contract interaction detected');\n }\n\n // Determine risk level\n let level: RiskAssessment['level'];\n if (score >= 50) level = 'CRITICAL';\n else if (score >= 30) level = 'HIGH';\n else if (score >= 15) level = 'MEDIUM';\n else level = 'LOW';\n\n return { level, score, reasons };\n }\n\n /**\n * Compute transaction hash (simplified, adjust for your needs)\n */\n private computeTransactionHash(transaction: Transaction): `0x${string}` {\n // TODO: Implement proper transaction hash computation\n // For now, return a placeholder\n const encoder = new TextEncoder();\n const data = encoder.encode(JSON.stringify(transaction));\n\n // Simple hash (in production, use proper transaction encoding)\n let hash = 0;\n for (let i = 0; i < data.length; i++) {\n hash = ((hash << 5) - hash) + data[i];\n hash = hash & hash;\n }\n\n const hashHex = Math.abs(hash).toString(16).padStart(64, '0');\n return `0x${hashHex}` as `0x${string}`;\n }\n\n private formatValue(value: string): string {\n try {\n const eth = parseFloat(value);\n return eth.toFixed(6);\n } catch {\n return value;\n }\n }\n\n private formatSignature(sig: any): `0x${string}` {\n if (typeof sig === 'string') return sig as `0x${string}`;\n\n if (sig && typeof sig === 'object' && sig.r_b64 && sig.s_b64) {\n const rBytes = Uint8Array.from(atob(sig.r_b64), (c) => c.charCodeAt(0));\n const sBytes = Uint8Array.from(atob(sig.s_b64), (c) => c.charCodeAt(0));\n\n const r = Array.from(rBytes).map((b) => b.toString(16).padStart(2, '0')).join('');\n const s = Array.from(sBytes).map((b) => b.toString(16).padStart(2, '0')).join('');\n const v = (Number(sig.recid) + 27).toString(16).padStart(2, '0');\n\n return `0x${r}${s}${v}` as `0x${string}`;\n }\n\n throw new Error('Invalid signature format');\n }\n\n private hexToBytes(hex: string): Uint8Array {\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = parseInt(hex.substring(i, i + 2), 16);\n }\n return bytes;\n }\n\n private extractServerMessage(response: any): any {\n return response?.msgNext || response?.msg_next || response?.msg || null;\n }\n\n /**\n * Sign EIP712 typed data with user confirmation\n */\n async signTypedData(\n userId: string,\n projectId: string,\n origin: string,\n typedData: EIP712TypedData,\n digest32: `0x${string}`,\n accessToken?: string,\n userProfile?: { avatar?: string | null; displayName?: string | null }\n ): Promise<`0x${string}`> {\n console.log('[iframe][Sign] EIP712 signing request:', { userId, projectId, origin, primaryType: typedData.primaryType });\n\n await this.initialize();\n\n const projectInfo: ProjectInfo = {\n id: projectId,\n name: 'Application',\n logoUrl: '',\n website: origin,\n domains: [origin],\n };\n\n // Check if app is trusted (auto-approve without confirmation)\n const isTrusted = this.trustedApps.isTrusted(userId, projectId, origin);\n\n if (!isTrusted) {\n // Show user confirmation dialog for EIP712 message\n const confirmResult = await this.showEIP712ConfirmationDialog(\n userId,\n projectId,\n projectInfo,\n origin,\n typedData,\n userProfile\n );\n\n if (!confirmResult.confirmed) {\n throw new Error('User rejected signature request');\n }\n\n // If user checked \"trust this app\", save it\n if (confirmResult.trustApp) {\n this.trustedApps.addTrustedApp(userId, projectId, origin);\n }\n }\n\n // Load keyshare from IFRAME localStorage\n const keyshareData = this.storage.loadKeyshare(userId);\n if (!keyshareData) {\n throw new Error('No keyshare found. Please complete DKG first.');\n }\n\n // Perform MPC signing\n const signature = await this.performMPCSigning(userId, keyshareData, digest32, projectId, accessToken);\n\n console.log('[iframe][Sign] EIP712 signature generated');\n return signature;\n }\n\n /**\n * Show EIP712 confirmation dialog\n */\n private async showEIP712ConfirmationDialog(\n userId: string,\n projectId: string,\n project: ProjectInfo,\n origin: string,\n typedData: EIP712TypedData,\n userProfile?: { avatar?: string | null; displayName?: string | null }\n ): Promise<{ confirmed: boolean; trustApp: boolean }> {\n // Request parent to show iframe\n this.showIframe();\n\n // Fetch project metadata for better UX\n const metadata = await this.fetchProjectMetadata(projectId);\n\n return new Promise((resolve) => {\n const modal = this.createEIP712ConfirmationModal(userId, projectId, project, origin, typedData, metadata, userProfile);\n\n const confirmBtn = modal.querySelector('.confirm-btn') as HTMLButtonElement;\n const cancelBtn = modal.querySelector('.cancel-btn') as HTMLButtonElement;\n const trustCheckbox = modal.querySelector('.trust-app-checkbox') as HTMLInputElement;\n\n confirmBtn?.addEventListener('click', (e) => {\n if (e.isTrusted) {\n const trustApp = trustCheckbox?.checked || false;\n modal.remove();\n this.hideIframe();\n resolve({ confirmed: true, trustApp });\n }\n });\n\n cancelBtn?.addEventListener('click', () => {\n modal.remove();\n this.hideIframe();\n resolve({ confirmed: false, trustApp: false });\n });\n\n document.body.appendChild(modal);\n });\n }\n\n /**\n * Create EIP712 confirmation modal UI (similar to MetaMask)\n */\n private createEIP712ConfirmationModal(\n userId: string,\n projectId: string,\n project: ProjectInfo,\n origin: string,\n typedData: EIP712TypedData,\n metadata: ProjectMetadata | null,\n userProfile?: { avatar?: string | null; displayName?: string | null }\n ): HTMLElement {\n const modal = document.createElement('div');\n modal.className = 'eip712-confirmation-modal';\n\n const isVerifiedOrigin = project.domains.includes(origin);\n\n // User avatar/logo for right side\n const userAvatar = userProfile?.avatar;\n const userName = userProfile?.displayName || 'Lumia Passport';\n\n // Helper function to format field values\n const formatFieldValue = (value: any): string => {\n if (Array.isArray(value)) {\n return `[${value.map(v => formatFieldValue(v)).join(', ')}]`;\n }\n if (typeof value === 'bigint') {\n return value.toString();\n }\n if (typeof value === 'object' && value !== null) {\n return JSON.stringify(value, null, 2);\n }\n return String(value);\n };\n\n // Create message fields HTML\n const messageFields = Object.entries(typedData.message)\n .map(([key, value]) => `\n <div class=\"eip712-field\">\n <div class=\"field-name\">${key}:</div>\n <div class=\"field-value\">${formatFieldValue(value)}</div>\n </div>\n `)\n .join('');\n\n // Create domain fields HTML\n const domainFields = Object.entries(typedData.domain)\n .filter(([_, value]) => value !== undefined)\n .map(([key, value]) => `\n <div class=\"eip712-field\">\n <div class=\"field-name\">${key}:</div>\n <div class=\"field-value\">${formatFieldValue(value)}</div>\n </div>\n `)\n .join('');\n\n modal.innerHTML = `\n <div class=\"modal-overlay\">\n <div class=\"modal-content eip712-modal\">\n <!-- Header -->\n <div class=\"auth-header\">\n <div class=\"logo-container\">\n ${metadata?.logo ? `<img src=\"${metadata.logo}\" alt=\"${metadata.name}\" class=\"project-logo\" />` : '<div class=\"project-logo-placeholder\">🔐</div>'}\n <span class=\"arrow-icon\">→</span>\n ${userAvatar ? `<img src=\"${userAvatar}\" alt=\"${userName}\" class=\"lumia-logo user-avatar\" style=\"width: 40px; height: 40px;\" />` : '<div class=\"lumia-logo\">L</div>'}\n </div>\n <h2 class=\"modal-title\">Signature Request</h2>\n <p class=\"origin-text\">\n ${isVerifiedOrigin ? '<span class=\"verified-badge\">✓</span>' : ''}\n ${origin}\n </p>\n </div>\n\n <!-- EIP712 Message Content -->\n <div class=\"eip712-content\">\n <details class=\"eip712-details\">\n <summary>Advanced details</summary>\n\n <div class=\"section-title\">📝 Message</div>\n <div class=\"eip712-section\">\n <div class=\"section-subtitle\">${typedData.primaryType}</div>\n ${messageFields}\n </div>\n\n <div class=\"section-title\" style=\"margin-top: 16px;\">🔍 Domain</div>\n <div class=\"eip712-section\">\n ${domainFields}\n </div>\n\n <div class=\"section-title\" style=\"margin-top: 16px;\">📋 Full Message</div>\n <pre class=\"eip712-raw\"><code>${JSON.stringify(typedData.message, null, 2)}</code></pre>\n </details>\n </div>\n\n <!-- Trust App Option -->\n <div class=\"trust-app-section\">\n <label class=\"trust-app-label\">\n <input type=\"checkbox\" class=\"trust-app-checkbox\" />\n <span>Trust this application and skip confirmation for future signatures</span>\n </label>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"actions\">\n <button class=\"cancel-btn\">Reject</button>\n <button class=\"confirm-btn\">Sign</button>\n </div>\n\n <!-- Footer Notice -->\n <div class=\"footer-notice\">\n <p class=\"footer-note\">Only sign messages from applications you trust.</p>\n </div>\n </div>\n </div>\n `;\n\n return modal;\n }\n\n /**\n * Show iframe (notify parent)\n */\n private showIframe(): void {\n if (window.parent !== window) {\n window.parent.postMessage({ type: 'LUMIA_PASSPORT_SHOW_IFRAME', timestamp: Date.now() }, '*');\n }\n }\n\n /**\n * Hide iframe (notify parent)\n */\n private hideIframe(): void {\n if (window.parent !== window) {\n window.parent.postMessage({ type: 'LUMIA_PASSPORT_HIDE_IFRAME', timestamp: Date.now() }, '*');\n }\n }\n}\n","/**\n * Lumia Passport iframe Wallet - Main Entry Point\n *\n * Secure isolated context for MPC key share storage and cryptographic operations\n * Runs at auth.lumiapassport.com with origin isolation from parent domains\n */\n\nimport { AuthorizationManager } from './lib/authorization-manager'\nimport { BackupManager } from './lib/backup-manager'\nimport { DKGManager } from './lib/dkg-manager'\nimport { SecureMessenger } from './lib/secure-messenger'\nimport { SessionManager } from './lib/session-manager'\nimport { SigningManager } from './lib/signing-manager'\nimport { StorageManager } from './lib/storage-manager'\nimport { TrustedAppsManager } from './lib/trusted-apps-manager'\nimport type { SecureMessage } from './lib/types'\nimport { buildReadyIndicatorData, TemplateEngine, TemplateLoader } from './templates'\n\n// @ts-ignore - injected during build\nconst IFRAME_VERSION = '__UI_KIT_VERSION__'\n\nclass IframeWallet {\n private messenger: SecureMessenger\n private sessionManager: SessionManager\n private dkgManager: DKGManager\n private signingManager: SigningManager\n private authManager: AuthorizationManager\n private storage: StorageManager\n private trustedApps: TrustedAppsManager\n private backupManager: BackupManager\n\n constructor() {\n console.log('='.repeat(60))\n console.log(` Lumia Passport Secure Wallet - iframe version ${IFRAME_VERSION}`)\n console.log('='.repeat(60))\n\n // Apply theme colors from URL parameters\n this.applyThemeColors()\n\n this.messenger = new SecureMessenger()\n this.sessionManager = new SessionManager()\n this.dkgManager = new DKGManager()\n this.signingManager = new SigningManager()\n this.authManager = new AuthorizationManager()\n this.storage = new StorageManager()\n this.trustedApps = new TrustedAppsManager()\n this.backupManager = new BackupManager()\n }\n\n private applyThemeColors(): void {\n try {\n const params = new URLSearchParams(window.location.search)\n const bg = params.get('bg')\n const text = params.get('text')\n const textSec = params.get('textSec')\n const border = params.get('border')\n\n if (bg || text || textSec || border) {\n const root = document.documentElement\n\n if (bg) {\n root.style.setProperty('--iframe-bg', bg)\n root.style.setProperty('--iframe-modal-bg', bg)\n }\n if (text) {\n root.style.setProperty('--iframe-text', text)\n }\n if (textSec) {\n root.style.setProperty('--iframe-text-secondary', textSec)\n }\n if (border) {\n root.style.setProperty('--iframe-border', border)\n }\n\n console.log('[IframeWallet] Applied theme colors:', { bg, text, textSec, border })\n }\n } catch (error) {\n console.warn('[IframeWallet] Failed to apply theme colors:', error)\n }\n }\n\n async initialize(): Promise<void> {\n // Validate we're running in correct origin (for production)\n if (\n window.location.hostname !== 'localhost' &&\n window.location.hostname !== '127.0.0.1' &&\n !window.location.hostname.includes('lumiapassport.com')\n ) {\n console.warn('[iframe] ⚠️ Running on unexpected origin!')\n }\n\n // Initialize WASM modules\n await Promise.all([this.dkgManager.initialize(), this.signingManager.initialize()])\n\n // Setup message listener\n this.messenger.setupListener(async (message, origin) => {\n await this.handleMessage(message, origin)\n })\n\n // Display ready indicator\n this.displayReadyIndicator()\n\n // Notify parent that iframe is ready\n if (window.parent !== window) {\n window.parent.postMessage(\n {\n type: 'LUMIA_PASSPORT_IFRAME_READY',\n timestamp: Date.now()\n },\n '*' // Initial broadcast, will validate origin in subsequent messages\n )\n }\n }\n\n private async handleMessage(message: SecureMessage, origin: string): Promise<void> {\n const { type, messageId, projectId } = message\n\n try {\n switch (type) {\n case 'SDK_AUTH':\n await this.handleSDKAuth(message, origin)\n break\n\n case 'AUTHENTICATE':\n await this.handleAuthenticate(message, origin)\n break\n\n case 'START_DKG':\n await this.handleStartDKG(message, origin)\n break\n\n case 'SIGN_TRANSACTION':\n await this.handleSignTransaction(message, origin)\n break\n\n case 'SIGN_TYPED_DATA':\n await this.handleSignTypedData(message, origin)\n break\n\n case 'GET_ADDRESS':\n await this.handleGetAddress(message, origin)\n break\n\n case 'CHECK_KEYSHARE':\n await this.handleCheckKeyshare(message, origin)\n break\n\n case 'GET_TRUSTED_APPS':\n await this.handleGetTrustedApps(message, origin)\n break\n\n case 'REMOVE_TRUSTED_APP':\n await this.handleRemoveTrustedApp(message, origin)\n break\n\n case 'CLEAR_AUTHORIZATIONS':\n await this.handleClearAuthorizations(message, origin)\n break\n\n case 'CREATE_BACKUP':\n await this.handleCreateBackup(message, origin)\n break\n\n case 'GET_BACKUP_STATUS':\n await this.handleGetBackupStatus(message, origin)\n break\n\n case 'GET_CLOUD_PROVIDERS':\n await this.handleGetCloudProviders(message, origin)\n break\n\n case 'RESTORE_BACKUP':\n await this.handleRestoreBackup(message, origin)\n break\n\n case 'RESTORE_FROM_FILE':\n await this.handleRestoreFromFile(message, origin)\n break\n\n case 'ENCRYPT_BACKUP_DATA':\n await this.handleEncryptBackupData(message, origin)\n break\n\n default:\n throw new Error(`Unknown message type: ${type}`)\n }\n } catch (error) {\n console.error(`[iframe] ❌ Error handling ${type}:`, error)\n this.messenger.sendError(messageId, error instanceof Error ? error.message : 'Unknown error', origin)\n }\n }\n\n private async handleSDKAuth(message: SecureMessage, origin: string): Promise<void> {\n const { projectId } = message.data\n const { messageId } = message\n\n console.log(`[iframe] SDK_AUTH: projectId=${projectId}`)\n\n // Validate HTTPS origin\n const isLocalhost = origin.startsWith('http://localhost:') || origin.startsWith('http://127.0.0.1:')\n const isHttps = origin.startsWith('https://')\n if (!isHttps && !isLocalhost) {\n throw new Error('Only HTTPS origins are allowed (or localhost for dev)')\n }\n\n // TODO: Validate project ID belongs to origin (backend API call)\n // For now, accept all HTTPS origins\n\n // Create session\n const sessionToken = this.sessionManager.createSession(projectId, origin)\n\n // Configure messenger\n this.messenger.setSessionToken(sessionToken)\n this.messenger.addAllowedOrigin(origin)\n\n // Send response\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_SDK_AUTH_SUCCESS',\n sessionToken\n },\n origin\n )\n\n console.log(`[iframe] ✅ SDK authenticated for origin: ${origin.substring(0, 40)}...`)\n }\n\n private async handleAuthenticate(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, projectId, userId, avatar, displayName } = message.data\n const { messageId } = message\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n throw new Error('Invalid session')\n }\n\n console.log(`[iframe] AUTHENTICATE: userId=${userId}, projectId=${projectId}`)\n\n // Check authorization\n const isAuthorized = await this.authManager.checkAuthorization(userId, projectId)\n\n if (!isAuthorized) {\n console.log(`[iframe] Authorization needed for project: ${projectId}`)\n\n // Get project info (TODO: from backend API)\n const projectInfo = {\n id: projectId,\n name: 'Application',\n logoUrl: '',\n website: origin,\n domains: [origin]\n }\n\n // Request user authorization with user profile data\n const consent = await this.authManager.requestAuthorization(projectInfo, origin, { avatar, displayName })\n\n if (!consent) {\n throw new Error('User denied authorization')\n }\n\n // Store authorization\n await this.authManager.storeAuthorization(userId, projectId, origin)\n console.log(`[iframe] ✅ Authorization granted: ${userId} -> ${projectId}`)\n }\n\n // Get user address\n const address = this.storage.getOwnerAddress(userId)\n\n // Send response\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_AUTH_SUCCESS',\n userId,\n address\n },\n origin\n )\n\n console.log(`[iframe] ✅ User authenticated: ${userId}`)\n\n // Check if user already has keyshare (e.g., after page refresh)\n // If yes, wallet is ready - no need for DKG or restore\n if (this.storage.hasKeyshare(userId)) {\n console.log(`[iframe] ℹ️ User has existing keyshare, sending WALLET_READY`)\n this.sendWalletReadyStatus(userId, origin)\n } else {\n console.log(`[iframe] ℹ️ User needs DKG or restore to create/recover keyshare`)\n }\n }\n\n private async handleStartDKG(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, userId, projectId, accessToken } = message.data\n const { messageId } = message\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n throw new Error('Invalid session')\n }\n\n // Check authorization\n const isAuthorized = await this.authManager.checkAuthorization(userId, projectId)\n if (!isAuthorized) {\n throw new Error('User has not authorized this application')\n }\n\n console.log(`[iframe] START_DKG: userId=${userId}, projectId=${projectId}, hasToken=${!!accessToken}`)\n\n // Show loading\n this.displayLoadingIndicator('Generating secure keys...')\n\n try {\n // Perform DKG with projectId and accessToken\n const result = await this.dkgManager.performDKG(userId, projectId, accessToken)\n\n // Save to IFRAME localStorage (ISOLATED)\n this.storage.saveKeyshare(userId, {\n keyshare_b64: result.keyshare.keyshare_b64,\n ownerAddress: result.ownerAddress,\n sessionId: result.sessionId\n })\n\n // Hide loading\n this.hideLoadingIndicator()\n\n // Send response\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_DKG_SUCCESS',\n ownerAddress: result.ownerAddress\n },\n origin\n )\n\n console.log(`[iframe] ✅ DKG completed: ${result.ownerAddress}`)\n\n // Send wallet ready status after DKG\n this.sendWalletReadyStatus(userId, origin)\n } catch (error) {\n this.hideLoadingIndicator()\n throw error\n }\n }\n\n private async handleSignTransaction(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, userId, projectId, transaction, accessToken, avatar, displayName } = message.data\n const { messageId } = message\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n throw new Error('Invalid session')\n }\n\n // Check authorization\n const isAuthorized = await this.authManager.checkAuthorization(userId, projectId)\n if (!isAuthorized) {\n throw new Error('User has not authorized this application')\n }\n\n console.log(`[iframe] SIGN_TRANSACTION: userId=${userId}, hasAccessToken=${!!accessToken}`)\n\n try {\n // Sign transaction (includes user confirmation)\n const signature = await this.signingManager.signTransaction(userId, projectId, origin, transaction, accessToken, {\n avatar,\n displayName\n })\n\n // Send response\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_SIGNATURE',\n signature\n },\n origin\n )\n\n console.log(`[iframe] ✅ Transaction signed`)\n } catch (error) {\n console.error('[iframe] Signing failed:', error)\n throw error\n }\n }\n\n private async handleSignTypedData(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, userId, projectId, typedData, digest32, accessToken, avatar, displayName } = message.data\n const { messageId } = message\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n throw new Error('Invalid session')\n }\n\n // Check authorization\n const isAuthorized = await this.authManager.checkAuthorization(userId, projectId)\n if (!isAuthorized) {\n throw new Error('User has not authorized this application')\n }\n\n console.log(`[iframe] SIGN_TYPED_DATA: userId=${userId}, primaryType=${typedData?.primaryType}`)\n\n try {\n // Sign typed data (includes user confirmation)\n const signature = await this.signingManager.signTypedData(\n userId,\n projectId,\n origin,\n typedData,\n digest32,\n accessToken,\n { avatar, displayName }\n )\n\n // Send response\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_EIP712_SIGNATURE',\n signature\n },\n origin\n )\n\n console.log(`[iframe] ✅ EIP712 message signed`)\n } catch (error) {\n console.error('[iframe] EIP712 signing failed:', error)\n throw error\n }\n }\n\n private async handleGetAddress(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, userId } = message.data\n const { messageId } = message\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n throw new Error('Invalid session')\n }\n\n const address = this.storage.getOwnerAddress(userId)\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_ADDRESS',\n address\n },\n origin\n )\n }\n\n private async handleCheckKeyshare(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, userId } = message.data\n const { messageId } = message\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n throw new Error('Invalid session')\n }\n\n const hasKeyshare = this.storage.hasKeyshare(userId)\n const address = hasKeyshare ? this.storage.getOwnerAddress(userId) : undefined\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_KEYSHARE_STATUS',\n hasKeyshare,\n address\n },\n origin\n )\n }\n\n private async handleGetTrustedApps(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, userId } = message.data\n const { messageId } = message\n\n console.log(`[iframe] GET_TRUSTED_APPS: userId=${userId}, sessionToken=${sessionToken ? 'present' : 'missing'}`)\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n console.error('[iframe] GET_TRUSTED_APPS: Session validation failed')\n throw new Error('Invalid session')\n }\n\n const trustedApps = this.trustedApps.getTrustedAppsForUser(userId)\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_TRUSTED_APPS_LIST',\n apps: trustedApps\n },\n origin\n )\n\n console.log(`[iframe] ✅ GET_TRUSTED_APPS: Response sent with ${trustedApps.length} apps`)\n }\n\n private async handleRemoveTrustedApp(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, userId, projectId, appOrigin } = message.data\n const { messageId } = message\n\n console.log(`[iframe] REMOVE_TRUSTED_APP: userId=${userId}, projectId=${projectId}, origin=${appOrigin}`)\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n console.error('[iframe] REMOVE_TRUSTED_APP: Session validation failed')\n throw new Error('Invalid session')\n }\n\n // Remove trusted app\n this.trustedApps.removeTrustedApp(userId, projectId, appOrigin)\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_TRUSTED_APP_REMOVED',\n success: true\n },\n origin\n )\n\n console.log(`[iframe] ✅ REMOVE_TRUSTED_APP: App removed`)\n }\n\n private async handleClearAuthorizations(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, projectId } = message.data\n const { messageId } = message\n\n console.log(`[iframe] CLEAR_AUTHORIZATIONS: projectId=${projectId}`)\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n console.error('[iframe] CLEAR_AUTHORIZATIONS: Session validation failed')\n throw new Error('Invalid session')\n }\n\n // Clear all authorizations for this project\n // This will iterate through all stored authorizations and remove those matching the projectId\n const storage = this.storage as any\n const allKeys = Object.keys(localStorage).filter((key) => key.startsWith('auth_'))\n\n let clearedCount = 0\n allKeys.forEach((key) => {\n try {\n const authData = JSON.parse(localStorage.getItem(key) || '{}')\n if (authData.projectId === projectId) {\n localStorage.removeItem(key)\n clearedCount++\n }\n } catch (e) {\n // Skip invalid entries\n }\n })\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_AUTHORIZATIONS_CLEARED',\n success: true,\n clearedCount\n },\n origin\n )\n\n console.log(`[iframe] ✅ CLEAR_AUTHORIZATIONS: Cleared ${clearedCount} authorizations for project ${projectId}`)\n }\n\n private async handleCreateBackup(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, userId, backupRequest, accessToken } = message.data\n const { messageId } = message\n\n console.log(`[iframe] CREATE_BACKUP received:`, {\n userId,\n method: backupRequest?.method,\n hasSessionToken: !!sessionToken,\n hasAccessToken: !!accessToken,\n origin\n })\n\n if (!userId) {\n console.error('[iframe] CREATE_BACKUP: userId is missing!')\n this.messenger.sendError(messageId, 'userId is required', origin)\n return\n }\n\n if (!backupRequest) {\n console.error('[iframe] CREATE_BACKUP: backupRequest is missing!')\n this.messenger.sendError(messageId, 'backupRequest is required', origin)\n return\n }\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n console.error('[iframe] CREATE_BACKUP: Session validation failed', { sessionToken, origin })\n this.messenger.sendError(messageId, 'Invalid session', origin)\n return\n }\n\n try {\n // Create backup using BackupManager\n const result = await this.backupManager.createBackup(userId, backupRequest, accessToken)\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_BACKUP_CREATED',\n result\n },\n origin\n )\n\n if (result.success) {\n console.log(`[iframe] ✅ CREATE_BACKUP: Backup created successfully`)\n } else {\n console.error(`[iframe] ❌ CREATE_BACKUP: Backup failed - ${result.error}`)\n }\n } catch (error: any) {\n console.error('[iframe] CREATE_BACKUP: Exception:', error)\n this.messenger.sendError(messageId, error.message || 'Backup failed', origin)\n }\n }\n\n private async handleGetBackupStatus(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, userId } = message.data\n const { messageId } = message\n\n console.log(`[iframe] GET_BACKUP_STATUS: userId=${userId}`)\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n console.error('[iframe] GET_BACKUP_STATUS: Session validation failed')\n throw new Error('Invalid session')\n }\n\n // Get backup status\n const status = this.backupManager.getBackupStatus(userId)\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_BACKUP_STATUS',\n status\n },\n origin\n )\n\n console.log(`[iframe] ✅ GET_BACKUP_STATUS: Status retrieved`)\n }\n\n private async handleGetCloudProviders(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken } = message.data\n const { messageId } = message\n\n console.log(`[iframe] GET_CLOUD_PROVIDERS`)\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n console.error('[iframe] GET_CLOUD_PROVIDERS: Session validation failed')\n throw new Error('Invalid session')\n }\n\n // Get available cloud providers\n const providers = this.backupManager.getAvailableCloudProviders()\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_CLOUD_PROVIDERS',\n providers\n },\n origin\n )\n\n console.log(`[iframe] ✅ GET_CLOUD_PROVIDERS: Providers retrieved`)\n }\n\n private async handleRestoreBackup(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, userId, password, accessToken } = message.data\n const { messageId } = message\n\n console.log(`[iframe] RESTORE_BACKUP received:`, {\n userId,\n hasPassword: !!password,\n hasSessionToken: !!sessionToken,\n hasAccessToken: !!accessToken,\n origin\n })\n\n if (!userId) {\n console.error('[iframe] RESTORE_BACKUP: userId is missing!')\n this.messenger.sendError(messageId, 'userId is required', origin)\n return\n }\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n console.error('[iframe] RESTORE_BACKUP: Session validation failed', { sessionToken, origin })\n this.messenger.sendError(messageId, 'Invalid session', origin)\n return\n }\n\n try {\n // Restore backup using BackupManager\n const backupData = await this.backupManager.restoreFromServer(userId, password, accessToken)\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_BACKUP_RESTORED',\n result: {\n success: true,\n timestamp: Date.now(),\n data: backupData\n }\n },\n origin\n )\n\n console.log(`[iframe] ✅ RESTORE_BACKUP: Backup restored successfully`)\n\n // Send wallet ready status after successful restore\n this.sendWalletReadyStatus(userId, origin)\n } catch (error: any) {\n console.error('[iframe] RESTORE_BACKUP: Exception:', error)\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_BACKUP_RESTORED',\n result: {\n success: false,\n timestamp: Date.now(),\n error: error.message || 'Restore failed'\n }\n },\n origin\n )\n\n console.log(`[iframe] ❌ RESTORE_BACKUP: Restore failed - ${error.message}`)\n }\n }\n\n private async handleRestoreFromFile(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, userId, fileContent, password } = message.data\n const { messageId } = message\n\n console.log(`[iframe] RESTORE_FROM_FILE received:`, {\n userId,\n hasPassword: !!password,\n hasFileContent: !!fileContent,\n hasSessionToken: !!sessionToken,\n origin\n })\n\n if (!userId) {\n console.error('[iframe] RESTORE_FROM_FILE: userId is missing!')\n this.messenger.sendError(messageId, 'userId is required', origin)\n return\n }\n\n if (!fileContent) {\n console.error('[iframe] RESTORE_FROM_FILE: fileContent is missing!')\n this.messenger.sendError(messageId, 'fileContent is required', origin)\n return\n }\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n console.error('[iframe] RESTORE_FROM_FILE: Session validation failed', { sessionToken, origin })\n this.messenger.sendError(messageId, 'Invalid session', origin)\n return\n }\n\n try {\n // Restore from local file using BackupManager\n const backupData = await this.backupManager.restoreFromLocalFile(fileContent, userId, password)\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_FILE_RESTORED',\n result: {\n success: true,\n timestamp: Date.now(),\n data: backupData\n }\n },\n origin\n )\n\n console.log(`[iframe] ✅ RESTORE_FROM_FILE: File restored successfully`)\n\n // Send wallet ready status after successful file restore\n this.sendWalletReadyStatus(userId, origin)\n } catch (error: any) {\n console.error('[iframe] RESTORE_FROM_FILE: Exception:', error)\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_FILE_RESTORED',\n result: {\n success: false,\n timestamp: Date.now(),\n error: error.message || 'File restore failed'\n }\n },\n origin\n )\n\n console.log(`[iframe] ❌ RESTORE_FROM_FILE: Restore failed - ${error.message}`)\n }\n }\n\n private async handleEncryptBackupData(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, userId, password } = message.data\n const { messageId } = message\n\n console.log(`[iframe] ENCRYPT_BACKUP_DATA received:`, {\n userId,\n hasPassword: !!password,\n hasSessionToken: !!sessionToken,\n origin\n })\n\n if (!userId) {\n console.error('[iframe] ENCRYPT_BACKUP_DATA: userId is missing!')\n this.messenger.sendError(messageId, 'userId is required', origin)\n return\n }\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n console.error('[iframe] ENCRYPT_BACKUP_DATA: Session validation failed', { sessionToken, origin })\n this.messenger.sendError(messageId, 'Invalid session', origin)\n return\n }\n\n try {\n // Encrypt backup data using BackupManager\n const encryptedData = await this.backupManager.encryptBackupData(userId, password)\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_BACKUP_ENCRYPTED',\n encryptedData\n },\n origin\n )\n\n console.log(`[iframe] ✅ ENCRYPT_BACKUP_DATA: Data encrypted successfully`)\n } catch (error: any) {\n console.error('[iframe] ENCRYPT_BACKUP_DATA: Exception:', error)\n this.messenger.sendError(messageId, error.message || 'Encryption failed', origin)\n }\n }\n\n private displayReadyIndicator(): void {\n const app = document.getElementById('app')\n if (!app) return\n\n // Build template data\n const templateData = buildReadyIndicatorData({\n origin: window.location.origin,\n iframeVersion: IFRAME_VERSION\n })\n\n // Load and render template\n const template = TemplateLoader.getTemplate('ready-indicator')\n const populatedReadyIndicatorHTML = TemplateEngine.render(template, templateData)\n\n app.innerHTML = populatedReadyIndicatorHTML\n }\n\n /**\n * Send wallet ready status to parent\n * This notifies the frontend that the wallet is fully initialized and ready to sign\n */\n private sendWalletReadyStatus(userId: string, origin: string): void {\n const hasKeyshare = this.storage.hasKeyshare(userId)\n const address = hasKeyshare ? this.storage.getOwnerAddress(userId) : undefined\n const hasSession = this.sessionManager.hasSession(origin)\n\n const status = {\n ready: hasKeyshare && hasSession,\n userId,\n address,\n hasKeyshare,\n hasSession,\n timestamp: Date.now()\n }\n\n // Send as broadcast (not a response to specific message)\n if (window.parent) {\n window.parent.postMessage(\n {\n type: 'LUMIA_PASSPORT_WALLET_READY',\n data: status,\n timestamp: Date.now()\n },\n origin\n )\n }\n }\n\n private displayLoadingIndicator(message: string): void {\n const app = document.getElementById('app')\n if (!app) return\n\n app.innerHTML = `\n <div class=\"loading-indicator\">\n <div class=\"spinner\"></div>\n <p>${message}</p>\n </div>\n `\n }\n\n private hideLoadingIndicator(): void {\n this.displayReadyIndicator()\n }\n}\n\n// Initialize wallet when DOM is ready\nfunction initWallet() {\n const wallet = new IframeWallet()\n wallet.initialize().catch((error) => {\n console.error('[iframe] ❌ Failed to initialize:', error)\n\n // Show error in UI\n const app = document.getElementById('app')\n if (app) {\n app.innerHTML = `\n <div class=\"error-indicator\">\n <div class=\"error-icon\">❌</div>\n <h2>Initialization Failed</h2>\n <p>${error instanceof Error ? error.message : 'Unknown error'}</p>\n </div>\n `\n }\n })\n}\n\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initWallet)\n} else {\n initWallet()\n}\n"],"mappings":"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","names":["encoder","envelopeDecryptKeyshare","envelopeDecryptKeyshareWithPassword","decryptKeyshare","size","size","size","size","bytesToHex","size","encoder","toBytes","toBytes","restoreFromServer","encryptKeyshare","deriveBackupPasswordFromPasskey","restoreFromLocalFile","ptr","module","encoder","encoder","encoder"]}
|
|
1
|
+
{"version":3,"sources":["../../src/iframe/lib/backup/crypto-utils.ts","../../src/iframe/lib/backup/server-backup.ts","../../src/iframe/lib/backup/local-backup.ts","../../../../node_modules/.pnpm/viem@2.38.0_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.22.4/node_modules/viem/utils/data/isHex.ts","../../../../node_modules/.pnpm/viem@2.38.0_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.22.4/node_modules/viem/utils/data/size.ts","../../../../node_modules/.pnpm/viem@2.38.0_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.22.4/node_modules/viem/errors/version.ts","../../../../node_modules/.pnpm/viem@2.38.0_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.22.4/node_modules/viem/errors/base.ts","../../../../node_modules/.pnpm/viem@2.38.0_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.22.4/node_modules/viem/errors/data.ts","../../../../node_modules/.pnpm/viem@2.38.0_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.22.4/node_modules/viem/utils/data/pad.ts","../../../../node_modules/.pnpm/viem@2.38.0_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.22.4/node_modules/viem/errors/encoding.ts","../../../../node_modules/.pnpm/viem@2.38.0_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.22.4/node_modules/viem/utils/encoding/fromHex.ts","../../../../node_modules/.pnpm/viem@2.38.0_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.22.4/node_modules/viem/utils/encoding/toHex.ts","../../../../node_modules/.pnpm/viem@2.38.0_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.22.4/node_modules/viem/utils/encoding/toBytes.ts","../../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/src/_u64.ts","../../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/src/utils.ts","../../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/src/sha3.ts","../../../../node_modules/.pnpm/viem@2.38.0_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.22.4/node_modules/viem/utils/hash/keccak256.ts","../../src/iframe/templates/template-engine.ts","../../src/iframe/templates/html/authorization.html","../../src/iframe/templates/html/ready-indicator.html","../../src/iframe/templates/template-loader.ts","../../src/iframe/templates/data/authorization-template-data.ts","../../src/iframe/templates/data/ready-indicator-data.ts","../../src/iframe/lib/authorization-manager.ts","../../src/iframe/lib/token-refresh-client.ts","../../src/iframe/lib/backup-manager.ts","../../src/iframe/lib/backup/cloud-backup.ts","../../src/iframe/lib/backup/cloudStorage.ts","../../../../node_modules/.pnpm/dkls23-wasm@0.1.1/node_modules/dkls23-wasm/pkg-web/dkls23_wasm.js","../../../../node_modules/.pnpm/viem@2.38.0_bufferutil@4.0.9_typescript@5.9.3_utf-8-validate@5.0.10_zod@3.22.4/node_modules/viem/index.ts","../../src/iframe/lib/dkg-manager.ts","../../src/iframe/lib/onramp/utils.ts","../../src/iframe/lib/onramp/binance.ts","../../src/iframe/lib/onramp/rampnow.ts","../../src/iframe/lib/secure-messenger.ts","../../src/iframe/lib/session-manager.ts","../../src/iframe/lib/storage-manager.ts","../../src/iframe/lib/trusted-apps-manager.ts","../../src/iframe/lib/signing-manager.ts","../../src/iframe/main.ts"],"sourcesContent":["/**\n * Shared cryptographic utilities for backup operations\n */\n\nimport type { KeyshareBackupData } from '../types';\n\nexport interface EncryptedBackup {\n encryptedData: string;\n iv: string;\n salt: string;\n version: string;\n encryptionMethod: 'passkey' | 'password';\n credentialId?: string;\n}\n\nexport interface EnvelopeEncryptedShare {\n encryptedDEK: string;\n encryptedKeyshare: string;\n iv: string;\n salt: string;\n version: string;\n}\n\n/**\n * Convert base64 string to Uint8Array\n */\nexport function base64ToBytes(base64: string): Uint8Array {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n}\n\n/**\n * Convert Uint8Array to base64 string\n */\nexport function bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n const len = bytes.byteLength;\n for (let i = 0; i < len; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Convert Uint8Array to hex string\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Derive encryption key from password using PBKDF2\n */\nexport async function deriveKeyFromPassword(\n password: string,\n salt: Uint8Array\n): Promise<CryptoKey> {\n const encoder = new TextEncoder();\n const passwordKey = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n { name: 'PBKDF2' },\n false,\n ['deriveBits', 'deriveKey']\n );\n\n return crypto.subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt: salt,\n iterations: 150000,\n hash: 'SHA-256',\n },\n passwordKey,\n { name: 'AES-GCM', length: 256 },\n false,\n ['encrypt', 'decrypt']\n );\n}\n\n/**\n * Derive KEK (Key Encryption Key) from passkey using PRF extension\n */\nexport async function deriveKEKFromPasskey(\n userId: string,\n requiredCredentialId?: string\n): Promise<{ kek: ArrayBuffer; credentialId: string }> {\n const challenge = crypto.getRandomValues(new Uint8Array(32));\n\n const allowCredentials = requiredCredentialId\n ? [\n {\n type: 'public-key' as const,\n id: base64ToBytes(requiredCredentialId),\n transports: ['internal'] as AuthenticatorTransport[],\n },\n ]\n : undefined;\n\n const credential = (await navigator.credentials.get({\n publicKey: {\n challenge,\n rpId: window.location.hostname,\n userVerification: 'required',\n allowCredentials,\n extensions: {\n prf: {\n eval: {\n first: new TextEncoder().encode(`backup-kek-${userId}`),\n },\n },\n },\n },\n })) as any;\n\n if (!credential?.getClientExtensionResults) {\n throw new Error('Passkey authentication failed');\n }\n\n const prfResults = credential.getClientExtensionResults();\n if (!prfResults?.prf?.results?.first) {\n throw new Error('PRF extension not supported or failed');\n }\n\n const resultCredentialId = bytesToBase64(new Uint8Array(credential.rawId));\n\n return {\n kek: prfResults.prf.results.first,\n credentialId: resultCredentialId,\n };\n}\n\n/**\n * Derive backup password from passkey using PRF extension\n */\nexport async function deriveBackupPasswordFromPasskey(\n userId: string,\n credentialId?: string\n): Promise<{ password: string; credentialId: string }> {\n const challenge = crypto.getRandomValues(new Uint8Array(32));\n\n const allowCredentials = credentialId\n ? [\n {\n type: 'public-key' as const,\n id: base64ToBytes(credentialId),\n transports: ['internal'] as AuthenticatorTransport[],\n },\n ]\n : undefined;\n\n const credential = (await navigator.credentials.get({\n publicKey: {\n challenge,\n rpId: window.location.hostname,\n userVerification: 'required',\n allowCredentials,\n extensions: {\n prf: {\n eval: {\n first: new TextEncoder().encode(`backup-password-${userId}`),\n },\n },\n },\n },\n })) as any;\n\n if (!credential?.getClientExtensionResults) {\n throw new Error('Passkey authentication failed');\n }\n\n const prfResults = credential.getClientExtensionResults();\n if (!prfResults?.prf?.results?.first) {\n throw new Error('PRF extension not supported or failed');\n }\n\n const prfOutput = new Uint8Array(prfResults.prf.results.first);\n const password = bytesToBase64(prfOutput);\n const resultCredentialId = bytesToBase64(\n new Uint8Array(credential.rawId)\n );\n\n return { password, credentialId: resultCredentialId };\n}\n\n/**\n * Encrypt keyshare data using password or passkey\n */\nexport async function encryptKeyshare(\n data: KeyshareBackupData,\n password: string,\n encryptionMethod: 'passkey' | 'password',\n credentialId?: string\n): Promise<any> {\n const encoder = new TextEncoder();\n const plaintext = JSON.stringify(data);\n const salt = crypto.getRandomValues(new Uint8Array(16));\n const passwordKey = await crypto.subtle.importKey('raw', encoder.encode(password), 'PBKDF2', false, ['deriveBits']);\n const keyMaterial = await crypto.subtle.deriveBits({ name: 'PBKDF2', salt, iterations: 100000, hash: 'SHA-256' }, passwordKey, 256);\n const key = await crypto.subtle.importKey('raw', keyMaterial, 'AES-GCM', false, ['encrypt']);\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encryptedData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, encoder.encode(plaintext));\n\n // Create checksum\n const checksumData = `${data.userId}:${data.sessionId}:${encryptionMethod}`;\n const checksumBuffer = await crypto.subtle.digest('SHA-256', encoder.encode(checksumData));\n const checksum = bytesToBase64(new Uint8Array(checksumBuffer));\n\n const timestamp = Date.now();\n\n return {\n data: bytesToBase64(new Uint8Array(encryptedData)),\n iv: bytesToBase64(iv),\n salt: bytesToBase64(salt),\n version: '1.0',\n checksum,\n magic: 'LUMIA_BACKUP_V1',\n encryptionMethod,\n createdAt: timestamp,\n credentialId: encryptionMethod === 'passkey' ? credentialId : undefined,\n };\n}\n\n/**\n * Encrypt keyshare using envelope encryption with passkey-derived KEK\n */\nexport async function envelopeEncryptKeyshare(\n data: KeyshareBackupData,\n userId: string\n): Promise<EnvelopeEncryptedShare> {\n // Derive KEK from passkey and get credential ID\n const { kek: kekBytes, credentialId } = await deriveKEKFromPasskey(userId);\n console.log('[envelopeEncryptKeyshare] Using credential ID for encryption:', credentialId);\n\n const dek = crypto.getRandomValues(new Uint8Array(32));\n const kek = await crypto.subtle.importKey('raw', kekBytes, 'AES-GCM', false, ['encrypt']);\n\n const plaintext = JSON.stringify(data);\n const plaintextBytes = new TextEncoder().encode(plaintext);\n const dekCryptoKey = await crypto.subtle.importKey('raw', dek, 'AES-GCM', false, ['encrypt']);\n\n const dataIv = crypto.getRandomValues(new Uint8Array(12));\n const encryptedData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: dataIv }, dekCryptoKey, plaintextBytes);\n\n const wrapIv = crypto.getRandomValues(new Uint8Array(12));\n const wrappedDekData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: wrapIv }, kek, dek);\n\n const ciphertextWithIv = new Uint8Array(dataIv.length + encryptedData.byteLength);\n ciphertextWithIv.set(dataIv, 0);\n ciphertextWithIv.set(new Uint8Array(encryptedData), dataIv.length);\n\n const wrappedDekWithIv = new Uint8Array(wrapIv.length + wrappedDekData.byteLength);\n wrappedDekWithIv.set(wrapIv, 0);\n wrappedDekWithIv.set(new Uint8Array(wrappedDekData), wrapIv.length);\n\n return {\n ciphertext_share: bytesToBase64(ciphertextWithIv),\n wrapped_dek: bytesToBase64(wrappedDekWithIv),\n kdf: { prf: 'webauthn-prf', hkdf: 'hkdf-sha256', info: 'client-share' },\n alg: { data: 'aes-256-gcm', wrap: 'aes-256-gcm' },\n aad: { userId: data.userId, version: 1, deviceId: 'lumia-ui-kit' },\n createdAt: new Date().toISOString(),\n expiresAt: null,\n encryptionMethod: 'passkey',\n credentialId: credentialId || undefined\n };\n}\n\n/**\n * Encrypt keyshare using envelope encryption with password-derived KEK\n */\nexport async function envelopeEncryptKeyshareWithPassword(\n data: KeyshareBackupData,\n password: string\n): Promise<EnvelopeEncryptedShare> {\n console.log('[envelopeEncryptKeyshareWithPassword] Encrypting with password');\n\n // Generate DEK and derive KEK from password\n const dek = crypto.getRandomValues(new Uint8Array(32));\n const salt = crypto.getRandomValues(new Uint8Array(16));\n const kekKey = await deriveKeyFromPassword(password, salt);\n\n const plaintext = JSON.stringify(data);\n const plaintextBytes = new TextEncoder().encode(plaintext);\n const dekCryptoKey = await crypto.subtle.importKey('raw', dek, 'AES-GCM', false, ['encrypt']);\n\n const dataIv = crypto.getRandomValues(new Uint8Array(12));\n const encryptedData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: dataIv }, dekCryptoKey, plaintextBytes);\n\n const wrapIv = crypto.getRandomValues(new Uint8Array(12));\n const wrappedDekData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: wrapIv }, kekKey, dek);\n\n const ciphertextWithIv = new Uint8Array(dataIv.length + encryptedData.byteLength);\n ciphertextWithIv.set(dataIv, 0);\n ciphertextWithIv.set(new Uint8Array(encryptedData), dataIv.length);\n\n const wrappedDekWithIv = new Uint8Array(salt.length + wrapIv.length + wrappedDekData.byteLength);\n wrappedDekWithIv.set(salt, 0);\n wrappedDekWithIv.set(wrapIv, salt.length);\n wrappedDekWithIv.set(new Uint8Array(wrappedDekData), salt.length + wrapIv.length);\n\n return {\n ciphertext_share: bytesToBase64(ciphertextWithIv),\n wrapped_dek: bytesToBase64(wrappedDekWithIv),\n kdf: { prf: 'pbkdf2', hkdf: 'hkdf-sha256', info: 'client-share' },\n alg: { data: 'aes-256-gcm', wrap: 'aes-256-gcm' },\n aad: { userId: data.userId, version: 1, deviceId: 'lumia-ui-kit' },\n createdAt: new Date().toISOString(),\n expiresAt: null,\n encryptionMethod: 'password'\n };\n}\n\n/**\n * Decrypt keyshare using envelope encryption with passkey-derived KEK\n */\nexport async function envelopeDecryptKeyshare(\n envelope: any,\n userId: string\n): Promise<KeyshareBackupData> {\n console.log('[iframe][envelopeDecryptKeyshare] Starting decryption process');\n console.log('[iframe][envelopeDecryptKeyshare] Envelope credential ID:', envelope.credentialId);\n\n console.log('[iframe][envelopeDecryptKeyshare] Deriving KEK from passkey...');\n const { kek: kekBytes } = await deriveKEKFromPasskey(userId, envelope.credentialId);\n console.log('[iframe][envelopeDecryptKeyshare] KEK bytes length:', kekBytes.byteLength);\n\n console.log('[iframe][envelopeDecryptKeyshare] Importing KEK as crypto key...');\n const kek = await crypto.subtle.importKey('raw', kekBytes, 'AES-GCM', false, ['decrypt']);\n\n console.log('[iframe][envelopeDecryptKeyshare] Decrypting wrapped DEK...');\n const wrappedDekWithIv = base64ToBytes(envelope.wrapped_dek);\n console.log('[iframe][envelopeDecryptKeyshare] Wrapped DEK with IV length:', wrappedDekWithIv.length);\n const wrapIv = wrappedDekWithIv.slice(0, 12);\n const wrappedDekData = wrappedDekWithIv.slice(12);\n console.log('[iframe][envelopeDecryptKeyshare] Wrap IV length:', wrapIv.length, 'Wrapped DEK data length:', wrappedDekData.length);\n\n try {\n const dekBytes = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: wrapIv }, kek, wrappedDekData);\n console.log('[iframe][envelopeDecryptKeyshare] DEK decrypted successfully, length:', dekBytes.byteLength);\n\n console.log('[iframe][envelopeDecryptKeyshare] Importing DEK as crypto key...');\n const dekCryptoKey = await crypto.subtle.importKey('raw', dekBytes, 'AES-GCM', false, ['decrypt']);\n\n console.log('[iframe][envelopeDecryptKeyshare] Decrypting main data...');\n const ciphertextWithIv = base64ToBytes(envelope.ciphertext_share);\n console.log('[iframe][envelopeDecryptKeyshare] Ciphertext with IV length:', ciphertextWithIv.length);\n const dataIv = ciphertextWithIv.slice(0, 12);\n const encryptedData = ciphertextWithIv.slice(12);\n console.log('[iframe][envelopeDecryptKeyshare] Data IV length:', dataIv.length, 'Encrypted data length:', encryptedData.length);\n\n const decryptedData = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: dataIv }, dekCryptoKey, encryptedData);\n console.log('[iframe][envelopeDecryptKeyshare] Main data decrypted successfully, length:', decryptedData.byteLength);\n\n console.log('[iframe][envelopeDecryptKeyshare] Parsing JSON...');\n const plaintext = new TextDecoder().decode(decryptedData);\n const result = JSON.parse(plaintext) as KeyshareBackupData;\n console.log('[iframe][envelopeDecryptKeyshare] Decryption completed successfully');\n return result;\n } catch (error) {\n console.error('[iframe][envelopeDecryptKeyshare] Decryption failed:', error);\n if (error instanceof Error && error.name === 'OperationError') {\n const credentialHint = envelope.credentialId\n ? `The backup requires a specific passkey (ID: ${envelope.credentialId.slice(-8)}...)`\n : 'The backup was encrypted with a different passkey than the one you selected';\n throw new Error(`Passkey mismatch: ${credentialHint}. If you have multiple passkeys, please try again and select the correct passkey that was used when creating this backup.`);\n }\n throw new Error('Failed to decrypt keyshare: ' + (error instanceof Error ? error.message : String(error)));\n }\n}\n\n/**\n * Decrypt keyshare using envelope encryption with password-derived KEK\n */\nexport async function envelopeDecryptKeyshareWithPassword(\n envelope: any,\n password: string\n): Promise<KeyshareBackupData> {\n console.log('[iframe][envelopeDecryptKeyshareWithPassword] Starting password-based decryption');\n\n const wrappedDekWithSaltAndIv = base64ToBytes(envelope.wrapped_dek);\n\n // Extract salt (16 bytes), wrapIv (12 bytes), and wrapped DEK data\n const salt = wrappedDekWithSaltAndIv.slice(0, 16);\n const wrapIv = wrappedDekWithSaltAndIv.slice(16, 28);\n const wrappedDekData = wrappedDekWithSaltAndIv.slice(28);\n\n console.log('[iframe][envelopeDecryptKeyshareWithPassword] Salt length:', salt.length, 'Wrap IV length:', wrapIv.length, 'Wrapped DEK data length:', wrappedDekData.length);\n\n try {\n // Derive KEK from password using the same salt\n const kekKey = await deriveKeyFromPassword(password, salt);\n\n // Decrypt the DEK\n const dekBytes = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: wrapIv }, kekKey, wrappedDekData);\n console.log('[iframe][envelopeDecryptKeyshareWithPassword] DEK decrypted successfully, length:', dekBytes.byteLength);\n\n // Import DEK as crypto key\n const dekCryptoKey = await crypto.subtle.importKey('raw', dekBytes, 'AES-GCM', false, ['decrypt']);\n\n // Decrypt main data\n const ciphertextWithIv = base64ToBytes(envelope.ciphertext_share);\n const dataIv = ciphertextWithIv.slice(0, 12);\n const encryptedData = ciphertextWithIv.slice(12);\n\n const decryptedData = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: dataIv }, dekCryptoKey, encryptedData);\n console.log('[iframe][envelopeDecryptKeyshareWithPassword] Main data decrypted successfully');\n\n const plaintext = new TextDecoder().decode(decryptedData);\n const result = JSON.parse(plaintext) as KeyshareBackupData;\n console.log('[iframe][envelopeDecryptKeyshareWithPassword] Decryption completed successfully');\n return result;\n } catch (error) {\n console.error('[iframe][envelopeDecryptKeyshareWithPassword] Decryption failed:', error);\n if (error instanceof Error && error.name === 'OperationError') {\n throw new Error('Incorrect password: Unable to decrypt the backup with the provided password.');\n }\n throw new Error('Failed to decrypt keyshare with password: ' + (error instanceof Error ? error.message : String(error)));\n }\n}\n\n/**\n * Decrypt keyshare from local file backup\n * Uses 100,000 PBKDF2 iterations for backward compatibility with file backups\n */\nexport async function decryptKeyshare(\n encryptedBackup: any,\n password: string\n): Promise<KeyshareBackupData> {\n console.log('[iframe][decryptKeyshare] Starting file backup decryption');\n\n // Validate backup format and version\n if (encryptedBackup.magic && encryptedBackup.magic !== 'LUMIA_BACKUP_V1') {\n throw new Error('Invalid backup file format');\n }\n if (encryptedBackup.version && encryptedBackup.version !== '1.0') {\n throw new Error(`Unsupported backup version: ${encryptedBackup.version}`);\n }\n\n try {\n const decoder = new TextDecoder();\n\n // Support both old (encryptedData) and new (data) field names for backward compatibility\n const dataField = encryptedBackup.data || encryptedBackup.encryptedData;\n\n // Only decode base64 fields that we know are encrypted\n // Ignore additional metadata fields like userId, createdAt, etc.\n if (!encryptedBackup.salt || !encryptedBackup.iv || !dataField) {\n console.error('[iframe][decryptKeyshare] Backup structure:', Object.keys(encryptedBackup));\n throw new Error('Missing required encrypted backup fields (salt, iv, data/encryptedData)');\n }\n\n const salt = base64ToBytes(encryptedBackup.salt);\n const iv = base64ToBytes(encryptedBackup.iv);\n const encryptedData = base64ToBytes(dataField);\n\n // Derive key from password using PBKDF2 with 100,000 iterations (for file backups)\n const encoder = new TextEncoder();\n const passwordKey = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits']\n );\n\n const keyMaterial = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations: 100000, // File backups use 100,000 iterations\n hash: 'SHA-256',\n },\n passwordKey,\n 256\n );\n\n const key = await crypto.subtle.importKey(\n 'raw',\n keyMaterial,\n 'AES-GCM',\n false,\n ['decrypt']\n );\n\n const decryptedData = await crypto.subtle.decrypt(\n { name: 'AES-GCM', iv },\n key,\n encryptedData\n );\n\n const plaintext = decoder.decode(decryptedData);\n const backupData = JSON.parse(plaintext) as KeyshareBackupData;\n\n // Verify checksum if present\n if (encryptedBackup.checksum) {\n const expected = `${backupData.userId}:${backupData.sessionId}:${encryptedBackup.encryptionMethod || 'password'}`;\n const expectedBuf = await crypto.subtle.digest('SHA-256', encoder.encode(expected));\n const expectedChecksum = bytesToBase64(new Uint8Array(expectedBuf));\n\n if (expectedChecksum !== encryptedBackup.checksum) {\n throw new Error('Backup integrity check failed - file may be corrupted or tampered with');\n }\n }\n\n console.log('[iframe][decryptKeyshare] File backup decrypted successfully');\n return backupData;\n } catch (error: any) {\n const message = error?.message || String(error);\n const name = error?.name || 'Error';\n\n if (name === 'OperationError' || message.includes('decrypt')) {\n throw new Error('Incorrect password - unable to decrypt backup file');\n }\n if (error instanceof SyntaxError || message.includes('JSON')) {\n throw new Error('Corrupted backup file - decryption succeeded but data is invalid');\n }\n\n throw new Error(`Failed to decrypt backup: ${message}`);\n }\n}\n","/**\n * Server backup operations using ShareVault API\n */\n\nimport type { KeyshareBackupData } from '../types';\nimport type { TokenRefreshApiClient } from '../token-refresh-client';\nimport { envelopeEncryptKeyshare, envelopeEncryptKeyshareWithPassword } from './crypto-utils';\n\nconst SHARE_VAULT_URL =\n (typeof (window as any).__LUMIA_SERVICES__ !== 'undefined' &&\n (window as any).__LUMIA_SERVICES__?.shareVaultUrl) ||\n 'https://api.lumiapassport.com/vault';\n\nconst TSS_URL =\n (typeof (window as any).__LUMIA_SERVICES__ !== 'undefined' &&\n (window as any).__LUMIA_SERVICES__?.tssUrl) ||\n 'https://api.lumiapassport.com/tss';\n\n/**\n * Get ShareVault token from TSS\n */\nasync function getShareVaultToken(scopes: string[], accessToken?: string): Promise<string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add Authorization header if token is provided\n if (accessToken) {\n headers['Authorization'] = `Bearer ${accessToken}`;\n }\n\n const response = await fetch(`${TSS_URL}/api/auth/token/exchange`, {\n method: 'POST',\n headers,\n credentials: 'include',\n body: JSON.stringify({\n scopes,\n audience: 'lumia-passport-share-vault-service',\n ttl: 300,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to get Share Vault token: ${response.status}`);\n }\n\n const data = await response.json();\n if (!data?.resourceToken) {\n throw new Error('Invalid token response');\n }\n\n return data.resourceToken;\n}\n\n/**\n * Upload encrypted share to ShareVault\n */\nasync function uploadShareToVault(encryptedShare: any, accessToken?: string): Promise<void> {\n const token = await getShareVaultToken(['share:put'], accessToken);\n const idempotencyKey = crypto.randomUUID ? crypto.randomUUID() : `backup-${Date.now()}`;\n\n const response = await fetch(`${SHARE_VAULT_URL}/v1/shares/me`, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${token}`,\n 'Idempotency-Key': idempotencyKey,\n },\n body: JSON.stringify(encryptedShare),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Failed to upload share: ${response.status} ${response.statusText} - ${errorText}`);\n }\n}\n\n/**\n * Backup keyshare to server using ShareVault API\n */\nexport async function backupToServer(\n data: KeyshareBackupData,\n tokenClient: TokenRefreshApiClient,\n password?: string,\n accessToken?: string\n): Promise<void> {\n let encryptedShare: any;\n\n if (password) {\n encryptedShare = await envelopeEncryptKeyshareWithPassword(data, password);\n } else {\n encryptedShare = await envelopeEncryptKeyshare(data, data.userId);\n }\n\n await uploadShareToVault(encryptedShare, accessToken);\n}\n\n/**\n * Download encrypted share from ShareVault\n */\nasync function downloadShareFromVault(accessToken?: string): Promise<any> {\n const token = await getShareVaultToken(['share:get'], accessToken);\n\n const response = await fetch(`${SHARE_VAULT_URL}/v1/shares/me`, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'X-Client-Device-Id': 'lumia-ui-kit',\n 'X-Client-Device-Name': 'Lumia UI Kit',\n },\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error('No backup found on server for this user');\n }\n const errorText = await response.text();\n throw new Error(`Failed to download share: ${response.status} ${response.statusText} - ${errorText}`);\n }\n\n const envelope = await response.json();\n if (!envelope.ciphertext_share || !envelope.wrapped_dek || !envelope.kdf || !envelope.alg || !envelope.aad) {\n throw new Error('Invalid envelope structure received from Share Vault');\n }\n\n return envelope;\n}\n\n/**\n * Restore keyshare from server using ShareVault API\n */\nexport async function restoreFromServer(\n userId: string,\n tokenClient: TokenRefreshApiClient,\n password?: string,\n accessToken?: string\n): Promise<KeyshareBackupData> {\n console.log('[iframe][restoreFromServer] Starting restore for userId:', userId);\n console.log('[iframe][restoreFromServer] Using password:', !!password);\n\n // Download encrypted share from vault\n console.log('[iframe][restoreFromServer] Downloading share from vault...');\n const envelope = await downloadShareFromVault(accessToken);\n\n console.log('[iframe][restoreFromServer] Envelope encryption method:', envelope.encryptionMethod);\n\n // Import decrypt functions from crypto-utils\n const { envelopeDecryptKeyshare, envelopeDecryptKeyshareWithPassword } = await import('./crypto-utils');\n\n // Decrypt based on encryption method or user preference\n const backupData = password\n ? await envelopeDecryptKeyshareWithPassword(envelope, password)\n : await envelopeDecryptKeyshare(envelope, userId);\n\n if (backupData.userId !== userId) {\n throw new Error('Server backup does not match current user');\n }\n\n console.log('[iframe][restoreFromServer] Decryption successful, returning backup data');\n return backupData;\n}\n","/**\n * Local file backup operations\n */\n\nimport type { KeyshareBackupData } from '../types';\nimport { encryptKeyshare, deriveBackupPasswordFromPasskey } from './crypto-utils';\n\n/**\n * Backup keyshare to local file (download as JSON)\n */\nexport async function backupToLocalFile(\n data: KeyshareBackupData,\n password?: string\n): Promise<void> {\n let encryptionPassword = password;\n let credentialId: string | undefined;\n\n if (!encryptionPassword) {\n const result = await deriveBackupPasswordFromPasskey(data.userId);\n encryptionPassword = result.password;\n credentialId = result.credentialId;\n }\n\n const encrypted = await encryptKeyshare(\n data,\n encryptionPassword,\n password ? 'password' : 'passkey',\n credentialId\n );\n\n const backupData = {\n ...encrypted,\n userId: data.userId,\n createdAt: data.createdAt,\n };\n\n const blob = new Blob([JSON.stringify(backupData, null, 2)], {\n type: 'application/json',\n });\n\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `lumia-passport-backup-${data.userId}-${Date.now()}.json`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n}\n\n/**\n * Restore keyshare from local file\n */\nexport async function restoreFromLocalFile(\n fileContent: string,\n userId: string,\n password?: string\n): Promise<KeyshareBackupData> {\n console.log('[iframe][restoreFromLocalFile] Starting restore from local file');\n\n const encryptedBackup = JSON.parse(fileContent);\n\n let decryptionPassword: string;\n let credentialId: string | undefined;\n\n if (password) {\n // Use provided password\n decryptionPassword = password;\n } else {\n // Use passkey-derived password, with specific credentialId if available\n const credentialIdFromBackup =\n encryptedBackup.encryptionMethod === 'passkey'\n ? encryptedBackup.credentialId\n : undefined;\n const result = await deriveBackupPasswordFromPasskey(\n userId,\n credentialIdFromBackup\n ).catch(() => {\n throw new Error(\n 'Restore requires either password or passkey authentication'\n );\n });\n decryptionPassword = result.password;\n credentialId = result.credentialId;\n }\n\n // Import decrypt function\n const { decryptKeyshare } = await import('./crypto-utils');\n const backupData = await decryptKeyshare(encryptedBackup, decryptionPassword);\n\n if (backupData.userId !== userId) {\n throw new Error('Backup file does not match current user');\n }\n\n console.log('[iframe][restoreFromLocalFile] Restore successful');\n return backupData;\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\n\nexport type IsHexErrorType = ErrorType\n\nexport function isHex(\n value: unknown,\n { strict = true }: { strict?: boolean | undefined } = {},\n): value is Hex {\n if (!value) return false\n if (typeof value !== 'string') return false\n return strict ? /^0x[0-9a-fA-F]*$/.test(value) : value.startsWith('0x')\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\n\nimport { type IsHexErrorType, isHex } from './isHex.js'\n\nexport type SizeErrorType = IsHexErrorType | ErrorType\n\n/**\n * @description Retrieves the size of the value (in bytes).\n *\n * @param value The value (hex or byte array) to retrieve the size of.\n * @returns The size of the value (in bytes).\n */\nexport function size(value: Hex | ByteArray) {\n if (isHex(value, { strict: false })) return Math.ceil((value.length - 2) / 2)\n return value.length\n}\n","export const version = '2.38.0'\n","import { version } from './version.js'\n\ntype ErrorConfig = {\n getDocsUrl?: ((args: BaseErrorParameters) => string | undefined) | undefined\n version?: string | undefined\n}\n\nlet errorConfig: ErrorConfig = {\n getDocsUrl: ({\n docsBaseUrl,\n docsPath = '',\n docsSlug,\n }: BaseErrorParameters) =>\n docsPath\n ? `${docsBaseUrl ?? 'https://viem.sh'}${docsPath}${\n docsSlug ? `#${docsSlug}` : ''\n }`\n : undefined,\n version: `viem@${version}`,\n}\n\nexport function setErrorConfig(config: ErrorConfig) {\n errorConfig = config\n}\n\ntype BaseErrorParameters = {\n cause?: BaseError | Error | undefined\n details?: string | undefined\n docsBaseUrl?: string | undefined\n docsPath?: string | undefined\n docsSlug?: string | undefined\n metaMessages?: string[] | undefined\n name?: string | undefined\n}\n\nexport type BaseErrorType = BaseError & { name: 'BaseError' }\nexport class BaseError extends Error {\n details: string\n docsPath?: string | undefined\n metaMessages?: string[] | undefined\n shortMessage: string\n version: string\n\n override name = 'BaseError'\n\n constructor(shortMessage: string, args: BaseErrorParameters = {}) {\n const details = (() => {\n if (args.cause instanceof BaseError) return args.cause.details\n if (args.cause?.message) return args.cause.message\n return args.details!\n })()\n const docsPath = (() => {\n if (args.cause instanceof BaseError)\n return args.cause.docsPath || args.docsPath\n return args.docsPath\n })()\n const docsUrl = errorConfig.getDocsUrl?.({ ...args, docsPath })\n\n const message = [\n shortMessage || 'An error occurred.',\n '',\n ...(args.metaMessages ? [...args.metaMessages, ''] : []),\n ...(docsUrl ? [`Docs: ${docsUrl}`] : []),\n ...(details ? [`Details: ${details}`] : []),\n ...(errorConfig.version ? [`Version: ${errorConfig.version}`] : []),\n ].join('\\n')\n\n super(message, args.cause ? { cause: args.cause } : undefined)\n\n this.details = details\n this.docsPath = docsPath\n this.metaMessages = args.metaMessages\n this.name = args.name ?? this.name\n this.shortMessage = shortMessage\n this.version = version\n }\n\n walk(): Error\n walk(fn: (err: unknown) => boolean): Error | null\n walk(fn?: any): any {\n return walk(this, fn)\n }\n}\n\nfunction walk(\n err: unknown,\n fn?: ((err: unknown) => boolean) | undefined,\n): unknown {\n if (fn?.(err)) return err\n if (\n err &&\n typeof err === 'object' &&\n 'cause' in err &&\n err.cause !== undefined\n )\n return walk(err.cause, fn)\n return fn ? null : err\n}\n","import { BaseError } from './base.js'\n\nexport type SliceOffsetOutOfBoundsErrorType = SliceOffsetOutOfBoundsError & {\n name: 'SliceOffsetOutOfBoundsError'\n}\nexport class SliceOffsetOutOfBoundsError extends BaseError {\n constructor({\n offset,\n position,\n size,\n }: { offset: number; position: 'start' | 'end'; size: number }) {\n super(\n `Slice ${\n position === 'start' ? 'starting' : 'ending'\n } at offset \"${offset}\" is out-of-bounds (size: ${size}).`,\n { name: 'SliceOffsetOutOfBoundsError' },\n )\n }\n}\n\nexport type SizeExceedsPaddingSizeErrorType = SizeExceedsPaddingSizeError & {\n name: 'SizeExceedsPaddingSizeError'\n}\nexport class SizeExceedsPaddingSizeError extends BaseError {\n constructor({\n size,\n targetSize,\n type,\n }: {\n size: number\n targetSize: number\n type: 'hex' | 'bytes'\n }) {\n super(\n `${type.charAt(0).toUpperCase()}${type\n .slice(1)\n .toLowerCase()} size (${size}) exceeds padding size (${targetSize}).`,\n { name: 'SizeExceedsPaddingSizeError' },\n )\n }\n}\n\nexport type InvalidBytesLengthErrorType = InvalidBytesLengthError & {\n name: 'InvalidBytesLengthError'\n}\nexport class InvalidBytesLengthError extends BaseError {\n constructor({\n size,\n targetSize,\n type,\n }: {\n size: number\n targetSize: number\n type: 'hex' | 'bytes'\n }) {\n super(\n `${type.charAt(0).toUpperCase()}${type\n .slice(1)\n .toLowerCase()} is expected to be ${targetSize} ${type} long, but is ${size} ${type} long.`,\n { name: 'InvalidBytesLengthError' },\n )\n }\n}\n","import {\n SizeExceedsPaddingSizeError,\n type SizeExceedsPaddingSizeErrorType,\n} from '../../errors/data.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\n\ntype PadOptions = {\n dir?: 'left' | 'right' | undefined\n size?: number | null | undefined\n}\nexport type PadReturnType<value extends ByteArray | Hex> = value extends Hex\n ? Hex\n : ByteArray\n\nexport type PadErrorType = PadHexErrorType | PadBytesErrorType | ErrorType\n\nexport function pad<value extends ByteArray | Hex>(\n hexOrBytes: value,\n { dir, size = 32 }: PadOptions = {},\n): PadReturnType<value> {\n if (typeof hexOrBytes === 'string')\n return padHex(hexOrBytes, { dir, size }) as PadReturnType<value>\n return padBytes(hexOrBytes, { dir, size }) as PadReturnType<value>\n}\n\nexport type PadHexErrorType = SizeExceedsPaddingSizeErrorType | ErrorType\n\nexport function padHex(hex_: Hex, { dir, size = 32 }: PadOptions = {}) {\n if (size === null) return hex_\n const hex = hex_.replace('0x', '')\n if (hex.length > size * 2)\n throw new SizeExceedsPaddingSizeError({\n size: Math.ceil(hex.length / 2),\n targetSize: size,\n type: 'hex',\n })\n\n return `0x${hex[dir === 'right' ? 'padEnd' : 'padStart'](\n size * 2,\n '0',\n )}` as Hex\n}\n\nexport type PadBytesErrorType = SizeExceedsPaddingSizeErrorType | ErrorType\n\nexport function padBytes(\n bytes: ByteArray,\n { dir, size = 32 }: PadOptions = {},\n) {\n if (size === null) return bytes\n if (bytes.length > size)\n throw new SizeExceedsPaddingSizeError({\n size: bytes.length,\n targetSize: size,\n type: 'bytes',\n })\n const paddedBytes = new Uint8Array(size)\n for (let i = 0; i < size; i++) {\n const padEnd = dir === 'right'\n paddedBytes[padEnd ? i : size - i - 1] =\n bytes[padEnd ? i : bytes.length - i - 1]\n }\n return paddedBytes\n}\n","import type { ByteArray, Hex } from '../types/misc.js'\n\nimport { BaseError } from './base.js'\n\nexport type IntegerOutOfRangeErrorType = IntegerOutOfRangeError & {\n name: 'IntegerOutOfRangeError'\n}\nexport class IntegerOutOfRangeError extends BaseError {\n constructor({\n max,\n min,\n signed,\n size,\n value,\n }: {\n max?: string | undefined\n min: string\n signed?: boolean | undefined\n size?: number | undefined\n value: string\n }) {\n super(\n `Number \"${value}\" is not in safe ${\n size ? `${size * 8}-bit ${signed ? 'signed' : 'unsigned'} ` : ''\n }integer range ${max ? `(${min} to ${max})` : `(above ${min})`}`,\n { name: 'IntegerOutOfRangeError' },\n )\n }\n}\n\nexport type InvalidBytesBooleanErrorType = InvalidBytesBooleanError & {\n name: 'InvalidBytesBooleanError'\n}\nexport class InvalidBytesBooleanError extends BaseError {\n constructor(bytes: ByteArray) {\n super(\n `Bytes value \"${bytes}\" is not a valid boolean. The bytes array must contain a single byte of either a 0 or 1 value.`,\n {\n name: 'InvalidBytesBooleanError',\n },\n )\n }\n}\n\nexport type InvalidHexBooleanErrorType = InvalidHexBooleanError & {\n name: 'InvalidHexBooleanError'\n}\nexport class InvalidHexBooleanError extends BaseError {\n constructor(hex: Hex) {\n super(\n `Hex value \"${hex}\" is not a valid boolean. The hex value must be \"0x0\" (false) or \"0x1\" (true).`,\n { name: 'InvalidHexBooleanError' },\n )\n }\n}\n\nexport type InvalidHexValueErrorType = InvalidHexValueError & {\n name: 'InvalidHexValueError'\n}\nexport class InvalidHexValueError extends BaseError {\n constructor(value: Hex) {\n super(\n `Hex value \"${value}\" is an odd length (${value.length}). It must be an even length.`,\n { name: 'InvalidHexValueError' },\n )\n }\n}\n\nexport type SizeOverflowErrorType = SizeOverflowError & {\n name: 'SizeOverflowError'\n}\nexport class SizeOverflowError extends BaseError {\n constructor({ givenSize, maxSize }: { givenSize: number; maxSize: number }) {\n super(\n `Size cannot exceed ${maxSize} bytes. Given size: ${givenSize} bytes.`,\n { name: 'SizeOverflowError' },\n )\n }\n}\n","import {\n InvalidHexBooleanError,\n type InvalidHexBooleanErrorType,\n SizeOverflowError,\n type SizeOverflowErrorType,\n} from '../../errors/encoding.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type SizeErrorType, size as size_ } from '../data/size.js'\nimport { type TrimErrorType, trim } from '../data/trim.js'\n\nimport { type HexToBytesErrorType, hexToBytes } from './toBytes.js'\n\nexport type AssertSizeErrorType =\n | SizeOverflowErrorType\n | SizeErrorType\n | ErrorType\n\nexport function assertSize(\n hexOrBytes: Hex | ByteArray,\n { size }: { size: number },\n): void {\n if (size_(hexOrBytes) > size)\n throw new SizeOverflowError({\n givenSize: size_(hexOrBytes),\n maxSize: size,\n })\n}\n\nexport type FromHexParameters<\n to extends 'string' | 'bigint' | 'number' | 'bytes' | 'boolean',\n> =\n | to\n | {\n /** Size (in bytes) of the hex value. */\n size?: number | undefined\n /** Type to convert to. */\n to: to\n }\n\nexport type FromHexReturnType<to> = to extends 'string'\n ? string\n : to extends 'bigint'\n ? bigint\n : to extends 'number'\n ? number\n : to extends 'bytes'\n ? ByteArray\n : to extends 'boolean'\n ? boolean\n : never\n\nexport type FromHexErrorType =\n | HexToNumberErrorType\n | HexToBigIntErrorType\n | HexToBoolErrorType\n | HexToStringErrorType\n | HexToBytesErrorType\n | ErrorType\n\n/**\n * Decodes a hex string into a string, number, bigint, boolean, or byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex\n * - Example: https://viem.sh/docs/utilities/fromHex#usage\n *\n * @param hex Hex string to decode.\n * @param toOrOpts Type to convert to or options.\n * @returns Decoded value.\n *\n * @example\n * import { fromHex } from 'viem'\n * const data = fromHex('0x1a4', 'number')\n * // 420\n *\n * @example\n * import { fromHex } from 'viem'\n * const data = fromHex('0x48656c6c6f20576f726c6421', 'string')\n * // 'Hello world'\n *\n * @example\n * import { fromHex } from 'viem'\n * const data = fromHex('0x48656c6c6f20576f726c64210000000000000000000000000000000000000000', {\n * size: 32,\n * to: 'string'\n * })\n * // 'Hello world'\n */\nexport function fromHex<\n to extends 'string' | 'bigint' | 'number' | 'bytes' | 'boolean',\n>(hex: Hex, toOrOpts: FromHexParameters<to>): FromHexReturnType<to> {\n const opts = typeof toOrOpts === 'string' ? { to: toOrOpts } : toOrOpts\n const to = opts.to\n\n if (to === 'number') return hexToNumber(hex, opts) as FromHexReturnType<to>\n if (to === 'bigint') return hexToBigInt(hex, opts) as FromHexReturnType<to>\n if (to === 'string') return hexToString(hex, opts) as FromHexReturnType<to>\n if (to === 'boolean') return hexToBool(hex, opts) as FromHexReturnType<to>\n return hexToBytes(hex, opts) as FromHexReturnType<to>\n}\n\nexport type HexToBigIntOpts = {\n /** Whether or not the number of a signed representation. */\n signed?: boolean | undefined\n /** Size (in bytes) of the hex value. */\n size?: number | undefined\n}\n\nexport type HexToBigIntErrorType = AssertSizeErrorType | ErrorType\n\n/**\n * Decodes a hex value into a bigint.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex#hextobigint\n *\n * @param hex Hex value to decode.\n * @param opts Options.\n * @returns BigInt value.\n *\n * @example\n * import { hexToBigInt } from 'viem'\n * const data = hexToBigInt('0x1a4', { signed: true })\n * // 420n\n *\n * @example\n * import { hexToBigInt } from 'viem'\n * const data = hexToBigInt('0x00000000000000000000000000000000000000000000000000000000000001a4', { size: 32 })\n * // 420n\n */\nexport function hexToBigInt(hex: Hex, opts: HexToBigIntOpts = {}): bigint {\n const { signed } = opts\n\n if (opts.size) assertSize(hex, { size: opts.size })\n\n const value = BigInt(hex)\n if (!signed) return value\n\n const size = (hex.length - 2) / 2\n const max = (1n << (BigInt(size) * 8n - 1n)) - 1n\n if (value <= max) return value\n\n return value - BigInt(`0x${'f'.padStart(size * 2, 'f')}`) - 1n\n}\n\nexport type HexToBoolOpts = {\n /** Size (in bytes) of the hex value. */\n size?: number | undefined\n}\n\nexport type HexToBoolErrorType =\n | AssertSizeErrorType\n | InvalidHexBooleanErrorType\n | TrimErrorType\n | ErrorType\n\n/**\n * Decodes a hex value into a boolean.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex#hextobool\n *\n * @param hex Hex value to decode.\n * @param opts Options.\n * @returns Boolean value.\n *\n * @example\n * import { hexToBool } from 'viem'\n * const data = hexToBool('0x01')\n * // true\n *\n * @example\n * import { hexToBool } from 'viem'\n * const data = hexToBool('0x0000000000000000000000000000000000000000000000000000000000000001', { size: 32 })\n * // true\n */\nexport function hexToBool(hex_: Hex, opts: HexToBoolOpts = {}): boolean {\n let hex = hex_\n if (opts.size) {\n assertSize(hex, { size: opts.size })\n hex = trim(hex)\n }\n if (trim(hex) === '0x00') return false\n if (trim(hex) === '0x01') return true\n throw new InvalidHexBooleanError(hex)\n}\n\nexport type HexToNumberOpts = HexToBigIntOpts\n\nexport type HexToNumberErrorType = HexToBigIntErrorType | ErrorType\n\n/**\n * Decodes a hex string into a number.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex#hextonumber\n *\n * @param hex Hex value to decode.\n * @param opts Options.\n * @returns Number value.\n *\n * @example\n * import { hexToNumber } from 'viem'\n * const data = hexToNumber('0x1a4')\n * // 420\n *\n * @example\n * import { hexToNumber } from 'viem'\n * const data = hexToBigInt('0x00000000000000000000000000000000000000000000000000000000000001a4', { size: 32 })\n * // 420\n */\nexport function hexToNumber(hex: Hex, opts: HexToNumberOpts = {}): number {\n return Number(hexToBigInt(hex, opts))\n}\n\nexport type HexToStringOpts = {\n /** Size (in bytes) of the hex value. */\n size?: number | undefined\n}\n\nexport type HexToStringErrorType =\n | AssertSizeErrorType\n | HexToBytesErrorType\n | TrimErrorType\n | ErrorType\n\n/**\n * Decodes a hex value into a UTF-8 string.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex#hextostring\n *\n * @param hex Hex value to decode.\n * @param opts Options.\n * @returns String value.\n *\n * @example\n * import { hexToString } from 'viem'\n * const data = hexToString('0x48656c6c6f20576f726c6421')\n * // 'Hello world!'\n *\n * @example\n * import { hexToString } from 'viem'\n * const data = hexToString('0x48656c6c6f20576f726c64210000000000000000000000000000000000000000', {\n * size: 32,\n * })\n * // 'Hello world'\n */\nexport function hexToString(hex: Hex, opts: HexToStringOpts = {}): string {\n let bytes = hexToBytes(hex)\n if (opts.size) {\n assertSize(bytes, { size: opts.size })\n bytes = trim(bytes, { dir: 'right' })\n }\n return new TextDecoder().decode(bytes)\n}\n","import {\n IntegerOutOfRangeError,\n type IntegerOutOfRangeErrorType,\n} from '../../errors/encoding.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type PadErrorType, pad } from '../data/pad.js'\n\nimport { type AssertSizeErrorType, assertSize } from './fromHex.js'\n\nconst hexes = /*#__PURE__*/ Array.from({ length: 256 }, (_v, i) =>\n i.toString(16).padStart(2, '0'),\n)\n\nexport type ToHexParameters = {\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n}\n\nexport type ToHexErrorType =\n | BoolToHexErrorType\n | BytesToHexErrorType\n | NumberToHexErrorType\n | StringToHexErrorType\n | ErrorType\n\n/**\n * Encodes a string, number, bigint, or ByteArray into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex\n * - Example: https://viem.sh/docs/utilities/toHex#usage\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { toHex } from 'viem'\n * const data = toHex('Hello world')\n * // '0x48656c6c6f20776f726c6421'\n *\n * @example\n * import { toHex } from 'viem'\n * const data = toHex(420)\n * // '0x1a4'\n *\n * @example\n * import { toHex } from 'viem'\n * const data = toHex('Hello world', { size: 32 })\n * // '0x48656c6c6f20776f726c64210000000000000000000000000000000000000000'\n */\nexport function toHex(\n value: string | number | bigint | boolean | ByteArray,\n opts: ToHexParameters = {},\n): Hex {\n if (typeof value === 'number' || typeof value === 'bigint')\n return numberToHex(value, opts)\n if (typeof value === 'string') {\n return stringToHex(value, opts)\n }\n if (typeof value === 'boolean') return boolToHex(value, opts)\n return bytesToHex(value, opts)\n}\n\nexport type BoolToHexOpts = {\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n}\n\nexport type BoolToHexErrorType = AssertSizeErrorType | PadErrorType | ErrorType\n\n/**\n * Encodes a boolean into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex#booltohex\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { boolToHex } from 'viem'\n * const data = boolToHex(true)\n * // '0x1'\n *\n * @example\n * import { boolToHex } from 'viem'\n * const data = boolToHex(false)\n * // '0x0'\n *\n * @example\n * import { boolToHex } from 'viem'\n * const data = boolToHex(true, { size: 32 })\n * // '0x0000000000000000000000000000000000000000000000000000000000000001'\n */\nexport function boolToHex(value: boolean, opts: BoolToHexOpts = {}): Hex {\n const hex: Hex = `0x${Number(value)}`\n if (typeof opts.size === 'number') {\n assertSize(hex, { size: opts.size })\n return pad(hex, { size: opts.size })\n }\n return hex\n}\n\nexport type BytesToHexOpts = {\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n}\n\nexport type BytesToHexErrorType = AssertSizeErrorType | PadErrorType | ErrorType\n\n/**\n * Encodes a bytes array into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex#bytestohex\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { bytesToHex } from 'viem'\n * const data = bytesToHex(Uint8Array.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])\n * // '0x48656c6c6f20576f726c6421'\n *\n * @example\n * import { bytesToHex } from 'viem'\n * const data = bytesToHex(Uint8Array.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]), { size: 32 })\n * // '0x48656c6c6f20576f726c64210000000000000000000000000000000000000000'\n */\nexport function bytesToHex(value: ByteArray, opts: BytesToHexOpts = {}): Hex {\n let string = ''\n for (let i = 0; i < value.length; i++) {\n string += hexes[value[i]]\n }\n const hex = `0x${string}` as const\n\n if (typeof opts.size === 'number') {\n assertSize(hex, { size: opts.size })\n return pad(hex, { dir: 'right', size: opts.size })\n }\n return hex\n}\n\nexport type NumberToHexOpts =\n | {\n /** Whether or not the number of a signed representation. */\n signed?: boolean | undefined\n /** The size (in bytes) of the output hex value. */\n size: number\n }\n | {\n signed?: undefined\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n }\n\nexport type NumberToHexErrorType =\n | IntegerOutOfRangeErrorType\n | PadErrorType\n | ErrorType\n\n/**\n * Encodes a number or bigint into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex#numbertohex\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { numberToHex } from 'viem'\n * const data = numberToHex(420)\n * // '0x1a4'\n *\n * @example\n * import { numberToHex } from 'viem'\n * const data = numberToHex(420, { size: 32 })\n * // '0x00000000000000000000000000000000000000000000000000000000000001a4'\n */\nexport function numberToHex(\n value_: number | bigint,\n opts: NumberToHexOpts = {},\n): Hex {\n const { signed, size } = opts\n\n const value = BigInt(value_)\n\n let maxValue: bigint | number | undefined\n if (size) {\n if (signed) maxValue = (1n << (BigInt(size) * 8n - 1n)) - 1n\n else maxValue = 2n ** (BigInt(size) * 8n) - 1n\n } else if (typeof value_ === 'number') {\n maxValue = BigInt(Number.MAX_SAFE_INTEGER)\n }\n\n const minValue = typeof maxValue === 'bigint' && signed ? -maxValue - 1n : 0\n\n if ((maxValue && value > maxValue) || value < minValue) {\n const suffix = typeof value_ === 'bigint' ? 'n' : ''\n throw new IntegerOutOfRangeError({\n max: maxValue ? `${maxValue}${suffix}` : undefined,\n min: `${minValue}${suffix}`,\n signed,\n size,\n value: `${value_}${suffix}`,\n })\n }\n\n const hex = `0x${(\n signed && value < 0 ? (1n << BigInt(size * 8)) + BigInt(value) : value\n ).toString(16)}` as Hex\n if (size) return pad(hex, { size }) as Hex\n return hex\n}\n\nexport type StringToHexOpts = {\n /** The size (in bytes) of the output hex value. */\n size?: number | undefined\n}\n\nexport type StringToHexErrorType = BytesToHexErrorType | ErrorType\n\nconst encoder = /*#__PURE__*/ new TextEncoder()\n\n/**\n * Encodes a UTF-8 string into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex#stringtohex\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { stringToHex } from 'viem'\n * const data = stringToHex('Hello World!')\n * // '0x48656c6c6f20576f726c6421'\n *\n * @example\n * import { stringToHex } from 'viem'\n * const data = stringToHex('Hello World!', { size: 32 })\n * // '0x48656c6c6f20576f726c64210000000000000000000000000000000000000000'\n */\nexport function stringToHex(value_: string, opts: StringToHexOpts = {}): Hex {\n const value = encoder.encode(value_)\n return bytesToHex(value, opts)\n}\n","import { BaseError } from '../../errors/base.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type IsHexErrorType, isHex } from '../data/isHex.js'\nimport { type PadErrorType, pad } from '../data/pad.js'\n\nimport { type AssertSizeErrorType, assertSize } from './fromHex.js'\nimport {\n type NumberToHexErrorType,\n type NumberToHexOpts,\n numberToHex,\n} from './toHex.js'\n\nconst encoder = /*#__PURE__*/ new TextEncoder()\n\nexport type ToBytesParameters = {\n /** Size of the output bytes. */\n size?: number | undefined\n}\n\nexport type ToBytesErrorType =\n | NumberToBytesErrorType\n | BoolToBytesErrorType\n | HexToBytesErrorType\n | StringToBytesErrorType\n | IsHexErrorType\n | ErrorType\n\n/**\n * Encodes a UTF-8 string, hex value, bigint, number or boolean to a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes\n * - Example: https://viem.sh/docs/utilities/toBytes#usage\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { toBytes } from 'viem'\n * const data = toBytes('Hello world')\n * // Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])\n *\n * @example\n * import { toBytes } from 'viem'\n * const data = toBytes(420)\n * // Uint8Array([1, 164])\n *\n * @example\n * import { toBytes } from 'viem'\n * const data = toBytes(420, { size: 4 })\n * // Uint8Array([0, 0, 1, 164])\n */\nexport function toBytes(\n value: string | bigint | number | boolean | Hex,\n opts: ToBytesParameters = {},\n): ByteArray {\n if (typeof value === 'number' || typeof value === 'bigint')\n return numberToBytes(value, opts)\n if (typeof value === 'boolean') return boolToBytes(value, opts)\n if (isHex(value)) return hexToBytes(value, opts)\n return stringToBytes(value, opts)\n}\n\nexport type BoolToBytesOpts = {\n /** Size of the output bytes. */\n size?: number | undefined\n}\n\nexport type BoolToBytesErrorType =\n | AssertSizeErrorType\n | PadErrorType\n | ErrorType\n\n/**\n * Encodes a boolean into a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes#booltobytes\n *\n * @param value Boolean value to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { boolToBytes } from 'viem'\n * const data = boolToBytes(true)\n * // Uint8Array([1])\n *\n * @example\n * import { boolToBytes } from 'viem'\n * const data = boolToBytes(true, { size: 32 })\n * // Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1])\n */\nexport function boolToBytes(value: boolean, opts: BoolToBytesOpts = {}) {\n const bytes = new Uint8Array(1)\n bytes[0] = Number(value)\n if (typeof opts.size === 'number') {\n assertSize(bytes, { size: opts.size })\n return pad(bytes, { size: opts.size })\n }\n return bytes\n}\n\n// We use very optimized technique to convert hex string to byte array\nconst charCodeMap = {\n zero: 48,\n nine: 57,\n A: 65,\n F: 70,\n a: 97,\n f: 102,\n} as const\n\nfunction charCodeToBase16(char: number) {\n if (char >= charCodeMap.zero && char <= charCodeMap.nine)\n return char - charCodeMap.zero\n if (char >= charCodeMap.A && char <= charCodeMap.F)\n return char - (charCodeMap.A - 10)\n if (char >= charCodeMap.a && char <= charCodeMap.f)\n return char - (charCodeMap.a - 10)\n return undefined\n}\n\nexport type HexToBytesOpts = {\n /** Size of the output bytes. */\n size?: number | undefined\n}\n\nexport type HexToBytesErrorType = AssertSizeErrorType | PadErrorType | ErrorType\n\n/**\n * Encodes a hex string into a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes#hextobytes\n *\n * @param hex Hex string to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { hexToBytes } from 'viem'\n * const data = hexToBytes('0x48656c6c6f20776f726c6421')\n * // Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])\n *\n * @example\n * import { hexToBytes } from 'viem'\n * const data = hexToBytes('0x48656c6c6f20776f726c6421', { size: 32 })\n * // Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])\n */\nexport function hexToBytes(hex_: Hex, opts: HexToBytesOpts = {}): ByteArray {\n let hex = hex_\n if (opts.size) {\n assertSize(hex, { size: opts.size })\n hex = pad(hex, { dir: 'right', size: opts.size })\n }\n\n let hexString = hex.slice(2) as string\n if (hexString.length % 2) hexString = `0${hexString}`\n\n const length = hexString.length / 2\n const bytes = new Uint8Array(length)\n for (let index = 0, j = 0; index < length; index++) {\n const nibbleLeft = charCodeToBase16(hexString.charCodeAt(j++))\n const nibbleRight = charCodeToBase16(hexString.charCodeAt(j++))\n if (nibbleLeft === undefined || nibbleRight === undefined) {\n throw new BaseError(\n `Invalid byte sequence (\"${hexString[j - 2]}${\n hexString[j - 1]\n }\" in \"${hexString}\").`,\n )\n }\n bytes[index] = nibbleLeft * 16 + nibbleRight\n }\n return bytes\n}\n\nexport type NumberToBytesErrorType =\n | NumberToHexErrorType\n | HexToBytesErrorType\n | ErrorType\n\n/**\n * Encodes a number into a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes#numbertobytes\n *\n * @param value Number to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { numberToBytes } from 'viem'\n * const data = numberToBytes(420)\n * // Uint8Array([1, 164])\n *\n * @example\n * import { numberToBytes } from 'viem'\n * const data = numberToBytes(420, { size: 4 })\n * // Uint8Array([0, 0, 1, 164])\n */\nexport function numberToBytes(\n value: bigint | number,\n opts?: NumberToHexOpts | undefined,\n) {\n const hex = numberToHex(value, opts)\n return hexToBytes(hex)\n}\n\nexport type StringToBytesOpts = {\n /** Size of the output bytes. */\n size?: number | undefined\n}\n\nexport type StringToBytesErrorType =\n | AssertSizeErrorType\n | PadErrorType\n | ErrorType\n\n/**\n * Encodes a UTF-8 string into a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes#stringtobytes\n *\n * @param value String to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { stringToBytes } from 'viem'\n * const data = stringToBytes('Hello world!')\n * // Uint8Array([72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 33])\n *\n * @example\n * import { stringToBytes } from 'viem'\n * const data = stringToBytes('Hello world!', { size: 32 })\n * // Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])\n */\nexport function stringToBytes(\n value: string,\n opts: StringToBytesOpts = {},\n): ByteArray {\n const bytes = encoder.encode(value)\n if (typeof opts.size === 'number') {\n assertSize(bytes, { size: opts.size })\n return pad(bytes, { dir: 'right', size: opts.size })\n }\n return bytes\n}\n","/**\n * Internal helpers for u64. BigUint64Array is too slow as per 2025, so we implement it using Uint32Array.\n * @todo re-check https://issues.chromium.org/issues/42212588\n * @module\n */\nconst U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\n\nfunction fromBig(\n n: bigint,\n le = false\n): {\n h: number;\n l: number;\n} {\n if (le) return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\n\nfunction split(lst: bigint[], le = false): Uint32Array[] {\n const len = lst.length;\n let Ah = new Uint32Array(len);\n let Al = new Uint32Array(len);\n for (let i = 0; i < len; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\n\nconst toBig = (h: number, l: number): bigint => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h: number, _l: number, s: number): number => h >>> s;\nconst shrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h: number, l: number, s: number): number => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h: number, l: number, s: number): number => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h: number, l: number, s: number): number => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h: number, l: number): number => l;\nconst rotr32L = (h: number, _l: number): number => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h: number, l: number, s: number): number => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h: number, l: number, s: number): number => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h: number, l: number, s: number): number => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h: number, l: number, s: number): number => (h << (s - 32)) | (l >>> (64 - s));\n\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(\n Ah: number,\n Al: number,\n Bh: number,\n Bl: number\n): {\n h: number;\n l: number;\n} {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al: number, Bl: number, Cl: number): number => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low: number, Ah: number, Bh: number, Ch: number): number =>\n (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al: number, Bl: number, Cl: number, Dl: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number): number =>\n (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al: number, Bl: number, Cl: number, Dl: number, El: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number): number =>\n (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n\n// prettier-ignore\nexport {\n add, add3H, add3L, add4H, add4L, add5H, add5L, fromBig, rotlBH, rotlBL, rotlSH, rotlSL, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL, shrSH, shrSL, split, toBig\n};\n// prettier-ignore\nconst u64: { fromBig: typeof fromBig; split: typeof split; toBig: (h: number, l: number) => bigint; shrSH: (h: number, _l: number, s: number) => number; shrSL: (h: number, l: number, s: number) => number; rotrSH: (h: number, l: number, s: number) => number; rotrSL: (h: number, l: number, s: number) => number; rotrBH: (h: number, l: number, s: number) => number; rotrBL: (h: number, l: number, s: number) => number; rotr32H: (_h: number, l: number) => number; rotr32L: (h: number, _l: number) => number; rotlSH: (h: number, l: number, s: number) => number; rotlSL: (h: number, l: number, s: number) => number; rotlBH: (h: number, l: number, s: number) => number; rotlBL: (h: number, l: number, s: number) => number; add: typeof add; add3L: (Al: number, Bl: number, Cl: number) => number; add3H: (low: number, Ah: number, Bh: number, Ch: number) => number; add4L: (Al: number, Bl: number, Cl: number, Dl: number) => number; add4H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number) => number; add5H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number) => number; add5L: (Al: number, Bl: number, Cl: number, Dl: number, El: number) => number; } = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\n","/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated (2025-04-30), we can just drop the import.\nimport { crypto } from '@noble/hashes/crypto';\n\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n\n/** Asserts something is positive integer. */\nexport function anumber(n: number): void {\n if (!Number.isSafeInteger(n) || n < 0) throw new Error('positive integer expected, got ' + n);\n}\n\n/** Asserts something is Uint8Array. */\nexport function abytes(b: Uint8Array | undefined, ...lengths: number[]): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n\n/** Asserts something is hash */\nexport function ahash(h: IHash): void {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash should be wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n}\n\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance: any, checkFinished = true): void {\n if (instance.destroyed) throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished) throw new Error('Hash#digest() has already been called');\n}\n\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out: any, instance: any): void {\n abytes(out);\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('digestInto() expects output buffer of length at least ' + min);\n }\n}\n\n/** Generic type encompassing 8/16/32-byte arrays - but not 64-byte. */\n// prettier-ignore\nexport type TypedArray = Int8Array | Uint8ClampedArray | Uint8Array |\n Uint16Array | Int16Array | Uint32Array | Int32Array;\n\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr: TypedArray): Uint8Array {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr: TypedArray): Uint32Array {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays: TypedArray[]): void {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr: TypedArray): DataView {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** The rotate right (circular right shift) operation for uint32 */\nexport function rotr(word: number, shift: number): number {\n return (word << (32 - shift)) | (word >>> shift);\n}\n\n/** The rotate left (circular left shift) operation for uint32 */\nexport function rotl(word: number, shift: number): number {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE: boolean = /* @__PURE__ */ (() =>\n new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n\n/** The byte swap operation for uint32 */\nexport function byteSwap(word: number): number {\n return (\n ((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff)\n );\n}\n/** Conditionally byte swap if on a big-endian platform */\nexport const swap8IfBE: (n: number) => number = isLE\n ? (n: number) => n\n : (n: number) => byteSwap(n);\n\n/** @deprecated */\nexport const byteSwapIfBE: typeof swap8IfBE = swap8IfBE;\n/** In place byte swap for Uint32Array */\nexport function byteSwap32(arr: Uint32Array): Uint32Array {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\n\nexport const swap32IfBE: (u: Uint32Array) => Uint32Array = isLE\n ? (u: Uint32Array) => u\n : byteSwap32;\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n // @ts-ignore\n typeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) =>\n i.toString(16).padStart(2, '0')\n);\n\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin) return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 } as const;\nfunction asciiToBase16(ch: number): number | undefined {\n if (ch >= asciis._0 && ch <= asciis._9) return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F) return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f) return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex: string): Uint8Array {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin) return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2) throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nexport const nextTick = async (): Promise<void> => {};\n\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nexport async function asyncLoop(\n iters: number,\n tick: number,\n cb: (i: number) => void\n): Promise<void> {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick) continue;\n await nextTick();\n ts += diff;\n }\n}\n\n// Global symbols, but ts doesn't see them: https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * Converts string to bytes using UTF8 encoding.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nexport function utf8ToBytes(str: string): Uint8Array {\n if (typeof str !== 'string') throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\nexport function bytesToUtf8(bytes: Uint8Array): string {\n return new TextDecoder().decode(bytes);\n}\n\n/** Accepted input of hash functions. Strings are converted to byte arrays. */\nexport type Input = string | Uint8Array;\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nexport function toBytes(data: Input): Uint8Array {\n if (typeof data === 'string') data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n\n/** KDFs can accept string or Uint8Array for user convenience. */\nexport type KDFInput = string | Uint8Array;\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nexport function kdfInputToBytes(data: KDFInput): Uint8Array {\n if (typeof data === 'string') data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n\n/** Copies several Uint8Arrays into one. */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\n\ntype EmptyObj = {};\nexport function checkOpts<T1 extends EmptyObj, T2 extends EmptyObj>(\n defaults: T1,\n opts?: T2\n): T1 & T2 {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options should be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged as T1 & T2;\n}\n\n/** Hash interface. */\nexport type IHash = {\n (data: Uint8Array): Uint8Array;\n blockLen: number;\n outputLen: number;\n create: any;\n};\n\n/** For runtime check if class implements interface */\nexport abstract class Hash<T extends Hash<T>> {\n abstract blockLen: number; // Bytes per block\n abstract outputLen: number; // Bytes in output\n abstract update(buf: Input): this;\n // Writes digest into buf\n abstract digestInto(buf: Uint8Array): void;\n abstract digest(): Uint8Array;\n /**\n * Resets internal state. Makes Hash instance unusable.\n * Reset is impossible for keyed hashes if key is consumed into state. If digest is not consumed\n * by user, they will need to manually call `destroy()` when zeroing is necessary.\n */\n abstract destroy(): void;\n /**\n * Clones hash instance. Unsafe: doesn't check whether `to` is valid. Can be used as `clone()`\n * when no options are passed.\n * Reasons to use `_cloneInto` instead of clone: 1) performance 2) reuse instance => all internal\n * buffers are overwritten => causes buffer overwrite which is used for digest in some cases.\n * There are no guarantees for clean-up because it's impossible in JS.\n */\n abstract _cloneInto(to?: T): T;\n // Safe version that clones internal state\n abstract clone(): T;\n}\n\n/**\n * XOF: streaming API to read digest in chunks.\n * Same as 'squeeze' in keccak/k12 and 'seek' in blake3, but more generic name.\n * When hash used in XOF mode it is up to user to call '.destroy' afterwards, since we cannot\n * destroy state, next call can require more bytes.\n */\nexport type HashXOF<T extends Hash<T>> = Hash<T> & {\n xof(bytes: number): Uint8Array; // Read 'bytes' bytes from digest stream\n xofInto(buf: Uint8Array): Uint8Array; // read buf.length bytes from digest stream into buf\n};\n\n/** Hash function */\nexport type CHash = ReturnType<typeof createHasher>;\n/** Hash function with output */\nexport type CHashO = ReturnType<typeof createOptHasher>;\n/** XOF with output */\nexport type CHashXO = ReturnType<typeof createXOFer>;\n\n/** Wraps hash function, creating an interface on top of it */\nexport function createHasher<T extends Hash<T>>(\n hashCons: () => Hash<T>\n): {\n (msg: Input): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(): Hash<T>;\n} {\n const hashC = (msg: Input): Uint8Array => hashCons().update(toBytes(msg)).digest();\n const tmp = hashCons();\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = () => hashCons();\n return hashC;\n}\n\nexport function createOptHasher<H extends Hash<H>, T extends Object>(\n hashCons: (opts?: T) => Hash<H>\n): {\n (msg: Input, opts?: T): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(opts?: T): Hash<H>;\n} {\n const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({} as T);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: T) => hashCons(opts);\n return hashC;\n}\n\nexport function createXOFer<H extends HashXOF<H>, T extends Object>(\n hashCons: (opts?: T) => HashXOF<H>\n): {\n (msg: Input, opts?: T): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(opts?: T): HashXOF<H>;\n} {\n const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({} as T);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: T) => hashCons(opts);\n return hashC;\n}\nexport const wrapConstructor: typeof createHasher = createHasher;\nexport const wrapConstructorWithOpts: typeof createOptHasher = createOptHasher;\nexport const wrapXOFConstructorWithOpts: typeof createXOFer = createXOFer;\n\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32): Uint8Array {\n if (crypto && typeof crypto.getRandomValues === 'function') {\n return crypto.getRandomValues(new Uint8Array(bytesLength));\n }\n // Legacy Node.js compatibility\n if (crypto && typeof crypto.randomBytes === 'function') {\n return Uint8Array.from(crypto.randomBytes(bytesLength));\n }\n throw new Error('crypto.getRandomValues must be defined');\n}\n","/**\n * SHA3 (keccak) hash function, based on a new \"Sponge function\" design.\n * Different from older hashes, the internal state is bigger than output size.\n *\n * Check out [FIPS-202](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf),\n * [Website](https://keccak.team/keccak.html),\n * [the differences between SHA-3 and Keccak](https://crypto.stackexchange.com/questions/15727/what-are-the-key-differences-between-the-draft-sha-3-standard-and-the-keccak-sub).\n *\n * Check out `sha3-addons` module for cSHAKE, k12, and others.\n * @module\n */\nimport { rotlBH, rotlBL, rotlSH, rotlSL, split } from './_u64.ts';\n// prettier-ignore\nimport {\n abytes, aexists, anumber, aoutput,\n clean, createHasher, createXOFer, Hash,\n swap32IfBE,\n toBytes, u32,\n type CHash, type CHashXO, type HashXOF, type Input\n} from './utils.ts';\n\n// No __PURE__ annotations in sha3 header:\n// EVERYTHING is in fact used on every export.\n// Various per round constants calculations\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\nconst _2n = BigInt(2);\nconst _7n = BigInt(7);\nconst _256n = BigInt(256);\nconst _0x71n = BigInt(0x71);\nconst SHA3_PI: number[] = [];\nconst SHA3_ROTL: number[] = [];\nconst _SHA3_IOTA: bigint[] = [];\nfor (let round = 0, R = _1n, x = 1, y = 0; round < 24; round++) {\n // Pi\n [x, y] = [y, (2 * x + 3 * y) % 5];\n SHA3_PI.push(2 * (5 * y + x));\n // Rotational\n SHA3_ROTL.push((((round + 1) * (round + 2)) / 2) % 64);\n // Iota\n let t = _0n;\n for (let j = 0; j < 7; j++) {\n R = ((R << _1n) ^ ((R >> _7n) * _0x71n)) % _256n;\n if (R & _2n) t ^= _1n << ((_1n << /* @__PURE__ */ BigInt(j)) - _1n);\n }\n _SHA3_IOTA.push(t);\n}\nconst IOTAS = split(_SHA3_IOTA, true);\nconst SHA3_IOTA_H = IOTAS[0];\nconst SHA3_IOTA_L = IOTAS[1];\n\n// Left rotation (without 0, 32, 64)\nconst rotlH = (h: number, l: number, s: number) => (s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s));\nconst rotlL = (h: number, l: number, s: number) => (s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s));\n\n/** `keccakf1600` internal function, additionally allows to adjust round count. */\nexport function keccakP(s: Uint32Array, rounds: number = 24): void {\n const B = new Uint32Array(5 * 2);\n // NOTE: all indices are x2 since we store state as u32 instead of u64 (bigints to slow in js)\n for (let round = 24 - rounds; round < 24; round++) {\n // Theta θ\n for (let x = 0; x < 10; x++) B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];\n for (let x = 0; x < 10; x += 2) {\n const idx1 = (x + 8) % 10;\n const idx0 = (x + 2) % 10;\n const B0 = B[idx0];\n const B1 = B[idx0 + 1];\n const Th = rotlH(B0, B1, 1) ^ B[idx1];\n const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];\n for (let y = 0; y < 50; y += 10) {\n s[x + y] ^= Th;\n s[x + y + 1] ^= Tl;\n }\n }\n // Rho (ρ) and Pi (π)\n let curH = s[2];\n let curL = s[3];\n for (let t = 0; t < 24; t++) {\n const shift = SHA3_ROTL[t];\n const Th = rotlH(curH, curL, shift);\n const Tl = rotlL(curH, curL, shift);\n const PI = SHA3_PI[t];\n curH = s[PI];\n curL = s[PI + 1];\n s[PI] = Th;\n s[PI + 1] = Tl;\n }\n // Chi (χ)\n for (let y = 0; y < 50; y += 10) {\n for (let x = 0; x < 10; x++) B[x] = s[y + x];\n for (let x = 0; x < 10; x++) s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];\n }\n // Iota (ι)\n s[0] ^= SHA3_IOTA_H[round];\n s[1] ^= SHA3_IOTA_L[round];\n }\n clean(B);\n}\n\n/** Keccak sponge function. */\nexport class Keccak extends Hash<Keccak> implements HashXOF<Keccak> {\n protected state: Uint8Array;\n protected pos = 0;\n protected posOut = 0;\n protected finished = false;\n protected state32: Uint32Array;\n protected destroyed = false;\n\n public blockLen: number;\n public suffix: number;\n public outputLen: number;\n protected enableXOF = false;\n protected rounds: number;\n\n // NOTE: we accept arguments in bytes instead of bits here.\n constructor(\n blockLen: number,\n suffix: number,\n outputLen: number,\n enableXOF = false,\n rounds: number = 24\n ) {\n super();\n this.blockLen = blockLen;\n this.suffix = suffix;\n this.outputLen = outputLen;\n this.enableXOF = enableXOF;\n this.rounds = rounds;\n // Can be passed from user as dkLen\n anumber(outputLen);\n // 1600 = 5x5 matrix of 64bit. 1600 bits === 200 bytes\n // 0 < blockLen < 200\n if (!(0 < blockLen && blockLen < 200))\n throw new Error('only keccak-f1600 function is supported');\n this.state = new Uint8Array(200);\n this.state32 = u32(this.state);\n }\n clone(): Keccak {\n return this._cloneInto();\n }\n protected keccak(): void {\n swap32IfBE(this.state32);\n keccakP(this.state32, this.rounds);\n swap32IfBE(this.state32);\n this.posOut = 0;\n this.pos = 0;\n }\n update(data: Input): this {\n aexists(this);\n data = toBytes(data);\n abytes(data);\n const { blockLen, state } = this;\n const len = data.length;\n for (let pos = 0; pos < len; ) {\n const take = Math.min(blockLen - this.pos, len - pos);\n for (let i = 0; i < take; i++) state[this.pos++] ^= data[pos++];\n if (this.pos === blockLen) this.keccak();\n }\n return this;\n }\n protected finish(): void {\n if (this.finished) return;\n this.finished = true;\n const { state, suffix, pos, blockLen } = this;\n // Do the padding\n state[pos] ^= suffix;\n if ((suffix & 0x80) !== 0 && pos === blockLen - 1) this.keccak();\n state[blockLen - 1] ^= 0x80;\n this.keccak();\n }\n protected writeInto(out: Uint8Array): Uint8Array {\n aexists(this, false);\n abytes(out);\n this.finish();\n const bufferOut = this.state;\n const { blockLen } = this;\n for (let pos = 0, len = out.length; pos < len; ) {\n if (this.posOut >= blockLen) this.keccak();\n const take = Math.min(blockLen - this.posOut, len - pos);\n out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);\n this.posOut += take;\n pos += take;\n }\n return out;\n }\n xofInto(out: Uint8Array): Uint8Array {\n // Sha3/Keccak usage with XOF is probably mistake, only SHAKE instances can do XOF\n if (!this.enableXOF) throw new Error('XOF is not possible for this instance');\n return this.writeInto(out);\n }\n xof(bytes: number): Uint8Array {\n anumber(bytes);\n return this.xofInto(new Uint8Array(bytes));\n }\n digestInto(out: Uint8Array): Uint8Array {\n aoutput(out, this);\n if (this.finished) throw new Error('digest() was already called');\n this.writeInto(out);\n this.destroy();\n return out;\n }\n digest(): Uint8Array {\n return this.digestInto(new Uint8Array(this.outputLen));\n }\n destroy(): void {\n this.destroyed = true;\n clean(this.state);\n }\n _cloneInto(to?: Keccak): Keccak {\n const { blockLen, suffix, outputLen, rounds, enableXOF } = this;\n to ||= new Keccak(blockLen, suffix, outputLen, enableXOF, rounds);\n to.state32.set(this.state32);\n to.pos = this.pos;\n to.posOut = this.posOut;\n to.finished = this.finished;\n to.rounds = rounds;\n // Suffix can change in cSHAKE\n to.suffix = suffix;\n to.outputLen = outputLen;\n to.enableXOF = enableXOF;\n to.destroyed = this.destroyed;\n return to;\n }\n}\n\nconst gen = (suffix: number, blockLen: number, outputLen: number) =>\n createHasher(() => new Keccak(blockLen, suffix, outputLen));\n\n/** SHA3-224 hash function. */\nexport const sha3_224: CHash = /* @__PURE__ */ (() => gen(0x06, 144, 224 / 8))();\n/** SHA3-256 hash function. Different from keccak-256. */\nexport const sha3_256: CHash = /* @__PURE__ */ (() => gen(0x06, 136, 256 / 8))();\n/** SHA3-384 hash function. */\nexport const sha3_384: CHash = /* @__PURE__ */ (() => gen(0x06, 104, 384 / 8))();\n/** SHA3-512 hash function. */\nexport const sha3_512: CHash = /* @__PURE__ */ (() => gen(0x06, 72, 512 / 8))();\n\n/** keccak-224 hash function. */\nexport const keccak_224: CHash = /* @__PURE__ */ (() => gen(0x01, 144, 224 / 8))();\n/** keccak-256 hash function. Different from SHA3-256. */\nexport const keccak_256: CHash = /* @__PURE__ */ (() => gen(0x01, 136, 256 / 8))();\n/** keccak-384 hash function. */\nexport const keccak_384: CHash = /* @__PURE__ */ (() => gen(0x01, 104, 384 / 8))();\n/** keccak-512 hash function. */\nexport const keccak_512: CHash = /* @__PURE__ */ (() => gen(0x01, 72, 512 / 8))();\n\nexport type ShakeOpts = { dkLen?: number };\n\nconst genShake = (suffix: number, blockLen: number, outputLen: number) =>\n createXOFer<HashXOF<Keccak>, ShakeOpts>(\n (opts: ShakeOpts = {}) =>\n new Keccak(blockLen, suffix, opts.dkLen === undefined ? outputLen : opts.dkLen, true)\n );\n\n/** SHAKE128 XOF with 128-bit security. */\nexport const shake128: CHashXO = /* @__PURE__ */ (() => genShake(0x1f, 168, 128 / 8))();\n/** SHAKE256 XOF with 256-bit security. */\nexport const shake256: CHashXO = /* @__PURE__ */ (() => genShake(0x1f, 136, 256 / 8))();\n","import { keccak_256 } from '@noble/hashes/sha3'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type IsHexErrorType, isHex } from '../data/isHex.js'\nimport { type ToBytesErrorType, toBytes } from '../encoding/toBytes.js'\nimport { type ToHexErrorType, toHex } from '../encoding/toHex.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type Keccak256Hash<to extends To> =\n | (to extends 'bytes' ? ByteArray : never)\n | (to extends 'hex' ? Hex : never)\n\nexport type Keccak256ErrorType =\n | IsHexErrorType\n | ToBytesErrorType\n | ToHexErrorType\n | ErrorType\n\nexport function keccak256<to extends To = 'hex'>(\n value: Hex | ByteArray,\n to_?: to | undefined,\n): Keccak256Hash<to> {\n const to = to_ || 'hex'\n const bytes = keccak_256(\n isHex(value, { strict: false }) ? toBytes(value) : value,\n )\n if (to === 'bytes') return bytes as Keccak256Hash<to>\n return toHex(bytes) as Keccak256Hash<to>\n}\n","/**\n * Simple HTML Template Engine\n *\n * Supports:\n * - Variable interpolation: {{variable}}\n * - Conditional blocks: {{#if condition}}...{{/if}}\n * - Else blocks: {{#if condition}}...{{else}}...{{/if}}\n *\n * Future enhancements:\n * - {{#each}} loops\n * - {{#unless}} negative conditionals\n * - Nested conditionals\n * - Helper functions\n */\n\nexport interface TemplateData {\n [key: string]: string | boolean | number | null | undefined\n}\n\nexport class TemplateEngine {\n /**\n * Render template with data\n */\n static render(template: string, data: TemplateData): string {\n let html = template\n\n // Process conditional blocks first ({{#if}}...{{/if}})\n html = this.processConditionals(html, data)\n\n // Then process variable interpolation ({{variable}})\n html = this.processVariables(html, data)\n\n return html\n }\n\n /**\n * Process conditional blocks: {{#if condition}}...{{else}}...{{/if}}\n */\n private static processConditionals(html: string, data: TemplateData): string {\n // Match {{#if variable}}...{{else}}...{{/if}} or {{#if variable}}...{{/if}}\n const conditionalRegex = /\\{\\{#if\\s+(\\w+)\\}\\}([\\s\\S]*?)(?:\\{\\{else\\}\\}([\\s\\S]*?))?\\{\\{\\/if\\}\\}/g\n\n return html.replace(conditionalRegex, (match, variable, trueBlock, falseBlock) => {\n const value = data[variable]\n const condition = this.isTruthy(value)\n\n if (condition) {\n return trueBlock || ''\n } else {\n return falseBlock || ''\n }\n })\n }\n\n /**\n * Process variable interpolation: {{variable}}\n */\n private static processVariables(html: string, data: TemplateData): string {\n // Match {{variable}} but not {{#if}} or {{/if}} or {{else}}\n const variableRegex = /\\{\\{(?!#|\\/|else)(\\w+)\\}\\}/g\n\n return html.replace(variableRegex, (match, variable) => {\n const value = data[variable]\n return value !== null && value !== undefined ? String(value) : ''\n })\n }\n\n /**\n * Check if value is truthy (for conditionals)\n */\n private static isTruthy(value: unknown): boolean {\n if (value === null || value === undefined) return false\n if (typeof value === 'boolean') return value\n if (typeof value === 'number') return value !== 0\n if (typeof value === 'string') return value.length > 0\n return true\n }\n}\n\n/**\n * Template helper to escape HTML entities\n */\n// export function escapeHtml(text: string): string {\n// const map: Record<string, string> = {\n// '&': '&',\n// '<': '<',\n// '>': '>',\n// '\"': '"',\n// \"'\": '''\n// }\n// return text.replace(/[&<>\"']/g, (m) => map[m])\n// }\n\n/**\n * Template helper to sanitize HTML attributes\n */\n// export function sanitizeAttribute(value: string): string {\n// // Remove any script-like content\n// return value.replace(/javascript:/gi, '').replace(/on\\w+\\s*=/gi, '')\n// }\n","<div class=\"modal-overlay\">\n <div class=\"modal-content\" style=\"display: flex; flex-direction: column; gap: var(--iframe-gap); align-items: center\">\n <div style=\"display: flex; align-items: center; gap: var(--iframe-gap); justify-content: center\">\n <img\n src=\"./lumia-logo.svg\"\n alt=\"Lumia Passport\"\n style=\"width: 40px; height: 40px; border-radius: 20px; object-fit: cover\"\n />\n\n <span\n style=\"display: block; font-size: var(--iframe-h1-fz); font-weight: var(--iframe-heading-fw); line-height: 150%\"\n >Authorize</span\n >\n </div>\n\n <div style=\"display: flex; align-items: center; gap: var(--iframe-gap); justify-content: center\">\n {{#if displayLogo}}\n <img\n src=\"{{displayLogo}}\"\n alt=\"{{displayName}}\"\n style=\"width: 32px; height: 32px; border-radius: 16px; object-fit: cover\"\n />\n {{else}}\n <span style=\"font-size: 14px; font-weight: 600\">{{displayName}}</span>\n {{/if}}\n\n <span\n style=\"display: block; font-size: var(--iframe-h2-fz); font-weight: var(--iframe-heading-fw); line-height: 150%\"\n >{{displayName}}</span\n >\n </div>\n\n <div class=\"domain-info {{domainStatusClass}}\" style=\"font-size: 12px; text-align: center\">\n <span style=\"font-family: monospace\">{{domainStatusIcon}} {{domainStatusText}} {{origin}}</span>\n </div>\n\n <!-- Permissions box -->\n <details style=\"display: flex; flex-direction: column; width: 100%\">\n <summary\n style=\"\n cursor: pointer;\n text-align: center;\n list-style: none;\n padding: 0 var(--iframe-pd);\n user-select: none;\n font-size: 12px;\n line-height: 20px;\n \"\n >\n Show Permissions\n </summary>\n <div\n data-details-content=\"true\"\n style=\"\n width: 100%;\n padding: var(--iframe-gap);\n border-radius: var(--iframe-el-bdrs);\n background: var(--iframe-info);\n font-size: 10px;\n \"\n >\n <div style=\"margin-bottom: var(--iframe-gap)\">\n <strong>{{displayName}}</strong> by <span class=\"project-owner\">{{displayName}}</span> wants to access your\n <strong>Lumia Passport</strong> account\n </div>\n\n <div style=\"margin-bottom: var(--iframe-gap)\">\n <strong style=\"margin-bottom: var(--iframe-gap)\">Personal user data</strong>\n <ul style=\"list-style: none\">\n <li style=\"padding-left: var(--iframe-pd)\">Wallet address (read-only)</li>\n <li style=\"padding-left: var(--iframe-pd)\">Public transaction history (read-only)</li>\n </ul>\n </div>\n\n <div style=\"width: 100%\">\n <strong style=\"margin-bottom: var(--iframe-gap)\">Permissions</strong>\n <ul style=\"list-style: none\">\n <li style=\"padding-left: var(--iframe-pd)\">Request transaction signatures</li>\n <li style=\"padding-left: var(--iframe-pd)\">Initiate blockchain operations</li>\n </ul>\n </div>\n </div>\n </details>\n\n {{#if showSecurityWarning}}\n <div class=\"security-warning\">\n <strong>⚠️ Warning:</strong> This domain is not verified for {{displayName}}\n <div>Expected: {{expectedDomains}}</div>\n <div>Actual: {{origin}}</div>\n </div>\n {{else}}\n <span style=\"font-size: 10px; color: var(--iframe-text-secondary)\"\n >By continuing you allow the app to use these permissions.</span\n >\n {{/if}}\n\n <!-- Action buttons -->\n <div style=\"display: flex; gap: var(--iframe-gap); width: 100%; align-items: center\">\n <button class=\"cancel-btn\">Cancel</button>\n <button class=\"authorize-btn\" {{authorizeButtonState}}>Continue</button>\n </div>\n\n <!-- Footer notice -->\n <div\n style=\"\n color: var(--iframe-text-secondary);\n font-size: 10px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n align-items: center;\n text-align: center;\n \"\n >\n <span>Authorizing will redirect to <strong>{{origin}}</strong></span>\n <span>You can revoke access at any time in your Lumia Passport settings.</span>\n </div>\n </div>\n</div>\n","<div class=\"ready-indicator\">\n <div class=\"status-icon\">✓</div>\n <h2>Secure Wallet Ready</h2>\n <p>Lumia Passport is ready for secure operations</p>\n <div class=\"info\">\n <div class=\"info-row\">\n <strong>Origin:</strong>\n <span>{{origin}}</span>\n </div>\n <div class=\"info-row\">\n <strong>Status:</strong>\n <span class=\"status-active\">Active</span>\n </div>\n <div class=\"info-row\">\n <strong>Version:</strong>\n <span>{{iframeVersion}}</span>\n </div>\n <div class=\"info-row\">\n <strong>Documentation:</strong>\n <a\n href=\"https://docs.lumiapassport.com/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style=\"color: #667eea; text-decoration: none\"\n >docs.lumiapassport.com</a\n >\n </div>\n </div>\n</div>\n","/**\n * Template Loader\n *\n * Handles loading and caching of HTML templates.\n * In development, templates are loaded dynamically.\n * In production, templates should be bundled as strings.\n */\n\n// Import templates as raw strings (requires proper bundler configuration)\n// For tsup: .html files configured as 'text' loader in tsup.config.ts\nimport authorizationTemplate from './html/authorization.html'\nimport readyIndicatorTemplate from './html/ready-indicator.html'\n\nexport class TemplateLoader {\n private static templateCache: Map<string, string> = new Map()\n\n /** Get template by name */\n static getTemplate(name: string): string {\n // Check cache first\n if (this.templateCache.has(name)) {\n return this.templateCache.get(name)!\n }\n\n // Load from bundled templates\n const template = this.loadBundledTemplate(name)\n\n if (!template) {\n throw new Error(`Template not found: ${name}`)\n }\n\n // Cache for future use\n this.templateCache.set(name, template)\n return template\n }\n\n /** Load bundled template */\n private static loadBundledTemplate(name: string): string | null {\n switch (name) {\n case 'authorization':\n return authorizationTemplate\n\n case 'ready-indicator':\n return readyIndicatorTemplate\n\n default:\n return null\n }\n }\n\n // /** Pre-load all templates (optional optimization) */\n // static preloadTemplates(): void {\n // this.getTemplate('authorization')\n // console.log('[TemplateLoader] Pre-loaded all templates')\n // }\n\n // /** Clear template cache (useful for hot-reloading in development) */\n // static clearCache(): void {\n // this.templateCache.clear()\n // console.log('[TemplateLoader] Cleared template cache')\n // }\n}\n","/**\n * Type-safe template data for authorization modal\n */\n\nimport type { ProjectInfo } from '../../lib/types'\nimport type { TemplateData } from '../template-engine'\n\nexport interface AuthorizationTemplateData extends TemplateData {\n // Display information\n displayName: string\n displayLogo: string\n displayDescription: string\n\n // User information\n userAvatar: string\n userName: string\n\n // Domain verification\n origin: string\n domainStatusClass: string\n domainStatusIcon: string\n domainStatusText: string\n\n // Security warning\n showSecurityWarning: boolean\n expectedDomains: string\n\n // Button state\n authorizeButtonState: string\n}\n\n/**\n * Build template data from project info and metadata\n */\nexport function buildAuthorizationTemplateData(\n project: ProjectInfo,\n origin: string,\n metadata: { name?: string; logo?: string; description?: string } | null,\n userProfile?: { avatar?: string | null; displayName?: string | null }\n): AuthorizationTemplateData {\n const isVerifiedOrigin = project.domains.includes(origin)\n\n // Use metadata if available, fallback to project info\n const displayName = metadata?.name || project.name\n const displayLogo = metadata?.logo || project.logoUrl || ''\n const displayDescription = metadata?.description || ''\n\n // User avatar/logo for right side\n const userAvatar = userProfile?.avatar || ''\n const userName = userProfile?.displayName || 'Lumia Passport'\n\n return {\n // Display\n displayName,\n displayLogo,\n displayDescription,\n\n // User\n userAvatar,\n userName,\n\n // Domain\n origin,\n domainStatusClass: isVerifiedOrigin ? 'verified' : 'unverified',\n domainStatusIcon: isVerifiedOrigin ? '✓' : '⚠️',\n domainStatusText: isVerifiedOrigin ? 'Verified domain:' : 'Unverified domain:',\n\n // Security\n showSecurityWarning: !isVerifiedOrigin,\n expectedDomains: project.domains.join(', '),\n\n // Button\n authorizeButtonState: !isVerifiedOrigin ? 'disabled' : ''\n }\n}\n","import type { TemplateData } from '../template-engine'\n\ninterface MyTemplateData extends TemplateData {\n origin: string\n iframeVersion: string\n}\n\ninterface ReadyIndicatorParams {\n origin: string\n iframeVersion: string\n}\n\nexport function buildReadyIndicatorData(input: ReadyIndicatorParams): MyTemplateData {\n return {\n origin: input.origin,\n iframeVersion: input.iframeVersion\n }\n}\n","/**\n * Authorization Manager for iframe\n *\n * Manages user authorizations for different projects/applications\n * Implements the \"User Authorization Per Project\" security model\n */\n\nimport { buildAuthorizationTemplateData, TemplateEngine, TemplateLoader } from '../templates'\nimport type { ProjectInfo, UserAuthorization } from './types'\n\ninterface ProjectMetadata {\n id: string\n name: string\n description: string\n logo: string\n}\n\ninterface CachedMetadata {\n data: ProjectMetadata\n timestamp: number\n}\n\nexport class AuthorizationManager {\n private readonly STORAGE_KEY_PREFIX = 'auth'\n private readonly METADATA_API_URL = 'https://dashboard.lumiapassport.com/api/public/project'\n private readonly METADATA_CACHE_TTL = 3600000 // 1 hour in milliseconds\n private metadataCache: Map<string, CachedMetadata> = new Map()\n\n constructor() {\n console.log('[iframe][Auth] Initialized')\n }\n\n /**\n * Fetch project metadata from public API (with caching)\n */\n private async fetchProjectMetadata(projectId: string): Promise<ProjectMetadata | null> {\n // Check cache first\n const cached = this.metadataCache.get(projectId)\n const now = Date.now()\n\n if (cached && now - cached.timestamp < this.METADATA_CACHE_TTL) {\n console.log(`[iframe][Auth] Using cached metadata for project: ${cached.data.name}`)\n return cached.data\n }\n\n // Fetch from API\n try {\n const response = await fetch(`${this.METADATA_API_URL}/${projectId}/metadata`)\n\n if (!response.ok) {\n console.warn(`[iframe][Auth] Failed to fetch project metadata: ${response.status}`)\n return null\n }\n\n const metadata: ProjectMetadata = await response.json()\n console.log(`[iframe][Auth] Fetched metadata for project: ${metadata.name}`)\n\n // Cache the result\n this.metadataCache.set(projectId, {\n data: metadata,\n timestamp: now\n })\n\n return metadata\n } catch (error) {\n console.error('[iframe][Auth] Error fetching project metadata:', error)\n return null\n }\n }\n\n /**\n * Check if user has authorized a project\n */\n async checkAuthorization(userId: string, projectId: string): Promise<boolean> {\n const key = this.getAuthKey(userId, projectId)\n const authData = localStorage.getItem(key)\n\n if (!authData) {\n return false\n }\n\n try {\n const auth: UserAuthorization = JSON.parse(authData)\n\n // Check if authorization is still valid (not expired)\n // TODO: Add expiration logic if needed\n\n console.log(`[iframe][Auth] User ${userId} authorized for project ${projectId}`)\n return true\n } catch (error) {\n console.error('[iframe][Auth] Failed to parse authorization:', error)\n return false\n }\n }\n\n /**\n * Store user authorization for a project\n */\n async storeAuthorization(userId: string, projectId: string, origin: string): Promise<void> {\n const auth: UserAuthorization = {\n userId,\n projectId,\n authorizedAt: Date.now(),\n origin\n }\n\n const key = this.getAuthKey(userId, projectId)\n localStorage.setItem(key, JSON.stringify(auth))\n\n console.log(`[iframe][Auth] ✅ Stored authorization: ${userId} -> ${projectId}`)\n }\n\n /**\n * Revoke user authorization for a project\n */\n async revokeAuthorization(userId: string, projectId: string): Promise<void> {\n const key = this.getAuthKey(userId, projectId)\n localStorage.removeItem(key)\n\n console.log(`[iframe][Auth] ✅ Revoked authorization: ${userId} -> ${projectId}`)\n }\n\n /**\n * Get all authorizations for a user\n */\n async getUserAuthorizations(userId: string): Promise<UserAuthorization[]> {\n const authorizations: UserAuthorization[] = []\n const prefix = `${this.STORAGE_KEY_PREFIX}.${userId}.`\n\n // Iterate through localStorage keys\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i)\n if (key && key.startsWith(prefix)) {\n try {\n const authData = localStorage.getItem(key)\n if (authData) {\n const auth: UserAuthorization = JSON.parse(authData)\n authorizations.push(auth)\n }\n } catch (error) {\n console.error(`[iframe][Auth] Failed to parse auth for key ${key}:`, error)\n }\n }\n }\n\n return authorizations\n }\n\n /**\n * Request user authorization with consent screen\n */\n async requestAuthorization(\n project: ProjectInfo,\n origin: string,\n userProfile?: { avatar?: string | null; displayName?: string | null }\n ): Promise<boolean> {\n // Request parent to show iframe\n this.showIframe()\n\n // Fetch project metadata\n const metadata = await this.fetchProjectMetadata(project.id)\n\n return new Promise((resolve) => {\n const modal = this.createAuthorizationModal(project, origin, metadata, userProfile)\n\n const authorizeBtn = modal.querySelector('.authorize-btn') as HTMLButtonElement\n const cancelBtn = modal.querySelector('.cancel-btn') as HTMLButtonElement\n\n const cleanup = (result: boolean) => {\n console.log(`[iframe][Auth] Cleaning up modal, result: ${result}`)\n modal.remove()\n // Request parent to hide iframe\n this.hideIframe()\n console.log(`[iframe][Auth] Resolving with result: ${result}`)\n resolve(result)\n }\n\n authorizeBtn?.addEventListener('click', (e) => {\n console.log(`[iframe][Auth] Authorize button clicked, isTrusted: ${e.isTrusted}`)\n if (e.isTrusted) {\n console.log(`[iframe][Auth] User authorized project: ${project.id}`)\n cleanup(true)\n } else {\n console.warn(`[iframe][Auth] Untrusted click event ignored`)\n }\n })\n\n cancelBtn?.addEventListener('click', () => {\n console.log(`[iframe][Auth] Cancel button clicked`)\n console.log(`[iframe][Auth] User denied authorization for project: ${project.id}`)\n cleanup(false)\n })\n\n // Add modal to body\n document.body.appendChild(modal)\n })\n }\n\n /**\n * Show iframe (notify parent)\n */\n private showIframe(): void {\n if (window.parent !== window) {\n window.parent.postMessage({ type: 'LUMIA_PASSPORT_SHOW_IFRAME', timestamp: Date.now() }, '*')\n console.log('[iframe][Auth] Requested parent to show iframe')\n }\n }\n\n /**\n * Hide iframe (notify parent)\n */\n private hideIframe(): void {\n if (window.parent !== window) {\n window.parent.postMessage({ type: 'LUMIA_PASSPORT_HIDE_IFRAME', timestamp: Date.now() }, '*')\n console.log('[iframe][Auth] Requested parent to hide iframe')\n }\n }\n\n /**\n * Create authorization consent modal\n */\n private createAuthorizationModal(\n project: ProjectInfo,\n origin: string,\n metadata: ProjectMetadata | null,\n userProfile?: { avatar?: string | null; displayName?: string | null }\n ): HTMLElement {\n const modal = document.createElement('div')\n modal.className = 'authorization-modal'\n\n // Build template data\n const templateData = buildAuthorizationTemplateData(project, origin, metadata, userProfile)\n\n // Load and render template\n const template = TemplateLoader.getTemplate('authorization')\n const populatedHTML = TemplateEngine.render(template, templateData)\n\n // Set modal content\n modal.innerHTML = populatedHTML\n\n return modal\n }\n\n /**\n * Get storage key for authorization\n */\n private getAuthKey(userId: string, projectId: string): string {\n return `${this.STORAGE_KEY_PREFIX}.${userId}.${projectId}`\n }\n\n /**\n * Clear all authorizations for a user (for logout/cleanup)\n */\n async clearUserAuthorizations(userId: string): Promise<void> {\n const prefix = `${this.STORAGE_KEY_PREFIX}.${userId}.`\n const keysToRemove: string[] = []\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i)\n if (key && key.startsWith(prefix)) {\n keysToRemove.push(key)\n }\n }\n\n keysToRemove.forEach((key) => localStorage.removeItem(key))\n\n console.log(`[iframe][Auth] ✅ Cleared ${keysToRemove.length} authorizations for user ${userId}`)\n }\n\n /**\n * Get authorization statistics\n */\n getStats(): { total: number; byUser: Record<string, number> } {\n const stats: { total: number; byUser: Record<string, number> } = {\n total: 0,\n byUser: {}\n }\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i)\n if (key && key.startsWith(this.STORAGE_KEY_PREFIX)) {\n stats.total++\n\n // Extract user ID from key: \"auth.{userId}.{projectId}\"\n const parts = key.split('.')\n if (parts.length >= 2) {\n const userId = parts[1]\n stats.byUser[userId] = (stats.byUser[userId] || 0) + 1\n }\n }\n }\n\n return stats\n }\n}\n","/**\n * Token Refresh API Client for iframe\n *\n * Base class for making API calls with automatic token refresh on 401 errors\n */\n\n// Build-time injected variable (declared in globals.d.ts)\ndeclare const __LUMIA_TSS_URL__: string;\n\ninterface TokenRefreshResponse {\n accessToken: string;\n}\n\nexport class TokenRefreshApiClient {\n protected tssUrl: string;\n private pendingTokenRefresh: Promise<string> | null = null;\n\n constructor() {\n this.tssUrl = (typeof __LUMIA_TSS_URL__ !== 'undefined' && __LUMIA_TSS_URL__) || 'https://api.lumiapassport.com/tss';\n }\n\n /**\n * Make API call with automatic token refresh on 401\n */\n protected async apiCall(\n method: string,\n path: string,\n body?: any,\n projectId?: string,\n accessToken?: string\n ): Promise<any> {\n let url = `${this.tssUrl}${path}`;\n\n // Add projectId as query parameter\n if (projectId) {\n const separator = url.includes('?') ? '&' : '?';\n url = `${url}${separator}projectId=${encodeURIComponent(projectId)}`;\n }\n\n // Prepare headers\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add Authorization header if token is provided\n if (accessToken) {\n headers['Authorization'] = `Bearer ${accessToken}`;\n }\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n credentials: 'include', // Send cookies\n });\n\n // Handle 401 - Token expired\n if (response.status === 401 && accessToken) {\n console.log('[iframe][TokenRefresh] Got 401, checking if TOKEN_EXPIRED...');\n\n try {\n const errorData = await response.json();\n\n // Check if it's a TOKEN_EXPIRED error\n if (errorData.error_code === 'TOKEN_EXPIRED' || errorData.action === 'REFRESH_TOKEN') {\n console.log('[iframe][TokenRefresh] TOKEN_EXPIRED detected, requesting new token from parent...');\n\n // Request new token from parent\n const newToken = await this.requestNewTokenFromParent();\n\n if (newToken) {\n console.log('[iframe][TokenRefresh] ✅ Got new token, retrying request...');\n\n // Retry request with new token\n headers['Authorization'] = `Bearer ${newToken}`;\n const retryResponse = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n credentials: 'include',\n });\n\n if (!retryResponse.ok) {\n const retryErrorText = await retryResponse.text();\n throw new Error(`API call failed after token refresh (${retryResponse.status}): ${retryErrorText}`);\n }\n\n return await retryResponse.json();\n } else {\n throw new Error('Failed to refresh access token');\n }\n }\n } catch (parseError) {\n // If we can't parse the error response, treat it as a generic 401\n console.error('[iframe][TokenRefresh] Failed to parse 401 response:', parseError);\n }\n\n // If not TOKEN_EXPIRED or refresh failed, throw original error\n throw new Error(`API call failed (401): Authentication required`);\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`API call failed (${response.status}): ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n console.error(`[iframe][TokenRefresh] API call failed: ${method} ${path}`, error);\n throw error instanceof Error ? error : new Error('Unknown API error');\n }\n }\n\n /**\n * Request new access token from parent window\n */\n private async requestNewTokenFromParent(): Promise<string | null> {\n // If there's already a pending token refresh request, wait for it\n if (this.pendingTokenRefresh) {\n console.log('[iframe][TokenRefresh] Token refresh already in progress, waiting...');\n return this.pendingTokenRefresh;\n }\n\n // Create a new token refresh promise\n this.pendingTokenRefresh = new Promise<string>((resolve, reject) => {\n const messageId = `token_refresh_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error('Token refresh timeout'));\n }, 30000); // 30 second timeout\n\n const messageHandler = (event: MessageEvent) => {\n const message = event.data;\n\n // Check if this is the response to our token refresh request\n if (message && message.type === 'LUMIA_PASSPORT_TOKEN_REFRESHED' && message.messageId === messageId) {\n cleanup();\n\n if (message.accessToken) {\n console.log('[iframe][TokenRefresh] ✅ Received new token from parent');\n resolve(message.accessToken);\n } else if (message.error) {\n console.error('[iframe][TokenRefresh] ❌ Token refresh failed:', message.error);\n reject(new Error(message.error));\n } else {\n reject(new Error('Invalid token refresh response'));\n }\n }\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n window.removeEventListener('message', messageHandler);\n this.pendingTokenRefresh = null;\n };\n\n // Listen for response\n window.addEventListener('message', messageHandler);\n\n // Send token refresh request to parent\n if (window.parent && window.parent !== window) {\n window.parent.postMessage(\n {\n type: 'LUMIA_PASSPORT_REQUEST_NEW_TOKEN',\n messageId,\n timestamp: Date.now(),\n },\n '*' // Parent will validate origin\n );\n console.log('[iframe][TokenRefresh] 📤 Sent LUMIA_PASSPORT_REQUEST_NEW_TOKEN to parent');\n } else {\n cleanup();\n reject(new Error('No parent window available'));\n }\n });\n\n try {\n return await this.pendingTokenRefresh;\n } catch (error) {\n this.pendingTokenRefresh = null;\n console.error('[iframe][TokenRefresh] Token refresh failed:', error);\n return null;\n }\n }\n}\n","/**\n * Keyshare Backup Manager for iframe context\n *\n * Handles encrypted backup of MPC keyshares with support for:\n * - Server backup (ShareVault API)\n * - Cloud backup (Google Drive, etc.)\n * - Local file download\n *\n * All backups are encrypted with AES-256-GCM using either:\n * - Passkey-derived password (secure, requires device)\n * - Custom password (user-provided)\n */\n\nimport type {\n KeyshareBackupData,\n BackupStatus,\n BackupMethod,\n BackupRequest,\n BackupResult,\n} from './types';\nimport { TokenRefreshApiClient } from './token-refresh-client';\nimport { backupToServer } from './backup/server-backup';\nimport { backupToLocalFile } from './backup/local-backup';\nimport { backupToCloud, getCloudProviders } from './backup/cloud-backup';\n\nconst BACKUP_VERSION = '1.0';\n\n/**\n * Main Backup Manager class\n * Orchestrates backup operations across different methods\n */\n\nexport class BackupManager {\n private tokenClient: TokenRefreshApiClient;\n\n constructor() {\n this.tokenClient = new TokenRefreshApiClient();\n console.log('[iframe][BackupManager] Initialized');\n }\n\n /**\n * Get current keyshare data from iframe storage\n */\n private getCurrentKeyshareBackupData(userId: string): KeyshareBackupData | null {\n console.log('[iframe][BackupManager] Getting keyshare data for userId:', userId);\n\n try {\n const keyshareData = localStorage.getItem(`tss.${userId}.keyshare`);\n const sessionId = localStorage.getItem(`tss.${userId}.sessionId`);\n const ownerAddress = localStorage.getItem(`tss.${userId}.ownerAddress`);\n\n console.log('[iframe][BackupManager] localStorage keys check:', {\n hasKeyshare: !!keyshareData,\n hasSession: !!sessionId,\n hasOwner: !!ownerAddress,\n keyshareLength: keyshareData?.length,\n });\n\n if (!keyshareData || !sessionId || !ownerAddress) {\n console.warn('[iframe][BackupManager] Missing keyshare data - cannot create backup');\n return null;\n }\n\n console.log('[iframe][BackupManager] Successfully retrieved all keyshare data');\n\n return {\n userId,\n sessionId,\n keyshare: keyshareData,\n ownerAddress: ownerAddress as `0x${string}`,\n createdAt: Date.now(),\n version: BACKUP_VERSION,\n };\n } catch (error) {\n console.error('[iframe][BackupManager] Error getting keyshare data:', error);\n return null;\n }\n }\n\n /**\n * Get backup status for all methods\n */\n getBackupStatus(userId: string): BackupStatus {\n const statusData = localStorage.getItem(`lumia-passport.backup.status.${userId}`);\n\n if (statusData) {\n try {\n return JSON.parse(statusData);\n } catch (error) {\n console.error('[iframe][BackupManager] Failed to parse backup status:', error);\n }\n }\n\n return {\n server: { lastBackup: undefined, error: undefined },\n cloud: { lastBackup: undefined, error: undefined },\n local: { lastBackup: undefined, error: undefined },\n };\n }\n\n /**\n * Update backup status for a specific method\n */\n private updateBackupStatus(\n userId: string,\n method: BackupMethod,\n status: Partial<BackupStatus[BackupMethod]>\n ): void {\n const currentStatus = this.getBackupStatus(userId);\n currentStatus[method] = { ...currentStatus[method], ...status };\n\n localStorage.setItem(\n `lumia-passport.backup.status.${userId}`,\n JSON.stringify(currentStatus)\n );\n\n console.log(`[iframe][BackupManager] Updated ${method} backup status for ${userId}`);\n }\n\n\n /**\n * Create backup using specified method\n */\n async createBackup(\n userId: string,\n request: BackupRequest,\n accessToken?: string\n ): Promise<BackupResult> {\n console.log('[iframe][BackupManager] Create backup request:', request);\n\n const data = this.getCurrentKeyshareBackupData(userId);\n if (!data) {\n const error = 'No keyshare data found for backup';\n console.error('[iframe][BackupManager]', error);\n return {\n success: false,\n method: request.method,\n timestamp: Date.now(),\n error,\n };\n }\n\n try {\n switch (request.method) {\n case 'server':\n await backupToServer(data, this.tokenClient, request.password, accessToken);\n break;\n\n case 'local':\n await backupToLocalFile(data, request.password);\n break;\n\n case 'cloud':\n await backupToCloud(data, request.cloudProvider, request.password);\n break;\n\n default:\n throw new Error(`Unknown backup method: ${request.method}`);\n }\n\n const timestamp = Date.now();\n this.updateBackupStatus(userId, request.method, {\n lastBackup: timestamp,\n error: undefined,\n });\n\n console.log(`[iframe][BackupManager] ✅ ${request.method} backup completed`);\n\n return {\n success: true,\n method: request.method,\n timestamp,\n };\n } catch (error: any) {\n const errorMessage = error.message || 'Backup failed';\n console.error('[iframe][BackupManager] Backup failed:', errorMessage);\n\n this.updateBackupStatus(userId, request.method, {\n error: errorMessage,\n });\n\n return {\n success: false,\n method: request.method,\n timestamp: Date.now(),\n error: errorMessage,\n };\n }\n }\n\n /**\n * Restore keyshare from server backup\n */\n async restoreFromServer(\n userId: string,\n password?: string,\n accessToken?: string\n ): Promise<KeyshareBackupData> {\n console.log('[iframe][BackupManager] Restore from server request for userId:', userId);\n\n try {\n const { restoreFromServer } = await import('./backup/server-backup');\n const backupData = await restoreFromServer(userId, this.tokenClient, password, accessToken);\n\n console.log('[iframe][BackupManager] ✅ Server restore completed');\n\n // Save keyshare to localStorage\n localStorage.setItem(`tss.${userId}.keyshare`, backupData.keyshare);\n localStorage.setItem(`tss.${userId}.sessionId`, backupData.sessionId);\n localStorage.setItem(`tss.${userId}.ownerAddress`, backupData.ownerAddress);\n\n console.log('[iframe][BackupManager] Keyshare saved to localStorage');\n\n return backupData;\n } catch (error: any) {\n const errorMessage = error.message || 'Restore failed';\n console.error('[iframe][BackupManager] Restore failed:', errorMessage);\n throw error;\n }\n }\n\n /**\n * Encrypt backup data without uploading (for cloud/local backups)\n * Returns encrypted data that parent can upload/download\n */\n async encryptBackupData(\n userId: string,\n password?: string\n ): Promise<any> {\n console.log('[iframe][BackupManager] Encrypting backup data for userId:', userId);\n\n const data = this.getCurrentKeyshareBackupData(userId);\n if (!data) {\n throw new Error('No keyshare data found for backup');\n }\n\n // Import encryption function\n const { encryptKeyshare, deriveBackupPasswordFromPasskey } = await import('./backup/crypto-utils');\n\n let encryptionPassword = password;\n let credentialId: string | undefined;\n\n if (!encryptionPassword) {\n // Use passkey-derived password\n const result = await deriveBackupPasswordFromPasskey(userId);\n encryptionPassword = result.password;\n credentialId = result.credentialId;\n }\n\n const encrypted = await encryptKeyshare(\n data,\n encryptionPassword,\n password ? 'password' : 'passkey',\n credentialId\n );\n\n console.log('[iframe][BackupManager] ✅ Backup data encrypted');\n\n // encryptKeyshare already includes all necessary fields\n return encrypted;\n }\n\n /**\n * Restore keyshare from local file backup\n */\n async restoreFromLocalFile(\n fileContent: string,\n userId: string,\n password?: string\n ): Promise<KeyshareBackupData> {\n console.log('[iframe][BackupManager] Restore from local file request for userId:', userId);\n\n try {\n const { restoreFromLocalFile } = await import('./backup/local-backup');\n const backupData = await restoreFromLocalFile(fileContent, userId, password);\n\n console.log('[iframe][BackupManager] ✅ Local file restore completed');\n\n // Save keyshare to localStorage\n localStorage.setItem(`tss.${userId}.keyshare`, backupData.keyshare);\n localStorage.setItem(`tss.${userId}.sessionId`, backupData.sessionId);\n localStorage.setItem(`tss.${userId}.ownerAddress`, backupData.ownerAddress);\n\n console.log('[iframe][BackupManager] Keyshare saved to localStorage');\n\n return backupData;\n } catch (error: any) {\n const errorMessage = error.message || 'Local file restore failed';\n console.error('[iframe][BackupManager] Local file restore failed:', errorMessage);\n throw error;\n }\n }\n\n /**\n * Get available cloud providers\n */\n getAvailableCloudProviders() {\n return getCloudProviders();\n }\n}\n","/**\n * Cloud backup operations (Google Drive, iCloud, etc.)\n */\n\nimport type { KeyshareBackupData } from '../types';\nimport { encryptKeyshare, deriveBackupPasswordFromPasskey } from './crypto-utils';\nimport { getAvailableCloudProviders } from './cloudStorage';\n\n/**\n * Backup keyshare to cloud provider\n * Currently only Google Drive is supported\n */\nexport async function backupToCloud(\n data: KeyshareBackupData,\n providerId?: string,\n password?: string\n): Promise<void> {\n // Determine encryption method and get password + credential ID\n const encryptionMethod: 'passkey' | 'password' = password ? 'password' : 'passkey';\n let backupPassword: string;\n let credentialId: string | undefined;\n\n if (password) {\n // Use provided password\n backupPassword = password;\n } else {\n // Use passkey-derived password and get the credential ID from the actual passkey used\n const result = await deriveBackupPasswordFromPasskey(data.userId).catch(() => {\n throw new Error('Backup requires either custom password or passkey authentication');\n });\n backupPassword = result.password;\n credentialId = result.credentialId;\n console.log('[backupToCloud] Using credential ID from passkey:', credentialId);\n }\n\n const encryptedBackup = await encryptKeyshare(data, backupPassword, encryptionMethod, credentialId);\n\n const timestamp = Date.now();\n const fileName = `lumia-keyshare-backup-${data.userId}-${timestamp}.json`;\n const fileContent = JSON.stringify(encryptedBackup, null, 2);\n\n const providers = getAvailableCloudProviders();\n\n if (providers.length === 0) {\n throw new Error(\n 'No cloud storage providers available in this environment'\n );\n }\n\n // Use specified provider or first available\n const provider = providerId ? providers.find(p => p.id === providerId) : providers[0];\n\n if (!provider) {\n throw new Error(\n providerId ?\n `Cloud provider '${providerId}' not available`\n : 'No cloud storage provider available'\n );\n }\n\n console.info(`[BACKUP] Using ${provider.name} for cloud backup`);\n\n // Authenticate if not already authenticated\n if (!provider.isAuthenticated()) {\n console.info(`[BACKUP] Authenticating with ${provider.name}`);\n const authenticated = await provider.authenticate();\n if (!authenticated) {\n throw new Error(`Failed to authenticate with ${provider.name}`);\n }\n }\n\n // Upload file to cloud storage\n console.info(`[BACKUP] Uploading backup to ${provider.name}`);\n const fileId = await provider.upload(fileName, fileContent, true);\n\n console.info(`[BACKUP] Successfully uploaded backup to ${provider.name}, file ID: ${fileId}`);\n}\n\n/**\n * Get list of available cloud providers\n */\nexport function getCloudProviders(): Array<{\n id: string;\n name: string;\n available: boolean;\n}> {\n const providers = getAvailableCloudProviders();\n\n return providers.map(p => ({\n id: p.id,\n name: p.name,\n available: p.isAvailable()\n }));\n}\n","// Cloud storage integrations for secure backup files\n// Supports Google Drive, and can be extended for other providers\n\nexport interface CloudStorageProvider {\n name: string;\n id: string;\n icon: string;\n isAvailable: () => boolean;\n authenticate: () => Promise<boolean>;\n upload: (fileName: string, content: string, usePrivateStorage?: boolean) => Promise<string>; // Returns file URL or ID\n isAuthenticated: () => boolean;\n signOut: () => Promise<void>;\n}\n\n// Google Drive integration using Google Identity Services + Google API Client Library\nexport class GoogleDriveProvider implements CloudStorageProvider {\n name = 'Google Drive';\n id = 'google-drive';\n icon = '📁'; // Can be replaced with proper icon\n\n private accessToken: string | null = null;\n private readonly CLIENT_ID = (typeof (window as any).__GOOGLE_DRIVE_CLIENT_ID__ !== 'undefined' &&\n (window as any).__GOOGLE_DRIVE_CLIENT_ID__) || '';\n private readonly DISCOVERY_DOC = 'https://www.googleapis.com/discovery/v1/apis/drive/v3/rest';\n private readonly SCOPES = 'https://www.googleapis.com/auth/drive.file https://www.googleapis.com/auth/drive.appdata';\n\n private gapiInitialized = false;\n private gisInitialized = false;\n\n constructor() {\n this.initializeAPIs();\n }\n\n private async initializeAPIs(): Promise<void> {\n // Load Google APIs\n if (!window.gapi) {\n await this.loadScript('https://apis.google.com/js/api.js');\n }\n\n if (!window.google?.accounts) {\n await this.loadScript('https://accounts.google.com/gsi/client');\n }\n\n // Initialize gapi\n if (!this.gapiInitialized) {\n await new Promise<void>(resolve => {\n window.gapi.load('client', resolve);\n });\n\n await window.gapi.client.init({\n discoveryDocs: [this.DISCOVERY_DOC],\n });\n\n this.gapiInitialized = true;\n console.log('[GoogleDrive] Google API client initialized');\n }\n\n // Initialize Google Identity Services\n if (!this.gisInitialized) {\n this.gisInitialized = true;\n console.log('[GoogleDrive] Google Identity Services initialized');\n }\n }\n\n private loadScript(src: string): Promise<void> {\n return new Promise((resolve, reject) => {\n if (document.querySelector(`script[src=\"${src}\"]`)) {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.src = src;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(`Failed to load ${src}`));\n document.head.appendChild(script);\n });\n }\n\n isAvailable(): boolean {\n return !!this.CLIENT_ID && typeof window !== 'undefined';\n }\n\n async authenticate(): Promise<boolean> {\n if (!this.isAvailable()) {\n throw new Error(\n 'Google Drive integration is not available in this environment'\n );\n }\n\n await this.initializeAPIs();\n\n return new Promise((resolve, reject) => {\n try {\n const tokenClient = window.google.accounts.oauth2.initTokenClient({\n client_id: this.CLIENT_ID,\n scope: this.SCOPES,\n callback: (response: any) => {\n if (response.error) {\n console.error('[GoogleDrive] Authentication error:', response.error);\n reject(new Error(`Google Drive authentication failed: ${response.error}`));\n return;\n }\n\n this.accessToken = response.access_token;\n window.gapi.client.setToken({ access_token: this.accessToken });\n console.log('[GoogleDrive] Successfully authenticated');\n resolve(true);\n },\n });\n\n tokenClient.requestAccessToken({ prompt: 'consent' });\n } catch (error) {\n console.error('[GoogleDrive] Authentication initialization failed:', error);\n reject(new Error(`Google Drive authentication setup failed: ${error}`));\n }\n });\n }\n\n isAuthenticated(): boolean {\n return !!this.accessToken;\n }\n\n async signOut(): Promise<void> {\n if (this.accessToken) {\n window.google?.accounts.oauth2.revoke(this.accessToken);\n this.accessToken = null;\n window.gapi?.client.setToken(null);\n console.log('[GoogleDrive] Signed out successfully');\n }\n }\n\n async upload(fileName: string, content: string, usePrivateStorage: boolean = true): Promise<string> {\n if (!this.isAuthenticated()) {\n throw new Error('Not authenticated with Google Drive');\n }\n\n await this.initializeAPIs();\n\n if (usePrivateStorage) {\n // Try appDataFolder first (private, hidden)\n try {\n const fileId = await this.uploadToAppDataFolder(fileName, content);\n console.log('[GoogleDrive] File uploaded to appDataFolder successfully:', fileId);\n return fileId;\n } catch (error) {\n console.warn('[GoogleDrive] AppDataFolder upload failed, trying fallback to regular folder:', error);\n // Fallback to visible folder if appDataFolder fails\n const fileId = await this.uploadToAppFolder(fileName, content);\n console.log('[GoogleDrive] File uploaded to app folder successfully:', fileId);\n return fileId;\n }\n } else {\n // Upload to \"Lumia Backups\" folder (visible in Drive)\n try {\n const fileId = await this.uploadToAppFolder(fileName, content);\n console.log('[GoogleDrive] File uploaded to app folder successfully:', fileId);\n return fileId;\n } catch (error) {\n console.error('[GoogleDrive] Upload failed:', error);\n throw new Error(\n `Failed to upload to Google Drive: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n }\n\n private async uploadToAppDataFolder(fileName: string, content: string): Promise<string> {\n const metadata = {\n name: fileName,\n parents: ['appDataFolder'], // Store in app-specific folder for privacy\n };\n\n return this.performUpload(metadata, content);\n }\n\n private async uploadToAppFolder(fileName: string, content: string): Promise<string> {\n // First, find or create \"Lumia Backups\" folder\n const folderName = 'Lumia Passport Backups';\n const folderId = await this.findOrCreateFolder(folderName);\n\n const metadata = {\n name: fileName,\n parents: [folderId],\n };\n\n return this.performUpload(metadata, content);\n }\n\n private async findOrCreateFolder(folderName: string): Promise<string> {\n // Search for existing folder\n const searchResponse = await fetch(\n `https://www.googleapis.com/drive/v3/files?q=name='${folderName}' and mimeType='application/vnd.google-apps.folder' and trashed=false`,\n {\n headers: { Authorization: `Bearer ${this.accessToken}` },\n credentials: 'include'\n }\n );\n\n if (!searchResponse.ok) {\n throw new Error(`Failed to search for folder: ${searchResponse.status}`);\n }\n\n const searchResult = await searchResponse.json();\n\n if (searchResult.files && searchResult.files.length > 0) {\n return searchResult.files[0].id; // Return existing folder ID\n }\n\n // Create new folder\n const createResponse = await fetch('https://www.googleapis.com/drive/v3/files', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.accessToken}`,\n 'Content-Type': 'application/json',\n },\n credentials: 'include',\n body: JSON.stringify({\n name: folderName,\n mimeType: 'application/vnd.google-apps.folder',\n }),\n });\n\n if (!createResponse.ok) {\n throw new Error(`Failed to create folder: ${createResponse.status}`);\n }\n\n const createResult = await createResponse.json();\n console.log(`[GoogleDrive] Created folder '${folderName}':`, createResult.id);\n return createResult.id;\n }\n\n private async performUpload(metadata: any, content: string): Promise<string> {\n const form = new FormData();\n form.append('metadata', new Blob([JSON.stringify(metadata)], { type: 'application/json' }));\n form.append('file', new Blob([content], { type: 'application/json' }));\n\n const response = await fetch(\n 'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart',\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.accessToken}`,\n },\n credentials: 'include',\n body: form,\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Google Drive upload failed: ${response.status} ${response.statusText} - ${errorText}`\n );\n }\n\n const result = await response.json();\n return result.id; // Return file ID\n }\n}\n\n// Factory function to get available cloud storage providers\nexport function getAvailableCloudProviders(): CloudStorageProvider[] {\n const providers: CloudStorageProvider[] = [];\n\n // Google Drive\n const googleDrive = new GoogleDriveProvider();\n if (googleDrive.isAvailable()) {\n providers.push(googleDrive);\n }\n\n // Future: Add more providers (Dropbox, OneDrive, etc.)\n\n return providers;\n}\n\n// Type definitions for global APIs\ndeclare global {\n interface Window {\n gapi: any;\n google: any;\n }\n}\n","let wasm;\n\nfunction addToExternrefTable0(obj) {\n const idx = wasm.__externref_table_alloc();\n wasm.__wbindgen_export_2.set(idx, obj);\n return idx;\n}\n\nfunction handleError(f, args) {\n try {\n return f.apply(this, args);\n } catch (e) {\n const idx = addToExternrefTable0(e);\n wasm.__wbindgen_exn_store(idx);\n }\n}\n\nconst cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } );\n\nif (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); };\n\nlet cachedUint8ArrayMemory0 = null;\n\nfunction getUint8ArrayMemory0() {\n if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8ArrayMemory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nfunction isLikeNone(x) {\n return x === undefined || x === null;\n}\n\nfunction debugString(val) {\n // primitive types\n const type = typeof val;\n if (type == 'number' || type == 'boolean' || val == null) {\n return `${val}`;\n }\n if (type == 'string') {\n return `\"${val}\"`;\n }\n if (type == 'symbol') {\n const description = val.description;\n if (description == null) {\n return 'Symbol';\n } else {\n return `Symbol(${description})`;\n }\n }\n if (type == 'function') {\n const name = val.name;\n if (typeof name == 'string' && name.length > 0) {\n return `Function(${name})`;\n } else {\n return 'Function';\n }\n }\n // objects\n if (Array.isArray(val)) {\n const length = val.length;\n let debug = '[';\n if (length > 0) {\n debug += debugString(val[0]);\n }\n for(let i = 1; i < length; i++) {\n debug += ', ' + debugString(val[i]);\n }\n debug += ']';\n return debug;\n }\n // Test for built-in\n const builtInMatches = /\\[object ([^\\]]+)\\]/.exec(toString.call(val));\n let className;\n if (builtInMatches && builtInMatches.length > 1) {\n className = builtInMatches[1];\n } else {\n // Failed to match the standard '[object ClassName]'\n return toString.call(val);\n }\n if (className == 'Object') {\n // we're a user defined class or Object\n // JSON.stringify avoids problems with cycles, and is generally much\n // easier than looping through ownProperties of `val`.\n try {\n return 'Object(' + JSON.stringify(val) + ')';\n } catch (_) {\n return 'Object';\n }\n }\n // errors\n if (val instanceof Error) {\n return `${val.name}: ${val.message}\\n${val.stack}`;\n }\n // TODO we could test for more things here, like `Set`s and `Map`s.\n return className;\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nconst cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } );\n\nconst encodeString = (typeof cachedTextEncoder.encodeInto === 'function'\n ? function (arg, view) {\n return cachedTextEncoder.encodeInto(arg, view);\n}\n : function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n});\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length, 1) >>> 0;\n getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len, 1) >>> 0;\n\n const mem = getUint8ArrayMemory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;\n const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);\n const ret = encodeString(arg, view);\n\n offset += ret.written;\n ptr = realloc(ptr, len, offset, 1) >>> 0;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nlet cachedDataViewMemory0 = null;\n\nfunction getDataViewMemory0() {\n if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) {\n cachedDataViewMemory0 = new DataView(wasm.memory.buffer);\n }\n return cachedDataViewMemory0;\n}\n\nexport function init_panic_hook() {\n wasm.init_panic_hook();\n}\n\n/**\n * Diagnostic function for checking WASM limits\n * @returns {any}\n */\nexport function wasm_memory_info() {\n const ret = wasm.wasm_memory_info();\n return ret;\n}\n\n/**\n * Test function for checking string/data size limits\n * @param {number} size_kb\n * @returns {any}\n */\nexport function test_large_data_limits(size_kb) {\n const ret = wasm.test_large_data_limits(size_kb);\n return ret;\n}\n\n/**\n * Start local side of DKG and return:\n * - serialized local state (for subsequent rounds),\n * - first \"output\" (message) to peer as Msg.\n * @param {number} party_id\n * @param {number} t\n * @param {number} n\n * @param {string} domain_label\n * @returns {any}\n */\nexport function dkg_start(party_id, t, n, domain_label) {\n const ptr0 = passStringToWasm0(domain_label, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dkg_start(party_id, t, n, ptr0, len0);\n return ret;\n}\n\n/**\n * Process incoming message from peer and generate response/final.\n * Return updated state and either new Msg or DKG final.\n * @param {string} state_blob_json\n * @param {string} peer_msg_json\n * @returns {any}\n */\nexport function dkg_handle(state_blob_json, peer_msg_json) {\n const ptr0 = passStringToWasm0(state_blob_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(peer_msg_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.dkg_handle(ptr0, len0, ptr1, len1);\n return ret;\n}\n\n/**\n * @param {string} keyshare_b64\n * @param {string} digest32_b64\n * @param {string} _chain_path\n * @returns {any}\n */\nexport function sign_start(keyshare_b64, digest32_b64, _chain_path) {\n const ptr0 = passStringToWasm0(keyshare_b64, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(digest32_b64, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ptr2 = passStringToWasm0(_chain_path, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len2 = WASM_VECTOR_LEN;\n const ret = wasm.sign_start(ptr0, len0, ptr1, len1, ptr2, len2);\n return ret;\n}\n\n/**\n * Process signing round: return next Msg or ready signature.\n * @param {string} state_blob_json\n * @param {string} peer_msg_json\n * @returns {any}\n */\nexport function sign_handle(state_blob_json, peer_msg_json) {\n const ptr0 = passStringToWasm0(state_blob_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(peer_msg_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.sign_handle(ptr0, len0, ptr1, len1);\n return ret;\n}\n\n/**\n * Auxiliary function for getting EVM address (keccak(pubkey)[12..])\n * @param {string} pk_b64\n * @returns {string}\n */\nexport function evm_address_from_sec1_pubkey_uncompressed(pk_b64) {\n let deferred2_0;\n let deferred2_1;\n try {\n const ptr0 = passStringToWasm0(pk_b64, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.evm_address_from_sec1_pubkey_uncompressed(ptr0, len0);\n deferred2_0 = ret[0];\n deferred2_1 = ret[1];\n return getStringFromWasm0(ret[0], ret[1]);\n } finally {\n wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);\n }\n}\n\nasync function __wbg_load(module, imports) {\n if (typeof Response === 'function' && module instanceof Response) {\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n return await WebAssembly.instantiateStreaming(module, imports);\n\n } catch (e) {\n if (module.headers.get('Content-Type') != 'application/wasm') {\n console.warn(\"`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n\", e);\n\n } else {\n throw e;\n }\n }\n }\n\n const bytes = await module.arrayBuffer();\n return await WebAssembly.instantiate(bytes, imports);\n\n } else {\n const instance = await WebAssembly.instantiate(module, imports);\n\n if (instance instanceof WebAssembly.Instance) {\n return { instance, module };\n\n } else {\n return instance;\n }\n }\n}\n\nfunction __wbg_get_imports() {\n const imports = {};\n imports.wbg = {};\n imports.wbg.__wbg_buffer_609cc3eee51ed158 = function(arg0) {\n const ret = arg0.buffer;\n return ret;\n };\n imports.wbg.__wbg_call_672a4d21634d4a24 = function() { return handleError(function (arg0, arg1) {\n const ret = arg0.call(arg1);\n return ret;\n }, arguments) };\n imports.wbg.__wbg_call_7cccdd69e0791ae2 = function() { return handleError(function (arg0, arg1, arg2) {\n const ret = arg0.call(arg1, arg2);\n return ret;\n }, arguments) };\n imports.wbg.__wbg_crypto_574e78ad8b13b65f = function(arg0) {\n const ret = arg0.crypto;\n return ret;\n };\n imports.wbg.__wbg_getRandomValues_b8f5dbd5f3995a9e = function() { return handleError(function (arg0, arg1) {\n arg0.getRandomValues(arg1);\n }, arguments) };\n imports.wbg.__wbg_msCrypto_a61aeb35a24c1329 = function(arg0) {\n const ret = arg0.msCrypto;\n return ret;\n };\n imports.wbg.__wbg_new_405e22f390576ce2 = function() {\n const ret = new Object();\n return ret;\n };\n imports.wbg.__wbg_new_5e0be73521bc8c17 = function() {\n const ret = new Map();\n return ret;\n };\n imports.wbg.__wbg_new_78feb108b6472713 = function() {\n const ret = new Array();\n return ret;\n };\n imports.wbg.__wbg_new_a12002a7f91c75be = function(arg0) {\n const ret = new Uint8Array(arg0);\n return ret;\n };\n imports.wbg.__wbg_newnoargs_105ed471475aaf50 = function(arg0, arg1) {\n const ret = new Function(getStringFromWasm0(arg0, arg1));\n return ret;\n };\n imports.wbg.__wbg_newwithbyteoffsetandlength_d97e637ebe145a9a = function(arg0, arg1, arg2) {\n const ret = new Uint8Array(arg0, arg1 >>> 0, arg2 >>> 0);\n return ret;\n };\n imports.wbg.__wbg_newwithlength_a381634e90c276d4 = function(arg0) {\n const ret = new Uint8Array(arg0 >>> 0);\n return ret;\n };\n imports.wbg.__wbg_node_905d3e251edff8a2 = function(arg0) {\n const ret = arg0.node;\n return ret;\n };\n imports.wbg.__wbg_process_dc0fbacc7c1c06f7 = function(arg0) {\n const ret = arg0.process;\n return ret;\n };\n imports.wbg.__wbg_randomFillSync_ac0988aba3254290 = function() { return handleError(function (arg0, arg1) {\n arg0.randomFillSync(arg1);\n }, arguments) };\n imports.wbg.__wbg_require_60cc747a6bc5215a = function() { return handleError(function () {\n const ret = module.require;\n return ret;\n }, arguments) };\n imports.wbg.__wbg_set_37837023f3d740e8 = function(arg0, arg1, arg2) {\n arg0[arg1 >>> 0] = arg2;\n };\n imports.wbg.__wbg_set_3fda3bac07393de4 = function(arg0, arg1, arg2) {\n arg0[arg1] = arg2;\n };\n imports.wbg.__wbg_set_65595bdd868b3009 = function(arg0, arg1, arg2) {\n arg0.set(arg1, arg2 >>> 0);\n };\n imports.wbg.__wbg_set_8fc6bf8a5b1071d1 = function(arg0, arg1, arg2) {\n const ret = arg0.set(arg1, arg2);\n return ret;\n };\n imports.wbg.__wbg_static_accessor_GLOBAL_88a902d13a557d07 = function() {\n const ret = typeof global === 'undefined' ? null : global;\n return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);\n };\n imports.wbg.__wbg_static_accessor_GLOBAL_THIS_56578be7e9f832b0 = function() {\n const ret = typeof globalThis === 'undefined' ? null : globalThis;\n return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);\n };\n imports.wbg.__wbg_static_accessor_SELF_37c5d418e4bf5819 = function() {\n const ret = typeof self === 'undefined' ? null : self;\n return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);\n };\n imports.wbg.__wbg_static_accessor_WINDOW_5de37043a91a9c40 = function() {\n const ret = typeof window === 'undefined' ? null : window;\n return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);\n };\n imports.wbg.__wbg_subarray_aa9065fa9dc5df96 = function(arg0, arg1, arg2) {\n const ret = arg0.subarray(arg1 >>> 0, arg2 >>> 0);\n return ret;\n };\n imports.wbg.__wbg_versions_c01dfd4722a88165 = function(arg0) {\n const ret = arg0.versions;\n return ret;\n };\n imports.wbg.__wbindgen_bigint_from_i64 = function(arg0) {\n const ret = arg0;\n return ret;\n };\n imports.wbg.__wbindgen_bigint_from_u64 = function(arg0) {\n const ret = BigInt.asUintN(64, arg0);\n return ret;\n };\n imports.wbg.__wbindgen_debug_string = function(arg0, arg1) {\n const ret = debugString(arg1);\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n };\n imports.wbg.__wbindgen_error_new = function(arg0, arg1) {\n const ret = new Error(getStringFromWasm0(arg0, arg1));\n return ret;\n };\n imports.wbg.__wbindgen_init_externref_table = function() {\n const table = wasm.__wbindgen_export_2;\n const offset = table.grow(4);\n table.set(0, undefined);\n table.set(offset + 0, undefined);\n table.set(offset + 1, null);\n table.set(offset + 2, true);\n table.set(offset + 3, false);\n ;\n };\n imports.wbg.__wbindgen_is_function = function(arg0) {\n const ret = typeof(arg0) === 'function';\n return ret;\n };\n imports.wbg.__wbindgen_is_object = function(arg0) {\n const val = arg0;\n const ret = typeof(val) === 'object' && val !== null;\n return ret;\n };\n imports.wbg.__wbindgen_is_string = function(arg0) {\n const ret = typeof(arg0) === 'string';\n return ret;\n };\n imports.wbg.__wbindgen_is_undefined = function(arg0) {\n const ret = arg0 === undefined;\n return ret;\n };\n imports.wbg.__wbindgen_memory = function() {\n const ret = wasm.memory;\n return ret;\n };\n imports.wbg.__wbindgen_number_new = function(arg0) {\n const ret = arg0;\n return ret;\n };\n imports.wbg.__wbindgen_string_new = function(arg0, arg1) {\n const ret = getStringFromWasm0(arg0, arg1);\n return ret;\n };\n imports.wbg.__wbindgen_throw = function(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n };\n\n return imports;\n}\n\nfunction __wbg_init_memory(imports, memory) {\n\n}\n\nfunction __wbg_finalize_init(instance, module) {\n wasm = instance.exports;\n __wbg_init.__wbindgen_wasm_module = module;\n cachedDataViewMemory0 = null;\n cachedUint8ArrayMemory0 = null;\n\n\n wasm.__wbindgen_start();\n return wasm;\n}\n\nfunction initSync(module) {\n if (wasm !== undefined) return wasm;\n\n\n if (typeof module !== 'undefined') {\n if (Object.getPrototypeOf(module) === Object.prototype) {\n ({module} = module)\n } else {\n console.warn('using deprecated parameters for `initSync()`; pass a single object instead')\n }\n }\n\n const imports = __wbg_get_imports();\n\n __wbg_init_memory(imports);\n\n if (!(module instanceof WebAssembly.Module)) {\n module = new WebAssembly.Module(module);\n }\n\n const instance = new WebAssembly.Instance(module, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nasync function __wbg_init(module_or_path) {\n if (wasm !== undefined) return wasm;\n\n\n if (typeof module_or_path !== 'undefined') {\n if (Object.getPrototypeOf(module_or_path) === Object.prototype) {\n ({module_or_path} = module_or_path)\n } else {\n console.warn('using deprecated parameters for the initialization function; pass a single object instead')\n }\n }\n\n if (typeof module_or_path === 'undefined') {\n module_or_path = new URL('dkls23_wasm_bg.wasm', import.meta.url);\n }\n const imports = __wbg_get_imports();\n\n if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {\n module_or_path = fetch(module_or_path);\n }\n\n __wbg_init_memory(imports);\n\n const { instance, module } = await __wbg_load(await module_or_path, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nexport { initSync };\nexport default __wbg_init;\n","// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport {\n type Abi,\n type AbiEvent,\n type AbiFunction,\n type AbiParameter,\n type AbiParameterKind,\n type AbiParameterToPrimitiveType,\n type AbiStateMutability,\n type Address,\n CircularReferenceError,\n InvalidAbiItemError,\n InvalidAbiParameterError,\n InvalidAbiParametersError,\n InvalidAbiTypeParameterError,\n InvalidFunctionModifierError,\n InvalidModifierError,\n InvalidParameterError,\n InvalidParenthesisError,\n InvalidSignatureError,\n InvalidStructSignatureError,\n type Narrow,\n type ParseAbi,\n type ParseAbiItem,\n type ParseAbiParameter,\n type ParseAbiParameters,\n parseAbi,\n parseAbiItem,\n parseAbiParameter,\n parseAbiParameters,\n SolidityProtectedKeywordError,\n type TypedData,\n type TypedDataDomain,\n type TypedDataParameter,\n UnknownSignatureError,\n UnknownTypeError,\n} from 'abitype'\nexport type {\n BlockOverrides,\n Rpc as RpcBlockOverrides,\n} from 'ox/BlockOverrides'\nexport type {\n RpcEstimateUserOperationGasReturnType,\n RpcGetUserOperationByHashReturnType,\n RpcUserOperation,\n RpcUserOperationReceipt,\n RpcUserOperationRequest,\n} from './account-abstraction/types/rpc.js'\nexport type {\n Account,\n AccountSource,\n CustomSource,\n HDAccount,\n HDOptions,\n JsonRpcAccount,\n LocalAccount,\n PrivateKeyAccount,\n} from './accounts/types.js'\nexport type {\n GetEnsAddressErrorType,\n GetEnsAddressParameters,\n GetEnsAddressReturnType,\n} from './actions/ens/getEnsAddress.js'\nexport type {\n GetEnsAvatarErrorType,\n GetEnsAvatarParameters,\n GetEnsAvatarReturnType,\n} from './actions/ens/getEnsAvatar.js'\nexport type {\n GetEnsNameErrorType,\n GetEnsNameParameters,\n GetEnsNameReturnType,\n} from './actions/ens/getEnsName.js'\nexport type {\n GetEnsResolverErrorType,\n GetEnsResolverParameters,\n GetEnsResolverReturnType,\n} from './actions/ens/getEnsResolver.js'\nexport type {\n GetEnsTextErrorType,\n GetEnsTextParameters,\n GetEnsTextReturnType,\n} from './actions/ens/getEnsText.js'\nexport {\n type GetContractErrorType,\n type GetContractParameters,\n type GetContractReturnType,\n getContract,\n} from './actions/getContract.js'\nexport type {\n CallErrorType,\n CallParameters,\n CallReturnType,\n} from './actions/public/call.js'\nexport type {\n CreateAccessListErrorType,\n CreateAccessListParameters,\n CreateAccessListReturnType,\n} from './actions/public/createAccessList.js'\nexport type {\n CreateBlockFilterErrorType,\n CreateBlockFilterReturnType,\n} from './actions/public/createBlockFilter.js'\nexport type {\n CreateContractEventFilterErrorType,\n CreateContractEventFilterParameters,\n CreateContractEventFilterReturnType,\n} from './actions/public/createContractEventFilter.js'\nexport type {\n CreateEventFilterErrorType,\n CreateEventFilterParameters,\n CreateEventFilterReturnType,\n} from './actions/public/createEventFilter.js'\nexport type {\n CreatePendingTransactionFilterErrorType,\n CreatePendingTransactionFilterReturnType,\n} from './actions/public/createPendingTransactionFilter.js'\nexport type {\n EstimateContractGasErrorType,\n EstimateContractGasParameters,\n EstimateContractGasReturnType,\n} from './actions/public/estimateContractGas.js'\nexport type {\n EstimateFeesPerGasErrorType,\n EstimateFeesPerGasParameters,\n EstimateFeesPerGasReturnType,\n} from './actions/public/estimateFeesPerGas.js'\nexport type {\n EstimateGasErrorType,\n EstimateGasParameters,\n EstimateGasReturnType,\n} from './actions/public/estimateGas.js'\nexport type {\n EstimateMaxPriorityFeePerGasErrorType,\n EstimateMaxPriorityFeePerGasParameters,\n EstimateMaxPriorityFeePerGasReturnType,\n} from './actions/public/estimateMaxPriorityFeePerGas.js'\nexport type {\n GetBalanceErrorType,\n GetBalanceParameters,\n GetBalanceReturnType,\n} from './actions/public/getBalance.js'\nexport type {\n GetBlobBaseFeeErrorType,\n GetBlobBaseFeeReturnType,\n} from './actions/public/getBlobBaseFee.js'\nexport type {\n GetBlockErrorType,\n GetBlockParameters,\n GetBlockReturnType,\n} from './actions/public/getBlock.js'\nexport type {\n GetBlockNumberErrorType,\n GetBlockNumberParameters,\n GetBlockNumberReturnType,\n} from './actions/public/getBlockNumber.js'\nexport type {\n GetBlockTransactionCountErrorType,\n GetBlockTransactionCountParameters,\n GetBlockTransactionCountReturnType,\n} from './actions/public/getBlockTransactionCount.js'\nexport type {\n GetChainIdErrorType,\n GetChainIdReturnType,\n} from './actions/public/getChainId.js'\nexport type {\n /** @deprecated Use `GetCodeErrorType` instead */\n GetCodeErrorType as GetBytecodeErrorType,\n GetCodeErrorType,\n /** @deprecated Use `GetCodeParameters` instead */\n GetCodeParameters as GetBytecodeParameters,\n GetCodeParameters,\n /** @deprecated Use `GetCodeReturnType` instead */\n GetCodeReturnType as GetBytecodeReturnType,\n GetCodeReturnType,\n} from './actions/public/getCode.js'\nexport type {\n GetContractEventsErrorType,\n GetContractEventsParameters,\n GetContractEventsReturnType,\n} from './actions/public/getContractEvents.js'\nexport type {\n GetEip712DomainErrorType,\n GetEip712DomainParameters,\n GetEip712DomainReturnType,\n} from './actions/public/getEip712Domain.js'\nexport type {\n GetFeeHistoryErrorType,\n GetFeeHistoryParameters,\n GetFeeHistoryReturnType,\n} from './actions/public/getFeeHistory.js'\nexport type {\n GetFilterChangesErrorType,\n GetFilterChangesParameters,\n GetFilterChangesReturnType,\n} from './actions/public/getFilterChanges.js'\nexport type {\n GetFilterLogsErrorType,\n GetFilterLogsParameters,\n GetFilterLogsReturnType,\n} from './actions/public/getFilterLogs.js'\nexport type {\n GetGasPriceErrorType,\n GetGasPriceReturnType,\n} from './actions/public/getGasPrice.js'\nexport type {\n GetLogsErrorType,\n GetLogsParameters,\n GetLogsReturnType,\n} from './actions/public/getLogs.js'\nexport type {\n GetProofErrorType,\n GetProofParameters,\n GetProofReturnType,\n} from './actions/public/getProof.js'\nexport type {\n GetStorageAtErrorType,\n GetStorageAtParameters,\n GetStorageAtReturnType,\n} from './actions/public/getStorageAt.js'\nexport type {\n GetTransactionErrorType,\n GetTransactionParameters,\n GetTransactionReturnType,\n} from './actions/public/getTransaction.js'\nexport type {\n GetTransactionConfirmationsErrorType,\n GetTransactionConfirmationsParameters,\n GetTransactionConfirmationsReturnType,\n} from './actions/public/getTransactionConfirmations.js'\nexport type {\n GetTransactionCountErrorType,\n GetTransactionCountParameters,\n GetTransactionCountReturnType,\n} from './actions/public/getTransactionCount.js'\nexport type {\n GetTransactionReceiptErrorType,\n GetTransactionReceiptParameters,\n GetTransactionReceiptReturnType,\n} from './actions/public/getTransactionReceipt.js'\nexport type {\n MulticallErrorType,\n MulticallParameters,\n MulticallReturnType,\n} from './actions/public/multicall.js'\nexport type {\n ReadContractErrorType,\n ReadContractParameters,\n ReadContractReturnType,\n} from './actions/public/readContract.js'\nexport type {\n SimulateBlocksErrorType,\n SimulateBlocksParameters,\n SimulateBlocksReturnType,\n} from './actions/public/simulateBlocks.js'\nexport type {\n SimulateCallsErrorType,\n SimulateCallsParameters,\n SimulateCallsReturnType,\n} from './actions/public/simulateCalls.js'\nexport type {\n GetMutabilityAwareValue,\n SimulateContractErrorType,\n SimulateContractParameters,\n SimulateContractReturnType,\n} from './actions/public/simulateContract.js'\nexport type {\n UninstallFilterErrorType,\n UninstallFilterParameters,\n UninstallFilterReturnType,\n} from './actions/public/uninstallFilter.js'\nexport type {\n VerifyHashErrorType as VerifyHashActionErrorType,\n VerifyHashParameters as VerifyHashActionParameters,\n VerifyHashReturnType as VerifyHashActionReturnType,\n} from './actions/public/verifyHash.js'\nexport type {\n VerifyMessageErrorType as VerifyMessageActionErrorType,\n VerifyMessageParameters as VerifyMessageActionParameters,\n VerifyMessageReturnType as VerifyMessageActionReturnType,\n} from './actions/public/verifyMessage.js'\nexport type {\n VerifyTypedDataErrorType as VerifyTypedDataActionErrorType,\n VerifyTypedDataParameters as VerifyTypedDataActionParameters,\n VerifyTypedDataReturnType as VerifyTypedDataActionReturnType,\n} from './actions/public/verifyTypedData.js'\nexport type {\n ReplacementReason,\n ReplacementReturnType,\n WaitForTransactionReceiptErrorType,\n WaitForTransactionReceiptParameters,\n WaitForTransactionReceiptReturnType,\n} from './actions/public/waitForTransactionReceipt.js'\nexport type {\n OnBlockNumberFn,\n OnBlockNumberParameter,\n WatchBlockNumberErrorType,\n WatchBlockNumberParameters,\n WatchBlockNumberReturnType,\n} from './actions/public/watchBlockNumber.js'\nexport type {\n OnBlock,\n OnBlockParameter,\n WatchBlocksErrorType,\n WatchBlocksParameters,\n WatchBlocksReturnType,\n} from './actions/public/watchBlocks.js'\nexport type {\n WatchContractEventErrorType,\n WatchContractEventOnLogsFn,\n WatchContractEventOnLogsParameter,\n WatchContractEventParameters,\n WatchContractEventReturnType,\n} from './actions/public/watchContractEvent.js'\nexport type {\n WatchEventErrorType,\n WatchEventOnLogsFn,\n WatchEventOnLogsParameter,\n WatchEventParameters,\n WatchEventReturnType,\n} from './actions/public/watchEvent.js'\nexport type {\n OnTransactionsFn,\n OnTransactionsParameter,\n WatchPendingTransactionsErrorType,\n WatchPendingTransactionsParameters,\n WatchPendingTransactionsReturnType,\n} from './actions/public/watchPendingTransactions.js'\nexport type {\n DropTransactionErrorType,\n DropTransactionParameters,\n} from './actions/test/dropTransaction.js'\nexport type {\n DumpStateErrorType,\n DumpStateReturnType,\n} from './actions/test/dumpState.js'\nexport type {\n GetAutomineErrorType,\n GetAutomineReturnType,\n} from './actions/test/getAutomine.js'\nexport type {\n GetTxpoolContentErrorType,\n GetTxpoolContentReturnType,\n} from './actions/test/getTxpoolContent.js'\nexport type {\n GetTxpoolStatusErrorType,\n GetTxpoolStatusReturnType,\n} from './actions/test/getTxpoolStatus.js'\nexport type {\n ImpersonateAccountErrorType,\n ImpersonateAccountParameters,\n} from './actions/test/impersonateAccount.js'\nexport type {\n IncreaseTimeErrorType,\n IncreaseTimeParameters,\n} from './actions/test/increaseTime.js'\nexport type {\n InspectTxpoolErrorType,\n InspectTxpoolReturnType,\n} from './actions/test/inspectTxpool.js'\nexport type {\n LoadStateErrorType,\n LoadStateParameters,\n LoadStateReturnType,\n} from './actions/test/loadState.js'\nexport type { MineErrorType, MineParameters } from './actions/test/mine.js'\nexport type { RemoveBlockTimestampIntervalErrorType } from './actions/test/removeBlockTimestampInterval.js'\nexport type { ResetErrorType, ResetParameters } from './actions/test/reset.js'\nexport type {\n RevertErrorType,\n RevertParameters,\n} from './actions/test/revert.js'\nexport type {\n SendUnsignedTransactionErrorType,\n SendUnsignedTransactionParameters,\n SendUnsignedTransactionReturnType,\n} from './actions/test/sendUnsignedTransaction.js'\nexport type { SetAutomineErrorType } from './actions/test/setAutomine.js'\nexport type {\n SetBalanceErrorType,\n SetBalanceParameters,\n} from './actions/test/setBalance.js'\nexport type {\n SetBlockGasLimitErrorType,\n SetBlockGasLimitParameters,\n} from './actions/test/setBlockGasLimit.js'\nexport type {\n SetBlockTimestampIntervalErrorType,\n SetBlockTimestampIntervalParameters,\n} from './actions/test/setBlockTimestampInterval.js'\nexport type {\n SetCodeErrorType,\n SetCodeParameters,\n} from './actions/test/setCode.js'\nexport type {\n SetCoinbaseErrorType,\n SetCoinbaseParameters,\n} from './actions/test/setCoinbase.js'\nexport type {\n SetIntervalMiningErrorType,\n SetIntervalMiningParameters,\n} from './actions/test/setIntervalMining.js'\nexport type { SetLoggingEnabledErrorType } from './actions/test/setLoggingEnabled.js'\nexport type {\n SetMinGasPriceErrorType,\n SetMinGasPriceParameters,\n} from './actions/test/setMinGasPrice.js'\nexport type {\n SetNextBlockBaseFeePerGasErrorType,\n SetNextBlockBaseFeePerGasParameters,\n} from './actions/test/setNextBlockBaseFeePerGas.js'\nexport type {\n SetNextBlockTimestampErrorType,\n SetNextBlockTimestampParameters,\n} from './actions/test/setNextBlockTimestamp.js'\nexport type {\n SetNonceErrorType,\n SetNonceParameters,\n} from './actions/test/setNonce.js'\nexport type { SetRpcUrlErrorType } from './actions/test/setRpcUrl.js'\nexport type {\n SetStorageAtErrorType,\n SetStorageAtParameters,\n} from './actions/test/setStorageAt.js'\nexport type { SnapshotErrorType } from './actions/test/snapshot.js'\nexport type {\n StopImpersonatingAccountErrorType,\n StopImpersonatingAccountParameters,\n} from './actions/test/stopImpersonatingAccount.js'\nexport type {\n AddChainErrorType,\n AddChainParameters,\n} from './actions/wallet/addChain.js'\nexport type {\n DeployContractErrorType,\n DeployContractParameters,\n DeployContractReturnType,\n} from './actions/wallet/deployContract.js'\nexport type {\n GetAddressesErrorType,\n GetAddressesReturnType,\n} from './actions/wallet/getAddresses.js'\nexport type {\n GetCallsStatusErrorType,\n GetCallsStatusParameters,\n GetCallsStatusReturnType,\n} from './actions/wallet/getCallsStatus.js'\nexport type {\n GetCapabilitiesErrorType,\n GetCapabilitiesParameters,\n GetCapabilitiesReturnType,\n} from './actions/wallet/getCapabilities.js'\nexport type {\n GetPermissionsErrorType,\n GetPermissionsReturnType,\n} from './actions/wallet/getPermissions.js'\nexport type {\n PrepareAuthorizationErrorType,\n PrepareAuthorizationParameters,\n PrepareAuthorizationReturnType,\n} from './actions/wallet/prepareAuthorization.js'\nexport type {\n PrepareTransactionRequestErrorType,\n PrepareTransactionRequestParameters,\n PrepareTransactionRequestParameterType,\n PrepareTransactionRequestRequest,\n PrepareTransactionRequestReturnType,\n} from './actions/wallet/prepareTransactionRequest.js'\nexport type {\n RequestAddressesErrorType,\n RequestAddressesReturnType,\n} from './actions/wallet/requestAddresses.js'\nexport type {\n RequestPermissionsErrorType,\n RequestPermissionsParameters,\n RequestPermissionsReturnType,\n} from './actions/wallet/requestPermissions.js'\nexport type {\n SendCallsErrorType,\n SendCallsParameters,\n SendCallsReturnType,\n} from './actions/wallet/sendCalls.js'\nexport type {\n SendCallsSyncErrorType,\n SendCallsSyncParameters,\n SendCallsSyncReturnType,\n} from './actions/wallet/sendCallsSync.js'\nexport type {\n SendRawTransactionErrorType,\n SendRawTransactionParameters,\n SendRawTransactionReturnType,\n} from './actions/wallet/sendRawTransaction.js'\nexport type {\n SendRawTransactionSyncErrorType,\n SendRawTransactionSyncParameters,\n SendRawTransactionSyncReturnType,\n} from './actions/wallet/sendRawTransactionSync.js'\nexport type {\n SendTransactionErrorType,\n SendTransactionParameters,\n SendTransactionRequest,\n SendTransactionReturnType,\n} from './actions/wallet/sendTransaction.js'\nexport type {\n SendTransactionSyncErrorType,\n SendTransactionSyncParameters,\n SendTransactionSyncRequest,\n SendTransactionSyncReturnType,\n} from './actions/wallet/sendTransactionSync.js'\nexport type {\n ShowCallsStatusErrorType,\n ShowCallsStatusParameters,\n ShowCallsStatusReturnType,\n} from './actions/wallet/showCallsStatus.js'\nexport type {\n SignAuthorizationErrorType,\n SignAuthorizationParameters,\n SignAuthorizationReturnType,\n} from './actions/wallet/signAuthorization.js'\nexport type {\n SignMessageErrorType,\n SignMessageParameters,\n SignMessageReturnType,\n} from './actions/wallet/signMessage.js'\nexport type {\n SignTransactionErrorType,\n SignTransactionParameters,\n SignTransactionReturnType,\n} from './actions/wallet/signTransaction.js'\nexport type {\n SignTypedDataErrorType,\n SignTypedDataParameters,\n SignTypedDataReturnType,\n} from './actions/wallet/signTypedData.js'\nexport type {\n SwitchChainErrorType,\n SwitchChainParameters,\n} from './actions/wallet/switchChain.js'\nexport type {\n WaitForCallsStatusErrorType,\n WaitForCallsStatusParameters,\n WaitForCallsStatusReturnType,\n WaitForCallsStatusTimeoutErrorType,\n} from './actions/wallet/waitForCallsStatus.js'\nexport { WaitForCallsStatusTimeoutError } from './actions/wallet/waitForCallsStatus.js'\nexport type {\n WatchAssetErrorType,\n WatchAssetParameters,\n WatchAssetReturnType,\n} from './actions/wallet/watchAsset.js'\nexport type {\n WriteContractErrorType,\n WriteContractParameters,\n WriteContractReturnType,\n} from './actions/wallet/writeContract.js'\nexport type {\n WriteContractSyncErrorType,\n WriteContractSyncParameters,\n WriteContractSyncReturnType,\n} from './actions/wallet/writeContractSync.js'\nexport {\n type Client,\n type ClientConfig,\n type CreateClientErrorType,\n createClient,\n type MulticallBatchOptions,\n rpcSchema,\n} from './clients/createClient.js'\nexport {\n type CreatePublicClientErrorType,\n createPublicClient,\n type PublicClient,\n type PublicClientConfig,\n} from './clients/createPublicClient.js'\nexport {\n type CreateTestClientErrorType,\n createTestClient,\n type TestClient,\n type TestClientConfig,\n} from './clients/createTestClient.js'\nexport {\n type CreateWalletClientErrorType,\n createWalletClient,\n type WalletClient,\n type WalletClientConfig,\n} from './clients/createWalletClient.js'\nexport {\n type PublicActions,\n publicActions,\n} from './clients/decorators/public.js'\nexport {\n type TestActions,\n testActions,\n} from './clients/decorators/test.js'\nexport {\n type WalletActions,\n walletActions,\n} from './clients/decorators/wallet.js'\nexport {\n type CreateTransportErrorType,\n createTransport,\n type Transport,\n type TransportConfig,\n} from './clients/transports/createTransport.js'\nexport {\n type CustomTransport,\n type CustomTransportConfig,\n type CustomTransportErrorType,\n custom,\n} from './clients/transports/custom.js'\nexport {\n type FallbackTransport,\n type FallbackTransportConfig,\n type FallbackTransportErrorType,\n fallback,\n shouldThrow,\n} from './clients/transports/fallback.js'\nexport {\n type HttpTransport,\n type HttpTransportConfig,\n type HttpTransportErrorType,\n http,\n} from './clients/transports/http.js'\nexport {\n type WebSocketTransport,\n type WebSocketTransportConfig,\n type WebSocketTransportErrorType,\n webSocket,\n} from './clients/transports/webSocket.js'\nexport {\n erc20Abi,\n erc20Abi_bytes32,\n erc721Abi,\n erc1155Abi,\n erc4626Abi,\n erc6492SignatureValidatorAbi,\n /** @deprecated use `erc6492SignatureValidatorAbi` instead. */\n erc6492SignatureValidatorAbi as universalSignatureValidatorAbi,\n multicall3Abi,\n} from './constants/abis.js'\nexport { ethAddress, zeroAddress } from './constants/address.js'\nexport { zeroHash } from './constants/bytes.js'\nexport {\n deploylessCallViaBytecodeBytecode,\n deploylessCallViaFactoryBytecode,\n erc6492SignatureValidatorByteCode,\n /** @deprecated use `erc6492SignatureValidatorByteCode` instead. */\n erc6492SignatureValidatorByteCode as universalSignatureValidatorByteCode,\n} from './constants/contracts.js'\nexport {\n maxInt8,\n maxInt16,\n maxInt24,\n maxInt32,\n maxInt40,\n maxInt48,\n maxInt56,\n maxInt64,\n maxInt72,\n maxInt80,\n maxInt88,\n maxInt96,\n maxInt104,\n maxInt112,\n maxInt120,\n maxInt128,\n maxInt136,\n maxInt144,\n maxInt152,\n maxInt160,\n maxInt168,\n maxInt176,\n maxInt184,\n maxInt192,\n maxInt200,\n maxInt208,\n maxInt216,\n maxInt224,\n maxInt232,\n maxInt240,\n maxInt248,\n maxInt256,\n maxUint8,\n maxUint16,\n maxUint24,\n maxUint32,\n maxUint40,\n maxUint48,\n maxUint56,\n maxUint64,\n maxUint72,\n maxUint80,\n maxUint88,\n maxUint96,\n maxUint104,\n maxUint112,\n maxUint120,\n maxUint128,\n maxUint136,\n maxUint144,\n maxUint152,\n maxUint160,\n maxUint168,\n maxUint176,\n maxUint184,\n maxUint192,\n maxUint200,\n maxUint208,\n maxUint216,\n maxUint224,\n maxUint232,\n maxUint240,\n maxUint248,\n maxUint256,\n minInt8,\n minInt16,\n minInt24,\n minInt32,\n minInt40,\n minInt48,\n minInt56,\n minInt64,\n minInt72,\n minInt80,\n minInt88,\n minInt96,\n minInt104,\n minInt112,\n minInt120,\n minInt128,\n minInt136,\n minInt144,\n minInt152,\n minInt160,\n minInt168,\n minInt176,\n minInt184,\n minInt192,\n minInt200,\n minInt208,\n minInt216,\n minInt224,\n minInt232,\n minInt240,\n minInt248,\n minInt256,\n} from './constants/number.js'\nexport { presignMessagePrefix } from './constants/strings.js'\nexport { etherUnits, gweiUnits, weiUnits } from './constants/unit.js'\nexport {\n AbiConstructorNotFoundError,\n type AbiConstructorNotFoundErrorType,\n AbiConstructorParamsNotFoundError,\n type AbiConstructorParamsNotFoundErrorType,\n AbiDecodingDataSizeInvalidError,\n type AbiDecodingDataSizeInvalidErrorType,\n AbiDecodingDataSizeTooSmallError,\n type AbiDecodingDataSizeTooSmallErrorType,\n AbiDecodingZeroDataError,\n type AbiDecodingZeroDataErrorType,\n AbiEncodingArrayLengthMismatchError,\n type AbiEncodingArrayLengthMismatchErrorType,\n AbiEncodingBytesSizeMismatchError,\n type AbiEncodingBytesSizeMismatchErrorType,\n AbiEncodingLengthMismatchError,\n type AbiEncodingLengthMismatchErrorType,\n AbiErrorInputsNotFoundError,\n type AbiErrorInputsNotFoundErrorType,\n AbiErrorNotFoundError,\n type AbiErrorNotFoundErrorType,\n AbiErrorSignatureNotFoundError,\n type AbiErrorSignatureNotFoundErrorType,\n AbiEventNotFoundError,\n type AbiEventNotFoundErrorType,\n AbiEventSignatureEmptyTopicsError,\n type AbiEventSignatureEmptyTopicsErrorType,\n AbiEventSignatureNotFoundError,\n type AbiEventSignatureNotFoundErrorType,\n AbiFunctionNotFoundError,\n type AbiFunctionNotFoundErrorType,\n AbiFunctionOutputsNotFoundError,\n type AbiFunctionOutputsNotFoundErrorType,\n AbiFunctionSignatureNotFoundError,\n type AbiFunctionSignatureNotFoundErrorType,\n BytesSizeMismatchError,\n type BytesSizeMismatchErrorType,\n DecodeLogDataMismatch,\n type DecodeLogDataMismatchErrorType,\n DecodeLogTopicsMismatch,\n type DecodeLogTopicsMismatchErrorType,\n InvalidAbiDecodingTypeError,\n type InvalidAbiDecodingTypeErrorType,\n InvalidAbiEncodingTypeError,\n type InvalidAbiEncodingTypeErrorType,\n InvalidArrayError,\n type InvalidArrayErrorType,\n InvalidDefinitionTypeError,\n type InvalidDefinitionTypeErrorType,\n UnsupportedPackedAbiType,\n type UnsupportedPackedAbiTypeErrorType,\n} from './errors/abi.js'\nexport {\n InvalidAddressError,\n type InvalidAddressErrorType,\n} from './errors/address.js'\nexport { BaseError, type BaseErrorType, setErrorConfig } from './errors/base.js'\nexport {\n BlockNotFoundError,\n type BlockNotFoundErrorType,\n} from './errors/block.js'\nexport {\n BundleFailedError,\n type BundleFailedErrorType,\n} from './errors/calls.js'\nexport {\n ChainDoesNotSupportContract,\n type ChainDoesNotSupportContractErrorType,\n ChainMismatchError,\n type ChainMismatchErrorType,\n ChainNotFoundError,\n type ChainNotFoundErrorType,\n ClientChainNotConfiguredError,\n type ClientChainNotConfiguredErrorType,\n InvalidChainIdError,\n type InvalidChainIdErrorType,\n} from './errors/chain.js'\nexport {\n CallExecutionError,\n type CallExecutionErrorType,\n ContractFunctionExecutionError,\n type ContractFunctionExecutionErrorType,\n ContractFunctionRevertedError,\n type ContractFunctionRevertedErrorType,\n ContractFunctionZeroDataError,\n type ContractFunctionZeroDataErrorType,\n CounterfactualDeploymentFailedError,\n type CounterfactualDeploymentFailedErrorType,\n RawContractError,\n type RawContractErrorType,\n} from './errors/contract.js'\nexport {\n SizeExceedsPaddingSizeError,\n type SizeExceedsPaddingSizeErrorType,\n SliceOffsetOutOfBoundsError,\n type SliceOffsetOutOfBoundsErrorType,\n} from './errors/data.js'\nexport {\n IntegerOutOfRangeError,\n type IntegerOutOfRangeErrorType,\n InvalidBytesBooleanError,\n type InvalidBytesBooleanErrorType,\n InvalidHexBooleanError,\n type InvalidHexBooleanErrorType,\n InvalidHexValueError,\n type InvalidHexValueErrorType,\n SizeOverflowError,\n type SizeOverflowErrorType,\n} from './errors/encoding.js'\nexport {\n type EnsAvatarInvalidMetadataError,\n type EnsAvatarInvalidMetadataErrorType,\n EnsAvatarInvalidNftUriError,\n type EnsAvatarInvalidNftUriErrorType,\n EnsAvatarUnsupportedNamespaceError,\n type EnsAvatarUnsupportedNamespaceErrorType,\n EnsAvatarUriResolutionError,\n type EnsAvatarUriResolutionErrorType,\n EnsInvalidChainIdError,\n type EnsInvalidChainIdErrorType,\n} from './errors/ens.js'\nexport {\n EstimateGasExecutionError,\n type EstimateGasExecutionErrorType,\n} from './errors/estimateGas.js'\nexport {\n BaseFeeScalarError,\n type BaseFeeScalarErrorType,\n Eip1559FeesNotSupportedError,\n type Eip1559FeesNotSupportedErrorType,\n MaxFeePerGasTooLowError,\n type MaxFeePerGasTooLowErrorType,\n} from './errors/fee.js'\nexport {\n FilterTypeNotSupportedError,\n type FilterTypeNotSupportedErrorType,\n} from './errors/log.js'\nexport {\n ExecutionRevertedError,\n type ExecutionRevertedErrorType,\n FeeCapTooHighError,\n type FeeCapTooHighErrorType,\n FeeCapTooLowError,\n type FeeCapTooLowErrorType,\n InsufficientFundsError,\n type InsufficientFundsErrorType,\n IntrinsicGasTooHighError,\n type IntrinsicGasTooHighErrorType,\n IntrinsicGasTooLowError,\n type IntrinsicGasTooLowErrorType,\n NonceMaxValueError,\n type NonceMaxValueErrorType,\n NonceTooHighError,\n type NonceTooHighErrorType,\n NonceTooLowError,\n type NonceTooLowErrorType,\n TipAboveFeeCapError,\n type TipAboveFeeCapErrorType,\n TransactionTypeNotSupportedError,\n type TransactionTypeNotSupportedErrorType,\n UnknownNodeError,\n type UnknownNodeErrorType,\n} from './errors/node.js'\nexport {\n HttpRequestError,\n type HttpRequestErrorType,\n RpcRequestError,\n type RpcRequestErrorType,\n SocketClosedError,\n type SocketClosedErrorType,\n TimeoutError,\n type TimeoutErrorType,\n WebSocketRequestError,\n type WebSocketRequestErrorType,\n} from './errors/request.js'\nexport {\n AtomicityNotSupportedError,\n type AtomicityNotSupportedErrorType,\n AtomicReadyWalletRejectedUpgradeError,\n type AtomicReadyWalletRejectedUpgradeErrorType,\n BundleTooLargeError,\n type BundleTooLargeErrorType,\n ChainDisconnectedError,\n type ChainDisconnectedErrorType,\n DuplicateIdError,\n type DuplicateIdErrorType,\n InternalRpcError,\n type InternalRpcErrorType,\n InvalidInputRpcError,\n type InvalidInputRpcErrorType,\n InvalidParamsRpcError,\n type InvalidParamsRpcErrorType,\n InvalidRequestRpcError,\n type InvalidRequestRpcErrorType,\n JsonRpcVersionUnsupportedError,\n type JsonRpcVersionUnsupportedErrorType,\n LimitExceededRpcError,\n type LimitExceededRpcErrorType,\n MethodNotFoundRpcError,\n type MethodNotFoundRpcErrorType,\n MethodNotSupportedRpcError,\n type MethodNotSupportedRpcErrorType,\n ParseRpcError,\n type ParseRpcErrorType,\n ProviderDisconnectedError,\n type ProviderDisconnectedErrorType,\n ProviderRpcError,\n type ProviderRpcErrorCode,\n type ProviderRpcErrorType,\n ResourceNotFoundRpcError,\n type ResourceNotFoundRpcErrorType,\n ResourceUnavailableRpcError,\n type ResourceUnavailableRpcErrorType,\n RpcError,\n type RpcErrorCode,\n type RpcErrorType,\n SwitchChainError,\n TransactionRejectedRpcError,\n type TransactionRejectedRpcErrorType,\n UnauthorizedProviderError,\n type UnauthorizedProviderErrorType,\n UnknownBundleIdError,\n type UnknownBundleIdErrorType,\n UnknownRpcError,\n type UnknownRpcErrorType,\n UnsupportedChainIdError,\n type UnsupportedChainIdErrorType,\n UnsupportedNonOptionalCapabilityError,\n type UnsupportedNonOptionalCapabilityErrorType,\n UnsupportedProviderMethodError,\n type UnsupportedProviderMethodErrorType,\n UserRejectedRequestError,\n type UserRejectedRequestErrorType,\n} from './errors/rpc.js'\nexport {\n AccountStateConflictError,\n type AccountStateConflictErrorType,\n StateAssignmentConflictError,\n type StateAssignmentConflictErrorType,\n} from './errors/stateOverride.js'\nexport {\n FeeConflictError,\n type FeeConflictErrorType,\n InvalidLegacyVError,\n type InvalidLegacyVErrorType,\n InvalidSerializableTransactionError,\n type InvalidSerializableTransactionErrorType,\n InvalidSerializedTransactionError,\n type InvalidSerializedTransactionErrorType,\n InvalidSerializedTransactionTypeError,\n type InvalidSerializedTransactionTypeErrorType,\n InvalidStorageKeySizeError,\n type InvalidStorageKeySizeErrorType,\n TransactionExecutionError,\n type TransactionExecutionErrorType,\n TransactionNotFoundError,\n type TransactionNotFoundErrorType,\n TransactionReceiptNotFoundError,\n type TransactionReceiptNotFoundErrorType,\n WaitForTransactionReceiptTimeoutError,\n type WaitForTransactionReceiptTimeoutErrorType,\n} from './errors/transaction.js'\nexport {\n UrlRequiredError,\n type UrlRequiredErrorType,\n} from './errors/transport.js'\nexport {\n InvalidDomainError,\n type InvalidDomainErrorType,\n InvalidPrimaryTypeError,\n type InvalidPrimaryTypeErrorType,\n InvalidStructTypeError,\n type InvalidStructTypeErrorType,\n} from './errors/typedData.js'\nexport {\n InvalidDecimalNumberError,\n type InvalidDecimalNumberErrorType,\n} from './errors/unit.js'\nexport type {\n DeriveAccount,\n HDKey,\n ParseAccount,\n} from './types/account.js'\nexport type {\n Authorization,\n AuthorizationList,\n AuthorizationRequest,\n SerializedAuthorization,\n SerializedAuthorizationList,\n SignedAuthorization,\n SignedAuthorizationList,\n} from './types/authorization.js'\nexport type {\n Block,\n BlockIdentifier,\n BlockNumber,\n BlockTag,\n Uncle,\n} from './types/block.js'\nexport type { Call, Calls } from './types/calls.js'\nexport type {\n Capabilities,\n /** @deprecated Use `Capabilities` instead. */\n Capabilities as WalletCapabilities,\n CapabilitiesSchema,\n /** @deprecated Use `ChainIdToCapabilities` instead. */\n ChainIdToCapabilities as WalletCapabilitiesRecord,\n ChainIdToCapabilities,\n ExtractCapabilities,\n} from './types/capabilities.js'\nexport type {\n Chain,\n ChainConfig,\n ChainContract,\n ChainEstimateFeesPerGasFn,\n ChainEstimateFeesPerGasFnParameters,\n ChainFees,\n ChainFeesFnParameters,\n ChainFormatter,\n ChainFormatters,\n ChainMaxPriorityFeePerGasFn,\n ChainSerializers,\n DeriveChain,\n ExtractChainFormatterExclude,\n ExtractChainFormatterParameters,\n ExtractChainFormatterReturnType,\n GetChainParameter,\n} from './types/chain.js'\nexport type {\n AbiEventParametersToPrimitiveTypes,\n AbiEventParameterToPrimitiveType,\n AbiEventTopicToPrimitiveType,\n AbiItem,\n AbiItemArgs,\n AbiItemName,\n ContractConstructorArgs,\n ContractErrorArgs,\n ContractErrorName,\n ContractEventArgs,\n ContractEventArgsFromTopics,\n ContractEventName,\n ContractFunctionArgs,\n ContractFunctionName,\n ContractFunctionParameters,\n ContractFunctionReturnType,\n EventDefinition,\n ExtractAbiFunctionForArgs,\n ExtractAbiItem,\n ExtractAbiItemForArgs,\n ExtractAbiItemNames,\n GetEventArgs,\n GetValue,\n LogTopicType,\n MaybeAbiEventName,\n MaybeExtractEventArgsFromAbi,\n UnionWiden,\n Widen,\n} from './types/contract.js'\nexport type {\n AddEthereumChainParameter,\n BundlerRpcSchema,\n DebugBundlerRpcSchema,\n EIP1193EventMap,\n EIP1193Events,\n EIP1193Parameters,\n EIP1193Provider,\n EIP1193RequestFn,\n EIP1474Methods,\n NetworkSync,\n PaymasterRpcSchema,\n ProviderConnectInfo,\n ProviderMessage,\n ProviderRpcErrorType as EIP1193ProviderRpcErrorType,\n PublicRpcSchema,\n RpcSchema,\n RpcSchemaOverride,\n TestRpcSchema,\n WalletCallReceipt,\n WalletGetAssetsParameters,\n WalletGetAssetsReturnType,\n WalletGetCallsStatusReturnType,\n WalletGrantPermissionsParameters,\n WalletGrantPermissionsReturnType,\n WalletPermission,\n WalletPermissionCaveat,\n WalletRpcSchema,\n WalletSendCallsParameters,\n WalletSendCallsReturnType,\n WatchAssetParams,\n} from './types/eip1193.js'\nexport { ProviderRpcError as EIP1193ProviderRpcError } from './types/eip1193.js'\nexport type { BlobSidecar, BlobSidecars } from './types/eip4844.js'\nexport type { AssetGateway, AssetGatewayUrls } from './types/ens.js'\nexport type {\n FeeHistory,\n FeeValues,\n FeeValuesEIP1559,\n FeeValuesEIP4844,\n FeeValuesLegacy,\n FeeValuesType,\n} from './types/fee.js'\nexport type { Filter, FilterType } from './types/filter.js'\nexport type { GetTransactionRequestKzgParameter, Kzg } from './types/kzg.js'\nexport type { Log } from './types/log.js'\nexport type {\n ByteArray,\n CompactSignature,\n Hash,\n Hex,\n LogTopic,\n SignableMessage,\n Signature,\n} from './types/misc.js'\nexport type {\n MulticallContracts,\n MulticallResponse,\n MulticallResults,\n} from './types/multicall.js'\nexport type { Register, ResolvedRegister } from './types/register.js'\nexport type {\n Index,\n Quantity,\n RpcAccountStateOverride,\n RpcAuthorization,\n RpcAuthorizationList,\n RpcBlock,\n RpcBlockIdentifier,\n RpcBlockNumber,\n RpcFeeHistory,\n RpcFeeValues,\n RpcLog,\n RpcProof,\n RpcStateMapping,\n RpcStateOverride,\n RpcTransaction,\n RpcTransactionReceipt,\n RpcTransactionRequest,\n RpcUncle,\n Status,\n} from './types/rpc.js'\nexport type {\n StateMapping,\n StateOverride,\n} from './types/stateOverride.js'\nexport type {\n AccessList,\n Transaction,\n TransactionBase,\n TransactionEIP1559,\n TransactionEIP2930,\n TransactionEIP4844,\n TransactionEIP7702,\n TransactionLegacy,\n TransactionReceipt,\n TransactionRequest,\n TransactionRequestBase,\n TransactionRequestEIP1559,\n TransactionRequestEIP2930,\n TransactionRequestEIP4844,\n TransactionRequestEIP7702,\n TransactionRequestGeneric,\n TransactionRequestLegacy,\n TransactionSerializable,\n TransactionSerializableBase,\n TransactionSerializableEIP1559,\n TransactionSerializableEIP2930,\n TransactionSerializableEIP4844,\n TransactionSerializableEIP7702,\n TransactionSerializableGeneric,\n TransactionSerializableLegacy,\n TransactionSerialized,\n TransactionSerializedEIP1559,\n TransactionSerializedEIP2930,\n TransactionSerializedEIP4844,\n TransactionSerializedEIP7702,\n TransactionSerializedGeneric,\n TransactionSerializedLegacy,\n TransactionType,\n} from './types/transaction.js'\nexport type { GetPollOptions, GetTransportConfig } from './types/transport.js'\nexport type { TypedDataDefinition } from './types/typedData.js'\nexport type {\n Assign,\n Branded,\n Evaluate,\n ExactPartial,\n ExactRequired,\n IsNarrowable,\n IsNever,\n IsUndefined,\n IsUnion,\n LooseOmit,\n MaybePartial,\n MaybePromise,\n MaybeRequired,\n Mutable,\n NoInfer,\n NoUndefined,\n Omit,\n OneOf,\n Or,\n PartialBy,\n Prettify,\n RequiredBy,\n Some,\n UnionEvaluate,\n UnionLooseOmit,\n UnionOmit,\n UnionPartialBy,\n UnionPick,\n UnionRequiredBy,\n UnionToTuple,\n ValueOf,\n} from './types/utils.js'\nexport type { Withdrawal } from './types/withdrawal.js'\nexport {\n type DecodeAbiParametersErrorType,\n type DecodeAbiParametersReturnType,\n decodeAbiParameters,\n} from './utils/abi/decodeAbiParameters.js'\nexport {\n type DecodeDeployDataErrorType,\n type DecodeDeployDataParameters,\n type DecodeDeployDataReturnType,\n decodeDeployData,\n} from './utils/abi/decodeDeployData.js'\nexport {\n type DecodeErrorResultErrorType,\n type DecodeErrorResultParameters,\n type DecodeErrorResultReturnType,\n decodeErrorResult,\n} from './utils/abi/decodeErrorResult.js'\nexport {\n type DecodeEventLogErrorType,\n type DecodeEventLogParameters,\n type DecodeEventLogReturnType,\n decodeEventLog,\n} from './utils/abi/decodeEventLog.js'\nexport {\n type DecodeFunctionDataErrorType,\n type DecodeFunctionDataParameters,\n type DecodeFunctionDataReturnType,\n decodeFunctionData,\n} from './utils/abi/decodeFunctionData.js'\nexport {\n type DecodeFunctionResultErrorType,\n type DecodeFunctionResultParameters,\n type DecodeFunctionResultReturnType,\n decodeFunctionResult,\n} from './utils/abi/decodeFunctionResult.js'\nexport {\n type EncodeAbiParametersErrorType,\n type EncodeAbiParametersReturnType,\n encodeAbiParameters,\n} from './utils/abi/encodeAbiParameters.js'\nexport {\n type EncodeDeployDataErrorType,\n type EncodeDeployDataParameters,\n type EncodeDeployDataReturnType,\n encodeDeployData,\n} from './utils/abi/encodeDeployData.js'\nexport {\n type EncodeErrorResultErrorType,\n type EncodeErrorResultParameters,\n type EncodeErrorResultReturnType,\n encodeErrorResult,\n} from './utils/abi/encodeErrorResult.js'\nexport {\n type EncodeEventTopicsErrorType,\n type EncodeEventTopicsParameters,\n type EncodeEventTopicsReturnType,\n encodeEventTopics,\n} from './utils/abi/encodeEventTopics.js'\nexport {\n type EncodeFunctionDataErrorType,\n type EncodeFunctionDataParameters,\n type EncodeFunctionDataReturnType,\n encodeFunctionData,\n} from './utils/abi/encodeFunctionData.js'\nexport {\n type EncodeFunctionResultErrorType,\n type EncodeFunctionResultParameters,\n type EncodeFunctionResultReturnType,\n encodeFunctionResult,\n} from './utils/abi/encodeFunctionResult.js'\nexport {\n type EncodePackedErrorType,\n encodePacked,\n} from './utils/abi/encodePacked.js'\nexport {\n type GetAbiItemErrorType,\n type GetAbiItemParameters,\n type GetAbiItemReturnType,\n getAbiItem,\n} from './utils/abi/getAbiItem.js'\nexport {\n type ParseEventLogsErrorType,\n type ParseEventLogsParameters,\n type ParseEventLogsReturnType,\n parseEventLogs,\n} from './utils/abi/parseEventLogs.js'\nexport {\n type PrepareEncodeFunctionDataErrorType,\n type PrepareEncodeFunctionDataParameters,\n type PrepareEncodeFunctionDataReturnType,\n prepareEncodeFunctionData,\n} from './utils/abi/prepareEncodeFunctionData.js'\nexport {\n type ChecksumAddressErrorType,\n checksumAddress,\n type GetAddressErrorType,\n getAddress,\n} from './utils/address/getAddress.js'\nexport {\n type GetContractAddressOptions,\n type GetCreate2AddressErrorType,\n type GetCreate2AddressOptions,\n type GetCreateAddressErrorType,\n type GetCreateAddressOptions,\n getContractAddress,\n getCreate2Address,\n getCreateAddress,\n} from './utils/address/getContractAddress.js'\nexport {\n type IsAddressErrorType,\n type IsAddressOptions,\n isAddress,\n} from './utils/address/isAddress.js'\nexport {\n type IsAddressEqualErrorType,\n type IsAddressEqualReturnType,\n isAddressEqual,\n} from './utils/address/isAddressEqual.js'\nexport {\n type BlobsToCommitmentsErrorType,\n type BlobsToCommitmentsParameters,\n type BlobsToCommitmentsReturnType,\n blobsToCommitments,\n} from './utils/blob/blobsToCommitments.js'\nexport {\n blobsToProofs,\n type blobsToProofsErrorType,\n type blobsToProofsParameters,\n type blobsToProofsReturnType,\n} from './utils/blob/blobsToProofs.js'\nexport {\n type CommitmentsToVersionedHashesErrorType,\n type CommitmentsToVersionedHashesParameters,\n type CommitmentsToVersionedHashesReturnType,\n commitmentsToVersionedHashes,\n} from './utils/blob/commitmentsToVersionedHashes.js'\nexport {\n type CommitmentToVersionedHashErrorType,\n type CommitmentToVersionedHashParameters,\n type CommitmentToVersionedHashReturnType,\n commitmentToVersionedHash,\n} from './utils/blob/commitmentToVersionedHash.js'\nexport {\n type FromBlobsErrorType,\n type FromBlobsParameters,\n type FromBlobsReturnType,\n fromBlobs,\n} from './utils/blob/fromBlobs.js'\nexport {\n type SidecarsToVersionedHashesErrorType,\n type SidecarsToVersionedHashesParameters,\n type SidecarsToVersionedHashesReturnType,\n sidecarsToVersionedHashes,\n} from './utils/blob/sidecarsToVersionedHashes.js'\nexport {\n type ToBlobSidecarsErrorType,\n type ToBlobSidecarsParameters,\n type ToBlobSidecarsReturnType,\n toBlobSidecars,\n} from './utils/blob/toBlobSidecars.js'\nexport {\n type ToBlobsErrorType,\n type ToBlobsParameters,\n type ToBlobsReturnType,\n toBlobs,\n} from './utils/blob/toBlobs.js'\nexport {\n type CcipRequestErrorType,\n type CcipRequestParameters,\n ccipRequest,\n /** @deprecated Use `ccipRequest`. */\n ccipRequest as ccipFetch,\n type OffchainLookupErrorType,\n offchainLookup,\n offchainLookupAbiItem,\n offchainLookupSignature,\n} from './utils/ccip.js'\nexport {\n type AssertCurrentChainErrorType,\n type AssertCurrentChainParameters,\n assertCurrentChain,\n} from './utils/chain/assertCurrentChain.js'\nexport { defineChain } from './utils/chain/defineChain.js'\nexport {\n type ExtractChainErrorType,\n type ExtractChainParameters,\n type ExtractChainReturnType,\n extractChain,\n} from './utils/chain/extractChain.js'\nexport {\n type GetChainContractAddressErrorType,\n getChainContractAddress,\n} from './utils/chain/getChainContractAddress.js'\nexport {\n type ConcatBytesErrorType,\n type ConcatErrorType,\n type ConcatHexErrorType,\n type ConcatReturnType,\n concat,\n concatBytes,\n concatHex,\n} from './utils/data/concat.js'\nexport { type IsBytesErrorType, isBytes } from './utils/data/isBytes.js'\nexport { type IsHexErrorType, isHex } from './utils/data/isHex.js'\nexport {\n type PadBytesErrorType,\n type PadErrorType,\n type PadHexErrorType,\n type PadReturnType,\n pad,\n padBytes,\n padHex,\n} from './utils/data/pad.js'\nexport { type SizeErrorType, size } from './utils/data/size.js'\nexport {\n type SliceBytesErrorType,\n type SliceErrorType,\n type SliceHexErrorType,\n slice,\n sliceBytes,\n sliceHex,\n} from './utils/data/slice.js'\nexport {\n type TrimErrorType,\n type TrimReturnType,\n trim,\n} from './utils/data/trim.js'\nexport {\n type BytesToBigIntErrorType,\n type BytesToBigIntOpts,\n type BytesToBoolErrorType,\n type BytesToBoolOpts,\n type BytesToNumberErrorType,\n type BytesToNumberOpts,\n type BytesToStringErrorType,\n type BytesToStringOpts,\n bytesToBigInt,\n bytesToBool,\n bytesToNumber,\n bytesToString,\n type FromBytesErrorType,\n type FromBytesParameters,\n fromBytes,\n} from './utils/encoding/fromBytes.js'\nexport {\n type FromHexErrorType,\n fromHex,\n type HexToBigIntErrorType,\n type HexToBoolErrorType,\n type HexToNumberErrorType,\n type HexToStringErrorType,\n hexToBigInt,\n hexToBool,\n hexToNumber,\n hexToString,\n} from './utils/encoding/fromHex.js'\nexport {\n type FromRlpErrorType,\n type FromRlpReturnType,\n fromRlp,\n} from './utils/encoding/fromRlp.js'\nexport {\n type BoolToBytesErrorType,\n type BoolToBytesOpts,\n boolToBytes,\n type HexToBytesErrorType,\n type HexToBytesOpts,\n hexToBytes,\n type NumberToBytesErrorType,\n numberToBytes,\n type StringToBytesErrorType,\n type StringToBytesOpts,\n stringToBytes,\n type ToBytesErrorType,\n type ToBytesParameters,\n toBytes,\n} from './utils/encoding/toBytes.js'\nexport {\n type BoolToHexErrorType,\n type BoolToHexOpts,\n type BytesToHexErrorType,\n type BytesToHexOpts,\n boolToHex,\n bytesToHex,\n type NumberToHexErrorType,\n type NumberToHexOpts,\n numberToHex,\n type StringToHexErrorType,\n type StringToHexOpts,\n stringToHex,\n type ToHexErrorType,\n type ToHexParameters,\n toHex,\n} from './utils/encoding/toHex.js'\nexport {\n type BytesToRlpErrorType,\n bytesToRlp,\n type HexToRlpErrorType,\n hexToRlp,\n type ToRlpErrorType,\n type ToRlpReturnType,\n toRlp,\n} from './utils/encoding/toRlp.js'\nexport { type LabelhashErrorType, labelhash } from './utils/ens/labelhash.js'\nexport { type NamehashErrorType, namehash } from './utils/ens/namehash.js'\nexport {\n type ToCoinTypeError,\n toCoinType,\n} from './utils/ens/toCoinType.js'\nexport {\n type GetContractErrorReturnType,\n getContractError,\n} from './utils/errors/getContractError.js'\nexport {\n type DefineBlockErrorType,\n defineBlock,\n type FormatBlockErrorType,\n type FormattedBlock,\n formatBlock,\n} from './utils/formatters/block.js'\nexport { type FormatLogErrorType, formatLog } from './utils/formatters/log.js'\nexport {\n type DefineTransactionErrorType,\n defineTransaction,\n type FormatTransactionErrorType,\n type FormattedTransaction,\n formatTransaction,\n transactionType,\n} from './utils/formatters/transaction.js'\nexport {\n type DefineTransactionReceiptErrorType,\n defineTransactionReceipt,\n type FormatTransactionReceiptErrorType,\n type FormattedTransactionReceipt,\n formatTransactionReceipt,\n} from './utils/formatters/transactionReceipt.js'\nexport {\n type DefineTransactionRequestErrorType,\n defineTransactionRequest,\n type FormatTransactionRequestErrorType,\n type FormattedTransactionRequest,\n formatTransactionRequest,\n rpcTransactionType,\n} from './utils/formatters/transactionRequest.js'\nexport { type IsHashErrorType, isHash } from './utils/hash/isHash.js'\nexport {\n type Keccak256ErrorType,\n type Keccak256Hash,\n keccak256,\n} from './utils/hash/keccak256.js'\nexport {\n type Ripemd160ErrorType,\n type Ripemd160Hash,\n ripemd160,\n} from './utils/hash/ripemd160.js'\nexport {\n type Sha256ErrorType,\n type Sha256Hash,\n sha256,\n} from './utils/hash/sha256.js'\nexport {\n type ToEventHashErrorType,\n toEventHash,\n} from './utils/hash/toEventHash.js'\nexport {\n type ToEventSelectorErrorType,\n /** @deprecated use `ToEventSelectorErrorType`. */\n type ToEventSelectorErrorType as GetEventSelectorErrorType,\n toEventSelector,\n /** @deprecated use `toEventSelector`. */\n toEventSelector as getEventSelector,\n} from './utils/hash/toEventSelector.js'\nexport {\n type ToEventSignatureErrorType,\n /** @deprecated use `ToEventSignatureErrorType`. */\n type ToEventSignatureErrorType as GetEventSignatureErrorType,\n toEventSignature,\n /** @deprecated use `toEventSignature`. */\n toEventSignature as getEventSignature,\n} from './utils/hash/toEventSignature.js'\nexport {\n type ToFunctionHashErrorType,\n toFunctionHash,\n} from './utils/hash/toFunctionHash.js'\nexport {\n type ToFunctionSelectorErrorType,\n /** @deprecated use `ToFunctionSelectorErrorType`. */\n type ToFunctionSelectorErrorType as GetFunctionSelectorErrorType,\n toFunctionSelector,\n /** @deprecated use `toFunctionSelector`. */\n toFunctionSelector as getFunctionSelector,\n} from './utils/hash/toFunctionSelector.js'\nexport {\n type ToFunctionSignatureErrorType,\n /** @deprecated use `ToFunctionSignatureErrorType`. */\n type ToFunctionSignatureErrorType as GetFunctionSignatureErrorType,\n toFunctionSignature,\n /** @deprecated use `toFunctionSignature`. */\n toFunctionSignature as getFunctionSignature,\n} from './utils/hash/toFunctionSignature.js'\nexport {\n type DefineKzgErrorType,\n type DefineKzgParameters,\n type DefineKzgReturnType,\n defineKzg,\n} from './utils/kzg/defineKzg.js'\nexport {\n type SetupKzgErrorType,\n type SetupKzgParameters,\n type SetupKzgReturnType,\n setupKzg,\n} from './utils/kzg/setupKzg.js'\nexport {\n type CreateNonceManagerParameters,\n createNonceManager,\n type NonceManager,\n type NonceManagerSource,\n nonceManager,\n} from './utils/nonceManager.js'\nexport { withCache } from './utils/promise/withCache.js'\nexport {\n type WithRetryErrorType,\n withRetry,\n} from './utils/promise/withRetry.js'\nexport {\n type WithTimeoutErrorType,\n withTimeout,\n} from './utils/promise/withTimeout.js'\nexport {\n type CompactSignatureToSignatureErrorType,\n compactSignatureToSignature,\n} from './utils/signature/compactSignatureToSignature.js'\nexport {\n type HashMessageErrorType,\n hashMessage,\n} from './utils/signature/hashMessage.js'\nexport {\n type HashDomainErrorType,\n type HashStructErrorType,\n type HashTypedDataErrorType,\n type HashTypedDataParameters,\n type HashTypedDataReturnType,\n hashDomain,\n hashStruct,\n hashTypedData,\n} from './utils/signature/hashTypedData.js'\nexport {\n type IsErc6492SignatureErrorType,\n type IsErc6492SignatureParameters,\n type IsErc6492SignatureReturnType,\n isErc6492Signature,\n} from './utils/signature/isErc6492Signature.js'\nexport {\n type IsErc8010SignatureErrorType,\n type IsErc8010SignatureParameters,\n type IsErc8010SignatureReturnType,\n isErc8010Signature,\n} from './utils/signature/isErc8010Signature.js'\nexport {\n /** @deprecated Use `ParseCompactSignatureErrorType`. */\n type ParseCompactSignatureErrorType as HexToCompactSignatureErrorType,\n type ParseCompactSignatureErrorType,\n /** @deprecated Use `parseCompactSignature`. */\n parseCompactSignature as hexToCompactSignature,\n parseCompactSignature,\n} from './utils/signature/parseCompactSignature.js'\nexport {\n type ParseErc6492SignatureErrorType,\n type ParseErc6492SignatureParameters,\n type ParseErc6492SignatureReturnType,\n parseErc6492Signature,\n} from './utils/signature/parseErc6492Signature.js'\nexport {\n type ParseErc8010SignatureErrorType,\n type ParseErc8010SignatureParameters,\n type ParseErc8010SignatureReturnType,\n parseErc8010Signature,\n} from './utils/signature/parseErc8010Signature.js'\nexport {\n /** @deprecated Use `ParseSignatureErrorType`. */\n type ParseSignatureErrorType as HexToSignatureErrorType,\n type ParseSignatureErrorType,\n /** @deprecated Use `parseSignature`. */\n parseSignature as hexToSignature,\n parseSignature,\n} from './utils/signature/parseSignature.js'\nexport {\n type RecoverAddressErrorType,\n type RecoverAddressParameters,\n type RecoverAddressReturnType,\n recoverAddress,\n} from './utils/signature/recoverAddress.js'\nexport {\n type RecoverMessageAddressErrorType,\n type RecoverMessageAddressParameters,\n type RecoverMessageAddressReturnType,\n recoverMessageAddress,\n} from './utils/signature/recoverMessageAddress.js'\nexport {\n type RecoverPublicKeyErrorType,\n type RecoverPublicKeyParameters,\n type RecoverPublicKeyReturnType,\n recoverPublicKey,\n} from './utils/signature/recoverPublicKey.js'\nexport {\n type RecoverTransactionAddressErrorType,\n type RecoverTransactionAddressParameters,\n type RecoverTransactionAddressReturnType,\n recoverTransactionAddress,\n} from './utils/signature/recoverTransactionAddress.js'\nexport {\n type RecoverTypedDataAddressErrorType,\n type RecoverTypedDataAddressParameters,\n type RecoverTypedDataAddressReturnType,\n recoverTypedDataAddress,\n} from './utils/signature/recoverTypedDataAddress.js'\nexport {\n /** @deprecated Use `SignatureToHexErrorType` instead. */\n type SerializeCompactSignatureErrorType as CompactSignatureToHexErrorType,\n type SerializeCompactSignatureErrorType,\n /** @deprecated Use `serializeCompactSignature` instead. */\n serializeCompactSignature as compactSignatureToHex,\n serializeCompactSignature,\n} from './utils/signature/serializeCompactSignature.js'\nexport {\n type SerializeErc6492SignatureErrorType,\n type SerializeErc6492SignatureParameters,\n type SerializeErc6492SignatureReturnType,\n serializeErc6492Signature,\n} from './utils/signature/serializeErc6492Signature.js'\nexport {\n type SerializeErc8010SignatureErrorType,\n type SerializeErc8010SignatureParameters,\n type SerializeErc8010SignatureReturnType,\n serializeErc8010Signature,\n} from './utils/signature/serializeErc8010Signature.js'\nexport {\n /** @deprecated Use `SignatureToHexErrorType` instead. */\n type SerializeSignatureErrorType as SignatureToHexErrorType,\n type SerializeSignatureErrorType,\n type SerializeSignatureParameters,\n type SerializeSignatureReturnType,\n /** @deprecated Use `serializeSignature` instead. */\n serializeSignature as signatureToHex,\n serializeSignature,\n} from './utils/signature/serializeSignature.js'\nexport {\n type SignatureToCompactSignatureErrorType,\n signatureToCompactSignature,\n} from './utils/signature/signatureToCompactSignature.js'\nexport {\n type ToPrefixedMessageErrorType,\n toPrefixedMessage,\n} from './utils/signature/toPrefixedMessage.js'\nexport {\n type VerifyHashErrorType,\n type VerifyHashParameters,\n type VerifyHashReturnType,\n verifyHash,\n} from './utils/signature/verifyHash.js'\nexport {\n type VerifyMessageErrorType,\n type VerifyMessageParameters,\n type VerifyMessageReturnType,\n verifyMessage,\n} from './utils/signature/verifyMessage.js'\nexport {\n type VerifyTypedDataErrorType,\n type VerifyTypedDataParameters,\n type VerifyTypedDataReturnType,\n verifyTypedData,\n} from './utils/signature/verifyTypedData.js'\nexport { type StringifyErrorType, stringify } from './utils/stringify.js'\nexport {\n type AssertRequestErrorType,\n assertRequest,\n} from './utils/transaction/assertRequest.js'\nexport {\n type AssertTransactionEIP1559ErrorType,\n type AssertTransactionEIP2930ErrorType,\n type AssertTransactionLegacyErrorType,\n assertTransactionEIP1559,\n assertTransactionEIP2930,\n assertTransactionLegacy,\n} from './utils/transaction/assertTransaction.js'\nexport {\n type GetSerializedTransactionType,\n type GetSerializedTransactionTypeErrorType,\n getSerializedTransactionType,\n} from './utils/transaction/getSerializedTransactionType.js'\nexport {\n type GetTransactionType,\n type GetTransactionTypeErrorType,\n getTransactionType,\n} from './utils/transaction/getTransactionType.js'\nexport {\n type ParseTransactionErrorType,\n type ParseTransactionReturnType,\n parseTransaction,\n} from './utils/transaction/parseTransaction.js'\nexport {\n type SerializeAccessListErrorType,\n serializeAccessList,\n} from './utils/transaction/serializeAccessList.js'\nexport {\n type SerializedTransactionReturnType,\n type SerializeTransactionErrorType,\n type SerializeTransactionFn,\n serializeTransaction,\n} from './utils/transaction/serializeTransaction.js'\nexport {\n type DomainSeparatorErrorType,\n domainSeparator,\n type GetTypesForEIP712DomainErrorType,\n getTypesForEIP712Domain,\n type SerializeTypedDataErrorType,\n serializeTypedData,\n type ValidateTypedDataErrorType,\n validateTypedData,\n} from './utils/typedData.js'\nexport {\n type FormatEtherErrorType,\n formatEther,\n} from './utils/unit/formatEther.js'\nexport {\n type FormatGweiErrorType,\n formatGwei,\n} from './utils/unit/formatGwei.js'\nexport {\n type FormatUnitsErrorType,\n formatUnits,\n} from './utils/unit/formatUnits.js'\nexport {\n type ParseEtherErrorType,\n parseEther,\n} from './utils/unit/parseEther.js'\nexport { type ParseGweiErrorType, parseGwei } from './utils/unit/parseGwei.js'\nexport {\n type ParseUnitsErrorType,\n parseUnits,\n} from './utils/unit/parseUnits.js'\n","/**\n * DKG Manager for iframe\n *\n * Handles Distributed Key Generation inside secure iframe context\n * Uses existing dkls23-wasm module and TSS backend\n */\n\nimport init, * as tss from 'dkls23-wasm';\nimport { keccak256 } from 'viem';\nimport type { DKGResult } from './types';\nimport { TokenRefreshApiClient } from './token-refresh-client';\n\nexport class DKGManager extends TokenRefreshApiClient {\n private wasmLoaded: boolean = false;\n\n constructor() {\n super();\n console.log('[iframe][DKG] Initialized with TSS URL:', this.tssUrl);\n }\n\n /**\n * Initialize WASM module\n */\n async initialize(): Promise<void> {\n if (this.wasmLoaded) return;\n\n try {\n await init();\n this.wasmLoaded = true;\n console.log('[iframe][DKG] ✅ WASM module loaded');\n\n // Store WASM API globally for access\n (globalThis as any).__tss_wasm_api__ = tss;\n (globalThis as any).__tss_wasm_active__ = true;\n\n // Log memory info if available\n if (typeof (tss as any).wasm_memory_info === 'function') {\n try {\n const memInfo = (tss as any).wasm_memory_info();\n console.log('[iframe][DKG] WASM memory:', memInfo);\n } catch {}\n }\n } catch (error) {\n this.wasmLoaded = true;\n console.error('[iframe][DKG] Failed to load WASM:', error);\n throw new Error('Failed to initialize TSS WASM module');\n }\n }\n\n /**\n * Perform complete DKG protocol\n */\n async performDKG(userId: string, projectId: string, accessToken?: string): Promise<DKGResult> {\n if (!this.wasmLoaded) {\n await this.initialize();\n }\n\n console.log('[iframe][DKG] Starting DKG for user:', userId, 'projectId:', projectId, 'hasToken:', !!accessToken);\n\n // DKG Parameters (2-of-2 threshold signature)\n const CLIENT_PARTY_ID = 1;\n const THRESHOLD = 2;\n const TOTAL_PARTIES = 2;\n const DOMAIN_LABEL = this.generateDomainLabel(userId);\n\n // Step 1: Client starts DKG locally\n const clientStartResult = (tss as any).dkg_start(\n CLIENT_PARTY_ID,\n THRESHOLD,\n TOTAL_PARTIES,\n DOMAIN_LABEL\n );\n\n if (!Array.isArray(clientStartResult) || clientStartResult.length < 2) {\n throw new Error('Invalid dkg_start result format');\n }\n\n let clientState = clientStartResult[0];\n const clientMsg1 = clientStartResult[1];\n\n console.log('[iframe][DKG] Client started, sending to server...');\n\n // Step 2: Start DKG on server\n const serverStartResponse = await this.apiCall('POST', `/api/tss/${userId}/dkg/start`, {\n threshold: THRESHOLD,\n parties: TOTAL_PARTIES,\n domainLabel: DOMAIN_LABEL,\n }, projectId, accessToken);\n\n const { sessionId, msg1: serverMsg1 } = serverStartResponse;\n\n if (!serverMsg1?.kind || !serverMsg1.data_b64) {\n throw new Error('Invalid server msg1 format');\n }\n\n console.log('[iframe][DKG] Server started, sessionId:', sessionId);\n\n // Step 3: Round 1 - Exchange messages\n console.log('[iframe][DKG] Round 1: Exchanging messages...');\n\n const round1Response = await this.apiCall('POST', `/api/tss/${userId}/dkg/round`, {\n sessionId,\n clientMsg: clientMsg1,\n }, projectId, accessToken);\n\n const serverMsg2 = this.extractServerMessage(round1Response);\n\n const clientR2Result = (tss as any).dkg_handle(\n JSON.stringify({ bytes_b64: clientState.bytes_b64 }),\n JSON.stringify(serverMsg1)\n );\n\n clientState = clientR2Result[0];\n const clientMsg2 = clientR2Result[1];\n\n // Step 4: Round 2\n console.log('[iframe][DKG] Round 2: Exchanging messages...');\n\n const round2Response = await this.apiCall('POST', `/api/tss/${userId}/dkg/round`, {\n sessionId,\n clientMsg: clientMsg2,\n }, projectId, accessToken);\n\n const serverMsg3 = this.extractServerMessage(round2Response);\n\n const clientR3Result = (tss as any).dkg_handle(\n JSON.stringify({ bytes_b64: clientState.bytes_b64 }),\n JSON.stringify(serverMsg2)\n );\n\n clientState = clientR3Result[0];\n const clientMsg3 = clientR3Result[1];\n\n // Step 5: Round 3 (Final)\n console.log('[iframe][DKG] Round 3 (Final): Getting public key...');\n\n const finalResponse = await this.apiCall('POST', `/api/tss/${userId}/dkg/round`, {\n sessionId,\n clientMsg: clientMsg3,\n }, projectId, accessToken);\n\n if (!finalResponse.publicKey && !finalResponse.pubkey) {\n throw new Error('No public key in final response');\n }\n\n const publicKey = finalResponse.publicKey || finalResponse.pubkey;\n\n // Step 6: Final client processing to get keyshare\n console.log('[iframe][DKG] Processing final client keyshare...');\n\n const clientFinalResult = (tss as any).dkg_handle(\n JSON.stringify({ bytes_b64: clientState.bytes_b64 }),\n JSON.stringify(serverMsg3)\n );\n\n if (!Array.isArray(clientFinalResult) || clientFinalResult.length < 3) {\n throw new Error('Invalid final dkg_handle result format');\n }\n\n const clientFinish = clientFinalResult[2];\n\n if (!clientFinish?.keyshare_b64) {\n throw new Error('No keyshare_b64 in final result');\n }\n\n // Derive Ethereum address from public key\n const ownerAddress = this.deriveAddress(publicKey);\n\n console.log('[iframe][DKG] ✅ DKG completed successfully');\n console.log('[iframe][DKG] Owner address:', ownerAddress);\n\n return {\n keyshare: clientFinish,\n ownerAddress,\n sessionId,\n };\n }\n\n /**\n * Derive Ethereum address from uncompressed public key\n */\n private deriveAddress(publicKeyBase64: string): `0x${string}` {\n // Convert base64 to bytes\n const b64decoded = atob(publicKeyBase64);\n const bytes = new Uint8Array(b64decoded.length);\n for (let i = 0; i < b64decoded.length; i++) {\n bytes[i] = b64decoded.charCodeAt(i);\n }\n\n // Remove 0x04 prefix (uncompressed key indicator)\n const pubkeyBytes = bytes.slice(1);\n\n // Convert to hex\n const pubkeyHex = Array.from(pubkeyBytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n\n // Keccak256 hash\n const hash = keccak256(`0x${pubkeyHex}`);\n\n // Take last 20 bytes (40 hex chars)\n const addr = hash.slice(-40);\n\n // Apply EIP-55 checksum\n return this.toChecksumAddress(`0x${addr}`);\n }\n\n /**\n * Apply EIP-55 checksum to address\n */\n private toChecksumAddress(address: string): `0x${string}` {\n const addr = address.toLowerCase().replace('0x', '');\n const encoder = new TextEncoder();\n const addrBytes = encoder.encode(addr);\n const hash = keccak256(addrBytes).replace('0x', '');\n\n let checksumAddress = '0x';\n for (let i = 0; i < addr.length; i++) {\n checksumAddress += parseInt(hash[i], 16) >= 8 ? addr[i].toUpperCase() : addr[i];\n }\n\n return checksumAddress as `0x${string}`;\n }\n\n /**\n * Generate secure domain label for DKG\n */\n private generateDomainLabel(userId: string): string {\n const timestamp = Date.now();\n const randomBytes = new Uint8Array(16);\n crypto.getRandomValues(randomBytes);\n const randomHex = Array.from(randomBytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n\n return `dkls23:2of2:aa:${userId}:${timestamp}:${randomHex}`;\n }\n\n /**\n * Extract server message from response\n */\n private extractServerMessage(response: any): any {\n return response?.msgNext || response?.msg_next || response?.msg || null;\n }\n}\n","const LP_JWT_TOKENS_LS_KEY = 'lumia-passport-jwt-tokens'\n\ninterface LumiaPassportSession {\n accessToken: string\n userId: string\n}\n\nexport function getBearer(): `Bearer ${string}` | null {\n try {\n const sessionString = localStorage.getItem(LP_JWT_TOKENS_LS_KEY)\n if (!sessionString) return null\n\n const session = JSON.parse(sessionString) as LumiaPassportSession\n\n // Validate session structure\n if (session && typeof session.accessToken === 'string' && typeof session.userId === 'string') {\n return `Bearer ${session.accessToken}`\n }\n\n return null\n } catch (error) {\n console.error('Failed to parse Lumia Passport session:', error)\n return null\n }\n}\n","import type { SecureMessage } from '../types'\nimport { getBearer } from './utils'\n\nconst API_DOMAIN = 'https://api.lumiapassport.com/on-ramp'\n\ninterface PaymentMethod {\n payMethodCode: string\n payMethodSubCode: string\n paymentMethod: string\n fiatMinLimit: string\n fiatMaxLimit: string\n cryptoMinLimit: string\n cryptoMaxLimit: string\n p2p: boolean\n /** 0: no restriction, 1: T+1 restriction */\n withdrawRestriction: number\n}\n\n/**\n * @link https://developers.binance.com/docs/binance_connect/on-ramp-buy-apis\n */\ninterface GetCryptoTradingPairsQueryResponse {\n success: boolean\n code: string\n message: string\n data: {\n fiatCurrencies: string[]\n cryptoCurrencies: string[]\n }\n}\n\n/**\n * @link https://developers.binance.com/docs/binance_connect/on-ramp-buy-apis/2.get-crypto-networks\n */\ninterface BinanceNetwork {\n network: string\n addressRegex: string\n memoRegex: string\n withdrawFee: number\n withdrawMinAmount: number\n withdrawMaxAmount: number\n contractAddress: string\n withdrawEnable: boolean\n depositEnable: boolean\n}\n\ninterface BinanceCurrency {\n cryptoCurrency: string\n networks: BinanceNetwork[]\n}\n\ninterface GetLumiaNetworkQueryResponse {\n success: boolean\n code: string\n message: string\n data: BinanceCurrency[]\n}\n\n/**\n * @link https://developers.binance.com/docs/binance_connect/on-ramp-buy-apis/3.get-payment-method-list\n */\ninterface GetPaymentMethodsQueryPayload {\n totalAmount: string\n}\n\ninterface GetPaymentMethodsQueryResponse {\n success: boolean\n code: string\n message: string\n data: {\n paymentMethods: PaymentMethod[]\n }\n}\n\n/**\n * @link https://developers.binance.com/docs/binance_connect/on-ramp-buy-apis/3.get-payment-method-list\n */\ninterface GetQuoteQueryPayload {\n network: string\n walletAddress: string\n requestedAmount: string\n payMethodCode?: string\n payMethodSubCode?: string\n}\n\ninterface GetQuoteQueryResponse {\n success: boolean\n code: string\n message: string\n data: {\n totalAmount: string\n quotePrice: string\n feeAmount: string\n feeCurrency: string\n networkFee: string\n payMethodCode: string\n payMethodSubCode: string\n } | null\n}\n\n/**\n * @link https://developers.binance.com/docs/binance_connect/on-ramp-buy-apis/5.pre-order#example-1\n */\ninterface PreorderMutationPayload {\n requestedAmount: string\n address: string\n payMethodCode?: string\n payMethodSubCode?: string\n redirectUrl?: string\n failRedirectUrl?: string\n network: string\n}\n\n/**\n * @link https://developers.binance.com/docs/binance_connect/on-ramp-buy-apis/5.pre-order#example-1\n */\ninterface PreorderMutationResponse {\n success: boolean\n code: string\n message: string\n data: {\n link: string\n /** Unix timestamp, ex 1742222863560 */\n linkExpireTime: number\n }\n}\n\ntype BinanceResponseFunction = (messageId: string, data: any, targetOrigin: string) => void\n\nexport class BinanceOnrampAPI {\n private async checkIsLumaiAvailableQuery() {\n const auth = getBearer()\n const response = await fetch(`${API_DOMAIN}/api/binance/pairs`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(auth && { Authorization: auth })\n }\n })\n\n const data = (await response.json()) as GetCryptoTradingPairsQueryResponse\n\n if (!data.success) {\n throw new Error(`${data.code}: ${data.message}`)\n }\n\n if (!data.data?.cryptoCurrencies?.includes('LUMIA')) {\n console.error('Lumia is not available in Binance pairs API')\n throw new Error('Lumia is not available in API')\n }\n\n return !!data.data.cryptoCurrencies.includes('LUMIA')\n }\n\n private async getLumiaNetworkQuery(): Promise<BinanceCurrency> {\n // return new Promise((_, rej) => setTimeout(() => rej(new Error('Lumia network query timeout')), 2200))\n\n const auth = getBearer()\n const response = await fetch(`${API_DOMAIN}/api/binance/networks`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(auth && { Authorization: auth })\n }\n })\n\n const data = (await response.json()) as GetLumiaNetworkQueryResponse\n\n if (!data?.success) {\n throw new Error(`${data.code}: ${data.message}`)\n }\n\n const lumiaNetwork = data.data?.find((el) => el.cryptoCurrency === 'LUMIA') || null\n\n if (!lumiaNetwork) {\n console.error('Lumia is not available in Binance pairs API')\n throw new Error('Lumia is not available in API')\n }\n\n return lumiaNetwork\n }\n\n private async getPaymentMethodsQuery(payload: GetPaymentMethodsQueryPayload) {\n const auth = getBearer()\n const response = await fetch(`${API_DOMAIN}/api/binance/modes`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(auth && { Authorization: auth })\n },\n body: JSON.stringify(payload)\n })\n\n const data = (await response.json()) as GetPaymentMethodsQueryResponse\n\n if (!data.success) {\n throw new Error(`${data.code}: ${data.message}`)\n }\n\n if (!data.data.paymentMethods.length) {\n throw new Error('No payment methods available yet')\n }\n\n return data.data.paymentMethods\n }\n\n private async getQuoteQuery(payload: GetQuoteQueryPayload) {\n const auth = getBearer()\n const response = await fetch(`${API_DOMAIN}/api/binance/quote`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(auth && { Authorization: auth })\n },\n body: JSON.stringify(payload)\n })\n\n const data = (await response.json()) as GetQuoteQueryResponse\n\n if (!data.success) {\n throw new Error(`${data.code}: ${data.message}`)\n }\n\n return data.data\n }\n\n private async createPreorderMutation(payload: PreorderMutationPayload) {\n const auth = getBearer()\n const response = await fetch(`${API_DOMAIN}/api/binance/pre-order`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(auth && { Authorization: auth })\n },\n body: JSON.stringify(payload)\n })\n\n const data = (await response.json()) as PreorderMutationResponse\n\n if (!data.success) {\n throw new Error(`${data.code}: ${data.message}`)\n }\n\n return data.data\n }\n\n public async handleMessage(\n message: SecureMessage,\n origin: string,\n sendResponseFn: BinanceResponseFunction\n ): Promise<void> {\n const { type, messageId, data } = message\n\n console.log('[ BINANCE Received message ]', type, message)\n\n switch (type) {\n case 'BINANCE_CHECK_IS_LUMIA_AVAILABLE_QUERY':\n const isLumiaAvalableRes = await this.checkIsLumaiAvailableQuery()\n sendResponseFn(messageId, isLumiaAvalableRes, origin)\n break\n\n case 'BINANCE_GET_LUMIA_NETWORK_QUERY':\n const lumiaNetworkResponse = await this.getLumiaNetworkQuery()\n sendResponseFn(messageId, lumiaNetworkResponse, origin)\n break\n\n case 'BINANCE_GET_PAYMENT_METHODS_QUERY':\n const paymentMethodsResponse = await this.getPaymentMethodsQuery(this.ensurePayload(data, 'methods'))\n sendResponseFn(messageId, paymentMethodsResponse, origin)\n break\n\n case 'BINANCE_GET_QUOTE_QUERY':\n const quoteResponse = await this.getQuoteQuery(this.ensurePayload(data, 'quote'))\n sendResponseFn(messageId, quoteResponse, origin)\n break\n\n case 'BINANCE_CREATE_PREORDER_MUTATION':\n const preorderResponse = await this.createPreorderMutation(this.ensurePayload(data, 'preorder'))\n sendResponseFn(messageId, preorderResponse, origin)\n break\n\n default:\n throw new Error(`[ BINANCE ]: Unknown message type: ${type}`)\n }\n }\n\n private ensurePayload(data: unknown, type: 'methods'): GetPaymentMethodsQueryPayload\n private ensurePayload(data: unknown, type: 'quote'): GetQuoteQueryPayload\n private ensurePayload(data: unknown, type: 'preorder'): PreorderMutationPayload\n private ensurePayload(\n data: unknown,\n type: 'methods' | 'quote' | 'preorder'\n ): GetPaymentMethodsQueryPayload | GetQuoteQueryPayload | PreorderMutationPayload {\n if (!data || typeof data !== 'object') {\n throw new Error(`Invalid payload: expected object, got ${typeof data}`)\n }\n\n const payload = data as Record<string, unknown>\n\n switch (type) {\n case 'methods':\n if (typeof payload.totalAmount !== 'string') {\n throw new Error('Invalid payload: totalAmount must be a string')\n }\n return { totalAmount: payload.totalAmount }\n\n case 'quote':\n if (typeof payload.network !== 'string') {\n throw new Error('Invalid payload: network must be a string')\n }\n if (typeof payload.walletAddress !== 'string') {\n throw new Error('Invalid payload: walletAddress must be a string')\n }\n if (typeof payload.requestedAmount !== 'string') {\n throw new Error('Invalid payload: requestedAmount must be a string')\n }\n return {\n network: payload.network,\n walletAddress: payload.walletAddress,\n requestedAmount: payload.requestedAmount,\n ...(payload.payMethodCode && typeof payload.payMethodCode === 'string'\n ? { payMethodCode: payload.payMethodCode }\n : {}),\n ...(payload.payMethodSubCode && typeof payload.payMethodSubCode === 'string'\n ? { payMethodSubCode: payload.payMethodSubCode }\n : {})\n }\n\n case 'preorder':\n if (typeof payload.requestedAmount !== 'string') {\n throw new Error('Invalid payload: requestedAmount must be a string')\n }\n if (typeof payload.address !== 'string') {\n throw new Error('Invalid payload: address must be a string')\n }\n if (typeof payload.network !== 'string') {\n throw new Error('Invalid payload: network must be a string')\n }\n return {\n requestedAmount: payload.requestedAmount,\n address: payload.address,\n network: payload.network,\n ...(payload.payMethodCode && typeof payload.payMethodCode === 'string'\n ? { payMethodCode: payload.payMethodCode }\n : {}),\n ...(payload.payMethodSubCode && typeof payload.payMethodSubCode === 'string'\n ? { payMethodSubCode: payload.payMethodSubCode }\n : {}),\n ...(payload.redirectUrl && typeof payload.redirectUrl === 'string'\n ? { redirectUrl: payload.redirectUrl }\n : {}),\n ...(payload.failRedirectUrl && typeof payload.failRedirectUrl === 'string'\n ? { failRedirectUrl: payload.failRedirectUrl }\n : {})\n }\n\n default:\n throw new Error(`Unknown payload type: ${type}`)\n }\n }\n}\n","import { SecureMessage } from '../types'\nimport type { RampnowConfigResponse, RampOrderQuotePayload, RampOrderQuoteQueryResponse } from './rampnow.interfaces'\nimport { getBearer } from './utils'\n\nconst API_DOMAIN = 'https://api.lumiapassport.com/on-ramp'\n\ntype RampnowResponseFunction = (messageId: string, data: any, targetOrigin: string) => void\n\nexport class RampnowOnrampAPI {\n private async getRampnowConfigQuery() {\n const auth = getBearer()\n\n const response = await fetch(`${API_DOMAIN}/api/rampnow/cfg`, {\n method: 'GET',\n headers: { ...(auth && { Authorization: auth }) }\n })\n\n const data = (await response.json()) as RampnowConfigResponse\n\n return data\n }\n\n private async getRampOrderQuoteQuery(payload: RampOrderQuotePayload) {\n const auth = getBearer()\n\n const response = await fetch(`${API_DOMAIN}/api/rampnow/quote`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(auth && { Authorization: auth })\n },\n body: JSON.stringify(payload)\n })\n\n const data = (await response.json()) as RampOrderQuoteQueryResponse\n\n if (!data.data) {\n throw new Error(`${data.code}: ${data.message}`)\n }\n\n return data\n }\n\n private ensureOrderQuotePayload(payload: any) {\n if (\n typeof payload !== 'object' ||\n payload === null ||\n typeof payload?.paymentMode !== 'string' ||\n typeof payload?.srcAmount !== 'number' ||\n typeof payload?.walletAddress !== 'string'\n ) {\n throw new Error('Invalid Ramp order quote payload')\n }\n\n return payload as RampOrderQuotePayload\n }\n\n // UNUSED due to Rampnow APP redirect order flow\n // async ctreateChekoutOrderMutation(payload: CreateCheckoutOrderMutationPayload) {\n // const checkoutedOrderData = await axios\n // .post('/api/rampnow/order', payload)\n // .then((r) => r.data.data as CreateCheckoutOrderMutationResponse)\n // .catch((err) => {\n // throw new Error(err?.message || 'Ramp quote query failed')\n // })\n\n // return checkoutedOrderData\n // }\n\n public async handleMessage(\n message: SecureMessage,\n origin: string,\n sendResponseFn: RampnowResponseFunction\n ): Promise<void> {\n const { type, data, messageId } = message\n\n console.log('[ BINANCE Received message ]', type, message)\n\n switch (type) {\n case 'RAMPNOW_GET_CONFIG':\n const ramnowCfg = await this.getRampnowConfigQuery()\n sendResponseFn(messageId, ramnowCfg, origin)\n break\n\n case 'RAMPNOW_GET_ORDER_QUOTE':\n const orderQuote = await this.getRampOrderQuoteQuery(this.ensureOrderQuotePayload(data))\n sendResponseFn(messageId, orderQuote, origin)\n break\n\n default:\n throw new Error(`[ RAMPNOW ]: Unknown message type: ${type}`)\n }\n }\n}\n","/**\n * Secure Messenger for iframe\n *\n * Handles secure postMessage communication with HMAC authentication,\n * replay protection, and origin validation\n */\n\nimport type { SecureMessage } from './types'\n\ninterface PendingMessage {\n resolve: (value: any) => void\n reject: (error: Error) => void\n timeout: number\n}\n\nexport class SecureMessenger {\n private allowedOrigins: Set<string> = new Set()\n private usedNonces: Set<string> = new Set()\n private pendingMessages: Map<string, PendingMessage> = new Map()\n private sessionToken: string | null = null\n private messageHandlers: Array<(message: SecureMessage, origin: string) => Promise<void>> = []\n\n private readonly MESSAGE_TIMEOUT = 60000 // 60 seconds\n private readonly NONCE_CLEANUP_INTERVAL = 5 * 60 * 1000 // 5 minutes\n\n // Debug flag: set to true to log all filtered messages (for debugging only)\n private readonly DEBUG_FILTERED_MESSAGES = true\n\n constructor() {\n // Periodic nonce cleanup\n setInterval(() => this.cleanupOldNonces(), this.NONCE_CLEANUP_INTERVAL)\n }\n\n /**\n * Setup message listener with security validation\n */\n setupListener(handler: (message: SecureMessage, origin: string) => Promise<void>): void {\n this.messageHandlers.push(handler)\n\n window.addEventListener('message', async (event) => {\n try {\n await this.handleIncomingMessage(event)\n } catch (error) {\n console.error('[iframe][Messenger] Error handling message:', error)\n }\n })\n\n console.log('[iframe][Messenger] Message listener setup')\n }\n\n /**\n * Handle incoming postMessage\n */\n private async handleIncomingMessage(event: MessageEvent): Promise<void> {\n const message = event.data\n const { origin } = event\n\n // Quick filter: ignore messages that are clearly not ours\n // This prevents spam from browser extensions, dev tools, etc.\n if (!message || typeof message !== 'object' || !message.type) {\n // Silently ignore messages without basic structure\n if (this.DEBUG_FILTERED_MESSAGES && message) {\n console.debug('[iframe][Messenger] Filtered: no type field', message)\n }\n return\n }\n\n // Check if this looks like our message format\n // Our messages always have: type, messageId, timestamp, nonce\n if (!this.isLumiaMessage(message)) {\n // Silently ignore messages that don't match our protocol\n if (this.DEBUG_FILTERED_MESSAGES) {\n console.debug('[iframe][Messenger] Filtered: not Lumia message', {\n type: message.type,\n origin\n })\n }\n return\n }\n\n // Full structure validation for our messages\n if (!this.validateMessageStructure(message)) {\n console.error('[iframe][Messenger] Invalid Lumia Passport message structure:', {\n type: message.type,\n hasMessageId: !!message.messageId,\n hasTimestamp: !!message.timestamp,\n hasNonce: !!message.nonce,\n hasProjectId: !!message.projectId,\n hasData: 'data' in message\n })\n return\n }\n\n // For SDK_AUTH, accept HTTPS origins (initial connection)\n // In development, allow localhost/127.0.0.1 over HTTP\n if (message.type === 'SDK_AUTH') {\n const isLocalhost = origin.startsWith('http://localhost:') || origin.startsWith('http://127.0.0.1:')\n const isHttps = origin.startsWith('https://')\n\n if (!isHttps && !isLocalhost) {\n console.error('[iframe][Messenger] Only HTTPS origins allowed (or localhost in dev)')\n return\n }\n } else {\n // For other messages, validate origin is in allowed list\n if (!this.isAllowedOrigin(origin)) {\n console.error(`[iframe][Messenger] Rejected message from unauthorized origin: ${origin}`)\n return\n }\n }\n\n // Validate timestamp (must be recent)\n const messageAge = Date.now() - message.timestamp\n if (messageAge < 0 || messageAge > this.MESSAGE_TIMEOUT) {\n console.error(`[iframe][Messenger] Message timestamp invalid (age: ${messageAge}ms)`)\n return\n }\n\n // Check nonce uniqueness (prevent replay attacks)\n if (this.usedNonces.has(message.nonce)) {\n console.error('[iframe][Messenger] Nonce already used (replay attack?)')\n return\n }\n\n // Validate HMAC if session is established\n if (this.sessionToken && message.hmac) {\n const expectedHmac = await this.computeHMAC(message)\n if (!this.constantTimeCompare(expectedHmac, message.hmac)) {\n console.error('[iframe][Messenger] HMAC validation failed')\n return\n }\n }\n\n // Mark nonce as used\n this.usedNonces.add(message.nonce)\n\n // Handle message\n for (const handler of this.messageHandlers) {\n await handler(message, origin)\n }\n }\n\n /**\n * Send response to parent\n */\n sendResponse(messageId: string, data: any, targetOrigin: string): void {\n if (!window.parent) {\n console.error('[iframe][Messenger] No parent window')\n return\n }\n\n const response = {\n type: 'LUMIA_PASSPORT_RESPONSE',\n messageId,\n timestamp: Date.now(),\n data\n }\n\n window.parent.postMessage(response, targetOrigin)\n console.log(`[iframe][Messenger] Sent response to ${targetOrigin}`)\n }\n\n /**\n * Send error to parent\n */\n sendError(messageId: string, error: string, targetOrigin: string): void {\n if (!window.parent) {\n console.error('[iframe][Messenger] No parent window')\n return\n }\n\n const response = {\n type: 'LUMIA_PASSPORT_ERROR',\n messageId,\n timestamp: Date.now(),\n error\n }\n\n window.parent.postMessage(response, targetOrigin)\n console.log(`[iframe][Messenger] Sent error to ${targetOrigin}: ${error}`)\n }\n\n /**\n * Add allowed origin\n */\n addAllowedOrigin(origin: string): void {\n this.allowedOrigins.add(origin)\n console.log(`[iframe][Messenger] Added allowed origin: ${origin}`)\n }\n\n /**\n * Remove allowed origin\n */\n removeAllowedOrigin(origin: string): void {\n this.allowedOrigins.delete(origin)\n console.log(`[iframe][Messenger] Removed allowed origin: ${origin}`)\n }\n\n /**\n * Set session token for HMAC\n */\n setSessionToken(token: string): void {\n this.sessionToken = token\n console.log('[iframe][Messenger] Session token set')\n }\n\n /**\n * Quick check if message looks like Lumia Passport protocol\n * This filters out browser extension messages, dev tools, etc.\n */\n private isLumiaMessage(message: any): boolean {\n // Our messages must have these specific types\n const validTypes = [\n 'SDK_AUTH',\n 'AUTHENTICATE',\n 'START_DKG',\n 'SIGN_TRANSACTION',\n 'SIGN_TYPED_DATA',\n 'GET_ADDRESS',\n 'CHECK_KEYSHARE',\n 'GET_TRUSTED_APPS',\n 'REMOVE_TRUSTED_APP',\n 'CREATE_BACKUP',\n 'ENCRYPT_BACKUP_DATA',\n 'RESTORE_BACKUP',\n 'RESTORE_FROM_FILE',\n 'GET_BACKUP_STATUS',\n 'GET_CLOUD_PROVIDERS',\n 'REQUEST_NEW_TOKEN',\n 'RESPONSE',\n 'ERROR',\n 'TRUSTED_APP_REMOVED',\n 'TOKEN_REFRESHED'\n ]\n\n const validTypeGroups = ['BINANCE_', 'RAMPNOW_']\n\n const isTypeValid = validTypes.includes(message.type)\n const isGroupTypeValid = validTypeGroups.some((prefix) => message.type.startsWith(prefix))\n\n if (!message.type || (!isTypeValid && !isGroupTypeValid)) return false\n\n // Our messages always have messageId and timestamp\n // This filters out most non-Lumia messages\n return !!(message.messageId && message.timestamp)\n }\n\n /**\n * Validate message structure\n */\n private validateMessageStructure(message: any): boolean {\n return (\n message &&\n typeof message === 'object' &&\n typeof message.type === 'string' &&\n typeof message.messageId === 'string' &&\n typeof message.timestamp === 'number' &&\n typeof message.nonce === 'string' &&\n typeof message.projectId === 'string' &&\n 'data' in message\n )\n }\n\n /**\n * Check if origin is allowed\n */\n private isAllowedOrigin(origin: string): boolean {\n // Check if in allowed list\n if (this.allowedOrigins.has(origin)) {\n return true\n }\n\n // During initialization, accept HTTPS or localhost\n if (this.allowedOrigins.size === 0) {\n const isLocalhost = origin.startsWith('http://localhost:') || origin.startsWith('http://127.0.0.1:')\n const isHttps = origin.startsWith('https://')\n return isHttps || isLocalhost\n }\n\n return false\n }\n\n /**\n * Compute HMAC-SHA256 for message authentication\n */\n private async computeHMAC(message: SecureMessage): Promise<string> {\n if (!this.sessionToken) {\n throw new Error('No session token for HMAC')\n }\n\n const encoder = new TextEncoder()\n const payload = JSON.stringify({\n type: message.type,\n messageId: message.messageId,\n timestamp: message.timestamp,\n nonce: message.nonce,\n data: JSON.stringify(message.data)\n })\n\n const data = encoder.encode(payload)\n const key = encoder.encode(this.sessionToken)\n\n const cryptoKey = await crypto.subtle.importKey('raw', key, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign'])\n\n const signature = await crypto.subtle.sign('HMAC', cryptoKey, data)\n\n return Array.from(new Uint8Array(signature))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n }\n\n /**\n * Constant-time string comparison (prevent timing attacks)\n */\n private constantTimeCompare(a: string, b: string): boolean {\n if (a.length !== b.length) return false\n\n let result = 0\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i)\n }\n\n return result === 0\n }\n\n /**\n * Cleanup old nonces to prevent memory growth\n */\n private cleanupOldNonces(): void {\n if (this.usedNonces.size > 1000) {\n // Keep only the most recent 500 nonces\n const noncesArray = Array.from(this.usedNonces)\n this.usedNonces = new Set(noncesArray.slice(-500))\n console.log('[iframe][Messenger] Cleaned up old nonces')\n }\n }\n\n /**\n * Get messenger statistics\n */\n getStats(): {\n allowedOrigins: number\n usedNonces: number\n pendingMessages: number\n } {\n return {\n allowedOrigins: this.allowedOrigins.size,\n usedNonces: this.usedNonces.size,\n pendingMessages: this.pendingMessages.size\n }\n }\n}\n","/**\n * Session Manager for iframe\n *\n * Manages sessions between iframe and parent applications\n * Each session represents an authenticated connection from a parent origin\n */\n\nimport type { Session } from './types';\n\nexport class SessionManager {\n private sessions: Map<string, Session> = new Map();\n private readonly SESSION_TIMEOUT = 30 * 60 * 1000; // 30 minutes\n\n constructor() {\n // Cleanup expired sessions periodically\n setInterval(() => this.cleanupExpiredSessions(), 5 * 60 * 1000); // Every 5 minutes\n }\n\n /**\n * Create a new session\n */\n createSession(projectId: string, origin: string): string {\n const sessionToken = this.generateSecureToken();\n\n const session: Session = {\n token: sessionToken,\n projectId,\n origin,\n createdAt: Date.now(),\n lastActivity: Date.now(),\n };\n\n this.sessions.set(sessionToken, session);\n\n console.log(`[iframe][Session] Created session for origin: ${origin}`);\n console.log(`[iframe][Session] Project ID: ${projectId}`);\n\n return sessionToken;\n }\n\n /**\n * Validate session token and origin\n */\n validateSession(sessionToken: string, origin: string): boolean {\n const session = this.sessions.get(sessionToken);\n\n if (!session) {\n console.warn(`[iframe][Session] Session not found: ${sessionToken}`);\n return false;\n }\n\n // Check origin matches\n if (session.origin !== origin) {\n console.error(`[iframe][Session] Origin mismatch: expected ${session.origin}, got ${origin}`);\n return false;\n }\n\n // Check session timeout\n const age = Date.now() - session.lastActivity;\n if (age > this.SESSION_TIMEOUT) {\n console.warn(`[iframe][Session] Session expired (age: ${age}ms)`);\n this.sessions.delete(sessionToken);\n return false;\n }\n\n // Update last activity\n session.lastActivity = Date.now();\n\n return true;\n }\n\n /**\n * Get session by token\n */\n getSession(sessionToken: string): Session | null {\n return this.sessions.get(sessionToken) || null;\n }\n\n /**\n * Invalidate session\n */\n invalidateSession(sessionToken: string): void {\n const session = this.sessions.get(sessionToken);\n if (session) {\n console.log(`[iframe][Session] Invalidated session for origin: ${session.origin}`);\n this.sessions.delete(sessionToken);\n }\n }\n\n /**\n * Get all sessions for a project\n */\n getProjectSessions(projectId: string): Session[] {\n return Array.from(this.sessions.values()).filter(\n (session) => session.projectId === projectId\n );\n }\n\n /**\n * Generate cryptographically secure session token\n */\n private generateSecureToken(): string {\n const buffer = new Uint8Array(32);\n crypto.getRandomValues(buffer);\n return Array.from(buffer, (byte) => byte.toString(16).padStart(2, '0')).join('');\n }\n\n /**\n * Cleanup expired sessions\n */\n private cleanupExpiredSessions(): void {\n const now = Date.now();\n let cleanedCount = 0;\n\n for (const [token, session] of this.sessions.entries()) {\n const age = now - session.lastActivity;\n if (age > this.SESSION_TIMEOUT) {\n this.sessions.delete(token);\n cleanedCount++;\n }\n }\n\n if (cleanedCount > 0) {\n console.log(`[iframe][Session] Cleaned up ${cleanedCount} expired sessions`);\n }\n }\n\n /**\n * Check if there is an active session for a given origin\n */\n hasSession(origin: string): boolean {\n const now = Date.now();\n\n for (const session of this.sessions.values()) {\n if (session.origin === origin) {\n // Check if session is not expired\n const age = now - session.lastActivity;\n if (age <= this.SESSION_TIMEOUT) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Get session statistics\n */\n getStats(): { total: number; byProject: Record<string, number> } {\n const stats: { total: number; byProject: Record<string, number> } = {\n total: this.sessions.size,\n byProject: {},\n };\n\n for (const session of this.sessions.values()) {\n stats.byProject[session.projectId] = (stats.byProject[session.projectId] || 0) + 1;\n }\n\n return stats;\n }\n}\n","/**\n * Storage Manager for iframe\n *\n * Manages key shares in ISOLATED localStorage (auth.lumiapassport.com origin)\n * This is the CRITICAL security boundary - keys never leave this origin\n */\n\nimport type { KeyshareData } from './types';\n\nexport class StorageManager {\n private readonly storage: Storage;\n\n constructor() {\n if (typeof window === 'undefined' || !window.localStorage) {\n throw new Error('localStorage not available in iframe');\n }\n this.storage = window.localStorage;\n\n console.log('[iframe][Storage] Initialized');\n console.log('[iframe][Storage] Origin:', window.location.origin);\n }\n\n /**\n * Save keyshare to IFRAME localStorage\n * CRITICAL: This is the secure isolated storage\n */\n saveKeyshare(userId: string, data: KeyshareData): void {\n try {\n const keyshareKey = `tss.${userId}.keyshare`;\n\n // Store keyshare data\n this.storage.setItem(keyshareKey, JSON.stringify({\n keyshare_b64: data.keyshare_b64,\n }));\n\n // Store owner address\n this.storage.setItem(`tss.${userId}.ownerAddress`, data.ownerAddress);\n\n // Store session ID\n this.storage.setItem(`tss.${userId}.sessionId`, data.sessionId);\n\n console.log(`[iframe][Storage] ✅ Saved keyshare for user: ${userId}`);\n console.log(`[iframe][Storage] Storage origin: ${window.location.origin}`);\n } catch (error) {\n console.error('[iframe][Storage] Failed to save keyshare:', error);\n throw new Error(`Failed to save keyshare: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Load keyshare from IFRAME localStorage\n */\n loadKeyshare(userId: string): KeyshareData | null {\n try {\n const keyshareKey = `tss.${userId}.keyshare`;\n const keyshareData = this.storage.getItem(keyshareKey);\n\n if (!keyshareData) {\n console.log(`[iframe][Storage] No keyshare found for user: ${userId}`);\n return null;\n }\n\n const parsed = JSON.parse(keyshareData);\n const ownerAddress = this.storage.getItem(`tss.${userId}.ownerAddress`);\n const sessionId = this.storage.getItem(`tss.${userId}.sessionId`);\n\n if (!ownerAddress || !sessionId) {\n console.error('[iframe][Storage] Missing owner address or session ID');\n return null;\n }\n\n return {\n keyshare_b64: parsed.keyshare_b64,\n ownerAddress: ownerAddress as `0x${string}`,\n sessionId,\n };\n } catch (error) {\n console.error('[iframe][Storage] Failed to load keyshare:', error);\n return null;\n }\n }\n\n /**\n * Check if keyshare exists for user\n */\n hasKeyshare(userId: string): boolean {\n const keyshareKey = `tss.${userId}.keyshare`;\n const ownerAddressKey = `tss.${userId}.ownerAddress`;\n\n const hasKeyshare = this.storage.getItem(keyshareKey) !== null;\n const hasAddress = this.storage.getItem(ownerAddressKey) !== null;\n\n return hasKeyshare && hasAddress;\n }\n\n /**\n * Get owner address for user\n */\n getOwnerAddress(userId: string): `0x${string}` | null {\n const address = this.storage.getItem(`tss.${userId}.ownerAddress`);\n return address ? (address as `0x${string}`) : null;\n }\n\n /**\n * Get session ID for user\n */\n getSessionId(userId: string): string | null {\n return this.storage.getItem(`tss.${userId}.sessionId`);\n }\n\n /**\n * Remove keyshare for user\n */\n removeKeyshare(userId: string): void {\n try {\n this.storage.removeItem(`tss.${userId}.keyshare`);\n this.storage.removeItem(`tss.${userId}.ownerAddress`);\n this.storage.removeItem(`tss.${userId}.sessionId`);\n\n // Remove any DKG-related keys\n const allKeys = Object.keys(this.storage);\n const userKeys = allKeys.filter(key => key.startsWith(`tss.${userId}.`));\n userKeys.forEach(key => this.storage.removeItem(key));\n\n console.log(`[iframe][Storage] ✅ Removed keyshare for user: ${userId}`);\n } catch (error) {\n console.error('[iframe][Storage] Failed to remove keyshare:', error);\n throw new Error(`Failed to remove keyshare: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * List all users with keyshares (for debugging)\n */\n listUsers(): string[] {\n const allKeys = Object.keys(this.storage);\n const keyshareKeys = allKeys.filter(key => key.endsWith('.keyshare'));\n\n return keyshareKeys.map(key => {\n const match = key.match(/^tss\\.(.+)\\.keyshare$/);\n return match ? match[1] : null;\n }).filter(Boolean) as string[];\n }\n\n /**\n * Get storage statistics (for debugging)\n */\n getStats(): { totalKeys: number; users: number; storageSize: number } {\n const allKeys = Object.keys(this.storage);\n const users = this.listUsers();\n\n let storageSize = 0;\n allKeys.forEach(key => {\n const value = this.storage.getItem(key);\n if (value) {\n storageSize += key.length + value.length;\n }\n });\n\n return {\n totalKeys: allKeys.length,\n users: users.length,\n storageSize,\n };\n }\n}\n","/**\n * Trusted Apps Manager\n *\n * Manages list of trusted applications that don't require transaction confirmation\n * Data is stored in iframe's localStorage (isolated from parent domain)\n */\n\nexport interface TrustedApp {\n userId: string;\n projectId: string;\n origin: string;\n trustedAt: number;\n}\n\nconst STORAGE_KEY = 'lumia_passport_trusted_apps';\n\nexport class TrustedAppsManager {\n /**\n * Check if app is trusted by user\n */\n isTrusted(userId: string, projectId: string, origin: string): boolean {\n const trustedApps = this.getTrustedApps();\n const result = trustedApps.some(\n (app) =>\n app.userId === userId &&\n app.projectId === projectId &&\n app.origin === origin\n );\n console.log('[TrustedApps] isTrusted check:', { userId, projectId, origin, result, totalApps: trustedApps.length });\n return result;\n }\n\n /**\n * Add app to trusted list\n */\n addTrustedApp(userId: string, projectId: string, origin: string): void {\n console.log('[TrustedApps] Adding trusted app:', { userId, projectId, origin });\n\n const trustedApps = this.getTrustedApps();\n\n // Check if already trusted\n const exists = trustedApps.some(\n (app) =>\n app.userId === userId &&\n app.projectId === projectId &&\n app.origin === origin\n );\n\n if (exists) {\n console.log('[TrustedApps] App already trusted');\n return;\n }\n\n // Add new trusted app\n trustedApps.push({\n userId,\n projectId,\n origin,\n trustedAt: Date.now(),\n });\n\n this.saveTrustedApps(trustedApps);\n console.log('[TrustedApps] ✅ App added to trusted list');\n }\n\n /**\n * Remove app from trusted list\n */\n removeTrustedApp(userId: string, projectId: string, origin: string): void {\n console.log('[TrustedApps] Removing trusted app:', { userId, projectId, origin });\n\n const trustedApps = this.getTrustedApps();\n const filtered = trustedApps.filter(\n (app) =>\n !(\n app.userId === userId &&\n app.projectId === projectId &&\n app.origin === origin\n )\n );\n\n this.saveTrustedApps(filtered);\n console.log('[TrustedApps] ✅ App removed from trusted list');\n }\n\n /**\n * Get all trusted apps for a user\n */\n getTrustedAppsForUser(userId: string): TrustedApp[] {\n console.log('[TrustedApps] Getting trusted apps for user:', userId);\n const trustedApps = this.getTrustedApps();\n console.log('[TrustedApps] Total apps in storage:', trustedApps.length, trustedApps);\n const filtered = trustedApps.filter((app) => app.userId === userId);\n console.log('[TrustedApps] Filtered apps for user:', filtered.length, filtered);\n return filtered;\n }\n\n /**\n * Clear all trusted apps for a user\n */\n clearTrustedAppsForUser(userId: string): void {\n console.log('[TrustedApps] Clearing all trusted apps for user:', userId);\n\n const trustedApps = this.getTrustedApps();\n const filtered = trustedApps.filter((app) => app.userId !== userId);\n\n this.saveTrustedApps(filtered);\n console.log('[TrustedApps] ✅ Trusted apps cleared for user');\n }\n\n /**\n * Get all trusted apps from storage\n */\n private getTrustedApps(): TrustedApp[] {\n try {\n const data = localStorage.getItem(STORAGE_KEY);\n console.log('[TrustedApps] Raw storage data:', data);\n if (!data) {\n console.log('[TrustedApps] No data in storage');\n return [];\n }\n\n const apps = JSON.parse(data);\n console.log('[TrustedApps] Parsed apps:', apps);\n return Array.isArray(apps) ? apps : [];\n } catch (error) {\n console.error('[TrustedApps] Error reading trusted apps:', error);\n return [];\n }\n }\n\n /**\n * Save trusted apps to storage\n */\n private saveTrustedApps(apps: TrustedApp[]): void {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(apps));\n } catch (error) {\n console.error('[TrustedApps] Error saving trusted apps:', error);\n throw new Error('Failed to save trusted apps');\n }\n }\n}\n","/**\n * Signing Manager for iframe\n *\n * Handles transaction signing with user confirmation inside secure iframe context\n */\n\nimport init, * as tss from 'dkls23-wasm';\nimport type { Transaction, ProjectInfo, RiskAssessment, KeyshareData, SignTypedDataRequest, EIP712TypedData } from './types';\nimport { StorageManager } from './storage-manager';\nimport { TrustedAppsManager } from './trusted-apps-manager';\nimport { TokenRefreshApiClient } from './token-refresh-client';\n\ninterface ProjectMetadata {\n id: string;\n name: string;\n description: string;\n logo: string;\n}\n\ninterface CachedMetadata {\n data: ProjectMetadata;\n timestamp: number;\n}\n\nexport class SigningManager extends TokenRefreshApiClient {\n private wasmLoaded: boolean = false;\n private storage: StorageManager;\n private trustedApps: TrustedAppsManager;\n private explorerUrl: string = 'https://beam-explorer.lumia.org';\n private readonly METADATA_API_URL = 'https://dashboard.lumiapassport.com/api/public/project';\n private readonly METADATA_CACHE_TTL = 3600000; // 1 hour in milliseconds\n private metadataCache: Map<string, CachedMetadata> = new Map();\n\n constructor() {\n super();\n this.storage = new StorageManager();\n this.trustedApps = new TrustedAppsManager();\n }\n\n /**\n * Initialize WASM module\n */\n async initialize(): Promise<void> {\n if (this.wasmLoaded) return;\n\n try {\n await init();\n this.wasmLoaded = true;\n (globalThis as any).__tss_wasm_api__ = tss;\n } catch (error) {\n console.error('[iframe][Sign] Failed to load WASM:', error);\n throw new Error('Failed to initialize signing WASM module');\n }\n }\n\n /**\n * Check if transaction is a minimal safe operation (account deployment)\n *\n * Minimal operations are safe to auto-approve without user consent:\n * - to: 0x0000000000000000000000000000000000000000 (burn address)\n * - value: 0 (no funds transfer)\n * - data: 0x (no contract call)\n *\n * This is used for smart account deployment without spending any funds.\n */\n private isMinimalSafeOperation(transaction: Transaction): boolean {\n const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n const ZERO_VALUE = '0';\n const EMPTY_DATA = '0x';\n\n const to = transaction.to?.toLowerCase();\n const value = transaction.value?.toString() || '0';\n const data = transaction.data?.toLowerCase() || '0x';\n\n const isMinimal =\n to === ZERO_ADDRESS.toLowerCase() &&\n (value === ZERO_VALUE || value === '0x0') &&\n (data === EMPTY_DATA || data === '0x0');\n\n if (isMinimal) {\n console.log('[iframe][Sign] Detected minimal safe operation:', {\n to,\n value,\n data,\n reason: 'Account deployment - no funds at risk'\n });\n }\n\n return isMinimal;\n }\n\n /**\n * Fetch project metadata from public API (with caching)\n */\n private async fetchProjectMetadata(projectId: string): Promise<ProjectMetadata | null> {\n // Check cache first\n const cached = this.metadataCache.get(projectId);\n const now = Date.now();\n\n if (cached && (now - cached.timestamp) < this.METADATA_CACHE_TTL) {\n console.log(`[iframe][Sign] Using cached metadata for project: ${cached.data.name}`);\n return cached.data;\n }\n\n // Fetch from API\n try {\n const response = await fetch(`${this.METADATA_API_URL}/${projectId}/metadata`);\n\n if (!response.ok) {\n console.warn(`[iframe][Sign] Failed to fetch project metadata: ${response.status}`);\n return null;\n }\n\n const metadata: ProjectMetadata = await response.json();\n console.log(`[iframe][Sign] Fetched metadata for project: ${metadata.name}`);\n\n // Cache the result\n this.metadataCache.set(projectId, {\n data: metadata,\n timestamp: now,\n });\n\n return metadata;\n } catch (error) {\n console.error('[iframe][Sign] Error fetching project metadata:', error);\n return null;\n }\n }\n\n /**\n * Sign transaction with user confirmation\n */\n async signTransaction(\n userId: string,\n projectId: string,\n origin: string,\n transaction: Transaction,\n accessToken?: string,\n userProfile?: { avatar?: string | null; displayName?: string | null }\n ): Promise<`0x${string}`> {\n if (!this.wasmLoaded) {\n await this.initialize();\n }\n\n // Load keyshare from IFRAME localStorage\n const keyshareData = this.storage.loadKeyshare(userId);\n if (!keyshareData) {\n throw new Error('No keyshare found. Please complete DKG first.');\n }\n\n // Get project info (TODO: from backend API)\n const projectInfo: ProjectInfo = {\n id: projectId,\n name: 'Application',\n logoUrl: '',\n website: origin,\n domains: [origin],\n };\n\n // Check if this is a minimal safe operation (account deployment)\n const isMinimalOperation = this.isMinimalSafeOperation(transaction);\n\n // Check if app is trusted (auto-approve without confirmation)\n const isTrusted = this.trustedApps.isTrusted(userId, projectId, origin);\n\n // Skip consent for minimal operations (safe account deployment)\n if (!isTrusted && !isMinimalOperation) {\n // Risk assessment\n const risk = await this.assessRisk(transaction);\n\n // Show user confirmation dialog\n const confirmResult = await this.showConfirmationDialog(\n userId,\n projectId,\n projectInfo,\n origin,\n transaction,\n risk,\n userProfile\n );\n\n if (!confirmResult.confirmed) {\n throw new Error('User rejected transaction');\n }\n\n // If user checked \"trust this app\", save it\n if (confirmResult.trustApp) {\n this.trustedApps.addTrustedApp(userId, projectId, origin);\n }\n } else if (isMinimalOperation) {\n console.log('[iframe][Sign] Auto-approving minimal safe operation (account deployment)');\n }\n\n // Use pre-computed digest if provided, otherwise compute hash\n // IMPORTANT: For UserOperations, digest32 is already computed by client\n const digest32 = transaction.digest32 || this.computeTransactionHash(transaction);\n\n // Perform MPC signing\n const signature = await this.performMPCSigning(userId, keyshareData, digest32, projectId, accessToken);\n\n return signature;\n }\n\n /**\n * Perform MPC signing protocol\n */\n private async performMPCSigning(\n userId: string,\n keyshareData: KeyshareData,\n digest32: `0x${string}`,\n projectId: string,\n accessToken?: string\n ): Promise<`0x${string}`> {\n const keyshare = keyshareData.keyshare_b64;\n const sessionId = keyshareData.sessionId;\n\n // Convert digest to base64\n const digestHex = digest32.startsWith('0x') ? digest32.slice(2) : digest32;\n const digestBytes = this.hexToBytes(digestHex);\n const digestB64 = btoa(String.fromCharCode(...digestBytes));\n\n const CHAIN_PATH = 'm';\n\n // Step 1: Client starts signing locally\n const clientSignStartResult = (tss as any).sign_start(keyshare, digestB64, CHAIN_PATH);\n\n if (!Array.isArray(clientSignStartResult) || clientSignStartResult.length < 2) {\n throw new Error('Invalid sign_start result format');\n }\n\n let clientState = clientSignStartResult[0];\n const clientMsg1 = clientSignStartResult[1];\n\n // Step 2: Server starts signing\n const serverStartResponse = await this.apiCall('POST', `/api/tss/${userId}/sign/start`, {\n sessionId,\n digest32,\n chainPath: CHAIN_PATH,\n }, projectId, accessToken);\n\n const serverMsg1 = serverStartResponse.msg1;\n\n if (!serverMsg1?.kind || !serverMsg1.data_b64) {\n throw new Error('Invalid server msg1 format');\n }\n\n // Execute 4-round signing protocol\n // Round 2\n const clientR2Result = (tss as any).sign_handle(\n JSON.stringify({ bytes_b64: clientState.bytes_b64 }),\n JSON.stringify(serverMsg1)\n );\n clientState = clientR2Result[0];\n const clientMsg2 = clientR2Result[1];\n\n const serverR2Response = await this.apiCall('POST', `/api/tss/${userId}/sign/round`, {\n sessionId,\n clientMsg: clientMsg1,\n }, projectId, accessToken);\n const serverMsg2 = this.extractServerMessage(serverR2Response);\n\n // Round 3\n const clientR3Result = (tss as any).sign_handle(\n JSON.stringify({ bytes_b64: clientState.bytes_b64 }),\n JSON.stringify(serverMsg2)\n );\n clientState = clientR3Result[0];\n const clientMsg3 = clientR3Result[1];\n\n const serverR3Response = await this.apiCall('POST', `/api/tss/${userId}/sign/round`, {\n sessionId,\n clientMsg: clientMsg2,\n }, projectId, accessToken);\n const serverMsg3 = this.extractServerMessage(serverR3Response);\n\n // Round 4 (Final)\n const clientFinalResult = (tss as any).sign_handle(\n JSON.stringify({ bytes_b64: clientState.bytes_b64 }),\n JSON.stringify(serverMsg3)\n );\n\n if (!Array.isArray(clientFinalResult) || clientFinalResult.length < 3) {\n throw new Error('Invalid final sign_handle result');\n }\n\n const clientSignature = clientFinalResult[2];\n\n // Send final message to server\n await this.apiCall('POST', `/api/tss/${userId}/sign/round`, {\n sessionId,\n clientMsg: clientMsg3,\n }, projectId, accessToken);\n\n // Format signature\n const signature = this.formatSignature(clientSignature);\n\n return signature;\n }\n\n /**\n * Show transaction confirmation dialog\n */\n private async showConfirmationDialog(\n userId: string,\n projectId: string,\n project: ProjectInfo,\n origin: string,\n transaction: Transaction,\n risk: RiskAssessment,\n userProfile?: { avatar?: string | null; displayName?: string | null }\n ): Promise<{ confirmed: boolean; trustApp: boolean }> {\n // Request parent to show iframe\n this.showIframe();\n\n // Fetch project metadata\n const metadata = await this.fetchProjectMetadata(projectId);\n\n return new Promise((resolve) => {\n const modal = this.createConfirmationModal(userId, projectId, project, origin, transaction, risk, metadata, userProfile);\n\n const confirmBtn = modal.querySelector('.confirm-btn') as HTMLButtonElement;\n const cancelBtn = modal.querySelector('.cancel-btn') as HTMLButtonElement;\n const trustCheckbox = modal.querySelector('.trust-app-checkbox') as HTMLInputElement;\n\n confirmBtn?.addEventListener('click', (e) => {\n if (e.isTrusted) {\n const trustApp = trustCheckbox?.checked || false;\n modal.remove();\n this.hideIframe();\n resolve({ confirmed: true, trustApp });\n }\n });\n\n cancelBtn?.addEventListener('click', () => {\n modal.remove();\n this.hideIframe();\n resolve({ confirmed: false, trustApp: false });\n });\n\n document.body.appendChild(modal);\n });\n }\n\n /**\n * Create confirmation modal UI\n */\n private createConfirmationModal(\n userId: string,\n projectId: string,\n project: ProjectInfo,\n origin: string,\n transaction: Transaction,\n risk: RiskAssessment,\n metadata: ProjectMetadata | null,\n userProfile?: { avatar?: string | null; displayName?: string | null }\n ): HTMLElement {\n const modal = document.createElement('div');\n modal.className = 'transaction-confirmation-modal';\n\n const isVerifiedOrigin = project.domains.includes(origin);\n const isUserOp = !!transaction.userOpDetails;\n\n // User avatar/logo for right side\n const userAvatar = userProfile?.avatar;\n const userName = userProfile?.displayName || 'Lumia Passport';\n\n // Simplified UI - показываем только важное для пользователя\n const isSponsored = isUserOp && !!transaction.userOpDetails?.paymaster;\n const estimatedCost = isSponsored ? '0 (Sponsored)' : 'Free (Sponsored Transaction)';\n\n // Use metadata if available, fallback to project info\n const displayName = metadata?.name || project.name;\n const displayLogo = metadata?.logo || project.logoUrl;\n\n // Get addresses\n const fromAddress = transaction.userOpDetails?.sender;\n const toAddress = transaction.userOpDetails?.callTarget || transaction.to; // Use callTarget from userOpDetails if available\n\n // Format transaction value (convert from wei to readable format)\n const formatValue = (valueWei: string): string => {\n try {\n const value = BigInt(valueWei);\n if (value === 0n) return '0';\n\n // Convert wei to tokens (18 decimals)\n const tokens = Number(value) / 1e18;\n\n // Format with appropriate precision\n if (tokens >= 1) {\n return tokens.toFixed(4).replace(/\\.?0+$/, ''); // Remove trailing zeros\n } else {\n return tokens.toFixed(8).replace(/\\.?0+$/, '');\n }\n } catch {\n return '0';\n }\n };\n\n const transactionValue = transaction.value || '0';\n const formattedValue = formatValue(transactionValue);\n const hasValue = BigInt(transactionValue) > 0n;\n\n modal.innerHTML = `\n <div class=\"modal-overlay\">\n <div class=\"modal-content\">\n <!-- Header with logos -->\n <div class=\"auth-header\">\n <div class=\"logo-container\">\n ${displayLogo ? `<img src=\"${displayLogo}\" alt=\"${displayName}\" class=\"app-logo\" />` : '<div class=\"app-logo-placeholder\"></div>'}\n <div class=\"logo-connector\">\n <svg width=\"24\" height=\"16\" viewBox=\"0 0 24 16\" fill=\"currentColor\">\n <path d=\"M23.7071 8.70711C24.0976 8.31658 24.0976 7.68342 23.7071 7.29289L17.3431 0.928932C16.9526 0.538408 16.3195 0.538408 15.9289 0.928932C15.5384 1.31946 15.5384 1.95262 15.9289 2.34315L21.5858 8L15.9289 13.6569C15.5384 14.0474 15.5384 14.6805 15.9289 15.0711C16.3195 15.4616 16.9526 15.4616 17.3431 15.0711L23.7071 8.70711ZM0 9H23V7H0V9Z\"/>\n </svg>\n </div>\n ${userAvatar ? `<img src=\"${userAvatar}\" alt=\"${userName}\" class=\"lumia-logo user-avatar\" />` : '<img src=\"./lumia-logo.svg\" alt=\"Lumia Passport\" class=\"lumia-logo\" />'}\n </div>\n </div>\n\n <!-- Transaction title -->\n <h2 class=\"auth-title\">Confirm Transaction</h2>\n\n <!-- Application info -->\n <div class=\"auth-description\">\n <div class=\"domain-info ${isVerifiedOrigin ? 'verified' : 'unverified'}\">\n <span class=\"domain-label\">\n ${isVerifiedOrigin ? '✓ Verified:' : '⚠️ Unverified:'}\n </span>\n <span class=\"domain-value\">${origin}</span>\n </div>\n </div>\n\n <!-- Transaction details box -->\n <div class=\"permissions-box\">\n ${fromAddress ? `\n <div class=\"detail-row\" style=\"margin-bottom: 0.5rem;\">\n <div style=\"color: var(--iframe-text-secondary); font-size: 0.875rem; margin-bottom: 0.25rem;\"><strong>From:</strong></div>\n <code style=\"font-size: 0.75rem; word-break: break-all; display: block; color: var(--iframe-text);\">${fromAddress}</code>\n </div>\n ` : ''}\n\n ${toAddress ? `\n <div class=\"detail-row\" style=\"margin-bottom: 0.5rem;\">\n <div style=\"color: var(--iframe-text-secondary); font-size: 0.875rem; margin-bottom: 0.25rem;\"><strong>To:</strong></div>\n <code style=\"font-size: 0.75rem; word-break: break-all; display: block; color: var(--iframe-text);\">${toAddress}</code>\n </div>\n ` : ''}\n\n ${hasValue ? `\n <div class=\"detail-row\" style=\"margin-bottom: 0.5rem;\">\n <span style=\"color: var(--iframe-text-secondary);\"><strong>Amount:</strong></span>\n <strong style=\"color: var(--iframe-text); font-size: 1rem;\">${formattedValue} LUMIA</strong>\n </div>\n ` : ''}\n\n ${isUserOp && transaction.userOpDetails?.callData && transaction.userOpDetails.callData !== '0x' ? `\n <div class=\"detail-row\" style=\"margin-bottom: 0.5rem;\">\n <span style=\"color: var(--iframe-text-secondary);\"><strong>Action:</strong></span>\n <span style=\"color: var(--iframe-text);\">Contract Interaction</span>\n </div>\n ` : ''}\n\n <div class=\"detail-row\" style=\"margin-bottom: 0.5rem;\">\n <span style=\"color: var(--iframe-text-secondary);\"><strong>Estimated Cost:</strong></span>\n <strong style=\"color: #10b981;\">${estimatedCost}</strong>\n </div>\n\n ${isSponsored ? `\n <div class=\"detail-row\" style=\"background: #d1fae5; border-radius: 6px; padding: 0.75rem; margin-top: 0.5rem;\">\n <span style=\"color: #047857;\">✓ Gas fees will be paid by the application (no cost to you)</span>\n </div>\n ` : ''}\n </div>\n\n ${risk.level !== 'LOW' ? `\n <div class=\"security-warning\">\n <strong>⚠️ ${risk.level} RISK</strong>\n ${risk.reasons.map(r => `<div>• ${r}</div>`).join('')}\n </div>\n ` : `\n <div class=\"security-warning\">\n <strong>⚠️ Warning:</strong> Please verify this transaction carefully before confirming.\n </div>\n `}\n\n <div class=\"trust-app-section\">\n <label class=\"trust-app-label\">\n <input type=\"checkbox\" class=\"trust-app-checkbox\" />\n <span>Trust this application and skip confirmation for future transactions</span>\n </label>\n </div>\n\n <!-- Action buttons -->\n <div class=\"actions\">\n <button class=\"cancel-btn\">Reject</button>\n <button class=\"confirm-btn\">Confirm</button>\n </div>\n\n <!-- Footer notice -->\n <div class=\"auth-footer\">\n <p class=\"footer-note\">You can manage trusted applications in your Lumia Passport settings.</p>\n </div>\n </div>\n </div>\n `;\n\n return modal;\n }\n\n /**\n * Assess transaction risk\n *\n * TODO: Implement backend-based risk assessment with real-time price conversion\n * - Get current LUMIA/USD price from API\n * - Calculate transaction value in USD\n * - Use dynamic thresholds based on USD value (e.g., >$100 = HIGH)\n * - Consider additional factors: recipient reputation, contract verification, etc.\n */\n private async assessRisk(transaction: Transaction): Promise<RiskAssessment> {\n const reasons: string[] = [];\n let score = 0;\n\n // Convert wei to LUMIA (18 decimals)\n const valueWei = BigInt(transaction.value || '0');\n const valueLumia = Number(valueWei) / 1e18;\n\n // Check high value (threshold: 10 LUMIA)\n // TODO: Replace with USD-based threshold after implementing backend price conversion\n if (valueLumia > 10) {\n score += 20;\n // Format with appropriate precision\n const formattedValue = valueLumia >= 1\n ? valueLumia.toFixed(4).replace(/\\.?0+$/, '')\n : valueLumia.toFixed(8).replace(/\\.?0+$/, '');\n reasons.push(`High value transaction (${formattedValue} LUMIA)`);\n }\n\n // Check if contract interaction\n if (transaction.data && transaction.data !== '0x' && transaction.data.length > 2) {\n score += 10;\n reasons.push('Contract interaction detected');\n }\n\n // Determine risk level\n let level: RiskAssessment['level'];\n if (score >= 50) level = 'CRITICAL';\n else if (score >= 30) level = 'HIGH';\n else if (score >= 15) level = 'MEDIUM';\n else level = 'LOW';\n\n return { level, score, reasons };\n }\n\n /**\n * Compute transaction hash (simplified, adjust for your needs)\n */\n private computeTransactionHash(transaction: Transaction): `0x${string}` {\n // TODO: Implement proper transaction hash computation\n // For now, return a placeholder\n const encoder = new TextEncoder();\n const data = encoder.encode(JSON.stringify(transaction));\n\n // Simple hash (in production, use proper transaction encoding)\n let hash = 0;\n for (let i = 0; i < data.length; i++) {\n hash = ((hash << 5) - hash) + data[i];\n hash = hash & hash;\n }\n\n const hashHex = Math.abs(hash).toString(16).padStart(64, '0');\n return `0x${hashHex}` as `0x${string}`;\n }\n\n private formatValue(value: string): string {\n try {\n const eth = parseFloat(value);\n return eth.toFixed(6);\n } catch {\n return value;\n }\n }\n\n private formatSignature(sig: any): `0x${string}` {\n if (typeof sig === 'string') return sig as `0x${string}`;\n\n if (sig && typeof sig === 'object' && sig.r_b64 && sig.s_b64) {\n const rBytes = Uint8Array.from(atob(sig.r_b64), (c) => c.charCodeAt(0));\n const sBytes = Uint8Array.from(atob(sig.s_b64), (c) => c.charCodeAt(0));\n\n const r = Array.from(rBytes).map((b) => b.toString(16).padStart(2, '0')).join('');\n const s = Array.from(sBytes).map((b) => b.toString(16).padStart(2, '0')).join('');\n const v = (Number(sig.recid) + 27).toString(16).padStart(2, '0');\n\n return `0x${r}${s}${v}` as `0x${string}`;\n }\n\n throw new Error('Invalid signature format');\n }\n\n private hexToBytes(hex: string): Uint8Array {\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = parseInt(hex.substring(i, i + 2), 16);\n }\n return bytes;\n }\n\n private extractServerMessage(response: any): any {\n return response?.msgNext || response?.msg_next || response?.msg || null;\n }\n\n /**\n * Sign EIP712 typed data with user confirmation\n */\n async signTypedData(\n userId: string,\n projectId: string,\n origin: string,\n typedData: EIP712TypedData,\n digest32: `0x${string}`,\n accessToken?: string,\n userProfile?: { avatar?: string | null; displayName?: string | null }\n ): Promise<`0x${string}`> {\n console.log('[iframe][Sign] EIP712 signing request:', { userId, projectId, origin, primaryType: typedData.primaryType });\n\n await this.initialize();\n\n const projectInfo: ProjectInfo = {\n id: projectId,\n name: 'Application',\n logoUrl: '',\n website: origin,\n domains: [origin],\n };\n\n // Check if app is trusted (auto-approve without confirmation)\n const isTrusted = this.trustedApps.isTrusted(userId, projectId, origin);\n\n if (!isTrusted) {\n // Show user confirmation dialog for EIP712 message\n const confirmResult = await this.showEIP712ConfirmationDialog(\n userId,\n projectId,\n projectInfo,\n origin,\n typedData,\n userProfile\n );\n\n if (!confirmResult.confirmed) {\n throw new Error('User rejected signature request');\n }\n\n // If user checked \"trust this app\", save it\n if (confirmResult.trustApp) {\n this.trustedApps.addTrustedApp(userId, projectId, origin);\n }\n }\n\n // Load keyshare from IFRAME localStorage\n const keyshareData = this.storage.loadKeyshare(userId);\n if (!keyshareData) {\n throw new Error('No keyshare found. Please complete DKG first.');\n }\n\n // Perform MPC signing\n const signature = await this.performMPCSigning(userId, keyshareData, digest32, projectId, accessToken);\n\n console.log('[iframe][Sign] EIP712 signature generated');\n return signature;\n }\n\n /**\n * Show EIP712 confirmation dialog\n */\n private async showEIP712ConfirmationDialog(\n userId: string,\n projectId: string,\n project: ProjectInfo,\n origin: string,\n typedData: EIP712TypedData,\n userProfile?: { avatar?: string | null; displayName?: string | null }\n ): Promise<{ confirmed: boolean; trustApp: boolean }> {\n // Request parent to show iframe\n this.showIframe();\n\n // Fetch project metadata for better UX\n const metadata = await this.fetchProjectMetadata(projectId);\n\n return new Promise((resolve) => {\n const modal = this.createEIP712ConfirmationModal(userId, projectId, project, origin, typedData, metadata, userProfile);\n\n const confirmBtn = modal.querySelector('.confirm-btn') as HTMLButtonElement;\n const cancelBtn = modal.querySelector('.cancel-btn') as HTMLButtonElement;\n const trustCheckbox = modal.querySelector('.trust-app-checkbox') as HTMLInputElement;\n\n confirmBtn?.addEventListener('click', (e) => {\n if (e.isTrusted) {\n const trustApp = trustCheckbox?.checked || false;\n modal.remove();\n this.hideIframe();\n resolve({ confirmed: true, trustApp });\n }\n });\n\n cancelBtn?.addEventListener('click', () => {\n modal.remove();\n this.hideIframe();\n resolve({ confirmed: false, trustApp: false });\n });\n\n document.body.appendChild(modal);\n });\n }\n\n /**\n * Create EIP712 confirmation modal UI (similar to MetaMask)\n */\n private createEIP712ConfirmationModal(\n userId: string,\n projectId: string,\n project: ProjectInfo,\n origin: string,\n typedData: EIP712TypedData,\n metadata: ProjectMetadata | null,\n userProfile?: { avatar?: string | null; displayName?: string | null }\n ): HTMLElement {\n const modal = document.createElement('div');\n modal.className = 'eip712-confirmation-modal';\n\n const isVerifiedOrigin = project.domains.includes(origin);\n\n // User avatar/logo for right side\n const userAvatar = userProfile?.avatar;\n const userName = userProfile?.displayName || 'Lumia Passport';\n\n // Helper function to format field values\n const formatFieldValue = (value: any): string => {\n if (Array.isArray(value)) {\n return `[${value.map(v => formatFieldValue(v)).join(', ')}]`;\n }\n if (typeof value === 'bigint') {\n return value.toString();\n }\n if (typeof value === 'object' && value !== null) {\n return JSON.stringify(value, null, 2);\n }\n return String(value);\n };\n\n // Create message fields HTML\n const messageFields = Object.entries(typedData.message)\n .map(([key, value]) => `\n <div class=\"eip712-field\">\n <div class=\"field-name\">${key}:</div>\n <div class=\"field-value\">${formatFieldValue(value)}</div>\n </div>\n `)\n .join('');\n\n // Create domain fields HTML\n const domainFields = Object.entries(typedData.domain)\n .filter(([_, value]) => value !== undefined)\n .map(([key, value]) => `\n <div class=\"eip712-field\">\n <div class=\"field-name\">${key}:</div>\n <div class=\"field-value\">${formatFieldValue(value)}</div>\n </div>\n `)\n .join('');\n\n modal.innerHTML = `\n <div class=\"modal-overlay\">\n <div class=\"modal-content eip712-modal\">\n <!-- Header -->\n <div class=\"auth-header\">\n <div class=\"logo-container\">\n ${metadata?.logo ? `<img src=\"${metadata.logo}\" alt=\"${metadata.name}\" class=\"project-logo\" />` : '<div class=\"project-logo-placeholder\">🔐</div>'}\n <span class=\"arrow-icon\">→</span>\n ${userAvatar ? `<img src=\"${userAvatar}\" alt=\"${userName}\" class=\"lumia-logo user-avatar\" style=\"width: 40px; height: 40px;\" />` : '<div class=\"lumia-logo\">L</div>'}\n </div>\n <h2 class=\"modal-title\">Signature Request</h2>\n <p class=\"origin-text\">\n ${isVerifiedOrigin ? '<span class=\"verified-badge\">✓</span>' : ''}\n ${origin}\n </p>\n </div>\n\n <!-- EIP712 Message Content -->\n <div class=\"eip712-content\">\n <details class=\"eip712-details\">\n <summary>Advanced details</summary>\n\n <div class=\"section-title\">📝 Message</div>\n <div class=\"eip712-section\">\n <div class=\"section-subtitle\">${typedData.primaryType}</div>\n ${messageFields}\n </div>\n\n <div class=\"section-title\" style=\"margin-top: 16px;\">🔍 Domain</div>\n <div class=\"eip712-section\">\n ${domainFields}\n </div>\n\n <div class=\"section-title\" style=\"margin-top: 16px;\">📋 Full Message</div>\n <pre class=\"eip712-raw\"><code>${JSON.stringify(typedData.message, null, 2)}</code></pre>\n </details>\n </div>\n\n <!-- Trust App Option -->\n <div class=\"trust-app-section\">\n <label class=\"trust-app-label\">\n <input type=\"checkbox\" class=\"trust-app-checkbox\" />\n <span>Trust this application and skip confirmation for future signatures</span>\n </label>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"actions\">\n <button class=\"cancel-btn\">Reject</button>\n <button class=\"confirm-btn\">Sign</button>\n </div>\n\n <!-- Footer Notice -->\n <div class=\"footer-notice\">\n <p class=\"footer-note\">Only sign messages from applications you trust.</p>\n </div>\n </div>\n </div>\n `;\n\n return modal;\n }\n\n /**\n * Show iframe (notify parent)\n */\n private showIframe(): void {\n if (window.parent !== window) {\n window.parent.postMessage({ type: 'LUMIA_PASSPORT_SHOW_IFRAME', timestamp: Date.now() }, '*');\n }\n }\n\n /**\n * Hide iframe (notify parent)\n */\n private hideIframe(): void {\n if (window.parent !== window) {\n window.parent.postMessage({ type: 'LUMIA_PASSPORT_HIDE_IFRAME', timestamp: Date.now() }, '*');\n }\n }\n}\n","/**\n * Lumia Passport iframe Wallet - Main Entry Point\n *\n * Secure isolated context for MPC key share storage and cryptographic operations\n * Runs at auth.lumiapassport.com with origin isolation from parent domains\n */\n\nimport { AuthorizationManager } from './lib/authorization-manager'\nimport { BackupManager } from './lib/backup-manager'\nimport { DKGManager } from './lib/dkg-manager'\nimport { BinanceOnrampAPI } from './lib/onramp/binance'\nimport { RampnowOnrampAPI } from './lib/onramp/rampnow'\nimport { SecureMessenger } from './lib/secure-messenger'\nimport { SessionManager } from './lib/session-manager'\nimport { SigningManager } from './lib/signing-manager'\nimport { StorageManager } from './lib/storage-manager'\nimport { TrustedAppsManager } from './lib/trusted-apps-manager'\nimport type { SecureMessage } from './lib/types'\nimport { buildReadyIndicatorData, TemplateEngine, TemplateLoader } from './templates'\n\n// @ts-ignore - injected during build\nconst IFRAME_VERSION = '__UI_KIT_VERSION__'\n\nclass IframeWallet {\n private messenger: SecureMessenger\n private sessionManager: SessionManager\n private dkgManager: DKGManager\n private signingManager: SigningManager\n private authManager: AuthorizationManager\n private storage: StorageManager\n private trustedApps: TrustedAppsManager\n private backupManager: BackupManager\n private binance: BinanceOnrampAPI\n private rampnow: RampnowOnrampAPI\n\n constructor() {\n console.log('='.repeat(60))\n console.log(` Lumia Passport Secure Wallet - iframe version ${IFRAME_VERSION}`)\n console.log('='.repeat(60))\n\n // Apply theme colors from URL parameters\n this.applyThemeColors()\n\n this.messenger = new SecureMessenger()\n this.sessionManager = new SessionManager()\n this.dkgManager = new DKGManager()\n this.signingManager = new SigningManager()\n this.authManager = new AuthorizationManager()\n this.storage = new StorageManager()\n this.trustedApps = new TrustedAppsManager()\n this.backupManager = new BackupManager()\n\n this.binance = new BinanceOnrampAPI()\n this.rampnow = new RampnowOnrampAPI()\n }\n\n private applyThemeColors(): void {\n try {\n const params = new URLSearchParams(window.location.search)\n const bg = params.get('bg')\n const text = params.get('text')\n const textSec = params.get('textSec')\n const border = params.get('border')\n\n if (bg || text || textSec || border) {\n const root = document.documentElement\n\n if (bg) {\n root.style.setProperty('--iframe-bg', bg)\n root.style.setProperty('--iframe-modal-bg', bg)\n }\n if (text) {\n root.style.setProperty('--iframe-text', text)\n }\n if (textSec) {\n root.style.setProperty('--iframe-text-secondary', textSec)\n }\n if (border) {\n root.style.setProperty('--iframe-border', border)\n }\n\n console.log('[IframeWallet] Applied theme colors:', { bg, text, textSec, border })\n }\n } catch (error) {\n console.warn('[IframeWallet] Failed to apply theme colors:', error)\n }\n }\n\n async initialize(): Promise<void> {\n // Validate we're running in correct origin (for production)\n if (\n window.location.hostname !== 'localhost' &&\n window.location.hostname !== '127.0.0.1' &&\n !window.location.hostname.includes('lumiapassport.com')\n ) {\n console.warn('[iframe] ⚠️ Running on unexpected origin!')\n }\n\n // Initialize WASM modules\n await Promise.all([this.dkgManager.initialize(), this.signingManager.initialize()])\n\n // Setup message listener\n this.messenger.setupListener(async (message, origin) => {\n await this.handleMessage(message, origin)\n })\n\n // Display ready indicator\n this.displayReadyIndicator()\n\n // Notify parent that iframe is ready\n if (window.parent !== window) {\n window.parent.postMessage(\n {\n type: 'LUMIA_PASSPORT_IFRAME_READY',\n timestamp: Date.now()\n },\n '*' // Initial broadcast, will validate origin in subsequent messages\n )\n }\n }\n\n private async handleMessage(message: SecureMessage, origin: string): Promise<void> {\n const { type, messageId, projectId } = message\n\n console.log('[IFRAME INTERNAL] message', type, message)\n\n try {\n switch (true) {\n case type.startsWith('BINANCE_'):\n await this.binance.handleMessage(message, origin, this.messenger.sendResponse.bind(this.messenger))\n break\n\n case type.startsWith('RAMPNOW_'):\n await this.rampnow.handleMessage(message, origin, this.messenger.sendResponse.bind(this.messenger))\n break\n\n case type === 'SDK_AUTH':\n await this.handleSDKAuth(message, origin)\n break\n\n case type === 'AUTHENTICATE':\n await this.handleAuthenticate(message, origin)\n break\n\n case type === 'START_DKG':\n await this.handleStartDKG(message, origin)\n break\n\n case type === 'SIGN_TRANSACTION':\n await this.handleSignTransaction(message, origin)\n break\n\n case type === 'SIGN_TYPED_DATA':\n await this.handleSignTypedData(message, origin)\n break\n\n case type === 'GET_ADDRESS':\n await this.handleGetAddress(message, origin)\n break\n\n case type === 'CHECK_KEYSHARE':\n await this.handleCheckKeyshare(message, origin)\n break\n\n case type === 'GET_TRUSTED_APPS':\n await this.handleGetTrustedApps(message, origin)\n break\n\n case type === 'REMOVE_TRUSTED_APP':\n await this.handleRemoveTrustedApp(message, origin)\n break\n\n case type === 'CLEAR_AUTHORIZATIONS':\n await this.handleClearAuthorizations(message, origin)\n break\n\n case type === 'CREATE_BACKUP':\n await this.handleCreateBackup(message, origin)\n break\n\n case type === 'GET_BACKUP_STATUS':\n await this.handleGetBackupStatus(message, origin)\n break\n\n case type === 'GET_CLOUD_PROVIDERS':\n await this.handleGetCloudProviders(message, origin)\n break\n\n case type === 'RESTORE_BACKUP':\n await this.handleRestoreBackup(message, origin)\n break\n\n case type === 'RESTORE_FROM_FILE':\n await this.handleRestoreFromFile(message, origin)\n break\n\n case type === 'ENCRYPT_BACKUP_DATA':\n await this.handleEncryptBackupData(message, origin)\n break\n\n default:\n throw new Error(`Unknown message type: ${type}`)\n }\n } catch (error) {\n console.error(`[iframe] ❌ Error handling ${type}:`, error)\n this.messenger.sendError(messageId, error instanceof Error ? error.message : 'Unknown error', origin)\n }\n }\n\n private async handleSDKAuth(message: SecureMessage, origin: string): Promise<void> {\n const { projectId } = message.data\n const { messageId } = message\n\n console.log(`[iframe] SDK_AUTH: projectId=${projectId}`)\n\n // Validate HTTPS origin\n const isLocalhost = origin.startsWith('http://localhost:') || origin.startsWith('http://127.0.0.1:')\n const isHttps = origin.startsWith('https://')\n if (!isHttps && !isLocalhost) {\n throw new Error('Only HTTPS origins are allowed (or localhost for dev)')\n }\n\n // TODO: Validate project ID belongs to origin (backend API call)\n // For now, accept all HTTPS origins\n\n // Create session\n const sessionToken = this.sessionManager.createSession(projectId, origin)\n\n // Configure messenger\n this.messenger.setSessionToken(sessionToken)\n this.messenger.addAllowedOrigin(origin)\n\n // Send response\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_SDK_AUTH_SUCCESS',\n sessionToken\n },\n origin\n )\n\n console.log(`[iframe] ✅ SDK authenticated for origin: ${origin.substring(0, 40)}...`)\n }\n\n private async handleAuthenticate(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, projectId, userId, avatar, displayName } = message.data\n const { messageId } = message\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n throw new Error('Invalid session')\n }\n\n console.log(`[iframe] AUTHENTICATE: userId=${userId}, projectId=${projectId}`)\n\n // Check authorization\n const isAuthorized = await this.authManager.checkAuthorization(userId, projectId)\n\n if (!isAuthorized) {\n console.log(`[iframe] Authorization needed for project: ${projectId}`)\n\n // Get project info (TODO: from backend API)\n const projectInfo = {\n id: projectId,\n name: 'Application',\n logoUrl: '',\n website: origin,\n domains: [origin]\n }\n\n // Request user authorization with user profile data\n const consent = await this.authManager.requestAuthorization(projectInfo, origin, { avatar, displayName })\n\n if (!consent) {\n throw new Error('User denied authorization')\n }\n\n // Store authorization\n await this.authManager.storeAuthorization(userId, projectId, origin)\n console.log(`[iframe] ✅ Authorization granted: ${userId} -> ${projectId}`)\n }\n\n // Get user address\n const address = this.storage.getOwnerAddress(userId)\n\n // Send response\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_AUTH_SUCCESS',\n userId,\n address\n },\n origin\n )\n\n console.log(`[iframe] ✅ User authenticated: ${userId}`)\n\n // Check if user already has keyshare (e.g., after page refresh)\n // If yes, wallet is ready - no need for DKG or restore\n if (this.storage.hasKeyshare(userId)) {\n console.log(`[iframe] ℹ️ User has existing keyshare, sending WALLET_READY`)\n this.sendWalletReadyStatus(userId, origin)\n } else {\n console.log(`[iframe] ℹ️ User needs DKG or restore to create/recover keyshare`)\n }\n }\n\n private async handleStartDKG(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, userId, projectId, accessToken } = message.data\n const { messageId } = message\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n throw new Error('Invalid session')\n }\n\n // Check authorization\n const isAuthorized = await this.authManager.checkAuthorization(userId, projectId)\n if (!isAuthorized) {\n throw new Error('User has not authorized this application')\n }\n\n console.log(`[iframe] START_DKG: userId=${userId}, projectId=${projectId}, hasToken=${!!accessToken}`)\n\n // Show loading\n this.displayLoadingIndicator('Generating secure keys...')\n\n try {\n // Perform DKG with projectId and accessToken\n const result = await this.dkgManager.performDKG(userId, projectId, accessToken)\n\n // Save to IFRAME localStorage (ISOLATED)\n this.storage.saveKeyshare(userId, {\n keyshare_b64: result.keyshare.keyshare_b64,\n ownerAddress: result.ownerAddress,\n sessionId: result.sessionId\n })\n\n // Hide loading\n this.hideLoadingIndicator()\n\n // Send response\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_DKG_SUCCESS',\n ownerAddress: result.ownerAddress\n },\n origin\n )\n\n console.log(`[iframe] ✅ DKG completed: ${result.ownerAddress}`)\n\n // Send wallet ready status after DKG\n this.sendWalletReadyStatus(userId, origin)\n } catch (error) {\n this.hideLoadingIndicator()\n throw error\n }\n }\n\n private async handleSignTransaction(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, userId, projectId, transaction, accessToken, avatar, displayName } = message.data\n const { messageId } = message\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n throw new Error('Invalid session')\n }\n\n // Check authorization\n const isAuthorized = await this.authManager.checkAuthorization(userId, projectId)\n if (!isAuthorized) {\n throw new Error('User has not authorized this application')\n }\n\n console.log(`[iframe] SIGN_TRANSACTION: userId=${userId}, hasAccessToken=${!!accessToken}`)\n\n try {\n // Sign transaction (includes user confirmation)\n const signature = await this.signingManager.signTransaction(userId, projectId, origin, transaction, accessToken, {\n avatar,\n displayName\n })\n\n // Send response\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_SIGNATURE',\n signature\n },\n origin\n )\n\n console.log(`[iframe] ✅ Transaction signed`)\n } catch (error) {\n console.error('[iframe] Signing failed:', error)\n throw error\n }\n }\n\n private async handleSignTypedData(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, userId, projectId, typedData, digest32, accessToken, avatar, displayName } = message.data\n const { messageId } = message\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n throw new Error('Invalid session')\n }\n\n // Check authorization\n const isAuthorized = await this.authManager.checkAuthorization(userId, projectId)\n if (!isAuthorized) {\n throw new Error('User has not authorized this application')\n }\n\n console.log(`[iframe] SIGN_TYPED_DATA: userId=${userId}, primaryType=${typedData?.primaryType}`)\n\n try {\n // Sign typed data (includes user confirmation)\n const signature = await this.signingManager.signTypedData(\n userId,\n projectId,\n origin,\n typedData,\n digest32,\n accessToken,\n { avatar, displayName }\n )\n\n // Send response\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_EIP712_SIGNATURE',\n signature\n },\n origin\n )\n\n console.log(`[iframe] ✅ EIP712 message signed`)\n } catch (error) {\n console.error('[iframe] EIP712 signing failed:', error)\n throw error\n }\n }\n\n private async handleGetAddress(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, userId } = message.data\n const { messageId } = message\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n throw new Error('Invalid session')\n }\n\n const address = this.storage.getOwnerAddress(userId)\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_ADDRESS',\n address\n },\n origin\n )\n }\n\n private async handleCheckKeyshare(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, userId } = message.data\n const { messageId } = message\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n throw new Error('Invalid session')\n }\n\n const hasKeyshare = this.storage.hasKeyshare(userId)\n const address = hasKeyshare ? this.storage.getOwnerAddress(userId) : undefined\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_KEYSHARE_STATUS',\n hasKeyshare,\n address\n },\n origin\n )\n }\n\n private async handleGetTrustedApps(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, userId } = message.data\n const { messageId } = message\n\n console.log(`[iframe] GET_TRUSTED_APPS: userId=${userId}, sessionToken=${sessionToken ? 'present' : 'missing'}`)\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n console.error('[iframe] GET_TRUSTED_APPS: Session validation failed')\n throw new Error('Invalid session')\n }\n\n const trustedApps = this.trustedApps.getTrustedAppsForUser(userId)\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_TRUSTED_APPS_LIST',\n apps: trustedApps\n },\n origin\n )\n\n console.log(`[iframe] ✅ GET_TRUSTED_APPS: Response sent with ${trustedApps.length} apps`)\n }\n\n private async handleRemoveTrustedApp(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, userId, projectId, appOrigin } = message.data\n const { messageId } = message\n\n console.log(`[iframe] REMOVE_TRUSTED_APP: userId=${userId}, projectId=${projectId}, origin=${appOrigin}`)\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n console.error('[iframe] REMOVE_TRUSTED_APP: Session validation failed')\n throw new Error('Invalid session')\n }\n\n // Remove trusted app\n this.trustedApps.removeTrustedApp(userId, projectId, appOrigin)\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_TRUSTED_APP_REMOVED',\n success: true\n },\n origin\n )\n\n console.log(`[iframe] ✅ REMOVE_TRUSTED_APP: App removed`)\n }\n\n private async handleClearAuthorizations(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, projectId } = message.data\n const { messageId } = message\n\n console.log(`[iframe] CLEAR_AUTHORIZATIONS: projectId=${projectId}`)\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n console.error('[iframe] CLEAR_AUTHORIZATIONS: Session validation failed')\n throw new Error('Invalid session')\n }\n\n // Clear all authorizations for this project\n // This will iterate through all stored authorizations and remove those matching the projectId\n const storage = this.storage as any\n const allKeys = Object.keys(localStorage).filter((key) => key.startsWith('auth_'))\n\n let clearedCount = 0\n allKeys.forEach((key) => {\n try {\n const authData = JSON.parse(localStorage.getItem(key) || '{}')\n if (authData.projectId === projectId) {\n localStorage.removeItem(key)\n clearedCount++\n }\n } catch (e) {\n // Skip invalid entries\n }\n })\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_AUTHORIZATIONS_CLEARED',\n success: true,\n clearedCount\n },\n origin\n )\n\n console.log(`[iframe] ✅ CLEAR_AUTHORIZATIONS: Cleared ${clearedCount} authorizations for project ${projectId}`)\n }\n\n private async handleCreateBackup(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, userId, backupRequest, accessToken } = message.data\n const { messageId } = message\n\n console.log(`[iframe] CREATE_BACKUP received:`, {\n userId,\n method: backupRequest?.method,\n hasSessionToken: !!sessionToken,\n hasAccessToken: !!accessToken,\n origin\n })\n\n if (!userId) {\n console.error('[iframe] CREATE_BACKUP: userId is missing!')\n this.messenger.sendError(messageId, 'userId is required', origin)\n return\n }\n\n if (!backupRequest) {\n console.error('[iframe] CREATE_BACKUP: backupRequest is missing!')\n this.messenger.sendError(messageId, 'backupRequest is required', origin)\n return\n }\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n console.error('[iframe] CREATE_BACKUP: Session validation failed', { sessionToken, origin })\n this.messenger.sendError(messageId, 'Invalid session', origin)\n return\n }\n\n try {\n // Create backup using BackupManager\n const result = await this.backupManager.createBackup(userId, backupRequest, accessToken)\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_BACKUP_CREATED',\n result\n },\n origin\n )\n\n if (result.success) {\n console.log(`[iframe] ✅ CREATE_BACKUP: Backup created successfully`)\n } else {\n console.error(`[iframe] ❌ CREATE_BACKUP: Backup failed - ${result.error}`)\n }\n } catch (error: any) {\n console.error('[iframe] CREATE_BACKUP: Exception:', error)\n this.messenger.sendError(messageId, error.message || 'Backup failed', origin)\n }\n }\n\n private async handleGetBackupStatus(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, userId } = message.data\n const { messageId } = message\n\n console.log(`[iframe] GET_BACKUP_STATUS: userId=${userId}`)\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n console.error('[iframe] GET_BACKUP_STATUS: Session validation failed')\n throw new Error('Invalid session')\n }\n\n // Get backup status\n const status = this.backupManager.getBackupStatus(userId)\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_BACKUP_STATUS',\n status\n },\n origin\n )\n\n console.log(`[iframe] ✅ GET_BACKUP_STATUS: Status retrieved`)\n }\n\n private async handleGetCloudProviders(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken } = message.data\n const { messageId } = message\n\n console.log(`[iframe] GET_CLOUD_PROVIDERS`)\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n console.error('[iframe] GET_CLOUD_PROVIDERS: Session validation failed')\n throw new Error('Invalid session')\n }\n\n // Get available cloud providers\n const providers = this.backupManager.getAvailableCloudProviders()\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_CLOUD_PROVIDERS',\n providers\n },\n origin\n )\n\n console.log(`[iframe] ✅ GET_CLOUD_PROVIDERS: Providers retrieved`)\n }\n\n private async handleRestoreBackup(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, userId, password, accessToken } = message.data\n const { messageId } = message\n\n console.log(`[iframe] RESTORE_BACKUP received:`, {\n userId,\n hasPassword: !!password,\n hasSessionToken: !!sessionToken,\n hasAccessToken: !!accessToken,\n origin\n })\n\n if (!userId) {\n console.error('[iframe] RESTORE_BACKUP: userId is missing!')\n this.messenger.sendError(messageId, 'userId is required', origin)\n return\n }\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n console.error('[iframe] RESTORE_BACKUP: Session validation failed', { sessionToken, origin })\n this.messenger.sendError(messageId, 'Invalid session', origin)\n return\n }\n\n try {\n // Restore backup using BackupManager\n const backupData = await this.backupManager.restoreFromServer(userId, password, accessToken)\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_BACKUP_RESTORED',\n result: {\n success: true,\n timestamp: Date.now(),\n data: backupData\n }\n },\n origin\n )\n\n console.log(`[iframe] ✅ RESTORE_BACKUP: Backup restored successfully`)\n\n // Send wallet ready status after successful restore\n this.sendWalletReadyStatus(userId, origin)\n } catch (error: any) {\n console.error('[iframe] RESTORE_BACKUP: Exception:', error)\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_BACKUP_RESTORED',\n result: {\n success: false,\n timestamp: Date.now(),\n error: error.message || 'Restore failed'\n }\n },\n origin\n )\n\n console.log(`[iframe] ❌ RESTORE_BACKUP: Restore failed - ${error.message}`)\n }\n }\n\n private async handleRestoreFromFile(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, userId, fileContent, password } = message.data\n const { messageId } = message\n\n console.log(`[iframe] RESTORE_FROM_FILE received:`, {\n userId,\n hasPassword: !!password,\n hasFileContent: !!fileContent,\n hasSessionToken: !!sessionToken,\n origin\n })\n\n if (!userId) {\n console.error('[iframe] RESTORE_FROM_FILE: userId is missing!')\n this.messenger.sendError(messageId, 'userId is required', origin)\n return\n }\n\n if (!fileContent) {\n console.error('[iframe] RESTORE_FROM_FILE: fileContent is missing!')\n this.messenger.sendError(messageId, 'fileContent is required', origin)\n return\n }\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n console.error('[iframe] RESTORE_FROM_FILE: Session validation failed', { sessionToken, origin })\n this.messenger.sendError(messageId, 'Invalid session', origin)\n return\n }\n\n try {\n // Restore from local file using BackupManager\n const backupData = await this.backupManager.restoreFromLocalFile(fileContent, userId, password)\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_FILE_RESTORED',\n result: {\n success: true,\n timestamp: Date.now(),\n data: backupData\n }\n },\n origin\n )\n\n console.log(`[iframe] ✅ RESTORE_FROM_FILE: File restored successfully`)\n\n // Send wallet ready status after successful file restore\n this.sendWalletReadyStatus(userId, origin)\n } catch (error: any) {\n console.error('[iframe] RESTORE_FROM_FILE: Exception:', error)\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_FILE_RESTORED',\n result: {\n success: false,\n timestamp: Date.now(),\n error: error.message || 'File restore failed'\n }\n },\n origin\n )\n\n console.log(`[iframe] ❌ RESTORE_FROM_FILE: Restore failed - ${error.message}`)\n }\n }\n\n private async handleEncryptBackupData(message: SecureMessage, origin: string): Promise<void> {\n const { sessionToken, userId, password } = message.data\n const { messageId } = message\n\n console.log(`[iframe] ENCRYPT_BACKUP_DATA received:`, {\n userId,\n hasPassword: !!password,\n hasSessionToken: !!sessionToken,\n origin\n })\n\n if (!userId) {\n console.error('[iframe] ENCRYPT_BACKUP_DATA: userId is missing!')\n this.messenger.sendError(messageId, 'userId is required', origin)\n return\n }\n\n // Validate session\n if (!this.sessionManager.validateSession(sessionToken, origin)) {\n console.error('[iframe] ENCRYPT_BACKUP_DATA: Session validation failed', { sessionToken, origin })\n this.messenger.sendError(messageId, 'Invalid session', origin)\n return\n }\n\n try {\n // Encrypt backup data using BackupManager\n const encryptedData = await this.backupManager.encryptBackupData(userId, password)\n\n this.messenger.sendResponse(\n messageId,\n {\n type: 'LUMIA_PASSPORT_BACKUP_ENCRYPTED',\n encryptedData\n },\n origin\n )\n\n console.log(`[iframe] ✅ ENCRYPT_BACKUP_DATA: Data encrypted successfully`)\n } catch (error: any) {\n console.error('[iframe] ENCRYPT_BACKUP_DATA: Exception:', error)\n this.messenger.sendError(messageId, error.message || 'Encryption failed', origin)\n }\n }\n\n private displayReadyIndicator(): void {\n const app = document.getElementById('app')\n if (!app) return\n\n // Build template data\n const templateData = buildReadyIndicatorData({\n origin: window.location.origin,\n iframeVersion: IFRAME_VERSION\n })\n\n // Load and render template\n const template = TemplateLoader.getTemplate('ready-indicator')\n const populatedReadyIndicatorHTML = TemplateEngine.render(template, templateData)\n\n app.innerHTML = populatedReadyIndicatorHTML\n }\n\n /**\n * Send wallet ready status to parent\n * This notifies the frontend that the wallet is fully initialized and ready to sign\n */\n private sendWalletReadyStatus(userId: string, origin: string): void {\n const hasKeyshare = this.storage.hasKeyshare(userId)\n const address = hasKeyshare ? this.storage.getOwnerAddress(userId) : undefined\n const hasSession = this.sessionManager.hasSession(origin)\n\n const status = {\n ready: hasKeyshare && hasSession,\n userId,\n address,\n hasKeyshare,\n hasSession,\n timestamp: Date.now()\n }\n\n // Send as broadcast (not a response to specific message)\n if (window.parent) {\n window.parent.postMessage(\n {\n type: 'LUMIA_PASSPORT_WALLET_READY',\n data: status,\n timestamp: Date.now()\n },\n origin\n )\n }\n }\n\n private displayLoadingIndicator(message: string): void {\n const app = document.getElementById('app')\n if (!app) return\n\n app.innerHTML = `\n <div class=\"loading-indicator\">\n <div class=\"spinner\"></div>\n <p>${message}</p>\n </div>\n `\n }\n\n private hideLoadingIndicator(): void {\n this.displayReadyIndicator()\n }\n}\n\n// Initialize wallet when DOM is ready\nfunction initWallet() {\n const wallet = new IframeWallet()\n wallet.initialize().catch((error) => {\n console.error('[iframe] ❌ Failed to initialize:', error)\n\n // Show error in UI\n const app = document.getElementById('app')\n if (app) {\n app.innerHTML = `\n <div class=\"error-indicator\">\n <div class=\"error-icon\">❌</div>\n <h2>Initialization Failed</h2>\n <p>${error instanceof Error ? error.message : 'Unknown error'}</p>\n </div>\n `\n }\n })\n}\n\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initWallet)\n} else {\n initWallet()\n}\n"],"mappings":"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","names":["encoder","envelopeDecryptKeyshare","envelopeDecryptKeyshareWithPassword","decryptKeyshare","size","size","size","size","bytesToHex","size","encoder","toBytes","toBytes","restoreFromServer","encryptKeyshare","deriveBackupPasswordFromPasskey","restoreFromLocalFile","ptr","module","encoder","API_DOMAIN","encoder","encoder"]}
|