@zubari/sdk 0.5.2 → 0.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{PayoutsProtocol-B5z8SEA-.d.ts → PayoutsProtocol-DAa-9A5C.d.ts} +8 -1
- package/dist/{PayoutsProtocol-CLiMFe54.d.mts → PayoutsProtocol-DKEQhwYH.d.mts} +8 -1
- package/dist/{TransactionService-BtWUjKt_.d.ts → TransactionService-BEkgF1T6.d.ts} +12 -2
- package/dist/{TransactionService-Lr_WS6iR.d.mts → TransactionService-CF_C3Kqm.d.mts} +12 -2
- package/dist/{WalletManager-DQQwVkoa.d.ts → WalletManager-CeLlZo2y.d.ts} +23 -2
- package/dist/{WalletManager-Sbpx4E1-.d.mts → WalletManager-DIx8nENh.d.mts} +23 -2
- package/dist/{contracts-B842YprC.d.mts → contracts-JfZDzaV7.d.ts} +11 -2
- package/dist/{contracts-s_CDIruh.d.ts → contracts-pugJnFzl.d.mts} +11 -2
- package/dist/{index-CTyZlHKg.d.mts → index-c90msmwW.d.mts} +2 -1
- package/dist/{index-CTyZlHKg.d.ts → index-c90msmwW.d.ts} +2 -1
- package/dist/index.d.mts +5 -5
- package/dist/index.d.ts +5 -5
- package/dist/index.js +339 -916
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +337 -914
- package/dist/index.mjs.map +1 -1
- package/dist/protocols/index.d.mts +2 -2
- package/dist/protocols/index.d.ts +2 -2
- package/dist/protocols/index.js +24 -11
- package/dist/protocols/index.js.map +1 -1
- package/dist/protocols/index.mjs +24 -11
- package/dist/protocols/index.mjs.map +1 -1
- package/dist/react/index.d.mts +3 -3
- package/dist/react/index.d.ts +3 -3
- package/dist/react/index.js +255 -826
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +253 -824
- package/dist/react/index.mjs.map +1 -1
- package/dist/services/index.d.mts +2 -2
- package/dist/services/index.d.ts +2 -2
- package/dist/services/index.js +179 -767
- package/dist/services/index.js.map +1 -1
- package/dist/services/index.mjs +177 -765
- package/dist/services/index.mjs.map +1 -1
- package/dist/storage/index.js +5 -2
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/index.mjs +5 -2
- package/dist/storage/index.mjs.map +1 -1
- package/dist/wallet/index.d.mts +3 -3
- package/dist/wallet/index.d.ts +3 -3
- package/dist/wallet/index.js +262 -854
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/index.mjs +260 -852
- package/dist/wallet/index.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/config/contracts.ts","../../src/services/SwapService.ts","../../src/services/WdkApiClient.ts","../../src/services/ZubariApiClient.ts","../../src/services/BrowserAddressDerivation.ts","../../node_modules/@scure/base/index.ts","../../node_modules/@scure/bip32/index.ts","../../src/services/ZubariWdkService.ts","../../src/services/TransactionService.ts"],"names":["chain","DEFAULT_API_URL","sha256","secp","base58check","ripemd160","createView","concatBytes","abytes","hmac","sha512","HDNodeWallet","mnemonicToSeedSync","validateMnemonic","wordlist","generateMnemonic","errorCode","dynamicImport"],"mappings":"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","file":"index.js","sourcesContent":["import { getZubariNetwork, isMainnet } from './env';\n\n// Contract addresses for Zubari ecosystem\nexport interface ContractAddresses {\n registry: string;\n nft: string;\n nft1155: string; // ERC-1155 multi-edition NFT\n marketplace: string;\n tips: string;\n subscriptions: string;\n subscriptionsV2: string; // V2 with integrated payouts\n subscriptionsSimple: string; // Simplified subscription\n creatorRegistry: string; // Creator identity & reputation\n payouts: string;\n entryPoint: string;\n paymaster: string;\n accountFactory: string;\n usdt: string;\n weth: string;\n}\n\n// Zero address for ETH payments and placeholder addresses\nexport const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nexport const ZUBARI_CONTRACTS: Record<'testnet' | 'mainnet', ContractAddresses> = {\n testnet: {\n // Ethereum Sepolia (11155111) - Updated 2025-01-18\n // Treasury: 0xAC2e22B5a99F0123319644A9bF0DF4FD72c9b001\n // Platform Fee: 10% (1000 bps)\n registry: '0xcEd503aeD6E2F6884A7eAB4226D15477d863B084',\n nft: '0xc61497530E08897CCf518cbF9DA1A327983192E1', // ZubariNFT ERC-721 with payment\n nft1155: '0x5e618B5bEaE1dc41369E7aa235Cc3b9245905192', // Zubari1155 ERC-1155 multi-edition\n marketplace: '0x64B8fC45bB669a1bD672bD5ab76f82B7EE3B2e0f',\n tips: '0xFDc353edC63Cd3D4bba35bB43861369516a9Dc85', // ZubariTips - 10% fee\n subscriptions: '0x8C05F8aD2F295fB7f3596043a7c37C98A5F7fAB8', // ZubariSubscription - 10% fee\n subscriptionsV2: ZERO_ADDRESS,\n subscriptionsSimple: '0x944f306e7d2e4f224dd660442EB65e4021b5eC24', // Deployed 2025-01-26\n creatorRegistry: ZERO_ADDRESS,\n payouts: '0x804Fe503936E8b8d3D5Dbb62AF4fB6Fe7265Fb2c', // ZubariPayouts\n entryPoint: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n paymaster: ZERO_ADDRESS, // Deploy with: npx hardhat run deploy/deploy.ts --network ethereum-sepolia\n accountFactory: ZERO_ADDRESS, // Not yet deployed\n usdt: '0x7169D38820dfd117C3FA1f22a697dBA58d90BA06', // USDT on Sepolia (mintable test token)\n weth: '0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14',\n },\n mainnet: {\n // Ethereum Mainnet (1) - Deployed 2025-01-22\n // Owner/Treasury: Safe 0x436fE1eff6056aCc8c34d8ADe0C54B8AcF90DCAa\n // Platform Fee: 10% (1000 bps)\n registry: '0x1DA6880bc730e96cFA24d614D12012f9f81C3239',\n nft: '0x19842D60a81bd65Bd9352A380C3b37dc2E0a5731',\n nft1155: '0xDA824094c3ADdaC49e2480a699E2B21ca234BeD6',\n marketplace: '0x8B0B3383644D0d374F4E047fC37e11F00f716b3A',\n tips: '0x38D7Fc0592bCF094e1880c19a34f98c6A36b68D8',\n subscriptions: '0xDA774d657B04Ab8744bfF09D18EeAce27E3F3DEa',\n subscriptionsV2: '0x7abbaFe67941036bBF7dB7006855C55014d6012A',\n subscriptionsSimple: '0xd0C07722a29D8aC7d137e59dCA114b031B4411E8',\n creatorRegistry: '0xe5CE1Eb986f58BE42EEDFe5C18ee5956803b2BDC',\n payouts: '0x74fc8cC0B5A92c90ae35caEB0E388Ea30424cc79',\n entryPoint: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n paymaster: ZERO_ADDRESS,\n accountFactory: ZERO_ADDRESS,\n usdt: '0xdAC17F958D2ee523a2206206994597C13D831ec7', // USDT on Ethereum\n weth: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n },\n};\n\n// Platform configuration\nexport const PLATFORM_CONFIG = {\n // Platform fee in basis points (1000 = 10%)\n // Zubari keeps 10%, Creator receives 90%\n platformFeeBps: 1000,\n tipFeeBps: 1000, // Alias for backward compatibility\n // Maximum royalty in basis points (1000 = 10%)\n maxRoyaltyBps: 1000,\n // Default slippage tolerance for swaps (50 = 0.5%)\n defaultSlippageBps: 50,\n // Voucher validity in seconds (30 days)\n voucherValiditySecs: 30 * 24 * 60 * 60,\n // Swap deadline in seconds (30 minutes)\n swapDeadlineSecs: 30 * 60,\n} as const;\n\n// EIP-712 Domain for lazy minting\nexport const NFT_VOUCHER_DOMAIN = {\n name: 'ZubariNFT',\n version: '1',\n} as const;\n\nexport const NFT_VOUCHER_TYPES = {\n NFTVoucher: [\n { name: 'tokenId', type: 'bytes32' },\n { name: 'uri', type: 'string' },\n { name: 'creator', type: 'address' },\n { name: 'royaltyBps', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n // Pricing fields\n { name: 'price', type: 'uint256' },\n { name: 'currency', type: 'address' },\n { name: 'nonce', type: 'uint256' },\n // Watermarking fields\n { name: 'contentHash', type: 'bytes32' },\n { name: 'userId', type: 'bytes32' },\n { name: 'watermarkTimestamp', type: 'uint256' },\n { name: 'sessionId', type: 'bytes32' },\n ],\n} as const;\n\n// EIP-712 Domain for ERC-1155 edition minting\nexport const EDITION_VOUCHER_DOMAIN = {\n name: 'Zubari1155',\n version: '1',\n} as const;\n\n// EIP-712 Types for EditionVoucher (ERC-1155)\nexport const EDITION_VOUCHER_TYPES = {\n EditionVoucher: [\n { name: 'tokenId', type: 'bytes32' },\n { name: 'uri', type: 'string' },\n { name: 'creator', type: 'address' },\n { name: 'maxSupply', type: 'uint256' },\n { name: 'royaltyBps', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n} as const;\n\n// Currency addresses per network\nexport const CURRENCY_ADDRESSES = {\n testnet: {\n ETH: ZERO_ADDRESS,\n USDT: '0x7169D38820dfd117C3FA1f22a697dBA58d90BA06', // USDT on Sepolia (Test Tether USD)\n },\n mainnet: {\n ETH: ZERO_ADDRESS,\n USDT: '0xdAC17F958D2ee523a2206206994597C13D831ec7', // USDT on Ethereum\n },\n} as const;\n\nexport function getContractAddresses(network: 'testnet' | 'mainnet'): ContractAddresses {\n return ZUBARI_CONTRACTS[network];\n}\n\n// Multi-chain Fee/Treasury Wallet Addresses\n// These wallets receive platform fees from transactions on their respective chains\nexport interface FeeWalletConfig {\n address: string;\n name: string;\n network: string;\n chainId?: number;\n}\n\nexport type SupportedFeeChain = 'ETH' | 'BTC' | 'SOLANA' | 'TON' | 'TRON';\n\n/**\n * Mainnet Fee Wallet Addresses\n * These are the production treasury wallets for collecting platform fees (10%)\n * Updated: 2025-01-18\n */\nexport const MAINNET_FEE_WALLETS: Record<SupportedFeeChain, FeeWalletConfig> = {\n // Ethereum (ETH, ERC-20 tokens like USDT)\n ETH: {\n address: '0x40Df60a57d02a7bB04B6624c65E2908Cc006badE',\n name: 'Zubari ETH Treasury',\n network: 'ethereum',\n chainId: 1,\n },\n // Bitcoin\n BTC: {\n address: 'bc1qh20fx23wk34pcm3zp0v9wctwprtl02uvh6q9qj',\n name: 'Zubari BTC Treasury',\n network: 'bitcoin',\n },\n // Solana (SOL, SPL tokens)\n SOLANA: {\n address: '2hXGumVRpD5KgdqNZUuYJ2YoyLR6jc8mvWbubciWjPuZ',\n name: 'Zubari Solana Treasury',\n network: 'solana',\n },\n // TON (The Open Network)\n TON: {\n address: 'UQB5hOrm9YGoKjrCVmvAUFgmApkvKWqVMROjieKs3z4kDz99',\n name: 'Zubari TON Treasury',\n network: 'ton',\n },\n // Tron (TRX, TRC-20 tokens like USDT)\n TRON: {\n address: 'TVBPjQFNe8JgVctDKWMxJNgjbPZoP6uu5h',\n name: 'Zubari Tron Treasury',\n network: 'tron',\n },\n} as const;\n\n/**\n * Testnet Fee Wallet Addresses\n * These are used for development and testing\n */\nexport const TESTNET_FEE_WALLETS: Record<SupportedFeeChain, FeeWalletConfig> = {\n // Ethereum Sepolia\n ETH: {\n address: '0xAC2e22B5a99F0123319644A9bF0DF4FD72c9b001', // Zubari Treasury on Sepolia\n name: 'Zubari ETH Testnet Treasury',\n network: 'sepolia',\n chainId: 11155111,\n },\n // Bitcoin Testnet\n BTC: {\n address: '',\n name: 'Zubari BTC Testnet Treasury',\n network: 'bitcoin-testnet',\n },\n // Solana Devnet\n SOLANA: {\n address: '',\n name: 'Zubari Solana Devnet Treasury',\n network: 'solana-devnet',\n },\n // TON Testnet\n TON: {\n address: '',\n name: 'Zubari TON Testnet Treasury',\n network: 'ton-testnet',\n },\n // Tron Nile Testnet\n TRON: {\n address: '',\n name: 'Zubari Tron Testnet Treasury',\n network: 'tron-nile',\n },\n} as const;\n\n/**\n * Get fee wallet address for a specific chain\n * @param chain - The blockchain network\n * @param isMainnet - Whether to use mainnet addresses (default: false for testnet)\n */\nexport function getFeeWallet(chain: SupportedFeeChain, isMainnet: boolean = true): FeeWalletConfig {\n return isMainnet ? MAINNET_FEE_WALLETS[chain] : TESTNET_FEE_WALLETS[chain];\n}\n\n/**\n * Get all fee wallets for a network type\n * @param isMainnet - Whether to use mainnet addresses\n */\nexport function getAllFeeWallets(useMainnet: boolean = false): Record<SupportedFeeChain, FeeWalletConfig> {\n return useMainnet ? MAINNET_FEE_WALLETS : TESTNET_FEE_WALLETS;\n}\n\n// =============================================================================\n// Environment-aware helpers (read from ZUBARI_NETWORK env var)\n// =============================================================================\n\n/**\n * Default contract to use for subscriptions\n * subscriptionsSimple is the recommended contract as it works on both networks\n */\nexport const DEFAULT_CONTRACTS = {\n subscriptions: 'subscriptionsSimple' as const,\n} as const;\n\n/**\n * Get contract addresses for the current network environment\n * Reads ZUBARI_NETWORK from environment variables\n * @returns Contract addresses for testnet or mainnet based on env\n */\nexport function getCurrentContractAddresses(): ContractAddresses {\n return ZUBARI_CONTRACTS[getZubariNetwork()];\n}\n\n/**\n * Get the default subscription contract address (subscriptionsSimple)\n * This is the recommended contract for subscriptions as it works on both networks\n * @returns The subscriptionsSimple contract address for the current network\n */\nexport function getDefaultSubscriptionAddress(): string {\n return ZUBARI_CONTRACTS[getZubariNetwork()].subscriptionsSimple;\n}\n\n/**\n * Get fee wallets for the current network environment\n * Reads ZUBARI_NETWORK from environment variables\n * @returns Fee wallet configurations for the current network\n */\nexport function getCurrentFeeWallets(): Record<SupportedFeeChain, FeeWalletConfig> {\n return isMainnet() ? MAINNET_FEE_WALLETS : TESTNET_FEE_WALLETS;\n}\n\n/**\n * Get a specific fee wallet for the current network environment\n * @param chain - The blockchain to get the fee wallet for\n * @returns Fee wallet configuration for the specified chain\n */\nexport function getCurrentFeeWallet(chain: SupportedFeeChain): FeeWalletConfig {\n return getCurrentFeeWallets()[chain];\n}\n\n/**\n * Get currency addresses for the current network environment\n * @returns Currency addresses (ETH, USDT) for the current network\n */\nexport function getCurrentCurrencyAddresses(): { ETH: string; USDT: string } {\n return CURRENCY_ADDRESSES[getZubariNetwork()];\n}\n","import type { SwapQuote, TxResult, TokenInfo } from '../types';\nimport { PLATFORM_CONFIG, getContractAddresses } from '../config/contracts';\n\n// Uniswap V3 contract addresses (Ethereum mainnet)\nconst UNISWAP_ADDRESSES = {\n mainnet: {\n swapRouter: '0xE592427A0AEce92De3Edee1F18E0157C05861564',\n quoter: '0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6',\n factory: '0x1F98431c8aD98523631AE4a59f267346ea31F984',\n },\n sepolia: {\n swapRouter: '0x3bFA4769FB09eefC5a80d6E87c3B9C650f7Ae48E',\n quoter: '0xEd1f6473345F45b75F8179591dd5bA1888cf2FB3',\n factory: '0x0227628f3F023bb0B980b67D528571c95c6DaC1c',\n },\n};\n\n// Uniswap V3 function selectors\nconst UNISWAP_SELECTORS = {\n quoteExactInputSingle: '0xf7729d43', // quoteExactInputSingle(address,address,uint24,uint256,uint160)\n exactInputSingle: '0x414bf389', // exactInputSingle((address,address,uint24,address,uint256,uint256,uint256,uint160))\n};\n\n// Common token addresses\nconst TOKENS = {\n mainnet: {\n WETH: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n USDT: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\n USDC: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n },\n sepolia: {\n WETH: '0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14',\n USDT: '0x7169D38820dfd117C3FA1f22a697dBA58d90BA06',\n USDC: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238',\n },\n};\n\n// Zero address for native ETH\nconst ETH_ADDRESS = '0x0000000000000000000000000000000000000000';\n\n/**\n * SwapService - DEX integration via Uniswap V3\n *\n * Handles token swaps with slippage protection,\n * quote fetching, and earnings conversion.\n */\nexport class SwapService {\n private readonly chainId: number;\n private readonly isTestnet: boolean;\n private readonly addresses: typeof UNISWAP_ADDRESSES.mainnet;\n private readonly tokens: typeof TOKENS.mainnet;\n\n constructor(chainId: number, isTestnet: boolean = false) {\n this.chainId = chainId;\n this.isTestnet = isTestnet;\n this.addresses = isTestnet ? UNISWAP_ADDRESSES.sepolia : UNISWAP_ADDRESSES.mainnet;\n this.tokens = isTestnet ? TOKENS.sepolia : TOKENS.mainnet;\n }\n\n /**\n * Get a swap quote from Uniswap V3 Quoter\n */\n async getQuote(\n tokenIn: string,\n tokenOut: string,\n amountIn: bigint,\n provider?: { call: (tx: object) => Promise<string> }\n ): Promise<SwapQuote> {\n if (amountIn <= 0n) {\n throw new Error('Amount must be greater than 0');\n }\n\n // Convert ETH address to WETH\n const actualTokenIn = tokenIn === ETH_ADDRESS ? this.tokens.WETH : tokenIn;\n const actualTokenOut = tokenOut === ETH_ADDRESS ? this.tokens.WETH : tokenOut;\n\n if (!provider) {\n // Return estimate without actual quote\n console.warn('No provider for quote, returning estimate');\n return {\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: amountIn * BigInt(95) / BigInt(100), // Rough estimate\n priceImpact: 0.5,\n route: [tokenIn, tokenOut],\n estimatedGas: BigInt(150000),\n };\n }\n\n try {\n // Encode quoteExactInputSingle call\n // quoteExactInputSingle(address tokenIn, address tokenOut, uint24 fee, uint256 amountIn, uint160 sqrtPriceLimitX96)\n const encodedTokenIn = actualTokenIn.toLowerCase().replace('0x', '').padStart(64, '0');\n const encodedTokenOut = actualTokenOut.toLowerCase().replace('0x', '').padStart(64, '0');\n const encodedFee = (3000).toString(16).padStart(64, '0'); // 0.3% fee tier\n const encodedAmountIn = amountIn.toString(16).padStart(64, '0');\n const encodedSqrtPriceLimit = '0'.padStart(64, '0'); // No price limit\n\n const data = `${UNISWAP_SELECTORS.quoteExactInputSingle}${encodedTokenIn}${encodedTokenOut}${encodedFee}${encodedAmountIn}${encodedSqrtPriceLimit}`;\n\n const result = await provider.call({\n to: this.addresses.quoter,\n data,\n });\n\n // Decode the result (uint256 amountOut)\n const amountOut = BigInt(result);\n\n // Calculate price impact\n const priceImpact = this.calculatePriceImpact(amountIn, amountOut, tokenIn, tokenOut);\n\n return {\n tokenIn,\n tokenOut,\n amountIn,\n amountOut,\n priceImpact,\n route: [tokenIn, tokenOut],\n estimatedGas: BigInt(150000),\n };\n } catch (error) {\n console.error('Failed to get quote:', error);\n throw new Error(`Quote failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Execute a swap with slippage protection via Uniswap V3 SwapRouter\n */\n async executeSwap(\n quote: SwapQuote,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> },\n recipient: string,\n slippageToleranceBps: number = PLATFORM_CONFIG.defaultSlippageBps\n ): Promise<TxResult> {\n // Calculate minimum output with slippage\n const minAmountOut = quote.amountOut - (quote.amountOut * BigInt(slippageToleranceBps)) / BigInt(10000);\n\n // Calculate deadline\n const deadline = Math.floor(Date.now() / 1000) + PLATFORM_CONFIG.swapDeadlineSecs;\n\n // Warn if price impact is high\n if (quote.priceImpact > 5) {\n console.warn(`High price impact: ${quote.priceImpact}%`);\n }\n\n // Convert ETH address to WETH for router\n const actualTokenIn = quote.tokenIn === ETH_ADDRESS ? this.tokens.WETH : quote.tokenIn;\n const actualTokenOut = quote.tokenOut === ETH_ADDRESS ? this.tokens.WETH : quote.tokenOut;\n const isETHIn = quote.tokenIn === ETH_ADDRESS;\n\n try {\n // Encode exactInputSingle call\n // struct ExactInputSingleParams {\n // address tokenIn;\n // address tokenOut;\n // uint24 fee;\n // address recipient;\n // uint256 deadline;\n // uint256 amountIn;\n // uint256 amountOutMinimum;\n // uint160 sqrtPriceLimitX96;\n // }\n const encodedTokenIn = actualTokenIn.toLowerCase().replace('0x', '').padStart(64, '0');\n const encodedTokenOut = actualTokenOut.toLowerCase().replace('0x', '').padStart(64, '0');\n const encodedFee = (3000).toString(16).padStart(64, '0');\n const encodedRecipient = recipient.toLowerCase().replace('0x', '').padStart(64, '0');\n const encodedDeadline = deadline.toString(16).padStart(64, '0');\n const encodedAmountIn = quote.amountIn.toString(16).padStart(64, '0');\n const encodedMinAmountOut = minAmountOut.toString(16).padStart(64, '0');\n const encodedSqrtPriceLimit = '0'.padStart(64, '0');\n\n const data = `${UNISWAP_SELECTORS.exactInputSingle}${encodedTokenIn}${encodedTokenOut}${encodedFee}${encodedRecipient}${encodedDeadline}${encodedAmountIn}${encodedMinAmountOut}${encodedSqrtPriceLimit}`;\n\n const tx = await signer.sendTransaction({\n to: this.addresses.swapRouter,\n data,\n value: isETHIn ? `0x${quote.amountIn.toString(16)}` : '0x0',\n });\n\n return {\n hash: tx.hash,\n network: 'ethereum',\n status: 'pending',\n metadata: {\n tokenIn: quote.tokenIn,\n tokenOut: quote.tokenOut,\n amountIn: quote.amountIn.toString(),\n minAmountOut: minAmountOut.toString(),\n deadline,\n },\n };\n } catch (error) {\n console.error('Failed to execute swap:', error);\n throw new Error(`Swap failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Convert earnings to USDT, keeping some ETH for gas\n */\n async convertEarningsToStable(\n ethBalance: bigint,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> },\n recipient: string,\n provider?: { call: (tx: object) => Promise<string> },\n reserveForGas: bigint = BigInt('10000000000000000') // 0.01 ETH\n ): Promise<TxResult> {\n const amountToSwap = ethBalance - reserveForGas;\n\n if (amountToSwap <= 0n) {\n throw new Error('Insufficient balance after gas reserve');\n }\n\n // Get quote for ETH -> USDT\n const quote = await this.getQuote(\n ETH_ADDRESS,\n this.tokens.USDT,\n amountToSwap,\n provider\n );\n\n return this.executeSwap(quote, signer, recipient);\n }\n\n /**\n * Check if a swap route exists\n */\n async hasRoute(\n tokenIn: string,\n tokenOut: string,\n provider?: { call: (tx: object) => Promise<string> }\n ): Promise<boolean> {\n try {\n const quote = await this.getQuote(tokenIn, tokenOut, BigInt(10 ** 18), provider);\n return quote.amountOut > 0n;\n } catch {\n return false;\n }\n }\n\n /**\n * Get supported tokens for swapping\n */\n async getSupportedTokens(): Promise<TokenInfo[]> {\n return [\n { address: ETH_ADDRESS, symbol: 'ETH', decimals: 18, name: 'Ether' },\n { address: this.tokens.WETH, symbol: 'WETH', decimals: 18, name: 'Wrapped Ether' },\n { address: this.tokens.USDT, symbol: 'USDT', decimals: 6, name: 'Tether USD' },\n { address: this.tokens.USDC, symbol: 'USDC', decimals: 6, name: 'USD Coin' },\n ];\n }\n\n /**\n * Get Uniswap router address for approvals\n */\n getRouterAddress(): string {\n return this.addresses.swapRouter;\n }\n\n /**\n * Calculate price impact (simplified)\n */\n private calculatePriceImpact(\n amountIn: bigint,\n amountOut: bigint,\n _tokenIn: string,\n _tokenOut: string\n ): number {\n // Simplified price impact calculation\n // In production, would compare to oracle price\n if (amountIn === 0n || amountOut === 0n) return 0;\n\n // Assume 1:1 ratio for ETH:stablecoin as baseline\n // Real implementation would use price feeds\n const expectedOut = amountIn; // Simplified\n const actualRatio = Number(amountOut) / Number(expectedOut);\n const impact = (1 - actualRatio) * 100;\n\n return Math.max(0, impact);\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 * Zubari API Client\n *\n * Comprehensive client for interacting with the Zubari backend API.\n * Includes NFT, Marketplace, Tips, and Subscription operations.\n */\n\nimport type { NetworkType, NFTCurrency } from '../types';\n\nexport interface ZubariApiConfig {\n baseUrl: string;\n timeout?: number;\n authToken?: string;\n}\n\n// ============ NFT Types ============\n\nexport interface NFTVoucher {\n tokenId: string;\n uri: string;\n creator: string;\n royaltyBps: number;\n deadline: number;\n signature: string;\n price: string;\n currency: string;\n nonce: number;\n contentHash?: string;\n userId?: string;\n watermarkTimestamp?: number;\n sessionId?: string;\n}\n\nexport interface CreateVoucherRequest {\n creatorAddress: string;\n price: string;\n currency: NFTCurrency;\n}\n\nexport interface CreateVoucherResponse {\n success: boolean;\n voucher?: NFTVoucher;\n signature?: string;\n nftId?: string;\n error?: string;\n}\n\nexport interface RedeemVoucherRequest {\n buyerAddress: string;\n paymentTxHash?: string;\n}\n\nexport interface RedeemVoucherResponse {\n success: boolean;\n transactionHash?: string;\n tokenId?: string;\n owner?: string;\n nftId?: string;\n error?: string;\n}\n\nexport interface VoucherStatusResponse {\n success: boolean;\n nftId?: string;\n hasVoucher?: boolean;\n isRedeemed?: boolean;\n voucher?: NFTVoucher;\n error?: string;\n}\n\nexport interface NFTResponse {\n id: string;\n tokenId?: string;\n contractAddress?: string;\n name: string;\n description?: string;\n imageUrl?: string;\n animationUrl?: string;\n externalUrl?: string;\n attributes?: Array<{\n trait_type: string;\n value: string | number;\n }>;\n creatorId: string;\n ownerId: string;\n price?: string;\n currency?: string;\n royaltyBps: number;\n isLazyMinted: boolean;\n isMinted: boolean;\n mintedAt?: string;\n transactionHash?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateNFTRequest {\n name: string;\n description?: string;\n price: string;\n currency: NFTCurrency;\n royaltyBps?: number;\n attributes?: Array<{\n trait_type: string;\n value: string | number;\n }>;\n externalUrl?: string;\n}\n\nexport interface NFTListResponse {\n success: boolean;\n nfts?: NFTResponse[];\n pagination?: {\n page: number;\n limit: number;\n total: number;\n pages: number;\n };\n error?: string;\n}\n\n// ============ Marketplace Types ============\n\nexport interface MarketListing {\n id: string;\n nftId: string;\n nft?: NFTResponse;\n sellerId: string;\n sellerAddress: string;\n price: string;\n currency: string;\n expiresAt: string;\n status: 'ACTIVE' | 'SOLD' | 'CANCELLED' | 'EXPIRED';\n transactionHash?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ListItemRequest {\n nftId: string;\n price: string;\n currency: NFTCurrency;\n duration?: number; // Duration in seconds, default 7 days\n}\n\nexport interface ListItemResponse {\n success: boolean;\n listing?: MarketListing;\n transactionHash?: string;\n error?: string;\n}\n\nexport interface BuyItemRequest {\n listingId: string;\n buyerAddress: string;\n}\n\nexport interface BuyItemResponse {\n success: boolean;\n transactionHash?: string;\n tokenId?: string;\n newOwner?: string;\n error?: string;\n}\n\nexport interface CancelListingRequest {\n listingId: string;\n}\n\nexport interface CancelListingResponse {\n success: boolean;\n transactionHash?: string;\n error?: string;\n}\n\nexport interface UpdatePriceRequest {\n listingId: string;\n newPrice: string;\n}\n\nexport interface UpdatePriceResponse {\n success: boolean;\n listing?: MarketListing;\n transactionHash?: string;\n error?: string;\n}\n\nexport interface ListingsResponse {\n success: boolean;\n listings?: MarketListing[];\n pagination?: {\n page: number;\n limit: number;\n total: number;\n pages: number;\n };\n error?: string;\n}\n\nexport interface MarketStatsResponse {\n success: boolean;\n stats?: {\n totalListings: number;\n activeListings: number;\n totalVolume: string;\n totalSales: number;\n averagePrice: string;\n topSellers: Array<{\n address: string;\n sales: number;\n volume: string;\n }>;\n };\n error?: string;\n}\n\n// ============ Filter Types ============\n\nexport interface NFTFilters {\n creatorId?: string;\n ownerId?: string;\n isLazyMinted?: boolean;\n isMinted?: boolean;\n minPrice?: string;\n maxPrice?: string;\n currency?: NFTCurrency;\n page?: number;\n limit?: number;\n}\n\nexport interface ListingFilters {\n sellerId?: string;\n status?: 'ACTIVE' | 'SOLD' | 'CANCELLED' | 'EXPIRED';\n minPrice?: string;\n maxPrice?: string;\n currency?: NFTCurrency;\n sortBy?: 'price' | 'createdAt' | 'expiresAt';\n sortOrder?: 'asc' | 'desc';\n page?: number;\n limit?: number;\n}\n\n// ============ Tips Types ============\n\nexport interface TipUser {\n id: string;\n username?: string;\n displayName?: string;\n avatarUrl?: string;\n}\n\nexport interface Tip {\n id: string;\n senderId: string;\n recipientId?: string;\n senderAddress: string;\n recipientAddress: string;\n tokenAddress?: string;\n amount: string;\n amountUsd?: string;\n platformFee: string;\n message?: string;\n network: string;\n transactionHash?: string;\n status: 'PENDING' | 'CONFIRMED' | 'FAILED';\n createdAt: string;\n sender?: TipUser;\n recipient?: TipUser;\n}\n\nexport interface SendTipRequest {\n recipientAddress: string;\n recipientUsername?: string;\n amount: string;\n tokenAddress?: string;\n network?: string;\n message?: string;\n transactionHash?: string;\n}\n\nexport interface SendTipResponse {\n success: boolean;\n message?: string;\n tip?: Tip;\n platformFee?: string;\n platformFeeBps?: number;\n error?: string;\n}\n\nexport interface TipStatsResponse {\n success: boolean;\n sent?: {\n count: number;\n totalAmount: string;\n totalAmountUsd: string;\n };\n received?: {\n count: number;\n totalAmount: string;\n totalAmountUsd: string;\n platformFees: string;\n };\n error?: string;\n}\n\nexport interface TipsListResponse {\n success: boolean;\n tips?: Tip[];\n pagination?: {\n page: number;\n limit: number;\n total: number;\n totalPages: number;\n };\n totals?: {\n count: number;\n amount: string;\n amountUsd: string;\n };\n error?: string;\n}\n\nexport interface TipFilters {\n page?: number;\n limit?: number;\n status?: 'PENDING' | 'CONFIRMED' | 'FAILED';\n}\n\nexport interface UpdateTipStatusRequest {\n status: 'PENDING' | 'CONFIRMED' | 'FAILED';\n transactionHash?: string;\n}\n\n// ============ Subscription Types ============\n\nexport interface SubscriptionPlan {\n id: string;\n creatorId: string;\n name: string;\n description?: string;\n price: string;\n priceUsd?: string;\n paymentToken?: string;\n durationDays: number;\n perks: string[];\n nftBadge: boolean;\n maxSubscribers?: number;\n isActive: boolean;\n activeSubscribers?: number;\n createdAt: string;\n updatedAt: string;\n creator?: TipUser & { isVerified?: boolean };\n}\n\nexport interface Subscription {\n id: string;\n planId: string;\n subscriberId: string;\n creatorId: string;\n subscriberAddress?: string;\n creatorAddress?: string;\n transactionHash?: string;\n amount?: string;\n startDate: string;\n endDate: string;\n expiresAt: string;\n autoRenew: boolean;\n status: 'ACTIVE' | 'EXPIRED' | 'CANCELLED';\n createdAt: string;\n plan?: Partial<SubscriptionPlan>;\n creator?: TipUser & { isVerified?: boolean };\n subscriber?: TipUser;\n}\n\nexport interface CreatePlanRequest {\n name: string;\n description?: string;\n price: string;\n priceUsd?: number;\n paymentToken?: string;\n durationDays?: number;\n perks?: string[];\n nftBadge?: boolean;\n maxSubscribers?: number;\n}\n\nexport interface CreatePlanResponse {\n success: boolean;\n message?: string;\n plan?: SubscriptionPlan;\n error?: string;\n}\n\nexport interface SubscribeRequest {\n planId: string;\n transactionHash?: string;\n autoRenew?: boolean;\n}\n\nexport interface SubscribeResponse {\n success: boolean;\n message?: string;\n subscription?: Subscription;\n error?: string;\n}\n\nexport interface SubscriptionListResponse {\n success: boolean;\n subscriptions?: Subscription[];\n pagination?: {\n page: number;\n limit: number;\n total: number;\n totalPages: number;\n };\n stats?: {\n totalSubscribers: number;\n };\n error?: string;\n}\n\nexport interface SubscriptionFilters {\n page?: number;\n limit?: number;\n status?: 'ACTIVE' | 'EXPIRED' | 'CANCELLED';\n}\n\nexport interface ContractSubscribeRequest {\n planId: string;\n months?: number;\n seed: string;\n}\n\nexport interface ContractSubscribeResponse {\n success: boolean;\n transactionHash?: string;\n subscription?: Subscription;\n message?: string;\n error?: string;\n}\n\nexport interface ContractCreatePlanRequest {\n name: string;\n description?: string;\n price: string;\n paymentToken?: string;\n durationDays?: number;\n maxSubscribers?: number;\n seed: string;\n}\n\nexport interface ContractCreatePlanResponse {\n success: boolean;\n transactionHash?: string;\n plan?: SubscriptionPlan;\n message?: string;\n error?: string;\n}\n\nexport interface IsSubscribedResponse {\n subscriber: string;\n creator: string;\n isSubscribed: boolean;\n}\n\nexport interface PlatformFeeResponse {\n feeBps: number;\n feePercent: string;\n}\n\n// ============ Payouts Types ============\n\nexport interface EarningsResponse {\n success: boolean;\n address?: string;\n pendingEarnings?: string;\n totalEarnings?: string;\n earningsBreakdown?: {\n tips: string;\n subscriptions: string;\n nftSales: string;\n royalties: string;\n };\n recentPayouts?: Array<{\n id: string;\n amount: string;\n txHash: string;\n createdAt: string;\n }>;\n error?: string;\n}\n\nexport interface ClaimEarningsRequest {\n seed: string;\n}\n\nexport interface ClaimEarningsResponse {\n success: boolean;\n transactionHash?: string;\n amount?: string;\n message?: string;\n error?: string;\n}\n\nexport interface PayoutHistoryResponse {\n success: boolean;\n payouts?: Array<{\n id: string;\n amount: string;\n status: string;\n txHash: string;\n createdAt: string;\n confirmedAt?: string;\n }>;\n pagination?: {\n page: number;\n limit: number;\n total: number;\n pages: number;\n };\n error?: string;\n}\n\nexport interface EarningsBreakdownResponse {\n success: boolean;\n breakdown?: {\n tips: string;\n subscriptions: string;\n nftSales: string;\n royalties: string;\n total: string;\n };\n percentages?: {\n tips: string;\n subscriptions: string;\n nftSales: string;\n royalties: string;\n };\n error?: string;\n}\n\n/**\n * Zubari API Client for backend integration\n */\nexport class ZubariApiClient {\n private config: Required<Omit<ZubariApiConfig, 'authToken'>> & { authToken?: string };\n\n constructor(config: ZubariApiConfig) {\n this.config = {\n baseUrl: config.baseUrl.replace(/\\/$/, ''), // Remove trailing slash\n timeout: config.timeout || 30000,\n authToken: config.authToken,\n };\n }\n\n /**\n * Set the authentication token\n */\n setAuthToken(token: string): void {\n this.config.authToken = token;\n }\n\n /**\n * Clear the authentication token\n */\n clearAuthToken(): void {\n this.config.authToken = undefined;\n }\n\n /**\n * Make an authenticated request to the API\n */\n private async request<T>(\n method: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE',\n path: string,\n body?: unknown\n ): Promise<T> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.config.authToken) {\n headers['Authorization'] = `Bearer ${this.config.authToken}`;\n }\n\n const response = await fetch(`${this.config.baseUrl}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `HTTP ${response.status}: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n // ============ NFT Methods ============\n\n /**\n * Get all NFTs with optional filters\n */\n async getNFTs(filters?: NFTFilters): Promise<NFTListResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/nfts${queryString ? `?${queryString}` : ''}`;\n return await this.request<NFTListResponse>('GET', path);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get NFTs',\n };\n }\n }\n\n /**\n * Get a single NFT by ID\n */\n async getNFT(nftId: string): Promise<{ success: boolean; nft?: NFTResponse; error?: string }> {\n try {\n const nft = await this.request<NFTResponse>('GET', `/api/nfts/${nftId}`);\n return { success: true, nft };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get NFT',\n };\n }\n }\n\n /**\n * Create a new NFT (lazy minted)\n */\n async createNFT(\n data: CreateNFTRequest,\n image: File | Blob\n ): Promise<{ success: boolean; nft?: NFTResponse; error?: string }> {\n try {\n const formData = new FormData();\n formData.append('image', image);\n formData.append('name', data.name);\n if (data.description) formData.append('description', data.description);\n formData.append('price', data.price);\n formData.append('currency', data.currency);\n if (data.royaltyBps !== undefined) formData.append('royaltyBps', String(data.royaltyBps));\n if (data.attributes) formData.append('attributes', JSON.stringify(data.attributes));\n if (data.externalUrl) formData.append('externalUrl', data.externalUrl);\n\n const headers: Record<string, string> = {};\n if (this.config.authToken) {\n headers['Authorization'] = `Bearer ${this.config.authToken}`;\n }\n\n const response = await fetch(`${this.config.baseUrl}/api/nfts`, {\n method: 'POST',\n headers,\n body: formData,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `HTTP ${response.status}`);\n }\n\n const nft = await response.json();\n return { success: true, nft };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create NFT',\n };\n }\n }\n\n /**\n * Create a voucher for an NFT (EIP-712 signed)\n */\n async createVoucher(nftId: string, params: CreateVoucherRequest): Promise<CreateVoucherResponse> {\n try {\n return await this.request<CreateVoucherResponse>('POST', `/api/nfts/${nftId}/voucher`, params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create voucher',\n };\n }\n }\n\n /**\n * Redeem an NFT voucher (buy/mint)\n */\n async redeemVoucher(nftId: string, params: RedeemVoucherRequest): Promise<RedeemVoucherResponse> {\n try {\n return await this.request<RedeemVoucherResponse>('POST', `/api/nfts/${nftId}/redeem`, params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to redeem voucher',\n };\n }\n }\n\n /**\n * Get voucher status for an NFT\n */\n async getVoucherStatus(nftId: string): Promise<VoucherStatusResponse> {\n try {\n return await this.request<VoucherStatusResponse>('GET', `/api/nfts/${nftId}/voucher/status`);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get voucher status',\n };\n }\n }\n\n // ============ Marketplace Methods ============\n\n /**\n * Get all active listings\n */\n async getListings(filters?: ListingFilters): Promise<ListingsResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/market/listings${queryString ? `?${queryString}` : ''}`;\n return await this.request<ListingsResponse>('GET', path);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get listings',\n };\n }\n }\n\n /**\n * List an NFT for sale\n */\n async listItem(params: ListItemRequest): Promise<ListItemResponse> {\n try {\n return await this.request<ListItemResponse>('POST', '/api/market/list', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to list item',\n };\n }\n }\n\n /**\n * Buy a listed NFT\n */\n async buyItem(params: BuyItemRequest): Promise<BuyItemResponse> {\n try {\n return await this.request<BuyItemResponse>('POST', '/api/market/buy', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to buy item',\n };\n }\n }\n\n /**\n * Cancel a listing\n */\n async cancelListing(params: CancelListingRequest): Promise<CancelListingResponse> {\n try {\n return await this.request<CancelListingResponse>('POST', '/api/market/cancel', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to cancel listing',\n };\n }\n }\n\n /**\n * Update listing price\n */\n async updateListingPrice(params: UpdatePriceRequest): Promise<UpdatePriceResponse> {\n try {\n return await this.request<UpdatePriceResponse>('PATCH', '/api/market/price', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to update price',\n };\n }\n }\n\n /**\n * Get current user's listings\n */\n async getMyListings(filters?: Omit<ListingFilters, 'sellerId'>): Promise<ListingsResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/market/my/listings${queryString ? `?${queryString}` : ''}`;\n return await this.request<ListingsResponse>('GET', path);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get my listings',\n };\n }\n }\n\n /**\n * Get marketplace statistics\n */\n async getMarketStats(): Promise<MarketStatsResponse> {\n try {\n return await this.request<MarketStatsResponse>('GET', '/api/market/stats');\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get market stats',\n };\n }\n }\n\n // ============ Tips Methods ============\n\n /**\n * Send a tip to a creator\n */\n async sendTip(params: SendTipRequest): Promise<SendTipResponse> {\n try {\n return await this.request<SendTipResponse>('POST', '/api/tips', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to send tip',\n };\n }\n }\n\n /**\n * Get tip statistics for current user\n */\n async getTipStats(): Promise<TipStatsResponse> {\n try {\n const data = await this.request<{\n sent: { count: number; totalAmount: string; totalAmountUsd: string };\n received: { count: number; totalAmount: string; totalAmountUsd: string; platformFees: string };\n }>('GET', '/api/tips/my/stats');\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get tip stats',\n };\n }\n }\n\n /**\n * Get tips sent by current user\n */\n async getSentTips(filters?: TipFilters): Promise<TipsListResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/tips/sent${queryString ? `?${queryString}` : ''}`;\n const data = await this.request<{\n tips: Tip[];\n pagination: { page: number; limit: number; total: number; totalPages: number };\n totals: { count: number; amount: string; amountUsd: string };\n }>('GET', path);\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get sent tips',\n };\n }\n }\n\n /**\n * Get tips received by current user\n */\n async getReceivedTips(filters?: TipFilters): Promise<TipsListResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/tips/received${queryString ? `?${queryString}` : ''}`;\n const data = await this.request<{\n tips: Tip[];\n pagination: { page: number; limit: number; total: number; totalPages: number };\n totals: { count: number; amount: string; amountUsd: string };\n }>('GET', path);\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get received tips',\n };\n }\n }\n\n /**\n * Get a single tip by ID\n */\n async getTip(tipId: string): Promise<{ success: boolean; tip?: Tip; error?: string }> {\n try {\n const data = await this.request<{ tip: Tip }>('GET', `/api/tips/${tipId}`);\n return { success: true, tip: data.tip };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get tip',\n };\n }\n }\n\n /**\n * Update tip status (for transaction confirmation)\n */\n async updateTipStatus(\n tipId: string,\n params: UpdateTipStatusRequest\n ): Promise<{ success: boolean; tip?: Tip; message?: string; error?: string }> {\n try {\n const data = await this.request<{ message: string; tip: Tip }>(\n 'PATCH',\n `/api/tips/${tipId}/status`,\n params\n );\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to update tip status',\n };\n }\n }\n\n // ============ Subscription Methods ============\n\n /**\n * Create a new subscription plan (creator only)\n */\n async createSubscriptionPlan(params: CreatePlanRequest): Promise<CreatePlanResponse> {\n try {\n return await this.request<CreatePlanResponse>('POST', '/api/subscriptions/plans', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create subscription plan',\n };\n }\n }\n\n /**\n * Get current user's subscription plans\n */\n async getMySubscriptionPlans(): Promise<{ success: boolean; plans?: SubscriptionPlan[]; error?: string }> {\n try {\n const data = await this.request<{ plans: SubscriptionPlan[] }>('GET', '/api/subscriptions/plans');\n return { success: true, plans: data.plans };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get subscription plans',\n };\n }\n }\n\n /**\n * Get subscription plan by ID\n */\n async getSubscriptionPlan(\n planId: string\n ): Promise<{ success: boolean; plan?: SubscriptionPlan & { isSubscribed?: boolean }; error?: string }> {\n try {\n const plan = await this.request<SubscriptionPlan & { isSubscribed?: boolean }>(\n 'GET',\n `/api/subscriptions/plans/${planId}`\n );\n return { success: true, plan };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get subscription plan',\n };\n }\n }\n\n /**\n * Delete/deactivate subscription plan\n */\n async deleteSubscriptionPlan(\n planId: string\n ): Promise<{ success: boolean; message?: string; deactivated?: boolean; error?: string }> {\n try {\n const data = await this.request<{ message: string; deactivated?: boolean }>(\n 'DELETE',\n `/api/subscriptions/plans/${planId}`\n );\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to delete subscription plan',\n };\n }\n }\n\n /**\n * Subscribe to a plan\n */\n async subscribe(params: SubscribeRequest): Promise<SubscribeResponse> {\n try {\n return await this.request<SubscribeResponse>('POST', '/api/subscriptions/subscribe', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to subscribe',\n };\n }\n }\n\n /**\n * Get current user's subscriptions (as subscriber)\n */\n async getMySubscriptions(filters?: SubscriptionFilters): Promise<SubscriptionListResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/subscriptions${queryString ? `?${queryString}` : ''}`;\n const data = await this.request<{\n subscriptions: Subscription[];\n pagination: { page: number; limit: number; total: number; totalPages: number };\n }>('GET', path);\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get subscriptions',\n };\n }\n }\n\n /**\n * Get subscribers to current user's plans (as creator)\n */\n async getMySubscribers(filters?: SubscriptionFilters): Promise<SubscriptionListResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/subscriptions/subscribers${queryString ? `?${queryString}` : ''}`;\n const data = await this.request<{\n subscriptions: Subscription[];\n pagination: { page: number; limit: number; total: number; totalPages: number };\n stats: { totalSubscribers: number };\n }>('GET', path);\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get subscribers',\n };\n }\n }\n\n /**\n * Cancel subscription\n */\n async cancelSubscription(subscriptionId: string): Promise<{ success: boolean; message?: string; error?: string }> {\n try {\n const data = await this.request<{ message: string }>('DELETE', `/api/subscriptions/${subscriptionId}`);\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to cancel subscription',\n };\n }\n }\n\n /**\n * Create a subscription plan on-chain\n */\n async createSubscriptionPlanOnChain(params: ContractCreatePlanRequest): Promise<ContractCreatePlanResponse> {\n try {\n return await this.request<ContractCreatePlanResponse>('POST', '/api/subscriptions/contract/plans', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create plan on-chain',\n };\n }\n }\n\n /**\n * Subscribe to a plan on-chain\n */\n async subscribeOnChain(params: ContractSubscribeRequest): Promise<ContractSubscribeResponse> {\n try {\n return await this.request<ContractSubscribeResponse>('POST', '/api/subscriptions/contract/subscribe', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to subscribe on-chain',\n };\n }\n }\n\n /**\n * Cancel subscription on-chain\n */\n async cancelSubscriptionOnChain(\n subscriptionId: string,\n seed: string\n ): Promise<{ success: boolean; transactionHash?: string; message?: string; error?: string }> {\n try {\n return await this.request<{ success: boolean; transactionHash: string; message: string }>(\n 'POST',\n '/api/subscriptions/contract/cancel',\n { subscriptionId, seed }\n );\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to cancel subscription on-chain',\n };\n }\n }\n\n /**\n * Check if user is subscribed to a creator on-chain\n */\n async isSubscribed(subscriber: string, creator: string): Promise<IsSubscribedResponse> {\n try {\n return await this.request<IsSubscribedResponse>(\n 'GET',\n `/api/subscriptions/contract/is-subscribed?subscriber=${subscriber}&creator=${creator}`\n );\n } catch (error) {\n return {\n subscriber,\n creator,\n isSubscribed: false,\n };\n }\n }\n\n /**\n * Get subscription platform fee\n */\n async getSubscriptionPlatformFee(): Promise<PlatformFeeResponse> {\n try {\n return await this.request<PlatformFeeResponse>('GET', '/api/subscriptions/platform-fee');\n } catch (error) {\n return {\n feeBps: 0,\n feePercent: '0',\n };\n }\n }\n\n // ============ Payouts Methods ============\n\n /**\n * Get pending and claimed earnings for the authenticated user\n */\n async getEarnings(): Promise<EarningsResponse> {\n try {\n const data = await this.request<{\n address: string;\n pendingEarnings: string;\n totalEarnings: string;\n earningsBreakdown: { tips: string; subscriptions: string; nftSales: string; royalties: string };\n recentPayouts: Array<{ id: string; amount: string; txHash: string; createdAt: string }>;\n }>('GET', '/api/payouts/earnings');\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get earnings',\n };\n }\n }\n\n /**\n * Claim pending earnings\n */\n async claimEarnings(params: ClaimEarningsRequest): Promise<ClaimEarningsResponse> {\n try {\n return await this.request<ClaimEarningsResponse>('POST', '/api/payouts/claim', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to claim earnings',\n };\n }\n }\n\n /**\n * Get payout history for the authenticated user\n */\n async getPayoutHistory(filters?: { page?: number; limit?: number }): Promise<PayoutHistoryResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/payouts/history${queryString ? `?${queryString}` : ''}`;\n const data = await this.request<{\n payouts: Array<{\n id: string;\n amount: string;\n status: string;\n txHash: string;\n createdAt: string;\n confirmedAt?: string;\n }>;\n pagination: { page: number; limit: number; total: number; pages: number };\n }>('GET', path);\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get payout history',\n };\n }\n }\n\n /**\n * Get earnings breakdown by source\n */\n async getEarningsBreakdown(): Promise<EarningsBreakdownResponse> {\n try {\n const data = await this.request<{\n breakdown: { tips: string; subscriptions: string; nftSales: string; royalties: string; total: string };\n percentages: { tips: string; subscriptions: string; nftSales: string; royalties: string };\n }>('GET', '/api/payouts/breakdown');\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get earnings breakdown',\n };\n }\n }\n\n /**\n * Get current platform fee for payouts\n */\n async getPayoutsPlatformFee(): Promise<PlatformFeeResponse> {\n try {\n return await this.request<PlatformFeeResponse>('GET', '/api/payouts/platform-fee');\n } catch (error) {\n return {\n feeBps: 0,\n feePercent: '0',\n };\n }\n }\n}\n\n// Default API URL (can be overridden)\nconst DEFAULT_API_URL = process.env.NEXT_PUBLIC_API_URL || 'https://ckgwifsxka.us-east-2.awsapprunner.com';\n\n// Singleton instance\nlet zubariApiClient: ZubariApiClient | null = null;\n\n/**\n * Get or create the Zubari API client instance\n */\nexport function getZubariApiClient(config?: Partial<ZubariApiConfig>): ZubariApiClient {\n if (!zubariApiClient || (config?.baseUrl && zubariApiClient['config'].baseUrl !== config.baseUrl)) {\n zubariApiClient = new ZubariApiClient({\n baseUrl: config?.baseUrl || DEFAULT_API_URL,\n timeout: config?.timeout,\n authToken: config?.authToken,\n });\n } else if (config?.authToken) {\n zubariApiClient.setAuthToken(config.authToken);\n }\n return zubariApiClient;\n}\n\n/**\n * Create a new Zubari API client instance\n */\nexport function createZubariApiClient(config: ZubariApiConfig): ZubariApiClient {\n return new ZubariApiClient(config);\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","/*! 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 * 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 * Transaction Service for Zubari SDK\n *\n * Provides multi-chain transaction capabilities using Tether WDK.\n * Supports Ethereum, Bitcoin, Solana, TON, TRON, and Spark (Lightning).\n *\n * @see https://docs.wallet.tether.io/\n */\n\nimport type { NetworkType, TxResult } from '../types';\n\n// Dynamic imports for ESM modules (WDK packages are ESM-only)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WdkManager: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WalletManagerBtc: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WalletManagerEvm: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WalletManagerSolana: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WalletManagerTon: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WalletManagerTron: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WalletManagerSpark: any;\n\nlet wdkLoaded = false;\nlet wdkLoadError: Error | null = null;\n\n/**\n * 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 * Dynamic import helper that bypasses TypeScript's CommonJS transformation\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst dynamicImport = new Function('specifier', 'return import(specifier)') as (\n specifier: string\n) => Promise<any>;\n\n/**\n * Dynamically load WDK modules (they are ESM-only)\n */\nasync function loadWdkModules(): Promise<void> {\n if (wdkLoaded) return;\n if (wdkLoadError) throw wdkLoadError;\n\n try {\n const [wdk, btc, evm, solana, ton, tron, spark] = await Promise.all([\n dynamicImport('@tetherto/wdk'),\n dynamicImport('@tetherto/wdk-wallet-btc'),\n dynamicImport('@tetherto/wdk-wallet-evm'),\n dynamicImport('@tetherto/wdk-wallet-solana'),\n dynamicImport('@tetherto/wdk-wallet-ton'),\n dynamicImport('@tetherto/wdk-wallet-tron'),\n dynamicImport('@tetherto/wdk-wallet-spark'),\n ]);\n\n WdkManager = wdk.default;\n WalletManagerBtc = btc.default;\n WalletManagerEvm = evm.default;\n WalletManagerSolana = solana.default;\n WalletManagerTon = ton.default;\n WalletManagerTron = tron.default;\n WalletManagerSpark = spark.default;\n wdkLoaded = true;\n } catch (error) {\n wdkLoadError = error instanceof Error ? error : new Error('Failed to load WDK modules');\n console.error('Failed to load WDK modules:', error);\n throw wdkLoadError;\n }\n}\n\n/**\n * Transaction parameters for sending\n */\nexport interface TransactionParams {\n /** Recipient address */\n to: string;\n /** Amount to send (in human-readable format, e.g., \"0.1\") */\n amount: string;\n /** Token address (optional, for ERC-20/SPL tokens) */\n token?: string;\n /** Transaction memo/message (for chains that support it) */\n memo?: string;\n /** Fee priority: 'slow' | 'medium' | 'fast' */\n feePriority?: 'slow' | 'medium' | 'fast';\n /** Custom gas limit (EVM chains) */\n gasLimit?: string;\n /** Custom gas price (EVM chains) */\n gasPrice?: string;\n}\n\n/**\n * Transaction result with detailed information\n */\nexport interface TransactionResult {\n /** Transaction hash */\n hash: string;\n /** Network/chain */\n network: NetworkType;\n /** Transaction status */\n status: 'pending' | 'confirmed' | 'failed';\n /** Block number (when confirmed) */\n blockNumber?: number;\n /** Gas used (EVM chains) */\n gasUsed?: string;\n /** Fee paid */\n fee?: string;\n /** Explorer URL */\n explorerUrl?: string;\n /** Error message if failed */\n error?: string;\n /** Timestamp */\n timestamp: number;\n}\n\n/**\n * Transaction history item\n */\nexport interface TransactionHistoryItem {\n hash: string;\n network: NetworkType;\n type: 'send' | 'receive' | 'swap' | 'contract';\n from: string;\n to: string;\n amount: string;\n token?: string;\n fee?: string;\n status: 'pending' | 'confirmed' | 'failed';\n timestamp: number;\n blockNumber?: number;\n}\n\n/**\n * Fee estimate for a transaction\n */\nexport interface FeeEstimate {\n slow: {\n fee: string;\n estimatedTime: string; // e.g., \"~30 min\"\n };\n medium: {\n fee: string;\n estimatedTime: string; // e.g., \"~5 min\"\n };\n fast: {\n fee: string;\n estimatedTime: string; // e.g., \"~1 min\"\n };\n}\n\n/**\n * Transaction Service configuration\n */\nexport interface TransactionServiceConfig {\n network: 'mainnet' | 'testnet';\n rpcUrls?: Partial<Record<NetworkType, string>>;\n}\n\n// Default RPC URLs\nconst DEFAULT_RPC_URLS = {\n mainnet: {\n ethereum: 'https://eth.llamarpc.com',\n bitcoin: '', // Uses Electrum\n solana: 'https://api.mainnet-beta.solana.com',\n ton: 'https://toncenter.com/api/v2/jsonRPC',\n tron: 'https://api.trongrid.io',\n spark: '', // Uses Spark network\n },\n testnet: {\n ethereum: 'https://ethereum-sepolia-rpc.publicnode.com',\n bitcoin: '', // Uses Electrum testnet\n solana: 'https://api.devnet.solana.com',\n ton: 'https://testnet.toncenter.com/api/v2/jsonRPC',\n tron: 'https://nile.trongrid.io',\n spark: '', // Uses Spark testnet\n },\n};\n\n// Explorer URLs\nconst EXPLORER_URLS = {\n mainnet: {\n ethereum: 'https://etherscan.io/tx/',\n bitcoin: 'https://mempool.space/tx/',\n solana: 'https://solscan.io/tx/',\n ton: 'https://tonscan.org/tx/',\n tron: 'https://tronscan.org/#/transaction/',\n spark: 'https://spark.info/tx/',\n },\n testnet: {\n ethereum: 'https://sepolia.etherscan.io/tx/',\n bitcoin: 'https://mempool.space/testnet/tx/',\n solana: 'https://solscan.io/tx/?cluster=devnet&tx=',\n ton: 'https://testnet.tonscan.org/tx/',\n tron: 'https://nile.tronscan.org/#/transaction/',\n spark: 'https://testnet.spark.info/tx/',\n },\n};\n\n/**\n * Transaction Service\n *\n * Provides multi-chain transaction capabilities:\n * - Send native tokens (ETH, BTC, SOL, TON, TRX)\n * - Send ERC-20/SPL tokens\n * - Fee estimation\n * - Transaction history\n */\nexport class TransactionService {\n private seed: string | null = null;\n private config: TransactionServiceConfig;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private wallets: Partial<Record<NetworkType, any>> = {};\n\n constructor(config: Partial<TransactionServiceConfig> = {}) {\n this.config = {\n network: config.network || 'mainnet',\n rpcUrls: config.rpcUrls,\n };\n }\n\n /**\n * Ensure WDK modules are loaded\n */\n private async ensureLoaded(): Promise<void> {\n await loadWdkModules();\n }\n\n /**\n * Get RPC URL for a chain\n */\n private getRpcUrl(chain: NetworkType): string {\n const networkUrls = DEFAULT_RPC_URLS[this.config.network];\n\n if (this.config.rpcUrls?.[chain]) {\n return this.config.rpcUrls[chain]!;\n }\n\n return networkUrls[chain as keyof typeof networkUrls] || '';\n }\n\n /**\n * Get explorer URL for a transaction\n */\n getExplorerUrl(chain: NetworkType, txHash: string): string {\n const explorers = EXPLORER_URLS[this.config.network];\n const baseUrl = explorers[chain as keyof typeof explorers] || '';\n return `${baseUrl}${txHash}`;\n }\n\n /**\n * Initialize the service with a seed phrase\n */\n async initialize(seed: string): Promise<void> {\n await this.ensureLoaded();\n\n if (!WdkManager.isValidSeed(seed)) {\n throw new Error('Invalid seed phrase');\n }\n\n this.seed = seed;\n this.wallets = {};\n }\n\n /**\n * Check if service is initialized\n */\n isInitialized(): boolean {\n return this.seed !== null;\n }\n\n /**\n * Get or create wallet instance for a specific chain\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private async getWallet(chain: NetworkType): Promise<any> {\n if (!this.seed) {\n throw new Error('TransactionService not initialized. Call initialize() first.');\n }\n\n // Return cached wallet if exists\n if (this.wallets[chain]) {\n return this.wallets[chain];\n }\n\n const isTestnet = this.config.network === 'testnet';\n\n try {\n switch (chain) {\n case 'ethereum': {\n const rpcUrl = this.getRpcUrl('ethereum');\n const wallet = new WalletManagerEvm(this.seed, { provider: rpcUrl });\n this.wallets[chain] = wallet;\n return wallet;\n }\n\n case 'bitcoin': {\n const wallet = new WalletManagerBtc(this.seed, {\n network: isTestnet ? 'testnet' : 'bitcoin',\n });\n this.wallets[chain] = wallet;\n return wallet;\n }\n\n case 'solana': {\n const rpcUrl = this.getRpcUrl('solana');\n const wallet = new WalletManagerSolana(this.seed, {\n rpcUrl,\n });\n this.wallets[chain] = wallet;\n return wallet;\n }\n\n case 'ton': {\n const url = this.getRpcUrl('ton');\n const wallet = new WalletManagerTon(this.seed, {\n tonClient: { url },\n });\n this.wallets[chain] = wallet;\n return wallet;\n }\n\n case 'tron': {\n const fullHost = this.getRpcUrl('tron');\n const wallet = new WalletManagerTron(this.seed, {\n provider: fullHost,\n });\n this.wallets[chain] = wallet;\n return wallet;\n }\n\n case 'spark': {\n const wallet = new WalletManagerSpark(this.seed, {\n network: isTestnet ? 'TESTNET' : 'MAINNET',\n });\n this.wallets[chain] = wallet;\n return wallet;\n }\n\n default:\n throw new Error(`Unsupported chain: ${chain}`);\n }\n } catch (error) {\n console.error(`Failed to initialize ${chain} wallet:`, error);\n throw error;\n }\n }\n\n /**\n * Estimate transaction fee\n */\n async estimateFee(chain: NetworkType, params: TransactionParams): Promise<FeeEstimate> {\n const wallet = await this.getWallet(chain);\n\n try {\n // Get fee rates from the wallet\n const feeRates = await wallet.getFeeRates();\n\n // Format based on chain type\n if (chain === 'ethereum') {\n return {\n slow: {\n fee: `${feeRates.slow || '0'} Gwei`,\n estimatedTime: '~10 min',\n },\n medium: {\n fee: `${feeRates.medium || feeRates.standard || '0'} Gwei`,\n estimatedTime: '~3 min',\n },\n fast: {\n fee: `${feeRates.fast || feeRates.high || '0'} Gwei`,\n estimatedTime: '~30 sec',\n },\n };\n } else if (chain === 'bitcoin') {\n return {\n slow: {\n fee: `${feeRates.slow || feeRates.low || '0'} sat/vB`,\n estimatedTime: '~60 min',\n },\n medium: {\n fee: `${feeRates.medium || feeRates.normal || '0'} sat/vB`,\n estimatedTime: '~30 min',\n },\n fast: {\n fee: `${feeRates.fast || feeRates.high || '0'} sat/vB`,\n estimatedTime: '~10 min',\n },\n };\n } else {\n // Generic format for other chains\n return {\n slow: {\n fee: String(feeRates.slow || feeRates.low || '0'),\n estimatedTime: '~10 min',\n },\n medium: {\n fee: String(feeRates.medium || feeRates.standard || '0'),\n estimatedTime: '~3 min',\n },\n fast: {\n fee: String(feeRates.fast || feeRates.high || '0'),\n estimatedTime: '~1 min',\n },\n };\n }\n } catch (error) {\n console.error(`Error estimating fee for ${chain}:`, error);\n // Return default fees on error\n return {\n slow: { fee: '0', estimatedTime: 'Unknown' },\n medium: { fee: '0', estimatedTime: 'Unknown' },\n fast: { fee: '0', estimatedTime: 'Unknown' },\n };\n }\n }\n\n /**\n * Send a transaction\n */\n async send(chain: NetworkType, params: TransactionParams): Promise<TransactionResult> {\n const wallet = await this.getWallet(chain);\n const account = await wallet.getAccount(0);\n\n const timestamp = Date.now();\n\n try {\n // Build and send transaction based on chain\n let txHash: string;\n\n if (params.token) {\n // Token transfer (ERC-20, SPL, TRC-20, etc.)\n txHash = await account.sendToken(params.to, params.amount, params.token, {\n memo: params.memo,\n feePriority: params.feePriority || 'medium',\n });\n } else {\n // Native token transfer\n txHash = await account.send(params.to, params.amount, {\n memo: params.memo,\n feePriority: params.feePriority || 'medium',\n gasLimit: params.gasLimit,\n gasPrice: params.gasPrice,\n });\n }\n\n return {\n hash: txHash,\n network: chain,\n status: 'pending',\n explorerUrl: this.getExplorerUrl(chain, txHash),\n timestamp,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Transaction failed';\n console.error(`Transaction failed on ${chain}:`, error);\n\n return {\n hash: '',\n network: chain,\n status: 'failed',\n error: errorMessage,\n timestamp,\n };\n }\n }\n\n /**\n * Get transaction status\n */\n async getTransactionStatus(chain: NetworkType, txHash: string): Promise<TransactionResult> {\n const wallet = await this.getWallet(chain);\n\n try {\n const tx = await wallet.getTransaction(txHash);\n\n return {\n hash: txHash,\n network: chain,\n status: tx.confirmed ? 'confirmed' : 'pending',\n blockNumber: tx.blockNumber,\n gasUsed: tx.gasUsed?.toString(),\n fee: tx.fee?.toString(),\n explorerUrl: this.getExplorerUrl(chain, txHash),\n timestamp: tx.timestamp || Date.now(),\n };\n } catch (error) {\n console.error(`Error getting transaction status for ${txHash}:`, error);\n return {\n hash: txHash,\n network: chain,\n status: 'pending',\n explorerUrl: this.getExplorerUrl(chain, txHash),\n timestamp: Date.now(),\n };\n }\n }\n\n /**\n * Get transaction history for an address\n */\n async getTransactionHistory(\n chain: NetworkType,\n limit: number = 10\n ): Promise<TransactionHistoryItem[]> {\n const wallet = await this.getWallet(chain);\n const account = await wallet.getAccount(0);\n\n try {\n const history = await account.getTransactions({ limit });\n\n return history.map((tx: any) => ({\n hash: tx.hash || tx.txHash,\n network: chain,\n type: tx.type || (tx.from === account.address ? 'send' : 'receive'),\n from: tx.from,\n to: tx.to,\n amount: tx.amount || tx.value,\n token: tx.token,\n fee: tx.fee?.toString(),\n status: tx.confirmed ? 'confirmed' : 'pending',\n timestamp: tx.timestamp || Date.now(),\n blockNumber: tx.blockNumber,\n }));\n } catch (error) {\n console.error(`Error getting transaction history for ${chain}:`, error);\n return [];\n }\n }\n\n /**\n * Get balance for a specific chain\n */\n async getBalance(chain: NetworkType): Promise<{ balance: string; balanceUsd: number }> {\n const wallet = await this.getWallet(chain);\n const account = await wallet.getAccount(0);\n\n try {\n const balance = await account.getBalance();\n const balanceStr = balance.toString();\n\n // Fetch USD price for this chain\n const priceUsd = await getPriceForChain(chain);\n const balanceNum = parseFloat(balanceStr) || 0;\n const balanceUsd = balanceNum * priceUsd;\n\n return {\n balance: balanceStr,\n balanceUsd,\n };\n } catch (error) {\n console.error(`Error getting balance for ${chain}:`, error);\n return { balance: '0', balanceUsd: 0 };\n }\n }\n\n /**\n * Get the current network configuration\n */\n getNetwork(): 'mainnet' | 'testnet' {\n return this.config.network;\n }\n\n /**\n * Clean up and dispose of wallet instances\n */\n dispose(): void {\n for (const wallet of Object.values(this.wallets)) {\n if (wallet && typeof wallet.dispose === 'function') {\n try {\n wallet.dispose();\n } catch {\n // Ignore dispose errors\n }\n }\n }\n this.wallets = {};\n this.seed = null;\n }\n}\n\n// Singleton instance\nlet transactionServiceInstance: TransactionService | null = null;\n\n/**\n * Get or create the Transaction service singleton\n */\nexport function getTransactionService(config?: Partial<TransactionServiceConfig>): TransactionService {\n if (!transactionServiceInstance || (config && config.network !== transactionServiceInstance.getNetwork())) {\n transactionServiceInstance = new TransactionService(config);\n }\n return transactionServiceInstance;\n}\n\n/**\n * Create a new Transaction service instance (non-singleton)\n */\nexport function createTransactionService(config?: Partial<TransactionServiceConfig>): TransactionService {\n return new TransactionService(config);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/config/contracts.ts","../../src/services/SwapService.ts","../../src/services/WdkApiClient.ts","../../src/services/ZubariApiClient.ts","../../src/services/BrowserAddressDerivation.ts","../../src/config/networks.ts","../../src/services/ZubariWdkService.ts","../../src/services/TransactionService.ts"],"names":["DEFAULT_API_URL","DERIVATION_PATHS","HDNodeWallet","mnemonicToSeedSync","HDKey","ripemd160","sha256","bech32","base58check","validateMnemonic","wordlist","generateMnemonic","errorCode","dynamicImport"],"mappings":"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","file":"index.js","sourcesContent":["import { getZubariNetwork, isMainnet } from './env';\n\n// Contract addresses for Zubari ecosystem\nexport interface ContractAddresses {\n registry: string;\n nft: string;\n nft1155: string; // ERC-1155 multi-edition NFT\n marketplace: string;\n tips: string;\n subscriptions: string;\n subscriptionsV2: string; // V2 with integrated payouts\n subscriptionsSimple: string; // Simplified subscription\n creatorRegistry: string; // Creator identity & reputation\n payouts: string;\n entryPoint: string;\n paymaster: string;\n accountFactory: string;\n usdt: string;\n weth: string;\n}\n\n// Zero address for ETH payments and placeholder addresses\nexport const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nexport const ZUBARI_CONTRACTS: Record<'testnet' | 'mainnet', ContractAddresses> = {\n testnet: {\n // Ethereum Sepolia (11155111) - Updated 2025-01-18\n // Treasury: 0xAC2e22B5a99F0123319644A9bF0DF4FD72c9b001\n // Platform Fee: 10% (1000 bps)\n registry: '0xcEd503aeD6E2F6884A7eAB4226D15477d863B084',\n nft: '0xc61497530E08897CCf518cbF9DA1A327983192E1', // ZubariNFT ERC-721 with payment\n nft1155: '0x5e618B5bEaE1dc41369E7aa235Cc3b9245905192', // Zubari1155 ERC-1155 multi-edition\n marketplace: '0x64B8fC45bB669a1bD672bD5ab76f82B7EE3B2e0f',\n tips: '0xFDc353edC63Cd3D4bba35bB43861369516a9Dc85', // ZubariTips - 10% fee\n subscriptions: '0x8C05F8aD2F295fB7f3596043a7c37C98A5F7fAB8', // ZubariSubscription - 10% fee\n subscriptionsV2: ZERO_ADDRESS,\n subscriptionsSimple: '0x944f306e7d2e4f224dd660442EB65e4021b5eC24', // Deployed 2025-01-26\n creatorRegistry: ZERO_ADDRESS,\n payouts: '0x804Fe503936E8b8d3D5Dbb62AF4fB6Fe7265Fb2c', // ZubariPayouts\n entryPoint: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n paymaster: ZERO_ADDRESS, // Deploy with: npx hardhat run deploy/deploy.ts --network ethereum-sepolia\n accountFactory: ZERO_ADDRESS, // Not yet deployed\n usdt: '0x7169D38820dfd117C3FA1f22a697dBA58d90BA06', // USDT on Sepolia (mintable test token)\n weth: '0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14',\n },\n mainnet: {\n // Ethereum Mainnet (1) - Deployed 2025-01-22\n // Owner/Treasury: Safe 0x436fE1eff6056aCc8c34d8ADe0C54B8AcF90DCAa\n // Platform Fee: 10% (1000 bps)\n registry: '0x1DA6880bc730e96cFA24d614D12012f9f81C3239',\n nft: '0x19842D60a81bd65Bd9352A380C3b37dc2E0a5731',\n nft1155: '0xDA824094c3ADdaC49e2480a699E2B21ca234BeD6',\n marketplace: '0x8B0B3383644D0d374F4E047fC37e11F00f716b3A',\n tips: '0x38D7Fc0592bCF094e1880c19a34f98c6A36b68D8',\n subscriptions: '0xDA774d657B04Ab8744bfF09D18EeAce27E3F3DEa',\n subscriptionsV2: '0x7abbaFe67941036bBF7dB7006855C55014d6012A',\n subscriptionsSimple: '0xd0C07722a29D8aC7d137e59dCA114b031B4411E8',\n creatorRegistry: '0xe5CE1Eb986f58BE42EEDFe5C18ee5956803b2BDC',\n payouts: '0x74fc8cC0B5A92c90ae35caEB0E388Ea30424cc79',\n entryPoint: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n paymaster: ZERO_ADDRESS,\n accountFactory: ZERO_ADDRESS,\n usdt: '0xdAC17F958D2ee523a2206206994597C13D831ec7', // USDT on Ethereum\n weth: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n },\n};\n\n// Platform configuration\nexport const PLATFORM_CONFIG = {\n // Platform fee in basis points (1000 = 10%)\n // Zubari keeps 10%, Creator receives 90%\n platformFeeBps: 1000,\n tipFeeBps: 1000, // Alias for backward compatibility\n // Maximum royalty in basis points (1000 = 10%)\n maxRoyaltyBps: 1000,\n // Default slippage tolerance for swaps (50 = 0.5%)\n defaultSlippageBps: 50,\n // Voucher validity in seconds (30 days)\n voucherValiditySecs: 30 * 24 * 60 * 60,\n // Swap deadline in seconds (30 minutes)\n swapDeadlineSecs: 30 * 60,\n} as const;\n\n// EIP-712 Domain for lazy minting\nexport const NFT_VOUCHER_DOMAIN = {\n name: 'ZubariNFT',\n version: '1',\n} as const;\n\nexport const NFT_VOUCHER_TYPES = {\n NFTVoucher: [\n { name: 'tokenId', type: 'bytes32' },\n { name: 'uri', type: 'string' },\n { name: 'creator', type: 'address' },\n { name: 'royaltyBps', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n // Pricing fields\n { name: 'price', type: 'uint256' },\n { name: 'currency', type: 'address' },\n { name: 'nonce', type: 'uint256' },\n // Watermarking fields\n { name: 'contentHash', type: 'bytes32' },\n { name: 'userId', type: 'bytes32' },\n { name: 'watermarkTimestamp', type: 'uint256' },\n { name: 'sessionId', type: 'bytes32' },\n ],\n} as const;\n\n// EIP-712 Domain for ERC-1155 edition minting\nexport const EDITION_VOUCHER_DOMAIN = {\n name: 'Zubari1155',\n version: '1',\n} as const;\n\n// EIP-712 Types for EditionVoucher (ERC-1155)\nexport const EDITION_VOUCHER_TYPES = {\n EditionVoucher: [\n { name: 'tokenId', type: 'bytes32' },\n { name: 'uri', type: 'string' },\n { name: 'creator', type: 'address' },\n { name: 'maxSupply', type: 'uint256' },\n { name: 'royaltyBps', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n} as const;\n\n// Currency addresses per network\nexport const CURRENCY_ADDRESSES = {\n testnet: {\n ETH: ZERO_ADDRESS,\n USDT: '0x7169D38820dfd117C3FA1f22a697dBA58d90BA06', // USDT on Sepolia (Test Tether USD)\n },\n mainnet: {\n ETH: ZERO_ADDRESS,\n USDT: '0xdAC17F958D2ee523a2206206994597C13D831ec7', // USDT on Ethereum\n },\n} as const;\n\nexport function getContractAddresses(network: 'testnet' | 'mainnet'): ContractAddresses {\n return ZUBARI_CONTRACTS[network];\n}\n\n// Multi-chain Fee/Treasury Wallet Addresses\n// These wallets receive platform fees from transactions on their respective chains\nexport interface FeeWalletConfig {\n address: string;\n name: string;\n network: string;\n chainId?: number;\n}\n\nexport type SupportedFeeChain = 'ETH' | 'BTC' | 'SOLANA' | 'TON' | 'TRON';\n\n/**\n * Mainnet Fee Wallet Addresses\n * These are the production treasury wallets for collecting platform fees (10%)\n * Updated: 2025-01-18\n */\nexport const MAINNET_FEE_WALLETS: Record<SupportedFeeChain, FeeWalletConfig> = {\n // Ethereum (ETH, ERC-20 tokens like USDT)\n ETH: {\n address: '0x40Df60a57d02a7bB04B6624c65E2908Cc006badE',\n name: 'Zubari ETH Treasury',\n network: 'ethereum',\n chainId: 1,\n },\n // Bitcoin\n BTC: {\n address: 'bc1qh20fx23wk34pcm3zp0v9wctwprtl02uvh6q9qj',\n name: 'Zubari BTC Treasury',\n network: 'bitcoin',\n },\n // Solana (SOL, SPL tokens)\n SOLANA: {\n address: '2hXGumVRpD5KgdqNZUuYJ2YoyLR6jc8mvWbubciWjPuZ',\n name: 'Zubari Solana Treasury',\n network: 'solana',\n },\n // TON (The Open Network)\n TON: {\n address: 'UQB5hOrm9YGoKjrCVmvAUFgmApkvKWqVMROjieKs3z4kDz99',\n name: 'Zubari TON Treasury',\n network: 'ton',\n },\n // Tron (TRX, TRC-20 tokens like USDT)\n TRON: {\n address: 'TVBPjQFNe8JgVctDKWMxJNgjbPZoP6uu5h',\n name: 'Zubari Tron Treasury',\n network: 'tron',\n },\n} as const;\n\n/**\n * Testnet Fee Wallet Addresses\n * These are used for development and testing\n */\nexport const TESTNET_FEE_WALLETS: Record<SupportedFeeChain, FeeWalletConfig> = {\n // Ethereum Sepolia\n ETH: {\n address: '0xAC2e22B5a99F0123319644A9bF0DF4FD72c9b001', // Zubari Treasury on Sepolia\n name: 'Zubari ETH Testnet Treasury',\n network: 'sepolia',\n chainId: 11155111,\n },\n // Bitcoin Testnet\n BTC: {\n address: '',\n name: 'Zubari BTC Testnet Treasury',\n network: 'bitcoin-testnet',\n },\n // Solana Devnet\n SOLANA: {\n address: '',\n name: 'Zubari Solana Devnet Treasury',\n network: 'solana-devnet',\n },\n // TON Testnet\n TON: {\n address: '',\n name: 'Zubari TON Testnet Treasury',\n network: 'ton-testnet',\n },\n // Tron Nile Testnet\n TRON: {\n address: '',\n name: 'Zubari Tron Testnet Treasury',\n network: 'tron-nile',\n },\n} as const;\n\n/**\n * Get fee wallet address for a specific chain\n * @param chain - The blockchain network\n * @param isMainnet - Whether to use mainnet addresses (default: false for testnet)\n */\nexport function getFeeWallet(chain: SupportedFeeChain, isMainnet: boolean = true): FeeWalletConfig {\n return isMainnet ? MAINNET_FEE_WALLETS[chain] : TESTNET_FEE_WALLETS[chain];\n}\n\n/**\n * Get all fee wallets for a network type\n * @param isMainnet - Whether to use mainnet addresses\n */\nexport function getAllFeeWallets(useMainnet: boolean = false): Record<SupportedFeeChain, FeeWalletConfig> {\n return useMainnet ? MAINNET_FEE_WALLETS : TESTNET_FEE_WALLETS;\n}\n\n// =============================================================================\n// Environment-aware helpers (read from ZUBARI_NETWORK env var)\n// =============================================================================\n\n/**\n * Default contract to use for subscriptions\n * subscriptionsSimple is the recommended contract as it works on both networks\n */\nexport const DEFAULT_CONTRACTS = {\n subscriptions: 'subscriptionsSimple' as const,\n} as const;\n\n/**\n * Get contract addresses for the current network environment\n * Reads ZUBARI_NETWORK from environment variables\n * @returns Contract addresses for testnet or mainnet based on env\n */\nexport function getCurrentContractAddresses(): ContractAddresses {\n return ZUBARI_CONTRACTS[getZubariNetwork()];\n}\n\n/**\n * Get the default subscription contract address (subscriptionsSimple)\n * This is the recommended contract for subscriptions as it works on both networks\n * @returns The subscriptionsSimple contract address for the current network\n */\nexport function getDefaultSubscriptionAddress(): string {\n return ZUBARI_CONTRACTS[getZubariNetwork()].subscriptionsSimple;\n}\n\n/**\n * Get fee wallets for the current network environment\n * Reads ZUBARI_NETWORK from environment variables\n * @returns Fee wallet configurations for the current network\n */\nexport function getCurrentFeeWallets(): Record<SupportedFeeChain, FeeWalletConfig> {\n return isMainnet() ? MAINNET_FEE_WALLETS : TESTNET_FEE_WALLETS;\n}\n\n/**\n * Get a specific fee wallet for the current network environment\n * @param chain - The blockchain to get the fee wallet for\n * @returns Fee wallet configuration for the specified chain\n */\nexport function getCurrentFeeWallet(chain: SupportedFeeChain): FeeWalletConfig {\n return getCurrentFeeWallets()[chain];\n}\n\n/**\n * Get currency addresses for the current network environment\n * @returns Currency addresses (ETH, USDT) for the current network\n */\nexport function getCurrentCurrencyAddresses(): { ETH: string; USDT: string } {\n return CURRENCY_ADDRESSES[getZubariNetwork()];\n}\n","import type { SwapQuote, TxResult, TokenInfo } from '../types';\nimport { PLATFORM_CONFIG, getContractAddresses } from '../config/contracts';\n\n// Uniswap V3 contract addresses (Ethereum mainnet)\nconst UNISWAP_ADDRESSES = {\n mainnet: {\n swapRouter: '0xE592427A0AEce92De3Edee1F18E0157C05861564',\n quoter: '0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6',\n factory: '0x1F98431c8aD98523631AE4a59f267346ea31F984',\n },\n sepolia: {\n swapRouter: '0x3bFA4769FB09eefC5a80d6E87c3B9C650f7Ae48E',\n quoter: '0xEd1f6473345F45b75F8179591dd5bA1888cf2FB3',\n factory: '0x0227628f3F023bb0B980b67D528571c95c6DaC1c',\n },\n};\n\n// Uniswap V3 function selectors\nconst UNISWAP_SELECTORS = {\n quoteExactInputSingle: '0xf7729d43', // quoteExactInputSingle(address,address,uint24,uint256,uint160)\n exactInputSingle: '0x414bf389', // exactInputSingle((address,address,uint24,address,uint256,uint256,uint256,uint160))\n};\n\n// Common token addresses\nconst TOKENS = {\n mainnet: {\n WETH: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n USDT: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\n USDC: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n },\n sepolia: {\n WETH: '0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14',\n USDT: '0x7169D38820dfd117C3FA1f22a697dBA58d90BA06',\n USDC: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238',\n },\n};\n\n// Zero address for native ETH\nconst ETH_ADDRESS = '0x0000000000000000000000000000000000000000';\n\n/**\n * SwapService - DEX integration via Uniswap V3\n *\n * Handles token swaps with slippage protection,\n * quote fetching, and earnings conversion.\n */\nexport class SwapService {\n private readonly chainId: number;\n private readonly isTestnet: boolean;\n private readonly addresses: typeof UNISWAP_ADDRESSES.mainnet;\n private readonly tokens: typeof TOKENS.mainnet;\n\n constructor(chainId: number, isTestnet: boolean = false) {\n this.chainId = chainId;\n this.isTestnet = isTestnet;\n this.addresses = isTestnet ? UNISWAP_ADDRESSES.sepolia : UNISWAP_ADDRESSES.mainnet;\n this.tokens = isTestnet ? TOKENS.sepolia : TOKENS.mainnet;\n }\n\n /**\n * Get a swap quote from Uniswap V3 Quoter\n */\n async getQuote(\n tokenIn: string,\n tokenOut: string,\n amountIn: bigint,\n provider?: { call: (tx: object) => Promise<string> }\n ): Promise<SwapQuote> {\n if (amountIn <= 0n) {\n throw new Error('Amount must be greater than 0');\n }\n\n // Convert ETH address to WETH\n const actualTokenIn = tokenIn === ETH_ADDRESS ? this.tokens.WETH : tokenIn;\n const actualTokenOut = tokenOut === ETH_ADDRESS ? this.tokens.WETH : tokenOut;\n\n if (!provider) {\n // Return estimate without actual quote\n console.warn('No provider for quote, returning estimate');\n return {\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: amountIn * BigInt(95) / BigInt(100), // Rough estimate\n priceImpact: 0.5,\n route: [tokenIn, tokenOut],\n estimatedGas: BigInt(150000),\n };\n }\n\n try {\n // Encode quoteExactInputSingle call\n // quoteExactInputSingle(address tokenIn, address tokenOut, uint24 fee, uint256 amountIn, uint160 sqrtPriceLimitX96)\n const encodedTokenIn = actualTokenIn.toLowerCase().replace('0x', '').padStart(64, '0');\n const encodedTokenOut = actualTokenOut.toLowerCase().replace('0x', '').padStart(64, '0');\n const encodedFee = (3000).toString(16).padStart(64, '0'); // 0.3% fee tier\n const encodedAmountIn = amountIn.toString(16).padStart(64, '0');\n const encodedSqrtPriceLimit = '0'.padStart(64, '0'); // No price limit\n\n const data = `${UNISWAP_SELECTORS.quoteExactInputSingle}${encodedTokenIn}${encodedTokenOut}${encodedFee}${encodedAmountIn}${encodedSqrtPriceLimit}`;\n\n const result = await provider.call({\n to: this.addresses.quoter,\n data,\n });\n\n // Decode the result (uint256 amountOut)\n const amountOut = BigInt(result);\n\n // Calculate price impact\n const priceImpact = this.calculatePriceImpact(amountIn, amountOut, tokenIn, tokenOut);\n\n return {\n tokenIn,\n tokenOut,\n amountIn,\n amountOut,\n priceImpact,\n route: [tokenIn, tokenOut],\n estimatedGas: BigInt(150000),\n };\n } catch (error) {\n console.error('Failed to get quote:', error);\n throw new Error(`Quote failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Execute a swap with slippage protection via Uniswap V3 SwapRouter\n */\n async executeSwap(\n quote: SwapQuote,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> },\n recipient: string,\n slippageToleranceBps: number = PLATFORM_CONFIG.defaultSlippageBps\n ): Promise<TxResult> {\n // Calculate minimum output with slippage\n const minAmountOut = quote.amountOut - (quote.amountOut * BigInt(slippageToleranceBps)) / BigInt(10000);\n\n // Calculate deadline\n const deadline = Math.floor(Date.now() / 1000) + PLATFORM_CONFIG.swapDeadlineSecs;\n\n // Warn if price impact is high\n if (quote.priceImpact > 5) {\n console.warn(`High price impact: ${quote.priceImpact}%`);\n }\n\n // Convert ETH address to WETH for router\n const actualTokenIn = quote.tokenIn === ETH_ADDRESS ? this.tokens.WETH : quote.tokenIn;\n const actualTokenOut = quote.tokenOut === ETH_ADDRESS ? this.tokens.WETH : quote.tokenOut;\n const isETHIn = quote.tokenIn === ETH_ADDRESS;\n\n try {\n // Encode exactInputSingle call\n // struct ExactInputSingleParams {\n // address tokenIn;\n // address tokenOut;\n // uint24 fee;\n // address recipient;\n // uint256 deadline;\n // uint256 amountIn;\n // uint256 amountOutMinimum;\n // uint160 sqrtPriceLimitX96;\n // }\n const encodedTokenIn = actualTokenIn.toLowerCase().replace('0x', '').padStart(64, '0');\n const encodedTokenOut = actualTokenOut.toLowerCase().replace('0x', '').padStart(64, '0');\n const encodedFee = (3000).toString(16).padStart(64, '0');\n const encodedRecipient = recipient.toLowerCase().replace('0x', '').padStart(64, '0');\n const encodedDeadline = deadline.toString(16).padStart(64, '0');\n const encodedAmountIn = quote.amountIn.toString(16).padStart(64, '0');\n const encodedMinAmountOut = minAmountOut.toString(16).padStart(64, '0');\n const encodedSqrtPriceLimit = '0'.padStart(64, '0');\n\n const data = `${UNISWAP_SELECTORS.exactInputSingle}${encodedTokenIn}${encodedTokenOut}${encodedFee}${encodedRecipient}${encodedDeadline}${encodedAmountIn}${encodedMinAmountOut}${encodedSqrtPriceLimit}`;\n\n const tx = await signer.sendTransaction({\n to: this.addresses.swapRouter,\n data,\n value: isETHIn ? `0x${quote.amountIn.toString(16)}` : '0x0',\n });\n\n return {\n hash: tx.hash,\n network: 'ethereum',\n status: 'pending',\n metadata: {\n tokenIn: quote.tokenIn,\n tokenOut: quote.tokenOut,\n amountIn: quote.amountIn.toString(),\n minAmountOut: minAmountOut.toString(),\n deadline,\n },\n };\n } catch (error) {\n console.error('Failed to execute swap:', error);\n throw new Error(`Swap failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Convert earnings to USDT, keeping some ETH for gas\n */\n async convertEarningsToStable(\n ethBalance: bigint,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> },\n recipient: string,\n provider?: { call: (tx: object) => Promise<string> },\n reserveForGas: bigint = BigInt('10000000000000000') // 0.01 ETH\n ): Promise<TxResult> {\n const amountToSwap = ethBalance - reserveForGas;\n\n if (amountToSwap <= 0n) {\n throw new Error('Insufficient balance after gas reserve');\n }\n\n // Get quote for ETH -> USDT\n const quote = await this.getQuote(\n ETH_ADDRESS,\n this.tokens.USDT,\n amountToSwap,\n provider\n );\n\n return this.executeSwap(quote, signer, recipient);\n }\n\n /**\n * Check if a swap route exists\n */\n async hasRoute(\n tokenIn: string,\n tokenOut: string,\n provider?: { call: (tx: object) => Promise<string> }\n ): Promise<boolean> {\n try {\n const quote = await this.getQuote(tokenIn, tokenOut, BigInt(10 ** 18), provider);\n return quote.amountOut > 0n;\n } catch {\n return false;\n }\n }\n\n /**\n * Get supported tokens for swapping\n */\n async getSupportedTokens(): Promise<TokenInfo[]> {\n return [\n { address: ETH_ADDRESS, symbol: 'ETH', decimals: 18, name: 'Ether' },\n { address: this.tokens.WETH, symbol: 'WETH', decimals: 18, name: 'Wrapped Ether' },\n { address: this.tokens.USDT, symbol: 'USDT', decimals: 6, name: 'Tether USD' },\n { address: this.tokens.USDC, symbol: 'USDC', decimals: 6, name: 'USD Coin' },\n ];\n }\n\n /**\n * Get Uniswap router address for approvals\n */\n getRouterAddress(): string {\n return this.addresses.swapRouter;\n }\n\n /**\n * Calculate price impact (simplified)\n */\n private calculatePriceImpact(\n amountIn: bigint,\n amountOut: bigint,\n _tokenIn: string,\n _tokenOut: string\n ): number {\n // Simplified price impact calculation\n // In production, would compare to oracle price\n if (amountIn === 0n || amountOut === 0n) return 0;\n\n // Assume 1:1 ratio for ETH:stablecoin as baseline\n // Real implementation would use price feeds\n const expectedOut = amountIn; // Simplified\n const actualRatio = Number(amountOut) / Number(expectedOut);\n const impact = (1 - actualRatio) * 100;\n\n return Math.max(0, impact);\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 /** Optional auth token for authenticated API requests */\n authToken?: string;\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<Omit<WdkApiConfig, 'authToken'>> & { authToken?: string };\n\n constructor(config: WdkApiConfig) {\n this.config = {\n baseUrl: config.baseUrl,\n timeout: config.timeout || 30000,\n authToken: config.authToken,\n };\n }\n\n /**\n * Set or update the auth token for authenticated requests\n */\n setAuthToken(token: string | undefined): void {\n this.config.authToken = token;\n }\n\n /**\n * Build headers for API requests, including Authorization when available\n */\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (this.config.authToken) {\n headers['Authorization'] = `Bearer ${this.config.authToken}`;\n }\n return headers;\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: this.getHeaders(),\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: this.getHeaders(),\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: this.getHeaders(),\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: this.getHeaders(),\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: this.getHeaders(),\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: this.getHeaders(),\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: this.getHeaders(),\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, authToken?: string): WdkApiClient {\n if (!wdkApiClient || (baseUrl && wdkApiClient['config'].baseUrl !== baseUrl)) {\n wdkApiClient = new WdkApiClient({\n baseUrl: baseUrl || DEFAULT_API_URL,\n authToken,\n });\n } else if (authToken !== undefined) {\n wdkApiClient.setAuthToken(authToken);\n }\n return wdkApiClient;\n}\n","/**\n * Zubari API Client\n *\n * Comprehensive client for interacting with the Zubari backend API.\n * Includes NFT, Marketplace, Tips, and Subscription operations.\n */\n\nimport type { NetworkType, NFTCurrency } from '../types';\n\nexport interface ZubariApiConfig {\n baseUrl: string;\n timeout?: number;\n authToken?: string;\n}\n\n// ============ NFT Types ============\n\nexport interface NFTVoucher {\n tokenId: string;\n uri: string;\n creator: string;\n royaltyBps: number;\n deadline: number;\n signature: string;\n price: string;\n currency: string;\n nonce: number;\n contentHash?: string;\n userId?: string;\n watermarkTimestamp?: number;\n sessionId?: string;\n}\n\nexport interface CreateVoucherRequest {\n creatorAddress: string;\n price: string;\n currency: NFTCurrency;\n}\n\nexport interface CreateVoucherResponse {\n success: boolean;\n voucher?: NFTVoucher;\n signature?: string;\n nftId?: string;\n error?: string;\n}\n\nexport interface RedeemVoucherRequest {\n buyerAddress: string;\n paymentTxHash?: string;\n}\n\nexport interface RedeemVoucherResponse {\n success: boolean;\n transactionHash?: string;\n tokenId?: string;\n owner?: string;\n nftId?: string;\n error?: string;\n}\n\nexport interface VoucherStatusResponse {\n success: boolean;\n nftId?: string;\n hasVoucher?: boolean;\n isRedeemed?: boolean;\n voucher?: NFTVoucher;\n error?: string;\n}\n\nexport interface NFTResponse {\n id: string;\n tokenId?: string;\n contractAddress?: string;\n name: string;\n description?: string;\n imageUrl?: string;\n animationUrl?: string;\n externalUrl?: string;\n attributes?: Array<{\n trait_type: string;\n value: string | number;\n }>;\n creatorId: string;\n ownerId: string;\n price?: string;\n currency?: string;\n royaltyBps: number;\n isLazyMinted: boolean;\n isMinted: boolean;\n mintedAt?: string;\n transactionHash?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateNFTRequest {\n name: string;\n description?: string;\n price: string;\n currency: NFTCurrency;\n royaltyBps?: number;\n attributes?: Array<{\n trait_type: string;\n value: string | number;\n }>;\n externalUrl?: string;\n}\n\nexport interface NFTListResponse {\n success: boolean;\n nfts?: NFTResponse[];\n pagination?: {\n page: number;\n limit: number;\n total: number;\n pages: number;\n };\n error?: string;\n}\n\n// ============ Marketplace Types ============\n\nexport interface MarketListing {\n id: string;\n nftId: string;\n nft?: NFTResponse;\n sellerId: string;\n sellerAddress: string;\n price: string;\n currency: string;\n expiresAt: string;\n status: 'ACTIVE' | 'SOLD' | 'CANCELLED' | 'EXPIRED';\n transactionHash?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ListItemRequest {\n nftId: string;\n price: string;\n currency: NFTCurrency;\n duration?: number; // Duration in seconds, default 7 days\n}\n\nexport interface ListItemResponse {\n success: boolean;\n listing?: MarketListing;\n transactionHash?: string;\n error?: string;\n}\n\nexport interface BuyItemRequest {\n listingId: string;\n buyerAddress: string;\n}\n\nexport interface BuyItemResponse {\n success: boolean;\n transactionHash?: string;\n tokenId?: string;\n newOwner?: string;\n error?: string;\n}\n\nexport interface CancelListingRequest {\n listingId: string;\n}\n\nexport interface CancelListingResponse {\n success: boolean;\n transactionHash?: string;\n error?: string;\n}\n\nexport interface UpdatePriceRequest {\n listingId: string;\n newPrice: string;\n}\n\nexport interface UpdatePriceResponse {\n success: boolean;\n listing?: MarketListing;\n transactionHash?: string;\n error?: string;\n}\n\nexport interface ListingsResponse {\n success: boolean;\n listings?: MarketListing[];\n pagination?: {\n page: number;\n limit: number;\n total: number;\n pages: number;\n };\n error?: string;\n}\n\nexport interface MarketStatsResponse {\n success: boolean;\n stats?: {\n totalListings: number;\n activeListings: number;\n totalVolume: string;\n totalSales: number;\n averagePrice: string;\n topSellers: Array<{\n address: string;\n sales: number;\n volume: string;\n }>;\n };\n error?: string;\n}\n\n// ============ Filter Types ============\n\nexport interface NFTFilters {\n creatorId?: string;\n ownerId?: string;\n isLazyMinted?: boolean;\n isMinted?: boolean;\n minPrice?: string;\n maxPrice?: string;\n currency?: NFTCurrency;\n page?: number;\n limit?: number;\n}\n\nexport interface ListingFilters {\n sellerId?: string;\n status?: 'ACTIVE' | 'SOLD' | 'CANCELLED' | 'EXPIRED';\n minPrice?: string;\n maxPrice?: string;\n currency?: NFTCurrency;\n sortBy?: 'price' | 'createdAt' | 'expiresAt';\n sortOrder?: 'asc' | 'desc';\n page?: number;\n limit?: number;\n}\n\n// ============ Tips Types ============\n\nexport interface TipUser {\n id: string;\n username?: string;\n displayName?: string;\n avatarUrl?: string;\n}\n\nexport interface Tip {\n id: string;\n senderId: string;\n recipientId?: string;\n senderAddress: string;\n recipientAddress: string;\n tokenAddress?: string;\n amount: string;\n amountUsd?: string;\n platformFee: string;\n message?: string;\n network: string;\n transactionHash?: string;\n status: 'PENDING' | 'CONFIRMED' | 'FAILED';\n createdAt: string;\n sender?: TipUser;\n recipient?: TipUser;\n}\n\nexport interface SendTipRequest {\n recipientAddress: string;\n recipientUsername?: string;\n amount: string;\n tokenAddress?: string;\n network?: string;\n message?: string;\n transactionHash?: string;\n}\n\nexport interface SendTipResponse {\n success: boolean;\n message?: string;\n tip?: Tip;\n platformFee?: string;\n platformFeeBps?: number;\n error?: string;\n}\n\nexport interface TipStatsResponse {\n success: boolean;\n sent?: {\n count: number;\n totalAmount: string;\n totalAmountUsd: string;\n };\n received?: {\n count: number;\n totalAmount: string;\n totalAmountUsd: string;\n platformFees: string;\n };\n error?: string;\n}\n\nexport interface TipsListResponse {\n success: boolean;\n tips?: Tip[];\n pagination?: {\n page: number;\n limit: number;\n total: number;\n totalPages: number;\n };\n totals?: {\n count: number;\n amount: string;\n amountUsd: string;\n };\n error?: string;\n}\n\nexport interface TipFilters {\n page?: number;\n limit?: number;\n status?: 'PENDING' | 'CONFIRMED' | 'FAILED';\n}\n\nexport interface UpdateTipStatusRequest {\n status: 'PENDING' | 'CONFIRMED' | 'FAILED';\n transactionHash?: string;\n}\n\n// ============ Subscription Types ============\n\nexport interface SubscriptionPlan {\n id: string;\n creatorId: string;\n name: string;\n description?: string;\n price: string;\n priceUsd?: string;\n paymentToken?: string;\n durationDays: number;\n perks: string[];\n nftBadge: boolean;\n maxSubscribers?: number;\n isActive: boolean;\n activeSubscribers?: number;\n createdAt: string;\n updatedAt: string;\n creator?: TipUser & { isVerified?: boolean };\n}\n\nexport interface Subscription {\n id: string;\n planId: string;\n subscriberId: string;\n creatorId: string;\n subscriberAddress?: string;\n creatorAddress?: string;\n transactionHash?: string;\n amount?: string;\n startDate: string;\n endDate: string;\n expiresAt: string;\n autoRenew: boolean;\n status: 'ACTIVE' | 'EXPIRED' | 'CANCELLED';\n createdAt: string;\n plan?: Partial<SubscriptionPlan>;\n creator?: TipUser & { isVerified?: boolean };\n subscriber?: TipUser;\n}\n\nexport interface CreatePlanRequest {\n name: string;\n description?: string;\n price: string;\n priceUsd?: number;\n paymentToken?: string;\n durationDays?: number;\n perks?: string[];\n nftBadge?: boolean;\n maxSubscribers?: number;\n}\n\nexport interface CreatePlanResponse {\n success: boolean;\n message?: string;\n plan?: SubscriptionPlan;\n error?: string;\n}\n\nexport interface SubscribeRequest {\n planId: string;\n transactionHash?: string;\n autoRenew?: boolean;\n}\n\nexport interface SubscribeResponse {\n success: boolean;\n message?: string;\n subscription?: Subscription;\n error?: string;\n}\n\nexport interface SubscriptionListResponse {\n success: boolean;\n subscriptions?: Subscription[];\n pagination?: {\n page: number;\n limit: number;\n total: number;\n totalPages: number;\n };\n stats?: {\n totalSubscribers: number;\n };\n error?: string;\n}\n\nexport interface SubscriptionFilters {\n page?: number;\n limit?: number;\n status?: 'ACTIVE' | 'EXPIRED' | 'CANCELLED';\n}\n\nexport interface ContractSubscribeRequest {\n planId: string;\n months?: number;\n seed: string;\n}\n\nexport interface ContractSubscribeResponse {\n success: boolean;\n transactionHash?: string;\n subscription?: Subscription;\n message?: string;\n error?: string;\n}\n\nexport interface ContractCreatePlanRequest {\n name: string;\n description?: string;\n price: string;\n paymentToken?: string;\n durationDays?: number;\n maxSubscribers?: number;\n seed: string;\n}\n\nexport interface ContractCreatePlanResponse {\n success: boolean;\n transactionHash?: string;\n plan?: SubscriptionPlan;\n message?: string;\n error?: string;\n}\n\nexport interface IsSubscribedResponse {\n subscriber: string;\n creator: string;\n isSubscribed: boolean;\n}\n\nexport interface PlatformFeeResponse {\n feeBps: number;\n feePercent: string;\n}\n\n// ============ Payouts Types ============\n\nexport interface EarningsResponse {\n success: boolean;\n address?: string;\n pendingEarnings?: string;\n totalEarnings?: string;\n earningsBreakdown?: {\n tips: string;\n subscriptions: string;\n nftSales: string;\n royalties: string;\n };\n recentPayouts?: Array<{\n id: string;\n amount: string;\n txHash: string;\n createdAt: string;\n }>;\n error?: string;\n}\n\nexport interface ClaimEarningsRequest {\n seed: string;\n}\n\nexport interface ClaimEarningsResponse {\n success: boolean;\n transactionHash?: string;\n amount?: string;\n message?: string;\n error?: string;\n}\n\nexport interface PayoutHistoryResponse {\n success: boolean;\n payouts?: Array<{\n id: string;\n amount: string;\n status: string;\n txHash: string;\n createdAt: string;\n confirmedAt?: string;\n }>;\n pagination?: {\n page: number;\n limit: number;\n total: number;\n pages: number;\n };\n error?: string;\n}\n\nexport interface EarningsBreakdownResponse {\n success: boolean;\n breakdown?: {\n tips: string;\n subscriptions: string;\n nftSales: string;\n royalties: string;\n total: string;\n };\n percentages?: {\n tips: string;\n subscriptions: string;\n nftSales: string;\n royalties: string;\n };\n error?: string;\n}\n\n/**\n * Zubari API Client for backend integration\n */\nexport class ZubariApiClient {\n private config: Required<Omit<ZubariApiConfig, 'authToken'>> & { authToken?: string };\n\n constructor(config: ZubariApiConfig) {\n this.config = {\n baseUrl: config.baseUrl.replace(/\\/$/, ''), // Remove trailing slash\n timeout: config.timeout || 30000,\n authToken: config.authToken,\n };\n }\n\n /**\n * Set the authentication token\n */\n setAuthToken(token: string): void {\n this.config.authToken = token;\n }\n\n /**\n * Clear the authentication token\n */\n clearAuthToken(): void {\n this.config.authToken = undefined;\n }\n\n /**\n * Make an authenticated request to the API\n */\n private async request<T>(\n method: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE',\n path: string,\n body?: unknown\n ): Promise<T> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.config.authToken) {\n headers['Authorization'] = `Bearer ${this.config.authToken}`;\n }\n\n const response = await fetch(`${this.config.baseUrl}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `HTTP ${response.status}: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n // ============ NFT Methods ============\n\n /**\n * Get all NFTs with optional filters\n */\n async getNFTs(filters?: NFTFilters): Promise<NFTListResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/nfts${queryString ? `?${queryString}` : ''}`;\n return await this.request<NFTListResponse>('GET', path);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get NFTs',\n };\n }\n }\n\n /**\n * Get a single NFT by ID\n */\n async getNFT(nftId: string): Promise<{ success: boolean; nft?: NFTResponse; error?: string }> {\n try {\n const nft = await this.request<NFTResponse>('GET', `/api/nfts/${nftId}`);\n return { success: true, nft };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get NFT',\n };\n }\n }\n\n /**\n * Create a new NFT (lazy minted)\n */\n async createNFT(\n data: CreateNFTRequest,\n image: File | Blob\n ): Promise<{ success: boolean; nft?: NFTResponse; error?: string }> {\n try {\n const formData = new FormData();\n formData.append('image', image);\n formData.append('name', data.name);\n if (data.description) formData.append('description', data.description);\n formData.append('price', data.price);\n formData.append('currency', data.currency);\n if (data.royaltyBps !== undefined) formData.append('royaltyBps', String(data.royaltyBps));\n if (data.attributes) formData.append('attributes', JSON.stringify(data.attributes));\n if (data.externalUrl) formData.append('externalUrl', data.externalUrl);\n\n const headers: Record<string, string> = {};\n if (this.config.authToken) {\n headers['Authorization'] = `Bearer ${this.config.authToken}`;\n }\n\n const response = await fetch(`${this.config.baseUrl}/api/nfts`, {\n method: 'POST',\n headers,\n body: formData,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `HTTP ${response.status}`);\n }\n\n const nft = await response.json();\n return { success: true, nft };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create NFT',\n };\n }\n }\n\n /**\n * Create a voucher for an NFT (EIP-712 signed)\n */\n async createVoucher(nftId: string, params: CreateVoucherRequest): Promise<CreateVoucherResponse> {\n try {\n return await this.request<CreateVoucherResponse>('POST', `/api/nfts/${nftId}/voucher`, params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create voucher',\n };\n }\n }\n\n /**\n * Redeem an NFT voucher (buy/mint)\n */\n async redeemVoucher(nftId: string, params: RedeemVoucherRequest): Promise<RedeemVoucherResponse> {\n try {\n return await this.request<RedeemVoucherResponse>('POST', `/api/nfts/${nftId}/redeem`, params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to redeem voucher',\n };\n }\n }\n\n /**\n * Get voucher status for an NFT\n */\n async getVoucherStatus(nftId: string): Promise<VoucherStatusResponse> {\n try {\n return await this.request<VoucherStatusResponse>('GET', `/api/nfts/${nftId}/voucher/status`);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get voucher status',\n };\n }\n }\n\n // ============ Marketplace Methods ============\n\n /**\n * Get all active listings\n */\n async getListings(filters?: ListingFilters): Promise<ListingsResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/market/listings${queryString ? `?${queryString}` : ''}`;\n return await this.request<ListingsResponse>('GET', path);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get listings',\n };\n }\n }\n\n /**\n * List an NFT for sale\n */\n async listItem(params: ListItemRequest): Promise<ListItemResponse> {\n try {\n return await this.request<ListItemResponse>('POST', '/api/market/list', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to list item',\n };\n }\n }\n\n /**\n * Buy a listed NFT\n */\n async buyItem(params: BuyItemRequest): Promise<BuyItemResponse> {\n try {\n return await this.request<BuyItemResponse>('POST', '/api/market/buy', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to buy item',\n };\n }\n }\n\n /**\n * Cancel a listing\n */\n async cancelListing(params: CancelListingRequest): Promise<CancelListingResponse> {\n try {\n return await this.request<CancelListingResponse>('POST', '/api/market/cancel', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to cancel listing',\n };\n }\n }\n\n /**\n * Update listing price\n */\n async updateListingPrice(params: UpdatePriceRequest): Promise<UpdatePriceResponse> {\n try {\n return await this.request<UpdatePriceResponse>('PATCH', '/api/market/price', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to update price',\n };\n }\n }\n\n /**\n * Get current user's listings\n */\n async getMyListings(filters?: Omit<ListingFilters, 'sellerId'>): Promise<ListingsResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/market/my/listings${queryString ? `?${queryString}` : ''}`;\n return await this.request<ListingsResponse>('GET', path);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get my listings',\n };\n }\n }\n\n /**\n * Get marketplace statistics\n */\n async getMarketStats(): Promise<MarketStatsResponse> {\n try {\n return await this.request<MarketStatsResponse>('GET', '/api/market/stats');\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get market stats',\n };\n }\n }\n\n // ============ Tips Methods ============\n\n /**\n * Send a tip to a creator\n */\n async sendTip(params: SendTipRequest): Promise<SendTipResponse> {\n try {\n return await this.request<SendTipResponse>('POST', '/api/tips', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to send tip',\n };\n }\n }\n\n /**\n * Get tip statistics for current user\n */\n async getTipStats(): Promise<TipStatsResponse> {\n try {\n const data = await this.request<{\n sent: { count: number; totalAmount: string; totalAmountUsd: string };\n received: { count: number; totalAmount: string; totalAmountUsd: string; platformFees: string };\n }>('GET', '/api/tips/my/stats');\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get tip stats',\n };\n }\n }\n\n /**\n * Get tips sent by current user\n */\n async getSentTips(filters?: TipFilters): Promise<TipsListResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/tips/sent${queryString ? `?${queryString}` : ''}`;\n const data = await this.request<{\n tips: Tip[];\n pagination: { page: number; limit: number; total: number; totalPages: number };\n totals: { count: number; amount: string; amountUsd: string };\n }>('GET', path);\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get sent tips',\n };\n }\n }\n\n /**\n * Get tips received by current user\n */\n async getReceivedTips(filters?: TipFilters): Promise<TipsListResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/tips/received${queryString ? `?${queryString}` : ''}`;\n const data = await this.request<{\n tips: Tip[];\n pagination: { page: number; limit: number; total: number; totalPages: number };\n totals: { count: number; amount: string; amountUsd: string };\n }>('GET', path);\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get received tips',\n };\n }\n }\n\n /**\n * Get a single tip by ID\n */\n async getTip(tipId: string): Promise<{ success: boolean; tip?: Tip; error?: string }> {\n try {\n const data = await this.request<{ tip: Tip }>('GET', `/api/tips/${tipId}`);\n return { success: true, tip: data.tip };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get tip',\n };\n }\n }\n\n /**\n * Update tip status (for transaction confirmation)\n */\n async updateTipStatus(\n tipId: string,\n params: UpdateTipStatusRequest\n ): Promise<{ success: boolean; tip?: Tip; message?: string; error?: string }> {\n try {\n const data = await this.request<{ message: string; tip: Tip }>(\n 'PATCH',\n `/api/tips/${tipId}/status`,\n params\n );\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to update tip status',\n };\n }\n }\n\n // ============ Subscription Methods ============\n\n /**\n * Create a new subscription plan (creator only)\n */\n async createSubscriptionPlan(params: CreatePlanRequest): Promise<CreatePlanResponse> {\n try {\n return await this.request<CreatePlanResponse>('POST', '/api/subscriptions/plans', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create subscription plan',\n };\n }\n }\n\n /**\n * Get current user's subscription plans\n */\n async getMySubscriptionPlans(): Promise<{ success: boolean; plans?: SubscriptionPlan[]; error?: string }> {\n try {\n const data = await this.request<{ plans: SubscriptionPlan[] }>('GET', '/api/subscriptions/plans');\n return { success: true, plans: data.plans };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get subscription plans',\n };\n }\n }\n\n /**\n * Get subscription plan by ID\n */\n async getSubscriptionPlan(\n planId: string\n ): Promise<{ success: boolean; plan?: SubscriptionPlan & { isSubscribed?: boolean }; error?: string }> {\n try {\n const plan = await this.request<SubscriptionPlan & { isSubscribed?: boolean }>(\n 'GET',\n `/api/subscriptions/plans/${planId}`\n );\n return { success: true, plan };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get subscription plan',\n };\n }\n }\n\n /**\n * Delete/deactivate subscription plan\n */\n async deleteSubscriptionPlan(\n planId: string\n ): Promise<{ success: boolean; message?: string; deactivated?: boolean; error?: string }> {\n try {\n const data = await this.request<{ message: string; deactivated?: boolean }>(\n 'DELETE',\n `/api/subscriptions/plans/${planId}`\n );\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to delete subscription plan',\n };\n }\n }\n\n /**\n * Subscribe to a plan\n */\n async subscribe(params: SubscribeRequest): Promise<SubscribeResponse> {\n try {\n return await this.request<SubscribeResponse>('POST', '/api/subscriptions/subscribe', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to subscribe',\n };\n }\n }\n\n /**\n * Get current user's subscriptions (as subscriber)\n */\n async getMySubscriptions(filters?: SubscriptionFilters): Promise<SubscriptionListResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/subscriptions${queryString ? `?${queryString}` : ''}`;\n const data = await this.request<{\n subscriptions: Subscription[];\n pagination: { page: number; limit: number; total: number; totalPages: number };\n }>('GET', path);\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get subscriptions',\n };\n }\n }\n\n /**\n * Get subscribers to current user's plans (as creator)\n */\n async getMySubscribers(filters?: SubscriptionFilters): Promise<SubscriptionListResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/subscriptions/subscribers${queryString ? `?${queryString}` : ''}`;\n const data = await this.request<{\n subscriptions: Subscription[];\n pagination: { page: number; limit: number; total: number; totalPages: number };\n stats: { totalSubscribers: number };\n }>('GET', path);\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get subscribers',\n };\n }\n }\n\n /**\n * Cancel subscription\n */\n async cancelSubscription(subscriptionId: string): Promise<{ success: boolean; message?: string; error?: string }> {\n try {\n const data = await this.request<{ message: string }>('DELETE', `/api/subscriptions/${subscriptionId}`);\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to cancel subscription',\n };\n }\n }\n\n /**\n * Create a subscription plan on-chain\n */\n async createSubscriptionPlanOnChain(params: ContractCreatePlanRequest): Promise<ContractCreatePlanResponse> {\n try {\n return await this.request<ContractCreatePlanResponse>('POST', '/api/subscriptions/contract/plans', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create plan on-chain',\n };\n }\n }\n\n /**\n * Subscribe to a plan on-chain\n */\n async subscribeOnChain(params: ContractSubscribeRequest): Promise<ContractSubscribeResponse> {\n try {\n return await this.request<ContractSubscribeResponse>('POST', '/api/subscriptions/contract/subscribe', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to subscribe on-chain',\n };\n }\n }\n\n /**\n * Cancel subscription on-chain\n */\n async cancelSubscriptionOnChain(\n subscriptionId: string,\n seed: string\n ): Promise<{ success: boolean; transactionHash?: string; message?: string; error?: string }> {\n try {\n return await this.request<{ success: boolean; transactionHash: string; message: string }>(\n 'POST',\n '/api/subscriptions/contract/cancel',\n { subscriptionId, seed }\n );\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to cancel subscription on-chain',\n };\n }\n }\n\n /**\n * Check if user is subscribed to a creator on-chain\n */\n async isSubscribed(subscriber: string, creator: string): Promise<IsSubscribedResponse> {\n try {\n return await this.request<IsSubscribedResponse>(\n 'GET',\n `/api/subscriptions/contract/is-subscribed?subscriber=${subscriber}&creator=${creator}`\n );\n } catch (error) {\n return {\n subscriber,\n creator,\n isSubscribed: false,\n };\n }\n }\n\n /**\n * Get subscription platform fee\n */\n async getSubscriptionPlatformFee(): Promise<PlatformFeeResponse> {\n try {\n return await this.request<PlatformFeeResponse>('GET', '/api/subscriptions/platform-fee');\n } catch (error) {\n return {\n feeBps: 0,\n feePercent: '0',\n };\n }\n }\n\n // ============ Payouts Methods ============\n\n /**\n * Get pending and claimed earnings for the authenticated user\n */\n async getEarnings(): Promise<EarningsResponse> {\n try {\n const data = await this.request<{\n address: string;\n pendingEarnings: string;\n totalEarnings: string;\n earningsBreakdown: { tips: string; subscriptions: string; nftSales: string; royalties: string };\n recentPayouts: Array<{ id: string; amount: string; txHash: string; createdAt: string }>;\n }>('GET', '/api/payouts/earnings');\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get earnings',\n };\n }\n }\n\n /**\n * Claim pending earnings\n */\n async claimEarnings(params: ClaimEarningsRequest): Promise<ClaimEarningsResponse> {\n try {\n return await this.request<ClaimEarningsResponse>('POST', '/api/payouts/claim', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to claim earnings',\n };\n }\n }\n\n /**\n * Get payout history for the authenticated user\n */\n async getPayoutHistory(filters?: { page?: number; limit?: number }): Promise<PayoutHistoryResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/payouts/history${queryString ? `?${queryString}` : ''}`;\n const data = await this.request<{\n payouts: Array<{\n id: string;\n amount: string;\n status: string;\n txHash: string;\n createdAt: string;\n confirmedAt?: string;\n }>;\n pagination: { page: number; limit: number; total: number; pages: number };\n }>('GET', path);\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get payout history',\n };\n }\n }\n\n /**\n * Get earnings breakdown by source\n */\n async getEarningsBreakdown(): Promise<EarningsBreakdownResponse> {\n try {\n const data = await this.request<{\n breakdown: { tips: string; subscriptions: string; nftSales: string; royalties: string; total: string };\n percentages: { tips: string; subscriptions: string; nftSales: string; royalties: string };\n }>('GET', '/api/payouts/breakdown');\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get earnings breakdown',\n };\n }\n }\n\n /**\n * Get current platform fee for payouts\n */\n async getPayoutsPlatformFee(): Promise<PlatformFeeResponse> {\n try {\n return await this.request<PlatformFeeResponse>('GET', '/api/payouts/platform-fee');\n } catch (error) {\n return {\n feeBps: 0,\n feePercent: '0',\n };\n }\n }\n}\n\n// Default API URL (can be overridden)\nconst DEFAULT_API_URL = process.env.NEXT_PUBLIC_API_URL || 'https://ckgwifsxka.us-east-2.awsapprunner.com';\n\n// Singleton instance\nlet zubariApiClient: ZubariApiClient | null = null;\n\n/**\n * Get or create the Zubari API client instance\n */\nexport function getZubariApiClient(config?: Partial<ZubariApiConfig>): ZubariApiClient {\n if (!zubariApiClient || (config?.baseUrl && zubariApiClient['config'].baseUrl !== config.baseUrl)) {\n zubariApiClient = new ZubariApiClient({\n baseUrl: config?.baseUrl || DEFAULT_API_URL,\n timeout: config?.timeout,\n authToken: config?.authToken,\n });\n } else if (config?.authToken) {\n zubariApiClient.setAuthToken(config.authToken);\n }\n return zubariApiClient;\n}\n\n/**\n * Create a new Zubari API client instance\n */\nexport function createZubariApiClient(config: ZubariApiConfig): ZubariApiClient {\n return new ZubariApiClient(config);\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';\nimport { DERIVATION_PATHS as CANONICAL_PATHS } from '../config/networks';\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/**\n * Full derivation paths (with address index) derived from the canonical\n * base paths in config/networks.ts.\n */\nconst DERIVATION_PATHS = {\n ethereum: `${CANONICAL_PATHS.ethereum}/0`,\n bitcoin_mainnet: `${CANONICAL_PATHS.bitcoin}/0`,\n bitcoin_testnet: \"m/84'/1'/0'/0/0\",\n ton: `${CANONICAL_PATHS.ton}/0'/0'`,\n tron: `${CANONICAL_PATHS.tron}/0`,\n solana: `${CANONICAL_PATHS.solana}/0'`,\n spark: `${CANONICAL_PATHS.spark}/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","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/**\n * Canonical derivation paths for all supported chains.\n * This is the single source of truth -- all other files must import from here.\n *\n * These are *base* paths (without the address index). Append `/0` (or `/n`)\n * for the final derivation step where applicable.\n *\n * Bitcoin uses BIP-84 (native SegWit) rather than BIP-44 legacy.\n * TON uses hardened indices per Tether WDK convention.\n */\nexport const DERIVATION_PATHS: Record<NetworkType, string> = {\n bitcoin: \"m/84'/0'/0'/0\",\n ethereum: \"m/44'/60'/0'/0\",\n ton: \"m/44'/607'/0'\",\n tron: \"m/44'/195'/0'/0\",\n solana: \"m/44'/501'/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 * 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';\nimport { DERIVATION_PATHS as CANONICAL_PATHS } from '../config/networks';\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\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 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 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 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 basePath = CANONICAL_PATHS[chain];\n\n // Bitcoin testnet uses coin type 1 instead of 0\n if (chain === 'bitcoin' && this.config.network === 'testnet') {\n return \"m/84'/1'/0'/0/0\";\n }\n\n // Append address index based on chain convention\n switch (chain) {\n case 'ton':\n return `${basePath}/0'/0'`;\n case 'solana':\n return `${basePath}/0'`;\n case 'bitcoin':\n case 'ethereum':\n case 'tron':\n case 'spark':\n default:\n return `${basePath}/0`;\n }\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 * Transaction Service for Zubari SDK\n *\n * Provides multi-chain transaction capabilities using Tether WDK.\n * Supports Ethereum, Bitcoin, Solana, TON, TRON, and Spark (Lightning).\n *\n * @see https://docs.wallet.tether.io/\n */\n\nimport type { NetworkType, TxResult } from '../types';\n\n// Dynamic imports for ESM modules (WDK packages are ESM-only)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WdkManager: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WalletManagerBtc: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WalletManagerEvm: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WalletManagerSolana: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WalletManagerTon: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WalletManagerTron: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WalletManagerSpark: any;\n\nlet wdkLoaded = false;\nlet wdkLoadError: Error | null = null;\n\n/**\n * 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 * Dynamic import helper that bypasses TypeScript's CommonJS transformation\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst dynamicImport = new Function('specifier', 'return import(specifier)') as (\n specifier: string\n) => Promise<any>;\n\n/**\n * Dynamically load WDK modules (they are ESM-only)\n */\nasync function loadWdkModules(): Promise<void> {\n if (wdkLoaded) return;\n if (wdkLoadError) throw wdkLoadError;\n\n try {\n const [wdk, btc, evm, solana, ton, tron, spark] = await Promise.all([\n dynamicImport('@tetherto/wdk'),\n dynamicImport('@tetherto/wdk-wallet-btc'),\n dynamicImport('@tetherto/wdk-wallet-evm'),\n dynamicImport('@tetherto/wdk-wallet-solana'),\n dynamicImport('@tetherto/wdk-wallet-ton'),\n dynamicImport('@tetherto/wdk-wallet-tron'),\n dynamicImport('@tetherto/wdk-wallet-spark'),\n ]);\n\n WdkManager = wdk.default;\n WalletManagerBtc = btc.default;\n WalletManagerEvm = evm.default;\n WalletManagerSolana = solana.default;\n WalletManagerTon = ton.default;\n WalletManagerTron = tron.default;\n WalletManagerSpark = spark.default;\n wdkLoaded = true;\n } catch (error) {\n wdkLoadError = error instanceof Error ? error : new Error('Failed to load WDK modules');\n console.error('Failed to load WDK modules:', error);\n throw wdkLoadError;\n }\n}\n\n/**\n * Transaction parameters for sending\n */\nexport interface TransactionParams {\n /** Recipient address */\n to: string;\n /** Amount to send (in human-readable format, e.g., \"0.1\") */\n amount: string;\n /** Token address (optional, for ERC-20/SPL tokens) */\n token?: string;\n /** Transaction memo/message (for chains that support it) */\n memo?: string;\n /** Fee priority: 'slow' | 'medium' | 'fast' */\n feePriority?: 'slow' | 'medium' | 'fast';\n /** Custom gas limit (EVM chains) */\n gasLimit?: string;\n /** Custom gas price (EVM chains) */\n gasPrice?: string;\n}\n\n/**\n * Transaction result with detailed information\n */\nexport interface TransactionResult {\n /** Transaction hash */\n hash: string;\n /** Network/chain */\n network: NetworkType;\n /** Transaction status */\n status: 'pending' | 'confirmed' | 'failed';\n /** Block number (when confirmed) */\n blockNumber?: number;\n /** Gas used (EVM chains) */\n gasUsed?: string;\n /** Fee paid */\n fee?: string;\n /** Explorer URL */\n explorerUrl?: string;\n /** Error message if failed */\n error?: string;\n /** Timestamp */\n timestamp: number;\n}\n\n/**\n * Transaction history item\n */\nexport interface TransactionHistoryItem {\n hash: string;\n network: NetworkType;\n type: 'send' | 'receive' | 'swap' | 'contract';\n from: string;\n to: string;\n amount: string;\n token?: string;\n fee?: string;\n status: 'pending' | 'confirmed' | 'failed';\n timestamp: number;\n blockNumber?: number;\n}\n\n/**\n * Fee estimate for a transaction\n */\nexport interface FeeEstimate {\n slow: {\n fee: string;\n estimatedTime: string; // e.g., \"~30 min\"\n };\n medium: {\n fee: string;\n estimatedTime: string; // e.g., \"~5 min\"\n };\n fast: {\n fee: string;\n estimatedTime: string; // e.g., \"~1 min\"\n };\n}\n\n/**\n * Transaction Service configuration\n */\nexport interface TransactionServiceConfig {\n network: 'mainnet' | 'testnet';\n rpcUrls?: Partial<Record<NetworkType, string>>;\n}\n\n// Default RPC URLs\nconst DEFAULT_RPC_URLS = {\n mainnet: {\n ethereum: 'https://eth.llamarpc.com',\n bitcoin: '', // Uses Electrum\n solana: 'https://api.mainnet-beta.solana.com',\n ton: 'https://toncenter.com/api/v2/jsonRPC',\n tron: 'https://api.trongrid.io',\n spark: '', // Uses Spark network\n },\n testnet: {\n ethereum: 'https://ethereum-sepolia-rpc.publicnode.com',\n bitcoin: '', // Uses Electrum testnet\n solana: 'https://api.devnet.solana.com',\n ton: 'https://testnet.toncenter.com/api/v2/jsonRPC',\n tron: 'https://nile.trongrid.io',\n spark: '', // Uses Spark testnet\n },\n};\n\n// Explorer URLs\nconst EXPLORER_URLS = {\n mainnet: {\n ethereum: 'https://etherscan.io/tx/',\n bitcoin: 'https://mempool.space/tx/',\n solana: 'https://solscan.io/tx/',\n ton: 'https://tonscan.org/tx/',\n tron: 'https://tronscan.org/#/transaction/',\n spark: 'https://spark.info/tx/',\n },\n testnet: {\n ethereum: 'https://sepolia.etherscan.io/tx/',\n bitcoin: 'https://mempool.space/testnet/tx/',\n solana: 'https://solscan.io/tx/?cluster=devnet&tx=',\n ton: 'https://testnet.tonscan.org/tx/',\n tron: 'https://nile.tronscan.org/#/transaction/',\n spark: 'https://testnet.spark.info/tx/',\n },\n};\n\n/**\n * Transaction Service\n *\n * Provides multi-chain transaction capabilities:\n * - Send native tokens (ETH, BTC, SOL, TON, TRX)\n * - Send ERC-20/SPL tokens\n * - Fee estimation\n * - Transaction history\n */\nexport class TransactionService {\n private seed: string | null = null;\n private config: TransactionServiceConfig;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private wallets: Partial<Record<NetworkType, any>> = {};\n\n constructor(config: Partial<TransactionServiceConfig> = {}) {\n this.config = {\n network: config.network || 'mainnet',\n rpcUrls: config.rpcUrls,\n };\n }\n\n /**\n * Ensure WDK modules are loaded\n */\n private async ensureLoaded(): Promise<void> {\n await loadWdkModules();\n }\n\n /**\n * Get RPC URL for a chain\n */\n private getRpcUrl(chain: NetworkType): string {\n const networkUrls = DEFAULT_RPC_URLS[this.config.network];\n\n if (this.config.rpcUrls?.[chain]) {\n return this.config.rpcUrls[chain]!;\n }\n\n return networkUrls[chain as keyof typeof networkUrls] || '';\n }\n\n /**\n * Get explorer URL for a transaction\n */\n getExplorerUrl(chain: NetworkType, txHash: string): string {\n const explorers = EXPLORER_URLS[this.config.network];\n const baseUrl = explorers[chain as keyof typeof explorers] || '';\n return `${baseUrl}${txHash}`;\n }\n\n /**\n * Initialize the service with a seed phrase\n */\n async initialize(seed: string): Promise<void> {\n await this.ensureLoaded();\n\n if (!WdkManager.isValidSeed(seed)) {\n throw new Error('Invalid seed phrase');\n }\n\n this.seed = seed;\n this.wallets = {};\n }\n\n /**\n * Check if service is initialized\n */\n isInitialized(): boolean {\n return this.seed !== null;\n }\n\n /**\n * Get or create wallet instance for a specific chain\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private async getWallet(chain: NetworkType): Promise<any> {\n if (!this.seed) {\n throw new Error('TransactionService not initialized. Call initialize() first.');\n }\n\n // Return cached wallet if exists\n if (this.wallets[chain]) {\n return this.wallets[chain];\n }\n\n const isTestnet = this.config.network === 'testnet';\n\n try {\n switch (chain) {\n case 'ethereum': {\n const rpcUrl = this.getRpcUrl('ethereum');\n const wallet = new WalletManagerEvm(this.seed, { provider: rpcUrl });\n this.wallets[chain] = wallet;\n return wallet;\n }\n\n case 'bitcoin': {\n const wallet = new WalletManagerBtc(this.seed, {\n network: isTestnet ? 'testnet' : 'bitcoin',\n });\n this.wallets[chain] = wallet;\n return wallet;\n }\n\n case 'solana': {\n const rpcUrl = this.getRpcUrl('solana');\n const wallet = new WalletManagerSolana(this.seed, {\n rpcUrl,\n });\n this.wallets[chain] = wallet;\n return wallet;\n }\n\n case 'ton': {\n const url = this.getRpcUrl('ton');\n const wallet = new WalletManagerTon(this.seed, {\n tonClient: { url },\n });\n this.wallets[chain] = wallet;\n return wallet;\n }\n\n case 'tron': {\n const fullHost = this.getRpcUrl('tron');\n const wallet = new WalletManagerTron(this.seed, {\n provider: fullHost,\n });\n this.wallets[chain] = wallet;\n return wallet;\n }\n\n case 'spark': {\n const wallet = new WalletManagerSpark(this.seed, {\n network: isTestnet ? 'TESTNET' : 'MAINNET',\n });\n this.wallets[chain] = wallet;\n return wallet;\n }\n\n default:\n throw new Error(`Unsupported chain: ${chain}`);\n }\n } catch (error) {\n console.error(`Failed to initialize ${chain} wallet:`, error);\n throw error;\n }\n }\n\n /**\n * Estimate transaction fee\n */\n async estimateFee(chain: NetworkType, params: TransactionParams): Promise<FeeEstimate> {\n const wallet = await this.getWallet(chain);\n\n try {\n // Get fee rates from the wallet\n const feeRates = await wallet.getFeeRates();\n\n // Format based on chain type\n if (chain === 'ethereum') {\n return {\n slow: {\n fee: `${feeRates.slow || '0'} Gwei`,\n estimatedTime: '~10 min',\n },\n medium: {\n fee: `${feeRates.medium || feeRates.standard || '0'} Gwei`,\n estimatedTime: '~3 min',\n },\n fast: {\n fee: `${feeRates.fast || feeRates.high || '0'} Gwei`,\n estimatedTime: '~30 sec',\n },\n };\n } else if (chain === 'bitcoin') {\n return {\n slow: {\n fee: `${feeRates.slow || feeRates.low || '0'} sat/vB`,\n estimatedTime: '~60 min',\n },\n medium: {\n fee: `${feeRates.medium || feeRates.normal || '0'} sat/vB`,\n estimatedTime: '~30 min',\n },\n fast: {\n fee: `${feeRates.fast || feeRates.high || '0'} sat/vB`,\n estimatedTime: '~10 min',\n },\n };\n } else {\n // Generic format for other chains\n return {\n slow: {\n fee: String(feeRates.slow || feeRates.low || '0'),\n estimatedTime: '~10 min',\n },\n medium: {\n fee: String(feeRates.medium || feeRates.standard || '0'),\n estimatedTime: '~3 min',\n },\n fast: {\n fee: String(feeRates.fast || feeRates.high || '0'),\n estimatedTime: '~1 min',\n },\n };\n }\n } catch (error) {\n console.error(`Error estimating fee for ${chain}:`, error);\n // Return default fees on error\n return {\n slow: { fee: '0', estimatedTime: 'Unknown' },\n medium: { fee: '0', estimatedTime: 'Unknown' },\n fast: { fee: '0', estimatedTime: 'Unknown' },\n };\n }\n }\n\n /**\n * Send a transaction\n */\n async send(chain: NetworkType, params: TransactionParams): Promise<TransactionResult> {\n const wallet = await this.getWallet(chain);\n const account = await wallet.getAccount(0);\n\n const timestamp = Date.now();\n\n try {\n // Build and send transaction based on chain\n let txHash: string;\n\n if (params.token) {\n // Token transfer (ERC-20, SPL, TRC-20, etc.)\n txHash = await account.sendToken(params.to, params.amount, params.token, {\n memo: params.memo,\n feePriority: params.feePriority || 'medium',\n });\n } else {\n // Native token transfer\n txHash = await account.send(params.to, params.amount, {\n memo: params.memo,\n feePriority: params.feePriority || 'medium',\n gasLimit: params.gasLimit,\n gasPrice: params.gasPrice,\n });\n }\n\n return {\n hash: txHash,\n network: chain,\n status: 'pending',\n explorerUrl: this.getExplorerUrl(chain, txHash),\n timestamp,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Transaction failed';\n console.error(`Transaction failed on ${chain}:`, error);\n\n return {\n hash: '',\n network: chain,\n status: 'failed',\n error: errorMessage,\n timestamp,\n };\n }\n }\n\n /**\n * Get transaction status\n */\n async getTransactionStatus(chain: NetworkType, txHash: string): Promise<TransactionResult> {\n const wallet = await this.getWallet(chain);\n\n try {\n const tx = await wallet.getTransaction(txHash);\n\n return {\n hash: txHash,\n network: chain,\n status: tx.confirmed ? 'confirmed' : 'pending',\n blockNumber: tx.blockNumber,\n gasUsed: tx.gasUsed?.toString(),\n fee: tx.fee?.toString(),\n explorerUrl: this.getExplorerUrl(chain, txHash),\n timestamp: tx.timestamp || Date.now(),\n };\n } catch (error) {\n console.error(`Error getting transaction status for ${txHash}:`, error);\n return {\n hash: txHash,\n network: chain,\n status: 'pending',\n explorerUrl: this.getExplorerUrl(chain, txHash),\n timestamp: Date.now(),\n };\n }\n }\n\n /**\n * Get transaction history for an address\n */\n async getTransactionHistory(\n chain: NetworkType,\n limit: number = 10\n ): Promise<TransactionHistoryItem[]> {\n const wallet = await this.getWallet(chain);\n const account = await wallet.getAccount(0);\n\n try {\n const history = await account.getTransactions({ limit });\n\n return history.map((tx: any) => ({\n hash: tx.hash || tx.txHash,\n network: chain,\n type: tx.type || (tx.from === account.address ? 'send' : 'receive'),\n from: tx.from,\n to: tx.to,\n amount: tx.amount || tx.value,\n token: tx.token,\n fee: tx.fee?.toString(),\n status: tx.confirmed ? 'confirmed' : 'pending',\n timestamp: tx.timestamp || Date.now(),\n blockNumber: tx.blockNumber,\n }));\n } catch (error) {\n console.error(`Error getting transaction history for ${chain}:`, error);\n return [];\n }\n }\n\n /**\n * Get balance for a specific chain\n */\n async getBalance(chain: NetworkType): Promise<{ balance: string; balanceUsd: number }> {\n const wallet = await this.getWallet(chain);\n const account = await wallet.getAccount(0);\n\n try {\n const balance = await account.getBalance();\n const balanceStr = balance.toString();\n\n // Fetch USD price for this chain\n const priceUsd = await getPriceForChain(chain);\n const balanceNum = parseFloat(balanceStr) || 0;\n const balanceUsd = balanceNum * priceUsd;\n\n return {\n balance: balanceStr,\n balanceUsd,\n };\n } catch (error) {\n console.error(`Error getting balance for ${chain}:`, error);\n return { balance: '0', balanceUsd: 0 };\n }\n }\n\n /**\n * Get the current network configuration\n */\n getNetwork(): 'mainnet' | 'testnet' {\n return this.config.network;\n }\n\n /**\n * Clean up and dispose of wallet instances\n */\n dispose(): void {\n for (const wallet of Object.values(this.wallets)) {\n if (wallet && typeof wallet.dispose === 'function') {\n try {\n wallet.dispose();\n } catch {\n // Ignore dispose errors\n }\n }\n }\n this.wallets = {};\n this.seed = null;\n }\n}\n\n// Singleton instance\nlet transactionServiceInstance: TransactionService | null = null;\n\n/**\n * Get or create the Transaction service singleton\n */\nexport function getTransactionService(config?: Partial<TransactionServiceConfig>): TransactionService {\n if (!transactionServiceInstance || (config && config.network !== transactionServiceInstance.getNetwork())) {\n transactionServiceInstance = new TransactionService(config);\n }\n return transactionServiceInstance;\n}\n\n/**\n * Create a new Transaction service instance (non-singleton)\n */\nexport function createTransactionService(config?: Partial<TransactionServiceConfig>): TransactionService {\n return new TransactionService(config);\n}\n"]}
|