@zubari/sdk 0.5.2 → 0.5.3
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/index.js +227 -797
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +225 -795
- package/dist/index.mjs.map +1 -1
- package/dist/react/index.js +175 -745
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +173 -743
- package/dist/react/index.mjs.map +1 -1
- package/dist/services/index.js +113 -707
- package/dist/services/index.js.map +1 -1
- package/dist/services/index.mjs +111 -705
- package/dist/services/index.mjs.map +1 -1
- package/dist/wallet/index.js +176 -746
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/index.mjs +174 -744
- package/dist/wallet/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/config/networks.ts","../../src/services/WdkApiClient.ts","../../node_modules/@scure/base/index.ts","../../node_modules/@scure/bip32/index.ts","../../src/services/BrowserAddressDerivation.ts","../../src/services/ZubariWdkService.ts","../../src/security/KeyManager.ts","../../src/storage/SecureStorage.ts","../../src/wallet/WalletManager.ts","../../src/react/useWalletManager.ts"],"names":["chain","sha256","secp","base58check","ripemd160","createView","concatBytes","abytes","hmac","sha512","DERIVATION_PATHS","HDNodeWallet","mnemonicToSeedSync","validateMnemonic","wordlist","generateMnemonic","DEFAULT_API_URL","errorCode","Wallet","mainnet","sepolia","createPublicClient","http","viemFormatEther","wdkService","result","getAddress","useMemo","useState","useCallback","useEffect"],"mappings":"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","file":"index.js","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://ethereum-rpc.publicnode.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 tron: {\n name: 'TRON Nile Testnet',\n chainId: 3448148188,\n rpcUrl: 'https://nile.trongrid.io',\n explorerUrl: 'https://nile.tronscan.org',\n },\n ton: {\n name: 'TON Testnet',\n rpcUrl: 'https://testnet.toncenter.com/api/v2',\n explorerUrl: 'https://testnet.tonscan.org',\n },\n};\n\n// USDT token addresses per chain (mainnet / testnet)\nexport const USDT_ADDRESSES: Partial<Record<NetworkType, { mainnet: string; testnet: string }>> = {\n ethereum: {\n mainnet: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\n testnet: '0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0', // Sepolia\n },\n tron: {\n mainnet: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',\n testnet: 'TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf', // Nile testnet\n },\n solana: {\n mainnet: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB',\n testnet: '', // No official USDT on devnet\n },\n ton: {\n mainnet: 'EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs',\n testnet: 'kQD0GKBM8ZbryVk2aESmzfU6b9b_8era_IkvBSELujFZPsyy',\n },\n};\n\n// BIP-44 derivation paths\nexport const DERIVATION_PATHS: Record<NetworkType, string> = {\n bitcoin: \"m/44'/0'/0'/0\",\n ethereum: \"m/44'/60'/0'/0\",\n ton: \"m/44'/607'/0'/0\",\n tron: \"m/44'/195'/0'/0\",\n solana: \"m/44'/501'/0'/0\",\n spark: \"m/44'/998'/0'/0\",\n};\n\nexport function getNetworkConfig(\n network: NetworkType,\n isTestnet: boolean = false\n): NetworkConfig {\n const mainnetConfig = NETWORKS[network];\n if (!isTestnet) return mainnetConfig;\n\n const testnetOverrides = TESTNET_NETWORKS[network];\n if (!testnetOverrides) return mainnetConfig;\n\n return {\n ...mainnetConfig,\n ...testnetOverrides,\n };\n}\n","/**\n * 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' = 'mainnet'\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' = 'mainnet'\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' = 'mainnet'\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' = 'mainnet',\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' = 'mainnet'\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","/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\nexport interface Coder<F, T> {\n encode(from: F): T;\n decode(to: T): F;\n}\n\nexport interface BytesCoder extends Coder<Uint8Array, string> {\n encode: (data: Uint8Array) => string;\n decode: (str: string) => Uint8Array;\n}\n\nfunction isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is Uint8Array. */\nfunction abytes(b: Uint8Array | undefined): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n}\n\nfunction isArrayOf(isString: boolean, arr: any[]) {\n if (!Array.isArray(arr)) return false;\n if (arr.length === 0) return true;\n if (isString) {\n return arr.every((item) => typeof item === 'string');\n } else {\n return arr.every((item) => Number.isSafeInteger(item));\n }\n}\n\nfunction afn(input: Function): input is Function {\n if (typeof input !== 'function') throw new Error('function expected');\n return true;\n}\n\nfunction astr(label: string, input: unknown): input is string {\n if (typeof input !== 'string') throw new Error(`${label}: string expected`);\n return true;\n}\n\nfunction anumber(n: number): void {\n if (!Number.isSafeInteger(n)) throw new Error(`invalid integer: ${n}`);\n}\n\nfunction aArr(input: any[]) {\n if (!Array.isArray(input)) throw new Error('array expected');\n}\nfunction astrArr(label: string, input: string[]) {\n if (!isArrayOf(true, input)) throw new Error(`${label}: array of strings expected`);\n}\nfunction anumArr(label: string, input: number[]) {\n if (!isArrayOf(false, input)) throw new Error(`${label}: array of numbers expected`);\n}\n\n// TODO: some recusive type inference so it would check correct order of input/output inside rest?\n// like <string, number>, <number, bytes>, <bytes, float>\ntype Chain = [Coder<any, any>, ...Coder<any, any>[]];\n// Extract info from Coder type\ntype Input<F> = F extends Coder<infer T, any> ? T : never;\ntype Output<F> = F extends Coder<any, infer T> ? T : never;\n// Generic function for arrays\ntype First<T> = T extends [infer U, ...any[]] ? U : never;\ntype Last<T> = T extends [...any[], infer U] ? U : never;\ntype Tail<T> = T extends [any, ...infer U] ? U : never;\n\ntype AsChain<C extends Chain, Rest = Tail<C>> = {\n // C[K] = Coder<Input<C[K]>, Input<Rest[k]>>\n [K in keyof C]: Coder<Input<C[K]>, Input<K extends keyof Rest ? Rest[K] : any>>;\n};\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction chain<T extends Chain & AsChain<T>>(...args: T): Coder<Input<First<T>>, Output<Last<T>>> {\n const id = (a: any) => a;\n // Wrap call in closure so JIT can inline calls\n const wrap = (a: any, b: any) => (c: any) => a(b(c));\n // Construct chain of args[-1].encode(args[-2].encode([...]))\n const encode = args.map((x) => x.encode).reduceRight(wrap, id);\n // Construct chain of args[0].decode(args[1].decode(...))\n const decode = args.map((x) => x.decode).reduce(wrap, id);\n return { encode, decode };\n}\n\n/**\n * Encodes integer radix representation to array of strings using alphabet and back.\n * Could also be array of strings.\n * @__NO_SIDE_EFFECTS__\n */\nfunction alphabet(letters: string | string[]): Coder<number[], string[]> {\n // mapping 1 to \"b\"\n const lettersA = typeof letters === 'string' ? letters.split('') : letters;\n const len = lettersA.length;\n astrArr('alphabet', lettersA);\n\n // mapping \"b\" to 1\n const indexes = new Map(lettersA.map((l, i) => [l, i]));\n return {\n encode: (digits: number[]) => {\n aArr(digits);\n return digits.map((i) => {\n if (!Number.isSafeInteger(i) || i < 0 || i >= len)\n throw new Error(\n `alphabet.encode: digit index outside alphabet \"${i}\". Allowed: ${letters}`\n );\n return lettersA[i]!;\n });\n },\n decode: (input: string[]): number[] => {\n aArr(input);\n return input.map((letter) => {\n astr('alphabet.decode', letter);\n const i = indexes.get(letter);\n if (i === undefined) throw new Error(`Unknown letter: \"${letter}\". Allowed: ${letters}`);\n return i;\n });\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction join(separator = ''): Coder<string[], string> {\n astr('join', separator);\n return {\n encode: (from) => {\n astrArr('join.decode', from);\n return from.join(separator);\n },\n decode: (to) => {\n astr('join.decode', to);\n return to.split(separator);\n },\n };\n}\n\n/**\n * Pad strings array so it has integer number of bits\n * @__NO_SIDE_EFFECTS__\n */\nfunction padding(bits: number, chr = '='): Coder<string[], string[]> {\n anumber(bits);\n astr('padding', chr);\n return {\n encode(data: string[]): string[] {\n astrArr('padding.encode', data);\n while ((data.length * bits) % 8) data.push(chr);\n return data;\n },\n decode(input: string[]): string[] {\n astrArr('padding.decode', input);\n let end = input.length;\n if ((end * bits) % 8)\n throw new Error('padding: invalid, string should have whole number of bytes');\n for (; end > 0 && input[end - 1] === chr; end--) {\n const last = end - 1;\n const byte = last * bits;\n if (byte % 8 === 0) throw new Error('padding: invalid, string has too much padding');\n }\n return input.slice(0, end);\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction normalize<T>(fn: (val: T) => T): Coder<T, T> {\n afn(fn);\n return { encode: (from: T) => from, decode: (to: T) => fn(to) };\n}\n\n/**\n * Slow: O(n^2) time complexity\n */\nfunction convertRadix(data: number[], from: number, to: number): number[] {\n // base 1 is impossible\n if (from < 2) throw new Error(`convertRadix: invalid from=${from}, base cannot be less than 2`);\n if (to < 2) throw new Error(`convertRadix: invalid to=${to}, base cannot be less than 2`);\n aArr(data);\n if (!data.length) return [];\n let pos = 0;\n const res = [];\n const digits = Array.from(data, (d) => {\n anumber(d);\n if (d < 0 || d >= from) throw new Error(`invalid integer: ${d}`);\n return d;\n });\n const dlen = digits.length;\n while (true) {\n let carry = 0;\n let done = true;\n for (let i = pos; i < dlen; i++) {\n const digit = digits[i]!;\n const fromCarry = from * carry;\n const digitBase = fromCarry + digit;\n if (\n !Number.isSafeInteger(digitBase) ||\n fromCarry / from !== carry ||\n digitBase - digit !== fromCarry\n ) {\n throw new Error('convertRadix: carry overflow');\n }\n const div = digitBase / to;\n carry = digitBase % to;\n const rounded = Math.floor(div);\n digits[i] = rounded;\n if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase)\n throw new Error('convertRadix: carry overflow');\n if (!done) continue;\n else if (!rounded) pos = i;\n else done = false;\n }\n res.push(carry);\n if (done) break;\n }\n for (let i = 0; i < data.length - 1 && data[i] === 0; i++) res.push(0);\n return res.reverse();\n}\n\nconst gcd = (a: number, b: number): number => (b === 0 ? a : gcd(b, a % b));\nconst radix2carry = /* @__NO_SIDE_EFFECTS__ */ (from: number, to: number) =>\n from + (to - gcd(from, to));\nconst powers: number[] = /* @__PURE__ */ (() => {\n let res = [];\n for (let i = 0; i < 40; i++) res.push(2 ** i);\n return res;\n})();\n/**\n * Implemented with numbers, because BigInt is 5x slower\n */\nfunction convertRadix2(data: number[], from: number, to: number, padding: boolean): number[] {\n aArr(data);\n if (from <= 0 || from > 32) throw new Error(`convertRadix2: wrong from=${from}`);\n if (to <= 0 || to > 32) throw new Error(`convertRadix2: wrong to=${to}`);\n if (radix2carry(from, to) > 32) {\n throw new Error(\n `convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`\n );\n }\n let carry = 0;\n let pos = 0; // bitwise position in current element\n const max = powers[from]!;\n const mask = powers[to]! - 1;\n const res: number[] = [];\n for (const n of data) {\n anumber(n);\n if (n >= max) throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);\n carry = (carry << from) | n;\n if (pos + from > 32) throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);\n pos += from;\n for (; pos >= to; pos -= to) res.push(((carry >> (pos - to)) & mask) >>> 0);\n const pow = powers[pos];\n if (pow === undefined) throw new Error('invalid carry');\n carry &= pow - 1; // clean carry, otherwise it will cause overflow\n }\n carry = (carry << (to - pos)) & mask;\n if (!padding && pos >= from) throw new Error('Excess padding');\n if (!padding && carry > 0) throw new Error(`Non-zero padding: ${carry}`);\n if (padding && pos > 0) res.push(carry >>> 0);\n return res;\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix(num: number): Coder<Uint8Array, number[]> {\n anumber(num);\n const _256 = 2 ** 8;\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix.encode input should be Uint8Array');\n return convertRadix(Array.from(bytes), _256, num);\n },\n decode: (digits: number[]) => {\n anumArr('radix.decode', digits);\n return Uint8Array.from(convertRadix(digits, num, _256));\n },\n };\n}\n\n/**\n * If both bases are power of same number (like `2**8 <-> 2**64`),\n * there is a linear algorithm. For now we have implementation for power-of-two bases only.\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix2(bits: number, revPadding = false): Coder<Uint8Array, number[]> {\n anumber(bits);\n if (bits <= 0 || bits > 32) throw new Error('radix2: bits should be in (0..32]');\n if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32)\n throw new Error('radix2: carry overflow');\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix2.encode input should be Uint8Array');\n return convertRadix2(Array.from(bytes), 8, bits, !revPadding);\n },\n decode: (digits: number[]) => {\n anumArr('radix2.decode', digits);\n return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));\n },\n };\n}\n\ntype ArgumentTypes<F extends Function> = F extends (...args: infer A) => any ? A : never;\nfunction unsafeWrapper<T extends (...args: any) => any>(fn: T) {\n afn(fn);\n return function (...args: ArgumentTypes<T>): ReturnType<T> | void {\n try {\n return fn.apply(null, args);\n } catch (e) {}\n };\n}\n\nfunction checksum(\n len: number,\n fn: (data: Uint8Array) => Uint8Array\n): Coder<Uint8Array, Uint8Array> {\n anumber(len);\n afn(fn);\n return {\n encode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.encode: input should be Uint8Array');\n const sum = fn(data).slice(0, len);\n const res = new Uint8Array(data.length + len);\n res.set(data);\n res.set(sum, data.length);\n return res;\n },\n decode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.decode: input should be Uint8Array');\n const payload = data.slice(0, -len);\n const oldChecksum = data.slice(-len);\n const newChecksum = fn(payload).slice(0, len);\n for (let i = 0; i < len; i++)\n if (newChecksum[i] !== oldChecksum[i]) throw new Error('Invalid checksum');\n return payload;\n },\n };\n}\n\n// prettier-ignore\nexport const utils: { alphabet: typeof alphabet; chain: typeof chain; checksum: typeof checksum; convertRadix: typeof convertRadix; convertRadix2: typeof convertRadix2; radix: typeof radix; radix2: typeof radix2; join: typeof join; padding: typeof padding; } = {\n alphabet, chain, checksum, convertRadix, convertRadix2, radix, radix2, join, padding,\n};\n\n// RFC 4648 aka RFC 3548\n// ---------------------\n\n/**\n * base16 encoding from RFC 4648.\n * @example\n * ```js\n * base16.encode(Uint8Array.from([0x12, 0xab]));\n * // => '12AB'\n * ```\n */\nexport const base16: BytesCoder = chain(radix2(4), alphabet('0123456789ABCDEF'), join(''));\n\n/**\n * base32 encoding from RFC 4648. Has padding.\n * Use `base32nopad` for unpadded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ===='\n * base32.decode('CKVQ====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding.\n * Use `base32` for padded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ'\n * base32nopad.decode('CKVQ');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32nopad: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Padded. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hexnopad` for unpadded version.\n * @example\n * ```js\n * base32hex.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG===='\n * base32hex.decode('2ALG====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hex: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hex` for padded version.\n * @example\n * ```js\n * base32hexnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG'\n * base32hexnopad.decode('2ALG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hexnopad: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Doug Crockford's version.\n * https://www.crockford.com/base32.html\n * @example\n * ```js\n * base32crockford.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ANG'\n * base32crockford.decode('2ANG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32crockford: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'),\n join(''),\n normalize((s: string) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1'))\n);\n\n// Built-in base64 conversion https://caniuse.com/mdn-javascript_builtins_uint8array_frombase64\n// prettier-ignore\nconst hasBase64Builtin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toBase64 === 'function' &&\n typeof (Uint8Array as any).fromBase64 === 'function')();\n\nconst decodeBase64Builtin = (s: string, isUrl: boolean) => {\n astr('base64', s);\n const re = isUrl ? /^[A-Za-z0-9=_-]+$/ : /^[A-Za-z0-9=+/]+$/;\n const alphabet = isUrl ? 'base64url' : 'base64';\n if (s.length > 0 && !re.test(s)) throw new Error('invalid base64');\n return (Uint8Array as any).fromBase64(s, { alphabet, lastChunkHandling: 'strict' });\n};\n\n/**\n * base64 from RFC 4648. Padded.\n * Use `base64nopad` for unpadded version.\n * Also check out `base64url`, `base64urlnopad`.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64(); },\n decode(s) { return decodeBase64Builtin(s, false); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n padding(6),\n join('')\n);\n/**\n * base64 from RFC 4648. No padding.\n * Use `base64` for padded version.\n * @example\n * ```js\n * base64nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64nopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64nopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. Padded.\n * Use `base64urlnopad` for unpadded version.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64url.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64url.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64url: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64({ alphabet: 'base64url' }); },\n decode(s) { return decodeBase64Builtin(s, true); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n padding(6),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. No padding.\n * Use `base64url` for padded version.\n * @example\n * ```js\n * base64urlnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64urlnopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64urlnopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n join('')\n);\n\n// base58 code\n// -----------\nconst genBase58 = /* @__NO_SIDE_EFFECTS__ */ (abc: string) =>\n chain(radix(58), alphabet(abc), join(''));\n\n/**\n * base58: base64 without ambigous characters +, /, 0, O, I, l.\n * Quadratic (O(n^2)) - so, can't be used on large inputs.\n * @example\n * ```js\n * base58.decode('01abcdef');\n * // => '3UhJW'\n * ```\n */\nexport const base58: BytesCoder = genBase58(\n '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n);\n/**\n * base58: flickr version. Check out `base58`.\n */\nexport const base58flickr: BytesCoder = genBase58(\n '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'\n);\n/**\n * base58: XRP version. Check out `base58`.\n */\nexport const base58xrp: BytesCoder = genBase58(\n 'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz'\n);\n\n// Data len (index) -> encoded block len\nconst XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11];\n\n/**\n * base58: XMR version. Check out `base58`.\n * Done in 8-byte blocks (which equals 11 chars in decoding). Last (non-full) block padded with '1' to size in XMR_BLOCK_LEN.\n * Block encoding significantly reduces quadratic complexity of base58.\n */\nexport const base58xmr: BytesCoder = {\n encode(data: Uint8Array) {\n let res = '';\n for (let i = 0; i < data.length; i += 8) {\n const block = data.subarray(i, i + 8);\n res += base58.encode(block).padStart(XMR_BLOCK_LEN[block.length]!, '1');\n }\n return res;\n },\n decode(str: string) {\n let res: number[] = [];\n for (let i = 0; i < str.length; i += 11) {\n const slice = str.slice(i, i + 11);\n const blockLen = XMR_BLOCK_LEN.indexOf(slice.length);\n const block = base58.decode(slice);\n for (let j = 0; j < block.length - blockLen; j++) {\n if (block[j] !== 0) throw new Error('base58xmr: wrong padding');\n }\n res = res.concat(Array.from(block.slice(block.length - blockLen)));\n }\n return Uint8Array.from(res);\n },\n};\n\n/**\n * Method, which creates base58check encoder.\n * Requires function, calculating sha256.\n */\nexport const createBase58check = (sha256: (data: Uint8Array) => Uint8Array): BytesCoder =>\n chain(\n checksum(4, (data) => sha256(sha256(data))),\n base58\n );\n\n/**\n * Use `createBase58check` instead.\n * @deprecated\n */\nexport const base58check: (sha256: (data: Uint8Array) => Uint8Array) => BytesCoder =\n createBase58check;\n\n// Bech32 code\n// -----------\nexport interface Bech32Decoded<Prefix extends string = string> {\n prefix: Prefix;\n words: number[];\n}\nexport interface Bech32DecodedWithArray<Prefix extends string = string> {\n prefix: Prefix;\n words: number[];\n bytes: Uint8Array;\n}\n\nconst BECH_ALPHABET: Coder<number[], string> = chain(\n alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'),\n join('')\n);\n\nconst POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];\nfunction bech32Polymod(pre: number): number {\n const b = pre >> 25;\n let chk = (pre & 0x1ffffff) << 5;\n for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {\n if (((b >> i) & 1) === 1) chk ^= POLYMOD_GENERATORS[i]!;\n }\n return chk;\n}\n\nfunction bechChecksum(prefix: string, words: number[], encodingConst = 1): string {\n const len = prefix.length;\n let chk = 1;\n for (let i = 0; i < len; i++) {\n const c = prefix.charCodeAt(i);\n if (c < 33 || c > 126) throw new Error(`Invalid prefix (${prefix})`);\n chk = bech32Polymod(chk) ^ (c >> 5);\n }\n chk = bech32Polymod(chk);\n for (let i = 0; i < len; i++) chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f);\n for (let v of words) chk = bech32Polymod(chk) ^ v;\n for (let i = 0; i < 6; i++) chk = bech32Polymod(chk);\n chk ^= encodingConst;\n return BECH_ALPHABET.encode(convertRadix2([chk % powers[30]!], 30, 5, false));\n}\n\nexport interface Bech32 {\n encode<Prefix extends string>(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit?: number | false\n ): `${Lowercase<Prefix>}1${string}`;\n decode<Prefix extends string>(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded<Prefix>;\n encodeFromBytes(prefix: string, bytes: Uint8Array): string;\n decodeToBytes(str: string): Bech32DecodedWithArray;\n decodeUnsafe(str: string, limit?: number | false): void | Bech32Decoded<string>;\n fromWords(to: number[]): Uint8Array;\n fromWordsUnsafe(to: number[]): void | Uint8Array;\n toWords(from: Uint8Array): number[];\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction genBech32(encoding: 'bech32' | 'bech32m'): Bech32 {\n const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3;\n const _words = radix2(5);\n const fromWords = _words.decode;\n const toWords = _words.encode;\n const fromWordsUnsafe = unsafeWrapper(fromWords);\n\n function encode<Prefix extends string>(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit: number | false = 90\n ): `${Lowercase<Prefix>}1${string}` {\n astr('bech32.encode prefix', prefix);\n if (isBytes(words)) words = Array.from(words);\n anumArr('bech32.encode', words);\n const plen = prefix.length;\n if (plen === 0) throw new TypeError(`Invalid prefix length ${plen}`);\n const actualLength = plen + 7 + words.length;\n if (limit !== false && actualLength > limit)\n throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);\n const lowered = prefix.toLowerCase();\n const sum = bechChecksum(lowered, words, ENCODING_CONST);\n return `${lowered}1${BECH_ALPHABET.encode(words)}${sum}` as `${Lowercase<Prefix>}1${string}`;\n }\n\n function decode<Prefix extends string>(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded<Prefix>;\n function decode(str: string, limit?: number | false): Bech32Decoded;\n function decode(str: string, limit: number | false = 90): Bech32Decoded {\n astr('bech32.decode input', str);\n const slen = str.length;\n if (slen < 8 || (limit !== false && slen > limit))\n throw new TypeError(`invalid string length: ${slen} (${str}). Expected (8..${limit})`);\n // don't allow mixed case\n const lowered = str.toLowerCase();\n if (str !== lowered && str !== str.toUpperCase())\n throw new Error(`String must be lowercase or uppercase`);\n const sepIndex = lowered.lastIndexOf('1');\n if (sepIndex === 0 || sepIndex === -1)\n throw new Error(`Letter \"1\" must be present between prefix and data only`);\n const prefix = lowered.slice(0, sepIndex);\n const data = lowered.slice(sepIndex + 1);\n if (data.length < 6) throw new Error('Data must be at least 6 characters long');\n const words = BECH_ALPHABET.decode(data).slice(0, -6);\n const sum = bechChecksum(prefix, words, ENCODING_CONST);\n if (!data.endsWith(sum)) throw new Error(`Invalid checksum in ${str}: expected \"${sum}\"`);\n return { prefix, words };\n }\n\n const decodeUnsafe = unsafeWrapper(decode);\n\n function decodeToBytes(str: string): Bech32DecodedWithArray {\n const { prefix, words } = decode(str, false);\n return { prefix, words, bytes: fromWords(words) };\n }\n\n function encodeFromBytes(prefix: string, bytes: Uint8Array) {\n return encode(prefix, toWords(bytes));\n }\n\n return {\n encode,\n decode,\n encodeFromBytes,\n decodeToBytes,\n decodeUnsafe,\n fromWords,\n fromWordsUnsafe,\n toWords,\n };\n}\n\n/**\n * bech32 from BIP 173. Operates on words.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32: Bech32 = genBech32('bech32');\n\n/**\n * bech32m from BIP 350. Operates on words.\n * It was to mitigate `bech32` weaknesses.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32m: Bech32 = genBech32('bech32m');\n\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * UTF-8-to-byte decoder. Uses built-in TextDecoder / TextEncoder.\n * @example\n * ```js\n * const b = utf8.decode(\"hey\"); // => new Uint8Array([ 104, 101, 121 ])\n * const str = utf8.encode(b); // \"hey\"\n * ```\n */\nexport const utf8: BytesCoder = {\n encode: (data) => new TextDecoder().decode(data),\n decode: (str) => new TextEncoder().encode(str),\n};\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\n// prettier-ignore\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toHex === 'function' &&\n typeof (Uint8Array as any).fromHex === 'function')();\n// prettier-ignore\nconst hexBuiltin: BytesCoder = {\n encode(data) { abytes(data); return (data as any).toHex(); },\n decode(s) { astr('hex', s); return (Uint8Array as any).fromHex(s); },\n};\n/**\n * hex string decoder. Uses built-in function, when available.\n * @example\n * ```js\n * const b = hex.decode(\"0102ff\"); // => new Uint8Array([ 1, 2, 255 ])\n * const str = hex.encode(b); // \"0102ff\"\n * ```\n */\nexport const hex: BytesCoder = hasHexBuiltin\n ? hexBuiltin\n : chain(\n radix2(4),\n alphabet('0123456789abcdef'),\n join(''),\n normalize((s: string) => {\n if (typeof s !== 'string' || s.length % 2 !== 0)\n throw new TypeError(\n `hex.decode: expected string, got ${typeof s} with length ${s.length}`\n );\n return s.toLowerCase();\n })\n );\n\nexport type SomeCoders = {\n utf8: BytesCoder;\n hex: BytesCoder;\n base16: BytesCoder;\n base32: BytesCoder;\n base64: BytesCoder;\n base64url: BytesCoder;\n base58: BytesCoder;\n base58xmr: BytesCoder;\n};\n// prettier-ignore\nconst CODERS: SomeCoders = {\n utf8, hex, base16, base32, base64, base64url, base58, base58xmr\n};\ntype CoderType = keyof SomeCoders;\nconst coderTypeError =\n 'Invalid encoding type. Available types: utf8, hex, base16, base32, base64, base64url, base58, base58xmr';\n\n/** @deprecated */\nexport const bytesToString = (type: CoderType, bytes: Uint8Array): string => {\n if (typeof type !== 'string' || !CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (!isBytes(bytes)) throw new TypeError('bytesToString() expects Uint8Array');\n return CODERS[type].encode(bytes);\n};\n\n/** @deprecated */\nexport const str: (type: CoderType, bytes: Uint8Array) => string = bytesToString; // as in python, but for bytes only\n\n/** @deprecated */\nexport const stringToBytes = (type: CoderType, str: string): Uint8Array => {\n if (!CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (typeof str !== 'string') throw new TypeError('stringToBytes() expects string');\n return CODERS[type].decode(str);\n};\n/** @deprecated */\nexport const bytes: (type: CoderType, str: string) => Uint8Array = stringToBytes;\n","/**\n * BIP32 hierarchical deterministic (HD) wallets over secp256k1.\n * @module\n * @example\n * ```js\n * import { HDKey } from \"@scure/bip32\";\n * const hdkey1 = HDKey.fromMasterSeed(seed);\n * const hdkey2 = HDKey.fromExtendedKey(base58key);\n * const hdkey3 = HDKey.fromJSON({ xpriv: string });\n *\n * // props\n * [hdkey1.depth, hdkey1.index, hdkey1.chainCode];\n * console.log(hdkey2.privateKey, hdkey2.publicKey);\n * console.log(hdkey3.derive(\"m/0/2147483647'/1\"));\n * const sig = hdkey3.sign(hash);\n * hdkey3.verify(hash, sig);\n * ```\n */\n/*! scure-bip32 - MIT License (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) */\nimport { secp256k1 as secp } from '@noble/curves/secp256k1.js';\nimport { hmac } from '@noble/hashes/hmac.js';\nimport { ripemd160 } from '@noble/hashes/legacy.js';\nimport { sha256, sha512 } from '@noble/hashes/sha2.js';\nimport { abytes, concatBytes, createView } from '@noble/hashes/utils.js';\nimport { createBase58check } from '@scure/base';\n\nconst Point = secp.Point;\nconst { Fn } = Point;\nconst base58check = createBase58check(sha256);\n\nconst MASTER_SECRET = Uint8Array.from('Bitcoin seed'.split(''), (char) => char.charCodeAt(0));\n\n/** Network-specific versioning. */\nexport interface Versions {\n private: number;\n public: number;\n}\n\nconst BITCOIN_VERSIONS: Versions = { private: 0x0488ade4, public: 0x0488b21e };\n/** Hardened offset from Bitcoin, default */\nexport const HARDENED_OFFSET: number = 0x80000000;\n\nconst hash160 = (data: Uint8Array) => ripemd160(sha256(data));\nconst fromU32 = (data: Uint8Array) => createView(data).getUint32(0, false);\nconst toU32 = (n: number): Uint8Array => {\n if (!Number.isSafeInteger(n) || n < 0 || n > 2 ** 32 - 1) {\n throw new Error('invalid number, should be from 0 to 2**32-1, got ' + n);\n }\n const buf = new Uint8Array(4);\n createView(buf).setUint32(0, n, false);\n return buf;\n};\n\ninterface HDKeyOpt {\n versions?: Versions;\n depth?: number;\n index?: number;\n parentFingerprint?: number;\n chainCode?: Uint8Array;\n publicKey?: Uint8Array;\n privateKey?: Uint8Array;\n}\n\n/**\n * HDKey from BIP32\n * @example\n```js\nconst hdkey1 = HDKey.fromMasterSeed(seed);\nconst hdkey2 = HDKey.fromExtendedKey(base58key);\nconst hdkey3 = HDKey.fromJSON({ xpriv: string });\n```\n */\nexport class HDKey {\n get fingerprint(): number {\n if (!this.pubHash) {\n throw new Error('No publicKey set!');\n }\n return fromU32(this.pubHash);\n }\n get identifier(): Uint8Array | undefined {\n return this.pubHash;\n }\n get pubKeyHash(): Uint8Array | undefined {\n return this.pubHash;\n }\n get privateKey(): Uint8Array | null {\n return this._privateKey || null;\n }\n get publicKey(): Uint8Array | null {\n return this._publicKey || null;\n }\n get privateExtendedKey(): string {\n const priv = this._privateKey;\n if (!priv) {\n throw new Error('No private key');\n }\n return base58check.encode(\n this.serialize(this.versions.private, concatBytes(Uint8Array.of(0), priv))\n );\n }\n get publicExtendedKey(): string {\n if (!this._publicKey) {\n throw new Error('No public key');\n }\n return base58check.encode(this.serialize(this.versions.public, this._publicKey));\n }\n\n static fromMasterSeed(seed: Uint8Array, versions: Versions = BITCOIN_VERSIONS): HDKey {\n abytes(seed);\n if (8 * seed.length < 128 || 8 * seed.length > 512) {\n throw new Error(\n 'HDKey: seed length must be between 128 and 512 bits; 256 bits is advised, got ' +\n seed.length\n );\n }\n const I = hmac(sha512, MASTER_SECRET, seed);\n const privateKey = I.slice(0, 32);\n const chainCode = I.slice(32);\n return new HDKey({ versions, chainCode, privateKey });\n }\n\n static fromExtendedKey(base58key: string, versions: Versions = BITCOIN_VERSIONS): HDKey {\n // => version(4) || depth(1) || fingerprint(4) || index(4) || chain(32) || key(33)\n const keyBuffer: Uint8Array = base58check.decode(base58key);\n const keyView = createView(keyBuffer);\n const version = keyView.getUint32(0, false);\n const opt = {\n versions,\n depth: keyBuffer[4],\n parentFingerprint: keyView.getUint32(5, false),\n index: keyView.getUint32(9, false),\n chainCode: keyBuffer.slice(13, 45),\n };\n const key = keyBuffer.slice(45);\n const isPriv = key[0] === 0;\n if (version !== versions[isPriv ? 'private' : 'public']) {\n throw new Error('Version mismatch');\n }\n if (isPriv) {\n return new HDKey({ ...opt, privateKey: key.slice(1) });\n } else {\n return new HDKey({ ...opt, publicKey: key });\n }\n }\n\n public static fromJSON(json: { xpriv: string }): HDKey {\n return HDKey.fromExtendedKey(json.xpriv);\n }\n readonly versions: Versions;\n readonly depth: number = 0;\n readonly index: number = 0;\n readonly chainCode: Uint8Array | null = null;\n readonly parentFingerprint: number = 0;\n private _privateKey?: Uint8Array;\n private _publicKey?: Uint8Array;\n private pubHash: Uint8Array | undefined;\n\n constructor(opt: HDKeyOpt) {\n if (!opt || typeof opt !== 'object') {\n throw new Error('HDKey.constructor must not be called directly');\n }\n this.versions = opt.versions || BITCOIN_VERSIONS;\n this.depth = opt.depth || 0;\n this.chainCode = opt.chainCode || null;\n this.index = opt.index || 0;\n this.parentFingerprint = opt.parentFingerprint || 0;\n if (!this.depth) {\n if (this.parentFingerprint || this.index) {\n throw new Error('HDKey: zero depth with non-zero index/parent fingerprint');\n }\n }\n if (this.depth > 255) {\n throw new Error('HDKey: depth exceeds the serializable value 255');\n }\n if (opt.publicKey && opt.privateKey) {\n throw new Error('HDKey: publicKey and privateKey at same time.');\n }\n if (opt.privateKey) {\n if (!secp.utils.isValidSecretKey(opt.privateKey)) throw new Error('Invalid private key');\n this._privateKey = opt.privateKey;\n this._publicKey = secp.getPublicKey(opt.privateKey, true);\n } else if (opt.publicKey) {\n this._publicKey = Point.fromBytes(opt.publicKey).toBytes(true); // force compressed point\n } else {\n throw new Error('HDKey: no public or private key provided');\n }\n this.pubHash = hash160(this._publicKey);\n }\n\n derive(path: string): HDKey {\n if (!/^[mM]'?/.test(path)) {\n throw new Error('Path must start with \"m\" or \"M\"');\n }\n if (/^[mM]'?$/.test(path)) {\n return this;\n }\n const parts = path.replace(/^[mM]'?\\//, '').split('/');\n // tslint:disable-next-line\n let child: HDKey = this;\n for (const c of parts) {\n const m = /^(\\d+)('?)$/.exec(c);\n const m1 = m && m[1];\n if (!m || m.length !== 3 || typeof m1 !== 'string')\n throw new Error('invalid child index: ' + c);\n let idx = +m1;\n if (!Number.isSafeInteger(idx) || idx >= HARDENED_OFFSET) {\n throw new Error('Invalid index');\n }\n // hardened key\n if (m[2] === \"'\") {\n idx += HARDENED_OFFSET;\n }\n child = child.deriveChild(idx);\n }\n return child;\n }\n\n deriveChild(index: number): HDKey {\n if (!this._publicKey || !this.chainCode) {\n throw new Error('No publicKey or chainCode set');\n }\n let data = toU32(index);\n if (index >= HARDENED_OFFSET) {\n // Hardened\n const priv = this._privateKey;\n if (!priv) {\n throw new Error('Could not derive hardened child key');\n }\n // Hardened child: 0x00 || ser256(kpar) || ser32(index)\n data = concatBytes(Uint8Array.of(0), priv, data);\n } else {\n // Normal child: serP(point(kpar)) || ser32(index)\n data = concatBytes(this._publicKey, data);\n }\n const I = hmac(sha512, this.chainCode, data);\n const childTweak = I.slice(0, 32);\n const chainCode = I.slice(32);\n if (!secp.utils.isValidSecretKey(childTweak)) {\n throw new Error('Tweak bigger than curve order');\n }\n const opt: HDKeyOpt = {\n versions: this.versions,\n chainCode,\n depth: this.depth + 1,\n parentFingerprint: this.fingerprint,\n index,\n };\n const ctweak = Fn.fromBytes(childTweak);\n try {\n // Private parent key -> private child key\n if (this._privateKey) {\n const added = Fn.create(Fn.fromBytes(this._privateKey) + ctweak);\n if (!Fn.isValidNot0(added)) {\n throw new Error('The tweak was out of range or the resulted private key is invalid');\n }\n opt.privateKey = Fn.toBytes(added);\n } else {\n const added = Point.fromBytes(this._publicKey).add(Point.BASE.multiply(ctweak));\n // Cryptographically impossible: hmac-sha512 preimage would need to be found\n if (added.equals(Point.ZERO)) {\n throw new Error('The tweak was equal to negative P, which made the result key invalid');\n }\n opt.publicKey = added.toBytes(true);\n }\n return new HDKey(opt);\n } catch (err) {\n return this.deriveChild(index + 1);\n }\n }\n\n sign(hash: Uint8Array): Uint8Array {\n if (!this._privateKey) {\n throw new Error('No privateKey set!');\n }\n abytes(hash, 32);\n return secp.sign(hash, this._privateKey, { prehash: false });\n }\n\n verify(hash: Uint8Array, signature: Uint8Array): boolean {\n abytes(hash, 32);\n abytes(signature, 64);\n if (!this._publicKey) {\n throw new Error('No publicKey set!');\n }\n return secp.verify(signature, hash, this._publicKey, { prehash: false });\n }\n\n wipePrivateData(): this {\n if (this._privateKey) {\n this._privateKey.fill(0);\n this._privateKey = undefined;\n }\n return this;\n }\n toJSON(): { xpriv: string; xpub: string } {\n return {\n xpriv: this.privateExtendedKey,\n xpub: this.publicExtendedKey,\n };\n }\n\n private serialize(version: number, key: Uint8Array) {\n if (!this.chainCode) {\n throw new Error('No chainCode set');\n }\n abytes(key, 33);\n // version(4) || depth(1) || fingerprint(4) || index(4) || chain(32) || key(33)\n return concatBytes(\n toU32(version),\n new Uint8Array([this.depth]),\n toU32(this.parentFingerprint),\n toU32(this.index),\n this.chainCode,\n key\n );\n }\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' = 'mainnet'\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' = 'mainnet'\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' = 'mainnet'\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 errorCode?: TransactionErrorCode;\n}\n\n// Chain-specific error codes for better error handling\nexport type TransactionErrorCode =\n | 'INSUFFICIENT_FUNDS'\n | 'INVALID_ADDRESS'\n | 'NETWORK_ERROR'\n | 'TIMEOUT'\n | 'REJECTED'\n | 'GAS_TOO_LOW'\n | 'NONCE_TOO_LOW'\n | 'MEMPOOL_FULL'\n | 'DUST_AMOUNT'\n | 'UNKNOWN';\n\n// Chain-specific error messages\nconst CHAIN_ERROR_MESSAGES: Record<SupportedChain, Record<string, TransactionErrorCode>> = {\n ethereum: {\n 'insufficient funds': 'INSUFFICIENT_FUNDS',\n 'nonce too low': 'NONCE_TOO_LOW',\n 'gas too low': 'GAS_TOO_LOW',\n 'replacement transaction underpriced': 'GAS_TOO_LOW',\n 'transaction underpriced': 'GAS_TOO_LOW',\n 'invalid address': 'INVALID_ADDRESS',\n },\n bitcoin: {\n 'insufficient funds': 'INSUFFICIENT_FUNDS',\n 'dust': 'DUST_AMOUNT',\n 'mempool': 'MEMPOOL_FULL',\n 'invalid address': 'INVALID_ADDRESS',\n },\n solana: {\n 'insufficient funds': 'INSUFFICIENT_FUNDS',\n 'invalid account': 'INVALID_ADDRESS',\n 'blockhash not found': 'NETWORK_ERROR',\n },\n ton: {\n 'insufficient funds': 'INSUFFICIENT_FUNDS',\n 'invalid address': 'INVALID_ADDRESS',\n },\n tron: {\n 'insufficient funds': 'INSUFFICIENT_FUNDS',\n 'invalid address': 'INVALID_ADDRESS',\n 'bandwidth': 'GAS_TOO_LOW',\n },\n spark: {\n 'insufficient funds': 'INSUFFICIENT_FUNDS',\n 'invoice expired': 'TIMEOUT',\n 'no route': 'NETWORK_ERROR',\n },\n};\n\n// Parse error message to get chain-specific error code\nfunction parseChainError(chain: SupportedChain, errorMessage: string): TransactionErrorCode {\n const errorLower = errorMessage.toLowerCase();\n const chainErrors = CHAIN_ERROR_MESSAGES[chain];\n\n for (const [pattern, code] of Object.entries(chainErrors)) {\n if (errorLower.includes(pattern)) {\n return code;\n }\n }\n\n // Generic error detection\n if (errorLower.includes('timeout') || errorLower.includes('timed out')) {\n return 'TIMEOUT';\n }\n if (errorLower.includes('network') || errorLower.includes('connection')) {\n return 'NETWORK_ERROR';\n }\n if (errorLower.includes('rejected') || errorLower.includes('denied')) {\n return 'REJECTED';\n }\n\n return 'UNKNOWN';\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 || 'mainnet',\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 const addresses: MultiChainAddresses = {\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 // Fallback: if Spark address is null, derive locally (browser-compatible)\n if (!addresses.spark) {\n try {\n addresses.spark = BrowserDerivation.deriveSparkAddress(seed, this.config.network);\n } catch (e) {\n console.warn('Browser Spark derivation fallback failed:', e);\n }\n }\n\n return addresses;\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 on any supported chain\n *\n * @param seed - BIP-39 seed phrase\n * @param chain - Target blockchain (ethereum, bitcoin, solana, ton, tron, spark)\n * @param to - Recipient address\n * @param amount - Amount to send (in native units: ETH, BTC, SOL, etc.)\n * @returns Transaction result with hash on success, or error details on failure\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 const startTime = Date.now();\n console.log(`[ZubariWdkService] Sending ${chain} transaction`, {\n to: `${to.slice(0, 10)}...${to.slice(-6)}`,\n amount,\n network: this.config.network,\n });\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 const elapsed = Date.now() - startTime;\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 transaction hash format per chain\n if (txHash) {\n const isValid = this.validateTxHash(chain, txHash);\n if (!isValid) {\n console.warn(`[ZubariWdkService] Invalid ${chain} tx hash format:`, txHash);\n }\n }\n\n console.log(`[ZubariWdkService] ${chain} transaction ${data.success ? 'SUCCESS' : 'FAILED'}`, {\n txHash: txHash ? `${txHash.slice(0, 16)}...` : 'N/A',\n elapsed: `${elapsed}ms`,\n });\n\n if (!data.success) {\n const errorCode = parseChainError(chain, data.error || '');\n return {\n success: false,\n error: data.error,\n errorCode,\n chain,\n };\n }\n\n return {\n success: true,\n txHash,\n from: data.from,\n to: data.to,\n amount: data.amount,\n chain: data.chain || chain,\n network: data.network || this.config.network,\n };\n }\n\n const errorData = await response.json().catch(() => ({}));\n const errorMessage = errorData.error || `HTTP ${response.status}`;\n const errorCode = parseChainError(chain, errorMessage);\n\n console.error(`[ZubariWdkService] ${chain} transaction FAILED`, {\n status: response.status,\n error: errorMessage,\n errorCode,\n elapsed: `${elapsed}ms`,\n });\n\n return {\n success: false,\n error: errorMessage,\n errorCode,\n chain,\n };\n } catch (error) {\n const elapsed = Date.now() - startTime;\n const errorMessage = error instanceof Error ? error.message : 'Transaction failed';\n const errorCode = parseChainError(chain, errorMessage);\n\n console.error(`[ZubariWdkService] ${chain} transaction ERROR`, {\n error: errorMessage,\n errorCode,\n elapsed: `${elapsed}ms`,\n });\n\n return {\n success: false,\n error: errorMessage,\n errorCode,\n chain,\n };\n }\n }\n\n /**\n * Validate transaction hash format for a specific chain\n */\n private validateTxHash(chain: SupportedChain, txHash: string): boolean {\n switch (chain) {\n case 'ethereum':\n // Ethereum: 0x + 64 hex chars = 66 total\n return /^0x[a-fA-F0-9]{64}$/.test(txHash);\n case 'bitcoin':\n // Bitcoin: 64 hex chars (no prefix)\n return /^[a-fA-F0-9]{64}$/.test(txHash);\n case 'solana':\n // Solana: Base58, typically 87-88 chars\n return /^[1-9A-HJ-NP-Za-km-z]{80,90}$/.test(txHash);\n case 'ton':\n // TON: Base64 encoded, variable length\n return txHash.length >= 40;\n case 'tron':\n // TRON: 64 hex chars (no prefix)\n return /^[a-fA-F0-9]{64}$/.test(txHash);\n case 'spark':\n // Lightning: payment preimage or hash\n return txHash.length >= 32;\n default:\n return true;\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","/**\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 * Normalize a seed phrase by removing extra whitespace and special characters\n */\n static normalizeSeedPhrase(seed: string): string {\n return seed\n .toLowerCase()\n .replace(/[\\u00A0\\u2000-\\u200B\\u202F\\u205F\\u3000]/g, ' ') // Replace non-breaking and special spaces\n .replace(/[^\\w\\s]/g, ' ') // Remove special characters except spaces\n .trim()\n .split(/\\s+/)\n .join(' ');\n }\n\n /**\n * Validate a BIP-39 seed phrase\n * Returns { valid: boolean, error?: string, invalidWordIndex?: number }\n */\n static validateSeedPhraseDetailed(seed: string): {\n valid: boolean;\n error?: string;\n invalidWordIndex?: number;\n invalidWord?: string;\n normalizedSeed?: string;\n } {\n const normalizedSeed = this.normalizeSeedPhrase(seed);\n const words = normalizedSeed.split(' ');\n\n // Check word count\n const validWordCounts = [12, 15, 18, 21, 24];\n if (!validWordCounts.includes(words.length)) {\n return {\n valid: false,\n error: `Seed phrase must be 12, 15, 18, 21, or 24 words. Got ${words.length} words.`\n };\n }\n\n // BIP-39 English wordlist (first few characters to validate)\n // Full validation will be done by ethers.js, but we can catch common typos\n const commonInvalidWords = ['th', 'a', 'an', 'is', 'are', 'the', 'be', 'to', 'of', 'and', 'in'];\n\n for (let i = 0; i < words.length; i++) {\n const word = words[i];\n\n // Check for empty words\n if (!word || word.length === 0) {\n return {\n valid: false,\n error: `Empty word at position ${i + 1}`,\n invalidWordIndex: i,\n invalidWord: word,\n };\n }\n\n // Check for very short words (BIP-39 words are at least 3 characters)\n if (word.length < 3) {\n return {\n valid: false,\n error: `Word \"${word}\" at position ${i + 1} is too short. BIP-39 words are at least 3 characters.`,\n invalidWordIndex: i,\n invalidWord: word,\n };\n }\n\n // Check for common non-BIP39 words\n if (commonInvalidWords.includes(word)) {\n return {\n valid: false,\n error: `Word \"${word}\" at position ${i + 1} is not a valid BIP-39 word.`,\n invalidWordIndex: i,\n invalidWord: word,\n };\n }\n\n // Check for numbers or special characters in words\n if (!/^[a-z]+$/.test(word)) {\n return {\n valid: false,\n error: `Word \"${word}\" at position ${i + 1} contains invalid characters. Words should only contain letters.`,\n invalidWordIndex: i,\n invalidWord: word,\n };\n }\n }\n\n return { valid: true, normalizedSeed };\n }\n\n /**\n * Validate a BIP-39 seed phrase (basic validation)\n * @deprecated Use validateSeedPhraseDetailed for better error messages\n */\n static validateSeedPhrase(seed: string): boolean {\n const result = this.validateSeedPhraseDetailed(seed);\n return result.valid;\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","import { Wallet, HDNodeWallet, formatEther, parseEther } from 'ethers';\nimport { createPublicClient, http, formatEther as viemFormatEther, getAddress } 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, USDT_ADDRESSES, 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 tokenBalances?: Record<string, { balance: string; balanceUsd: number }>;\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 /** Access token for authenticated API requests */\n accessToken?: 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' | 'accessToken'>> & { enabledChains: NetworkType[]; accessToken?: string };\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 || 'mainnet',\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 accessToken: config.accessToken,\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 // Normalize the seed phrase first\n const normalizedSeed = KeyManager.normalizeSeedPhrase(seed);\n\n // Validate with detailed error messages\n const validation = KeyManager.validateSeedPhraseDetailed(normalizedSeed);\n if (!validation.valid) {\n throw new Error(validation.error || 'Invalid seed phrase');\n }\n\n // Try to derive address - this will throw a specific error if any word is invalid\n let address: string;\n try {\n address = WalletManager.deriveAddress(normalizedSeed);\n } catch (error: any) {\n // Parse ethers.js error to give a more helpful message\n const errorMessage = error.message || '';\n const match = errorMessage.match(/invalid mnemonic word at index (\\d+)/i);\n if (match) {\n const wordIndex = parseInt(match[1], 10);\n const words = normalizedSeed.split(' ');\n const invalidWord = words[wordIndex] || 'unknown';\n throw new Error(\n `Invalid word \"${invalidWord}\" at position ${wordIndex + 1}. ` +\n `Please check your seed phrase for typos.`\n );\n }\n throw new Error(`Invalid seed phrase: ${errorMessage}`);\n }\n\n // Encrypt and store the normalized seed\n const encrypted = await KeyManager.encryptSeed(normalizedSeed, password);\n await this.storage.setItem(STORAGE_KEYS.ENCRYPTED_SEED, encrypted);\n\n this.currentSeed = normalizedSeed;\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 * Set access token for authenticated API requests\n * This allows updating the token after initialization (e.g., after login)\n */\n setAccessToken(token: string | undefined): void {\n (this.config as { accessToken?: string }).accessToken = token;\n }\n\n /**\n * Get current access token\n */\n getAccessToken(): string | undefined {\n return this.config.accessToken;\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' = 'mainnet',\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 const tokenBalances: Record<string, { balance: string; balanceUsd: number }> = {};\n\n // Fetch balance based on chain type\n if (chain === 'ethereum') {\n const viemChain = this.config.network === 'mainnet' ? mainnet : sepolia;\n const isTestnet = this.config.network !== 'mainnet';\n\n const client = createPublicClient({\n chain: viemChain,\n transport: http(this.config.rpcUrl, {\n timeout: 15000,\n retryCount: 2,\n retryDelay: 1000,\n }),\n });\n\n // Fetch ETH native balance and USDT ERC-20 balance in parallel\n const usdtAddr = USDT_ADDRESSES.ethereum?.[isTestnet ? 'testnet' : 'mainnet'];\n\n // ERC-20 balanceOf ABI for readContract\n const erc20BalanceOfAbi = [{\n type: 'function' as const,\n name: 'balanceOf',\n stateMutability: 'view' as const,\n inputs: [{ name: 'account', type: 'address' }],\n outputs: [{ name: '', type: 'uint256' }],\n }];\n\n // Normalize addresses to EIP-55 checksum format (viem is strict about this)\n const checksumAddr = getAddress(address);\n\n const [ethResult, usdtResult] = await Promise.allSettled([\n client.getBalance({ address: checksumAddr }),\n usdtAddr\n ? client.readContract({\n address: getAddress(usdtAddr),\n abi: erc20BalanceOfAbi,\n functionName: 'balanceOf',\n args: [checksumAddr],\n })\n : Promise.resolve(null),\n ]);\n\n if (ethResult.status === 'fulfilled') {\n balance = viemFormatEther(ethResult.value);\n } else {\n console.error(`[WalletManager] Failed to fetch ETH balance:`, ethResult.reason);\n }\n\n if (usdtResult.status === 'fulfilled' && usdtResult.value != null) {\n try {\n const rawUsdt = BigInt(usdtResult.value as bigint);\n const usdtAmount = Number(rawUsdt) / 1_000_000; // USDT has 6 decimals\n if (usdtAmount > 0) {\n tokenBalances.USDT = { balance: usdtAmount.toFixed(6), balanceUsd: usdtAmount };\n }\n } catch (err) {\n console.warn('[WalletManager] Failed to parse ETH USDT balance:', err);\n }\n } else if (usdtResult.status === 'rejected') {\n console.warn('[WalletManager] Failed to fetch ETH USDT balance:', usdtResult.reason);\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\n // Fetch USDT SPL token balance\n const isTestnet = this.config.network !== 'mainnet';\n const usdtMint = USDT_ADDRESSES.solana?.[isTestnet ? 'testnet' : 'mainnet'];\n if (usdtMint) {\n try {\n const tokenResponse = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 2,\n method: 'getTokenAccountsByOwner',\n params: [\n address,\n { mint: usdtMint },\n { encoding: 'jsonParsed' },\n ],\n }),\n });\n\n if (tokenResponse.ok) {\n const tokenData = await tokenResponse.json();\n const accounts = tokenData.result?.value;\n if (accounts && accounts.length > 0) {\n const uiAmount = accounts[0].account?.data?.parsed?.info?.tokenAmount?.uiAmount;\n if (uiAmount && uiAmount > 0) {\n tokenBalances.USDT = { balance: uiAmount.toFixed(6), balanceUsd: uiAmount };\n }\n }\n }\n } catch (error) {\n console.warn('Failed to fetch Solana USDT balance:', error);\n }\n }\n } else if (chain === 'tron') {\n // TRON: Use TronGrid API (Nile testnet for testnet, mainnet for production)\n const tronConfig = getNetworkConfig('tron', this.config.network !== 'mainnet');\n const baseUrl = tronConfig.rpcUrl;\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 // Parse TRC-20 USDT balance from the same response\n const isTestnet = this.config.network !== 'mainnet';\n const usdtAddr = USDT_ADDRESSES.tron?.[isTestnet ? 'testnet' : 'mainnet'];\n if (usdtAddr && data.data?.[0]?.trc20) {\n const trc20List = data.data[0].trc20 as Record<string, string>[];\n for (const tokenObj of trc20List) {\n if (tokenObj[usdtAddr]) {\n const rawUsdtBalance = BigInt(tokenObj[usdtAddr]);\n const usdtAmount = Number(rawUsdtBalance) / 1_000_000; // USDT has 6 decimals\n if (usdtAmount > 0) {\n tokenBalances.USDT = { balance: usdtAmount.toFixed(6), balanceUsd: usdtAmount };\n }\n break;\n }\n }\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 isTestnet = this.config.network !== 'mainnet';\n const baseUrl = isTestnet\n ? 'https://testnet.toncenter.com/api/v2'\n : 'https://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\n // Fetch USDT jetton balance via TON Center v3 API\n const usdtJetton = USDT_ADDRESSES.ton?.[isTestnet ? 'testnet' : 'mainnet'];\n if (usdtJetton) {\n const v3BaseUrl = isTestnet\n ? 'https://testnet.toncenter.com/api/v3'\n : 'https://toncenter.com/api/v3';\n try {\n const jettonResponse = await fetch(\n `${v3BaseUrl}/jetton/wallets?owner_address=${address}&jetton_address=${usdtJetton}&limit=1`,\n { headers: { 'Accept': 'application/json' } }\n );\n\n if (jettonResponse.ok) {\n const jettonData = await jettonResponse.json();\n const wallets = jettonData.jetton_wallets;\n if (wallets && wallets.length > 0) {\n const rawBalance = wallets[0].balance;\n if (rawBalance) {\n const usdtAmount = Number(BigInt(rawBalance)) / 1_000_000; // USDT has 6 decimals\n if (usdtAmount > 0) {\n tokenBalances.USDT = { balance: usdtAmount.toFixed(6), balanceUsd: usdtAmount };\n }\n }\n }\n }\n } catch (error) {\n console.warn('Failed to fetch TON USDT jetton balance:', error);\n }\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 ...(Object.keys(tokenBalances).length > 0 ? { tokenBalances } : {}),\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 // Build headers with optional Authorization\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (this.config.accessToken) {\n headers['Authorization'] = `Bearer ${this.config.accessToken}`;\n }\n\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,\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 // Build headers with optional Authorization\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (this.config.accessToken) {\n headers['Authorization'] = `Bearer ${this.config.accessToken}`;\n }\n\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/estimate-fee`, {\n method: 'POST',\n headers,\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","/**\n * React hooks for WalletManager\n *\n * These hooks provide a React-friendly interface to the WalletManager class.\n * They handle state management, loading states, and error handling.\n */\n\nimport { useState, useCallback, useEffect, useMemo } from 'react';\nimport {\n WalletManager,\n SUPPORTED_CHAINS,\n type WalletState,\n type WalletManagerConfig,\n type ChainBalance,\n type MultiChainAddresses,\n} from '../wallet';\nimport type { NetworkType } from '../types';\n\nexport interface UseWalletManagerOptions extends WalletManagerConfig {\n autoCheckWallet?: boolean;\n /** Access token for authenticated API requests (can be updated via setAccessToken) */\n accessToken?: string;\n}\n\n/** Transaction result from sendTransaction */\nexport interface SendTransactionResult {\n success: boolean;\n txHash?: string;\n from?: string;\n to?: string;\n amount?: string;\n chain?: NetworkType;\n error?: string;\n}\n\n/** Fee estimation result */\nexport interface FeeEstimateResult {\n success: boolean;\n fee?: string;\n feeUsd?: number;\n error?: string;\n}\n\nexport interface UseWalletManagerReturn {\n // State\n state: WalletState;\n isLoading: boolean;\n error: string | null;\n\n // Basic Actions\n createWallet: (password: string) => Promise<{ seed: string; address: string }>;\n importWallet: (seed: string, password: string) => Promise<void>;\n unlock: (password: string) => Promise<void>;\n lock: () => void;\n deleteWallet: () => Promise<void>;\n fetchBalance: () => Promise<string>;\n\n // Multi-chain Actions\n selectedChain: NetworkType;\n setSelectedChain: (chain: NetworkType) => void;\n chainBalances: ChainBalance[];\n fetchAllBalances: () => Promise<ChainBalance[]>;\n getAddressForChain: (chain: NetworkType) => string | null;\n getAllAddresses: () => Partial<MultiChainAddresses>;\n supportedChains: NetworkType[];\n\n // Transaction Actions (Powered by Tether WDK)\n sendTransaction: (chain: NetworkType, to: string, amount: string, token?: string) => Promise<SendTransactionResult>;\n estimateFee: (chain: NetworkType, to: string, amount: string, token?: string) => Promise<FeeEstimateResult>;\n\n // Authentication\n setAccessToken: (token: string | undefined) => void;\n getAccessToken: () => string | undefined;\n\n // Utilities\n hasWallet: () => Promise<boolean>;\n getSeed: () => string | null;\n manager: WalletManager;\n}\n\n/**\n * React hook for managing a WDK wallet with multi-chain support\n */\nexport function useWalletManager(\n options: UseWalletManagerOptions = {}\n): UseWalletManagerReturn {\n const { autoCheckWallet = true, accessToken, ...config } = options;\n\n // Create manager instance (memoized)\n const manager = useMemo(() => new WalletManager({ ...config, accessToken }), [\n config.network,\n config.rpcUrl,\n // Note: accessToken is handled separately via setAccessToken to avoid recreating manager\n ]);\n\n // State\n const [state, setState] = useState<WalletState>({\n isInitialized: false,\n isLocked: true,\n address: null,\n balance: null,\n });\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [selectedChain, setSelectedChainState] = useState<NetworkType>('ethereum');\n const [chainBalances, setChainBalances] = useState<ChainBalance[]>([]);\n\n // Update state from manager\n const updateState = useCallback(() => {\n setState(manager.getExtendedState());\n }, [manager]);\n\n // Check if wallet exists on mount\n useEffect(() => {\n if (autoCheckWallet) {\n manager.hasWallet().then((exists) => {\n if (exists) {\n setState((prev) => ({\n ...prev,\n isInitialized: true,\n isLocked: true,\n }));\n }\n });\n }\n }, [manager, autoCheckWallet]);\n\n // Update access token when it changes\n useEffect(() => {\n manager.setAccessToken(accessToken);\n }, [manager, accessToken]);\n\n // Set access token (for dynamic updates after login)\n const setAccessToken = useCallback(\n (token: string | undefined) => {\n manager.setAccessToken(token);\n },\n [manager]\n );\n\n // Get current access token\n const getAccessToken = useCallback(() => manager.getAccessToken(), [manager]);\n\n // Create new wallet\n const createWallet = useCallback(\n async (password: string) => {\n setIsLoading(true);\n setError(null);\n try {\n // Initialize storage for web\n await manager.initializeStorage(password);\n const result = await manager.createWallet(password);\n // Derive addresses for all chains using Tether WDK (async)\n // Falls back to sync derivation if WDK is not available\n try {\n await manager.deriveAllAddressesAsync();\n } catch {\n manager.deriveAllAddresses();\n }\n updateState();\n // Fetch balances for all chains after create\n try {\n const balances = await manager.fetchAllBalances();\n setChainBalances(balances);\n } catch (err) {\n console.warn('Failed to fetch balances after create:', err);\n }\n return result;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to create wallet';\n setError(message);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [manager, updateState]\n );\n\n // Import existing wallet\n const importWallet = useCallback(\n async (seed: string, password: string) => {\n setIsLoading(true);\n setError(null);\n try {\n await manager.initializeStorage(password);\n await manager.importWallet(seed, password);\n // Derive addresses for all chains using Tether WDK (async)\n try {\n await manager.deriveAllAddressesAsync();\n } catch {\n manager.deriveAllAddresses();\n }\n updateState();\n // Fetch balances for all chains after import\n try {\n const balances = await manager.fetchAllBalances();\n setChainBalances(balances);\n } catch (err) {\n console.warn('Failed to fetch balances after import:', err);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to import wallet';\n setError(message);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [manager, updateState]\n );\n\n // Unlock wallet\n const unlock = useCallback(\n async (password: string) => {\n setIsLoading(true);\n setError(null);\n try {\n await manager.initializeStorage(password);\n await manager.unlock(password);\n // Derive addresses for all chains using Tether WDK (async)\n try {\n await manager.deriveAllAddressesAsync();\n } catch {\n manager.deriveAllAddresses();\n }\n updateState();\n // Fetch balances for all chains after unlock\n try {\n const balances = await manager.fetchAllBalances();\n setChainBalances(balances);\n } catch (err) {\n console.warn('Failed to fetch balances after unlock:', err);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Invalid password';\n setError(message);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [manager, updateState]\n );\n\n // Lock wallet\n const lock = useCallback(() => {\n manager.lock();\n setChainBalances([]);\n updateState();\n }, [manager, updateState]);\n\n // Delete wallet\n const deleteWallet = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n await manager.deleteWallet();\n setChainBalances([]);\n setState({\n isInitialized: false,\n isLocked: true,\n address: null,\n balance: null,\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to delete wallet';\n setError(message);\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, [manager]);\n\n // Fetch balance (for selected chain)\n const fetchBalance = useCallback(async () => {\n setIsLoading(true);\n // Don't clear error here - balance fetch errors shouldn't clear previous errors\n try {\n const balance = await manager.fetchBalance();\n setState((prev) => ({ ...prev, balance }));\n return balance;\n } catch (err) {\n // Log warning but don't throw - balance fetch errors shouldn't block UI\n console.warn('Failed to fetch balance:', err);\n // Return '0' instead of throwing to not block wallet operations\n setState((prev) => ({ ...prev, balance: '0' }));\n return '0';\n } finally {\n setIsLoading(false);\n }\n }, [manager]);\n\n // Fetch all chain balances\n const fetchAllBalances = useCallback(async () => {\n setIsLoading(true);\n // Don't clear error here - balance fetch errors shouldn't clear previous errors\n try {\n const balances = await manager.fetchAllBalances();\n setChainBalances(balances);\n return balances;\n } catch (err) {\n // Log warning but don't throw - balance fetch errors shouldn't block UI\n console.warn('Failed to fetch all balances:', err);\n // Return empty array instead of throwing\n return [];\n } finally {\n setIsLoading(false);\n }\n }, [manager]);\n\n // Set selected chain\n const setSelectedChain = useCallback((chain: NetworkType) => {\n manager.setSelectedChain(chain);\n setSelectedChainState(chain);\n }, [manager]);\n\n // Get address for chain\n const getAddressForChain = useCallback(\n (chain: NetworkType) => manager.getAddressForChain(chain),\n [manager]\n );\n\n // Get all addresses\n const getAllAddresses = useCallback(\n () => manager.getAllAddresses(),\n [manager]\n );\n\n // Check if wallet exists\n const hasWallet = useCallback(() => manager.hasWallet(), [manager]);\n\n // Get seed (only if unlocked)\n const getSeed = useCallback(() => manager.getSeed(), [manager]);\n\n // Send transaction using Tether WDK\n const sendTransaction = useCallback(\n async (chain: NetworkType, to: string, amount: string, token?: string) => {\n setIsLoading(true);\n try {\n const result = await manager.sendTransaction(chain, to, amount, token);\n // Refresh balances after successful transaction\n if (result.success) {\n try {\n const balances = await manager.fetchAllBalances();\n setChainBalances(balances);\n } catch (err) {\n console.warn('Failed to refresh balances after transaction:', err);\n }\n }\n return result;\n } finally {\n setIsLoading(false);\n }\n },\n [manager]\n );\n\n // Estimate transaction fee using Tether WDK\n const estimateFee = useCallback(\n async (chain: NetworkType, to: string, amount: string, token?: string) => {\n return manager.estimateFee(chain, to, amount, token);\n },\n [manager]\n );\n\n return {\n state,\n isLoading,\n error,\n createWallet,\n importWallet,\n unlock,\n lock,\n deleteWallet,\n fetchBalance,\n // Multi-chain\n selectedChain,\n setSelectedChain,\n chainBalances,\n fetchAllBalances,\n getAddressForChain,\n getAllAddresses,\n supportedChains: SUPPORTED_CHAINS,\n // Transaction Actions (Powered by Tether WDK)\n sendTransaction,\n estimateFee,\n // Authentication\n setAccessToken,\n getAccessToken,\n // Utilities\n hasWallet,\n getSeed,\n manager,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/config/networks.ts","../../src/services/WdkApiClient.ts","../../src/services/BrowserAddressDerivation.ts","../../src/services/ZubariWdkService.ts","../../src/security/KeyManager.ts","../../src/storage/SecureStorage.ts","../../src/wallet/WalletManager.ts","../../src/react/useWalletManager.ts"],"names":["DERIVATION_PATHS","HDNodeWallet","mnemonicToSeedSync","HDKey","ripemd160","sha256","bech32","base58check","validateMnemonic","wordlist","generateMnemonic","DEFAULT_API_URL","errorCode","Wallet","mainnet","sepolia","createPublicClient","http","viemFormatEther","wdkService","result","getAddress","useMemo","useState","useCallback","useEffect"],"mappings":"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","file":"index.js","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://ethereum-rpc.publicnode.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 tron: {\n name: 'TRON Nile Testnet',\n chainId: 3448148188,\n rpcUrl: 'https://nile.trongrid.io',\n explorerUrl: 'https://nile.tronscan.org',\n },\n ton: {\n name: 'TON Testnet',\n rpcUrl: 'https://testnet.toncenter.com/api/v2',\n explorerUrl: 'https://testnet.tonscan.org',\n },\n};\n\n// USDT token addresses per chain (mainnet / testnet)\nexport const USDT_ADDRESSES: Partial<Record<NetworkType, { mainnet: string; testnet: string }>> = {\n ethereum: {\n mainnet: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\n testnet: '0x7169D38820dfd117C3FA1f22a697dBA58d90BA06', // Sepolia (Test Tether USD)\n },\n tron: {\n mainnet: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',\n testnet: 'TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf', // Nile testnet\n },\n solana: {\n mainnet: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB',\n testnet: '', // No official USDT on devnet\n },\n ton: {\n mainnet: 'EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs',\n testnet: 'kQD0GKBM8ZbryVk2aESmzfU6b9b_8era_IkvBSELujFZPsyy',\n },\n};\n\n// BIP-44 derivation paths\nexport const DERIVATION_PATHS: Record<NetworkType, string> = {\n bitcoin: \"m/44'/0'/0'/0\",\n ethereum: \"m/44'/60'/0'/0\",\n ton: \"m/44'/607'/0'/0\",\n tron: \"m/44'/195'/0'/0\",\n solana: \"m/44'/501'/0'/0\",\n spark: \"m/44'/998'/0'/0\",\n};\n\nexport function getNetworkConfig(\n network: NetworkType,\n isTestnet: boolean = false\n): NetworkConfig {\n const mainnetConfig = NETWORKS[network];\n if (!isTestnet) return mainnetConfig;\n\n const testnetOverrides = TESTNET_NETWORKS[network];\n if (!testnetOverrides) return mainnetConfig;\n\n return {\n ...mainnetConfig,\n ...testnetOverrides,\n };\n}\n","/**\n * 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' = 'mainnet'\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' = 'mainnet'\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' = 'mainnet'\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' = 'mainnet',\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' = 'mainnet'\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' = 'mainnet'\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' = 'mainnet'\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' = 'mainnet'\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 errorCode?: TransactionErrorCode;\n}\n\n// Chain-specific error codes for better error handling\nexport type TransactionErrorCode =\n | 'INSUFFICIENT_FUNDS'\n | 'INVALID_ADDRESS'\n | 'NETWORK_ERROR'\n | 'TIMEOUT'\n | 'REJECTED'\n | 'GAS_TOO_LOW'\n | 'NONCE_TOO_LOW'\n | 'MEMPOOL_FULL'\n | 'DUST_AMOUNT'\n | 'UNKNOWN';\n\n// Chain-specific error messages\nconst CHAIN_ERROR_MESSAGES: Record<SupportedChain, Record<string, TransactionErrorCode>> = {\n ethereum: {\n 'insufficient funds': 'INSUFFICIENT_FUNDS',\n 'nonce too low': 'NONCE_TOO_LOW',\n 'gas too low': 'GAS_TOO_LOW',\n 'replacement transaction underpriced': 'GAS_TOO_LOW',\n 'transaction underpriced': 'GAS_TOO_LOW',\n 'invalid address': 'INVALID_ADDRESS',\n },\n bitcoin: {\n 'insufficient funds': 'INSUFFICIENT_FUNDS',\n 'dust': 'DUST_AMOUNT',\n 'mempool': 'MEMPOOL_FULL',\n 'invalid address': 'INVALID_ADDRESS',\n },\n solana: {\n 'insufficient funds': 'INSUFFICIENT_FUNDS',\n 'invalid account': 'INVALID_ADDRESS',\n 'blockhash not found': 'NETWORK_ERROR',\n },\n ton: {\n 'insufficient funds': 'INSUFFICIENT_FUNDS',\n 'invalid address': 'INVALID_ADDRESS',\n },\n tron: {\n 'insufficient funds': 'INSUFFICIENT_FUNDS',\n 'invalid address': 'INVALID_ADDRESS',\n 'bandwidth': 'GAS_TOO_LOW',\n },\n spark: {\n 'insufficient funds': 'INSUFFICIENT_FUNDS',\n 'invoice expired': 'TIMEOUT',\n 'no route': 'NETWORK_ERROR',\n },\n};\n\n// Parse error message to get chain-specific error code\nfunction parseChainError(chain: SupportedChain, errorMessage: string): TransactionErrorCode {\n const errorLower = errorMessage.toLowerCase();\n const chainErrors = CHAIN_ERROR_MESSAGES[chain];\n\n for (const [pattern, code] of Object.entries(chainErrors)) {\n if (errorLower.includes(pattern)) {\n return code;\n }\n }\n\n // Generic error detection\n if (errorLower.includes('timeout') || errorLower.includes('timed out')) {\n return 'TIMEOUT';\n }\n if (errorLower.includes('network') || errorLower.includes('connection')) {\n return 'NETWORK_ERROR';\n }\n if (errorLower.includes('rejected') || errorLower.includes('denied')) {\n return 'REJECTED';\n }\n\n return 'UNKNOWN';\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 || 'mainnet',\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 const addresses: MultiChainAddresses = {\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 // Fallback: if Spark address is null, derive locally (browser-compatible)\n if (!addresses.spark) {\n try {\n addresses.spark = BrowserDerivation.deriveSparkAddress(seed, this.config.network);\n } catch (e) {\n console.warn('Browser Spark derivation fallback failed:', e);\n }\n }\n\n return addresses;\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 on any supported chain\n *\n * @param seed - BIP-39 seed phrase\n * @param chain - Target blockchain (ethereum, bitcoin, solana, ton, tron, spark)\n * @param to - Recipient address\n * @param amount - Amount to send (in native units: ETH, BTC, SOL, etc.)\n * @returns Transaction result with hash on success, or error details on failure\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 const startTime = Date.now();\n console.log(`[ZubariWdkService] Sending ${chain} transaction`, {\n to: `${to.slice(0, 10)}...${to.slice(-6)}`,\n amount,\n network: this.config.network,\n });\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 const elapsed = Date.now() - startTime;\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 transaction hash format per chain\n if (txHash) {\n const isValid = this.validateTxHash(chain, txHash);\n if (!isValid) {\n console.warn(`[ZubariWdkService] Invalid ${chain} tx hash format:`, txHash);\n }\n }\n\n console.log(`[ZubariWdkService] ${chain} transaction ${data.success ? 'SUCCESS' : 'FAILED'}`, {\n txHash: txHash ? `${txHash.slice(0, 16)}...` : 'N/A',\n elapsed: `${elapsed}ms`,\n });\n\n if (!data.success) {\n const errorCode = parseChainError(chain, data.error || '');\n return {\n success: false,\n error: data.error,\n errorCode,\n chain,\n };\n }\n\n return {\n success: true,\n txHash,\n from: data.from,\n to: data.to,\n amount: data.amount,\n chain: data.chain || chain,\n network: data.network || this.config.network,\n };\n }\n\n const errorData = await response.json().catch(() => ({}));\n const errorMessage = errorData.error || `HTTP ${response.status}`;\n const errorCode = parseChainError(chain, errorMessage);\n\n console.error(`[ZubariWdkService] ${chain} transaction FAILED`, {\n status: response.status,\n error: errorMessage,\n errorCode,\n elapsed: `${elapsed}ms`,\n });\n\n return {\n success: false,\n error: errorMessage,\n errorCode,\n chain,\n };\n } catch (error) {\n const elapsed = Date.now() - startTime;\n const errorMessage = error instanceof Error ? error.message : 'Transaction failed';\n const errorCode = parseChainError(chain, errorMessage);\n\n console.error(`[ZubariWdkService] ${chain} transaction ERROR`, {\n error: errorMessage,\n errorCode,\n elapsed: `${elapsed}ms`,\n });\n\n return {\n success: false,\n error: errorMessage,\n errorCode,\n chain,\n };\n }\n }\n\n /**\n * Validate transaction hash format for a specific chain\n */\n private validateTxHash(chain: SupportedChain, txHash: string): boolean {\n switch (chain) {\n case 'ethereum':\n // Ethereum: 0x + 64 hex chars = 66 total\n return /^0x[a-fA-F0-9]{64}$/.test(txHash);\n case 'bitcoin':\n // Bitcoin: 64 hex chars (no prefix)\n return /^[a-fA-F0-9]{64}$/.test(txHash);\n case 'solana':\n // Solana: Base58, typically 87-88 chars\n return /^[1-9A-HJ-NP-Za-km-z]{80,90}$/.test(txHash);\n case 'ton':\n // TON: Base64 encoded, variable length\n return txHash.length >= 40;\n case 'tron':\n // TRON: 64 hex chars (no prefix)\n return /^[a-fA-F0-9]{64}$/.test(txHash);\n case 'spark':\n // Lightning: payment preimage or hash\n return txHash.length >= 32;\n default:\n return true;\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 (\n !defaultService ||\n (config && (\n config.network !== defaultService.getNetwork() ||\n (config.apiUrl && config.apiUrl !== defaultService.getApiUrl())\n ))\n ) {\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","/**\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 * Normalize a seed phrase by removing extra whitespace and special characters\n */\n static normalizeSeedPhrase(seed: string): string {\n return seed\n .toLowerCase()\n .replace(/[\\u00A0\\u2000-\\u200B\\u202F\\u205F\\u3000]/g, ' ') // Replace non-breaking and special spaces\n .replace(/[^\\w\\s]/g, ' ') // Remove special characters except spaces\n .trim()\n .split(/\\s+/)\n .join(' ');\n }\n\n /**\n * Validate a BIP-39 seed phrase\n * Returns { valid: boolean, error?: string, invalidWordIndex?: number }\n */\n static validateSeedPhraseDetailed(seed: string): {\n valid: boolean;\n error?: string;\n invalidWordIndex?: number;\n invalidWord?: string;\n normalizedSeed?: string;\n } {\n const normalizedSeed = this.normalizeSeedPhrase(seed);\n const words = normalizedSeed.split(' ');\n\n // Check word count\n const validWordCounts = [12, 15, 18, 21, 24];\n if (!validWordCounts.includes(words.length)) {\n return {\n valid: false,\n error: `Seed phrase must be 12, 15, 18, 21, or 24 words. Got ${words.length} words.`\n };\n }\n\n // BIP-39 English wordlist (first few characters to validate)\n // Full validation will be done by ethers.js, but we can catch common typos\n const commonInvalidWords = ['th', 'a', 'an', 'is', 'are', 'the', 'be', 'to', 'of', 'and', 'in'];\n\n for (let i = 0; i < words.length; i++) {\n const word = words[i];\n\n // Check for empty words\n if (!word || word.length === 0) {\n return {\n valid: false,\n error: `Empty word at position ${i + 1}`,\n invalidWordIndex: i,\n invalidWord: word,\n };\n }\n\n // Check for very short words (BIP-39 words are at least 3 characters)\n if (word.length < 3) {\n return {\n valid: false,\n error: `Word \"${word}\" at position ${i + 1} is too short. BIP-39 words are at least 3 characters.`,\n invalidWordIndex: i,\n invalidWord: word,\n };\n }\n\n // Check for common non-BIP39 words\n if (commonInvalidWords.includes(word)) {\n return {\n valid: false,\n error: `Word \"${word}\" at position ${i + 1} is not a valid BIP-39 word.`,\n invalidWordIndex: i,\n invalidWord: word,\n };\n }\n\n // Check for numbers or special characters in words\n if (!/^[a-z]+$/.test(word)) {\n return {\n valid: false,\n error: `Word \"${word}\" at position ${i + 1} contains invalid characters. Words should only contain letters.`,\n invalidWordIndex: i,\n invalidWord: word,\n };\n }\n }\n\n return { valid: true, normalizedSeed };\n }\n\n /**\n * Validate a BIP-39 seed phrase (basic validation)\n * @deprecated Use validateSeedPhraseDetailed for better error messages\n */\n static validateSeedPhrase(seed: string): boolean {\n const result = this.validateSeedPhraseDetailed(seed);\n return result.valid;\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","import { Wallet, HDNodeWallet, formatEther, parseEther } from 'ethers';\nimport { createPublicClient, http, formatEther as viemFormatEther, getAddress } 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, USDT_ADDRESSES, 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 * Convert TON user-friendly address (EQ.../UQ.../kQ...) to raw format (0:hex).\n * If the address is already in raw format, returns it as-is.\n */\nfunction tonFriendlyToRaw(addr: string): string {\n // Already raw format\n if (addr.includes(':')) return addr;\n\n try {\n // Base64url decode: replace -/_ with +/ then decode\n const b64 = addr.replace(/-/g, '+').replace(/_/g, '/');\n const bytes = Uint8Array.from(atob(b64), c => c.charCodeAt(0));\n // Bytes: [flags(1), workchain(1), hash(32), crc(2)] = 36 bytes\n if (bytes.length !== 36) return addr;\n const workchain = bytes[1] === 0xff ? -1 : bytes[1];\n const hash = Array.from(bytes.slice(2, 34)).map(b => b.toString(16).padStart(2, '0')).join('');\n return `${workchain}:${hash}`;\n } catch {\n return addr;\n }\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 tokenBalances?: Record<string, { balance: string; balanceUsd: number }>;\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 /** Access token for authenticated API requests */\n accessToken?: 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' | 'accessToken'>> & { enabledChains: NetworkType[]; accessToken?: string };\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 || 'mainnet',\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 accessToken: config.accessToken,\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 // Normalize the seed phrase first\n const normalizedSeed = KeyManager.normalizeSeedPhrase(seed);\n\n // Validate with detailed error messages\n const validation = KeyManager.validateSeedPhraseDetailed(normalizedSeed);\n if (!validation.valid) {\n throw new Error(validation.error || 'Invalid seed phrase');\n }\n\n // Try to derive address - this will throw a specific error if any word is invalid\n let address: string;\n try {\n address = WalletManager.deriveAddress(normalizedSeed);\n } catch (error: any) {\n // Parse ethers.js error to give a more helpful message\n const errorMessage = error.message || '';\n const match = errorMessage.match(/invalid mnemonic word at index (\\d+)/i);\n if (match) {\n const wordIndex = parseInt(match[1], 10);\n const words = normalizedSeed.split(' ');\n const invalidWord = words[wordIndex] || 'unknown';\n throw new Error(\n `Invalid word \"${invalidWord}\" at position ${wordIndex + 1}. ` +\n `Please check your seed phrase for typos.`\n );\n }\n throw new Error(`Invalid seed phrase: ${errorMessage}`);\n }\n\n // Encrypt and store the normalized seed\n const encrypted = await KeyManager.encryptSeed(normalizedSeed, password);\n await this.storage.setItem(STORAGE_KEYS.ENCRYPTED_SEED, encrypted);\n\n this.currentSeed = normalizedSeed;\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 * Set access token for authenticated API requests\n * This allows updating the token after initialization (e.g., after login)\n */\n setAccessToken(token: string | undefined): void {\n (this.config as { accessToken?: string }).accessToken = token;\n }\n\n /**\n * Get current access token\n */\n getAccessToken(): string | undefined {\n return this.config.accessToken;\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' = 'mainnet',\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 const tokenBalances: Record<string, { balance: string; balanceUsd: number }> = {};\n\n // Fetch balance based on chain type\n if (chain === 'ethereum') {\n const viemChain = this.config.network === 'mainnet' ? mainnet : sepolia;\n const isTestnet = this.config.network !== 'mainnet';\n\n const client = createPublicClient({\n chain: viemChain,\n transport: http(this.config.rpcUrl, {\n timeout: 15000,\n retryCount: 2,\n retryDelay: 1000,\n }),\n });\n\n // Fetch ETH native balance and USDT ERC-20 balance in parallel\n const usdtAddr = USDT_ADDRESSES.ethereum?.[isTestnet ? 'testnet' : 'mainnet'];\n\n // ERC-20 balanceOf ABI for readContract\n const erc20BalanceOfAbi = [{\n type: 'function' as const,\n name: 'balanceOf',\n stateMutability: 'view' as const,\n inputs: [{ name: 'account', type: 'address' }],\n outputs: [{ name: '', type: 'uint256' }],\n }];\n\n // Normalize addresses to EIP-55 checksum format (viem is strict about this)\n const checksumAddr = getAddress(address);\n\n const [ethResult, usdtResult] = await Promise.allSettled([\n client.getBalance({ address: checksumAddr }),\n usdtAddr\n ? client.readContract({\n address: getAddress(usdtAddr),\n abi: erc20BalanceOfAbi,\n functionName: 'balanceOf',\n args: [checksumAddr],\n })\n : Promise.resolve(null),\n ]);\n\n if (ethResult.status === 'fulfilled') {\n balance = viemFormatEther(ethResult.value);\n } else {\n console.error(`[WalletManager] Failed to fetch ETH balance:`, ethResult.reason);\n }\n\n if (usdtResult.status === 'fulfilled' && usdtResult.value != null) {\n try {\n const rawUsdt = BigInt(usdtResult.value as bigint);\n const usdtAmount = Number(rawUsdt) / 1_000_000; // USDT has 6 decimals\n if (usdtAmount > 0) {\n tokenBalances.USDT = { balance: usdtAmount.toFixed(6), balanceUsd: usdtAmount };\n }\n } catch (err) {\n console.warn('[WalletManager] Failed to parse ETH USDT balance:', err);\n }\n } else if (usdtResult.status === 'rejected') {\n console.warn('[WalletManager] Failed to fetch ETH USDT balance:', usdtResult.reason);\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\n // Fetch USDT SPL token balance\n const isTestnet = this.config.network !== 'mainnet';\n const usdtMint = USDT_ADDRESSES.solana?.[isTestnet ? 'testnet' : 'mainnet'];\n if (usdtMint) {\n try {\n const tokenResponse = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 2,\n method: 'getTokenAccountsByOwner',\n params: [\n address,\n { mint: usdtMint },\n { encoding: 'jsonParsed' },\n ],\n }),\n });\n\n if (tokenResponse.ok) {\n const tokenData = await tokenResponse.json();\n const accounts = tokenData.result?.value;\n if (accounts && accounts.length > 0) {\n const uiAmount = accounts[0].account?.data?.parsed?.info?.tokenAmount?.uiAmount;\n if (uiAmount && uiAmount > 0) {\n tokenBalances.USDT = { balance: uiAmount.toFixed(6), balanceUsd: uiAmount };\n }\n }\n }\n } catch (error) {\n console.warn('Failed to fetch Solana USDT balance:', error);\n }\n }\n } else if (chain === 'tron') {\n // TRON: Use TronGrid API (Nile testnet for testnet, mainnet for production)\n const tronConfig = getNetworkConfig('tron', this.config.network !== 'mainnet');\n const baseUrl = tronConfig.rpcUrl;\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 // Parse TRC-20 USDT balance from the same response\n const isTestnet = this.config.network !== 'mainnet';\n const usdtAddr = USDT_ADDRESSES.tron?.[isTestnet ? 'testnet' : 'mainnet'];\n if (usdtAddr && data.data?.[0]?.trc20) {\n const trc20List = data.data[0].trc20 as Record<string, string>[];\n for (const tokenObj of trc20List) {\n if (tokenObj[usdtAddr]) {\n const rawUsdtBalance = BigInt(tokenObj[usdtAddr]);\n const usdtAmount = Number(rawUsdtBalance) / 1_000_000; // USDT has 6 decimals\n if (usdtAmount > 0) {\n tokenBalances.USDT = { balance: usdtAmount.toFixed(6), balanceUsd: usdtAmount };\n }\n break;\n }\n }\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 isTestnet = this.config.network !== 'mainnet';\n const baseUrl = isTestnet\n ? 'https://testnet.toncenter.com/api/v2'\n : 'https://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\n // Fetch USDT jetton balance via tonapi.io (more reliable than toncenter v3)\n const usdtJetton = USDT_ADDRESSES.ton?.[isTestnet ? 'testnet' : 'mainnet'];\n if (usdtJetton) {\n const tonapiBaseUrl = isTestnet\n ? 'https://testnet.tonapi.io/v2'\n : 'https://tonapi.io/v2';\n try {\n // Convert user-friendly TON address to raw format for the API\n // User-friendly: EQ.../UQ... -> raw: 0:hex\n const rawAddr = tonFriendlyToRaw(address);\n const jettonResponse = await fetch(\n `${tonapiBaseUrl}/accounts/${encodeURIComponent(rawAddr)}/jettons?currencies=usd`,\n { headers: { 'Accept': 'application/json' } }\n );\n\n if (jettonResponse.ok) {\n const jettonData = await jettonResponse.json();\n const balances = jettonData.balances;\n if (balances && balances.length > 0) {\n // Find USDT jetton in the list\n for (const jb of balances) {\n const jettonAddr = jb.jetton?.address;\n // Compare raw addresses (tonapi returns raw format)\n if (jettonAddr) {\n const usdtRaw = tonFriendlyToRaw(usdtJetton);\n if (jettonAddr.toLowerCase() === usdtRaw.toLowerCase()) {\n const rawBalance = jb.balance;\n if (rawBalance) {\n const decimals = jb.jetton?.decimals || 6;\n const usdtAmount = Number(BigInt(rawBalance)) / Math.pow(10, decimals);\n if (usdtAmount > 0) {\n tokenBalances.USDT = { balance: usdtAmount.toFixed(6), balanceUsd: usdtAmount };\n }\n }\n break;\n }\n }\n }\n }\n }\n } catch (error) {\n console.warn('Failed to fetch TON USDT jetton balance:', error);\n }\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 ...(Object.keys(tokenBalances).length > 0 ? { tokenBalances } : {}),\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 // Build headers with optional Authorization\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (this.config.accessToken) {\n headers['Authorization'] = `Bearer ${this.config.accessToken}`;\n }\n\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,\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 // Build headers with optional Authorization\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (this.config.accessToken) {\n headers['Authorization'] = `Bearer ${this.config.accessToken}`;\n }\n\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/estimate-fee`, {\n method: 'POST',\n headers,\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","/**\n * React hooks for WalletManager\n *\n * These hooks provide a React-friendly interface to the WalletManager class.\n * They handle state management, loading states, and error handling.\n */\n\nimport { useState, useCallback, useEffect, useMemo } from 'react';\nimport {\n WalletManager,\n SUPPORTED_CHAINS,\n type WalletState,\n type WalletManagerConfig,\n type ChainBalance,\n type MultiChainAddresses,\n} from '../wallet';\nimport type { NetworkType } from '../types';\n\nexport interface UseWalletManagerOptions extends WalletManagerConfig {\n autoCheckWallet?: boolean;\n /** Access token for authenticated API requests (can be updated via setAccessToken) */\n accessToken?: string;\n}\n\n/** Transaction result from sendTransaction */\nexport interface SendTransactionResult {\n success: boolean;\n txHash?: string;\n from?: string;\n to?: string;\n amount?: string;\n chain?: NetworkType;\n error?: string;\n}\n\n/** Fee estimation result */\nexport interface FeeEstimateResult {\n success: boolean;\n fee?: string;\n feeUsd?: number;\n error?: string;\n}\n\nexport interface UseWalletManagerReturn {\n // State\n state: WalletState;\n isLoading: boolean;\n error: string | null;\n\n // Basic Actions\n createWallet: (password: string) => Promise<{ seed: string; address: string }>;\n importWallet: (seed: string, password: string) => Promise<void>;\n unlock: (password: string) => Promise<void>;\n lock: () => void;\n deleteWallet: () => Promise<void>;\n fetchBalance: () => Promise<string>;\n\n // Multi-chain Actions\n selectedChain: NetworkType;\n setSelectedChain: (chain: NetworkType) => void;\n chainBalances: ChainBalance[];\n fetchAllBalances: () => Promise<ChainBalance[]>;\n getAddressForChain: (chain: NetworkType) => string | null;\n getAllAddresses: () => Partial<MultiChainAddresses>;\n supportedChains: NetworkType[];\n\n // Transaction Actions (Powered by Tether WDK)\n sendTransaction: (chain: NetworkType, to: string, amount: string, token?: string) => Promise<SendTransactionResult>;\n estimateFee: (chain: NetworkType, to: string, amount: string, token?: string) => Promise<FeeEstimateResult>;\n\n // Authentication\n setAccessToken: (token: string | undefined) => void;\n getAccessToken: () => string | undefined;\n\n // Utilities\n hasWallet: () => Promise<boolean>;\n getSeed: () => string | null;\n manager: WalletManager;\n}\n\n/**\n * React hook for managing a WDK wallet with multi-chain support\n */\nexport function useWalletManager(\n options: UseWalletManagerOptions = {}\n): UseWalletManagerReturn {\n const { autoCheckWallet = true, accessToken, ...config } = options;\n\n // Create manager instance (memoized)\n const manager = useMemo(() => new WalletManager({ ...config, accessToken }), [\n config.network,\n config.rpcUrl,\n // Note: accessToken is handled separately via setAccessToken to avoid recreating manager\n ]);\n\n // State\n const [state, setState] = useState<WalletState>({\n isInitialized: false,\n isLocked: true,\n address: null,\n balance: null,\n });\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [selectedChain, setSelectedChainState] = useState<NetworkType>('ethereum');\n const [chainBalances, setChainBalances] = useState<ChainBalance[]>([]);\n\n // Update state from manager\n const updateState = useCallback(() => {\n setState(manager.getExtendedState());\n }, [manager]);\n\n // Check if wallet exists on mount\n useEffect(() => {\n if (autoCheckWallet) {\n manager.hasWallet().then((exists) => {\n if (exists) {\n setState((prev) => ({\n ...prev,\n isInitialized: true,\n isLocked: true,\n }));\n }\n });\n }\n }, [manager, autoCheckWallet]);\n\n // Update access token when it changes\n useEffect(() => {\n manager.setAccessToken(accessToken);\n }, [manager, accessToken]);\n\n // Set access token (for dynamic updates after login)\n const setAccessToken = useCallback(\n (token: string | undefined) => {\n manager.setAccessToken(token);\n },\n [manager]\n );\n\n // Get current access token\n const getAccessToken = useCallback(() => manager.getAccessToken(), [manager]);\n\n // Create new wallet\n const createWallet = useCallback(\n async (password: string) => {\n setIsLoading(true);\n setError(null);\n try {\n // Initialize storage for web\n await manager.initializeStorage(password);\n const result = await manager.createWallet(password);\n // Derive addresses for all chains using Tether WDK (async)\n // Falls back to sync derivation if WDK is not available\n try {\n await manager.deriveAllAddressesAsync();\n } catch {\n manager.deriveAllAddresses();\n }\n updateState();\n // Fetch balances for all chains after create\n try {\n const balances = await manager.fetchAllBalances();\n setChainBalances(balances);\n } catch (err) {\n console.warn('Failed to fetch balances after create:', err);\n }\n return result;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to create wallet';\n setError(message);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [manager, updateState]\n );\n\n // Import existing wallet\n const importWallet = useCallback(\n async (seed: string, password: string) => {\n setIsLoading(true);\n setError(null);\n try {\n await manager.initializeStorage(password);\n await manager.importWallet(seed, password);\n // Derive addresses for all chains using Tether WDK (async)\n try {\n await manager.deriveAllAddressesAsync();\n } catch {\n manager.deriveAllAddresses();\n }\n updateState();\n // Fetch balances for all chains after import\n try {\n const balances = await manager.fetchAllBalances();\n setChainBalances(balances);\n } catch (err) {\n console.warn('Failed to fetch balances after import:', err);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to import wallet';\n setError(message);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [manager, updateState]\n );\n\n // Unlock wallet\n const unlock = useCallback(\n async (password: string) => {\n setIsLoading(true);\n setError(null);\n try {\n await manager.initializeStorage(password);\n await manager.unlock(password);\n // Derive addresses for all chains using Tether WDK (async)\n try {\n await manager.deriveAllAddressesAsync();\n } catch {\n manager.deriveAllAddresses();\n }\n updateState();\n // Fetch balances for all chains after unlock\n try {\n const balances = await manager.fetchAllBalances();\n setChainBalances(balances);\n } catch (err) {\n console.warn('Failed to fetch balances after unlock:', err);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Invalid password';\n setError(message);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [manager, updateState]\n );\n\n // Lock wallet\n const lock = useCallback(() => {\n manager.lock();\n setChainBalances([]);\n updateState();\n }, [manager, updateState]);\n\n // Delete wallet\n const deleteWallet = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n await manager.deleteWallet();\n setChainBalances([]);\n setState({\n isInitialized: false,\n isLocked: true,\n address: null,\n balance: null,\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to delete wallet';\n setError(message);\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, [manager]);\n\n // Fetch balance (for selected chain)\n const fetchBalance = useCallback(async () => {\n setIsLoading(true);\n // Don't clear error here - balance fetch errors shouldn't clear previous errors\n try {\n const balance = await manager.fetchBalance();\n setState((prev) => ({ ...prev, balance }));\n return balance;\n } catch (err) {\n // Log warning but don't throw - balance fetch errors shouldn't block UI\n console.warn('Failed to fetch balance:', err);\n // Return '0' instead of throwing to not block wallet operations\n setState((prev) => ({ ...prev, balance: '0' }));\n return '0';\n } finally {\n setIsLoading(false);\n }\n }, [manager]);\n\n // Fetch all chain balances\n const fetchAllBalances = useCallback(async () => {\n setIsLoading(true);\n // Don't clear error here - balance fetch errors shouldn't clear previous errors\n try {\n const balances = await manager.fetchAllBalances();\n setChainBalances(balances);\n return balances;\n } catch (err) {\n // Log warning but don't throw - balance fetch errors shouldn't block UI\n console.warn('Failed to fetch all balances:', err);\n // Return empty array instead of throwing\n return [];\n } finally {\n setIsLoading(false);\n }\n }, [manager]);\n\n // Set selected chain\n const setSelectedChain = useCallback((chain: NetworkType) => {\n manager.setSelectedChain(chain);\n setSelectedChainState(chain);\n }, [manager]);\n\n // Get address for chain\n const getAddressForChain = useCallback(\n (chain: NetworkType) => manager.getAddressForChain(chain),\n [manager]\n );\n\n // Get all addresses\n const getAllAddresses = useCallback(\n () => manager.getAllAddresses(),\n [manager]\n );\n\n // Check if wallet exists\n const hasWallet = useCallback(() => manager.hasWallet(), [manager]);\n\n // Get seed (only if unlocked)\n const getSeed = useCallback(() => manager.getSeed(), [manager]);\n\n // Send transaction using Tether WDK\n const sendTransaction = useCallback(\n async (chain: NetworkType, to: string, amount: string, token?: string) => {\n setIsLoading(true);\n try {\n const result = await manager.sendTransaction(chain, to, amount, token);\n // Refresh balances after successful transaction\n if (result.success) {\n try {\n const balances = await manager.fetchAllBalances();\n setChainBalances(balances);\n } catch (err) {\n console.warn('Failed to refresh balances after transaction:', err);\n }\n }\n return result;\n } finally {\n setIsLoading(false);\n }\n },\n [manager]\n );\n\n // Estimate transaction fee using Tether WDK\n const estimateFee = useCallback(\n async (chain: NetworkType, to: string, amount: string, token?: string) => {\n return manager.estimateFee(chain, to, amount, token);\n },\n [manager]\n );\n\n return {\n state,\n isLoading,\n error,\n createWallet,\n importWallet,\n unlock,\n lock,\n deleteWallet,\n fetchBalance,\n // Multi-chain\n selectedChain,\n setSelectedChain,\n chainBalances,\n fetchAllBalances,\n getAddressForChain,\n getAllAddresses,\n supportedChains: SUPPORTED_CHAINS,\n // Transaction Actions (Powered by Tether WDK)\n sendTransaction,\n estimateFee,\n // Authentication\n setAccessToken,\n getAccessToken,\n // Utilities\n hasWallet,\n getSeed,\n manager,\n };\n}\n"]}
|