{"version":3,"sources":["../src/config/networks.ts","../src/config/contracts.ts","../src/wallet/ZubariWallet.ts","../src/security/KeyManager.ts","../src/storage/SecureStorage.ts","../src/services/WdkApiClient.ts","../src/services/WdkService.ts","../src/wallet/WalletManager.ts","../src/protocols/NFTProtocol.ts","../src/protocols/TipsProtocol.ts","../src/protocols/SubscriptionProtocol.ts","../src/protocols/PayoutsProtocol.ts","../src/services/SwapService.ts","../src/types/index.ts","../src/react/useWalletManager.ts","../src/utils/index.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","// Contract addresses for Zubari ecosystem\nexport interface ContractAddresses {\n  registry: string;\n  nft: string;\n  marketplace: string;\n  tips: string;\n  subscriptions: string;\n  payouts: string;\n  entryPoint: string;\n  paymaster: string;\n  accountFactory: string;\n  usdt: string;\n  weth: string;\n}\n\n// Placeholder addresses - will be updated after deployment\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nexport const ZUBARI_CONTRACTS: Record<'testnet' | 'mainnet', ContractAddresses> = {\n  testnet: {\n    // Ethereum Sepolia (11155111) - Deployed 2024-12-09\n    registry: '0xEdDf443D48832f23D4A0bED4C4c5eF200B38A7d3',\n    nft: '0xdc37e25650D685e4c38124aC314477Ea5f508a9e',\n    marketplace: ZERO_ADDRESS, // Not yet deployed\n    tips: '0xFDc353edC63Cd3D4bba35bB43861369516a9Dc85',\n    subscriptions: '0x8C05F8aD2F295fB7f3596043a7c37C98A5F7fAB8',\n    payouts: '0x804Fe503936E8b8d3D5Dbb62AF4fB6Fe7265Fb2c',\n    entryPoint: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n    paymaster: ZERO_ADDRESS, // Not yet deployed\n    accountFactory: ZERO_ADDRESS, // Not yet deployed\n    usdt: '0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0', // USDT on Sepolia\n    weth: '0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14',\n  },\n  mainnet: {\n    // Ethereum Mainnet (1)\n    registry: ZERO_ADDRESS,\n    nft: ZERO_ADDRESS,\n    marketplace: ZERO_ADDRESS,\n    tips: ZERO_ADDRESS,\n    subscriptions: ZERO_ADDRESS,\n    payouts: ZERO_ADDRESS,\n    entryPoint: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n    paymaster: ZERO_ADDRESS,\n    accountFactory: ZERO_ADDRESS,\n    usdt: '0xdAC17F958D2ee523a2206206994597C13D831ec7', // USDT on Ethereum\n    weth: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n  },\n};\n\n// Platform configuration\nexport const PLATFORM_CONFIG = {\n  // Platform fee in basis points (300 = 3%)\n  tipFeeBps: 300,\n  // Maximum royalty in basis points (1000 = 10%)\n  maxRoyaltyBps: 1000,\n  // Default slippage tolerance for swaps (50 = 0.5%)\n  defaultSlippageBps: 50,\n  // Voucher validity in seconds (30 days)\n  voucherValiditySecs: 30 * 24 * 60 * 60,\n  // Swap deadline in seconds (30 minutes)\n  swapDeadlineSecs: 30 * 60,\n} as const;\n\n// EIP-712 Domain for lazy minting\nexport const NFT_VOUCHER_DOMAIN = {\n  name: 'ZubariNFT',\n  version: '1',\n} as const;\n\nexport const NFT_VOUCHER_TYPES = {\n  NFTVoucher: [\n    { name: 'tokenId', type: 'bytes32' },\n    { name: 'uri', type: 'string' },\n    { name: 'creator', type: 'address' },\n    { name: 'royaltyBps', type: 'uint256' },\n    { name: 'deadline', type: 'uint256' },\n  ],\n} as const;\n\nexport function getContractAddresses(network: 'testnet' | 'mainnet'): ContractAddresses {\n  return ZUBARI_CONTRACTS[network];\n}\n","import type {\n  ZubariWalletConfig,\n  NetworkType,\n  NetworkBalance,\n  TxResult,\n  Account,\n  SendParams,\n} from '../types';\nimport { getNetworkConfig, DERIVATION_PATHS } from '../config/networks';\nimport { getContractAddresses } from '../config/contracts';\n\n/**\n * ZubariWallet - Multi-chain self-custodial wallet\n *\n * Core wallet class that manages accounts across multiple blockchain networks\n * using Tether WDK as the underlying infrastructure layer.\n */\nexport class ZubariWallet {\n  private readonly seed: string;\n  private readonly config: ZubariWalletConfig;\n  private readonly accounts: Map<NetworkType, Account> = new Map();\n  private initialized: boolean = false;\n\n  constructor(seed: string, config: ZubariWalletConfig) {\n    this.seed = seed;\n    this.config = {\n      network: config.network || 'mainnet',\n      enabledNetworks: config.enabledNetworks || ['ethereum'],\n      gasless: config.gasless ?? false,\n      paymasterUrl: config.paymasterUrl,\n      bundlerUrl: config.bundlerUrl,\n      rpcUrls: config.rpcUrls,\n    };\n  }\n\n  /**\n   * Initialize the wallet by deriving accounts for all enabled networks\n   */\n  async initialize(): Promise<void> {\n    if (this.initialized) return;\n\n    for (const network of this.config.enabledNetworks) {\n      await this.deriveAccount(network);\n    }\n\n    this.initialized = true;\n  }\n\n  /**\n   * Derive account for a specific network using BIP-44\n   */\n  private async deriveAccount(network: NetworkType, index: number = 0): Promise<Account> {\n    const networkConfig = getNetworkConfig(network, this.config.network === 'testnet');\n    const basePath = DERIVATION_PATHS[network];\n    const derivationPath = `${basePath}/${index}`;\n\n    // This is a placeholder implementation\n    // Real implementation will use WDK wallet managers\n    const account: Account = {\n      network,\n      address: '', // Will be derived using WDK\n      publicKey: '',\n      derivationPath,\n    };\n\n    this.accounts.set(network, account);\n    return account;\n  }\n\n  /**\n   * Get account for a specific network\n   */\n  async getAccount(network: NetworkType, index: number = 0): Promise<Account> {\n    const existing = this.accounts.get(network);\n    if (existing && existing.derivationPath.endsWith(`/${index}`)) {\n      return existing;\n    }\n    return this.deriveAccount(network, index);\n  }\n\n  /**\n   * Get address for a specific network\n   */\n  async getAddress(network: NetworkType): Promise<string> {\n    const account = await this.getAccount(network);\n    return account.address;\n  }\n\n  /**\n   * Get all addresses for enabled networks\n   */\n  async getAllAddresses(): Promise<Record<NetworkType, string>> {\n    const addresses: Partial<Record<NetworkType, string>> = {};\n\n    for (const network of this.config.enabledNetworks) {\n      addresses[network] = await this.getAddress(network);\n    }\n\n    return addresses as Record<NetworkType, string>;\n  }\n\n  /**\n   * Get balance for a specific network\n   */\n  async getBalance(network: NetworkType): Promise<NetworkBalance> {\n    const networkConfig = getNetworkConfig(network, this.config.network === 'testnet');\n\n    // Placeholder implementation - will use WDK\n    return {\n      network,\n      native: {\n        symbol: networkConfig.nativeCurrency.symbol,\n        balance: BigInt(0),\n        balanceFormatted: '0',\n        balanceUsd: 0,\n      },\n      tokens: [],\n    };\n  }\n\n  /**\n   * Get balances for all enabled networks\n   */\n  async getAllBalances(): Promise<NetworkBalance[]> {\n    const balances: NetworkBalance[] = [];\n\n    for (const network of this.config.enabledNetworks) {\n      balances.push(await this.getBalance(network));\n    }\n\n    return balances;\n  }\n\n  /**\n   * Get total portfolio value in USD\n   */\n  async getTotalPortfolioUsd(): Promise<number> {\n    const balances = await this.getAllBalances();\n    let total = 0;\n\n    for (const balance of balances) {\n      total += balance.native.balanceUsd;\n      for (const token of balance.tokens) {\n        total += token.balanceUsd;\n      }\n    }\n\n    return total;\n  }\n\n  /**\n   * Send native currency on a specific network\n   */\n  async send(network: NetworkType, params: SendParams): Promise<TxResult> {\n    const { to, amount, gasless } = params;\n    const useGasless = gasless ?? (this.config.gasless && network === 'ethereum');\n\n    // Placeholder implementation - will use WDK\n    return {\n      hash: '',\n      network,\n      status: 'pending',\n    };\n  }\n\n  /**\n   * Send ERC-20 token on EVM networks\n   */\n  async sendToken(\n    network: NetworkType,\n    token: string,\n    to: string,\n    amount: bigint\n  ): Promise<TxResult> {\n    const networkConfig = getNetworkConfig(network, this.config.network === 'testnet');\n\n    if (!networkConfig.isEvm) {\n      throw new Error(`sendToken is only supported on EVM networks. ${network} is not an EVM chain.`);\n    }\n\n    // Placeholder implementation - will use WDK\n    return {\n      hash: '',\n      network,\n      status: 'pending',\n    };\n  }\n\n  /**\n   * Send Bitcoin on-chain using WalletManagerBtc\n   * @param to - Destination address (bc1q... for native segwit)\n   * @param amount - Amount in satoshis\n   */\n  async sendBitcoin(to: string, amount: bigint): Promise<TxResult> {\n    // Validate Bitcoin address format\n    if (!this.isValidBitcoinAddress(to)) {\n      throw new Error('Invalid Bitcoin address. Expected bc1q... (native segwit) format.');\n    }\n\n    // Use WDK WalletManagerBtc for transaction\n    // const btcManager = new WalletManagerBtc({ seed: this.seed });\n    // const tx = await btcManager.send(to, amount);\n\n    return this.send('bitcoin', { to, amount });\n  }\n\n  /**\n   * Validate Bitcoin address format\n   */\n  private isValidBitcoinAddress(address: string): boolean {\n    // Native SegWit (bech32)\n    if (address.startsWith('bc1q') || address.startsWith('tb1q')) {\n      return address.length >= 42 && address.length <= 62;\n    }\n    // Legacy P2PKH\n    if (address.startsWith('1') || address.startsWith('m') || address.startsWith('n')) {\n      return address.length >= 25 && address.length <= 34;\n    }\n    // P2SH\n    if (address.startsWith('3') || address.startsWith('2')) {\n      return address.length >= 25 && address.length <= 34;\n    }\n    return false;\n  }\n\n  /**\n   * Get Bitcoin address (native segwit bc1q...)\n   */\n  async getBitcoinAddress(): Promise<string> {\n    const account = await this.getAccount('bitcoin');\n    return account.address;\n  }\n\n  /**\n   * Pay Lightning invoice via Spark network\n   * Uses WDK WalletManagerSpark (m/44'/998')\n   * @param invoice - Lightning invoice string (lnbc...)\n   */\n  async sendLightning(invoice: string): Promise<TxResult> {\n    // Validate Lightning invoice format\n    if (!this.isValidLightningInvoice(invoice)) {\n      throw new Error('Invalid Lightning invoice format. Expected lnbc... or lntb...');\n    }\n\n    // Decode invoice to get amount and destination\n    const invoiceDetails = this.decodeLightningInvoice(invoice);\n\n    // Use WDK WalletManagerSpark for payment\n    // const sparkManager = new WalletManagerSpark({ seed: this.seed, feeFree: true });\n    // const payment = await sparkManager.payInvoice(invoice);\n\n    return {\n      hash: '', // Will be payment hash from Spark\n      network: 'spark',\n      status: 'pending',\n      metadata: {\n        invoice,\n        amount: invoiceDetails.amount,\n        destination: invoiceDetails.destination,\n      },\n    };\n  }\n\n  /**\n   * Create Lightning invoice via Spark\n   * @param amount - Amount in millisatoshis\n   * @param memo - Optional payment memo\n   * @returns Lightning invoice string (lnbc...)\n   */\n  async createLightningInvoice(amount: bigint, memo?: string): Promise<string> {\n    if (amount <= 0) {\n      throw new Error('Invoice amount must be greater than 0');\n    }\n\n    // Use WDK WalletManagerSpark to create invoice\n    // const sparkManager = new WalletManagerSpark({ seed: this.seed, feeFree: true });\n    // const invoice = await sparkManager.createInvoice(amount, memo);\n\n    // Placeholder - actual implementation uses Spark\n    const isTestnet = this.config.network === 'testnet';\n    const prefix = isTestnet ? 'lntb' : 'lnbc';\n\n    // This is a placeholder - real invoice comes from Spark\n    return `${prefix}${amount}m1...`;\n  }\n\n  /**\n   * Validate Lightning invoice format\n   */\n  private isValidLightningInvoice(invoice: string): boolean {\n    const lowerInvoice = invoice.toLowerCase();\n    return (\n      lowerInvoice.startsWith('lnbc') || // Mainnet\n      lowerInvoice.startsWith('lntb') || // Testnet\n      lowerInvoice.startsWith('lnbcrt') // Regtest\n    );\n  }\n\n  /**\n   * Decode Lightning invoice (basic parsing)\n   */\n  private decodeLightningInvoice(invoice: string): {\n    amount: bigint;\n    destination: string;\n    expiry: number;\n  } {\n    // Real implementation would use bolt11 library\n    // This is a placeholder structure\n    return {\n      amount: BigInt(0),\n      destination: '',\n      expiry: 3600,\n    };\n  }\n\n  /**\n   * Get Lightning (Spark) balance\n   */\n  async getLightningBalance(): Promise<{\n    available: bigint;\n    pending: bigint;\n  }> {\n    // Use WDK WalletManagerSpark\n    // const sparkManager = new WalletManagerSpark({ seed: this.seed });\n    // return sparkManager.getBalance();\n\n    return {\n      available: BigInt(0),\n      pending: BigInt(0),\n    };\n  }\n\n  /**\n   * Get configuration\n   */\n  getConfig(): ZubariWalletConfig {\n    return { ...this.config };\n  }\n\n  /**\n   * Check if wallet is initialized\n   */\n  isInitialized(): boolean {\n    return this.initialized;\n  }\n\n  /**\n   * Get contract addresses for current network\n   */\n  getContractAddresses() {\n    return getContractAddresses(this.config.network);\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","import type {\n  NFTMetadata,\n  LazyMintVoucher,\n  NFT,\n  ListingParams,\n  TxResult,\n} from '../types';\nimport { PLATFORM_CONFIG, NFT_VOUCHER_DOMAIN, NFT_VOUCHER_TYPES } from '../config/contracts';\n\n/**\n * ZubariNFTProtocol - NFT creation and marketplace operations\n *\n * Handles lazy minting via EIP-712 signatures, NFT listing,\n * and marketplace operations on Ethereum network.\n */\nexport class ZubariNFTProtocol {\n  private readonly contractAddress: string;\n  private readonly _marketplaceAddress: string;\n  private readonly chainId: number;\n\n  constructor(\n    contractAddress: string,\n    marketplaceAddress: string,\n    chainId: number\n  ) {\n    this.contractAddress = contractAddress;\n    this._marketplaceAddress = marketplaceAddress;\n    this.chainId = chainId;\n  }\n\n  /**\n   * Create a lazy mint voucher for off-chain NFT creation\n   * The voucher can be redeemed on-chain when purchased\n   */\n  async createLazyMintVoucher(\n    metadata: NFTMetadata,\n    creatorAddress: string,\n    signer: { signTypedData: (domain: object, types: object, value: object) => Promise<string> }\n  ): Promise<LazyMintVoucher> {\n    // Validate royalty\n    if (metadata.royaltyBps > PLATFORM_CONFIG.maxRoyaltyBps) {\n      throw new Error(`Royalty cannot exceed ${PLATFORM_CONFIG.maxRoyaltyBps / 100}%`);\n    }\n\n    // Generate random tokenId\n    const tokenId = this.generateTokenId();\n\n    // Calculate deadline (30 days from now)\n    const deadline = Math.floor(Date.now() / 1000) + PLATFORM_CONFIG.voucherValiditySecs;\n\n    // Build voucher data\n    const voucherData = {\n      tokenId,\n      uri: metadata.image, // Will be IPFS URI\n      creator: creatorAddress,\n      royaltyBps: metadata.royaltyBps,\n      deadline,\n    };\n\n    // Create EIP-712 domain\n    const domain = {\n      ...NFT_VOUCHER_DOMAIN,\n      chainId: this.chainId,\n      verifyingContract: this.contractAddress,\n    };\n\n    // Sign the voucher\n    const signature = await signer.signTypedData(domain, NFT_VOUCHER_TYPES, voucherData);\n\n    return {\n      ...voucherData,\n      signature,\n    };\n  }\n\n  /**\n   * Redeem a lazy mint voucher to mint the NFT on-chain\n   */\n  async redeemVoucher(voucher: LazyMintVoucher, _buyerAddress: string): Promise<TxResult> {\n    // Validate voucher deadline\n    if (voucher.deadline < Math.floor(Date.now() / 1000)) {\n      throw new Error('Voucher has expired');\n    }\n\n    // Placeholder - will call contract\n    return {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n  }\n\n  /**\n   * List an NFT for sale on the marketplace\n   */\n  async listForSale(_params: ListingParams): Promise<TxResult> {\n    // Placeholder - will approve and list\n    return {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n  }\n\n  /**\n   * Buy an NFT from the marketplace\n   */\n  async buyNFT(_listingId: string, _price: bigint): Promise<TxResult> {\n    // Placeholder - will call marketplace contract\n    return {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n  }\n\n  /**\n   * Transfer an NFT to another address\n   */\n  async transfer(_tokenId: string, _to: string): Promise<TxResult> {\n    // Placeholder - will call NFT contract\n    return {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n  }\n\n  /**\n   * Get NFTs owned by an address\n   */\n  async getOwnedNFTs(_address: string): Promise<NFT[]> {\n    // Placeholder - will query contract/indexer\n    return [];\n  }\n\n  /**\n   * Generate a random tokenId (32 bytes hex)\n   */\n  private generateTokenId(): string {\n    const bytes = new Uint8Array(32);\n    crypto.getRandomValues(bytes);\n    return '0x' + Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\n  }\n}\n","import type { TipData, TipResult, TipStats, TxResult } from '../types';\nimport { PLATFORM_CONFIG } from '../config/contracts';\n\n/**\n * ZubariTipsProtocol - Micropayment tips for creators\n *\n * Handles ETH and ERC-20 token tips with platform fee distribution.\n * Supports gasless tips via ERC-4337 when enabled.\n */\nexport class ZubariTipsProtocol {\n  private readonly contractAddress: string;\n  private readonly chainId: number;\n  private readonly gaslessEnabled: boolean;\n\n  constructor(contractAddress: string, chainId: number, gaslessEnabled: boolean = false) {\n    this.contractAddress = contractAddress;\n    this.chainId = chainId;\n    this.gaslessEnabled = gaslessEnabled;\n  }\n\n  /**\n   * Send a tip to a creator\n   */\n  async sendTip(tip: TipData): Promise<TipResult> {\n    const { recipient, amount, token, message } = tip;\n\n    // Calculate platform fee (3%)\n    const platformFee = (amount * BigInt(PLATFORM_CONFIG.tipFeeBps)) / BigInt(10000);\n    const creatorAmount = amount - platformFee;\n\n    // Validate amount\n    if (amount <= 0n) {\n      throw new Error('Tip amount must be greater than 0');\n    }\n\n    // Placeholder - will call contract\n    const txResult: TxResult = {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n\n    return {\n      txHash: txResult.hash,\n      tipId: '', // Will be returned from contract event\n      recipient,\n      amount: creatorAmount,\n      platformFee,\n      timestamp: Math.floor(Date.now() / 1000),\n    };\n  }\n\n  /**\n   * Send tips to multiple creators in a single transaction\n   */\n  async sendBatchTips(tips: TipData[]): Promise<TipResult[]> {\n    if (tips.length === 0) {\n      throw new Error('At least one tip is required');\n    }\n\n    // Calculate total amount needed\n    const totalAmount = tips.reduce((sum, tip) => sum + tip.amount, BigInt(0));\n\n    // Placeholder - will call batch function\n    return tips.map(tip => ({\n      txHash: '',\n      tipId: '',\n      recipient: tip.recipient,\n      amount: tip.amount - (tip.amount * BigInt(PLATFORM_CONFIG.tipFeeBps)) / BigInt(10000),\n      platformFee: (tip.amount * BigInt(PLATFORM_CONFIG.tipFeeBps)) / BigInt(10000),\n      timestamp: Math.floor(Date.now() / 1000),\n    }));\n  }\n\n  /**\n   * Get tips received by an address\n   */\n  async getTipsReceived(address: string): Promise<TipResult[]> {\n    // Placeholder - will query indexer\n    return [];\n  }\n\n  /**\n   * Get tips sent by an address\n   */\n  async getTipsSent(address: string): Promise<TipResult[]> {\n    // Placeholder - will query indexer\n    return [];\n  }\n\n  /**\n   * Get tip statistics for a creator\n   */\n  async getCreatorTipStats(creator: string): Promise<TipStats> {\n    // Placeholder - will query indexer/contract\n    return {\n      totalReceived: BigInt(0),\n      tipCount: 0,\n      uniqueTippers: 0,\n    };\n  }\n\n  /**\n   * Get platform fee in basis points\n   */\n  getPlatformFeeBps(): number {\n    return PLATFORM_CONFIG.tipFeeBps;\n  }\n}\n","import type { SubscriptionPlan, Subscription, TxResult } from '../types';\n\n/**\n * ZubariSubscriptionProtocol - Recurring subscription payments\n *\n * Handles subscription plan creation, subscription management,\n * and verification of active subscriptions.\n */\nexport class ZubariSubscriptionProtocol {\n  private readonly contractAddress: string;\n  private readonly chainId: number;\n\n  constructor(contractAddress: string, chainId: number) {\n    this.contractAddress = contractAddress;\n    this.chainId = chainId;\n  }\n\n  /**\n   * Create a new subscription plan\n   */\n  async createPlan(plan: SubscriptionPlan): Promise<string> {\n    // Validate plan\n    if (!plan.name || plan.name.length === 0) {\n      throw new Error('Plan name is required');\n    }\n    if (plan.price <= 0n) {\n      throw new Error('Plan price must be greater than 0');\n    }\n    if (plan.duration <= 0) {\n      throw new Error('Plan duration must be greater than 0');\n    }\n\n    // Generate planId based on creator + name hash\n    const planId = this.generatePlanId(plan.name);\n\n    // Placeholder - will call contract\n    return planId;\n  }\n\n  /**\n   * Update an existing subscription plan\n   */\n  async updatePlan(planId: string, updates: Partial<SubscriptionPlan>): Promise<TxResult> {\n    // Placeholder - will call contract\n    return {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n  }\n\n  /**\n   * Subscribe to a creator's plan\n   */\n  async subscribe(\n    creator: string,\n    planId: string,\n    months: number = 1\n  ): Promise<Subscription> {\n    if (months <= 0) {\n      throw new Error('Subscription duration must be at least 1 month');\n    }\n\n    const now = Math.floor(Date.now() / 1000);\n    const durationSeconds = months * 30 * 24 * 60 * 60; // 30 days per month\n\n    // Placeholder - will call contract\n    return {\n      subscriptionId: '',\n      planId,\n      creator,\n      subscriber: '', // Current user address\n      startTime: now,\n      endTime: now + durationSeconds,\n      autoRenew: false,\n      status: 'active',\n    };\n  }\n\n  /**\n   * Cancel an active subscription\n   */\n  async cancel(subscriptionId: string): Promise<TxResult> {\n    // Placeholder - will call contract\n    return {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n  }\n\n  /**\n   * Check if an address is subscribed to a creator\n   */\n  async isSubscribed(creator: string, subscriber?: string): Promise<boolean> {\n    // Placeholder - will call contract view function\n    return false;\n  }\n\n  /**\n   * Get active subscriptions for a subscriber\n   */\n  async getActiveSubscriptions(subscriber?: string): Promise<Subscription[]> {\n    // Placeholder - will query contract/indexer\n    return [];\n  }\n\n  /**\n   * Get all subscribers for a creator\n   */\n  async getSubscribers(creator: string): Promise<Subscription[]> {\n    // Placeholder - will query contract/indexer\n    return [];\n  }\n\n  /**\n   * Get a specific plan by ID\n   */\n  async getPlan(planId: string): Promise<SubscriptionPlan | null> {\n    // Placeholder - will query contract\n    return null;\n  }\n\n  /**\n   * Get all plans for a creator\n   */\n  async getCreatorPlans(creator: string): Promise<SubscriptionPlan[]> {\n    // Placeholder - will query contract/indexer\n    return [];\n  }\n\n  /**\n   * Generate a unique plan ID\n   */\n  private generatePlanId(name: string): string {\n    const bytes = new Uint8Array(16);\n    crypto.getRandomValues(bytes);\n    return '0x' + Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\n  }\n}\n","import type { EarningsBreakdown, RevenueSplit, TxResult } from '../types';\n\n/**\n * ZubariPayoutsProtocol - Creator earnings management\n *\n * Handles earnings tracking, claiming, revenue splits,\n * and conversion to stablecoins.\n */\nexport class ZubariPayoutsProtocol {\n  private readonly contractAddress: string;\n  private readonly chainId: number;\n\n  constructor(contractAddress: string, chainId: number) {\n    this.contractAddress = contractAddress;\n    this.chainId = chainId;\n  }\n\n  /**\n   * Get pending earnings breakdown for the current user\n   */\n  async getPendingEarnings(): Promise<EarningsBreakdown> {\n    // Placeholder - will call contract\n    return {\n      tips: BigInt(0),\n      subscriptions: BigInt(0),\n      nftSales: BigInt(0),\n      royalties: BigInt(0),\n      total: BigInt(0),\n    };\n  }\n\n  /**\n   * Get historical earnings for a time period\n   */\n  async getEarningsHistory(\n    period: 'day' | 'week' | 'month' | 'all' = 'all'\n  ): Promise<EarningsBreakdown[]> {\n    // Placeholder - will query indexer\n    return [];\n  }\n\n  /**\n   * Claim all pending earnings\n   */\n  async claimEarnings(): Promise<TxResult> {\n    // Placeholder - will call contract\n    return {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n  }\n\n  /**\n   * Claim specific amount of earnings\n   */\n  async claimPartialEarnings(amount: bigint): Promise<TxResult> {\n    if (amount <= 0n) {\n      throw new Error('Amount must be greater than 0');\n    }\n\n    // Placeholder - will call contract\n    return {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n  }\n\n  /**\n   * Setup revenue split with collaborators\n   * Basis points must sum to 10000 (100%)\n   */\n  async setupRevenueSplit(splits: RevenueSplit[]): Promise<TxResult> {\n    // Validate that basis points sum to 100%\n    const totalBps = splits.reduce((sum, split) => sum + split.basisPoints, 0);\n    if (totalBps !== 10000) {\n      throw new Error('Revenue splits must sum to 100% (10000 basis points)');\n    }\n\n    // Validate each split\n    for (const split of splits) {\n      if (split.basisPoints <= 0) {\n        throw new Error('Each split must have positive basis points');\n      }\n      if (!split.recipient || split.recipient.length === 0) {\n        throw new Error('Each split must have a valid recipient address');\n      }\n    }\n\n    // Placeholder - will call contract\n    return {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n  }\n\n  /**\n   * Get current revenue split configuration\n   */\n  async getRevenueSplit(): Promise<RevenueSplit[]> {\n    // Placeholder - will query contract\n    return [];\n  }\n\n  /**\n   * Remove revenue split (creator gets 100%)\n   */\n  async removeRevenueSplit(): Promise<TxResult> {\n    // Placeholder - will call contract\n    return {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n  }\n\n  /**\n   * Convert earnings to stablecoin (USDT)\n   */\n  async convertToStable(token: string, amount: bigint): Promise<TxResult> {\n    if (amount <= 0n) {\n      throw new Error('Amount must be greater than 0');\n    }\n\n    // Placeholder - will use swap protocol\n    return {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n  }\n}\n","import type { SwapQuote, TxResult } from '../types';\nimport { PLATFORM_CONFIG, getContractAddresses } from '../config/contracts';\n\n/**\n * SwapService - DEX integration via Velora\n *\n * Handles token swaps with slippage protection,\n * quote fetching, and earnings conversion.\n */\nexport class SwapService {\n  private readonly _chainId: number;\n  private readonly isTestnet: boolean;\n\n  constructor(chainId: number, isTestnet: boolean = false) {\n    this._chainId = chainId;\n    this.isTestnet = isTestnet;\n  }\n\n  /**\n   * Get a swap quote\n   */\n  async getQuote(\n    tokenIn: string,\n    tokenOut: string,\n    amountIn: bigint\n  ): Promise<SwapQuote> {\n    if (amountIn <= 0n) {\n      throw new Error('Amount must be greater than 0');\n    }\n\n    // Placeholder - will use Velora DEX\n    return {\n      tokenIn,\n      tokenOut,\n      amountIn,\n      amountOut: BigInt(0),\n      priceImpact: 0,\n      route: [tokenIn, tokenOut],\n      estimatedGas: BigInt(0),\n    };\n  }\n\n  /**\n   * Execute a swap with slippage protection\n   */\n  async executeSwap(\n    quote: SwapQuote,\n    slippageToleranceBps: number = PLATFORM_CONFIG.defaultSlippageBps\n  ): Promise<TxResult> {\n    // Calculate minimum output with slippage\n    const _minAmountOut =\n      quote.amountOut - (quote.amountOut * BigInt(slippageToleranceBps)) / BigInt(10000);\n\n    // Calculate deadline\n    const _deadline = Math.floor(Date.now() / 1000) + PLATFORM_CONFIG.swapDeadlineSecs;\n\n    // Warn if price impact is high\n    if (quote.priceImpact > 5) {\n      console.warn(`High price impact: ${quote.priceImpact}%`);\n    }\n\n    // Placeholder - will call swap contract\n    return {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n  }\n\n  /**\n   * Convert earnings to USDT, keeping some ETH for gas\n   */\n  async convertEarningsToStable(\n    ethBalance: bigint,\n    reserveForGas: bigint = BigInt('10000000000000000') // 0.01 ETH\n  ): Promise<TxResult> {\n    const amountToSwap = ethBalance - reserveForGas;\n\n    if (amountToSwap <= 0n) {\n      throw new Error('Insufficient balance after gas reserve');\n    }\n\n    // Get quote for ETH -> USDT\n    const contracts = getContractAddresses(this.isTestnet ? 'testnet' : 'mainnet');\n    const quote = await this.getQuote(\n      '0x0000000000000000000000000000000000000000', // ETH\n      contracts.usdt, // USDT on Ethereum\n      amountToSwap\n    );\n\n    return this.executeSwap(quote);\n  }\n\n  /**\n   * Check if a swap route exists\n   */\n  async hasRoute(tokenIn: string, tokenOut: string): Promise<boolean> {\n    try {\n      const quote = await this.getQuote(tokenIn, tokenOut, BigInt(1));\n      return quote.amountOut > 0n;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Get supported tokens for swapping\n   */\n  async getSupportedTokens(): Promise<string[]> {\n    // Placeholder - will query DEX\n    return [];\n  }\n}\n","// Network Types\nexport type NetworkType = 'bitcoin' | 'ethereum' | 'ton' | 'tron' | 'solana' | 'spark';\n\n// Wallet Configuration\nexport interface ZubariWalletConfig {\n  network: 'mainnet' | 'testnet';\n  enabledNetworks: NetworkType[];\n  gasless: boolean;\n  paymasterUrl?: string;\n  bundlerUrl?: string;\n  rpcUrls?: Partial<Record<NetworkType, string>>;\n}\n\n// Balance Types\nexport interface TokenBalance {\n  symbol: string;\n  address: string;\n  balance: bigint;\n  balanceFormatted: string;\n  balanceUsd: number;\n  decimals: number;\n}\n\nexport interface NetworkBalance {\n  network: NetworkType;\n  native: {\n    symbol: string;\n    balance: bigint;\n    balanceFormatted: string;\n    balanceUsd: number;\n  };\n  tokens: TokenBalance[];\n}\n\n// Transaction Types\nexport interface TxResult {\n  hash: string;\n  network: NetworkType;\n  status: 'pending' | 'confirmed' | 'failed';\n  blockNumber?: number;\n  gasUsed?: bigint;\n  error?: string;\n  metadata?: Record<string, unknown>;\n}\n\nexport interface SendParams {\n  to: string;\n  amount: bigint;\n  token?: string;\n  gasless?: boolean;\n}\n\n// Account Types\nexport interface Account {\n  network: NetworkType;\n  address: string;\n  publicKey: string;\n  derivationPath: string;\n}\n\n// NFT Types\nexport interface NFTMetadata {\n  name: string;\n  description: string;\n  image: string;\n  attributes?: Array<{ trait_type: string; value: string | number }>;\n  royaltyBps: number;\n}\n\nexport interface LazyMintVoucher {\n  tokenId: string;\n  uri: string;\n  creator: string;\n  royaltyBps: number;\n  deadline: number;\n  signature: string;\n}\n\nexport interface NFT {\n  tokenId: string;\n  contractAddress: string;\n  owner: string;\n  creator: string;\n  uri: string;\n  metadata?: NFTMetadata;\n  isLazyMinted: boolean;\n}\n\nexport interface ListingParams {\n  tokenId: string;\n  price: bigint;\n  paymentToken: string;\n  duration: number;\n}\n\n// Tip Types\nexport interface TipData {\n  recipient: string;\n  amount: bigint;\n  token: string;\n  message?: string;\n}\n\nexport interface TipResult {\n  txHash: string;\n  tipId: string;\n  recipient: string;\n  amount: bigint;\n  platformFee: bigint;\n  timestamp: number;\n}\n\nexport interface TipStats {\n  totalReceived: bigint;\n  tipCount: number;\n  uniqueTippers: number;\n}\n\n// Subscription Types\nexport interface SubscriptionPlan {\n  planId?: string;\n  name: string;\n  description: string;\n  price: bigint;\n  paymentToken: string;\n  duration: number;\n  perks: string[];\n  maxSubscribers?: number;\n  nftBadge: boolean;\n}\n\nexport interface Subscription {\n  subscriptionId: string;\n  planId: string;\n  creator: string;\n  subscriber: string;\n  startTime: number;\n  endTime: number;\n  autoRenew: boolean;\n  status: 'active' | 'expired' | 'cancelled';\n}\n\n// Payout Types\nexport interface EarningsBreakdown {\n  tips: bigint;\n  subscriptions: bigint;\n  nftSales: bigint;\n  royalties: bigint;\n  total: bigint;\n}\n\nexport interface RevenueSplit {\n  recipient: string;\n  basisPoints: number;\n}\n\n// Swap Types\nexport interface SwapQuote {\n  tokenIn: string;\n  tokenOut: string;\n  amountIn: bigint;\n  amountOut: bigint;\n  priceImpact: number;\n  route: string[];\n  estimatedGas: bigint;\n}\n\nexport interface SwapParams {\n  tokenIn: string;\n  tokenOut: string;\n  amountIn: bigint;\n  minAmountOut: bigint;\n  deadline: number;\n}\n\n// Error Types\nexport type ZubariErrorCode =\n  | 'TX_FAILED'\n  | 'AUTH_EXPIRED'\n  | 'RPC_ERROR'\n  | 'VOUCHER_EXPIRED'\n  | 'SLIPPAGE_ERROR'\n  | 'RATE_LIMITED'\n  | 'UPLOAD_ERROR'\n  | 'INSUFFICIENT_FUNDS'\n  | 'INVALID_SIGNATURE'\n  | 'UNSUPPORTED_NETWORK'\n  | 'UNKNOWN_ERROR';\n\nexport class ZubariError extends Error {\n  constructor(\n    public readonly code: ZubariErrorCode,\n    message: string,\n    public readonly details?: unknown\n  ) {\n    super(message);\n    this.name = 'ZubariError';\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","/**\n * Utility functions for wallet operations\n */\n\n/**\n * Format address for display (truncate middle)\n */\nexport function formatAddress(address: string, chars: number = 4): string {\n  if (!address || address.length < 10) return address;\n  return `${address.slice(0, chars + 2)}...${address.slice(-chars)}`;\n}\n\n/**\n * Format balance for display\n */\nexport function formatBalance(\n  balance: bigint,\n  decimals: number = 18,\n  precision: number = 4\n): string {\n  const divisor = BigInt(10 ** decimals);\n  const integerPart = balance / divisor;\n  const fractionalPart = balance % divisor;\n\n  const fractionalStr = fractionalPart\n    .toString()\n    .padStart(decimals, '0')\n    .slice(0, precision);\n\n  return `${integerPart}.${fractionalStr}`;\n}\n\n/**\n * Check if string is a valid Ethereum address\n */\nexport function isValidAddress(address: string): boolean {\n  return /^0x[a-fA-F0-9]{40}$/.test(address);\n}\n\n/**\n * Normalize an Ethereum address to checksum format\n */\nexport function normalizeAddress(address: string): string {\n  if (!isValidAddress(address)) {\n    throw new Error('Invalid Ethereum address');\n  }\n  return address.toLowerCase();\n}\n"]}