@zubari/sdk 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{WalletManager-DKPzfA74.d.mts → WalletManager-CQSrvRVs.d.mts} +1 -1
- package/dist/{WalletManager-IOHFgvpT.d.ts → WalletManager-U1YWIUWn.d.ts} +1 -1
- package/dist/{index-BCX8EYxv.d.ts → index--dqjW2SS.d.mts} +2 -3
- package/dist/{index-Be7yLGAO.d.ts → index-Bou-9cAG.d.mts} +54 -1
- package/dist/{index-Be7yLGAO.d.mts → index-Bou-9cAG.d.ts} +54 -1
- package/dist/{index-BrLMTY29.d.mts → index-CkPxa5Bn.d.ts} +2 -3
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +105 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +105 -7
- package/dist/index.mjs.map +1 -1
- package/dist/protocols/index.d.mts +37 -4
- package/dist/protocols/index.d.ts +37 -4
- package/dist/protocols/index.js +105 -3
- package/dist/protocols/index.js.map +1 -1
- package/dist/protocols/index.mjs +105 -3
- package/dist/protocols/index.mjs.map +1 -1
- package/dist/react/index.d.mts +3 -3
- package/dist/react/index.d.ts +3 -3
- package/dist/services/index.d.mts +1 -1
- package/dist/services/index.d.ts +1 -1
- package/dist/services/index.js +0 -4
- package/dist/services/index.js.map +1 -1
- package/dist/services/index.mjs +0 -4
- package/dist/services/index.mjs.map +1 -1
- package/dist/wallet/index.d.mts +3 -3
- package/dist/wallet/index.d.ts +3 -3
- package/dist/wallet/index.js +0 -4
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/index.mjs +0 -4
- package/dist/wallet/index.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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/BrowserAddressDerivation.ts","../../src/services/ZubariWdkService.ts","../../src/wallet/WalletManager.ts"],"names":["DERIVATION_PATHS","DEFAULT_API_URL","HDNodeWallet","viemFormatEther","wdkService","result"],"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 bitcoin: {\n name: 'Bitcoin Testnet',\n rpcUrl: 'https://blockstream.info/testnet/api',\n explorerUrl: 'https://mempool.space/testnet',\n },\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 usdc: string;\n usdt: string;\n weth: string;\n}\n\n// Zero address for ETH payments and placeholder addresses\nexport const 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: '0x48D0F3b6552A8CcDA7528db5aE8be004fCC3D3D9', // ZubariMarket deployed 2024-12-22\n tips: '0xFDc353edC63Cd3D4bba35bB43861369516a9Dc85',\n subscriptions: '0x8C05F8aD2F295fB7f3596043a7c37C98A5F7fAB8',\n payouts: '0x804Fe503936E8b8d3D5Dbb62AF4fB6Fe7265Fb2c',\n entryPoint: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n paymaster: ZERO_ADDRESS, // Deploy with: npx hardhat run deploy/deploy.ts --network ethereum-sepolia\n accountFactory: ZERO_ADDRESS, // Not yet deployed\n usdc: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238', // USDC on Sepolia\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 usdc: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', // USDC on Ethereum\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 // Pricing fields\n { name: 'price', type: 'uint256' },\n { name: 'currency', type: 'address' },\n { name: 'nonce', type: 'uint256' },\n // Watermarking fields\n { name: 'contentHash', type: 'bytes32' },\n { name: 'userId', type: 'bytes32' },\n { name: 'watermarkTimestamp', type: 'uint256' },\n { name: 'sessionId', type: 'bytes32' },\n ],\n} as const;\n\n// Currency addresses per network\nexport const CURRENCY_ADDRESSES = {\n testnet: {\n ETH: ZERO_ADDRESS,\n USDT: '0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0', // USDT on Sepolia\n },\n mainnet: {\n ETH: ZERO_ADDRESS,\n USDT: '0xdAC17F958D2ee523a2206206994597C13D831ec7', // USDT on Ethereum\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\nexport interface TransactionHistoryItem {\n hash: string;\n from: string;\n to: string;\n value: string;\n timestamp: number;\n status: 'confirmed' | 'pending' | 'failed';\n blockNumber?: number;\n}\n\nexport interface TransactionHistoryResponse {\n success: boolean;\n address?: string;\n transactions?: TransactionHistoryItem[];\n chain?: string;\n network?: string;\n error?: string;\n}\n\nexport interface SendTransactionResponse {\n success: boolean;\n txHash?: string;\n from?: string;\n to?: string;\n amount?: string;\n chain?: string;\n network?: string;\n error?: string;\n}\n\nexport interface TransactionStatusResponse {\n success: boolean;\n hash?: string;\n status?: 'confirmed' | 'pending' | 'failed';\n blockNumber?: number;\n confirmations?: number;\n timestamp?: number;\n from?: string;\n to?: string;\n value?: string;\n fee?: string;\n chain?: string;\n network?: string;\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 * Send a transaction on a specific chain using Tether WDK\n */\n async sendTransaction(\n seed: string,\n chain: NetworkType,\n to: string,\n amount: string,\n network: 'mainnet' | 'testnet' = 'testnet'\n ): Promise<SendTransactionResponse> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/send`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ seed, chain, to, amount, 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 send transaction',\n };\n }\n }\n\n /**\n * Get transaction history for an address on a specific chain\n * Fetches from blockchain explorers (Etherscan, mempool.space, etc.)\n */\n async getTransactionHistory(\n seed: string,\n chain: NetworkType,\n network: 'mainnet' | 'testnet' = 'testnet',\n limit: number = 10\n ): Promise<TransactionHistoryResponse> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/history`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ seed, chain, network, limit }),\n });\n\n return await response.json();\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get transaction history',\n };\n }\n }\n\n /**\n * Get transaction status by hash\n * Fetches from blockchain explorers to check confirmation status\n */\n async getTransactionStatus(\n txHash: string,\n chain: NetworkType,\n network: 'mainnet' | 'testnet' = 'testnet'\n ): Promise<TransactionStatusResponse> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/tx-status`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ txHash, 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 get transaction status',\n };\n }\n }\n}\n\n// Default API URL (can be overridden)\n// Uses the Zubari production API which has Tether WDK integrated\nconst DEFAULT_API_URL = process.env.NEXT_PUBLIC_API_URL || 'https://ckgwifsxka.us-east-2.awsapprunner.com';\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 * Browser-Compatible Address Derivation\n *\n * This module provides multi-chain address derivation that works in browser environments.\n * It uses the @scure libraries which are pure JS and don't require Node.js polyfills.\n *\n * Supported chains:\n * - Ethereum: ethers.js (BIP-44)\n * - Bitcoin: @scure/bip32 + @scure/base (BIP-84 native SegWit)\n * - Solana: ed25519-hd-key + tweetnacl (SLIP-0010)\n * - TON: ed25519 derivation with TON address format\n * - TRON: secp256k1 + base58check\n * - Spark: Bitcoin-based with custom derivation\n */\n\nimport { HDNodeWallet, keccak256, getBytes, sha256 as ethSha256 } from 'ethers';\nimport { mnemonicToSeedSync, validateMnemonic, generateMnemonic } from '@scure/bip39';\nimport { wordlist } from '@scure/bip39/wordlists/english';\nimport { HDKey } from '@scure/bip32';\nimport { bech32, base58check } from '@scure/base';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { ripemd160 } from '@noble/hashes/ripemd160';\nimport type { NetworkType } from '../types';\n\nexport interface ChainAddress {\n chain: NetworkType;\n address: string;\n path: string;\n}\n\nexport interface BrowserMultiChainAddresses {\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\n// BIP-44/84 derivation paths\nconst DERIVATION_PATHS = {\n ethereum: \"m/44'/60'/0'/0/0\",\n bitcoin_mainnet: \"m/84'/0'/0'/0/0\",\n bitcoin_testnet: \"m/84'/1'/0'/0/0\",\n ton: \"m/44'/607'/0'/0'/0'\",\n tron: \"m/44'/195'/0'/0/0\",\n solana: \"m/44'/501'/0'/0'\",\n spark: \"m/44'/998'/0'/0/0\",\n};\n\n/**\n * Derive Ethereum address from seed phrase\n */\nexport function deriveEthereumAddress(seed: string): string {\n const hdNode = HDNodeWallet.fromPhrase(seed, undefined, DERIVATION_PATHS.ethereum);\n return hdNode.address;\n}\n\n/**\n * Derive Bitcoin address from seed phrase (BIP-84 native SegWit)\n * Uses @scure libraries for browser compatibility\n */\nexport function deriveBitcoinAddress(\n seed: string,\n network: 'mainnet' | 'testnet' = 'testnet'\n): string {\n try {\n // Convert mnemonic to seed using @scure/bip39\n const seedBytes = mnemonicToSeedSync(seed);\n\n // Derive HD key using @scure/bip32\n const hdKey = HDKey.fromMasterSeed(seedBytes);\n const path = network === 'testnet' ? DERIVATION_PATHS.bitcoin_testnet : DERIVATION_PATHS.bitcoin_mainnet;\n const child = hdKey.derive(path);\n\n if (!child.publicKey) {\n throw new Error('Failed to derive public key');\n }\n\n // Create P2WPKH address (native SegWit)\n // 1. Hash160 = RIPEMD160(SHA256(publicKey))\n const pubKeyHash = ripemd160(sha256(child.publicKey));\n\n // 2. Create witness program: version (0x00) + hash160\n // For bech32, we encode: witness version (0) + pubKeyHash as 5-bit words\n const witnessVersion = 0;\n const words = bech32.toWords(pubKeyHash);\n words.unshift(witnessVersion); // Prepend witness version\n\n // 3. Encode with bech32\n const hrp = network === 'testnet' ? 'tb' : 'bc';\n const address = bech32.encode(hrp, words);\n\n return address;\n } catch (error) {\n console.error('Bitcoin address derivation failed:', error);\n throw error;\n }\n}\n\n/**\n * Derive Solana address from seed phrase using SLIP-0010 (ed25519)\n */\nexport async function deriveSolanaAddress(seed: string): Promise<string> {\n try {\n const [ed25519, nacl, bs58Module] = await Promise.all([\n import('ed25519-hd-key'),\n import('tweetnacl'),\n import('bs58'),\n ]);\n\n // bs58 v6 uses default export\n const bs58 = bs58Module.default || bs58Module;\n\n // Use @scure/bip39 for seed generation (browser compatible)\n const seedBytes = mnemonicToSeedSync(seed);\n\n // SLIP-0010 derivation for ed25519\n const derived = ed25519.derivePath(DERIVATION_PATHS.solana, Buffer.from(seedBytes).toString('hex'));\n\n // Create keypair from derived seed\n const keypair = nacl.sign.keyPair.fromSeed(new Uint8Array(derived.key));\n\n // Solana address is the base58-encoded public key (32 bytes)\n return bs58.encode(keypair.publicKey);\n } catch (error) {\n console.error('Solana address derivation failed:', error);\n throw error;\n }\n}\n\n/**\n * Derive TON address from seed phrase\n * Uses proper BIP-44 derivation path m/44'/607'/0'/0'/0'\n */\nexport async function deriveTonAddress(seed: string): Promise<string> {\n try {\n const [ed25519, nacl] = await Promise.all([\n import('ed25519-hd-key'),\n import('tweetnacl'),\n ]);\n\n // Use @scure/bip39 for seed generation (browser compatible)\n const seedBytes = mnemonicToSeedSync(seed);\n\n // Use SLIP-0010 derivation for ed25519 with TON's coin type\n const derived = ed25519.derivePath(DERIVATION_PATHS.ton, Buffer.from(seedBytes).toString('hex'));\n\n // Create keypair\n const keypair = nacl.sign.keyPair.fromSeed(new Uint8Array(derived.key));\n\n // TON address is derived from public key using workchain + hash\n // Standard TON wallet v4r2 uses the public key to derive address\n const publicKey = keypair.publicKey;\n\n // Create TON bounceable address (EQ prefix for workchain 0)\n // Format: 1 byte flags + 1 byte workchain + 32 bytes hash + 2 bytes CRC16\n const workchain = 0;\n const flags = 0x11; // bounceable\n\n // For raw address, we use SHA256 of public key using @noble/hashes\n const hash = sha256(publicKey);\n\n // Build address bytes: flags + workchain + hash\n const addressData = new Uint8Array(34);\n addressData[0] = flags;\n addressData[1] = workchain;\n addressData.set(hash, 2);\n\n // Calculate CRC16\n const crc = crc16(addressData);\n\n // Full address with CRC\n const fullAddress = new Uint8Array(36);\n fullAddress.set(addressData);\n fullAddress[34] = (crc >> 8) & 0xff;\n fullAddress[35] = crc & 0xff;\n\n // Convert to base64url (TON standard format)\n const base64 = btoa(String.fromCharCode(...fullAddress))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_');\n\n return base64;\n } catch (error) {\n console.error('TON address derivation failed:', error);\n throw error;\n }\n}\n\n/**\n * CRC16-CCITT for TON addresses\n */\nfunction crc16(data: Uint8Array): number {\n let crc = 0;\n for (const byte of data) {\n crc ^= byte << 8;\n for (let i = 0; i < 8; i++) {\n crc = (crc & 0x8000) ? ((crc << 1) ^ 0x1021) : (crc << 1);\n crc &= 0xffff;\n }\n }\n return crc;\n}\n\n/**\n * Derive TRON address from seed phrase\n * TRON uses secp256k1 like Ethereum but with base58check encoding\n * Uses @scure/base for browser compatibility\n */\nexport function deriveTronAddress(seed: string): string {\n try {\n // Derive using TRON's BIP-44 path\n const hdNode = HDNodeWallet.fromPhrase(seed, undefined, DERIVATION_PATHS.tron);\n\n // Get the Ethereum-style address (last 20 bytes of keccak256 of public key)\n // TRON uses same derivation but different encoding\n const ethAddressHex = hdNode.address.slice(2).toLowerCase();\n\n // TRON address: 0x41 prefix + 20 bytes address\n const addressBytes = new Uint8Array(21);\n addressBytes[0] = 0x41; // TRON mainnet prefix\n\n // Copy ETH address bytes\n for (let i = 0; i < 20; i++) {\n addressBytes[i + 1] = parseInt(ethAddressHex.slice(i * 2, i * 2 + 2), 16);\n }\n\n // Base58check encode using @scure/base (uses double SHA256 for checksum)\n const tronBase58check = base58check(sha256);\n return tronBase58check.encode(addressBytes);\n } catch (error) {\n console.error('TRON address derivation failed:', error);\n throw error;\n }\n}\n\n/**\n * Derive Spark address from seed phrase\n * Spark uses its own derivation path and bech32 format\n * Uses @scure libraries for browser compatibility\n */\nexport function deriveSparkAddress(\n seed: string,\n network: 'mainnet' | 'testnet' = 'testnet'\n): string {\n try {\n // Convert mnemonic to seed using @scure/bip39\n const seedBytes = mnemonicToSeedSync(seed);\n\n // Derive HD key using @scure/bip32\n const hdKey = HDKey.fromMasterSeed(seedBytes);\n const child = hdKey.derive(DERIVATION_PATHS.spark);\n\n if (!child.publicKey) {\n throw new Error('Failed to derive public key');\n }\n\n // Create P2WPKH-style address (same as Bitcoin but with Spark HRP)\n // 1. Hash160 = RIPEMD160(SHA256(publicKey))\n const pubKeyHash = ripemd160(sha256(child.publicKey));\n\n // 2. Create witness program with version 0\n const witnessVersion = 0;\n const words = bech32.toWords(pubKeyHash);\n words.unshift(witnessVersion);\n\n // 3. Encode with bech32 using Spark's HRP\n // Note: Spark uses 'sp' for mainnet and 'tsp' for testnet\n const hrp = network === 'testnet' ? 'tsp' : 'sp';\n const address = bech32.encode(hrp, words);\n\n return address;\n } catch (error) {\n console.error('Spark address derivation failed:', error);\n throw error;\n }\n}\n\n/**\n * Derive addresses for all supported chains\n */\nexport async function deriveAllAddresses(\n seed: string,\n network: 'mainnet' | 'testnet' = 'testnet'\n): Promise<BrowserMultiChainAddresses> {\n const addresses: BrowserMultiChainAddresses = {\n ethereum: null,\n bitcoin: null,\n ton: null,\n tron: null,\n solana: null,\n spark: null,\n };\n\n // Derive synchronous chains first (Ethereum, Bitcoin, Spark, TRON)\n try {\n addresses.ethereum = deriveEthereumAddress(seed);\n } catch (e) {\n console.error('ETH derivation failed:', e);\n }\n\n try {\n addresses.bitcoin = deriveBitcoinAddress(seed, network);\n } catch (e) {\n console.error('BTC derivation failed:', e);\n }\n\n try {\n addresses.spark = deriveSparkAddress(seed, network);\n } catch (e) {\n console.error('Spark derivation failed:', e);\n }\n\n try {\n addresses.tron = deriveTronAddress(seed);\n } catch (e) {\n console.error('TRON derivation failed:', e);\n }\n\n // Derive async chains in parallel (Solana, TON use ed25519 which requires async imports)\n const [solResult, tonResult] = await Promise.allSettled([\n deriveSolanaAddress(seed),\n deriveTonAddress(seed),\n ]);\n\n if (solResult.status === 'fulfilled') {\n addresses.solana = solResult.value;\n } else {\n console.error('SOL derivation failed:', solResult.reason);\n }\n\n if (tonResult.status === 'fulfilled') {\n addresses.ton = tonResult.value;\n } else {\n console.error('TON derivation failed:', tonResult.reason);\n }\n\n return addresses;\n}\n\n/**\n * Validate a BIP-39 seed phrase using @scure/bip39\n */\nexport function isValidSeed(seed: string): boolean {\n return validateMnemonic(seed, wordlist);\n}\n\n/**\n * Generate a random BIP-39 seed phrase using @scure/bip39\n */\nexport function generateSeedPhrase(): string {\n return generateMnemonic(wordlist);\n}\n","/**\n * Zubari WDK Service - Unified Multi-Chain Wallet Service\n *\n * This service provides a unified interface for multi-chain wallet operations\n * that works in both browser and Node.js environments.\n *\n * Strategy:\n * - Browser: Uses WdkApiClient to call the backend API (which has Tether WDK)\n * - Node.js: Uses WdkService natively (with Tether WDK modules)\n *\n * The Tether WDK (@tetherto/wdk-*) only works in Node.js environments due to\n * native dependencies (Electrum client, gRPC, etc.). For browser environments,\n * we route all operations through the backend API.\n *\n * @see https://docs.wallet.tether.io/\n */\n\nimport { WdkApiClient, getWdkApiClient } from './WdkApiClient';\nimport * as BrowserDerivation from './BrowserAddressDerivation';\nimport type { NetworkType } from '../types';\n\n// Default API URL for the Zubari backend with Tether WDK\nconst DEFAULT_API_URL = 'https://ckgwifsxka.us-east-2.awsapprunner.com';\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 ChainBalance {\n chain: SupportedChain;\n address: string;\n balance: string;\n symbol: string;\n}\n\nexport interface FeeRates {\n slow: string;\n normal: string;\n fast: string;\n}\n\nexport interface TransactionResult {\n success: boolean;\n txHash?: string;\n from?: string;\n to?: string;\n amount?: string;\n chain?: string;\n network?: string;\n error?: string;\n}\n\nexport interface ZubariWdkServiceConfig {\n /** Network to use (mainnet or testnet) */\n network: 'mainnet' | 'testnet';\n /** API URL for the Zubari backend (required for browser environments) */\n apiUrl?: string;\n /** Force using API even in Node.js (useful for testing) */\n forceApi?: boolean;\n /** Request timeout in milliseconds */\n timeout?: number;\n}\n\n/**\n * Check if we're running in a browser environment\n */\nfunction isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof window.document !== 'undefined';\n}\n\n/**\n * Dynamic import helper that bypasses bundler analysis\n * This ensures the import is truly runtime and not analyzed at build time\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 * Check if native WDK modules are available (Node.js only)\n */\nasync function canUseNativeWdk(): Promise<boolean> {\n // Never use native WDK in browser\n if (isBrowser()) {\n return false;\n }\n\n try {\n // Try to dynamically import WDK to check if it's available\n await dynamicImport('@tetherto/wdk');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * ZubariWdkService - Unified wallet service for browser and Node.js\n *\n * This service automatically routes operations to:\n * - API backend (browser) - using WdkApiClient\n * - Native WDK (Node.js) - using WdkService\n * - Browser derivation (fallback) - using BrowserAddressDerivation\n */\nexport class ZubariWdkService {\n private config: Required<ZubariWdkServiceConfig>;\n private apiClient: WdkApiClient;\n private nativeWdkService: unknown | null = null;\n private initialized = false;\n private useNativeWdk = false;\n\n constructor(config: Partial<ZubariWdkServiceConfig> = {}) {\n this.config = {\n network: config.network || 'testnet',\n apiUrl: config.apiUrl || process.env.NEXT_PUBLIC_API_URL || DEFAULT_API_URL,\n forceApi: config.forceApi ?? false,\n timeout: config.timeout || 30000,\n };\n\n this.apiClient = getWdkApiClient(this.config.apiUrl);\n }\n\n /**\n * Initialize the service and determine the best strategy\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // In browser or if forceApi is set, always use API\n if (isBrowser() || this.config.forceApi) {\n this.useNativeWdk = false;\n this.initialized = true;\n return;\n }\n\n // In Node.js, try to use native WDK\n if (await canUseNativeWdk()) {\n try {\n // Use dynamic import helper to bypass bundler analysis\n // This ensures WdkService is never included in browser bundles\n const WdkServiceModule = await dynamicImport('./WdkService');\n const WdkService = WdkServiceModule.WdkService || WdkServiceModule.default;\n this.nativeWdkService = new WdkService({\n network: this.config.network,\n });\n this.useNativeWdk = true;\n } catch (error) {\n console.warn('Failed to initialize native WDK, falling back to API:', error);\n this.useNativeWdk = false;\n }\n }\n\n this.initialized = true;\n }\n\n /**\n * Get the current execution mode\n */\n getMode(): 'api' | 'native' | 'browser-fallback' {\n if (this.useNativeWdk) return 'native';\n if (isBrowser()) return 'api';\n return 'api';\n }\n\n /**\n * Check if running in browser\n */\n isBrowserEnvironment(): boolean {\n return isBrowser();\n }\n\n /**\n * Generate a new BIP-39 seed phrase (12 words)\n */\n async generateSeed(): Promise<string> {\n await this.initialize();\n\n // Try API first (most reliable, uses real WDK)\n try {\n const response = await this.apiClient.generateSeed();\n if (response.success && response.seed) {\n return response.seed;\n }\n } catch (error) {\n console.warn('API seed generation failed:', error);\n }\n\n // Try native WDK\n if (this.useNativeWdk && this.nativeWdkService) {\n try {\n const wdk = this.nativeWdkService as { generateSeedPhrase: () => Promise<string> };\n return await wdk.generateSeedPhrase();\n } catch (error) {\n console.warn('Native WDK seed generation failed:', error);\n }\n }\n\n // Fallback to browser-compatible generation\n return BrowserDerivation.generateSeedPhrase();\n }\n\n /**\n * Validate a BIP-39 seed phrase\n */\n async validateSeed(seed: string): Promise<boolean> {\n await this.initialize();\n\n // Try API first\n try {\n const response = await this.apiClient.validateSeed(seed);\n if (response.success) {\n return response.isValid ?? false;\n }\n } catch (error) {\n console.warn('API seed validation failed:', error);\n }\n\n // Try native WDK\n if (this.useNativeWdk && this.nativeWdkService) {\n try {\n const wdk = this.nativeWdkService as { isValidSeed: (seed: string) => Promise<boolean> };\n return await wdk.isValidSeed(seed);\n } catch (error) {\n console.warn('Native WDK seed validation failed:', error);\n }\n }\n\n // Fallback to browser-compatible validation\n return BrowserDerivation.isValidSeed(seed);\n }\n\n /**\n * Derive address for a specific chain using WDK API\n *\n * For Ethereum, falls back to local derivation if API fails.\n * For other chains, WDK API is required - no placeholder fallback.\n */\n async deriveAddress(seed: string, chain: SupportedChain): Promise<ChainAddress> {\n await this.initialize();\n\n const path = this.getDerivationPath(chain);\n\n // Try API first (uses real WDK on backend)\n try {\n const response = await this.apiClient.deriveAddress(seed, chain as NetworkType, this.config.network);\n if (response.success && response.address) {\n return {\n chain,\n address: response.address,\n path: response.path || path,\n };\n }\n } catch (error) {\n console.warn(`API address derivation failed for ${chain}:`, error);\n\n // For Ethereum only, fall back to local derivation\n if (chain === 'ethereum') {\n return this.deriveBrowserAddress(seed, chain);\n }\n }\n\n // Try native WDK (Node.js only)\n if (this.useNativeWdk && this.nativeWdkService) {\n try {\n const wdk = this.nativeWdkService as {\n initialize: (seed: string) => Promise<void>;\n deriveAddress: (chain: SupportedChain) => Promise<ChainAddress>;\n };\n await wdk.initialize(seed);\n return await wdk.deriveAddress(chain);\n } catch (error) {\n console.warn(`Native WDK address derivation failed for ${chain}:`, error);\n }\n }\n\n // For Ethereum, we can use browser derivation as final fallback\n if (chain === 'ethereum') {\n return this.deriveBrowserAddress(seed, chain);\n }\n\n // For other chains, throw error - no placeholder addresses\n throw new Error(\n `WDK API required for ${chain} address derivation. Ensure the backend is running.`\n );\n }\n\n /**\n * Derive addresses for all supported chains using WDK API\n *\n * Uses the backend WDK API for real cryptographically valid addresses.\n * No placeholder fallback - WDK API is required for multi-chain addresses.\n */\n async deriveAllAddresses(seed: string): Promise<MultiChainAddresses> {\n await this.initialize();\n\n // Try API first (uses real WDK on backend)\n try {\n const response = await this.apiClient.deriveAllAddresses(seed, this.config.network);\n if (response.success && response.addresses) {\n // Extract address strings from response - API may return objects or strings\n const extractAddress = (value: unknown): string | null => {\n if (!value) return null;\n if (typeof value === 'string') return value;\n if (typeof value === 'object' && value !== null && 'address' in value) {\n return (value as { address: string }).address;\n }\n return null;\n };\n\n return {\n ethereum: extractAddress(response.addresses.ethereum),\n bitcoin: extractAddress(response.addresses.bitcoin),\n ton: extractAddress(response.addresses.ton),\n tron: extractAddress(response.addresses.tron),\n solana: extractAddress(response.addresses.solana),\n spark: extractAddress(response.addresses.spark),\n };\n }\n } catch (error) {\n console.warn('API address derivation failed:', error);\n }\n\n // Try native WDK (Node.js only)\n if (this.useNativeWdk && this.nativeWdkService) {\n try {\n const wdk = this.nativeWdkService as {\n initialize: (seed: string) => Promise<void>;\n deriveAllAddresses: () => Promise<MultiChainAddresses>;\n };\n await wdk.initialize(seed);\n return await wdk.deriveAllAddresses();\n } catch (error) {\n console.warn('Native WDK multi-chain derivation failed:', error);\n }\n }\n\n // No fallback - Tether WDK is required for multi-chain address derivation\n throw new Error(\n 'Tether WDK API required for multi-chain address derivation. Service temporarily unavailable.'\n );\n }\n\n /**\n * Get balances for all chains\n */\n async getAllBalances(seed: string): Promise<Record<string, ChainBalance | null>> {\n await this.initialize();\n\n // This always uses API as it requires blockchain RPC calls\n try {\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/balances`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ seed, network: this.config.network }),\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.success) {\n return data.balances;\n }\n }\n } catch (error) {\n console.warn('Failed to fetch balances:', error);\n }\n\n return {};\n }\n\n /**\n * Get fee rates for a chain\n */\n async getFeeRates(seed: string, chain: SupportedChain): Promise<FeeRates> {\n await this.initialize();\n\n try {\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/fee-rates`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ seed, chain, network: this.config.network }),\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.feeRates) {\n return data.feeRates;\n }\n }\n } catch (error) {\n console.warn(`Failed to fetch fee rates for ${chain}:`, error);\n }\n\n return { slow: '0', normal: '0', fast: '0' };\n }\n\n /**\n * Estimate transaction fee\n */\n async estimateFee(\n seed: string,\n chain: SupportedChain,\n to: string,\n amount: string\n ): Promise<{ fee: string; symbol: string }> {\n await this.initialize();\n\n try {\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/estimate-fee`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ seed, chain, to, amount, network: this.config.network }),\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.success) {\n return { fee: data.fee, symbol: data.symbol };\n }\n }\n } catch (error) {\n console.warn(`Failed to estimate fee for ${chain}:`, error);\n }\n\n return { fee: '0', symbol: this.getChainSymbol(chain) };\n }\n\n /**\n * Send a transaction\n */\n async sendTransaction(\n seed: string,\n chain: SupportedChain,\n to: string,\n amount: string\n ): Promise<TransactionResult> {\n await this.initialize();\n\n try {\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/send`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ seed, chain, to, amount, network: this.config.network }),\n });\n\n if (response.ok) {\n const data = await response.json();\n\n // Extract transaction hash from various possible properties\n let txHash = data.txHash || data.transactionHash || data.hash;\n\n // Handle case where txHash might be an object\n if (txHash && typeof txHash === 'object' && 'hash' in txHash) {\n txHash = txHash.hash;\n }\n\n // Validate Ethereum tx hash format (should be 66 chars: 0x + 64 hex)\n if (chain === 'ethereum' && txHash && (typeof txHash !== 'string' || !txHash.startsWith('0x') || txHash.length !== 66)) {\n console.warn(`Invalid Ethereum tx hash format: ${txHash} (length: ${txHash?.length}, expected: 66)`);\n }\n\n return {\n success: data.success,\n txHash,\n from: data.from,\n to: data.to,\n amount: data.amount,\n chain: data.chain,\n network: data.network,\n };\n }\n\n const errorData = await response.json().catch(() => ({}));\n return {\n success: false,\n error: errorData.error || `HTTP ${response.status}`,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Transaction failed',\n };\n }\n }\n\n /**\n * Get the network configuration\n */\n getNetwork(): 'mainnet' | 'testnet' {\n return this.config.network;\n }\n\n /**\n * Get API URL\n */\n getApiUrl(): string {\n return this.config.apiUrl;\n }\n\n // ==========================================\n // Private Helper Methods\n // ==========================================\n\n private getDerivationPath(chain: SupportedChain): string {\n const paths: Record<SupportedChain, string> = {\n bitcoin: this.config.network === 'testnet' ? \"m/84'/1'/0'/0/0\" : \"m/84'/0'/0'/0/0\",\n ethereum: \"m/44'/60'/0'/0/0\",\n ton: \"m/44'/607'/0'/0'/0'\",\n tron: \"m/44'/195'/0'/0/0\",\n solana: \"m/44'/501'/0'/0'\",\n spark: \"m/44'/998'/0'/0/0\",\n };\n return paths[chain];\n }\n\n private getChainSymbol(chain: SupportedChain): string {\n const symbols: Record<SupportedChain, string> = {\n ethereum: 'ETH',\n bitcoin: 'BTC',\n ton: 'TON',\n tron: 'TRX',\n solana: 'SOL',\n spark: 'SAT',\n };\n return symbols[chain];\n }\n\n /**\n * Derive address using browser-compatible libraries\n */\n private async deriveBrowserAddress(seed: string, chain: SupportedChain): Promise<ChainAddress> {\n const path = this.getDerivationPath(chain);\n\n try {\n let address: string;\n\n switch (chain) {\n case 'ethereum':\n address = BrowserDerivation.deriveEthereumAddress(seed);\n break;\n case 'bitcoin':\n address = BrowserDerivation.deriveBitcoinAddress(seed, this.config.network);\n break;\n case 'tron':\n address = BrowserDerivation.deriveTronAddress(seed);\n break;\n case 'spark':\n address = BrowserDerivation.deriveSparkAddress(seed, this.config.network);\n break;\n case 'solana':\n address = await BrowserDerivation.deriveSolanaAddress(seed);\n break;\n case 'ton':\n address = await BrowserDerivation.deriveTonAddress(seed);\n break;\n default:\n throw new Error(`Unsupported chain: ${chain}`);\n }\n\n return { chain, address, path };\n } catch (error) {\n console.error(`Browser derivation failed for ${chain}:`, error);\n throw error;\n }\n }\n\n /**\n * Derive all addresses using browser-compatible libraries\n */\n private async deriveAllBrowserAddresses(seed: string): Promise<MultiChainAddresses> {\n return BrowserDerivation.deriveAllAddresses(seed, this.config.network);\n }\n}\n\n// ==========================================\n// Factory Functions\n// ==========================================\n\nlet defaultService: ZubariWdkService | null = null;\n\n/**\n * Get or create the default ZubariWdkService instance\n */\nexport function getZubariWdkService(config?: Partial<ZubariWdkServiceConfig>): ZubariWdkService {\n if (!defaultService || (config && config.network !== defaultService.getNetwork())) {\n defaultService = new ZubariWdkService(config);\n }\n return defaultService;\n}\n\n/**\n * Create a new ZubariWdkService instance\n */\nexport function createZubariWdkService(config?: Partial<ZubariWdkServiceConfig>): ZubariWdkService {\n return new ZubariWdkService(config);\n}\n\n/**\n * Check if the current environment is a browser\n */\nexport { isBrowser };\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 { ZubariWdkService, getZubariWdkService } from '../services/ZubariWdkService';\nimport * as BrowserDerivation from '../services/BrowserAddressDerivation';\n\n/**\n * CoinGecko IDs for each supported chain\n */\nconst COINGECKO_IDS: Record<NetworkType, string> = {\n ethereum: 'ethereum',\n bitcoin: 'bitcoin',\n ton: 'the-open-network',\n tron: 'tron',\n solana: 'solana',\n spark: 'bitcoin', // Spark uses BTC\n};\n\n/**\n * Price cache to avoid excessive API calls\n */\ninterface PriceCache {\n prices: Record<string, number>;\n timestamp: number;\n}\n\nlet priceCache: PriceCache | null = null;\nconst PRICE_CACHE_TTL = 60000; // 1 minute cache\n\n/**\n * Fetch USD prices for all supported chains from CoinGecko\n */\nasync function fetchPrices(): Promise<Record<string, number>> {\n // Check cache\n if (priceCache && Date.now() - priceCache.timestamp < PRICE_CACHE_TTL) {\n return priceCache.prices;\n }\n\n const ids = Object.values(COINGECKO_IDS).filter((v, i, a) => a.indexOf(v) === i).join(',');\n\n try {\n const response = await fetch(\n `https://api.coingecko.com/api/v3/simple/price?ids=${ids}&vs_currencies=usd`,\n {\n headers: { 'Accept': 'application/json' },\n }\n );\n\n if (response.ok) {\n const data = await response.json();\n const prices: Record<string, number> = {};\n\n for (const [chain, geckoId] of Object.entries(COINGECKO_IDS)) {\n prices[chain] = data[geckoId]?.usd || 0;\n }\n\n // Update cache\n priceCache = { prices, timestamp: Date.now() };\n return prices;\n }\n } catch (error) {\n console.warn('Failed to fetch prices from CoinGecko:', error);\n }\n\n // Return cached prices if available, otherwise empty\n return priceCache?.prices || {};\n}\n\n/**\n * Get USD price for a specific chain\n */\nasync function getPriceForChain(chain: NetworkType): Promise<number> {\n const prices = await fetchPrices();\n return prices[chain] || 0;\n}\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 DERIVED_ADDRESSES: 'derived_addresses',\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: ZubariWdkService;\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 || 'https://ckgwifsxka.us-east-2.awsapprunner.com',\n };\n this.storage = this.config.storage;\n\n // Initialize unified WDK service (works in browser and Node.js)\n this.wdkService = getZubariWdkService({\n network: this.config.network,\n apiUrl: this.config.apiUrl,\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 Tether WDK (via API in browser)\n * This is the recommended method for generating seed phrases\n */\n async generateSeedWithWdk(): Promise<string> {\n return await this.wdkService.generateSeed();\n }\n\n /**\n * Validate seed phrase using WDK (async, more accurate)\n */\n async validateSeedWithWdk(seed: string): Promise<boolean> {\n return await this.wdkService.validateSeed(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 // 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 await this.storage.removeItem(STORAGE_KEYS.DERIVED_ADDRESSES);\n this.currentSeed = null;\n this.derivedAddress = null;\n this.derivedAddresses = {};\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 * Uses the unified WDK service which:\n * - In browser: Calls the backend API (which has Tether WDK)\n * - In Node.js: Uses native WDK\n *\n * No fallback to placeholder addresses - WDK API is required for real addresses.\n */\n static async deriveAddressForChainAsync(\n seed: string,\n chain: NetworkType,\n network: 'mainnet' | 'testnet' = 'testnet',\n apiUrl?: string\n ): Promise<string> {\n // For Ethereum, we can derive locally as fallback\n if (chain === 'ethereum') {\n try {\n const wdkService = getZubariWdkService({ network, apiUrl });\n const result = await wdkService.deriveAddress(seed, chain);\n return result.address;\n } catch (error) {\n console.warn('WDK service failed for Ethereum, using local derivation:', error);\n return WalletManager.deriveAddressForChain(seed, 'ethereum');\n }\n }\n\n // For all other chains, WDK API is required\n const wdkService = getZubariWdkService({ network, apiUrl });\n const result = await wdkService.deriveAddress(seed, chain as 'bitcoin' | 'ton' | 'tron' | 'solana' | 'spark');\n return result.address;\n }\n\n /**\n * Derive address for a specific chain (sync version)\n * Only supports Ethereum - for other chains use deriveAddressForChainAsync with WDK API\n *\n * @throws Error for non-Ethereum chains - use WDK API instead\n */\n static deriveAddressForChain(seed: string, chain: NetworkType): string {\n if (chain === 'ethereum') {\n const ethPath = DERIVATION_PATHS['ethereum'];\n const ethNode = HDNodeWallet.fromPhrase(seed, undefined, `${ethPath}/0`);\n return ethNode.address;\n }\n\n // For non-Ethereum chains, throw error - must use WDK API\n throw new Error(\n `Sync derivation not supported for ${chain}. Use deriveAddressForChainAsync() with WDK API.`\n );\n }\n\n /**\n * Derive addresses for all enabled chains (sync version)\n * Only derives Ethereum address synchronously - use deriveAllAddressesAsync for all chains\n */\n deriveAllAddresses(): Partial<MultiChainAddresses> {\n if (!this.currentSeed) {\n throw new Error('Wallet is locked');\n }\n\n // Only derive Ethereum synchronously - other chains require WDK API\n const addresses: Partial<MultiChainAddresses> = {\n ethereum: WalletManager.deriveAddressForChain(this.currentSeed, 'ethereum'),\n };\n\n this.derivedAddresses = addresses;\n return addresses;\n }\n\n /**\n * Derive addresses for all enabled chains using Tether WDK\n * In browser: Uses the backend API (which has Tether WDK)\n * In Node.js: Uses native WDK directly\n * Returns REAL cryptographically valid addresses for all chains.\n * Addresses are persisted to storage for future use.\n */\n async deriveAllAddressesWithWdk(): Promise<Partial<MultiChainAddresses>> {\n if (!this.currentSeed) {\n throw new Error('Wallet is locked');\n }\n\n try {\n // Use the unified WDK service (handles browser/Node.js automatically)\n const wdkAddresses = await this.wdkService.deriveAllAddresses(this.currentSeed);\n\n // Filter to only enabled chains\n const enabledChainsSet = new Set(this.config.enabledChains);\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\n // Persist addresses to storage for future use\n await this.saveAddressesToStorage(addresses);\n\n return addresses;\n } catch (error) {\n console.error('WDK derivation failed:', error);\n throw error;\n }\n }\n\n /**\n * Save derived addresses to storage\n */\n private async saveAddressesToStorage(addresses: Partial<MultiChainAddresses>): Promise<void> {\n try {\n await this.storage.setItem(STORAGE_KEYS.DERIVED_ADDRESSES, JSON.stringify(addresses));\n console.log('Saved derived addresses to storage:', Object.keys(addresses));\n } catch (error) {\n console.warn('Failed to save addresses to storage:', error);\n }\n }\n\n /**\n * Normalize an address value - extract string from object format if needed\n * Handles both string addresses and object format {chain, address, path}\n */\n private normalizeAddress(value: unknown): string | null {\n if (typeof value === 'string') {\n return value;\n }\n if (value && typeof value === 'object' && 'address' in value) {\n const addr = (value as { address: unknown }).address;\n return typeof addr === 'string' ? addr : null;\n }\n return null;\n }\n\n /**\n * Normalize all addresses in an object - extract strings from object format\n */\n private normalizeAddresses(addresses: Record<string, unknown>): Partial<MultiChainAddresses> {\n const normalized: Partial<MultiChainAddresses> = {};\n for (const [chain, value] of Object.entries(addresses)) {\n const addr = this.normalizeAddress(value);\n if (addr) {\n normalized[chain as NetworkType] = addr;\n }\n }\n return normalized;\n }\n\n /**\n * Load derived addresses from storage\n */\n private async loadAddressesFromStorage(): Promise<Partial<MultiChainAddresses> | null> {\n try {\n const stored = await this.storage.getItem(STORAGE_KEYS.DERIVED_ADDRESSES);\n if (stored) {\n const rawAddresses = JSON.parse(stored) as Record<string, unknown>;\n console.log('[WalletManager] Raw addresses from storage:', rawAddresses);\n // Normalize addresses - they might be objects {chain, address, path} or strings\n const addresses = this.normalizeAddresses(rawAddresses);\n console.log('[WalletManager] Normalized addresses:', addresses);\n\n // Save normalized addresses back to storage to fix corrupted data\n await this.saveAddressesToStorage(addresses);\n\n return addresses;\n }\n } catch (error) {\n console.warn('Failed to load addresses from storage:', error);\n }\n return null;\n }\n\n /**\n * Derive addresses for all enabled chains using Tether WDK\n *\n * Uses the WDK API backend for real cryptographically valid addresses.\n * First tries to load from storage to avoid losing previously derived addresses.\n *\n * @throws Error if WDK API is unavailable and no cached addresses exist\n */\n async deriveAllAddressesAsync(): Promise<Partial<MultiChainAddresses>> {\n if (!this.currentSeed) {\n throw new Error('Wallet is locked');\n }\n\n // First, try to load addresses from storage\n // This preserves real WDK-derived addresses even if WDK service is temporarily unavailable\n const storedAddresses = await this.loadAddressesFromStorage();\n if (storedAddresses && Object.keys(storedAddresses).length > 1) {\n // Verify the stored Ethereum address matches the current seed\n const expectedEthAddress = WalletManager.deriveAddress(this.currentSeed);\n if (storedAddresses.ethereum === expectedEthAddress) {\n console.log('Using addresses from storage (verified by Ethereum address)');\n this.derivedAddresses = storedAddresses;\n return storedAddresses;\n } else {\n console.log('Stored addresses do not match current seed, re-deriving...');\n }\n }\n\n // Use WDK API to derive all addresses - no placeholder fallback\n return await this.deriveAllAddressesWithWdk();\n }\n\n /**\n * Get address for a specific chain\n * Returns cached address or null - use deriveAllAddressesAsync to derive addresses\n */\n getAddressForChain(chain: NetworkType): string | null {\n // Return cached address if available (normalize in case it's an object)\n const cachedValue = this.derivedAddresses[chain];\n if (cachedValue) {\n console.log(`[WalletManager] getAddressForChain(${chain}) cached value:`, cachedValue, 'type:', typeof cachedValue);\n const addr = this.normalizeAddress(cachedValue);\n console.log(`[WalletManager] getAddressForChain(${chain}) normalized:`, addr);\n if (addr) {\n // Update cache with normalized string\n (this.derivedAddresses as Record<string, string>)[chain] = addr;\n return addr;\n }\n }\n\n // For Ethereum, we can derive synchronously if unlocked\n if (chain === 'ethereum' && this.currentSeed) {\n this.derivedAddresses[chain] = WalletManager.deriveAddressForChain(this.currentSeed, chain);\n return this.derivedAddresses[chain];\n }\n\n // For other chains, return null - must use deriveAllAddressesAsync first\n return null;\n }\n\n /**\n * Get all derived addresses\n */\n getAllAddresses(): Partial<MultiChainAddresses> {\n // Normalize all addresses before returning\n return this.normalizeAddresses(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 console.log(`[WalletManager] Fetching ${chain} balance for ${address} using RPC: ${this.config.rpcUrl}`);\n\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 console.log(`[WalletManager] ${chain} balance fetched: ${balance} (raw: ${rawBalance})`);\n } catch (error) {\n console.error(`[WalletManager] Failed to fetch ${chain} balance from ${this.config.rpcUrl}:`, error);\n // Balance remains '0' on error\n }\n } else if (chain === 'bitcoin') {\n // Bitcoin: Use mempool.space API (more reliable, supports multiple testnets)\n // For testnet addresses, try both testnet3 and testnet4 since they use the same prefix\n const isMainnet = this.config.network === 'mainnet' || address.startsWith('bc1') || address.startsWith('1') || address.startsWith('3');\n\n // List of APIs to try (in order)\n const apisToTry: string[] = isMainnet\n ? ['https://mempool.space/api']\n : [\n 'https://mempool.space/testnet/api', // testnet3 first (more common)\n 'https://mempool.space/testnet4/api', // then testnet4\n ];\n\n for (const apiUrl of apisToTry) {\n try {\n const response = await fetch(`${apiUrl}/address/${address}`, {\n headers: { 'Accept': 'application/json' },\n });\n\n if (response.ok) {\n const data = await response.json();\n\n // Check if this address has any transactions on this network\n const txCount = (data.chain_stats?.tx_count || 0) + (data.mempool_stats?.tx_count || 0);\n\n if (txCount > 0 || isMainnet) {\n // Found transactions or mainnet - use this data\n const chainFunded = data.chain_stats?.funded_txo_sum || 0;\n const chainSpent = data.chain_stats?.spent_txo_sum || 0;\n const mempoolFunded = data.mempool_stats?.funded_txo_sum || 0;\n const mempoolSpent = data.mempool_stats?.spent_txo_sum || 0;\n\n // Total balance in satoshis\n const satoshis = (chainFunded - chainSpent) + (mempoolFunded - mempoolSpent);\n // Convert to BTC (1 BTC = 100,000,000 satoshis)\n balance = (satoshis / 100_000_000).toFixed(8);\n console.log(`Bitcoin balance for ${address}: ${balance} BTC (${satoshis} sats) via ${apiUrl}`);\n break; // Found balance, stop trying other APIs\n }\n // No transactions found, try next API\n console.log(`No transactions found on ${apiUrl}, trying next...`);\n }\n } catch (error) {\n console.warn(`Failed to fetch from ${apiUrl}:`, error);\n // Continue to next API\n }\n }\n } else if (chain === 'solana') {\n // Solana: Use public RPC API\n const rpcUrl = this.config.network === 'mainnet'\n ? 'https://api.mainnet-beta.solana.com'\n : 'https://api.devnet.solana.com';\n\n try {\n const response = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getBalance',\n params: [address],\n }),\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.result?.value !== undefined) {\n // Convert lamports to SOL (1 SOL = 1,000,000,000 lamports)\n balance = (data.result.value / 1_000_000_000).toFixed(9);\n }\n }\n } catch (error) {\n console.warn(`Failed to fetch ${chain} balance:`, error);\n }\n } else if (chain === 'tron') {\n // TRON: Use TronGrid API\n const baseUrl = this.config.network === 'mainnet'\n ? 'https://api.trongrid.io'\n : 'https://api.shasta.trongrid.io';\n\n try {\n const response = await fetch(`${baseUrl}/v1/accounts/${address}`, {\n headers: { 'Accept': 'application/json' },\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.data?.[0]?.balance !== undefined) {\n // Balance is in SUN (1 TRX = 1,000,000 SUN)\n balance = (data.data[0].balance / 1_000_000).toFixed(6);\n }\n }\n } catch (error) {\n console.warn(`Failed to fetch ${chain} balance:`, error);\n }\n } else if (chain === 'ton') {\n // TON: Use toncenter API\n const baseUrl = this.config.network === 'mainnet'\n ? 'https://toncenter.com/api/v2'\n : 'https://testnet.toncenter.com/api/v2';\n\n try {\n const response = await fetch(`${baseUrl}/getAddressBalance?address=${address}`, {\n headers: { 'Accept': 'application/json' },\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.ok && data.result !== undefined) {\n // Balance is in nanotons (1 TON = 1,000,000,000 nanotons)\n const nanotons = BigInt(data.result);\n balance = (Number(nanotons) / 1_000_000_000).toFixed(9);\n console.log(`TON balance for ${address}: ${balance} TON`);\n }\n }\n } catch (error) {\n console.warn(`Failed to fetch ${chain} balance:`, error);\n }\n } else if (chain === 'spark') {\n // Spark (Lightning): Balance fetching via Spark SDK\n // Note: Spark operates on Lightning Network with channels\n // For now, we try to get balance via the API if available\n try {\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/balance`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n chain: 'spark',\n address,\n network: this.config.network,\n }),\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.balance !== undefined) {\n // Balance in satoshis, convert to BTC\n balance = (parseFloat(data.balance) / 100_000_000).toFixed(8);\n console.log(`Spark balance for ${address}: ${balance} BTC`);\n }\n }\n } catch (error) {\n console.warn(`Failed to fetch ${chain} balance:`, error);\n // Balance remains '0' on error\n }\n }\n\n // Fetch USD price for this chain\n const priceUsd = await getPriceForChain(chain);\n const balanceNum = parseFloat(balance) || 0;\n const balanceUsd = balanceNum * priceUsd;\n\n return {\n chain,\n symbol: networkConfig.nativeCurrency.symbol,\n balance,\n balanceUsd,\n address,\n decimals: networkConfig.nativeCurrency.decimals,\n };\n }\n\n /**\n * Fetch balances for all enabled chains\n */\n async fetchAllBalances(): Promise<ChainBalance[]> {\n const balances: ChainBalance[] = [];\n\n for (const chain of this.config.enabledChains) {\n try {\n const balance = await this.fetchBalanceForChain(chain);\n balances.push(balance);\n } catch (error) {\n console.error(`Failed to fetch balance for ${chain}:`, error);\n // Add placeholder balance on error\n const networkConfig = this.getChainConfig(chain);\n balances.push({\n chain,\n symbol: networkConfig.nativeCurrency.symbol,\n balance: '0',\n balanceUsd: 0,\n address: this.getAddressForChain(chain) || '',\n decimals: networkConfig.nativeCurrency.decimals,\n });\n }\n }\n\n return balances;\n }\n\n /**\n * Get extended wallet state with multi-chain info\n */\n getExtendedState(): WalletState {\n return {\n isInitialized: this.derivedAddress !== null,\n isLocked: this.currentSeed === null && this.derivedAddress !== null,\n address: this.derivedAddress,\n balance: null,\n addresses: this.derivedAddresses,\n selectedChain: this.selectedChain,\n };\n }\n\n /**\n * Send a transaction using Tether WDK\n * Supports native tokens and USDT on all chains\n *\n * @param chain - Target blockchain (ethereum, bitcoin, ton, tron, solana, spark)\n * @param to - Recipient address\n * @param amount - Amount to send (in human-readable format)\n * @param token - Optional token symbol (e.g., 'USDT' for stablecoins)\n * @returns Transaction result with hash and status\n */\n async sendTransaction(\n chain: NetworkType,\n to: string,\n amount: string,\n token?: string\n ): Promise<{\n success: boolean;\n txHash?: string;\n from?: string;\n to?: string;\n amount?: string;\n chain?: NetworkType;\n error?: string;\n }> {\n if (!this.currentSeed) {\n return { success: false, error: 'Wallet is locked' };\n }\n\n const fromAddress = this.getAddressForChain(chain);\n if (!fromAddress) {\n return { success: false, error: `No address for chain ${chain}` };\n }\n\n try {\n // Use WDK service to send transaction via backend\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/send`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n seed: this.currentSeed,\n chain,\n to,\n amount,\n token,\n network: this.config.network,\n }),\n });\n\n if (response.ok) {\n const data = await response.json();\n console.log(`Transaction sent on ${chain}:`, data);\n\n // Extract and validate transaction hash\n let txHash = data.txHash || data.transactionHash || data.hash;\n\n // Handle case where txHash might be an object\n if (txHash && typeof txHash === 'object' && 'hash' in txHash) {\n txHash = txHash.hash;\n }\n\n // Validate Ethereum tx hash format (should be 66 chars: 0x + 64 hex)\n if (chain === 'ethereum' && txHash && (typeof txHash !== 'string' || !txHash.startsWith('0x') || txHash.length !== 66)) {\n console.warn(`Invalid Ethereum tx hash format: ${txHash} (length: ${txHash?.length}, expected: 66)`);\n }\n\n return {\n success: data.success,\n txHash,\n from: fromAddress,\n to,\n amount,\n chain,\n };\n }\n\n const errorData = await response.json().catch(() => ({}));\n return {\n success: false,\n error: errorData.error || `HTTP ${response.status}`,\n };\n } catch (error) {\n console.error(`Transaction failed on ${chain}:`, error);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Transaction failed',\n };\n }\n }\n\n /**\n * Estimate transaction fee using Tether WDK\n */\n async estimateFee(\n chain: NetworkType,\n to: string,\n amount: string,\n token?: string\n ): Promise<{\n success: boolean;\n fee?: string;\n feeUsd?: number;\n error?: string;\n }> {\n try {\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/estimate-fee`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n chain,\n to,\n amount,\n token,\n network: this.config.network,\n }),\n });\n\n if (response.ok) {\n const data = await response.json();\n return {\n success: true,\n fee: data.fee,\n feeUsd: data.feeUsd,\n };\n }\n\n return { success: false, error: 'Failed to estimate fee' };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Fee estimation failed',\n };\n }\n }\n}\n"]}
|
|
1
|
+
{"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/BrowserAddressDerivation.ts","../../src/services/ZubariWdkService.ts","../../src/wallet/WalletManager.ts"],"names":["DERIVATION_PATHS","DEFAULT_API_URL","HDNodeWallet","viemFormatEther","wdkService","result"],"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 bitcoin: {\n name: 'Bitcoin Testnet',\n rpcUrl: 'https://blockstream.info/testnet/api',\n explorerUrl: 'https://mempool.space/testnet',\n },\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// Zero address for ETH payments and placeholder addresses\nexport const 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: '0x48D0F3b6552A8CcDA7528db5aE8be004fCC3D3D9', // ZubariMarket deployed 2024-12-22\n tips: '0xFDc353edC63Cd3D4bba35bB43861369516a9Dc85',\n subscriptions: '0x8C05F8aD2F295fB7f3596043a7c37C98A5F7fAB8',\n payouts: '0x804Fe503936E8b8d3D5Dbb62AF4fB6Fe7265Fb2c',\n entryPoint: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n paymaster: ZERO_ADDRESS, // Deploy with: npx hardhat run deploy/deploy.ts --network ethereum-sepolia\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 // Pricing fields\n { name: 'price', type: 'uint256' },\n { name: 'currency', type: 'address' },\n { name: 'nonce', type: 'uint256' },\n // Watermarking fields\n { name: 'contentHash', type: 'bytes32' },\n { name: 'userId', type: 'bytes32' },\n { name: 'watermarkTimestamp', type: 'uint256' },\n { name: 'sessionId', type: 'bytes32' },\n ],\n} as const;\n\n// Currency addresses per network\nexport const CURRENCY_ADDRESSES = {\n testnet: {\n ETH: ZERO_ADDRESS,\n USDT: '0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0', // USDT on Sepolia\n },\n mainnet: {\n ETH: ZERO_ADDRESS,\n USDT: '0xdAC17F958D2ee523a2206206994597C13D831ec7', // USDT on Ethereum\n },\n} as const;\n\nexport function getContractAddresses(network: 'testnet' | 'mainnet'): ContractAddresses {\n return ZUBARI_CONTRACTS[network];\n}\n\n// Multi-chain Fee/Treasury Wallet Addresses\n// These wallets receive platform fees from transactions on their respective chains\nexport interface FeeWalletConfig {\n address: string;\n name: string;\n network: string;\n chainId?: number;\n}\n\nexport type SupportedFeeChain = 'ETH' | 'BTC' | 'SOLANA' | 'TON' | 'TRON';\n\n/**\n * Mainnet Fee Wallet Addresses\n * These are the production treasury wallets for collecting platform fees\n */\nexport const MAINNET_FEE_WALLETS: Record<SupportedFeeChain, FeeWalletConfig> = {\n // Ethereum (ETH, ERC-20 tokens like USDT)\n ETH: {\n address: '0x40Df60a57d02a7bB04B6624c65E2908Cc006badE',\n name: 'Zubari ETH Treasury',\n network: 'ethereum',\n chainId: 1,\n },\n // Bitcoin\n BTC: {\n address: 'bc1qh20fx23wk34pcm3zp0v9wctwprtl02uvh6q9qj',\n name: 'Zubari BTC Treasury',\n network: 'bitcoin',\n },\n // Solana (SOL, SPL tokens)\n SOLANA: {\n address: '2hXGumVRpD5KgdqNZUuYJ2YoyLR6jc8mvWbubciWjPuZ',\n name: 'Zubari Solana Treasury',\n network: 'solana',\n },\n // TON (The Open Network)\n TON: {\n address: 'UQB5hOrm9YGoKjrCVmvAUFgmApkvKWqVMROjieKs3z4kDz99',\n name: 'Zubari TON Treasury',\n network: 'ton',\n },\n // Tron (TRX, TRC-20 tokens like USDT)\n TRON: {\n address: 'TVBPjQFNe8JgVctDKWMxJNgjbPZoP6uu5h',\n name: 'Zubari Tron Treasury',\n network: 'tron',\n },\n} as const;\n\n/**\n * Testnet Fee Wallet Addresses\n * These are used for development and testing\n */\nexport const TESTNET_FEE_WALLETS: Record<SupportedFeeChain, FeeWalletConfig> = {\n // Ethereum Sepolia\n ETH: {\n address: ZERO_ADDRESS, // Configure via environment\n name: 'Zubari ETH Testnet Treasury',\n network: 'sepolia',\n chainId: 11155111,\n },\n // Bitcoin Testnet\n BTC: {\n address: '',\n name: 'Zubari BTC Testnet Treasury',\n network: 'bitcoin-testnet',\n },\n // Solana Devnet\n SOLANA: {\n address: '',\n name: 'Zubari Solana Devnet Treasury',\n network: 'solana-devnet',\n },\n // TON Testnet\n TON: {\n address: '',\n name: 'Zubari TON Testnet Treasury',\n network: 'ton-testnet',\n },\n // Tron Shasta Testnet\n TRON: {\n address: '',\n name: 'Zubari Tron Testnet Treasury',\n network: 'tron-shasta',\n },\n} as const;\n\n/**\n * Get fee wallet address for a specific chain\n * @param chain - The blockchain network\n * @param isMainnet - Whether to use mainnet addresses (default: false for testnet)\n */\nexport function getFeeWallet(chain: SupportedFeeChain, isMainnet: boolean = false): FeeWalletConfig {\n return isMainnet ? MAINNET_FEE_WALLETS[chain] : TESTNET_FEE_WALLETS[chain];\n}\n\n/**\n * Get all fee wallets for a network type\n * @param isMainnet - Whether to use mainnet addresses\n */\nexport function getAllFeeWallets(isMainnet: boolean = false): Record<SupportedFeeChain, FeeWalletConfig> {\n return isMainnet ? MAINNET_FEE_WALLETS : TESTNET_FEE_WALLETS;\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\nexport interface TransactionHistoryItem {\n hash: string;\n from: string;\n to: string;\n value: string;\n timestamp: number;\n status: 'confirmed' | 'pending' | 'failed';\n blockNumber?: number;\n}\n\nexport interface TransactionHistoryResponse {\n success: boolean;\n address?: string;\n transactions?: TransactionHistoryItem[];\n chain?: string;\n network?: string;\n error?: string;\n}\n\nexport interface SendTransactionResponse {\n success: boolean;\n txHash?: string;\n from?: string;\n to?: string;\n amount?: string;\n chain?: string;\n network?: string;\n error?: string;\n}\n\nexport interface TransactionStatusResponse {\n success: boolean;\n hash?: string;\n status?: 'confirmed' | 'pending' | 'failed';\n blockNumber?: number;\n confirmations?: number;\n timestamp?: number;\n from?: string;\n to?: string;\n value?: string;\n fee?: string;\n chain?: string;\n network?: string;\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 * Send a transaction on a specific chain using Tether WDK\n */\n async sendTransaction(\n seed: string,\n chain: NetworkType,\n to: string,\n amount: string,\n network: 'mainnet' | 'testnet' = 'testnet'\n ): Promise<SendTransactionResponse> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/send`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ seed, chain, to, amount, 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 send transaction',\n };\n }\n }\n\n /**\n * Get transaction history for an address on a specific chain\n * Fetches from blockchain explorers (Etherscan, mempool.space, etc.)\n */\n async getTransactionHistory(\n seed: string,\n chain: NetworkType,\n network: 'mainnet' | 'testnet' = 'testnet',\n limit: number = 10\n ): Promise<TransactionHistoryResponse> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/history`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ seed, chain, network, limit }),\n });\n\n return await response.json();\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get transaction history',\n };\n }\n }\n\n /**\n * Get transaction status by hash\n * Fetches from blockchain explorers to check confirmation status\n */\n async getTransactionStatus(\n txHash: string,\n chain: NetworkType,\n network: 'mainnet' | 'testnet' = 'testnet'\n ): Promise<TransactionStatusResponse> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/tx-status`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ txHash, 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 get transaction status',\n };\n }\n }\n}\n\n// Default API URL (can be overridden)\n// Uses the Zubari production API which has Tether WDK integrated\nconst DEFAULT_API_URL = process.env.NEXT_PUBLIC_API_URL || 'https://ckgwifsxka.us-east-2.awsapprunner.com';\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 * Browser-Compatible Address Derivation\n *\n * This module provides multi-chain address derivation that works in browser environments.\n * It uses the @scure libraries which are pure JS and don't require Node.js polyfills.\n *\n * Supported chains:\n * - Ethereum: ethers.js (BIP-44)\n * - Bitcoin: @scure/bip32 + @scure/base (BIP-84 native SegWit)\n * - Solana: ed25519-hd-key + tweetnacl (SLIP-0010)\n * - TON: ed25519 derivation with TON address format\n * - TRON: secp256k1 + base58check\n * - Spark: Bitcoin-based with custom derivation\n */\n\nimport { HDNodeWallet, keccak256, getBytes, sha256 as ethSha256 } from 'ethers';\nimport { mnemonicToSeedSync, validateMnemonic, generateMnemonic } from '@scure/bip39';\nimport { wordlist } from '@scure/bip39/wordlists/english';\nimport { HDKey } from '@scure/bip32';\nimport { bech32, base58check } from '@scure/base';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { ripemd160 } from '@noble/hashes/ripemd160';\nimport type { NetworkType } from '../types';\n\nexport interface ChainAddress {\n chain: NetworkType;\n address: string;\n path: string;\n}\n\nexport interface BrowserMultiChainAddresses {\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\n// BIP-44/84 derivation paths\nconst DERIVATION_PATHS = {\n ethereum: \"m/44'/60'/0'/0/0\",\n bitcoin_mainnet: \"m/84'/0'/0'/0/0\",\n bitcoin_testnet: \"m/84'/1'/0'/0/0\",\n ton: \"m/44'/607'/0'/0'/0'\",\n tron: \"m/44'/195'/0'/0/0\",\n solana: \"m/44'/501'/0'/0'\",\n spark: \"m/44'/998'/0'/0/0\",\n};\n\n/**\n * Derive Ethereum address from seed phrase\n */\nexport function deriveEthereumAddress(seed: string): string {\n const hdNode = HDNodeWallet.fromPhrase(seed, undefined, DERIVATION_PATHS.ethereum);\n return hdNode.address;\n}\n\n/**\n * Derive Bitcoin address from seed phrase (BIP-84 native SegWit)\n * Uses @scure libraries for browser compatibility\n */\nexport function deriveBitcoinAddress(\n seed: string,\n network: 'mainnet' | 'testnet' = 'testnet'\n): string {\n try {\n // Convert mnemonic to seed using @scure/bip39\n const seedBytes = mnemonicToSeedSync(seed);\n\n // Derive HD key using @scure/bip32\n const hdKey = HDKey.fromMasterSeed(seedBytes);\n const path = network === 'testnet' ? DERIVATION_PATHS.bitcoin_testnet : DERIVATION_PATHS.bitcoin_mainnet;\n const child = hdKey.derive(path);\n\n if (!child.publicKey) {\n throw new Error('Failed to derive public key');\n }\n\n // Create P2WPKH address (native SegWit)\n // 1. Hash160 = RIPEMD160(SHA256(publicKey))\n const pubKeyHash = ripemd160(sha256(child.publicKey));\n\n // 2. Create witness program: version (0x00) + hash160\n // For bech32, we encode: witness version (0) + pubKeyHash as 5-bit words\n const witnessVersion = 0;\n const words = bech32.toWords(pubKeyHash);\n words.unshift(witnessVersion); // Prepend witness version\n\n // 3. Encode with bech32\n const hrp = network === 'testnet' ? 'tb' : 'bc';\n const address = bech32.encode(hrp, words);\n\n return address;\n } catch (error) {\n console.error('Bitcoin address derivation failed:', error);\n throw error;\n }\n}\n\n/**\n * Derive Solana address from seed phrase using SLIP-0010 (ed25519)\n */\nexport async function deriveSolanaAddress(seed: string): Promise<string> {\n try {\n const [ed25519, nacl, bs58Module] = await Promise.all([\n import('ed25519-hd-key'),\n import('tweetnacl'),\n import('bs58'),\n ]);\n\n // bs58 v6 uses default export\n const bs58 = bs58Module.default || bs58Module;\n\n // Use @scure/bip39 for seed generation (browser compatible)\n const seedBytes = mnemonicToSeedSync(seed);\n\n // SLIP-0010 derivation for ed25519\n const derived = ed25519.derivePath(DERIVATION_PATHS.solana, Buffer.from(seedBytes).toString('hex'));\n\n // Create keypair from derived seed\n const keypair = nacl.sign.keyPair.fromSeed(new Uint8Array(derived.key));\n\n // Solana address is the base58-encoded public key (32 bytes)\n return bs58.encode(keypair.publicKey);\n } catch (error) {\n console.error('Solana address derivation failed:', error);\n throw error;\n }\n}\n\n/**\n * Derive TON address from seed phrase\n * Uses proper BIP-44 derivation path m/44'/607'/0'/0'/0'\n */\nexport async function deriveTonAddress(seed: string): Promise<string> {\n try {\n const [ed25519, nacl] = await Promise.all([\n import('ed25519-hd-key'),\n import('tweetnacl'),\n ]);\n\n // Use @scure/bip39 for seed generation (browser compatible)\n const seedBytes = mnemonicToSeedSync(seed);\n\n // Use SLIP-0010 derivation for ed25519 with TON's coin type\n const derived = ed25519.derivePath(DERIVATION_PATHS.ton, Buffer.from(seedBytes).toString('hex'));\n\n // Create keypair\n const keypair = nacl.sign.keyPair.fromSeed(new Uint8Array(derived.key));\n\n // TON address is derived from public key using workchain + hash\n // Standard TON wallet v4r2 uses the public key to derive address\n const publicKey = keypair.publicKey;\n\n // Create TON bounceable address (EQ prefix for workchain 0)\n // Format: 1 byte flags + 1 byte workchain + 32 bytes hash + 2 bytes CRC16\n const workchain = 0;\n const flags = 0x11; // bounceable\n\n // For raw address, we use SHA256 of public key using @noble/hashes\n const hash = sha256(publicKey);\n\n // Build address bytes: flags + workchain + hash\n const addressData = new Uint8Array(34);\n addressData[0] = flags;\n addressData[1] = workchain;\n addressData.set(hash, 2);\n\n // Calculate CRC16\n const crc = crc16(addressData);\n\n // Full address with CRC\n const fullAddress = new Uint8Array(36);\n fullAddress.set(addressData);\n fullAddress[34] = (crc >> 8) & 0xff;\n fullAddress[35] = crc & 0xff;\n\n // Convert to base64url (TON standard format)\n const base64 = btoa(String.fromCharCode(...fullAddress))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_');\n\n return base64;\n } catch (error) {\n console.error('TON address derivation failed:', error);\n throw error;\n }\n}\n\n/**\n * CRC16-CCITT for TON addresses\n */\nfunction crc16(data: Uint8Array): number {\n let crc = 0;\n for (const byte of data) {\n crc ^= byte << 8;\n for (let i = 0; i < 8; i++) {\n crc = (crc & 0x8000) ? ((crc << 1) ^ 0x1021) : (crc << 1);\n crc &= 0xffff;\n }\n }\n return crc;\n}\n\n/**\n * Derive TRON address from seed phrase\n * TRON uses secp256k1 like Ethereum but with base58check encoding\n * Uses @scure/base for browser compatibility\n */\nexport function deriveTronAddress(seed: string): string {\n try {\n // Derive using TRON's BIP-44 path\n const hdNode = HDNodeWallet.fromPhrase(seed, undefined, DERIVATION_PATHS.tron);\n\n // Get the Ethereum-style address (last 20 bytes of keccak256 of public key)\n // TRON uses same derivation but different encoding\n const ethAddressHex = hdNode.address.slice(2).toLowerCase();\n\n // TRON address: 0x41 prefix + 20 bytes address\n const addressBytes = new Uint8Array(21);\n addressBytes[0] = 0x41; // TRON mainnet prefix\n\n // Copy ETH address bytes\n for (let i = 0; i < 20; i++) {\n addressBytes[i + 1] = parseInt(ethAddressHex.slice(i * 2, i * 2 + 2), 16);\n }\n\n // Base58check encode using @scure/base (uses double SHA256 for checksum)\n const tronBase58check = base58check(sha256);\n return tronBase58check.encode(addressBytes);\n } catch (error) {\n console.error('TRON address derivation failed:', error);\n throw error;\n }\n}\n\n/**\n * Derive Spark address from seed phrase\n * Spark uses its own derivation path and bech32 format\n * Uses @scure libraries for browser compatibility\n */\nexport function deriveSparkAddress(\n seed: string,\n network: 'mainnet' | 'testnet' = 'testnet'\n): string {\n try {\n // Convert mnemonic to seed using @scure/bip39\n const seedBytes = mnemonicToSeedSync(seed);\n\n // Derive HD key using @scure/bip32\n const hdKey = HDKey.fromMasterSeed(seedBytes);\n const child = hdKey.derive(DERIVATION_PATHS.spark);\n\n if (!child.publicKey) {\n throw new Error('Failed to derive public key');\n }\n\n // Create P2WPKH-style address (same as Bitcoin but with Spark HRP)\n // 1. Hash160 = RIPEMD160(SHA256(publicKey))\n const pubKeyHash = ripemd160(sha256(child.publicKey));\n\n // 2. Create witness program with version 0\n const witnessVersion = 0;\n const words = bech32.toWords(pubKeyHash);\n words.unshift(witnessVersion);\n\n // 3. Encode with bech32 using Spark's HRP\n // Note: Spark uses 'sp' for mainnet and 'tsp' for testnet\n const hrp = network === 'testnet' ? 'tsp' : 'sp';\n const address = bech32.encode(hrp, words);\n\n return address;\n } catch (error) {\n console.error('Spark address derivation failed:', error);\n throw error;\n }\n}\n\n/**\n * Derive addresses for all supported chains\n */\nexport async function deriveAllAddresses(\n seed: string,\n network: 'mainnet' | 'testnet' = 'testnet'\n): Promise<BrowserMultiChainAddresses> {\n const addresses: BrowserMultiChainAddresses = {\n ethereum: null,\n bitcoin: null,\n ton: null,\n tron: null,\n solana: null,\n spark: null,\n };\n\n // Derive synchronous chains first (Ethereum, Bitcoin, Spark, TRON)\n try {\n addresses.ethereum = deriveEthereumAddress(seed);\n } catch (e) {\n console.error('ETH derivation failed:', e);\n }\n\n try {\n addresses.bitcoin = deriveBitcoinAddress(seed, network);\n } catch (e) {\n console.error('BTC derivation failed:', e);\n }\n\n try {\n addresses.spark = deriveSparkAddress(seed, network);\n } catch (e) {\n console.error('Spark derivation failed:', e);\n }\n\n try {\n addresses.tron = deriveTronAddress(seed);\n } catch (e) {\n console.error('TRON derivation failed:', e);\n }\n\n // Derive async chains in parallel (Solana, TON use ed25519 which requires async imports)\n const [solResult, tonResult] = await Promise.allSettled([\n deriveSolanaAddress(seed),\n deriveTonAddress(seed),\n ]);\n\n if (solResult.status === 'fulfilled') {\n addresses.solana = solResult.value;\n } else {\n console.error('SOL derivation failed:', solResult.reason);\n }\n\n if (tonResult.status === 'fulfilled') {\n addresses.ton = tonResult.value;\n } else {\n console.error('TON derivation failed:', tonResult.reason);\n }\n\n return addresses;\n}\n\n/**\n * Validate a BIP-39 seed phrase using @scure/bip39\n */\nexport function isValidSeed(seed: string): boolean {\n return validateMnemonic(seed, wordlist);\n}\n\n/**\n * Generate a random BIP-39 seed phrase using @scure/bip39\n */\nexport function generateSeedPhrase(): string {\n return generateMnemonic(wordlist);\n}\n","/**\n * Zubari WDK Service - Unified Multi-Chain Wallet Service\n *\n * This service provides a unified interface for multi-chain wallet operations\n * that works in both browser and Node.js environments.\n *\n * Strategy:\n * - Browser: Uses WdkApiClient to call the backend API (which has Tether WDK)\n * - Node.js: Uses WdkService natively (with Tether WDK modules)\n *\n * The Tether WDK (@tetherto/wdk-*) only works in Node.js environments due to\n * native dependencies (Electrum client, gRPC, etc.). For browser environments,\n * we route all operations through the backend API.\n *\n * @see https://docs.wallet.tether.io/\n */\n\nimport { WdkApiClient, getWdkApiClient } from './WdkApiClient';\nimport * as BrowserDerivation from './BrowserAddressDerivation';\nimport type { NetworkType } from '../types';\n\n// Default API URL for the Zubari backend with Tether WDK\nconst DEFAULT_API_URL = 'https://ckgwifsxka.us-east-2.awsapprunner.com';\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 ChainBalance {\n chain: SupportedChain;\n address: string;\n balance: string;\n symbol: string;\n}\n\nexport interface FeeRates {\n slow: string;\n normal: string;\n fast: string;\n}\n\nexport interface TransactionResult {\n success: boolean;\n txHash?: string;\n from?: string;\n to?: string;\n amount?: string;\n chain?: string;\n network?: string;\n error?: string;\n}\n\nexport interface ZubariWdkServiceConfig {\n /** Network to use (mainnet or testnet) */\n network: 'mainnet' | 'testnet';\n /** API URL for the Zubari backend (required for browser environments) */\n apiUrl?: string;\n /** Force using API even in Node.js (useful for testing) */\n forceApi?: boolean;\n /** Request timeout in milliseconds */\n timeout?: number;\n}\n\n/**\n * Check if we're running in a browser environment\n */\nfunction isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof window.document !== 'undefined';\n}\n\n/**\n * Dynamic import helper that bypasses bundler analysis\n * This ensures the import is truly runtime and not analyzed at build time\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 * Check if native WDK modules are available (Node.js only)\n */\nasync function canUseNativeWdk(): Promise<boolean> {\n // Never use native WDK in browser\n if (isBrowser()) {\n return false;\n }\n\n try {\n // Try to dynamically import WDK to check if it's available\n await dynamicImport('@tetherto/wdk');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * ZubariWdkService - Unified wallet service for browser and Node.js\n *\n * This service automatically routes operations to:\n * - API backend (browser) - using WdkApiClient\n * - Native WDK (Node.js) - using WdkService\n * - Browser derivation (fallback) - using BrowserAddressDerivation\n */\nexport class ZubariWdkService {\n private config: Required<ZubariWdkServiceConfig>;\n private apiClient: WdkApiClient;\n private nativeWdkService: unknown | null = null;\n private initialized = false;\n private useNativeWdk = false;\n\n constructor(config: Partial<ZubariWdkServiceConfig> = {}) {\n this.config = {\n network: config.network || 'testnet',\n apiUrl: config.apiUrl || process.env.NEXT_PUBLIC_API_URL || DEFAULT_API_URL,\n forceApi: config.forceApi ?? false,\n timeout: config.timeout || 30000,\n };\n\n this.apiClient = getWdkApiClient(this.config.apiUrl);\n }\n\n /**\n * Initialize the service and determine the best strategy\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // In browser or if forceApi is set, always use API\n if (isBrowser() || this.config.forceApi) {\n this.useNativeWdk = false;\n this.initialized = true;\n return;\n }\n\n // In Node.js, try to use native WDK\n if (await canUseNativeWdk()) {\n try {\n // Use dynamic import helper to bypass bundler analysis\n // This ensures WdkService is never included in browser bundles\n const WdkServiceModule = await dynamicImport('./WdkService');\n const WdkService = WdkServiceModule.WdkService || WdkServiceModule.default;\n this.nativeWdkService = new WdkService({\n network: this.config.network,\n });\n this.useNativeWdk = true;\n } catch (error) {\n console.warn('Failed to initialize native WDK, falling back to API:', error);\n this.useNativeWdk = false;\n }\n }\n\n this.initialized = true;\n }\n\n /**\n * Get the current execution mode\n */\n getMode(): 'api' | 'native' | 'browser-fallback' {\n if (this.useNativeWdk) return 'native';\n if (isBrowser()) return 'api';\n return 'api';\n }\n\n /**\n * Check if running in browser\n */\n isBrowserEnvironment(): boolean {\n return isBrowser();\n }\n\n /**\n * Generate a new BIP-39 seed phrase (12 words)\n */\n async generateSeed(): Promise<string> {\n await this.initialize();\n\n // Try API first (most reliable, uses real WDK)\n try {\n const response = await this.apiClient.generateSeed();\n if (response.success && response.seed) {\n return response.seed;\n }\n } catch (error) {\n console.warn('API seed generation failed:', error);\n }\n\n // Try native WDK\n if (this.useNativeWdk && this.nativeWdkService) {\n try {\n const wdk = this.nativeWdkService as { generateSeedPhrase: () => Promise<string> };\n return await wdk.generateSeedPhrase();\n } catch (error) {\n console.warn('Native WDK seed generation failed:', error);\n }\n }\n\n // Fallback to browser-compatible generation\n return BrowserDerivation.generateSeedPhrase();\n }\n\n /**\n * Validate a BIP-39 seed phrase\n */\n async validateSeed(seed: string): Promise<boolean> {\n await this.initialize();\n\n // Try API first\n try {\n const response = await this.apiClient.validateSeed(seed);\n if (response.success) {\n return response.isValid ?? false;\n }\n } catch (error) {\n console.warn('API seed validation failed:', error);\n }\n\n // Try native WDK\n if (this.useNativeWdk && this.nativeWdkService) {\n try {\n const wdk = this.nativeWdkService as { isValidSeed: (seed: string) => Promise<boolean> };\n return await wdk.isValidSeed(seed);\n } catch (error) {\n console.warn('Native WDK seed validation failed:', error);\n }\n }\n\n // Fallback to browser-compatible validation\n return BrowserDerivation.isValidSeed(seed);\n }\n\n /**\n * Derive address for a specific chain using WDK API\n *\n * For Ethereum, falls back to local derivation if API fails.\n * For other chains, WDK API is required - no placeholder fallback.\n */\n async deriveAddress(seed: string, chain: SupportedChain): Promise<ChainAddress> {\n await this.initialize();\n\n const path = this.getDerivationPath(chain);\n\n // Try API first (uses real WDK on backend)\n try {\n const response = await this.apiClient.deriveAddress(seed, chain as NetworkType, this.config.network);\n if (response.success && response.address) {\n return {\n chain,\n address: response.address,\n path: response.path || path,\n };\n }\n } catch (error) {\n console.warn(`API address derivation failed for ${chain}:`, error);\n\n // For Ethereum only, fall back to local derivation\n if (chain === 'ethereum') {\n return this.deriveBrowserAddress(seed, chain);\n }\n }\n\n // Try native WDK (Node.js only)\n if (this.useNativeWdk && this.nativeWdkService) {\n try {\n const wdk = this.nativeWdkService as {\n initialize: (seed: string) => Promise<void>;\n deriveAddress: (chain: SupportedChain) => Promise<ChainAddress>;\n };\n await wdk.initialize(seed);\n return await wdk.deriveAddress(chain);\n } catch (error) {\n console.warn(`Native WDK address derivation failed for ${chain}:`, error);\n }\n }\n\n // For Ethereum, we can use browser derivation as final fallback\n if (chain === 'ethereum') {\n return this.deriveBrowserAddress(seed, chain);\n }\n\n // For other chains, throw error - no placeholder addresses\n throw new Error(\n `WDK API required for ${chain} address derivation. Ensure the backend is running.`\n );\n }\n\n /**\n * Derive addresses for all supported chains using WDK API\n *\n * Uses the backend WDK API for real cryptographically valid addresses.\n * No placeholder fallback - WDK API is required for multi-chain addresses.\n */\n async deriveAllAddresses(seed: string): Promise<MultiChainAddresses> {\n await this.initialize();\n\n // Try API first (uses real WDK on backend)\n try {\n const response = await this.apiClient.deriveAllAddresses(seed, this.config.network);\n if (response.success && response.addresses) {\n // Extract address strings from response - API may return objects or strings\n const extractAddress = (value: unknown): string | null => {\n if (!value) return null;\n if (typeof value === 'string') return value;\n if (typeof value === 'object' && value !== null && 'address' in value) {\n return (value as { address: string }).address;\n }\n return null;\n };\n\n return {\n ethereum: extractAddress(response.addresses.ethereum),\n bitcoin: extractAddress(response.addresses.bitcoin),\n ton: extractAddress(response.addresses.ton),\n tron: extractAddress(response.addresses.tron),\n solana: extractAddress(response.addresses.solana),\n spark: extractAddress(response.addresses.spark),\n };\n }\n } catch (error) {\n console.warn('API address derivation failed:', error);\n }\n\n // Try native WDK (Node.js only)\n if (this.useNativeWdk && this.nativeWdkService) {\n try {\n const wdk = this.nativeWdkService as {\n initialize: (seed: string) => Promise<void>;\n deriveAllAddresses: () => Promise<MultiChainAddresses>;\n };\n await wdk.initialize(seed);\n return await wdk.deriveAllAddresses();\n } catch (error) {\n console.warn('Native WDK multi-chain derivation failed:', error);\n }\n }\n\n // No fallback - Tether WDK is required for multi-chain address derivation\n throw new Error(\n 'Tether WDK API required for multi-chain address derivation. Service temporarily unavailable.'\n );\n }\n\n /**\n * Get balances for all chains\n */\n async getAllBalances(seed: string): Promise<Record<string, ChainBalance | null>> {\n await this.initialize();\n\n // This always uses API as it requires blockchain RPC calls\n try {\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/balances`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ seed, network: this.config.network }),\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.success) {\n return data.balances;\n }\n }\n } catch (error) {\n console.warn('Failed to fetch balances:', error);\n }\n\n return {};\n }\n\n /**\n * Get fee rates for a chain\n */\n async getFeeRates(seed: string, chain: SupportedChain): Promise<FeeRates> {\n await this.initialize();\n\n try {\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/fee-rates`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ seed, chain, network: this.config.network }),\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.feeRates) {\n return data.feeRates;\n }\n }\n } catch (error) {\n console.warn(`Failed to fetch fee rates for ${chain}:`, error);\n }\n\n return { slow: '0', normal: '0', fast: '0' };\n }\n\n /**\n * Estimate transaction fee\n */\n async estimateFee(\n seed: string,\n chain: SupportedChain,\n to: string,\n amount: string\n ): Promise<{ fee: string; symbol: string }> {\n await this.initialize();\n\n try {\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/estimate-fee`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ seed, chain, to, amount, network: this.config.network }),\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.success) {\n return { fee: data.fee, symbol: data.symbol };\n }\n }\n } catch (error) {\n console.warn(`Failed to estimate fee for ${chain}:`, error);\n }\n\n return { fee: '0', symbol: this.getChainSymbol(chain) };\n }\n\n /**\n * Send a transaction\n */\n async sendTransaction(\n seed: string,\n chain: SupportedChain,\n to: string,\n amount: string\n ): Promise<TransactionResult> {\n await this.initialize();\n\n try {\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/send`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ seed, chain, to, amount, network: this.config.network }),\n });\n\n if (response.ok) {\n const data = await response.json();\n\n // Extract transaction hash from various possible properties\n let txHash = data.txHash || data.transactionHash || data.hash;\n\n // Handle case where txHash might be an object\n if (txHash && typeof txHash === 'object' && 'hash' in txHash) {\n txHash = txHash.hash;\n }\n\n // Validate Ethereum tx hash format (should be 66 chars: 0x + 64 hex)\n if (chain === 'ethereum' && txHash && (typeof txHash !== 'string' || !txHash.startsWith('0x') || txHash.length !== 66)) {\n console.warn(`Invalid Ethereum tx hash format: ${txHash} (length: ${txHash?.length}, expected: 66)`);\n }\n\n return {\n success: data.success,\n txHash,\n from: data.from,\n to: data.to,\n amount: data.amount,\n chain: data.chain,\n network: data.network,\n };\n }\n\n const errorData = await response.json().catch(() => ({}));\n return {\n success: false,\n error: errorData.error || `HTTP ${response.status}`,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Transaction failed',\n };\n }\n }\n\n /**\n * Get the network configuration\n */\n getNetwork(): 'mainnet' | 'testnet' {\n return this.config.network;\n }\n\n /**\n * Get API URL\n */\n getApiUrl(): string {\n return this.config.apiUrl;\n }\n\n // ==========================================\n // Private Helper Methods\n // ==========================================\n\n private getDerivationPath(chain: SupportedChain): string {\n const paths: Record<SupportedChain, string> = {\n bitcoin: this.config.network === 'testnet' ? \"m/84'/1'/0'/0/0\" : \"m/84'/0'/0'/0/0\",\n ethereum: \"m/44'/60'/0'/0/0\",\n ton: \"m/44'/607'/0'/0'/0'\",\n tron: \"m/44'/195'/0'/0/0\",\n solana: \"m/44'/501'/0'/0'\",\n spark: \"m/44'/998'/0'/0/0\",\n };\n return paths[chain];\n }\n\n private getChainSymbol(chain: SupportedChain): string {\n const symbols: Record<SupportedChain, string> = {\n ethereum: 'ETH',\n bitcoin: 'BTC',\n ton: 'TON',\n tron: 'TRX',\n solana: 'SOL',\n spark: 'SAT',\n };\n return symbols[chain];\n }\n\n /**\n * Derive address using browser-compatible libraries\n */\n private async deriveBrowserAddress(seed: string, chain: SupportedChain): Promise<ChainAddress> {\n const path = this.getDerivationPath(chain);\n\n try {\n let address: string;\n\n switch (chain) {\n case 'ethereum':\n address = BrowserDerivation.deriveEthereumAddress(seed);\n break;\n case 'bitcoin':\n address = BrowserDerivation.deriveBitcoinAddress(seed, this.config.network);\n break;\n case 'tron':\n address = BrowserDerivation.deriveTronAddress(seed);\n break;\n case 'spark':\n address = BrowserDerivation.deriveSparkAddress(seed, this.config.network);\n break;\n case 'solana':\n address = await BrowserDerivation.deriveSolanaAddress(seed);\n break;\n case 'ton':\n address = await BrowserDerivation.deriveTonAddress(seed);\n break;\n default:\n throw new Error(`Unsupported chain: ${chain}`);\n }\n\n return { chain, address, path };\n } catch (error) {\n console.error(`Browser derivation failed for ${chain}:`, error);\n throw error;\n }\n }\n\n /**\n * Derive all addresses using browser-compatible libraries\n */\n private async deriveAllBrowserAddresses(seed: string): Promise<MultiChainAddresses> {\n return BrowserDerivation.deriveAllAddresses(seed, this.config.network);\n }\n}\n\n// ==========================================\n// Factory Functions\n// ==========================================\n\nlet defaultService: ZubariWdkService | null = null;\n\n/**\n * Get or create the default ZubariWdkService instance\n */\nexport function getZubariWdkService(config?: Partial<ZubariWdkServiceConfig>): ZubariWdkService {\n if (!defaultService || (config && config.network !== defaultService.getNetwork())) {\n defaultService = new ZubariWdkService(config);\n }\n return defaultService;\n}\n\n/**\n * Create a new ZubariWdkService instance\n */\nexport function createZubariWdkService(config?: Partial<ZubariWdkServiceConfig>): ZubariWdkService {\n return new ZubariWdkService(config);\n}\n\n/**\n * Check if the current environment is a browser\n */\nexport { isBrowser };\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 { ZubariWdkService, getZubariWdkService } from '../services/ZubariWdkService';\nimport * as BrowserDerivation from '../services/BrowserAddressDerivation';\n\n/**\n * CoinGecko IDs for each supported chain\n */\nconst COINGECKO_IDS: Record<NetworkType, string> = {\n ethereum: 'ethereum',\n bitcoin: 'bitcoin',\n ton: 'the-open-network',\n tron: 'tron',\n solana: 'solana',\n spark: 'bitcoin', // Spark uses BTC\n};\n\n/**\n * Price cache to avoid excessive API calls\n */\ninterface PriceCache {\n prices: Record<string, number>;\n timestamp: number;\n}\n\nlet priceCache: PriceCache | null = null;\nconst PRICE_CACHE_TTL = 60000; // 1 minute cache\n\n/**\n * Fetch USD prices for all supported chains from CoinGecko\n */\nasync function fetchPrices(): Promise<Record<string, number>> {\n // Check cache\n if (priceCache && Date.now() - priceCache.timestamp < PRICE_CACHE_TTL) {\n return priceCache.prices;\n }\n\n const ids = Object.values(COINGECKO_IDS).filter((v, i, a) => a.indexOf(v) === i).join(',');\n\n try {\n const response = await fetch(\n `https://api.coingecko.com/api/v3/simple/price?ids=${ids}&vs_currencies=usd`,\n {\n headers: { 'Accept': 'application/json' },\n }\n );\n\n if (response.ok) {\n const data = await response.json();\n const prices: Record<string, number> = {};\n\n for (const [chain, geckoId] of Object.entries(COINGECKO_IDS)) {\n prices[chain] = data[geckoId]?.usd || 0;\n }\n\n // Update cache\n priceCache = { prices, timestamp: Date.now() };\n return prices;\n }\n } catch (error) {\n console.warn('Failed to fetch prices from CoinGecko:', error);\n }\n\n // Return cached prices if available, otherwise empty\n return priceCache?.prices || {};\n}\n\n/**\n * Get USD price for a specific chain\n */\nasync function getPriceForChain(chain: NetworkType): Promise<number> {\n const prices = await fetchPrices();\n return prices[chain] || 0;\n}\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 DERIVED_ADDRESSES: 'derived_addresses',\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: ZubariWdkService;\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 || 'https://ckgwifsxka.us-east-2.awsapprunner.com',\n };\n this.storage = this.config.storage;\n\n // Initialize unified WDK service (works in browser and Node.js)\n this.wdkService = getZubariWdkService({\n network: this.config.network,\n apiUrl: this.config.apiUrl,\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 Tether WDK (via API in browser)\n * This is the recommended method for generating seed phrases\n */\n async generateSeedWithWdk(): Promise<string> {\n return await this.wdkService.generateSeed();\n }\n\n /**\n * Validate seed phrase using WDK (async, more accurate)\n */\n async validateSeedWithWdk(seed: string): Promise<boolean> {\n return await this.wdkService.validateSeed(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 // 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 await this.storage.removeItem(STORAGE_KEYS.DERIVED_ADDRESSES);\n this.currentSeed = null;\n this.derivedAddress = null;\n this.derivedAddresses = {};\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 * Uses the unified WDK service which:\n * - In browser: Calls the backend API (which has Tether WDK)\n * - In Node.js: Uses native WDK\n *\n * No fallback to placeholder addresses - WDK API is required for real addresses.\n */\n static async deriveAddressForChainAsync(\n seed: string,\n chain: NetworkType,\n network: 'mainnet' | 'testnet' = 'testnet',\n apiUrl?: string\n ): Promise<string> {\n // For Ethereum, we can derive locally as fallback\n if (chain === 'ethereum') {\n try {\n const wdkService = getZubariWdkService({ network, apiUrl });\n const result = await wdkService.deriveAddress(seed, chain);\n return result.address;\n } catch (error) {\n console.warn('WDK service failed for Ethereum, using local derivation:', error);\n return WalletManager.deriveAddressForChain(seed, 'ethereum');\n }\n }\n\n // For all other chains, WDK API is required\n const wdkService = getZubariWdkService({ network, apiUrl });\n const result = await wdkService.deriveAddress(seed, chain as 'bitcoin' | 'ton' | 'tron' | 'solana' | 'spark');\n return result.address;\n }\n\n /**\n * Derive address for a specific chain (sync version)\n * Only supports Ethereum - for other chains use deriveAddressForChainAsync with WDK API\n *\n * @throws Error for non-Ethereum chains - use WDK API instead\n */\n static deriveAddressForChain(seed: string, chain: NetworkType): string {\n if (chain === 'ethereum') {\n const ethPath = DERIVATION_PATHS['ethereum'];\n const ethNode = HDNodeWallet.fromPhrase(seed, undefined, `${ethPath}/0`);\n return ethNode.address;\n }\n\n // For non-Ethereum chains, throw error - must use WDK API\n throw new Error(\n `Sync derivation not supported for ${chain}. Use deriveAddressForChainAsync() with WDK API.`\n );\n }\n\n /**\n * Derive addresses for all enabled chains (sync version)\n * Only derives Ethereum address synchronously - use deriveAllAddressesAsync for all chains\n */\n deriveAllAddresses(): Partial<MultiChainAddresses> {\n if (!this.currentSeed) {\n throw new Error('Wallet is locked');\n }\n\n // Only derive Ethereum synchronously - other chains require WDK API\n const addresses: Partial<MultiChainAddresses> = {\n ethereum: WalletManager.deriveAddressForChain(this.currentSeed, 'ethereum'),\n };\n\n this.derivedAddresses = addresses;\n return addresses;\n }\n\n /**\n * Derive addresses for all enabled chains using Tether WDK\n * In browser: Uses the backend API (which has Tether WDK)\n * In Node.js: Uses native WDK directly\n * Returns REAL cryptographically valid addresses for all chains.\n * Addresses are persisted to storage for future use.\n */\n async deriveAllAddressesWithWdk(): Promise<Partial<MultiChainAddresses>> {\n if (!this.currentSeed) {\n throw new Error('Wallet is locked');\n }\n\n try {\n // Use the unified WDK service (handles browser/Node.js automatically)\n const wdkAddresses = await this.wdkService.deriveAllAddresses(this.currentSeed);\n\n // Filter to only enabled chains\n const enabledChainsSet = new Set(this.config.enabledChains);\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\n // Persist addresses to storage for future use\n await this.saveAddressesToStorage(addresses);\n\n return addresses;\n } catch (error) {\n console.error('WDK derivation failed:', error);\n throw error;\n }\n }\n\n /**\n * Save derived addresses to storage\n */\n private async saveAddressesToStorage(addresses: Partial<MultiChainAddresses>): Promise<void> {\n try {\n await this.storage.setItem(STORAGE_KEYS.DERIVED_ADDRESSES, JSON.stringify(addresses));\n console.log('Saved derived addresses to storage:', Object.keys(addresses));\n } catch (error) {\n console.warn('Failed to save addresses to storage:', error);\n }\n }\n\n /**\n * Normalize an address value - extract string from object format if needed\n * Handles both string addresses and object format {chain, address, path}\n */\n private normalizeAddress(value: unknown): string | null {\n if (typeof value === 'string') {\n return value;\n }\n if (value && typeof value === 'object' && 'address' in value) {\n const addr = (value as { address: unknown }).address;\n return typeof addr === 'string' ? addr : null;\n }\n return null;\n }\n\n /**\n * Normalize all addresses in an object - extract strings from object format\n */\n private normalizeAddresses(addresses: Record<string, unknown>): Partial<MultiChainAddresses> {\n const normalized: Partial<MultiChainAddresses> = {};\n for (const [chain, value] of Object.entries(addresses)) {\n const addr = this.normalizeAddress(value);\n if (addr) {\n normalized[chain as NetworkType] = addr;\n }\n }\n return normalized;\n }\n\n /**\n * Load derived addresses from storage\n */\n private async loadAddressesFromStorage(): Promise<Partial<MultiChainAddresses> | null> {\n try {\n const stored = await this.storage.getItem(STORAGE_KEYS.DERIVED_ADDRESSES);\n if (stored) {\n const rawAddresses = JSON.parse(stored) as Record<string, unknown>;\n console.log('[WalletManager] Raw addresses from storage:', rawAddresses);\n // Normalize addresses - they might be objects {chain, address, path} or strings\n const addresses = this.normalizeAddresses(rawAddresses);\n console.log('[WalletManager] Normalized addresses:', addresses);\n\n // Save normalized addresses back to storage to fix corrupted data\n await this.saveAddressesToStorage(addresses);\n\n return addresses;\n }\n } catch (error) {\n console.warn('Failed to load addresses from storage:', error);\n }\n return null;\n }\n\n /**\n * Derive addresses for all enabled chains using Tether WDK\n *\n * Uses the WDK API backend for real cryptographically valid addresses.\n * First tries to load from storage to avoid losing previously derived addresses.\n *\n * @throws Error if WDK API is unavailable and no cached addresses exist\n */\n async deriveAllAddressesAsync(): Promise<Partial<MultiChainAddresses>> {\n if (!this.currentSeed) {\n throw new Error('Wallet is locked');\n }\n\n // First, try to load addresses from storage\n // This preserves real WDK-derived addresses even if WDK service is temporarily unavailable\n const storedAddresses = await this.loadAddressesFromStorage();\n if (storedAddresses && Object.keys(storedAddresses).length > 1) {\n // Verify the stored Ethereum address matches the current seed\n const expectedEthAddress = WalletManager.deriveAddress(this.currentSeed);\n if (storedAddresses.ethereum === expectedEthAddress) {\n console.log('Using addresses from storage (verified by Ethereum address)');\n this.derivedAddresses = storedAddresses;\n return storedAddresses;\n } else {\n console.log('Stored addresses do not match current seed, re-deriving...');\n }\n }\n\n // Use WDK API to derive all addresses - no placeholder fallback\n return await this.deriveAllAddressesWithWdk();\n }\n\n /**\n * Get address for a specific chain\n * Returns cached address or null - use deriveAllAddressesAsync to derive addresses\n */\n getAddressForChain(chain: NetworkType): string | null {\n // Return cached address if available (normalize in case it's an object)\n const cachedValue = this.derivedAddresses[chain];\n if (cachedValue) {\n console.log(`[WalletManager] getAddressForChain(${chain}) cached value:`, cachedValue, 'type:', typeof cachedValue);\n const addr = this.normalizeAddress(cachedValue);\n console.log(`[WalletManager] getAddressForChain(${chain}) normalized:`, addr);\n if (addr) {\n // Update cache with normalized string\n (this.derivedAddresses as Record<string, string>)[chain] = addr;\n return addr;\n }\n }\n\n // For Ethereum, we can derive synchronously if unlocked\n if (chain === 'ethereum' && this.currentSeed) {\n this.derivedAddresses[chain] = WalletManager.deriveAddressForChain(this.currentSeed, chain);\n return this.derivedAddresses[chain];\n }\n\n // For other chains, return null - must use deriveAllAddressesAsync first\n return null;\n }\n\n /**\n * Get all derived addresses\n */\n getAllAddresses(): Partial<MultiChainAddresses> {\n // Normalize all addresses before returning\n return this.normalizeAddresses(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 console.log(`[WalletManager] Fetching ${chain} balance for ${address} using RPC: ${this.config.rpcUrl}`);\n\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 console.log(`[WalletManager] ${chain} balance fetched: ${balance} (raw: ${rawBalance})`);\n } catch (error) {\n console.error(`[WalletManager] Failed to fetch ${chain} balance from ${this.config.rpcUrl}:`, error);\n // Balance remains '0' on error\n }\n } else if (chain === 'bitcoin') {\n // Bitcoin: Use mempool.space API (more reliable, supports multiple testnets)\n // For testnet addresses, try both testnet3 and testnet4 since they use the same prefix\n const isMainnet = this.config.network === 'mainnet' || address.startsWith('bc1') || address.startsWith('1') || address.startsWith('3');\n\n // List of APIs to try (in order)\n const apisToTry: string[] = isMainnet\n ? ['https://mempool.space/api']\n : [\n 'https://mempool.space/testnet/api', // testnet3 first (more common)\n 'https://mempool.space/testnet4/api', // then testnet4\n ];\n\n for (const apiUrl of apisToTry) {\n try {\n const response = await fetch(`${apiUrl}/address/${address}`, {\n headers: { 'Accept': 'application/json' },\n });\n\n if (response.ok) {\n const data = await response.json();\n\n // Check if this address has any transactions on this network\n const txCount = (data.chain_stats?.tx_count || 0) + (data.mempool_stats?.tx_count || 0);\n\n if (txCount > 0 || isMainnet) {\n // Found transactions or mainnet - use this data\n const chainFunded = data.chain_stats?.funded_txo_sum || 0;\n const chainSpent = data.chain_stats?.spent_txo_sum || 0;\n const mempoolFunded = data.mempool_stats?.funded_txo_sum || 0;\n const mempoolSpent = data.mempool_stats?.spent_txo_sum || 0;\n\n // Total balance in satoshis\n const satoshis = (chainFunded - chainSpent) + (mempoolFunded - mempoolSpent);\n // Convert to BTC (1 BTC = 100,000,000 satoshis)\n balance = (satoshis / 100_000_000).toFixed(8);\n console.log(`Bitcoin balance for ${address}: ${balance} BTC (${satoshis} sats) via ${apiUrl}`);\n break; // Found balance, stop trying other APIs\n }\n // No transactions found, try next API\n console.log(`No transactions found on ${apiUrl}, trying next...`);\n }\n } catch (error) {\n console.warn(`Failed to fetch from ${apiUrl}:`, error);\n // Continue to next API\n }\n }\n } else if (chain === 'solana') {\n // Solana: Use public RPC API\n const rpcUrl = this.config.network === 'mainnet'\n ? 'https://api.mainnet-beta.solana.com'\n : 'https://api.devnet.solana.com';\n\n try {\n const response = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getBalance',\n params: [address],\n }),\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.result?.value !== undefined) {\n // Convert lamports to SOL (1 SOL = 1,000,000,000 lamports)\n balance = (data.result.value / 1_000_000_000).toFixed(9);\n }\n }\n } catch (error) {\n console.warn(`Failed to fetch ${chain} balance:`, error);\n }\n } else if (chain === 'tron') {\n // TRON: Use TronGrid API\n const baseUrl = this.config.network === 'mainnet'\n ? 'https://api.trongrid.io'\n : 'https://api.shasta.trongrid.io';\n\n try {\n const response = await fetch(`${baseUrl}/v1/accounts/${address}`, {\n headers: { 'Accept': 'application/json' },\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.data?.[0]?.balance !== undefined) {\n // Balance is in SUN (1 TRX = 1,000,000 SUN)\n balance = (data.data[0].balance / 1_000_000).toFixed(6);\n }\n }\n } catch (error) {\n console.warn(`Failed to fetch ${chain} balance:`, error);\n }\n } else if (chain === 'ton') {\n // TON: Use toncenter API\n const baseUrl = this.config.network === 'mainnet'\n ? 'https://toncenter.com/api/v2'\n : 'https://testnet.toncenter.com/api/v2';\n\n try {\n const response = await fetch(`${baseUrl}/getAddressBalance?address=${address}`, {\n headers: { 'Accept': 'application/json' },\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.ok && data.result !== undefined) {\n // Balance is in nanotons (1 TON = 1,000,000,000 nanotons)\n const nanotons = BigInt(data.result);\n balance = (Number(nanotons) / 1_000_000_000).toFixed(9);\n console.log(`TON balance for ${address}: ${balance} TON`);\n }\n }\n } catch (error) {\n console.warn(`Failed to fetch ${chain} balance:`, error);\n }\n } else if (chain === 'spark') {\n // Spark (Lightning): Balance fetching via Spark SDK\n // Note: Spark operates on Lightning Network with channels\n // For now, we try to get balance via the API if available\n try {\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/balance`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n chain: 'spark',\n address,\n network: this.config.network,\n }),\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.balance !== undefined) {\n // Balance in satoshis, convert to BTC\n balance = (parseFloat(data.balance) / 100_000_000).toFixed(8);\n console.log(`Spark balance for ${address}: ${balance} BTC`);\n }\n }\n } catch (error) {\n console.warn(`Failed to fetch ${chain} balance:`, error);\n // Balance remains '0' on error\n }\n }\n\n // Fetch USD price for this chain\n const priceUsd = await getPriceForChain(chain);\n const balanceNum = parseFloat(balance) || 0;\n const balanceUsd = balanceNum * priceUsd;\n\n return {\n chain,\n symbol: networkConfig.nativeCurrency.symbol,\n balance,\n balanceUsd,\n address,\n decimals: networkConfig.nativeCurrency.decimals,\n };\n }\n\n /**\n * Fetch balances for all enabled chains\n */\n async fetchAllBalances(): Promise<ChainBalance[]> {\n const balances: ChainBalance[] = [];\n\n for (const chain of this.config.enabledChains) {\n try {\n const balance = await this.fetchBalanceForChain(chain);\n balances.push(balance);\n } catch (error) {\n console.error(`Failed to fetch balance for ${chain}:`, error);\n // Add placeholder balance on error\n const networkConfig = this.getChainConfig(chain);\n balances.push({\n chain,\n symbol: networkConfig.nativeCurrency.symbol,\n balance: '0',\n balanceUsd: 0,\n address: this.getAddressForChain(chain) || '',\n decimals: networkConfig.nativeCurrency.decimals,\n });\n }\n }\n\n return balances;\n }\n\n /**\n * Get extended wallet state with multi-chain info\n */\n getExtendedState(): WalletState {\n return {\n isInitialized: this.derivedAddress !== null,\n isLocked: this.currentSeed === null && this.derivedAddress !== null,\n address: this.derivedAddress,\n balance: null,\n addresses: this.derivedAddresses,\n selectedChain: this.selectedChain,\n };\n }\n\n /**\n * Send a transaction using Tether WDK\n * Supports native tokens and USDT on all chains\n *\n * @param chain - Target blockchain (ethereum, bitcoin, ton, tron, solana, spark)\n * @param to - Recipient address\n * @param amount - Amount to send (in human-readable format)\n * @param token - Optional token symbol (e.g., 'USDT' for stablecoins)\n * @returns Transaction result with hash and status\n */\n async sendTransaction(\n chain: NetworkType,\n to: string,\n amount: string,\n token?: string\n ): Promise<{\n success: boolean;\n txHash?: string;\n from?: string;\n to?: string;\n amount?: string;\n chain?: NetworkType;\n error?: string;\n }> {\n if (!this.currentSeed) {\n return { success: false, error: 'Wallet is locked' };\n }\n\n const fromAddress = this.getAddressForChain(chain);\n if (!fromAddress) {\n return { success: false, error: `No address for chain ${chain}` };\n }\n\n try {\n // Use WDK service to send transaction via backend\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/send`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n seed: this.currentSeed,\n chain,\n to,\n amount,\n token,\n network: this.config.network,\n }),\n });\n\n if (response.ok) {\n const data = await response.json();\n console.log(`Transaction sent on ${chain}:`, data);\n\n // Extract and validate transaction hash\n let txHash = data.txHash || data.transactionHash || data.hash;\n\n // Handle case where txHash might be an object\n if (txHash && typeof txHash === 'object' && 'hash' in txHash) {\n txHash = txHash.hash;\n }\n\n // Validate Ethereum tx hash format (should be 66 chars: 0x + 64 hex)\n if (chain === 'ethereum' && txHash && (typeof txHash !== 'string' || !txHash.startsWith('0x') || txHash.length !== 66)) {\n console.warn(`Invalid Ethereum tx hash format: ${txHash} (length: ${txHash?.length}, expected: 66)`);\n }\n\n return {\n success: data.success,\n txHash,\n from: fromAddress,\n to,\n amount,\n chain,\n };\n }\n\n const errorData = await response.json().catch(() => ({}));\n return {\n success: false,\n error: errorData.error || `HTTP ${response.status}`,\n };\n } catch (error) {\n console.error(`Transaction failed on ${chain}:`, error);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Transaction failed',\n };\n }\n }\n\n /**\n * Estimate transaction fee using Tether WDK\n */\n async estimateFee(\n chain: NetworkType,\n to: string,\n amount: string,\n token?: string\n ): Promise<{\n success: boolean;\n fee?: string;\n feeUsd?: number;\n error?: string;\n }> {\n try {\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/estimate-fee`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n chain,\n to,\n amount,\n token,\n network: this.config.network,\n }),\n });\n\n if (response.ok) {\n const data = await response.json();\n return {\n success: true,\n fee: data.fee,\n feeUsd: data.feeUsd,\n };\n }\n\n return { success: false, error: 'Failed to estimate fee' };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Fee estimation failed',\n };\n }\n }\n}\n"]}
|