{"version":3,"sources":["../../src/config/networks.ts","../../src/security/KeyManager.ts","../../src/storage/SecureStorage.ts","../../src/services/WdkApiClient.ts","../../src/services/WdkService.ts","../../src/wallet/WalletManager.ts","../../src/react/useWalletManager.ts"],"names":["DERIVATION_PATHS","viemFormatEther"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { NetworkType } from '../types';\n\nexport interface NetworkConfig {\n  name: string;\n  chainId: number;\n  coinType: number; // BIP-44 coin type\n  rpcUrl: string;\n  explorerUrl: string;\n  nativeCurrency: {\n    name: string;\n    symbol: string;\n    decimals: number;\n  };\n  isEvm: boolean;\n}\n\nexport const NETWORKS: Record<NetworkType, NetworkConfig> = {\n  bitcoin: {\n    name: 'Bitcoin',\n    chainId: 0,\n    coinType: 0, // m/44'/0'\n    rpcUrl: 'https://blockstream.info/api',\n    explorerUrl: 'https://blockstream.info',\n    nativeCurrency: {\n      name: 'Bitcoin',\n      symbol: 'BTC',\n      decimals: 8,\n    },\n    isEvm: false,\n  },\n  ethereum: {\n    name: 'Ethereum',\n    chainId: 1,\n    coinType: 60, // m/44'/60'\n    rpcUrl: 'https://eth.llamarpc.com',\n    explorerUrl: 'https://etherscan.io',\n    nativeCurrency: {\n      name: 'Ether',\n      symbol: 'ETH',\n      decimals: 18,\n    },\n    isEvm: true,\n  },\n  ton: {\n    name: 'TON',\n    chainId: -239,\n    coinType: 607, // m/44'/607'\n    rpcUrl: 'https://toncenter.com/api/v2',\n    explorerUrl: 'https://tonscan.org',\n    nativeCurrency: {\n      name: 'Toncoin',\n      symbol: 'TON',\n      decimals: 9,\n    },\n    isEvm: false,\n  },\n  tron: {\n    name: 'TRON',\n    chainId: 728126428,\n    coinType: 195, // m/44'/195'\n    rpcUrl: 'https://api.trongrid.io',\n    explorerUrl: 'https://tronscan.org',\n    nativeCurrency: {\n      name: 'TRON',\n      symbol: 'TRX',\n      decimals: 6,\n    },\n    isEvm: false,\n  },\n  solana: {\n    name: 'Solana',\n    chainId: 0,\n    coinType: 501, // m/44'/501'\n    rpcUrl: 'https://api.mainnet-beta.solana.com',\n    explorerUrl: 'https://solscan.io',\n    nativeCurrency: {\n      name: 'Solana',\n      symbol: 'SOL',\n      decimals: 9,\n    },\n    isEvm: false,\n  },\n  spark: {\n    name: 'Spark (Lightning)',\n    chainId: 0,\n    coinType: 998, // m/44'/998'\n    rpcUrl: '',\n    explorerUrl: '',\n    nativeCurrency: {\n      name: 'Bitcoin',\n      symbol: 'BTC',\n      decimals: 8,\n    },\n    isEvm: false,\n  },\n};\n\nexport const TESTNET_NETWORKS: Partial<Record<NetworkType, Partial<NetworkConfig>>> = {\n  ethereum: {\n    name: 'Sepolia',\n    chainId: 11155111,\n    // Using eth-sepolia.g.alchemy.com public endpoint (more reliable than rpc.sepolia.org)\n    // Fallback order: 1. Alchemy public, 2. Infura public, 3. BlockPi\n    rpcUrl: 'https://ethereum-sepolia-rpc.publicnode.com',\n    explorerUrl: 'https://sepolia.etherscan.io',\n  },\n  solana: {\n    name: 'Solana Devnet',\n    rpcUrl: 'https://api.devnet.solana.com',\n    explorerUrl: 'https://solscan.io?cluster=devnet',\n  },\n};\n\n// BIP-44 derivation paths\nexport const DERIVATION_PATHS: Record<NetworkType, string> = {\n  bitcoin: \"m/44'/0'/0'/0\",\n  ethereum: \"m/44'/60'/0'/0\",\n  ton: \"m/44'/607'/0'/0\",\n  tron: \"m/44'/195'/0'/0\",\n  solana: \"m/44'/501'/0'/0\",\n  spark: \"m/44'/998'/0'/0\",\n};\n\nexport function getNetworkConfig(\n  network: NetworkType,\n  isTestnet: boolean = false\n): NetworkConfig {\n  const mainnetConfig = NETWORKS[network];\n  if (!isTestnet) return mainnetConfig;\n\n  const testnetOverrides = TESTNET_NETWORKS[network];\n  if (!testnetOverrides) return mainnetConfig;\n\n  return {\n    ...mainnetConfig,\n    ...testnetOverrides,\n  };\n}\n","/**\n * KeyManager - Secure key storage and encryption\n *\n * Handles seed phrase encryption using AES-256-GCM\n * with PBKDF2 key derivation from user password.\n */\nexport class KeyManager {\n  private static readonly ALGORITHM = 'AES-GCM';\n  private static readonly KEY_LENGTH = 256;\n  private static readonly IV_LENGTH = 12;\n  private static readonly SALT_LENGTH = 16;\n  private static readonly PBKDF2_ITERATIONS = 100000;\n\n  /**\n   * Encrypt a seed phrase with a password\n   */\n  static async encryptSeed(seed: string, password: string): Promise<string> {\n    const encoder = new TextEncoder();\n    const seedData = encoder.encode(seed);\n\n    // Generate random salt and IV\n    const salt = crypto.getRandomValues(new Uint8Array(this.SALT_LENGTH));\n    const iv = crypto.getRandomValues(new Uint8Array(this.IV_LENGTH));\n\n    // Derive key from password\n    const key = await this.deriveKey(password, salt);\n\n    // Encrypt\n    const encrypted = await crypto.subtle.encrypt(\n      { name: this.ALGORITHM, iv },\n      key,\n      seedData\n    );\n\n    // Combine salt + iv + encrypted data\n    const combined = new Uint8Array(salt.length + iv.length + encrypted.byteLength);\n    combined.set(salt, 0);\n    combined.set(iv, salt.length);\n    combined.set(new Uint8Array(encrypted), salt.length + iv.length);\n\n    // Return as base64\n    return btoa(String.fromCharCode(...combined));\n  }\n\n  /**\n   * Decrypt a seed phrase with a password\n   */\n  static async decryptSeed(encryptedData: string, password: string): Promise<string> {\n    // Decode from base64\n    const combined = new Uint8Array(\n      atob(encryptedData)\n        .split('')\n        .map(c => c.charCodeAt(0))\n    );\n\n    // Extract salt, iv, and encrypted data\n    const salt = combined.slice(0, this.SALT_LENGTH);\n    const iv = combined.slice(this.SALT_LENGTH, this.SALT_LENGTH + this.IV_LENGTH);\n    const encrypted = combined.slice(this.SALT_LENGTH + this.IV_LENGTH);\n\n    // Derive key from password\n    const key = await this.deriveKey(password, salt);\n\n    // Decrypt\n    const decrypted = await crypto.subtle.decrypt(\n      { name: this.ALGORITHM, iv },\n      key,\n      encrypted\n    );\n\n    const decoder = new TextDecoder();\n    return decoder.decode(decrypted);\n  }\n\n  /**\n   * Derive encryption key from password using PBKDF2\n   */\n  private static async deriveKey(\n    password: string,\n    salt: Uint8Array\n  ): Promise<CryptoKey> {\n    const encoder = new TextEncoder();\n    const passwordData = encoder.encode(password);\n\n    // Import password as key material\n    const keyMaterial = await crypto.subtle.importKey(\n      'raw',\n      passwordData,\n      'PBKDF2',\n      false,\n      ['deriveKey']\n    );\n\n    // Derive AES key\n    return crypto.subtle.deriveKey(\n      {\n        name: 'PBKDF2',\n        salt: salt.buffer.slice(salt.byteOffset, salt.byteOffset + salt.byteLength) as ArrayBuffer,\n        iterations: this.PBKDF2_ITERATIONS,\n        hash: 'SHA-256',\n      },\n      keyMaterial,\n      { name: this.ALGORITHM, length: this.KEY_LENGTH },\n      false,\n      ['encrypt', 'decrypt']\n    );\n  }\n\n  /**\n   * Validate a BIP-39 seed phrase (basic validation)\n   */\n  static validateSeedPhrase(seed: string): boolean {\n    const words = seed.trim().split(/\\s+/);\n    // BIP-39 supports 12, 15, 18, 21, or 24 words\n    const validWordCounts = [12, 15, 18, 21, 24];\n    return validWordCounts.includes(words.length);\n  }\n\n  /**\n   * Generate a random encryption key (for backup purposes)\n   */\n  static generateBackupKey(): string {\n    const bytes = crypto.getRandomValues(new Uint8Array(32));\n    return Array.from(bytes)\n      .map(b => b.toString(16).padStart(2, '0'))\n      .join('');\n  }\n}\n","/**\n * Secure Storage Interface\n * Platform-agnostic interface for secure key storage\n */\nexport interface SecureStorageAdapter {\n  /**\n   * Store a value securely\n   */\n  setItem(key: string, value: string): Promise<void>;\n\n  /**\n   * Retrieve a value\n   */\n  getItem(key: string): Promise<string | null>;\n\n  /**\n   * Remove a value\n   */\n  removeItem(key: string): Promise<void>;\n\n  /**\n   * Check if a key exists\n   */\n  hasItem(key: string): Promise<boolean>;\n\n  /**\n   * Clear all stored values\n   */\n  clear(): Promise<void>;\n}\n\n/**\n * iOS Keychain Storage Adapter\n * Uses react-native-keychain for iOS Keychain access\n */\nexport class KeychainStorageAdapter implements SecureStorageAdapter {\n  private serviceName: string;\n\n  constructor(serviceName: string = 'com.zubari.wallet') {\n    this.serviceName = serviceName;\n  }\n\n  async setItem(key: string, value: string): Promise<void> {\n    // In React Native, use react-native-keychain\n    // const Keychain = require('react-native-keychain');\n    // await Keychain.setGenericPassword(key, value, { service: this.serviceName });\n\n    // Placeholder for native implementation\n    if (typeof global !== 'undefined' && (global as any).KeychainModule) {\n      await (global as any).KeychainModule.setItem(this.serviceName, key, value);\n    } else {\n      throw new Error('Keychain not available on this platform');\n    }\n  }\n\n  async getItem(key: string): Promise<string | null> {\n    if (typeof global !== 'undefined' && (global as any).KeychainModule) {\n      return (global as any).KeychainModule.getItem(this.serviceName, key);\n    }\n    throw new Error('Keychain not available on this platform');\n  }\n\n  async removeItem(key: string): Promise<void> {\n    if (typeof global !== 'undefined' && (global as any).KeychainModule) {\n      await (global as any).KeychainModule.removeItem(this.serviceName, key);\n    } else {\n      throw new Error('Keychain not available on this platform');\n    }\n  }\n\n  async hasItem(key: string): Promise<boolean> {\n    const value = await this.getItem(key);\n    return value !== null;\n  }\n\n  async clear(): Promise<void> {\n    if (typeof global !== 'undefined' && (global as any).KeychainModule) {\n      await (global as any).KeychainModule.clear(this.serviceName);\n    } else {\n      throw new Error('Keychain not available on this platform');\n    }\n  }\n}\n\n/**\n * Android Keystore Storage Adapter\n * Uses Android Keystore for secure storage\n */\nexport class KeystoreStorageAdapter implements SecureStorageAdapter {\n  private alias: string;\n\n  constructor(alias: string = 'zubari_wallet_keys') {\n    this.alias = alias;\n  }\n\n  async setItem(key: string, value: string): Promise<void> {\n    // In React Native, use react-native-encrypted-storage or similar\n    // const EncryptedStorage = require('react-native-encrypted-storage');\n    // await EncryptedStorage.setItem(key, value);\n\n    if (typeof global !== 'undefined' && (global as any).KeystoreModule) {\n      await (global as any).KeystoreModule.setItem(this.alias, key, value);\n    } else {\n      throw new Error('Keystore not available on this platform');\n    }\n  }\n\n  async getItem(key: string): Promise<string | null> {\n    if (typeof global !== 'undefined' && (global as any).KeystoreModule) {\n      return (global as any).KeystoreModule.getItem(this.alias, key);\n    }\n    throw new Error('Keystore not available on this platform');\n  }\n\n  async removeItem(key: string): Promise<void> {\n    if (typeof global !== 'undefined' && (global as any).KeystoreModule) {\n      await (global as any).KeystoreModule.removeItem(this.alias, key);\n    } else {\n      throw new Error('Keystore not available on this platform');\n    }\n  }\n\n  async hasItem(key: string): Promise<boolean> {\n    const value = await this.getItem(key);\n    return value !== null;\n  }\n\n  async clear(): Promise<void> {\n    if (typeof global !== 'undefined' && (global as any).KeystoreModule) {\n      await (global as any).KeystoreModule.clear(this.alias);\n    } else {\n      throw new Error('Keystore not available on this platform');\n    }\n  }\n}\n\n/**\n * Web Encrypted LocalStorage Adapter\n * Uses Web Crypto API for encryption with localStorage\n */\nexport class WebEncryptedStorageAdapter implements SecureStorageAdapter {\n  private encryptionKey: CryptoKey | null = null;\n  private storagePrefix: string;\n\n  constructor(storagePrefix: string = 'zubari_') {\n    this.storagePrefix = storagePrefix;\n  }\n\n  /**\n   * Initialize with a password-derived key\n   */\n  async initialize(password: string): Promise<void> {\n    const encoder = new TextEncoder();\n    const salt = this.getSalt();\n\n    const keyMaterial = await crypto.subtle.importKey(\n      'raw',\n      encoder.encode(password),\n      'PBKDF2',\n      false,\n      ['deriveKey']\n    );\n\n    this.encryptionKey = await crypto.subtle.deriveKey(\n      {\n        name: 'PBKDF2',\n        salt: salt.buffer as ArrayBuffer,\n        iterations: 100000,\n        hash: 'SHA-256',\n      },\n      keyMaterial,\n      { name: 'AES-GCM', length: 256 },\n      false,\n      ['encrypt', 'decrypt']\n    );\n  }\n\n  private getSalt(): Uint8Array {\n    const saltKey = `${this.storagePrefix}salt`;\n    let saltHex = localStorage.getItem(saltKey);\n\n    if (!saltHex) {\n      const salt = crypto.getRandomValues(new Uint8Array(16));\n      saltHex = Array.from(salt)\n        .map((b) => b.toString(16).padStart(2, '0'))\n        .join('');\n      localStorage.setItem(saltKey, saltHex);\n    }\n\n    return new Uint8Array(\n      saltHex.match(/.{1,2}/g)!.map((byte) => parseInt(byte, 16))\n    );\n  }\n\n  async setItem(key: string, value: string): Promise<void> {\n    if (!this.encryptionKey) {\n      throw new Error('Storage not initialized. Call initialize() first.');\n    }\n\n    const encoder = new TextEncoder();\n    const iv = crypto.getRandomValues(new Uint8Array(12));\n\n    const encrypted = await crypto.subtle.encrypt(\n      { name: 'AES-GCM', iv },\n      this.encryptionKey,\n      encoder.encode(value)\n    );\n\n    const combined = new Uint8Array(iv.length + encrypted.byteLength);\n    combined.set(iv);\n    combined.set(new Uint8Array(encrypted), iv.length);\n\n    const base64 = btoa(String.fromCharCode(...combined));\n    localStorage.setItem(`${this.storagePrefix}${key}`, base64);\n  }\n\n  async getItem(key: string): Promise<string | null> {\n    if (!this.encryptionKey) {\n      throw new Error('Storage not initialized. Call initialize() first.');\n    }\n\n    const base64 = localStorage.getItem(`${this.storagePrefix}${key}`);\n    if (!base64) return null;\n\n    try {\n      const combined = new Uint8Array(\n        atob(base64)\n          .split('')\n          .map((c) => c.charCodeAt(0))\n      );\n\n      const iv = combined.slice(0, 12);\n      const encrypted = combined.slice(12);\n\n      const decrypted = await crypto.subtle.decrypt(\n        { name: 'AES-GCM', iv },\n        this.encryptionKey,\n        encrypted\n      );\n\n      const decoder = new TextDecoder();\n      return decoder.decode(decrypted);\n    } catch {\n      return null;\n    }\n  }\n\n  async removeItem(key: string): Promise<void> {\n    localStorage.removeItem(`${this.storagePrefix}${key}`);\n  }\n\n  async hasItem(key: string): Promise<boolean> {\n    return localStorage.getItem(`${this.storagePrefix}${key}`) !== null;\n  }\n\n  async clear(): Promise<void> {\n    const keysToRemove: string[] = [];\n\n    for (let i = 0; i < localStorage.length; i++) {\n      const key = localStorage.key(i);\n      if (key?.startsWith(this.storagePrefix)) {\n        keysToRemove.push(key);\n      }\n    }\n\n    keysToRemove.forEach((key) => localStorage.removeItem(key));\n  }\n}\n\n/**\n * In-Memory Storage Adapter (for testing)\n */\nexport class MemoryStorageAdapter implements SecureStorageAdapter {\n  private storage: Map<string, string> = new Map();\n\n  async setItem(key: string, value: string): Promise<void> {\n    this.storage.set(key, value);\n  }\n\n  async getItem(key: string): Promise<string | null> {\n    return this.storage.get(key) || null;\n  }\n\n  async removeItem(key: string): Promise<void> {\n    this.storage.delete(key);\n  }\n\n  async hasItem(key: string): Promise<boolean> {\n    return this.storage.has(key);\n  }\n\n  async clear(): Promise<void> {\n    this.storage.clear();\n  }\n}\n\n/**\n * Secure Storage Factory\n * Creates appropriate storage adapter based on platform\n */\nexport function createSecureStorage(): SecureStorageAdapter {\n  // Check for React Native\n  if (\n    typeof global !== 'undefined' &&\n    (global as any).nativeModuleProxy !== undefined\n  ) {\n    // Check platform\n    const Platform = (global as any).Platform;\n    if (Platform?.OS === 'ios') {\n      return new KeychainStorageAdapter();\n    } else if (Platform?.OS === 'android') {\n      return new KeystoreStorageAdapter();\n    }\n  }\n\n  // Check for browser environment\n  if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n    return new WebEncryptedStorageAdapter();\n  }\n\n  // Fallback to memory storage (for Node.js/testing)\n  return new MemoryStorageAdapter();\n}\n","/**\n * WDK API Client\n *\n * Client for calling the backend WDK endpoints to derive addresses\n * using Tether WDK (which runs server-side in Node.js).\n */\n\nimport type { NetworkType } from '../types';\n\nexport interface WdkApiConfig {\n  baseUrl: string;\n  timeout?: number;\n}\n\nexport interface DeriveAddressResponse {\n  success: boolean;\n  address?: string;\n  chain?: string;\n  path?: string;\n  network?: string;\n  error?: string;\n}\n\nexport interface DeriveAllAddressesResponse {\n  success: boolean;\n  addresses?: {\n    ethereum: string | null;\n    bitcoin: string | null;\n    ton: string | null;\n    tron: string | null;\n    solana: string | null;\n    spark: string | null;\n  };\n  network?: string;\n  error?: string;\n}\n\nexport interface ValidateSeedResponse {\n  success: boolean;\n  isValid?: boolean;\n  wordCount?: number;\n  error?: string;\n}\n\nexport interface GenerateSeedResponse {\n  success: boolean;\n  seed?: string;\n  wordCount?: number;\n  error?: string;\n}\n\n/**\n * WDK API Client for server-side Tether WDK integration\n */\nexport class WdkApiClient {\n  private config: Required<WdkApiConfig>;\n\n  constructor(config: WdkApiConfig) {\n    this.config = {\n      baseUrl: config.baseUrl,\n      timeout: config.timeout || 30000,\n    };\n  }\n\n  /**\n   * Generate a new BIP-39 seed phrase using Tether WDK\n   */\n  async generateSeed(): Promise<GenerateSeedResponse> {\n    try {\n      const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/generate-seed`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n        },\n      });\n\n      return await response.json();\n    } catch (error) {\n      return {\n        success: false,\n        error: error instanceof Error ? error.message : 'Failed to generate seed',\n      };\n    }\n  }\n\n  /**\n   * Validate a BIP-39 seed phrase\n   */\n  async validateSeed(seed: string): Promise<ValidateSeedResponse> {\n    try {\n      const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/validate-seed`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify({ seed }),\n      });\n\n      return await response.json();\n    } catch (error) {\n      return {\n        success: false,\n        error: error instanceof Error ? error.message : 'Failed to validate seed',\n      };\n    }\n  }\n\n  /**\n   * Derive address for a specific chain using Tether WDK\n   */\n  async deriveAddress(\n    seed: string,\n    chain: NetworkType,\n    network: 'mainnet' | 'testnet' = 'testnet'\n  ): Promise<DeriveAddressResponse> {\n    try {\n      const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/derive-address`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify({ seed, chain, network }),\n      });\n\n      return await response.json();\n    } catch (error) {\n      return {\n        success: false,\n        error: error instanceof Error ? error.message : 'Failed to derive address',\n      };\n    }\n  }\n\n  /**\n   * Derive addresses for all chains using Tether WDK\n   */\n  async deriveAllAddresses(\n    seed: string,\n    network: 'mainnet' | 'testnet' = 'testnet'\n  ): Promise<DeriveAllAddressesResponse> {\n    try {\n      const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/derive-all`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify({ seed, network }),\n      });\n\n      return await response.json();\n    } catch (error) {\n      return {\n        success: false,\n        error: error instanceof Error ? error.message : 'Failed to derive addresses',\n      };\n    }\n  }\n}\n\n// Default API URL (can be overridden)\nconst DEFAULT_API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3001';\n\n// Singleton instance\nlet wdkApiClient: WdkApiClient | null = null;\n\n/**\n * Get or create the WDK API client instance\n */\nexport function getWdkApiClient(baseUrl?: string): WdkApiClient {\n  if (!wdkApiClient || (baseUrl && wdkApiClient['config'].baseUrl !== baseUrl)) {\n    wdkApiClient = new WdkApiClient({\n      baseUrl: baseUrl || DEFAULT_API_URL,\n    });\n  }\n  return wdkApiClient;\n}\n","/**\n * WDK Service for SDK\n *\n * Native integration with Tether WDK for multi-chain address derivation.\n * Uses individual wallet modules for each chain to derive cryptographically\n * valid addresses from a BIP-39 seed phrase.\n *\n * Supported chains: Ethereum, Bitcoin, TON, TRON, Solana, Spark (Lightning)\n *\n * @see https://docs.wallet.tether.io/\n */\n\n// Dynamic imports for ESM modules (WDK packages are ESM-only)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WdkManager: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WalletManagerBtc: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WalletManagerEvm: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WalletManagerSolana: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WalletManagerTon: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WalletManagerTron: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WalletManagerSpark: any;\n\nlet wdkLoaded = false;\nlet wdkLoadError: Error | null = null;\n\n/**\n * Dynamic import helper that bypasses TypeScript's CommonJS transformation\n * TypeScript converts import() to require() in CommonJS, but WDK is ESM-only\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst dynamicImport = new Function('specifier', 'return import(specifier)') as (\n  specifier: string\n) => Promise<any>;\n\n/**\n * Dynamically load WDK modules (they are ESM-only)\n */\nasync function loadWdkModules(): Promise<void> {\n  if (wdkLoaded) return;\n  if (wdkLoadError) throw wdkLoadError;\n\n  try {\n    const [wdk, btc, evm, solana, ton, tron, spark] = await Promise.all([\n      dynamicImport('@tetherto/wdk'),\n      dynamicImport('@tetherto/wdk-wallet-btc'),\n      dynamicImport('@tetherto/wdk-wallet-evm'),\n      dynamicImport('@tetherto/wdk-wallet-solana'),\n      dynamicImport('@tetherto/wdk-wallet-ton'),\n      dynamicImport('@tetherto/wdk-wallet-tron'),\n      dynamicImport('@tetherto/wdk-wallet-spark'),\n    ]);\n\n    WdkManager = wdk.default;\n    WalletManagerBtc = btc.default;\n    WalletManagerEvm = evm.default;\n    WalletManagerSolana = solana.default;\n    WalletManagerTon = ton.default;\n    WalletManagerTron = tron.default;\n    WalletManagerSpark = spark.default;\n    wdkLoaded = true;\n  } catch (error) {\n    wdkLoadError = error instanceof Error ? error : new Error('Failed to load WDK modules');\n    console.error('Failed to load WDK modules:', error);\n    throw wdkLoadError;\n  }\n}\n\nexport type SupportedChain = 'ethereum' | 'bitcoin' | 'ton' | 'tron' | 'solana' | 'spark';\n\nexport interface ChainAddress {\n  chain: SupportedChain;\n  address: string;\n  path: string;\n}\n\nexport interface MultiChainAddresses {\n  ethereum: string | null;\n  bitcoin: string | null;\n  ton: string | null;\n  tron: string | null;\n  solana: string | null;\n  spark: string | null;\n}\n\nexport interface WdkServiceConfig {\n  network: 'mainnet' | 'testnet';\n  rpcUrls?: {\n    ethereum?: string;\n    bitcoin?: string;\n    solana?: string;\n    ton?: string;\n    tron?: string;\n  };\n}\n\n// BIP-44 derivation paths\nconst DERIVATION_PATHS: Record<SupportedChain, string> = {\n  bitcoin: \"m/84'/0'/0'/0/0\", // BIP-84 for native SegWit\n  ethereum: \"m/44'/60'/0'/0/0\",\n  ton: \"m/44'/607'/0'\", // Updated for v1.0.0-beta.6+\n  tron: \"m/44'/195'/0'/0/0\",\n  solana: \"m/44'/501'/0'/0'\", // Updated for v1.0.0-beta.4+\n  spark: \"m/44'/998'/0'/0/0\",\n};\n\n// Default RPC URLs\nconst DEFAULT_RPC_URLS = {\n  mainnet: {\n    ethereum: 'https://eth.llamarpc.com',\n    solana: 'https://api.mainnet-beta.solana.com',\n    ton: 'https://toncenter.com/api/v2/jsonRPC',\n    tron: 'https://api.trongrid.io',\n  },\n  testnet: {\n    ethereum: 'https://ethereum-sepolia-rpc.publicnode.com',\n    solana: 'https://api.devnet.solana.com',\n    ton: 'https://testnet.toncenter.com/api/v2/jsonRPC',\n    tron: 'https://api.shasta.trongrid.io',\n  },\n};\n\n/**\n * WDK Service for native multi-chain address derivation\n * Uses Tether WDK wallet modules directly without needing a backend API\n */\nexport class WdkService {\n  private seed: string | null = null;\n  private config: WdkServiceConfig;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private wallets: Partial<Record<SupportedChain, any>> = {};\n\n  constructor(config: Partial<WdkServiceConfig> = {}) {\n    this.config = {\n      network: config.network || 'testnet',\n      rpcUrls: config.rpcUrls,\n    };\n  }\n\n  /**\n   * Check if WDK modules are loaded\n   */\n  static isLoaded(): boolean {\n    return wdkLoaded;\n  }\n\n  /**\n   * Ensure WDK modules are loaded\n   */\n  private async ensureLoaded(): Promise<void> {\n    await loadWdkModules();\n  }\n\n  /**\n   * Load WDK modules (call this before using sync methods)\n   */\n  async loadModules(): Promise<void> {\n    await loadWdkModules();\n  }\n\n  /**\n   * Generate a random BIP-39 seed phrase (12 words)\n   */\n  async generateSeedPhrase(): Promise<string> {\n    await this.ensureLoaded();\n    return WdkManager.getRandomSeedPhrase();\n  }\n\n  /**\n   * Validate a BIP-39 seed phrase\n   */\n  async isValidSeed(seed: string): Promise<boolean> {\n    await this.ensureLoaded();\n    return WdkManager.isValidSeed(seed);\n  }\n\n  /**\n   * Validate seed phrase (sync version - basic check)\n   */\n  isValidSeedSync(seed: string): boolean {\n    const words = seed.trim().split(/\\s+/);\n    return words.length === 12 || words.length === 24;\n  }\n\n  /**\n   * Initialize the service with a seed phrase\n   */\n  async initialize(seed: string): Promise<void> {\n    await this.ensureLoaded();\n\n    if (!WdkManager.isValidSeed(seed)) {\n      throw new Error('Invalid seed phrase');\n    }\n\n    this.seed = seed;\n    this.wallets = {};\n  }\n\n  /**\n   * Get RPC URL for a chain\n   */\n  private getRpcUrl(chain: SupportedChain): string {\n    const networkUrls = DEFAULT_RPC_URLS[this.config.network];\n\n    if (this.config.rpcUrls?.[chain as keyof typeof this.config.rpcUrls]) {\n      return this.config.rpcUrls[chain as keyof typeof this.config.rpcUrls]!;\n    }\n\n    return networkUrls[chain as keyof typeof networkUrls] || '';\n  }\n\n  /**\n   * Get or create wallet instance for a specific chain\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private async getWallet(chain: SupportedChain): Promise<any> {\n    if (!this.seed) {\n      throw new Error('WDK service not initialized. Call initialize() first.');\n    }\n\n    // Return cached wallet if exists\n    if (this.wallets[chain]) {\n      return this.wallets[chain];\n    }\n\n    const isTestnet = this.config.network === 'testnet';\n\n    try {\n      switch (chain) {\n        case 'ethereum': {\n          const rpcUrl = this.getRpcUrl('ethereum');\n          const wallet = new WalletManagerEvm(this.seed, { provider: rpcUrl });\n          this.wallets[chain] = wallet;\n          return wallet;\n        }\n\n        case 'bitcoin': {\n          const wallet = new WalletManagerBtc(this.seed, {\n            network: isTestnet ? 'testnet' : 'bitcoin',\n          });\n          this.wallets[chain] = wallet;\n          return wallet;\n        }\n\n        case 'solana': {\n          const rpcUrl = this.getRpcUrl('solana');\n          const wallet = new WalletManagerSolana(this.seed, {\n            rpcUrl,\n          });\n          this.wallets[chain] = wallet;\n          return wallet;\n        }\n\n        case 'ton': {\n          const url = this.getRpcUrl('ton');\n          const wallet = new WalletManagerTon(this.seed, {\n            tonClient: { url },\n          });\n          this.wallets[chain] = wallet;\n          return wallet;\n        }\n\n        case 'tron': {\n          const fullHost = this.getRpcUrl('tron');\n          const wallet = new WalletManagerTron(this.seed, {\n            provider: fullHost,\n          });\n          this.wallets[chain] = wallet;\n          return wallet;\n        }\n\n        case 'spark': {\n          const wallet = new WalletManagerSpark(this.seed, {\n            network: isTestnet ? 'TESTNET' : 'MAINNET',\n          });\n          this.wallets[chain] = wallet;\n          return wallet;\n        }\n\n        default:\n          throw new Error(`Unsupported chain: ${chain}`);\n      }\n    } catch (error) {\n      console.error(`Failed to initialize ${chain} wallet:`, error);\n      throw error;\n    }\n  }\n\n  /**\n   * Derive address for a specific chain\n   */\n  async deriveAddress(chain: SupportedChain): Promise<ChainAddress> {\n    const path = DERIVATION_PATHS[chain];\n\n    try {\n      const wallet = await this.getWallet(chain);\n      const account = await wallet.getAccount(0);\n      const address = await account.getAddress();\n\n      return {\n        chain,\n        address,\n        path,\n      };\n    } catch (error) {\n      console.error(`Error deriving ${chain} address:`, error);\n      throw error;\n    }\n  }\n\n  /**\n   * Derive addresses for all supported chains\n   */\n  async deriveAllAddresses(): Promise<MultiChainAddresses> {\n    const chains: SupportedChain[] = ['ethereum', 'bitcoin', 'ton', 'tron', 'solana', 'spark'];\n    const addresses: MultiChainAddresses = {\n      ethereum: null,\n      bitcoin: null,\n      ton: null,\n      tron: null,\n      solana: null,\n      spark: null,\n    };\n\n    // Derive all addresses in parallel for better performance\n    const results = await Promise.allSettled(\n      chains.map(async (chain) => {\n        const result = await this.deriveAddress(chain);\n        return { chain, address: result.address };\n      })\n    );\n\n    for (const result of results) {\n      if (result.status === 'fulfilled') {\n        addresses[result.value.chain] = result.value.address;\n      } else {\n        console.error('Failed to derive address:', result.reason);\n      }\n    }\n\n    return addresses;\n  }\n\n  /**\n   * Derive addresses for specific chains only\n   */\n  async deriveAddressesForChains(chains: SupportedChain[]): Promise<Partial<MultiChainAddresses>> {\n    const addresses: Partial<MultiChainAddresses> = {};\n\n    const results = await Promise.allSettled(\n      chains.map(async (chain) => {\n        const result = await this.deriveAddress(chain);\n        return { chain, address: result.address };\n      })\n    );\n\n    for (const result of results) {\n      if (result.status === 'fulfilled') {\n        addresses[result.value.chain] = result.value.address;\n      }\n    }\n\n    return addresses;\n  }\n\n  /**\n   * Get fee rates for a specific chain\n   */\n  async getFeeRates(\n    chain: SupportedChain\n  ): Promise<{ slow: string; medium: string; fast: string }> {\n    if (!this.seed) {\n      throw new Error('WDK service not initialized. Call initialize() first.');\n    }\n\n    try {\n      const wallet = await this.getWallet(chain);\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const feeRates: any = await wallet.getFeeRates();\n      return {\n        slow: (feeRates.slow || feeRates.low || '0').toString(),\n        medium: (feeRates.medium || feeRates.normal || feeRates.standard || '0').toString(),\n        fast: (feeRates.fast || feeRates.high || '0').toString(),\n      };\n    } catch (error) {\n      console.error(`Error fetching fee rates for ${chain}:`, error);\n      throw error;\n    }\n  }\n\n  /**\n   * Get the current network configuration\n   */\n  getNetwork(): 'mainnet' | 'testnet' {\n    return this.config.network;\n  }\n\n  /**\n   * Check if service is initialized\n   */\n  isInitialized(): boolean {\n    return this.seed !== null;\n  }\n\n  /**\n   * Clean up and dispose of wallet instances\n   */\n  dispose(): void {\n    for (const wallet of Object.values(this.wallets)) {\n      if (wallet && typeof wallet.dispose === 'function') {\n        try {\n          wallet.dispose();\n        } catch {\n          // Ignore dispose errors\n        }\n      }\n    }\n    this.wallets = {};\n    this.seed = null;\n  }\n}\n\n// Singleton instance\nlet wdkServiceInstance: WdkService | null = null;\n\n/**\n * Get or create the WDK service singleton\n */\nexport function getWdkService(config?: Partial<WdkServiceConfig>): WdkService {\n  if (!wdkServiceInstance || (config && config.network !== wdkServiceInstance.getNetwork())) {\n    wdkServiceInstance = new WdkService(config);\n  }\n  return wdkServiceInstance;\n}\n\n/**\n * Create a new WDK service instance (non-singleton)\n */\nexport function createWdkService(config?: Partial<WdkServiceConfig>): WdkService {\n  return new WdkService(config);\n}\n","import { Wallet, HDNodeWallet, formatEther, parseEther } from 'ethers';\nimport { createPublicClient, http, formatEther as viemFormatEther } from 'viem';\nimport { sepolia, mainnet } from 'viem/chains';\nimport { KeyManager } from '../security';\nimport type { SecureStorageAdapter } from '../storage/SecureStorage';\nimport { createSecureStorage, WebEncryptedStorageAdapter } from '../storage/SecureStorage';\nimport { NETWORKS, DERIVATION_PATHS, getNetworkConfig, type NetworkConfig } from '../config/networks';\nimport type { NetworkType } from '../types';\nimport { getWdkApiClient } from '../services/WdkApiClient';\nimport { WdkService, type MultiChainAddresses as WdkMultiChainAddresses } from '../services/WdkService';\n\n/**\n * Note on Tether WDK Integration:\n *\n * Tether WDK (@tetherto/wdk, @tetherto/wdk-wallet-btc, @tetherto/wdk-wallet-evm)\n * is designed for Node.js and React Native environments. The Bitcoin wallet module\n * uses Electrum client which requires Node.js 'net' module.\n *\n * For browser environments (Next.js, React web), we use ethers.js for address derivation\n * following proper BIP-44/BIP-84 paths. This provides deterministic addresses that are\n * compatible with the same seed used in WDK-based apps.\n *\n * For React Native or Node.js apps, you can integrate WDK directly:\n * @see https://docs.wallet.tether.io/\n */\n\n/**\n * Storage keys for wallet data\n */\nconst STORAGE_KEYS = {\n  ENCRYPTED_SEED: 'encrypted_seed',\n  ACTIVE_WALLET: 'active_wallet',\n} as const;\n\n/**\n * Supported chains for Zubari WDK Wallet\n */\nexport const SUPPORTED_CHAINS: NetworkType[] = ['ethereum', 'bitcoin', 'ton', 'tron', 'solana', 'spark'];\n\n/**\n * Chain balance information\n */\nexport interface ChainBalance {\n  chain: NetworkType;\n  symbol: string;\n  balance: string;\n  balanceUsd: number;\n  address: string;\n  decimals: number;\n  icon?: string;\n}\n\n/**\n * Multi-chain addresses\n */\nexport interface MultiChainAddresses {\n  ethereum: string;\n  bitcoin: string;\n  ton: string;\n  tron: string;\n  solana: string;\n  spark: string;\n}\n\n/**\n * Wallet state interface\n */\nexport interface WalletState {\n  isInitialized: boolean;\n  isLocked: boolean;\n  address: string | null;\n  balance: string | null;\n  // Multi-chain support\n  addresses?: Partial<MultiChainAddresses>;\n  balances?: ChainBalance[];\n  selectedChain?: NetworkType;\n}\n\n/**\n * WalletManager Configuration\n */\nexport interface WalletManagerConfig {\n  network?: 'mainnet' | 'testnet';\n  rpcUrl?: string;\n  storage?: SecureStorageAdapter;\n  enabledChains?: NetworkType[];\n  /** API URL for WDK backend (for multi-chain address derivation) */\n  apiUrl?: string;\n}\n\n/**\n * WalletManager - Handles BIP-39 seed generation, address derivation, and secure storage\n *\n * This class provides:\n * - BIP-39 mnemonic generation (12 words)\n * - BIP-44 address derivation for multiple chains (Ethereum, Bitcoin, TON, TRON, Solana, Spark)\n * - Encrypted seed storage using AES-256-GCM\n * - Multi-chain balance fetching\n */\nexport class WalletManager {\n  private readonly config: Required<Omit<WalletManagerConfig, 'enabledChains'>> & { enabledChains: NetworkType[] };\n  private storage: SecureStorageAdapter;\n  private currentSeed: string | null = null;\n  private derivedAddress: string | null = null;\n  private derivedAddresses: Partial<MultiChainAddresses> = {};\n  private selectedChain: NetworkType = 'ethereum';\n  private wdkService: WdkService;\n\n  constructor(config: WalletManagerConfig = {}) {\n    // Get the appropriate RPC URL from network config\n    const isTestnet = config.network !== 'mainnet';\n    const ethereumConfig = getNetworkConfig('ethereum', isTestnet);\n\n    this.config = {\n      network: config.network || 'testnet',\n      rpcUrl: config.rpcUrl || ethereumConfig.rpcUrl,\n      storage: config.storage || createSecureStorage(),\n      enabledChains: config.enabledChains || SUPPORTED_CHAINS,\n      apiUrl: config.apiUrl || process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3001',\n    };\n    this.storage = this.config.storage;\n\n    // Initialize native WDK service\n    this.wdkService = new WdkService({\n      network: this.config.network,\n    });\n  }\n\n  /**\n   * Generate a new BIP-39 seed phrase (12 words) using ethers.js\n   * For native WDK generation, use generateSeedWithWdk() instead\n   */\n  static generateSeed(): string {\n    const wallet = Wallet.createRandom();\n    const mnemonic = wallet.mnemonic;\n    if (!mnemonic) {\n      throw new Error('Failed to generate mnemonic');\n    }\n    return mnemonic.phrase;\n  }\n\n  /**\n   * Generate a new BIP-39 seed phrase using native Tether WDK\n   * This is the recommended method for generating seed phrases\n   */\n  async generateSeedWithWdk(): Promise<string> {\n    return await this.wdkService.generateSeedPhrase();\n  }\n\n  /**\n   * Validate seed phrase using native WDK (async, more accurate)\n   */\n  async validateSeedWithWdk(seed: string): Promise<boolean> {\n    return await this.wdkService.isValidSeed(seed);\n  }\n\n  /**\n   * Validate a BIP-39 seed phrase\n   */\n  static validateSeed(seed: string): boolean {\n    return KeyManager.validateSeedPhrase(seed);\n  }\n\n  /**\n   * Derive Ethereum address from seed phrase using BIP-44 path\n   * Path: m/44'/60'/0'/0/0\n   */\n  static deriveAddress(seed: string): string {\n    const hdNode = HDNodeWallet.fromPhrase(seed, undefined, \"m/44'/60'/0'/0/0\");\n    return hdNode.address;\n  }\n\n  /**\n   * Get the HDNodeWallet for signing transactions\n   */\n  static getWallet(seed: string): HDNodeWallet {\n    return HDNodeWallet.fromPhrase(seed, undefined, \"m/44'/60'/0'/0/0\");\n  }\n\n  /**\n   * Initialize storage with password (required for web platform)\n   */\n  async initializeStorage(password: string): Promise<void> {\n    if (this.storage instanceof WebEncryptedStorageAdapter) {\n      await this.storage.initialize(password);\n    }\n  }\n\n  /**\n   * Create a new wallet with generated seed\n   */\n  async createWallet(password: string): Promise<{ seed: string; address: string }> {\n    const seed = WalletManager.generateSeed();\n    const address = WalletManager.deriveAddress(seed);\n\n    // Encrypt and store seed\n    const encrypted = await KeyManager.encryptSeed(seed, password);\n    await this.storage.setItem(STORAGE_KEYS.ENCRYPTED_SEED, encrypted);\n\n    this.currentSeed = seed;\n    this.derivedAddress = address;\n\n    return { seed, address };\n  }\n\n  /**\n   * Import an existing wallet from seed phrase\n   */\n  async importWallet(seed: string, password: string): Promise<{ address: string }> {\n    if (!WalletManager.validateSeed(seed)) {\n      throw new Error('Invalid seed phrase');\n    }\n\n    const address = WalletManager.deriveAddress(seed);\n\n    // Encrypt and store seed\n    const encrypted = await KeyManager.encryptSeed(seed, password);\n    await this.storage.setItem(STORAGE_KEYS.ENCRYPTED_SEED, encrypted);\n\n    this.currentSeed = seed;\n    this.derivedAddress = address;\n\n    return { address };\n  }\n\n  /**\n   * Unlock wallet with password\n   */\n  async unlock(password: string): Promise<{ address: string }> {\n    const encrypted = await this.storage.getItem(STORAGE_KEYS.ENCRYPTED_SEED);\n    if (!encrypted) {\n      throw new Error('No wallet found');\n    }\n\n    try {\n      const seed = await KeyManager.decryptSeed(encrypted, password);\n      const address = WalletManager.deriveAddress(seed);\n\n      this.currentSeed = seed;\n      this.derivedAddress = address;\n\n      return { address };\n    } catch {\n      throw new Error('Invalid password');\n    }\n  }\n\n  /**\n   * Lock wallet (clear seed from memory)\n   */\n  lock(): void {\n    this.currentSeed = null;\n    this.wdkService.dispose();\n    // Keep derived address for display\n  }\n\n  /**\n   * Check if wallet exists in storage\n   */\n  async hasWallet(): Promise<boolean> {\n    return this.storage.hasItem(STORAGE_KEYS.ENCRYPTED_SEED);\n  }\n\n  /**\n   * Delete wallet from storage\n   */\n  async deleteWallet(): Promise<void> {\n    await this.storage.removeItem(STORAGE_KEYS.ENCRYPTED_SEED);\n    this.currentSeed = null;\n    this.derivedAddress = null;\n    this.derivedAddresses = {};\n    this.wdkService.dispose();\n  }\n\n  /**\n   * Get current wallet state\n   */\n  getState(): WalletState {\n    return {\n      isInitialized: this.derivedAddress !== null,\n      isLocked: this.currentSeed === null && this.derivedAddress !== null,\n      address: this.derivedAddress,\n      balance: null, // Use fetchBalance for current balance\n    };\n  }\n\n  /**\n   * Get current address (if unlocked)\n   */\n  getAddress(): string | null {\n    return this.derivedAddress;\n  }\n\n  /**\n   * Check if wallet is unlocked\n   */\n  isUnlocked(): boolean {\n    return this.currentSeed !== null;\n  }\n\n  /**\n   * Get the seed phrase (only if unlocked)\n   */\n  getSeed(): string | null {\n    return this.currentSeed;\n  }\n\n  /**\n   * Fetch balance for current address with timeout handling\n   */\n  async fetchBalance(): Promise<string> {\n    if (!this.derivedAddress) {\n      throw new Error('Wallet not initialized');\n    }\n\n    const chain = this.config.network === 'mainnet' ? mainnet : sepolia;\n    const client = createPublicClient({\n      chain,\n      transport: http(this.config.rpcUrl, {\n        timeout: 15000, // 15 second timeout\n        retryCount: 2,\n        retryDelay: 1000,\n      }),\n    });\n\n    try {\n      const balance = await client.getBalance({\n        address: this.derivedAddress as `0x${string}`,\n      });\n\n      return viemFormatEther(balance);\n    } catch (error) {\n      console.warn('Failed to fetch balance:', error);\n      // Return '0' instead of throwing to not block wallet operations\n      return '0';\n    }\n  }\n\n  /**\n   * Create viem public client for the current network\n   */\n  getPublicClient() {\n    const chain = this.config.network === 'mainnet' ? mainnet : sepolia;\n    return createPublicClient({\n      chain,\n      transport: http(this.config.rpcUrl, {\n        timeout: 15000, // 15 second timeout\n        retryCount: 2,\n        retryDelay: 1000,\n      }),\n    });\n  }\n\n  /**\n   * Get ethers wallet for signing (only if unlocked)\n   */\n  getEthersWallet(): HDNodeWallet | null {\n    if (!this.currentSeed) return null;\n    return WalletManager.getWallet(this.currentSeed);\n  }\n\n  /**\n   * Set active wallet preference\n   */\n  async setActiveWalletPreference(wallet: 'metamask' | 'wdk'): Promise<void> {\n    await this.storage.setItem(STORAGE_KEYS.ACTIVE_WALLET, wallet);\n  }\n\n  /**\n   * Get active wallet preference\n   */\n  async getActiveWalletPreference(): Promise<'metamask' | 'wdk'> {\n    const stored = await this.storage.getItem(STORAGE_KEYS.ACTIVE_WALLET);\n    return (stored === 'metamask' || stored === 'wdk') ? stored : 'metamask';\n  }\n\n  // ==========================================\n  // Multi-Chain Support Methods (Powered by Tether WDK)\n  // ==========================================\n\n  /**\n   * Derive address for a specific chain (async version)\n   *\n   * Calls the backend WDK API for proper derivation when available.\n   * Falls back to local ethers-based derivation if API is unavailable.\n   */\n  static async deriveAddressForChainAsync(\n    seed: string,\n    chain: NetworkType,\n    network: 'mainnet' | 'testnet' = 'testnet',\n    apiUrl?: string\n  ): Promise<string> {\n    try {\n      // Try to use the WDK API for proper derivation\n      const wdkApi = getWdkApiClient(apiUrl);\n      const response = await wdkApi.deriveAddress(seed, chain, network);\n\n      if (response.success && response.address) {\n        return response.address;\n      }\n\n      console.warn(`WDK API failed for ${chain}, using local derivation:`, response.error);\n    } catch (error) {\n      console.warn(`WDK API unavailable for ${chain}, using local derivation:`, error);\n    }\n\n    // Fallback to local ethers-based derivation\n    return WalletManager.deriveAddressForChain(seed, chain);\n  }\n\n  /**\n   * Format address for non-WDK chains (fallback)\n   *\n   * Note: This fallback produces PLACEHOLDER addresses derived from the seed.\n   * For real blockchain interaction, use the WDK API via deriveAddressForChainAsync().\n   * These addresses should NOT be used for receiving funds without verification.\n   */\n  private static formatAddressForChain(address: string, chain: NetworkType): string {\n    // For Ethereum, just return the address as-is\n    if (chain === 'ethereum') {\n      return address;\n    }\n\n    // Generate deterministic placeholder addresses from the Ethereum address\n    // These are NOT cryptographically correct for each chain but are:\n    // - Deterministic (same seed = same address)\n    // - Correctly formatted for each chain\n    // - Clearly marked as needing verification\n\n    const addressBytes = address.toLowerCase().replace('0x', '');\n\n    switch (chain) {\n      case 'bitcoin': {\n        // Bitcoin testnet P2WPKH addresses start with tb1q\n        // Format: tb1q + 38 chars of bech32\n        // Use first 32 chars of address hash as base for bech32-like encoding\n        const btcChars = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l';\n        let btcAddr = 'tb1q';\n        for (let i = 0; i < 38; i++) {\n          const idx = parseInt(addressBytes.charAt(i % 40) || '0', 16) % btcChars.length;\n          btcAddr += btcChars[idx];\n        }\n        return btcAddr;\n      }\n\n      case 'ton': {\n        // TON bounceable address: EQ + 46 chars base64url\n        // Total length: 48 chars\n        const base64Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n        let tonAddr = 'EQ';\n        for (let i = 0; i < 46; i++) {\n          const idx = parseInt(addressBytes.charAt(i % 40) || '0', 16) * 4 % base64Chars.length;\n          tonAddr += base64Chars[idx];\n        }\n        return tonAddr;\n      }\n\n      case 'tron': {\n        // TRON address: T + 33 chars base58\n        // Total length: 34 chars\n        const base58Chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n        let tronAddr = 'T';\n        for (let i = 0; i < 33; i++) {\n          const idx = parseInt(addressBytes.charAt(i % 40) || '0', 16) * 3 % base58Chars.length;\n          tronAddr += base58Chars[idx];\n        }\n        return tronAddr;\n      }\n\n      case 'solana': {\n        // Solana address: 32-44 chars base58\n        // Typically 44 chars\n        const base58Chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n        let solAddr = '';\n        for (let i = 0; i < 44; i++) {\n          const idx = parseInt(addressBytes.charAt(i % 40) || '0', 16) * 3 % base58Chars.length;\n          solAddr += base58Chars[idx];\n        }\n        return solAddr;\n      }\n\n      case 'spark': {\n        // Spark/Lightning: sp1 + 59 chars bech32m\n        // Total length: 62 chars\n        const bech32Chars = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l';\n        let sparkAddr = 'sp1q';\n        for (let i = 0; i < 58; i++) {\n          const idx = parseInt(addressBytes.charAt(i % 40) || '0', 16) % bech32Chars.length;\n          sparkAddr += bech32Chars[idx];\n        }\n        return sparkAddr;\n      }\n\n      default:\n        return address;\n    }\n  }\n\n  /**\n   * Derive address for a specific chain (sync version for backwards compatibility)\n   * Uses ethers for basic derivation, use deriveAddressForChainAsync for WDK\n   *\n   * Note: For non-Ethereum chains, this produces placeholder addresses that are\n   * deterministic but not cryptographically valid. Use WDK API for real addresses.\n   */\n  static deriveAddressForChain(seed: string, chain: NetworkType): string {\n    // Always derive from Ethereum path first to get the base address\n    const ethPath = DERIVATION_PATHS['ethereum'];\n    const ethNode = HDNodeWallet.fromPhrase(seed, undefined, `${ethPath}/0`);\n\n    if (chain === 'ethereum') {\n      return ethNode.address;\n    }\n\n    // For other chains, generate formatted placeholder addresses based on the ETH address\n    return WalletManager.formatAddressForChain(ethNode.address, chain);\n  }\n\n  /**\n   * Derive addresses for all enabled chains (sync version)\n   */\n  deriveAllAddresses(): Partial<MultiChainAddresses> {\n    if (!this.currentSeed) {\n      throw new Error('Wallet is locked');\n    }\n\n    const addresses: Partial<MultiChainAddresses> = {};\n\n    for (const chain of this.config.enabledChains) {\n      addresses[chain] = WalletManager.deriveAddressForChain(this.currentSeed, chain);\n    }\n\n    this.derivedAddresses = addresses;\n    return addresses;\n  }\n\n  /**\n   * Derive addresses for all enabled chains using native Tether WDK (recommended)\n   * This uses the WDK directly without needing a backend API.\n   * Returns REAL cryptographically valid addresses for all chains.\n   */\n  async deriveAllAddressesWithWdk(): Promise<Partial<MultiChainAddresses>> {\n    if (!this.currentSeed) {\n      throw new Error('Wallet is locked');\n    }\n\n    try {\n      // Initialize WDK with the current seed\n      await this.wdkService.initialize(this.currentSeed);\n\n      // Derive addresses for enabled chains only\n      const enabledChainsSet = new Set(this.config.enabledChains);\n      const wdkAddresses = await this.wdkService.deriveAllAddresses();\n\n      // Filter to only enabled chains\n      const addresses: Partial<MultiChainAddresses> = {};\n      for (const [chain, address] of Object.entries(wdkAddresses)) {\n        if (enabledChainsSet.has(chain as NetworkType) && address) {\n          addresses[chain as NetworkType] = address;\n        }\n      }\n\n      this.derivedAddresses = addresses;\n      return addresses;\n    } catch (error) {\n      console.error('Native WDK derivation failed:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Derive addresses for all enabled chains using Tether WDK\n   * Tries native WDK first, then falls back to API, then to placeholders\n   */\n  async deriveAllAddressesAsync(): Promise<Partial<MultiChainAddresses>> {\n    if (!this.currentSeed) {\n      throw new Error('Wallet is locked');\n    }\n\n    // Strategy 1: Try native WDK (best - no network dependency)\n    try {\n      return await this.deriveAllAddressesWithWdk();\n    } catch (wdkError) {\n      console.warn('Native WDK failed, trying API:', wdkError);\n    }\n\n    // Strategy 2: Try WDK API (requires backend running)\n    try {\n      const wdkApi = getWdkApiClient(this.config.apiUrl);\n      const response = await wdkApi.deriveAllAddresses(this.currentSeed, this.config.network);\n\n      if (response.success && response.addresses) {\n        // Filter to only enabled chains\n        const addresses: Partial<MultiChainAddresses> = {};\n        for (const chain of this.config.enabledChains) {\n          const address = response.addresses[chain];\n          if (address) {\n            addresses[chain] = address;\n          }\n        }\n        this.derivedAddresses = addresses;\n        return addresses;\n      }\n\n      console.warn('WDK API call failed:', response.error);\n    } catch (apiError) {\n      console.warn('WDK API unavailable:', apiError);\n    }\n\n    // Strategy 3: Fallback to placeholders (NOT RECOMMENDED - addresses are not real)\n    console.warn('WARNING: Using placeholder addresses. These are NOT valid for receiving funds!');\n    return this.deriveAllAddresses();\n  }\n\n  /**\n   * Get address for a specific chain\n   */\n  getAddressForChain(chain: NetworkType): string | null {\n    if (!this.currentSeed) {\n      return this.derivedAddresses[chain] || null;\n    }\n\n    if (!this.derivedAddresses[chain]) {\n      this.derivedAddresses[chain] = WalletManager.deriveAddressForChain(this.currentSeed, chain);\n    }\n\n    return this.derivedAddresses[chain] || null;\n  }\n\n  /**\n   * Get all derived addresses\n   */\n  getAllAddresses(): Partial<MultiChainAddresses> {\n    return { ...this.derivedAddresses };\n  }\n\n  /**\n   * Set the selected chain\n   */\n  setSelectedChain(chain: NetworkType): void {\n    if (!this.config.enabledChains.includes(chain)) {\n      throw new Error(`Chain ${chain} is not enabled`);\n    }\n    this.selectedChain = chain;\n  }\n\n  /**\n   * Get the currently selected chain\n   */\n  getSelectedChain(): NetworkType {\n    return this.selectedChain;\n  }\n\n  /**\n   * Get enabled chains\n   */\n  getEnabledChains(): NetworkType[] {\n    return [...this.config.enabledChains];\n  }\n\n  /**\n   * Get chain configuration\n   */\n  getChainConfig(chain: NetworkType): NetworkConfig {\n    return getNetworkConfig(chain, this.config.network === 'testnet');\n  }\n\n  /**\n   * Fetch balance for a specific chain\n   * Note: Currently only Ethereum is implemented\n   */\n  async fetchBalanceForChain(chain: NetworkType): Promise<ChainBalance> {\n    const address = this.getAddressForChain(chain);\n    if (!address) {\n      throw new Error(`No address for chain ${chain}`);\n    }\n\n    const networkConfig = this.getChainConfig(chain);\n    let balance = '0';\n\n    // Fetch balance based on chain type\n    if (chain === 'ethereum') {\n      const viemChain = this.config.network === 'mainnet' ? mainnet : sepolia;\n      const client = createPublicClient({\n        chain: viemChain,\n        transport: http(this.config.rpcUrl, {\n          timeout: 15000, // 15 second timeout\n          retryCount: 2,\n          retryDelay: 1000,\n        }),\n      });\n\n      try {\n        const rawBalance = await client.getBalance({\n          address: address as `0x${string}`,\n        });\n        balance = viemFormatEther(rawBalance);\n      } catch (error) {\n        console.warn(`Failed to fetch ${chain} balance:`, error);\n        // Balance remains '0' on error\n      }\n    }\n    // TODO: Implement balance fetching for other chains\n    // - Bitcoin: Use blockstream API\n    // - TON: Use toncenter API\n    // - TRON: Use trongrid API\n    // - Solana: Use Solana JSON RPC\n    // - Spark: Use Spark SDK\n\n    return {\n      chain,\n      symbol: networkConfig.nativeCurrency.symbol,\n      balance,\n      balanceUsd: 0, // TODO: Implement price fetching\n      address,\n      decimals: networkConfig.nativeCurrency.decimals,\n    };\n  }\n\n  /**\n   * Fetch balances for all enabled chains\n   */\n  async fetchAllBalances(): Promise<ChainBalance[]> {\n    const balances: ChainBalance[] = [];\n\n    for (const chain of this.config.enabledChains) {\n      try {\n        const balance = await this.fetchBalanceForChain(chain);\n        balances.push(balance);\n      } catch (error) {\n        console.error(`Failed to fetch balance for ${chain}:`, error);\n        // Add placeholder balance on error\n        const networkConfig = this.getChainConfig(chain);\n        balances.push({\n          chain,\n          symbol: networkConfig.nativeCurrency.symbol,\n          balance: '0',\n          balanceUsd: 0,\n          address: this.getAddressForChain(chain) || '',\n          decimals: networkConfig.nativeCurrency.decimals,\n        });\n      }\n    }\n\n    return balances;\n  }\n\n  /**\n   * Get extended wallet state with multi-chain info\n   */\n  getExtendedState(): WalletState {\n    return {\n      isInitialized: this.derivedAddress !== null,\n      isLocked: this.currentSeed === null && this.derivedAddress !== null,\n      address: this.derivedAddress,\n      balance: null,\n      addresses: this.derivedAddresses,\n      selectedChain: this.selectedChain,\n    };\n  }\n}\n","/**\n * React hooks for WalletManager\n *\n * These hooks provide a React-friendly interface to the WalletManager class.\n * They handle state management, loading states, and error handling.\n */\n\nimport { useState, useCallback, useEffect, useMemo } from 'react';\nimport {\n  WalletManager,\n  SUPPORTED_CHAINS,\n  type WalletState,\n  type WalletManagerConfig,\n  type ChainBalance,\n  type MultiChainAddresses,\n} from '../wallet';\nimport type { NetworkType } from '../types';\n\nexport interface UseWalletManagerOptions extends WalletManagerConfig {\n  autoCheckWallet?: boolean;\n}\n\nexport interface UseWalletManagerReturn {\n  // State\n  state: WalletState;\n  isLoading: boolean;\n  error: string | null;\n\n  // Basic Actions\n  createWallet: (password: string) => Promise<{ seed: string; address: string }>;\n  importWallet: (seed: string, password: string) => Promise<void>;\n  unlock: (password: string) => Promise<void>;\n  lock: () => void;\n  deleteWallet: () => Promise<void>;\n  fetchBalance: () => Promise<string>;\n\n  // Multi-chain Actions\n  selectedChain: NetworkType;\n  setSelectedChain: (chain: NetworkType) => void;\n  chainBalances: ChainBalance[];\n  fetchAllBalances: () => Promise<ChainBalance[]>;\n  getAddressForChain: (chain: NetworkType) => string | null;\n  getAllAddresses: () => Partial<MultiChainAddresses>;\n  supportedChains: NetworkType[];\n\n  // Utilities\n  hasWallet: () => Promise<boolean>;\n  getSeed: () => string | null;\n  manager: WalletManager;\n}\n\n/**\n * React hook for managing a WDK wallet with multi-chain support\n */\nexport function useWalletManager(\n  options: UseWalletManagerOptions = {}\n): UseWalletManagerReturn {\n  const { autoCheckWallet = true, ...config } = options;\n\n  // Create manager instance (memoized)\n  const manager = useMemo(() => new WalletManager(config), [\n    config.network,\n    config.rpcUrl,\n  ]);\n\n  // State\n  const [state, setState] = useState<WalletState>({\n    isInitialized: false,\n    isLocked: true,\n    address: null,\n    balance: null,\n  });\n  const [isLoading, setIsLoading] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n  const [selectedChain, setSelectedChainState] = useState<NetworkType>('ethereum');\n  const [chainBalances, setChainBalances] = useState<ChainBalance[]>([]);\n\n  // Update state from manager\n  const updateState = useCallback(() => {\n    setState(manager.getExtendedState());\n  }, [manager]);\n\n  // Check if wallet exists on mount\n  useEffect(() => {\n    if (autoCheckWallet) {\n      manager.hasWallet().then((exists) => {\n        if (exists) {\n          setState((prev) => ({\n            ...prev,\n            isInitialized: true,\n            isLocked: true,\n          }));\n        }\n      });\n    }\n  }, [manager, autoCheckWallet]);\n\n  // Create new wallet\n  const createWallet = useCallback(\n    async (password: string) => {\n      setIsLoading(true);\n      setError(null);\n      try {\n        // Initialize storage for web\n        await manager.initializeStorage(password);\n        const result = await manager.createWallet(password);\n        // Derive addresses for all chains using Tether WDK (async)\n        // Falls back to sync derivation if WDK is not available\n        try {\n          await manager.deriveAllAddressesAsync();\n        } catch {\n          manager.deriveAllAddresses();\n        }\n        updateState();\n        return result;\n      } catch (err) {\n        const message = err instanceof Error ? err.message : 'Failed to create wallet';\n        setError(message);\n        throw err;\n      } finally {\n        setIsLoading(false);\n      }\n    },\n    [manager, updateState]\n  );\n\n  // Import existing wallet\n  const importWallet = useCallback(\n    async (seed: string, password: string) => {\n      setIsLoading(true);\n      setError(null);\n      try {\n        await manager.initializeStorage(password);\n        await manager.importWallet(seed, password);\n        // Derive addresses for all chains using Tether WDK (async)\n        try {\n          await manager.deriveAllAddressesAsync();\n        } catch {\n          manager.deriveAllAddresses();\n        }\n        updateState();\n      } catch (err) {\n        const message = err instanceof Error ? err.message : 'Failed to import wallet';\n        setError(message);\n        throw err;\n      } finally {\n        setIsLoading(false);\n      }\n    },\n    [manager, updateState]\n  );\n\n  // Unlock wallet\n  const unlock = useCallback(\n    async (password: string) => {\n      setIsLoading(true);\n      setError(null);\n      try {\n        await manager.initializeStorage(password);\n        await manager.unlock(password);\n        // Derive addresses for all chains using Tether WDK (async)\n        try {\n          await manager.deriveAllAddressesAsync();\n        } catch {\n          manager.deriveAllAddresses();\n        }\n        updateState();\n      } catch (err) {\n        const message = err instanceof Error ? err.message : 'Invalid password';\n        setError(message);\n        throw err;\n      } finally {\n        setIsLoading(false);\n      }\n    },\n    [manager, updateState]\n  );\n\n  // Lock wallet\n  const lock = useCallback(() => {\n    manager.lock();\n    setChainBalances([]);\n    updateState();\n  }, [manager, updateState]);\n\n  // Delete wallet\n  const deleteWallet = useCallback(async () => {\n    setIsLoading(true);\n    setError(null);\n    try {\n      await manager.deleteWallet();\n      setChainBalances([]);\n      setState({\n        isInitialized: false,\n        isLocked: true,\n        address: null,\n        balance: null,\n      });\n    } catch (err) {\n      const message = err instanceof Error ? err.message : 'Failed to delete wallet';\n      setError(message);\n      throw err;\n    } finally {\n      setIsLoading(false);\n    }\n  }, [manager]);\n\n  // Fetch balance (for selected chain)\n  const fetchBalance = useCallback(async () => {\n    setIsLoading(true);\n    // Don't clear error here - balance fetch errors shouldn't clear previous errors\n    try {\n      const balance = await manager.fetchBalance();\n      setState((prev) => ({ ...prev, balance }));\n      return balance;\n    } catch (err) {\n      // Log warning but don't throw - balance fetch errors shouldn't block UI\n      console.warn('Failed to fetch balance:', err);\n      // Return '0' instead of throwing to not block wallet operations\n      setState((prev) => ({ ...prev, balance: '0' }));\n      return '0';\n    } finally {\n      setIsLoading(false);\n    }\n  }, [manager]);\n\n  // Fetch all chain balances\n  const fetchAllBalances = useCallback(async () => {\n    setIsLoading(true);\n    // Don't clear error here - balance fetch errors shouldn't clear previous errors\n    try {\n      const balances = await manager.fetchAllBalances();\n      setChainBalances(balances);\n      return balances;\n    } catch (err) {\n      // Log warning but don't throw - balance fetch errors shouldn't block UI\n      console.warn('Failed to fetch all balances:', err);\n      // Return empty array instead of throwing\n      return [];\n    } finally {\n      setIsLoading(false);\n    }\n  }, [manager]);\n\n  // Set selected chain\n  const setSelectedChain = useCallback((chain: NetworkType) => {\n    manager.setSelectedChain(chain);\n    setSelectedChainState(chain);\n  }, [manager]);\n\n  // Get address for chain\n  const getAddressForChain = useCallback(\n    (chain: NetworkType) => manager.getAddressForChain(chain),\n    [manager]\n  );\n\n  // Get all addresses\n  const getAllAddresses = useCallback(\n    () => manager.getAllAddresses(),\n    [manager]\n  );\n\n  // Check if wallet exists\n  const hasWallet = useCallback(() => manager.hasWallet(), [manager]);\n\n  // Get seed (only if unlocked)\n  const getSeed = useCallback(() => manager.getSeed(), [manager]);\n\n  return {\n    state,\n    isLoading,\n    error,\n    createWallet,\n    importWallet,\n    unlock,\n    lock,\n    deleteWallet,\n    fetchBalance,\n    // Multi-chain\n    selectedChain,\n    setSelectedChain,\n    chainBalances,\n    fetchAllBalances,\n    getAddressForChain,\n    getAllAddresses,\n    supportedChains: SUPPORTED_CHAINS,\n    // Utilities\n    hasWallet,\n    getSeed,\n    manager,\n  };\n}\n"]}