@zubari/sdk 0.2.8 → 0.3.1
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/{TransactionService-8xSEGoWA.d.mts → TransactionService-DURp3bRL.d.ts} +34 -10
- package/dist/{TransactionService-CaIcCoqY.d.ts → TransactionService-DuMJmrG3.d.mts} +34 -10
- package/dist/{WalletManager-CCs4Jsv7.d.ts → WalletManager-CEjN-YBF.d.ts} +12 -12
- package/dist/{WalletManager-B1qvFF4K.d.mts → WalletManager-bo35aHOJ.d.mts} +12 -12
- package/dist/{index-BOc9U2TK.d.mts → index-BpjMiC3n.d.ts} +22 -11
- package/dist/{index-Cx389p_j.d.mts → index-DF0Gf8NK.d.mts} +7 -1
- package/dist/{index-Cx389p_j.d.ts → index-DF0Gf8NK.d.ts} +7 -1
- package/dist/{index-Cqrpp3XA.d.ts → index-DJnsirV5.d.mts} +22 -11
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +3064 -1770
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3064 -1770
- package/dist/index.mjs.map +1 -1
- package/dist/protocols/index.d.mts +54 -22
- package/dist/protocols/index.d.ts +54 -22
- package/dist/protocols/index.js +1008 -76
- package/dist/protocols/index.js.map +1 -1
- package/dist/protocols/index.mjs +1008 -76
- 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 +884 -884
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +884 -884
- 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 +152 -75
- package/dist/services/index.js.map +1 -1
- package/dist/services/index.mjs +152 -75
- package/dist/services/index.mjs.map +1 -1
- package/dist/wallet/index.d.mts +3 -3
- package/dist/wallet/index.d.ts +3 -3
- package/dist/wallet/index.js +1352 -1105
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/index.mjs +1352 -1105
- package/dist/wallet/index.mjs.map +1 -1
- package/package.json +13 -12
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config/networks.ts","../src/config/contracts.ts","../src/wallet/ZubariWallet.ts","../src/security/KeyManager.ts","../src/storage/SecureStorage.ts","../src/services/WdkApiClient.ts","../src/services/BrowserAddressDerivation.ts","../src/services/ZubariWdkService.ts","../src/wallet/WalletManager.ts","../src/protocols/NFTProtocol.ts","../src/abi/ZubariMarket.json","../src/protocols/MarketProtocol.ts","../src/abi/ZubariTips.json","../src/protocols/TipsProtocol.ts","../src/abi/ZubariSubscription.json","../src/protocols/SubscriptionProtocol.ts","../src/protocols/PayoutsProtocol.ts","../src/services/SwapService.ts","../src/services/TransactionService.ts","../src/types/index.ts","../src/react/useWalletManager.ts","../src/utils/index.ts"],"names":["DERIVATION_PATHS","DEFAULT_API_URL","HDNodeWallet","viemFormatEther","wdkService","result","COINGECKO_IDS","priceCache","PRICE_CACHE_TTL","fetchPrices","getPriceForChain","dynamicImport"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { NetworkType } from '../types';\n\nexport interface NetworkConfig {\n name: string;\n chainId: number;\n coinType: number; // BIP-44 coin type\n rpcUrl: string;\n explorerUrl: string;\n nativeCurrency: {\n name: string;\n symbol: string;\n decimals: number;\n };\n isEvm: boolean;\n}\n\nexport const NETWORKS: Record<NetworkType, NetworkConfig> = {\n bitcoin: {\n name: 'Bitcoin',\n chainId: 0,\n coinType: 0, // m/44'/0'\n rpcUrl: 'https://blockstream.info/api',\n explorerUrl: 'https://blockstream.info',\n nativeCurrency: {\n name: 'Bitcoin',\n symbol: 'BTC',\n decimals: 8,\n },\n isEvm: false,\n },\n ethereum: {\n name: 'Ethereum',\n chainId: 1,\n coinType: 60, // m/44'/60'\n rpcUrl: 'https://eth.llamarpc.com',\n explorerUrl: 'https://etherscan.io',\n nativeCurrency: {\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n isEvm: true,\n },\n ton: {\n name: 'TON',\n chainId: -239,\n coinType: 607, // m/44'/607'\n rpcUrl: 'https://toncenter.com/api/v2',\n explorerUrl: 'https://tonscan.org',\n nativeCurrency: {\n name: 'Toncoin',\n symbol: 'TON',\n decimals: 9,\n },\n isEvm: false,\n },\n tron: {\n name: 'TRON',\n chainId: 728126428,\n coinType: 195, // m/44'/195'\n rpcUrl: 'https://api.trongrid.io',\n explorerUrl: 'https://tronscan.org',\n nativeCurrency: {\n name: 'TRON',\n symbol: 'TRX',\n decimals: 6,\n },\n isEvm: false,\n },\n solana: {\n name: 'Solana',\n chainId: 0,\n coinType: 501, // m/44'/501'\n rpcUrl: 'https://api.mainnet-beta.solana.com',\n explorerUrl: 'https://solscan.io',\n nativeCurrency: {\n name: 'Solana',\n symbol: 'SOL',\n decimals: 9,\n },\n isEvm: false,\n },\n spark: {\n name: 'Spark (Lightning)',\n chainId: 0,\n coinType: 998, // m/44'/998'\n rpcUrl: '',\n explorerUrl: '',\n nativeCurrency: {\n name: 'Bitcoin',\n symbol: 'BTC',\n decimals: 8,\n },\n isEvm: false,\n },\n};\n\nexport const TESTNET_NETWORKS: Partial<Record<NetworkType, Partial<NetworkConfig>>> = {\n bitcoin: {\n name: 'Bitcoin Testnet',\n rpcUrl: 'https://blockstream.info/testnet/api',\n explorerUrl: 'https://mempool.space/testnet',\n },\n ethereum: {\n name: 'Sepolia',\n chainId: 11155111,\n // Using eth-sepolia.g.alchemy.com public endpoint (more reliable than rpc.sepolia.org)\n // Fallback order: 1. Alchemy public, 2. Infura public, 3. BlockPi\n rpcUrl: 'https://ethereum-sepolia-rpc.publicnode.com',\n explorerUrl: 'https://sepolia.etherscan.io',\n },\n solana: {\n name: 'Solana Devnet',\n rpcUrl: 'https://api.devnet.solana.com',\n explorerUrl: 'https://solscan.io?cluster=devnet',\n },\n};\n\n// BIP-44 derivation paths\nexport const DERIVATION_PATHS: Record<NetworkType, string> = {\n bitcoin: \"m/44'/0'/0'/0\",\n ethereum: \"m/44'/60'/0'/0\",\n ton: \"m/44'/607'/0'/0\",\n tron: \"m/44'/195'/0'/0\",\n solana: \"m/44'/501'/0'/0\",\n spark: \"m/44'/998'/0'/0\",\n};\n\nexport function getNetworkConfig(\n network: NetworkType,\n isTestnet: boolean = false\n): NetworkConfig {\n const mainnetConfig = NETWORKS[network];\n if (!isTestnet) return mainnetConfig;\n\n const testnetOverrides = TESTNET_NETWORKS[network];\n if (!testnetOverrides) return mainnetConfig;\n\n return {\n ...mainnetConfig,\n ...testnetOverrides,\n };\n}\n","// Contract addresses for Zubari ecosystem\nexport interface ContractAddresses {\n registry: string;\n nft: string;\n nft1155: string; // ERC-1155 multi-edition NFT\n marketplace: string;\n tips: string;\n subscriptions: string;\n payouts: string;\n entryPoint: string;\n paymaster: string;\n accountFactory: string;\n usdt: string;\n weth: string;\n}\n\n// Zero address for ETH payments and placeholder addresses\nexport const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nexport const ZUBARI_CONTRACTS: Record<'testnet' | 'mainnet', ContractAddresses> = {\n testnet: {\n // Ethereum Sepolia (11155111) - Deployed 2024-12-31\n registry: '0xe5CE1Eb986f58BE42EEDFe5C18ee5956803b2BDC',\n nft: '0xc165b8C6843e8f0B1489525D0f853d23f22c677B', // ZubariNFT ERC-721 with payment\n nft1155: '0x5e618B5bEaE1dc41369E7aa235Cc3b9245905192', // Zubari1155 ERC-1155 multi-edition\n marketplace: '0xfcEfDa6C73aC357b8695E5F8F8d17820750BF207',\n tips: '0x86a9A306C7fCC9e0B8cd6859f6f15498d0046BB7',\n subscriptions: '0xaB7F17A85F61d9ab9f96bCB4e73e910D019978F7',\n payouts: '0x8aaB23Fb2a83A259E965Aae8Ee0938b1400B7E6b',\n entryPoint: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n paymaster: ZERO_ADDRESS, // Deploy with: npx hardhat run deploy/deploy.ts --network ethereum-sepolia\n accountFactory: ZERO_ADDRESS, // Not yet deployed\n usdt: '0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0', // USDT on Sepolia\n weth: '0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14',\n },\n mainnet: {\n // Ethereum Mainnet (1)\n registry: ZERO_ADDRESS,\n nft: ZERO_ADDRESS,\n nft1155: ZERO_ADDRESS,\n marketplace: ZERO_ADDRESS,\n tips: ZERO_ADDRESS,\n subscriptions: ZERO_ADDRESS,\n payouts: ZERO_ADDRESS,\n entryPoint: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n paymaster: ZERO_ADDRESS,\n accountFactory: ZERO_ADDRESS,\n usdt: '0xdAC17F958D2ee523a2206206994597C13D831ec7', // USDT on Ethereum\n weth: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n },\n};\n\n// Platform configuration\nexport const PLATFORM_CONFIG = {\n // Platform fee in basis points (300 = 3%)\n tipFeeBps: 300,\n // Maximum royalty in basis points (1000 = 10%)\n maxRoyaltyBps: 1000,\n // Default slippage tolerance for swaps (50 = 0.5%)\n defaultSlippageBps: 50,\n // Voucher validity in seconds (30 days)\n voucherValiditySecs: 30 * 24 * 60 * 60,\n // Swap deadline in seconds (30 minutes)\n swapDeadlineSecs: 30 * 60,\n} as const;\n\n// EIP-712 Domain for lazy minting\nexport const NFT_VOUCHER_DOMAIN = {\n name: 'ZubariNFT',\n version: '1',\n} as const;\n\nexport const NFT_VOUCHER_TYPES = {\n NFTVoucher: [\n { name: 'tokenId', type: 'bytes32' },\n { name: 'uri', type: 'string' },\n { name: 'creator', type: 'address' },\n { name: 'royaltyBps', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n // Pricing fields\n { name: 'price', type: 'uint256' },\n { name: 'currency', type: 'address' },\n { name: 'nonce', type: 'uint256' },\n // Watermarking fields\n { name: 'contentHash', type: 'bytes32' },\n { name: 'userId', type: 'bytes32' },\n { name: 'watermarkTimestamp', type: 'uint256' },\n { name: 'sessionId', type: 'bytes32' },\n ],\n} as const;\n\n// 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: '0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0', // USDT on Sepolia\n },\n mainnet: {\n ETH: ZERO_ADDRESS,\n USDT: '0xdAC17F958D2ee523a2206206994597C13D831ec7', // USDT on Ethereum\n },\n} as const;\n\nexport function getContractAddresses(network: 'testnet' | 'mainnet'): ContractAddresses {\n return ZUBARI_CONTRACTS[network];\n}\n\n// Multi-chain Fee/Treasury Wallet Addresses\n// These wallets receive platform fees from transactions on their respective chains\nexport interface FeeWalletConfig {\n address: string;\n name: string;\n network: string;\n chainId?: number;\n}\n\nexport type SupportedFeeChain = 'ETH' | 'BTC' | 'SOLANA' | 'TON' | 'TRON';\n\n/**\n * Mainnet Fee Wallet Addresses\n * These are the production treasury wallets for collecting platform fees\n */\nexport const MAINNET_FEE_WALLETS: Record<SupportedFeeChain, FeeWalletConfig> = {\n // Ethereum (ETH, ERC-20 tokens like USDT)\n ETH: {\n address: '0x40Df60a57d02a7bB04B6624c65E2908Cc006badE',\n name: 'Zubari ETH Treasury',\n network: 'ethereum',\n chainId: 1,\n },\n // Bitcoin\n BTC: {\n address: 'bc1qh20fx23wk34pcm3zp0v9wctwprtl02uvh6q9qj',\n name: 'Zubari BTC Treasury',\n network: 'bitcoin',\n },\n // Solana (SOL, SPL tokens)\n SOLANA: {\n address: '2hXGumVRpD5KgdqNZUuYJ2YoyLR6jc8mvWbubciWjPuZ',\n name: 'Zubari Solana Treasury',\n network: 'solana',\n },\n // TON (The Open Network)\n TON: {\n address: 'UQB5hOrm9YGoKjrCVmvAUFgmApkvKWqVMROjieKs3z4kDz99',\n name: 'Zubari TON Treasury',\n network: 'ton',\n },\n // Tron (TRX, TRC-20 tokens like USDT)\n TRON: {\n address: 'TVBPjQFNe8JgVctDKWMxJNgjbPZoP6uu5h',\n name: 'Zubari Tron Treasury',\n network: 'tron',\n },\n} as const;\n\n/**\n * Testnet Fee Wallet Addresses\n * These are used for development and testing\n */\nexport const TESTNET_FEE_WALLETS: Record<SupportedFeeChain, FeeWalletConfig> = {\n // Ethereum Sepolia\n ETH: {\n address: ZERO_ADDRESS, // Configure via environment\n name: 'Zubari ETH Testnet Treasury',\n network: 'sepolia',\n chainId: 11155111,\n },\n // Bitcoin Testnet\n BTC: {\n address: '',\n name: 'Zubari BTC Testnet Treasury',\n network: 'bitcoin-testnet',\n },\n // Solana Devnet\n SOLANA: {\n address: '',\n name: 'Zubari Solana Devnet Treasury',\n network: 'solana-devnet',\n },\n // TON Testnet\n TON: {\n address: '',\n name: 'Zubari TON Testnet Treasury',\n network: 'ton-testnet',\n },\n // Tron Shasta Testnet\n TRON: {\n address: '',\n name: 'Zubari Tron Testnet Treasury',\n network: 'tron-shasta',\n },\n} as const;\n\n/**\n * Get fee wallet address for a specific chain\n * @param chain - The blockchain network\n * @param isMainnet - Whether to use mainnet addresses (default: false for testnet)\n */\nexport function getFeeWallet(chain: SupportedFeeChain, isMainnet: boolean = false): FeeWalletConfig {\n return isMainnet ? MAINNET_FEE_WALLETS[chain] : TESTNET_FEE_WALLETS[chain];\n}\n\n/**\n * Get all fee wallets for a network type\n * @param isMainnet - Whether to use mainnet addresses\n */\nexport function getAllFeeWallets(isMainnet: boolean = false): Record<SupportedFeeChain, FeeWalletConfig> {\n return isMainnet ? MAINNET_FEE_WALLETS : TESTNET_FEE_WALLETS;\n}\n","import type {\n ZubariWalletConfig,\n NetworkType,\n NetworkBalance,\n TxResult,\n Account,\n SendParams,\n} from '../types';\nimport { getNetworkConfig, DERIVATION_PATHS } from '../config/networks';\nimport { getContractAddresses } from '../config/contracts';\n\n/**\n * ZubariWallet - Multi-chain self-custodial wallet\n *\n * Core wallet class that manages accounts across multiple blockchain networks\n * using Tether WDK as the underlying infrastructure layer.\n */\nexport class ZubariWallet {\n private readonly seed: string;\n private readonly config: ZubariWalletConfig;\n private readonly accounts: Map<NetworkType, Account> = new Map();\n private initialized: boolean = false;\n\n constructor(seed: string, config: ZubariWalletConfig) {\n this.seed = seed;\n this.config = {\n network: config.network || 'mainnet',\n enabledNetworks: config.enabledNetworks || ['ethereum'],\n gasless: config.gasless ?? false,\n paymasterUrl: config.paymasterUrl,\n bundlerUrl: config.bundlerUrl,\n rpcUrls: config.rpcUrls,\n };\n }\n\n /**\n * Initialize the wallet by deriving accounts for all enabled networks\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n for (const network of this.config.enabledNetworks) {\n await this.deriveAccount(network);\n }\n\n this.initialized = true;\n }\n\n /**\n * Derive account for a specific network using BIP-44\n */\n private async deriveAccount(network: NetworkType, index: number = 0): Promise<Account> {\n const networkConfig = getNetworkConfig(network, this.config.network === 'testnet');\n const basePath = DERIVATION_PATHS[network];\n const derivationPath = `${basePath}/${index}`;\n\n // This is a placeholder implementation\n // Real implementation will use WDK wallet managers\n const account: Account = {\n network,\n address: '', // Will be derived using WDK\n publicKey: '',\n derivationPath,\n };\n\n this.accounts.set(network, account);\n return account;\n }\n\n /**\n * Get account for a specific network\n */\n async getAccount(network: NetworkType, index: number = 0): Promise<Account> {\n const existing = this.accounts.get(network);\n if (existing && existing.derivationPath.endsWith(`/${index}`)) {\n return existing;\n }\n return this.deriveAccount(network, index);\n }\n\n /**\n * Get address for a specific network\n */\n async getAddress(network: NetworkType): Promise<string> {\n const account = await this.getAccount(network);\n return account.address;\n }\n\n /**\n * Get all addresses for enabled networks\n */\n async getAllAddresses(): Promise<Record<NetworkType, string>> {\n const addresses: Partial<Record<NetworkType, string>> = {};\n\n for (const network of this.config.enabledNetworks) {\n addresses[network] = await this.getAddress(network);\n }\n\n return addresses as Record<NetworkType, string>;\n }\n\n /**\n * Get balance for a specific network\n */\n async getBalance(network: NetworkType): Promise<NetworkBalance> {\n const networkConfig = getNetworkConfig(network, this.config.network === 'testnet');\n\n // Placeholder implementation - will use WDK\n return {\n network,\n native: {\n symbol: networkConfig.nativeCurrency.symbol,\n balance: BigInt(0),\n balanceFormatted: '0',\n balanceUsd: 0,\n },\n tokens: [],\n };\n }\n\n /**\n * Get balances for all enabled networks\n */\n async getAllBalances(): Promise<NetworkBalance[]> {\n const balances: NetworkBalance[] = [];\n\n for (const network of this.config.enabledNetworks) {\n balances.push(await this.getBalance(network));\n }\n\n return balances;\n }\n\n /**\n * Get total portfolio value in USD\n */\n async getTotalPortfolioUsd(): Promise<number> {\n const balances = await this.getAllBalances();\n let total = 0;\n\n for (const balance of balances) {\n total += balance.native.balanceUsd;\n for (const token of balance.tokens) {\n total += token.balanceUsd;\n }\n }\n\n return total;\n }\n\n /**\n * Send native currency on a specific network\n */\n async send(network: NetworkType, params: SendParams): Promise<TxResult> {\n const { to, amount, gasless } = params;\n const useGasless = gasless ?? (this.config.gasless && network === 'ethereum');\n\n // Placeholder implementation - will use WDK\n return {\n hash: '',\n network,\n status: 'pending',\n };\n }\n\n /**\n * Send ERC-20 token on EVM networks\n */\n async sendToken(\n network: NetworkType,\n token: string,\n to: string,\n amount: bigint\n ): Promise<TxResult> {\n const networkConfig = getNetworkConfig(network, this.config.network === 'testnet');\n\n if (!networkConfig.isEvm) {\n throw new Error(`sendToken is only supported on EVM networks. ${network} is not an EVM chain.`);\n }\n\n // Placeholder implementation - will use WDK\n return {\n hash: '',\n network,\n status: 'pending',\n };\n }\n\n /**\n * Send Bitcoin on-chain using WalletManagerBtc\n * @param to - Destination address (bc1q... for native segwit)\n * @param amount - Amount in satoshis\n */\n async sendBitcoin(to: string, amount: bigint): Promise<TxResult> {\n // Validate Bitcoin address format\n if (!this.isValidBitcoinAddress(to)) {\n throw new Error('Invalid Bitcoin address. Expected bc1q... (native segwit) format.');\n }\n\n // Use WDK WalletManagerBtc for transaction\n // const btcManager = new WalletManagerBtc({ seed: this.seed });\n // const tx = await btcManager.send(to, amount);\n\n return this.send('bitcoin', { to, amount });\n }\n\n /**\n * Validate Bitcoin address format\n */\n private isValidBitcoinAddress(address: string): boolean {\n // Native SegWit (bech32)\n if (address.startsWith('bc1q') || address.startsWith('tb1q')) {\n return address.length >= 42 && address.length <= 62;\n }\n // Legacy P2PKH\n if (address.startsWith('1') || address.startsWith('m') || address.startsWith('n')) {\n return address.length >= 25 && address.length <= 34;\n }\n // P2SH\n if (address.startsWith('3') || address.startsWith('2')) {\n return address.length >= 25 && address.length <= 34;\n }\n return false;\n }\n\n /**\n * Get Bitcoin address (native segwit bc1q...)\n */\n async getBitcoinAddress(): Promise<string> {\n const account = await this.getAccount('bitcoin');\n return account.address;\n }\n\n /**\n * Pay Lightning invoice via Spark network\n * Uses WDK WalletManagerSpark (m/44'/998')\n * @param invoice - Lightning invoice string (lnbc...)\n */\n async sendLightning(invoice: string): Promise<TxResult> {\n // Validate Lightning invoice format\n if (!this.isValidLightningInvoice(invoice)) {\n throw new Error('Invalid Lightning invoice format. Expected lnbc... or lntb...');\n }\n\n // Decode invoice to get amount and destination\n const invoiceDetails = this.decodeLightningInvoice(invoice);\n\n // Use WDK WalletManagerSpark for payment\n // const sparkManager = new WalletManagerSpark({ seed: this.seed, feeFree: true });\n // const payment = await sparkManager.payInvoice(invoice);\n\n return {\n hash: '', // Will be payment hash from Spark\n network: 'spark',\n status: 'pending',\n metadata: {\n invoice,\n amount: invoiceDetails.amount,\n destination: invoiceDetails.destination,\n },\n };\n }\n\n /**\n * Create Lightning invoice via Spark\n * @param amount - Amount in millisatoshis\n * @param memo - Optional payment memo\n * @returns Lightning invoice string (lnbc...)\n */\n async createLightningInvoice(amount: bigint, memo?: string): Promise<string> {\n if (amount <= 0) {\n throw new Error('Invoice amount must be greater than 0');\n }\n\n // Use WDK WalletManagerSpark to create invoice\n // const sparkManager = new WalletManagerSpark({ seed: this.seed, feeFree: true });\n // const invoice = await sparkManager.createInvoice(amount, memo);\n\n // Placeholder - actual implementation uses Spark\n const isTestnet = this.config.network === 'testnet';\n const prefix = isTestnet ? 'lntb' : 'lnbc';\n\n // This is a placeholder - real invoice comes from Spark\n return `${prefix}${amount}m1...`;\n }\n\n /**\n * Validate Lightning invoice format\n */\n private isValidLightningInvoice(invoice: string): boolean {\n const lowerInvoice = invoice.toLowerCase();\n return (\n lowerInvoice.startsWith('lnbc') || // Mainnet\n lowerInvoice.startsWith('lntb') || // Testnet\n lowerInvoice.startsWith('lnbcrt') // Regtest\n );\n }\n\n /**\n * Decode Lightning invoice (basic parsing)\n */\n private decodeLightningInvoice(invoice: string): {\n amount: bigint;\n destination: string;\n expiry: number;\n } {\n // Real implementation would use bolt11 library\n // This is a placeholder structure\n return {\n amount: BigInt(0),\n destination: '',\n expiry: 3600,\n };\n }\n\n /**\n * Get Lightning (Spark) balance\n */\n async getLightningBalance(): Promise<{\n available: bigint;\n pending: bigint;\n }> {\n // Use WDK WalletManagerSpark\n // const sparkManager = new WalletManagerSpark({ seed: this.seed });\n // return sparkManager.getBalance();\n\n return {\n available: BigInt(0),\n pending: BigInt(0),\n };\n }\n\n /**\n * Get configuration\n */\n getConfig(): ZubariWalletConfig {\n return { ...this.config };\n }\n\n /**\n * Check if wallet is initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * Get contract addresses for current network\n */\n getContractAddresses() {\n return getContractAddresses(this.config.network);\n }\n}\n","/**\n * KeyManager - Secure key storage and encryption\n *\n * Handles seed phrase encryption using AES-256-GCM\n * with PBKDF2 key derivation from user password.\n */\nexport class KeyManager {\n private static readonly ALGORITHM = 'AES-GCM';\n private static readonly KEY_LENGTH = 256;\n private static readonly IV_LENGTH = 12;\n private static readonly SALT_LENGTH = 16;\n private static readonly PBKDF2_ITERATIONS = 100000;\n\n /**\n * Encrypt a seed phrase with a password\n */\n static async encryptSeed(seed: string, password: string): Promise<string> {\n const encoder = new TextEncoder();\n const seedData = encoder.encode(seed);\n\n // Generate random salt and IV\n const salt = crypto.getRandomValues(new Uint8Array(this.SALT_LENGTH));\n const iv = crypto.getRandomValues(new Uint8Array(this.IV_LENGTH));\n\n // Derive key from password\n const key = await this.deriveKey(password, salt);\n\n // Encrypt\n const encrypted = await crypto.subtle.encrypt(\n { name: this.ALGORITHM, iv },\n key,\n seedData\n );\n\n // Combine salt + iv + encrypted data\n const combined = new Uint8Array(salt.length + iv.length + encrypted.byteLength);\n combined.set(salt, 0);\n combined.set(iv, salt.length);\n combined.set(new Uint8Array(encrypted), salt.length + iv.length);\n\n // Return as base64\n return btoa(String.fromCharCode(...combined));\n }\n\n /**\n * Decrypt a seed phrase with a password\n */\n static async decryptSeed(encryptedData: string, password: string): Promise<string> {\n // Decode from base64\n const combined = new Uint8Array(\n atob(encryptedData)\n .split('')\n .map(c => c.charCodeAt(0))\n );\n\n // Extract salt, iv, and encrypted data\n const salt = combined.slice(0, this.SALT_LENGTH);\n const iv = combined.slice(this.SALT_LENGTH, this.SALT_LENGTH + this.IV_LENGTH);\n const encrypted = combined.slice(this.SALT_LENGTH + this.IV_LENGTH);\n\n // Derive key from password\n const key = await this.deriveKey(password, salt);\n\n // Decrypt\n const decrypted = await crypto.subtle.decrypt(\n { name: this.ALGORITHM, iv },\n key,\n encrypted\n );\n\n const decoder = new TextDecoder();\n return decoder.decode(decrypted);\n }\n\n /**\n * Derive encryption key from password using PBKDF2\n */\n private static async deriveKey(\n password: string,\n salt: Uint8Array\n ): Promise<CryptoKey> {\n const encoder = new TextEncoder();\n const passwordData = encoder.encode(password);\n\n // Import password as key material\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n passwordData,\n 'PBKDF2',\n false,\n ['deriveKey']\n );\n\n // Derive AES key\n return crypto.subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt: salt.buffer.slice(salt.byteOffset, salt.byteOffset + salt.byteLength) as ArrayBuffer,\n iterations: this.PBKDF2_ITERATIONS,\n hash: 'SHA-256',\n },\n keyMaterial,\n { name: this.ALGORITHM, length: this.KEY_LENGTH },\n false,\n ['encrypt', 'decrypt']\n );\n }\n\n /**\n * Validate a BIP-39 seed phrase (basic validation)\n */\n static validateSeedPhrase(seed: string): boolean {\n const words = seed.trim().split(/\\s+/);\n // BIP-39 supports 12, 15, 18, 21, or 24 words\n const validWordCounts = [12, 15, 18, 21, 24];\n return validWordCounts.includes(words.length);\n }\n\n /**\n * Generate a random encryption key (for backup purposes)\n */\n static generateBackupKey(): string {\n const bytes = crypto.getRandomValues(new Uint8Array(32));\n return Array.from(bytes)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n }\n}\n","/**\n * Secure Storage Interface\n * Platform-agnostic interface for secure key storage\n */\nexport interface SecureStorageAdapter {\n /**\n * Store a value securely\n */\n setItem(key: string, value: string): Promise<void>;\n\n /**\n * Retrieve a value\n */\n getItem(key: string): Promise<string | null>;\n\n /**\n * Remove a value\n */\n removeItem(key: string): Promise<void>;\n\n /**\n * Check if a key exists\n */\n hasItem(key: string): Promise<boolean>;\n\n /**\n * Clear all stored values\n */\n clear(): Promise<void>;\n}\n\n/**\n * iOS Keychain Storage Adapter\n * Uses react-native-keychain for iOS Keychain access\n */\nexport class KeychainStorageAdapter implements SecureStorageAdapter {\n private serviceName: string;\n\n constructor(serviceName: string = 'com.zubari.wallet') {\n this.serviceName = serviceName;\n }\n\n async setItem(key: string, value: string): Promise<void> {\n // In React Native, use react-native-keychain\n // const Keychain = require('react-native-keychain');\n // await Keychain.setGenericPassword(key, value, { service: this.serviceName });\n\n // Placeholder for native implementation\n if (typeof global !== 'undefined' && (global as any).KeychainModule) {\n await (global as any).KeychainModule.setItem(this.serviceName, key, value);\n } else {\n throw new Error('Keychain not available on this platform');\n }\n }\n\n async getItem(key: string): Promise<string | null> {\n if (typeof global !== 'undefined' && (global as any).KeychainModule) {\n return (global as any).KeychainModule.getItem(this.serviceName, key);\n }\n throw new Error('Keychain not available on this platform');\n }\n\n async removeItem(key: string): Promise<void> {\n if (typeof global !== 'undefined' && (global as any).KeychainModule) {\n await (global as any).KeychainModule.removeItem(this.serviceName, key);\n } else {\n throw new Error('Keychain not available on this platform');\n }\n }\n\n async hasItem(key: string): Promise<boolean> {\n const value = await this.getItem(key);\n return value !== null;\n }\n\n async clear(): Promise<void> {\n if (typeof global !== 'undefined' && (global as any).KeychainModule) {\n await (global as any).KeychainModule.clear(this.serviceName);\n } else {\n throw new Error('Keychain not available on this platform');\n }\n }\n}\n\n/**\n * Android Keystore Storage Adapter\n * Uses Android Keystore for secure storage\n */\nexport class KeystoreStorageAdapter implements SecureStorageAdapter {\n private alias: string;\n\n constructor(alias: string = 'zubari_wallet_keys') {\n this.alias = alias;\n }\n\n async setItem(key: string, value: string): Promise<void> {\n // In React Native, use react-native-encrypted-storage or similar\n // const EncryptedStorage = require('react-native-encrypted-storage');\n // await EncryptedStorage.setItem(key, value);\n\n if (typeof global !== 'undefined' && (global as any).KeystoreModule) {\n await (global as any).KeystoreModule.setItem(this.alias, key, value);\n } else {\n throw new Error('Keystore not available on this platform');\n }\n }\n\n async getItem(key: string): Promise<string | null> {\n if (typeof global !== 'undefined' && (global as any).KeystoreModule) {\n return (global as any).KeystoreModule.getItem(this.alias, key);\n }\n throw new Error('Keystore not available on this platform');\n }\n\n async removeItem(key: string): Promise<void> {\n if (typeof global !== 'undefined' && (global as any).KeystoreModule) {\n await (global as any).KeystoreModule.removeItem(this.alias, key);\n } else {\n throw new Error('Keystore not available on this platform');\n }\n }\n\n async hasItem(key: string): Promise<boolean> {\n const value = await this.getItem(key);\n return value !== null;\n }\n\n async clear(): Promise<void> {\n if (typeof global !== 'undefined' && (global as any).KeystoreModule) {\n await (global as any).KeystoreModule.clear(this.alias);\n } else {\n throw new Error('Keystore not available on this platform');\n }\n }\n}\n\n/**\n * Web Encrypted LocalStorage Adapter\n * Uses Web Crypto API for encryption with localStorage\n */\nexport class WebEncryptedStorageAdapter implements SecureStorageAdapter {\n private encryptionKey: CryptoKey | null = null;\n private storagePrefix: string;\n\n constructor(storagePrefix: string = 'zubari_') {\n this.storagePrefix = storagePrefix;\n }\n\n /**\n * Initialize with a password-derived key\n */\n async initialize(password: string): Promise<void> {\n const encoder = new TextEncoder();\n const salt = this.getSalt();\n\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveKey']\n );\n\n this.encryptionKey = await crypto.subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt: salt.buffer as ArrayBuffer,\n iterations: 100000,\n hash: 'SHA-256',\n },\n keyMaterial,\n { name: 'AES-GCM', length: 256 },\n false,\n ['encrypt', 'decrypt']\n );\n }\n\n private getSalt(): Uint8Array {\n const saltKey = `${this.storagePrefix}salt`;\n let saltHex = localStorage.getItem(saltKey);\n\n if (!saltHex) {\n const salt = crypto.getRandomValues(new Uint8Array(16));\n saltHex = Array.from(salt)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n localStorage.setItem(saltKey, saltHex);\n }\n\n return new Uint8Array(\n saltHex.match(/.{1,2}/g)!.map((byte) => parseInt(byte, 16))\n );\n }\n\n async setItem(key: string, value: string): Promise<void> {\n if (!this.encryptionKey) {\n throw new Error('Storage not initialized. Call initialize() first.');\n }\n\n const encoder = new TextEncoder();\n const iv = crypto.getRandomValues(new Uint8Array(12));\n\n const encrypted = await crypto.subtle.encrypt(\n { name: 'AES-GCM', iv },\n this.encryptionKey,\n encoder.encode(value)\n );\n\n const combined = new Uint8Array(iv.length + encrypted.byteLength);\n combined.set(iv);\n combined.set(new Uint8Array(encrypted), iv.length);\n\n const base64 = btoa(String.fromCharCode(...combined));\n localStorage.setItem(`${this.storagePrefix}${key}`, base64);\n }\n\n async getItem(key: string): Promise<string | null> {\n if (!this.encryptionKey) {\n throw new Error('Storage not initialized. Call initialize() first.');\n }\n\n const base64 = localStorage.getItem(`${this.storagePrefix}${key}`);\n if (!base64) return null;\n\n try {\n const combined = new Uint8Array(\n atob(base64)\n .split('')\n .map((c) => c.charCodeAt(0))\n );\n\n const iv = combined.slice(0, 12);\n const encrypted = combined.slice(12);\n\n const decrypted = await crypto.subtle.decrypt(\n { name: 'AES-GCM', iv },\n this.encryptionKey,\n encrypted\n );\n\n const decoder = new TextDecoder();\n return decoder.decode(decrypted);\n } catch {\n return null;\n }\n }\n\n async removeItem(key: string): Promise<void> {\n localStorage.removeItem(`${this.storagePrefix}${key}`);\n }\n\n async hasItem(key: string): Promise<boolean> {\n return localStorage.getItem(`${this.storagePrefix}${key}`) !== null;\n }\n\n async clear(): Promise<void> {\n const keysToRemove: string[] = [];\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(this.storagePrefix)) {\n keysToRemove.push(key);\n }\n }\n\n keysToRemove.forEach((key) => localStorage.removeItem(key));\n }\n}\n\n/**\n * In-Memory Storage Adapter (for testing)\n */\nexport class MemoryStorageAdapter implements SecureStorageAdapter {\n private storage: Map<string, string> = new Map();\n\n async setItem(key: string, value: string): Promise<void> {\n this.storage.set(key, value);\n }\n\n async getItem(key: string): Promise<string | null> {\n return this.storage.get(key) || null;\n }\n\n async removeItem(key: string): Promise<void> {\n this.storage.delete(key);\n }\n\n async hasItem(key: string): Promise<boolean> {\n return this.storage.has(key);\n }\n\n async clear(): Promise<void> {\n this.storage.clear();\n }\n}\n\n/**\n * Secure Storage Factory\n * Creates appropriate storage adapter based on platform\n */\nexport function createSecureStorage(): SecureStorageAdapter {\n // Check for React Native\n if (\n typeof global !== 'undefined' &&\n (global as any).nativeModuleProxy !== undefined\n ) {\n // Check platform\n const Platform = (global as any).Platform;\n if (Platform?.OS === 'ios') {\n return new KeychainStorageAdapter();\n } else if (Platform?.OS === 'android') {\n return new KeystoreStorageAdapter();\n }\n }\n\n // Check for browser environment\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n return new WebEncryptedStorageAdapter();\n }\n\n // Fallback to memory storage (for Node.js/testing)\n return new MemoryStorageAdapter();\n}\n","/**\n * WDK API Client\n *\n * Client for calling the backend WDK endpoints to derive addresses\n * using Tether WDK (which runs server-side in Node.js).\n */\n\nimport type { NetworkType } from '../types';\n\nexport interface WdkApiConfig {\n baseUrl: string;\n timeout?: number;\n}\n\nexport interface DeriveAddressResponse {\n success: boolean;\n address?: string;\n chain?: string;\n path?: string;\n network?: string;\n error?: string;\n}\n\nexport interface DeriveAllAddressesResponse {\n success: boolean;\n addresses?: {\n ethereum: string | null;\n bitcoin: string | null;\n ton: string | null;\n tron: string | null;\n solana: string | null;\n spark: string | null;\n };\n network?: string;\n error?: string;\n}\n\nexport interface ValidateSeedResponse {\n success: boolean;\n isValid?: boolean;\n wordCount?: number;\n error?: string;\n}\n\nexport interface GenerateSeedResponse {\n success: boolean;\n seed?: string;\n wordCount?: number;\n error?: string;\n}\n\nexport interface TransactionHistoryItem {\n hash: string;\n from: string;\n to: string;\n value: string;\n timestamp: number;\n status: 'confirmed' | 'pending' | 'failed';\n blockNumber?: number;\n}\n\nexport interface TransactionHistoryResponse {\n success: boolean;\n address?: string;\n transactions?: TransactionHistoryItem[];\n chain?: string;\n network?: string;\n error?: string;\n}\n\nexport interface SendTransactionResponse {\n success: boolean;\n txHash?: string;\n from?: string;\n to?: string;\n amount?: string;\n chain?: string;\n network?: string;\n error?: string;\n}\n\nexport interface TransactionStatusResponse {\n success: boolean;\n hash?: string;\n status?: 'confirmed' | 'pending' | 'failed';\n blockNumber?: number;\n confirmations?: number;\n timestamp?: number;\n from?: string;\n to?: string;\n value?: string;\n fee?: string;\n chain?: string;\n network?: string;\n error?: string;\n}\n\n/**\n * WDK API Client for server-side Tether WDK integration\n */\nexport class WdkApiClient {\n private config: Required<WdkApiConfig>;\n\n constructor(config: WdkApiConfig) {\n this.config = {\n baseUrl: config.baseUrl,\n timeout: config.timeout || 30000,\n };\n }\n\n /**\n * Generate a new BIP-39 seed phrase using Tether WDK\n */\n async generateSeed(): Promise<GenerateSeedResponse> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/generate-seed`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n return await response.json();\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to generate seed',\n };\n }\n }\n\n /**\n * Validate a BIP-39 seed phrase\n */\n async validateSeed(seed: string): Promise<ValidateSeedResponse> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/validate-seed`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ seed }),\n });\n\n return await response.json();\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to validate seed',\n };\n }\n }\n\n /**\n * Derive address for a specific chain using Tether WDK\n */\n async deriveAddress(\n seed: string,\n chain: NetworkType,\n network: 'mainnet' | 'testnet' = 'testnet'\n ): Promise<DeriveAddressResponse> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/derive-address`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ seed, chain, network }),\n });\n\n return await response.json();\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to derive address',\n };\n }\n }\n\n /**\n * Derive addresses for all chains using Tether WDK\n */\n async deriveAllAddresses(\n seed: string,\n network: 'mainnet' | 'testnet' = 'testnet'\n ): Promise<DeriveAllAddressesResponse> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/derive-all`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ seed, network }),\n });\n\n return await response.json();\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to derive addresses',\n };\n }\n }\n\n /**\n * Send a transaction on a specific chain using Tether WDK\n */\n async sendTransaction(\n seed: string,\n chain: NetworkType,\n to: string,\n amount: string,\n network: 'mainnet' | 'testnet' = 'testnet'\n ): Promise<SendTransactionResponse> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/send`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ seed, chain, to, amount, network }),\n });\n\n return await response.json();\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to send transaction',\n };\n }\n }\n\n /**\n * Get transaction history for an address on a specific chain\n * Fetches from blockchain explorers (Etherscan, mempool.space, etc.)\n */\n async getTransactionHistory(\n seed: string,\n chain: NetworkType,\n network: 'mainnet' | 'testnet' = 'testnet',\n limit: number = 10\n ): Promise<TransactionHistoryResponse> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/history`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ seed, chain, network, limit }),\n });\n\n return await response.json();\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get transaction history',\n };\n }\n }\n\n /**\n * Get transaction status by hash\n * Fetches from blockchain explorers to check confirmation status\n */\n async getTransactionStatus(\n txHash: string,\n chain: NetworkType,\n network: 'mainnet' | 'testnet' = 'testnet'\n ): Promise<TransactionStatusResponse> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/tx-status`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ txHash, chain, network }),\n });\n\n return await response.json();\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get transaction status',\n };\n }\n }\n}\n\n// Default API URL (can be overridden)\n// Uses the Zubari production API which has Tether WDK integrated\nconst DEFAULT_API_URL = process.env.NEXT_PUBLIC_API_URL || 'https://ckgwifsxka.us-east-2.awsapprunner.com';\n\n// Singleton instance\nlet wdkApiClient: WdkApiClient | null = null;\n\n/**\n * Get or create the WDK API client instance\n */\nexport function getWdkApiClient(baseUrl?: string): WdkApiClient {\n if (!wdkApiClient || (baseUrl && wdkApiClient['config'].baseUrl !== baseUrl)) {\n wdkApiClient = new WdkApiClient({\n baseUrl: baseUrl || DEFAULT_API_URL,\n });\n }\n return wdkApiClient;\n}\n","/**\n * Browser-Compatible Address Derivation\n *\n * This module provides multi-chain address derivation that works in browser environments.\n * It uses the @scure libraries which are pure JS and don't require Node.js polyfills.\n *\n * Supported chains:\n * - Ethereum: ethers.js (BIP-44)\n * - Bitcoin: @scure/bip32 + @scure/base (BIP-84 native SegWit)\n * - Solana: ed25519-hd-key + tweetnacl (SLIP-0010)\n * - TON: ed25519 derivation with TON address format\n * - TRON: secp256k1 + base58check\n * - Spark: Bitcoin-based with custom derivation\n */\n\nimport { HDNodeWallet, keccak256, getBytes, sha256 as ethSha256 } from 'ethers';\nimport { mnemonicToSeedSync, validateMnemonic, generateMnemonic } from '@scure/bip39';\nimport { wordlist } from '@scure/bip39/wordlists/english';\nimport { HDKey } from '@scure/bip32';\nimport { bech32, base58check } from '@scure/base';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { ripemd160 } from '@noble/hashes/ripemd160';\nimport type { NetworkType } from '../types';\n\nexport interface ChainAddress {\n chain: NetworkType;\n address: string;\n path: string;\n}\n\nexport interface BrowserMultiChainAddresses {\n ethereum: string | null;\n bitcoin: string | null;\n ton: string | null;\n tron: string | null;\n solana: string | null;\n spark: string | null;\n}\n\n// BIP-44/84 derivation paths\nconst DERIVATION_PATHS = {\n ethereum: \"m/44'/60'/0'/0/0\",\n bitcoin_mainnet: \"m/84'/0'/0'/0/0\",\n bitcoin_testnet: \"m/84'/1'/0'/0/0\",\n ton: \"m/44'/607'/0'/0'/0'\",\n tron: \"m/44'/195'/0'/0/0\",\n solana: \"m/44'/501'/0'/0'\",\n spark: \"m/44'/998'/0'/0/0\",\n};\n\n/**\n * Derive Ethereum address from seed phrase\n */\nexport function deriveEthereumAddress(seed: string): string {\n const hdNode = HDNodeWallet.fromPhrase(seed, undefined, DERIVATION_PATHS.ethereum);\n return hdNode.address;\n}\n\n/**\n * Derive Bitcoin address from seed phrase (BIP-84 native SegWit)\n * Uses @scure libraries for browser compatibility\n */\nexport function deriveBitcoinAddress(\n seed: string,\n network: 'mainnet' | 'testnet' = 'testnet'\n): string {\n try {\n // Convert mnemonic to seed using @scure/bip39\n const seedBytes = mnemonicToSeedSync(seed);\n\n // Derive HD key using @scure/bip32\n const hdKey = HDKey.fromMasterSeed(seedBytes);\n const path = network === 'testnet' ? DERIVATION_PATHS.bitcoin_testnet : DERIVATION_PATHS.bitcoin_mainnet;\n const child = hdKey.derive(path);\n\n if (!child.publicKey) {\n throw new Error('Failed to derive public key');\n }\n\n // Create P2WPKH address (native SegWit)\n // 1. Hash160 = RIPEMD160(SHA256(publicKey))\n const pubKeyHash = ripemd160(sha256(child.publicKey));\n\n // 2. Create witness program: version (0x00) + hash160\n // For bech32, we encode: witness version (0) + pubKeyHash as 5-bit words\n const witnessVersion = 0;\n const words = bech32.toWords(pubKeyHash);\n words.unshift(witnessVersion); // Prepend witness version\n\n // 3. Encode with bech32\n const hrp = network === 'testnet' ? 'tb' : 'bc';\n const address = bech32.encode(hrp, words);\n\n return address;\n } catch (error) {\n console.error('Bitcoin address derivation failed:', error);\n throw error;\n }\n}\n\n/**\n * Derive Solana address from seed phrase using SLIP-0010 (ed25519)\n */\nexport async function deriveSolanaAddress(seed: string): Promise<string> {\n try {\n const [ed25519, nacl, bs58Module] = await Promise.all([\n import('ed25519-hd-key'),\n import('tweetnacl'),\n import('bs58'),\n ]);\n\n // bs58 v6 uses default export\n const bs58 = bs58Module.default || bs58Module;\n\n // Use @scure/bip39 for seed generation (browser compatible)\n const seedBytes = mnemonicToSeedSync(seed);\n\n // SLIP-0010 derivation for ed25519\n const derived = ed25519.derivePath(DERIVATION_PATHS.solana, Buffer.from(seedBytes).toString('hex'));\n\n // Create keypair from derived seed\n const keypair = nacl.sign.keyPair.fromSeed(new Uint8Array(derived.key));\n\n // Solana address is the base58-encoded public key (32 bytes)\n return bs58.encode(keypair.publicKey);\n } catch (error) {\n console.error('Solana address derivation failed:', error);\n throw error;\n }\n}\n\n/**\n * Derive TON address from seed phrase\n * Uses proper BIP-44 derivation path m/44'/607'/0'/0'/0'\n */\nexport async function deriveTonAddress(seed: string): Promise<string> {\n try {\n const [ed25519, nacl] = await Promise.all([\n import('ed25519-hd-key'),\n import('tweetnacl'),\n ]);\n\n // Use @scure/bip39 for seed generation (browser compatible)\n const seedBytes = mnemonicToSeedSync(seed);\n\n // Use SLIP-0010 derivation for ed25519 with TON's coin type\n const derived = ed25519.derivePath(DERIVATION_PATHS.ton, Buffer.from(seedBytes).toString('hex'));\n\n // Create keypair\n const keypair = nacl.sign.keyPair.fromSeed(new Uint8Array(derived.key));\n\n // TON address is derived from public key using workchain + hash\n // Standard TON wallet v4r2 uses the public key to derive address\n const publicKey = keypair.publicKey;\n\n // Create TON bounceable address (EQ prefix for workchain 0)\n // Format: 1 byte flags + 1 byte workchain + 32 bytes hash + 2 bytes CRC16\n const workchain = 0;\n const flags = 0x11; // bounceable\n\n // For raw address, we use SHA256 of public key using @noble/hashes\n const hash = sha256(publicKey);\n\n // Build address bytes: flags + workchain + hash\n const addressData = new Uint8Array(34);\n addressData[0] = flags;\n addressData[1] = workchain;\n addressData.set(hash, 2);\n\n // Calculate CRC16\n const crc = crc16(addressData);\n\n // Full address with CRC\n const fullAddress = new Uint8Array(36);\n fullAddress.set(addressData);\n fullAddress[34] = (crc >> 8) & 0xff;\n fullAddress[35] = crc & 0xff;\n\n // Convert to base64url (TON standard format)\n const base64 = btoa(String.fromCharCode(...fullAddress))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_');\n\n return base64;\n } catch (error) {\n console.error('TON address derivation failed:', error);\n throw error;\n }\n}\n\n/**\n * CRC16-CCITT for TON addresses\n */\nfunction crc16(data: Uint8Array): number {\n let crc = 0;\n for (const byte of data) {\n crc ^= byte << 8;\n for (let i = 0; i < 8; i++) {\n crc = (crc & 0x8000) ? ((crc << 1) ^ 0x1021) : (crc << 1);\n crc &= 0xffff;\n }\n }\n return crc;\n}\n\n/**\n * Derive TRON address from seed phrase\n * TRON uses secp256k1 like Ethereum but with base58check encoding\n * Uses @scure/base for browser compatibility\n */\nexport function deriveTronAddress(seed: string): string {\n try {\n // Derive using TRON's BIP-44 path\n const hdNode = HDNodeWallet.fromPhrase(seed, undefined, DERIVATION_PATHS.tron);\n\n // Get the Ethereum-style address (last 20 bytes of keccak256 of public key)\n // TRON uses same derivation but different encoding\n const ethAddressHex = hdNode.address.slice(2).toLowerCase();\n\n // TRON address: 0x41 prefix + 20 bytes address\n const addressBytes = new Uint8Array(21);\n addressBytes[0] = 0x41; // TRON mainnet prefix\n\n // Copy ETH address bytes\n for (let i = 0; i < 20; i++) {\n addressBytes[i + 1] = parseInt(ethAddressHex.slice(i * 2, i * 2 + 2), 16);\n }\n\n // Base58check encode using @scure/base (uses double SHA256 for checksum)\n const tronBase58check = base58check(sha256);\n return tronBase58check.encode(addressBytes);\n } catch (error) {\n console.error('TRON address derivation failed:', error);\n throw error;\n }\n}\n\n/**\n * Derive Spark address from seed phrase\n * Spark uses its own derivation path and bech32 format\n * Uses @scure libraries for browser compatibility\n */\nexport function deriveSparkAddress(\n seed: string,\n network: 'mainnet' | 'testnet' = 'testnet'\n): string {\n try {\n // Convert mnemonic to seed using @scure/bip39\n const seedBytes = mnemonicToSeedSync(seed);\n\n // Derive HD key using @scure/bip32\n const hdKey = HDKey.fromMasterSeed(seedBytes);\n const child = hdKey.derive(DERIVATION_PATHS.spark);\n\n if (!child.publicKey) {\n throw new Error('Failed to derive public key');\n }\n\n // Create P2WPKH-style address (same as Bitcoin but with Spark HRP)\n // 1. Hash160 = RIPEMD160(SHA256(publicKey))\n const pubKeyHash = ripemd160(sha256(child.publicKey));\n\n // 2. Create witness program with version 0\n const witnessVersion = 0;\n const words = bech32.toWords(pubKeyHash);\n words.unshift(witnessVersion);\n\n // 3. Encode with bech32 using Spark's HRP\n // Note: Spark uses 'sp' for mainnet and 'tsp' for testnet\n const hrp = network === 'testnet' ? 'tsp' : 'sp';\n const address = bech32.encode(hrp, words);\n\n return address;\n } catch (error) {\n console.error('Spark address derivation failed:', error);\n throw error;\n }\n}\n\n/**\n * Derive addresses for all supported chains\n */\nexport async function deriveAllAddresses(\n seed: string,\n network: 'mainnet' | 'testnet' = 'testnet'\n): Promise<BrowserMultiChainAddresses> {\n const addresses: BrowserMultiChainAddresses = {\n ethereum: null,\n bitcoin: null,\n ton: null,\n tron: null,\n solana: null,\n spark: null,\n };\n\n // Derive synchronous chains first (Ethereum, Bitcoin, Spark, TRON)\n try {\n addresses.ethereum = deriveEthereumAddress(seed);\n } catch (e) {\n console.error('ETH derivation failed:', e);\n }\n\n try {\n addresses.bitcoin = deriveBitcoinAddress(seed, network);\n } catch (e) {\n console.error('BTC derivation failed:', e);\n }\n\n try {\n addresses.spark = deriveSparkAddress(seed, network);\n } catch (e) {\n console.error('Spark derivation failed:', e);\n }\n\n try {\n addresses.tron = deriveTronAddress(seed);\n } catch (e) {\n console.error('TRON derivation failed:', e);\n }\n\n // Derive async chains in parallel (Solana, TON use ed25519 which requires async imports)\n const [solResult, tonResult] = await Promise.allSettled([\n deriveSolanaAddress(seed),\n deriveTonAddress(seed),\n ]);\n\n if (solResult.status === 'fulfilled') {\n addresses.solana = solResult.value;\n } else {\n console.error('SOL derivation failed:', solResult.reason);\n }\n\n if (tonResult.status === 'fulfilled') {\n addresses.ton = tonResult.value;\n } else {\n console.error('TON derivation failed:', tonResult.reason);\n }\n\n return addresses;\n}\n\n/**\n * Validate a BIP-39 seed phrase using @scure/bip39\n */\nexport function isValidSeed(seed: string): boolean {\n return validateMnemonic(seed, wordlist);\n}\n\n/**\n * Generate a random BIP-39 seed phrase using @scure/bip39\n */\nexport function generateSeedPhrase(): string {\n return generateMnemonic(wordlist);\n}\n","/**\n * Zubari WDK Service - Unified Multi-Chain Wallet Service\n *\n * This service provides a unified interface for multi-chain wallet operations\n * that works in both browser and Node.js environments.\n *\n * Strategy:\n * - Browser: Uses WdkApiClient to call the backend API (which has Tether WDK)\n * - Node.js: Uses WdkService natively (with Tether WDK modules)\n *\n * The Tether WDK (@tetherto/wdk-*) only works in Node.js environments due to\n * native dependencies (Electrum client, gRPC, etc.). For browser environments,\n * we route all operations through the backend API.\n *\n * @see https://docs.wallet.tether.io/\n */\n\nimport { WdkApiClient, getWdkApiClient } from './WdkApiClient';\nimport * as BrowserDerivation from './BrowserAddressDerivation';\nimport type { NetworkType } from '../types';\n\n// Default API URL for the Zubari backend with Tether WDK\nconst DEFAULT_API_URL = 'https://ckgwifsxka.us-east-2.awsapprunner.com';\n\nexport type SupportedChain = 'ethereum' | 'bitcoin' | 'ton' | 'tron' | 'solana' | 'spark';\n\nexport interface ChainAddress {\n chain: SupportedChain;\n address: string;\n path: string;\n}\n\nexport interface MultiChainAddresses {\n ethereum: string | null;\n bitcoin: string | null;\n ton: string | null;\n tron: string | null;\n solana: string | null;\n spark: string | null;\n}\n\nexport interface ChainBalance {\n chain: SupportedChain;\n address: string;\n balance: string;\n symbol: string;\n}\n\nexport interface FeeRates {\n slow: string;\n normal: string;\n fast: string;\n}\n\nexport interface TransactionResult {\n success: boolean;\n txHash?: string;\n from?: string;\n to?: string;\n amount?: string;\n chain?: string;\n network?: string;\n error?: string;\n}\n\nexport interface ZubariWdkServiceConfig {\n /** Network to use (mainnet or testnet) */\n network: 'mainnet' | 'testnet';\n /** API URL for the Zubari backend (required for browser environments) */\n apiUrl?: string;\n /** Force using API even in Node.js (useful for testing) */\n forceApi?: boolean;\n /** Request timeout in milliseconds */\n timeout?: number;\n}\n\n/**\n * Check if we're running in a browser environment\n */\nfunction isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof window.document !== 'undefined';\n}\n\n/**\n * Dynamic import helper that bypasses bundler analysis\n * This ensures the import is truly runtime and not analyzed at build time\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst dynamicImport = new Function('specifier', 'return import(specifier)') as (\n specifier: string\n) => Promise<any>;\n\n/**\n * Check if native WDK modules are available (Node.js only)\n */\nasync function canUseNativeWdk(): Promise<boolean> {\n // Never use native WDK in browser\n if (isBrowser()) {\n return false;\n }\n\n try {\n // Try to dynamically import WDK to check if it's available\n await dynamicImport('@tetherto/wdk');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * ZubariWdkService - Unified wallet service for browser and Node.js\n *\n * This service automatically routes operations to:\n * - API backend (browser) - using WdkApiClient\n * - Native WDK (Node.js) - using WdkService\n * - Browser derivation (fallback) - using BrowserAddressDerivation\n */\nexport class ZubariWdkService {\n private config: Required<ZubariWdkServiceConfig>;\n private apiClient: WdkApiClient;\n private nativeWdkService: unknown | null = null;\n private initialized = false;\n private useNativeWdk = false;\n\n constructor(config: Partial<ZubariWdkServiceConfig> = {}) {\n this.config = {\n network: config.network || 'testnet',\n apiUrl: config.apiUrl || process.env.NEXT_PUBLIC_API_URL || DEFAULT_API_URL,\n forceApi: config.forceApi ?? false,\n timeout: config.timeout || 30000,\n };\n\n this.apiClient = getWdkApiClient(this.config.apiUrl);\n }\n\n /**\n * Initialize the service and determine the best strategy\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // In browser or if forceApi is set, always use API\n if (isBrowser() || this.config.forceApi) {\n this.useNativeWdk = false;\n this.initialized = true;\n return;\n }\n\n // In Node.js, try to use native WDK\n if (await canUseNativeWdk()) {\n try {\n // Use dynamic import helper to bypass bundler analysis\n // This ensures WdkService is never included in browser bundles\n const WdkServiceModule = await dynamicImport('./WdkService');\n const WdkService = WdkServiceModule.WdkService || WdkServiceModule.default;\n this.nativeWdkService = new WdkService({\n network: this.config.network,\n });\n this.useNativeWdk = true;\n } catch (error) {\n console.warn('Failed to initialize native WDK, falling back to API:', error);\n this.useNativeWdk = false;\n }\n }\n\n this.initialized = true;\n }\n\n /**\n * Get the current execution mode\n */\n getMode(): 'api' | 'native' | 'browser-fallback' {\n if (this.useNativeWdk) return 'native';\n if (isBrowser()) return 'api';\n return 'api';\n }\n\n /**\n * Check if running in browser\n */\n isBrowserEnvironment(): boolean {\n return isBrowser();\n }\n\n /**\n * Generate a new BIP-39 seed phrase (12 words)\n */\n async generateSeed(): Promise<string> {\n await this.initialize();\n\n // Try API first (most reliable, uses real WDK)\n try {\n const response = await this.apiClient.generateSeed();\n if (response.success && response.seed) {\n return response.seed;\n }\n } catch (error) {\n console.warn('API seed generation failed:', error);\n }\n\n // Try native WDK\n if (this.useNativeWdk && this.nativeWdkService) {\n try {\n const wdk = this.nativeWdkService as { generateSeedPhrase: () => Promise<string> };\n return await wdk.generateSeedPhrase();\n } catch (error) {\n console.warn('Native WDK seed generation failed:', error);\n }\n }\n\n // Fallback to browser-compatible generation\n return BrowserDerivation.generateSeedPhrase();\n }\n\n /**\n * Validate a BIP-39 seed phrase\n */\n async validateSeed(seed: string): Promise<boolean> {\n await this.initialize();\n\n // Try API first\n try {\n const response = await this.apiClient.validateSeed(seed);\n if (response.success) {\n return response.isValid ?? false;\n }\n } catch (error) {\n console.warn('API seed validation failed:', error);\n }\n\n // Try native WDK\n if (this.useNativeWdk && this.nativeWdkService) {\n try {\n const wdk = this.nativeWdkService as { isValidSeed: (seed: string) => Promise<boolean> };\n return await wdk.isValidSeed(seed);\n } catch (error) {\n console.warn('Native WDK seed validation failed:', error);\n }\n }\n\n // Fallback to browser-compatible validation\n return BrowserDerivation.isValidSeed(seed);\n }\n\n /**\n * Derive address for a specific chain using WDK API\n *\n * For Ethereum, falls back to local derivation if API fails.\n * For other chains, WDK API is required - no placeholder fallback.\n */\n async deriveAddress(seed: string, chain: SupportedChain): Promise<ChainAddress> {\n await this.initialize();\n\n const path = this.getDerivationPath(chain);\n\n // Try API first (uses real WDK on backend)\n try {\n const response = await this.apiClient.deriveAddress(seed, chain as NetworkType, this.config.network);\n if (response.success && response.address) {\n return {\n chain,\n address: response.address,\n path: response.path || path,\n };\n }\n } catch (error) {\n console.warn(`API address derivation failed for ${chain}:`, error);\n\n // For Ethereum only, fall back to local derivation\n if (chain === 'ethereum') {\n return this.deriveBrowserAddress(seed, chain);\n }\n }\n\n // Try native WDK (Node.js only)\n if (this.useNativeWdk && this.nativeWdkService) {\n try {\n const wdk = this.nativeWdkService as {\n initialize: (seed: string) => Promise<void>;\n deriveAddress: (chain: SupportedChain) => Promise<ChainAddress>;\n };\n await wdk.initialize(seed);\n return await wdk.deriveAddress(chain);\n } catch (error) {\n console.warn(`Native WDK address derivation failed for ${chain}:`, error);\n }\n }\n\n // For Ethereum, we can use browser derivation as final fallback\n if (chain === 'ethereum') {\n return this.deriveBrowserAddress(seed, chain);\n }\n\n // For other chains, throw error - no placeholder addresses\n throw new Error(\n `WDK API required for ${chain} address derivation. Ensure the backend is running.`\n );\n }\n\n /**\n * Derive addresses for all supported chains using WDK API\n *\n * Uses the backend WDK API for real cryptographically valid addresses.\n * No placeholder fallback - WDK API is required for multi-chain addresses.\n */\n async deriveAllAddresses(seed: string): Promise<MultiChainAddresses> {\n await this.initialize();\n\n // Try API first (uses real WDK on backend)\n try {\n const response = await this.apiClient.deriveAllAddresses(seed, this.config.network);\n if (response.success && response.addresses) {\n // Extract address strings from response - API may return objects or strings\n const extractAddress = (value: unknown): string | null => {\n if (!value) return null;\n if (typeof value === 'string') return value;\n if (typeof value === 'object' && value !== null && 'address' in value) {\n return (value as { address: string }).address;\n }\n return null;\n };\n\n return {\n ethereum: extractAddress(response.addresses.ethereum),\n bitcoin: extractAddress(response.addresses.bitcoin),\n ton: extractAddress(response.addresses.ton),\n tron: extractAddress(response.addresses.tron),\n solana: extractAddress(response.addresses.solana),\n spark: extractAddress(response.addresses.spark),\n };\n }\n } catch (error) {\n console.warn('API address derivation failed:', error);\n }\n\n // Try native WDK (Node.js only)\n if (this.useNativeWdk && this.nativeWdkService) {\n try {\n const wdk = this.nativeWdkService as {\n initialize: (seed: string) => Promise<void>;\n deriveAllAddresses: () => Promise<MultiChainAddresses>;\n };\n await wdk.initialize(seed);\n return await wdk.deriveAllAddresses();\n } catch (error) {\n console.warn('Native WDK multi-chain derivation failed:', error);\n }\n }\n\n // No fallback - Tether WDK is required for multi-chain address derivation\n throw new Error(\n 'Tether WDK API required for multi-chain address derivation. Service temporarily unavailable.'\n );\n }\n\n /**\n * Get balances for all chains\n */\n async getAllBalances(seed: string): Promise<Record<string, ChainBalance | null>> {\n await this.initialize();\n\n // This always uses API as it requires blockchain RPC calls\n try {\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/balances`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ seed, network: this.config.network }),\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.success) {\n return data.balances;\n }\n }\n } catch (error) {\n console.warn('Failed to fetch balances:', error);\n }\n\n return {};\n }\n\n /**\n * Get fee rates for a chain\n */\n async getFeeRates(seed: string, chain: SupportedChain): Promise<FeeRates> {\n await this.initialize();\n\n try {\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/fee-rates`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ seed, chain, network: this.config.network }),\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.feeRates) {\n return data.feeRates;\n }\n }\n } catch (error) {\n console.warn(`Failed to fetch fee rates for ${chain}:`, error);\n }\n\n return { slow: '0', normal: '0', fast: '0' };\n }\n\n /**\n * Estimate transaction fee\n */\n async estimateFee(\n seed: string,\n chain: SupportedChain,\n to: string,\n amount: string\n ): Promise<{ fee: string; symbol: string }> {\n await this.initialize();\n\n try {\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/estimate-fee`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ seed, chain, to, amount, network: this.config.network }),\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.success) {\n return { fee: data.fee, symbol: data.symbol };\n }\n }\n } catch (error) {\n console.warn(`Failed to estimate fee for ${chain}:`, error);\n }\n\n return { fee: '0', symbol: this.getChainSymbol(chain) };\n }\n\n /**\n * Send a transaction\n */\n async sendTransaction(\n seed: string,\n chain: SupportedChain,\n to: string,\n amount: string\n ): Promise<TransactionResult> {\n await this.initialize();\n\n try {\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/send`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ seed, chain, to, amount, network: this.config.network }),\n });\n\n if (response.ok) {\n const data = await response.json();\n\n // Extract transaction hash from various possible properties\n let txHash = data.txHash || data.transactionHash || data.hash;\n\n // Handle case where txHash might be an object\n if (txHash && typeof txHash === 'object' && 'hash' in txHash) {\n txHash = txHash.hash;\n }\n\n // Validate Ethereum tx hash format (should be 66 chars: 0x + 64 hex)\n if (chain === 'ethereum' && txHash && (typeof txHash !== 'string' || !txHash.startsWith('0x') || txHash.length !== 66)) {\n console.warn(`Invalid Ethereum tx hash format: ${txHash} (length: ${txHash?.length}, expected: 66)`);\n }\n\n return {\n success: data.success,\n txHash,\n from: data.from,\n to: data.to,\n amount: data.amount,\n chain: data.chain,\n network: data.network,\n };\n }\n\n const errorData = await response.json().catch(() => ({}));\n return {\n success: false,\n error: errorData.error || `HTTP ${response.status}`,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Transaction failed',\n };\n }\n }\n\n /**\n * Get the network configuration\n */\n getNetwork(): 'mainnet' | 'testnet' {\n return this.config.network;\n }\n\n /**\n * Get API URL\n */\n getApiUrl(): string {\n return this.config.apiUrl;\n }\n\n // ==========================================\n // Private Helper Methods\n // ==========================================\n\n private getDerivationPath(chain: SupportedChain): string {\n const paths: Record<SupportedChain, string> = {\n bitcoin: this.config.network === 'testnet' ? \"m/84'/1'/0'/0/0\" : \"m/84'/0'/0'/0/0\",\n ethereum: \"m/44'/60'/0'/0/0\",\n ton: \"m/44'/607'/0'/0'/0'\",\n tron: \"m/44'/195'/0'/0/0\",\n solana: \"m/44'/501'/0'/0'\",\n spark: \"m/44'/998'/0'/0/0\",\n };\n return paths[chain];\n }\n\n private getChainSymbol(chain: SupportedChain): string {\n const symbols: Record<SupportedChain, string> = {\n ethereum: 'ETH',\n bitcoin: 'BTC',\n ton: 'TON',\n tron: 'TRX',\n solana: 'SOL',\n spark: 'SAT',\n };\n return symbols[chain];\n }\n\n /**\n * Derive address using browser-compatible libraries\n */\n private async deriveBrowserAddress(seed: string, chain: SupportedChain): Promise<ChainAddress> {\n const path = this.getDerivationPath(chain);\n\n try {\n let address: string;\n\n switch (chain) {\n case 'ethereum':\n address = BrowserDerivation.deriveEthereumAddress(seed);\n break;\n case 'bitcoin':\n address = BrowserDerivation.deriveBitcoinAddress(seed, this.config.network);\n break;\n case 'tron':\n address = BrowserDerivation.deriveTronAddress(seed);\n break;\n case 'spark':\n address = BrowserDerivation.deriveSparkAddress(seed, this.config.network);\n break;\n case 'solana':\n address = await BrowserDerivation.deriveSolanaAddress(seed);\n break;\n case 'ton':\n address = await BrowserDerivation.deriveTonAddress(seed);\n break;\n default:\n throw new Error(`Unsupported chain: ${chain}`);\n }\n\n return { chain, address, path };\n } catch (error) {\n console.error(`Browser derivation failed for ${chain}:`, error);\n throw error;\n }\n }\n\n /**\n * Derive all addresses using browser-compatible libraries\n */\n private async deriveAllBrowserAddresses(seed: string): Promise<MultiChainAddresses> {\n return BrowserDerivation.deriveAllAddresses(seed, this.config.network);\n }\n}\n\n// ==========================================\n// Factory Functions\n// ==========================================\n\nlet defaultService: ZubariWdkService | null = null;\n\n/**\n * Get or create the default ZubariWdkService instance\n */\nexport function getZubariWdkService(config?: Partial<ZubariWdkServiceConfig>): ZubariWdkService {\n if (!defaultService || (config && config.network !== defaultService.getNetwork())) {\n defaultService = new ZubariWdkService(config);\n }\n return defaultService;\n}\n\n/**\n * Create a new ZubariWdkService instance\n */\nexport function createZubariWdkService(config?: Partial<ZubariWdkServiceConfig>): ZubariWdkService {\n return new ZubariWdkService(config);\n}\n\n/**\n * Check if the current environment is a browser\n */\nexport { isBrowser };\n","import { Wallet, HDNodeWallet, formatEther, parseEther } from 'ethers';\nimport { createPublicClient, http, formatEther as viemFormatEther } from 'viem';\nimport { sepolia, mainnet } from 'viem/chains';\nimport { KeyManager } from '../security';\nimport type { SecureStorageAdapter } from '../storage/SecureStorage';\nimport { createSecureStorage, WebEncryptedStorageAdapter } from '../storage/SecureStorage';\nimport { NETWORKS, DERIVATION_PATHS, getNetworkConfig, type NetworkConfig } from '../config/networks';\nimport type { NetworkType } from '../types';\nimport { ZubariWdkService, getZubariWdkService } from '../services/ZubariWdkService';\nimport * as BrowserDerivation from '../services/BrowserAddressDerivation';\n\n/**\n * CoinGecko IDs for each supported chain\n */\nconst COINGECKO_IDS: Record<NetworkType, string> = {\n ethereum: 'ethereum',\n bitcoin: 'bitcoin',\n ton: 'the-open-network',\n tron: 'tron',\n solana: 'solana',\n spark: 'bitcoin', // Spark uses BTC\n};\n\n/**\n * Price cache to avoid excessive API calls\n */\ninterface PriceCache {\n prices: Record<string, number>;\n timestamp: number;\n}\n\nlet priceCache: PriceCache | null = null;\nconst PRICE_CACHE_TTL = 60000; // 1 minute cache\n\n/**\n * Fetch USD prices for all supported chains from CoinGecko\n */\nasync function fetchPrices(): Promise<Record<string, number>> {\n // Check cache\n if (priceCache && Date.now() - priceCache.timestamp < PRICE_CACHE_TTL) {\n return priceCache.prices;\n }\n\n const ids = Object.values(COINGECKO_IDS).filter((v, i, a) => a.indexOf(v) === i).join(',');\n\n try {\n const response = await fetch(\n `https://api.coingecko.com/api/v3/simple/price?ids=${ids}&vs_currencies=usd`,\n {\n headers: { 'Accept': 'application/json' },\n }\n );\n\n if (response.ok) {\n const data = await response.json();\n const prices: Record<string, number> = {};\n\n for (const [chain, geckoId] of Object.entries(COINGECKO_IDS)) {\n prices[chain] = data[geckoId]?.usd || 0;\n }\n\n // Update cache\n priceCache = { prices, timestamp: Date.now() };\n return prices;\n }\n } catch (error) {\n console.warn('Failed to fetch prices from CoinGecko:', error);\n }\n\n // Return cached prices if available, otherwise empty\n return priceCache?.prices || {};\n}\n\n/**\n * Get USD price for a specific chain\n */\nasync function getPriceForChain(chain: NetworkType): Promise<number> {\n const prices = await fetchPrices();\n return prices[chain] || 0;\n}\n\n/**\n * Note on Tether WDK Integration:\n *\n * Tether WDK (@tetherto/wdk, @tetherto/wdk-wallet-btc, @tetherto/wdk-wallet-evm)\n * is designed for Node.js and React Native environments. The Bitcoin wallet module\n * uses Electrum client which requires Node.js 'net' module.\n *\n * For browser environments (Next.js, React web), we use ethers.js for address derivation\n * following proper BIP-44/BIP-84 paths. This provides deterministic addresses that are\n * compatible with the same seed used in WDK-based apps.\n *\n * For React Native or Node.js apps, you can integrate WDK directly:\n * @see https://docs.wallet.tether.io/\n */\n\n/**\n * Storage keys for wallet data\n */\nconst STORAGE_KEYS = {\n ENCRYPTED_SEED: 'encrypted_seed',\n ACTIVE_WALLET: 'active_wallet',\n DERIVED_ADDRESSES: 'derived_addresses',\n} as const;\n\n/**\n * Supported chains for Zubari WDK Wallet\n */\nexport const SUPPORTED_CHAINS: NetworkType[] = ['ethereum', 'bitcoin', 'ton', 'tron', 'solana', 'spark'];\n\n/**\n * Chain balance information\n */\nexport interface ChainBalance {\n chain: NetworkType;\n symbol: string;\n balance: string;\n balanceUsd: number;\n address: string;\n decimals: number;\n icon?: string;\n}\n\n/**\n * Multi-chain addresses\n */\nexport interface MultiChainAddresses {\n ethereum: string;\n bitcoin: string;\n ton: string;\n tron: string;\n solana: string;\n spark: string;\n}\n\n/**\n * Wallet state interface\n */\nexport interface WalletState {\n isInitialized: boolean;\n isLocked: boolean;\n address: string | null;\n balance: string | null;\n // Multi-chain support\n addresses?: Partial<MultiChainAddresses>;\n balances?: ChainBalance[];\n selectedChain?: NetworkType;\n}\n\n/**\n * WalletManager Configuration\n */\nexport interface WalletManagerConfig {\n network?: 'mainnet' | 'testnet';\n rpcUrl?: string;\n storage?: SecureStorageAdapter;\n enabledChains?: NetworkType[];\n /** API URL for WDK backend (for multi-chain address derivation) */\n apiUrl?: string;\n}\n\n/**\n * WalletManager - Handles BIP-39 seed generation, address derivation, and secure storage\n *\n * This class provides:\n * - BIP-39 mnemonic generation (12 words)\n * - BIP-44 address derivation for multiple chains (Ethereum, Bitcoin, TON, TRON, Solana, Spark)\n * - Encrypted seed storage using AES-256-GCM\n * - Multi-chain balance fetching\n */\nexport class WalletManager {\n private readonly config: Required<Omit<WalletManagerConfig, 'enabledChains'>> & { enabledChains: NetworkType[] };\n private storage: SecureStorageAdapter;\n private currentSeed: string | null = null;\n private derivedAddress: string | null = null;\n private derivedAddresses: Partial<MultiChainAddresses> = {};\n private selectedChain: NetworkType = 'ethereum';\n private wdkService: ZubariWdkService;\n\n constructor(config: WalletManagerConfig = {}) {\n // Get the appropriate RPC URL from network config\n const isTestnet = config.network !== 'mainnet';\n const ethereumConfig = getNetworkConfig('ethereum', isTestnet);\n\n this.config = {\n network: config.network || 'testnet',\n rpcUrl: config.rpcUrl || ethereumConfig.rpcUrl,\n storage: config.storage || createSecureStorage(),\n enabledChains: config.enabledChains || SUPPORTED_CHAINS,\n apiUrl: config.apiUrl || process.env.NEXT_PUBLIC_API_URL || 'https://ckgwifsxka.us-east-2.awsapprunner.com',\n };\n this.storage = this.config.storage;\n\n // Initialize unified WDK service (works in browser and Node.js)\n this.wdkService = getZubariWdkService({\n network: this.config.network,\n apiUrl: this.config.apiUrl,\n });\n }\n\n /**\n * Generate a new BIP-39 seed phrase (12 words) using ethers.js\n * For native WDK generation, use generateSeedWithWdk() instead\n */\n static generateSeed(): string {\n const wallet = Wallet.createRandom();\n const mnemonic = wallet.mnemonic;\n if (!mnemonic) {\n throw new Error('Failed to generate mnemonic');\n }\n return mnemonic.phrase;\n }\n\n /**\n * Generate a new BIP-39 seed phrase using Tether WDK (via API in browser)\n * This is the recommended method for generating seed phrases\n */\n async generateSeedWithWdk(): Promise<string> {\n return await this.wdkService.generateSeed();\n }\n\n /**\n * Validate seed phrase using WDK (async, more accurate)\n */\n async validateSeedWithWdk(seed: string): Promise<boolean> {\n return await this.wdkService.validateSeed(seed);\n }\n\n /**\n * Validate a BIP-39 seed phrase\n */\n static validateSeed(seed: string): boolean {\n return KeyManager.validateSeedPhrase(seed);\n }\n\n /**\n * Derive Ethereum address from seed phrase using BIP-44 path\n * Path: m/44'/60'/0'/0/0\n */\n static deriveAddress(seed: string): string {\n const hdNode = HDNodeWallet.fromPhrase(seed, undefined, \"m/44'/60'/0'/0/0\");\n return hdNode.address;\n }\n\n /**\n * Get the HDNodeWallet for signing transactions\n */\n static getWallet(seed: string): HDNodeWallet {\n return HDNodeWallet.fromPhrase(seed, undefined, \"m/44'/60'/0'/0/0\");\n }\n\n /**\n * Initialize storage with password (required for web platform)\n */\n async initializeStorage(password: string): Promise<void> {\n if (this.storage instanceof WebEncryptedStorageAdapter) {\n await this.storage.initialize(password);\n }\n }\n\n /**\n * Create a new wallet with generated seed\n */\n async createWallet(password: string): Promise<{ seed: string; address: string }> {\n const seed = WalletManager.generateSeed();\n const address = WalletManager.deriveAddress(seed);\n\n // Encrypt and store seed\n const encrypted = await KeyManager.encryptSeed(seed, password);\n await this.storage.setItem(STORAGE_KEYS.ENCRYPTED_SEED, encrypted);\n\n this.currentSeed = seed;\n this.derivedAddress = address;\n\n return { seed, address };\n }\n\n /**\n * Import an existing wallet from seed phrase\n */\n async importWallet(seed: string, password: string): Promise<{ address: string }> {\n if (!WalletManager.validateSeed(seed)) {\n throw new Error('Invalid seed phrase');\n }\n\n const address = WalletManager.deriveAddress(seed);\n\n // Encrypt and store seed\n const encrypted = await KeyManager.encryptSeed(seed, password);\n await this.storage.setItem(STORAGE_KEYS.ENCRYPTED_SEED, encrypted);\n\n this.currentSeed = seed;\n this.derivedAddress = address;\n\n return { address };\n }\n\n /**\n * Unlock wallet with password\n */\n async unlock(password: string): Promise<{ address: string }> {\n const encrypted = await this.storage.getItem(STORAGE_KEYS.ENCRYPTED_SEED);\n if (!encrypted) {\n throw new Error('No wallet found');\n }\n\n try {\n const seed = await KeyManager.decryptSeed(encrypted, password);\n const address = WalletManager.deriveAddress(seed);\n\n this.currentSeed = seed;\n this.derivedAddress = address;\n\n return { address };\n } catch {\n throw new Error('Invalid password');\n }\n }\n\n /**\n * Lock wallet (clear seed from memory)\n */\n lock(): void {\n this.currentSeed = null;\n // Keep derived address for display\n }\n\n /**\n * Check if wallet exists in storage\n */\n async hasWallet(): Promise<boolean> {\n return this.storage.hasItem(STORAGE_KEYS.ENCRYPTED_SEED);\n }\n\n /**\n * Delete wallet from storage\n */\n async deleteWallet(): Promise<void> {\n await this.storage.removeItem(STORAGE_KEYS.ENCRYPTED_SEED);\n await this.storage.removeItem(STORAGE_KEYS.DERIVED_ADDRESSES);\n this.currentSeed = null;\n this.derivedAddress = null;\n this.derivedAddresses = {};\n }\n\n /**\n * Get current wallet state\n */\n getState(): WalletState {\n return {\n isInitialized: this.derivedAddress !== null,\n isLocked: this.currentSeed === null && this.derivedAddress !== null,\n address: this.derivedAddress,\n balance: null, // Use fetchBalance for current balance\n };\n }\n\n /**\n * Get current address (if unlocked)\n */\n getAddress(): string | null {\n return this.derivedAddress;\n }\n\n /**\n * Check if wallet is unlocked\n */\n isUnlocked(): boolean {\n return this.currentSeed !== null;\n }\n\n /**\n * Get the seed phrase (only if unlocked)\n */\n getSeed(): string | null {\n return this.currentSeed;\n }\n\n /**\n * Fetch balance for current address with timeout handling\n */\n async fetchBalance(): Promise<string> {\n if (!this.derivedAddress) {\n throw new Error('Wallet not initialized');\n }\n\n const chain = this.config.network === 'mainnet' ? mainnet : sepolia;\n const client = createPublicClient({\n chain,\n transport: http(this.config.rpcUrl, {\n timeout: 15000, // 15 second timeout\n retryCount: 2,\n retryDelay: 1000,\n }),\n });\n\n try {\n const balance = await client.getBalance({\n address: this.derivedAddress as `0x${string}`,\n });\n\n return viemFormatEther(balance);\n } catch (error) {\n console.warn('Failed to fetch balance:', error);\n // Return '0' instead of throwing to not block wallet operations\n return '0';\n }\n }\n\n /**\n * Create viem public client for the current network\n */\n getPublicClient() {\n const chain = this.config.network === 'mainnet' ? mainnet : sepolia;\n return createPublicClient({\n chain,\n transport: http(this.config.rpcUrl, {\n timeout: 15000, // 15 second timeout\n retryCount: 2,\n retryDelay: 1000,\n }),\n });\n }\n\n /**\n * Get ethers wallet for signing (only if unlocked)\n */\n getEthersWallet(): HDNodeWallet | null {\n if (!this.currentSeed) return null;\n return WalletManager.getWallet(this.currentSeed);\n }\n\n /**\n * Set active wallet preference\n */\n async setActiveWalletPreference(wallet: 'metamask' | 'wdk'): Promise<void> {\n await this.storage.setItem(STORAGE_KEYS.ACTIVE_WALLET, wallet);\n }\n\n /**\n * Get active wallet preference\n */\n async getActiveWalletPreference(): Promise<'metamask' | 'wdk'> {\n const stored = await this.storage.getItem(STORAGE_KEYS.ACTIVE_WALLET);\n return (stored === 'metamask' || stored === 'wdk') ? stored : 'metamask';\n }\n\n // ==========================================\n // Multi-Chain Support Methods (Powered by Tether WDK)\n // ==========================================\n\n /**\n * Derive address for a specific chain (async version)\n *\n * Uses the unified WDK service which:\n * - In browser: Calls the backend API (which has Tether WDK)\n * - In Node.js: Uses native WDK\n *\n * No fallback to placeholder addresses - WDK API is required for real addresses.\n */\n static async deriveAddressForChainAsync(\n seed: string,\n chain: NetworkType,\n network: 'mainnet' | 'testnet' = 'testnet',\n apiUrl?: string\n ): Promise<string> {\n // For Ethereum, we can derive locally as fallback\n if (chain === 'ethereum') {\n try {\n const wdkService = getZubariWdkService({ network, apiUrl });\n const result = await wdkService.deriveAddress(seed, chain);\n return result.address;\n } catch (error) {\n console.warn('WDK service failed for Ethereum, using local derivation:', error);\n return WalletManager.deriveAddressForChain(seed, 'ethereum');\n }\n }\n\n // For all other chains, WDK API is required\n const wdkService = getZubariWdkService({ network, apiUrl });\n const result = await wdkService.deriveAddress(seed, chain as 'bitcoin' | 'ton' | 'tron' | 'solana' | 'spark');\n return result.address;\n }\n\n /**\n * Derive address for a specific chain (sync version)\n * Only supports Ethereum - for other chains use deriveAddressForChainAsync with WDK API\n *\n * @throws Error for non-Ethereum chains - use WDK API instead\n */\n static deriveAddressForChain(seed: string, chain: NetworkType): string {\n if (chain === 'ethereum') {\n const ethPath = DERIVATION_PATHS['ethereum'];\n const ethNode = HDNodeWallet.fromPhrase(seed, undefined, `${ethPath}/0`);\n return ethNode.address;\n }\n\n // For non-Ethereum chains, throw error - must use WDK API\n throw new Error(\n `Sync derivation not supported for ${chain}. Use deriveAddressForChainAsync() with WDK API.`\n );\n }\n\n /**\n * Derive addresses for all enabled chains (sync version)\n * Only derives Ethereum address synchronously - use deriveAllAddressesAsync for all chains\n */\n deriveAllAddresses(): Partial<MultiChainAddresses> {\n if (!this.currentSeed) {\n throw new Error('Wallet is locked');\n }\n\n // Only derive Ethereum synchronously - other chains require WDK API\n const addresses: Partial<MultiChainAddresses> = {\n ethereum: WalletManager.deriveAddressForChain(this.currentSeed, 'ethereum'),\n };\n\n this.derivedAddresses = addresses;\n return addresses;\n }\n\n /**\n * Derive addresses for all enabled chains using Tether WDK\n * In browser: Uses the backend API (which has Tether WDK)\n * In Node.js: Uses native WDK directly\n * Returns REAL cryptographically valid addresses for all chains.\n * Addresses are persisted to storage for future use.\n */\n async deriveAllAddressesWithWdk(): Promise<Partial<MultiChainAddresses>> {\n if (!this.currentSeed) {\n throw new Error('Wallet is locked');\n }\n\n try {\n // Use the unified WDK service (handles browser/Node.js automatically)\n const wdkAddresses = await this.wdkService.deriveAllAddresses(this.currentSeed);\n\n // Filter to only enabled chains\n const enabledChainsSet = new Set(this.config.enabledChains);\n const addresses: Partial<MultiChainAddresses> = {};\n for (const [chain, address] of Object.entries(wdkAddresses)) {\n if (enabledChainsSet.has(chain as NetworkType) && address) {\n addresses[chain as NetworkType] = address;\n }\n }\n\n this.derivedAddresses = addresses;\n\n // Persist addresses to storage for future use\n await this.saveAddressesToStorage(addresses);\n\n return addresses;\n } catch (error) {\n console.error('WDK derivation failed:', error);\n throw error;\n }\n }\n\n /**\n * Save derived addresses to storage\n */\n private async saveAddressesToStorage(addresses: Partial<MultiChainAddresses>): Promise<void> {\n try {\n await this.storage.setItem(STORAGE_KEYS.DERIVED_ADDRESSES, JSON.stringify(addresses));\n console.log('Saved derived addresses to storage:', Object.keys(addresses));\n } catch (error) {\n console.warn('Failed to save addresses to storage:', error);\n }\n }\n\n /**\n * Normalize an address value - extract string from object format if needed\n * Handles both string addresses and object format {chain, address, path}\n */\n private normalizeAddress(value: unknown): string | null {\n if (typeof value === 'string') {\n return value;\n }\n if (value && typeof value === 'object' && 'address' in value) {\n const addr = (value as { address: unknown }).address;\n return typeof addr === 'string' ? addr : null;\n }\n return null;\n }\n\n /**\n * Normalize all addresses in an object - extract strings from object format\n */\n private normalizeAddresses(addresses: Record<string, unknown>): Partial<MultiChainAddresses> {\n const normalized: Partial<MultiChainAddresses> = {};\n for (const [chain, value] of Object.entries(addresses)) {\n const addr = this.normalizeAddress(value);\n if (addr) {\n normalized[chain as NetworkType] = addr;\n }\n }\n return normalized;\n }\n\n /**\n * Load derived addresses from storage\n */\n private async loadAddressesFromStorage(): Promise<Partial<MultiChainAddresses> | null> {\n try {\n const stored = await this.storage.getItem(STORAGE_KEYS.DERIVED_ADDRESSES);\n if (stored) {\n const rawAddresses = JSON.parse(stored) as Record<string, unknown>;\n console.log('[WalletManager] Raw addresses from storage:', rawAddresses);\n // Normalize addresses - they might be objects {chain, address, path} or strings\n const addresses = this.normalizeAddresses(rawAddresses);\n console.log('[WalletManager] Normalized addresses:', addresses);\n\n // Save normalized addresses back to storage to fix corrupted data\n await this.saveAddressesToStorage(addresses);\n\n return addresses;\n }\n } catch (error) {\n console.warn('Failed to load addresses from storage:', error);\n }\n return null;\n }\n\n /**\n * Derive addresses for all enabled chains using Tether WDK\n *\n * Uses the WDK API backend for real cryptographically valid addresses.\n * First tries to load from storage to avoid losing previously derived addresses.\n *\n * @throws Error if WDK API is unavailable and no cached addresses exist\n */\n async deriveAllAddressesAsync(): Promise<Partial<MultiChainAddresses>> {\n if (!this.currentSeed) {\n throw new Error('Wallet is locked');\n }\n\n // First, try to load addresses from storage\n // This preserves real WDK-derived addresses even if WDK service is temporarily unavailable\n const storedAddresses = await this.loadAddressesFromStorage();\n if (storedAddresses && Object.keys(storedAddresses).length > 1) {\n // Verify the stored Ethereum address matches the current seed\n const expectedEthAddress = WalletManager.deriveAddress(this.currentSeed);\n if (storedAddresses.ethereum === expectedEthAddress) {\n console.log('Using addresses from storage (verified by Ethereum address)');\n this.derivedAddresses = storedAddresses;\n return storedAddresses;\n } else {\n console.log('Stored addresses do not match current seed, re-deriving...');\n }\n }\n\n // Use WDK API to derive all addresses - no placeholder fallback\n return await this.deriveAllAddressesWithWdk();\n }\n\n /**\n * Get address for a specific chain\n * Returns cached address or null - use deriveAllAddressesAsync to derive addresses\n */\n getAddressForChain(chain: NetworkType): string | null {\n // Return cached address if available (normalize in case it's an object)\n const cachedValue = this.derivedAddresses[chain];\n if (cachedValue) {\n console.log(`[WalletManager] getAddressForChain(${chain}) cached value:`, cachedValue, 'type:', typeof cachedValue);\n const addr = this.normalizeAddress(cachedValue);\n console.log(`[WalletManager] getAddressForChain(${chain}) normalized:`, addr);\n if (addr) {\n // Update cache with normalized string\n (this.derivedAddresses as Record<string, string>)[chain] = addr;\n return addr;\n }\n }\n\n // For Ethereum, we can derive synchronously if unlocked\n if (chain === 'ethereum' && this.currentSeed) {\n this.derivedAddresses[chain] = WalletManager.deriveAddressForChain(this.currentSeed, chain);\n return this.derivedAddresses[chain];\n }\n\n // For other chains, return null - must use deriveAllAddressesAsync first\n return null;\n }\n\n /**\n * Get all derived addresses\n */\n getAllAddresses(): Partial<MultiChainAddresses> {\n // Normalize all addresses before returning\n return this.normalizeAddresses(this.derivedAddresses);\n }\n\n /**\n * Set the selected chain\n */\n setSelectedChain(chain: NetworkType): void {\n if (!this.config.enabledChains.includes(chain)) {\n throw new Error(`Chain ${chain} is not enabled`);\n }\n this.selectedChain = chain;\n }\n\n /**\n * Get the currently selected chain\n */\n getSelectedChain(): NetworkType {\n return this.selectedChain;\n }\n\n /**\n * Get enabled chains\n */\n getEnabledChains(): NetworkType[] {\n return [...this.config.enabledChains];\n }\n\n /**\n * Get chain configuration\n */\n getChainConfig(chain: NetworkType): NetworkConfig {\n return getNetworkConfig(chain, this.config.network === 'testnet');\n }\n\n /**\n * Fetch balance for a specific chain\n * Note: Currently only Ethereum is implemented\n */\n async fetchBalanceForChain(chain: NetworkType): Promise<ChainBalance> {\n const address = this.getAddressForChain(chain);\n if (!address) {\n throw new Error(`No address for chain ${chain}`);\n }\n\n const networkConfig = this.getChainConfig(chain);\n let balance = '0';\n\n // Fetch balance based on chain type\n if (chain === 'ethereum') {\n const viemChain = this.config.network === 'mainnet' ? mainnet : sepolia;\n console.log(`[WalletManager] Fetching ${chain} balance for ${address} using RPC: ${this.config.rpcUrl}`);\n\n const client = createPublicClient({\n chain: viemChain,\n transport: http(this.config.rpcUrl, {\n timeout: 15000, // 15 second timeout\n retryCount: 2,\n retryDelay: 1000,\n }),\n });\n\n try {\n const rawBalance = await client.getBalance({\n address: address as `0x${string}`,\n });\n balance = viemFormatEther(rawBalance);\n console.log(`[WalletManager] ${chain} balance fetched: ${balance} (raw: ${rawBalance})`);\n } catch (error) {\n console.error(`[WalletManager] Failed to fetch ${chain} balance from ${this.config.rpcUrl}:`, error);\n // Balance remains '0' on error\n }\n } else if (chain === 'bitcoin') {\n // Bitcoin: Use mempool.space API (more reliable, supports multiple testnets)\n // For testnet addresses, try both testnet3 and testnet4 since they use the same prefix\n const isMainnet = this.config.network === 'mainnet' || address.startsWith('bc1') || address.startsWith('1') || address.startsWith('3');\n\n // List of APIs to try (in order)\n const apisToTry: string[] = isMainnet\n ? ['https://mempool.space/api']\n : [\n 'https://mempool.space/testnet/api', // testnet3 first (more common)\n 'https://mempool.space/testnet4/api', // then testnet4\n ];\n\n for (const apiUrl of apisToTry) {\n try {\n const response = await fetch(`${apiUrl}/address/${address}`, {\n headers: { 'Accept': 'application/json' },\n });\n\n if (response.ok) {\n const data = await response.json();\n\n // Check if this address has any transactions on this network\n const txCount = (data.chain_stats?.tx_count || 0) + (data.mempool_stats?.tx_count || 0);\n\n if (txCount > 0 || isMainnet) {\n // Found transactions or mainnet - use this data\n const chainFunded = data.chain_stats?.funded_txo_sum || 0;\n const chainSpent = data.chain_stats?.spent_txo_sum || 0;\n const mempoolFunded = data.mempool_stats?.funded_txo_sum || 0;\n const mempoolSpent = data.mempool_stats?.spent_txo_sum || 0;\n\n // Total balance in satoshis\n const satoshis = (chainFunded - chainSpent) + (mempoolFunded - mempoolSpent);\n // Convert to BTC (1 BTC = 100,000,000 satoshis)\n balance = (satoshis / 100_000_000).toFixed(8);\n console.log(`Bitcoin balance for ${address}: ${balance} BTC (${satoshis} sats) via ${apiUrl}`);\n break; // Found balance, stop trying other APIs\n }\n // No transactions found, try next API\n console.log(`No transactions found on ${apiUrl}, trying next...`);\n }\n } catch (error) {\n console.warn(`Failed to fetch from ${apiUrl}:`, error);\n // Continue to next API\n }\n }\n } else if (chain === 'solana') {\n // Solana: Use public RPC API\n const rpcUrl = this.config.network === 'mainnet'\n ? 'https://api.mainnet-beta.solana.com'\n : 'https://api.devnet.solana.com';\n\n try {\n const response = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getBalance',\n params: [address],\n }),\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.result?.value !== undefined) {\n // Convert lamports to SOL (1 SOL = 1,000,000,000 lamports)\n balance = (data.result.value / 1_000_000_000).toFixed(9);\n }\n }\n } catch (error) {\n console.warn(`Failed to fetch ${chain} balance:`, error);\n }\n } else if (chain === 'tron') {\n // TRON: Use TronGrid API\n const baseUrl = this.config.network === 'mainnet'\n ? 'https://api.trongrid.io'\n : 'https://api.shasta.trongrid.io';\n\n try {\n const response = await fetch(`${baseUrl}/v1/accounts/${address}`, {\n headers: { 'Accept': 'application/json' },\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.data?.[0]?.balance !== undefined) {\n // Balance is in SUN (1 TRX = 1,000,000 SUN)\n balance = (data.data[0].balance / 1_000_000).toFixed(6);\n }\n }\n } catch (error) {\n console.warn(`Failed to fetch ${chain} balance:`, error);\n }\n } else if (chain === 'ton') {\n // TON: Use toncenter API\n const baseUrl = this.config.network === 'mainnet'\n ? 'https://toncenter.com/api/v2'\n : 'https://testnet.toncenter.com/api/v2';\n\n try {\n const response = await fetch(`${baseUrl}/getAddressBalance?address=${address}`, {\n headers: { 'Accept': 'application/json' },\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.ok && data.result !== undefined) {\n // Balance is in nanotons (1 TON = 1,000,000,000 nanotons)\n const nanotons = BigInt(data.result);\n balance = (Number(nanotons) / 1_000_000_000).toFixed(9);\n console.log(`TON balance for ${address}: ${balance} TON`);\n }\n }\n } catch (error) {\n console.warn(`Failed to fetch ${chain} balance:`, error);\n }\n } else if (chain === 'spark') {\n // Spark (Lightning): Balance fetching via Spark SDK\n // Note: Spark operates on Lightning Network with channels\n // For now, we try to get balance via the API if available\n try {\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/balance`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n chain: 'spark',\n address,\n network: this.config.network,\n }),\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.balance !== undefined) {\n // Balance in satoshis, convert to BTC\n balance = (parseFloat(data.balance) / 100_000_000).toFixed(8);\n console.log(`Spark balance for ${address}: ${balance} BTC`);\n }\n }\n } catch (error) {\n console.warn(`Failed to fetch ${chain} balance:`, error);\n // Balance remains '0' on error\n }\n }\n\n // Fetch USD price for this chain\n const priceUsd = await getPriceForChain(chain);\n const balanceNum = parseFloat(balance) || 0;\n const balanceUsd = balanceNum * priceUsd;\n\n return {\n chain,\n symbol: networkConfig.nativeCurrency.symbol,\n balance,\n balanceUsd,\n address,\n decimals: networkConfig.nativeCurrency.decimals,\n };\n }\n\n /**\n * Fetch balances for all enabled chains\n */\n async fetchAllBalances(): Promise<ChainBalance[]> {\n const balances: ChainBalance[] = [];\n\n for (const chain of this.config.enabledChains) {\n try {\n const balance = await this.fetchBalanceForChain(chain);\n balances.push(balance);\n } catch (error) {\n console.error(`Failed to fetch balance for ${chain}:`, error);\n // Add placeholder balance on error\n const networkConfig = this.getChainConfig(chain);\n balances.push({\n chain,\n symbol: networkConfig.nativeCurrency.symbol,\n balance: '0',\n balanceUsd: 0,\n address: this.getAddressForChain(chain) || '',\n decimals: networkConfig.nativeCurrency.decimals,\n });\n }\n }\n\n return balances;\n }\n\n /**\n * Get extended wallet state with multi-chain info\n */\n getExtendedState(): WalletState {\n return {\n isInitialized: this.derivedAddress !== null,\n isLocked: this.currentSeed === null && this.derivedAddress !== null,\n address: this.derivedAddress,\n balance: null,\n addresses: this.derivedAddresses,\n selectedChain: this.selectedChain,\n };\n }\n\n /**\n * Send a transaction using Tether WDK\n * Supports native tokens and USDT on all chains\n *\n * @param chain - Target blockchain (ethereum, bitcoin, ton, tron, solana, spark)\n * @param to - Recipient address\n * @param amount - Amount to send (in human-readable format)\n * @param token - Optional token symbol (e.g., 'USDT' for stablecoins)\n * @returns Transaction result with hash and status\n */\n async sendTransaction(\n chain: NetworkType,\n to: string,\n amount: string,\n token?: string\n ): Promise<{\n success: boolean;\n txHash?: string;\n from?: string;\n to?: string;\n amount?: string;\n chain?: NetworkType;\n error?: string;\n }> {\n if (!this.currentSeed) {\n return { success: false, error: 'Wallet is locked' };\n }\n\n const fromAddress = this.getAddressForChain(chain);\n if (!fromAddress) {\n return { success: false, error: `No address for chain ${chain}` };\n }\n\n try {\n // Use WDK service to send transaction via backend\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/send`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n seed: this.currentSeed,\n chain,\n to,\n amount,\n token,\n network: this.config.network,\n }),\n });\n\n if (response.ok) {\n const data = await response.json();\n console.log(`Transaction sent on ${chain}:`, data);\n\n // Extract and validate transaction hash\n let txHash = data.txHash || data.transactionHash || data.hash;\n\n // Handle case where txHash might be an object\n if (txHash && typeof txHash === 'object' && 'hash' in txHash) {\n txHash = txHash.hash;\n }\n\n // Validate Ethereum tx hash format (should be 66 chars: 0x + 64 hex)\n if (chain === 'ethereum' && txHash && (typeof txHash !== 'string' || !txHash.startsWith('0x') || txHash.length !== 66)) {\n console.warn(`Invalid Ethereum tx hash format: ${txHash} (length: ${txHash?.length}, expected: 66)`);\n }\n\n return {\n success: data.success,\n txHash,\n from: fromAddress,\n to,\n amount,\n chain,\n };\n }\n\n const errorData = await response.json().catch(() => ({}));\n return {\n success: false,\n error: errorData.error || `HTTP ${response.status}`,\n };\n } catch (error) {\n console.error(`Transaction failed on ${chain}:`, error);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Transaction failed',\n };\n }\n }\n\n /**\n * Estimate transaction fee using Tether WDK\n */\n async estimateFee(\n chain: NetworkType,\n to: string,\n amount: string,\n token?: string\n ): Promise<{\n success: boolean;\n fee?: string;\n feeUsd?: number;\n error?: string;\n }> {\n try {\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/estimate-fee`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n chain,\n to,\n amount,\n token,\n network: this.config.network,\n }),\n });\n\n if (response.ok) {\n const data = await response.json();\n return {\n success: true,\n fee: data.fee,\n feeUsd: data.feeUsd,\n };\n }\n\n return { success: false, error: 'Failed to estimate fee' };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Fee estimation failed',\n };\n }\n }\n}\n","import type {\n NFTMetadata,\n LazyMintVoucher,\n NFT,\n ListingParams,\n TxResult,\n CreateVoucherParams,\n NFTCurrency,\n} from '../types';\nimport {\n PLATFORM_CONFIG,\n NFT_VOUCHER_DOMAIN,\n NFT_VOUCHER_TYPES,\n CURRENCY_ADDRESSES,\n ZERO_ADDRESS,\n} from '../config/contracts';\n\n/**\n * ZubariNFTProtocol - NFT creation and marketplace operations\n *\n * Handles lazy minting via EIP-712 signatures, NFT listing,\n * and marketplace operations on Ethereum network.\n */\nexport class ZubariNFTProtocol {\n private readonly contractAddress: string;\n private readonly _marketplaceAddress: string;\n private readonly chainId: number;\n private readonly network: 'testnet' | 'mainnet';\n private nonceCounter: number = 0;\n\n constructor(\n contractAddress: string,\n marketplaceAddress: string,\n chainId: number,\n network: 'testnet' | 'mainnet' = 'testnet'\n ) {\n this.contractAddress = contractAddress;\n this._marketplaceAddress = marketplaceAddress;\n this.chainId = chainId;\n this.network = network;\n }\n\n /**\n * Convert human-readable price to wei\n * @param price - Price in human-readable format (e.g., \"1.5\")\n * @param currency - ETH (18 decimals) or USDT (6 decimals)\n */\n private priceToWei(price: string, currency: NFTCurrency): string {\n const decimals = currency === 'ETH' ? 18 : 6;\n const [whole, fraction = ''] = price.split('.');\n const paddedFraction = fraction.padEnd(decimals, '0').slice(0, decimals);\n const wei = whole + paddedFraction;\n // Remove leading zeros but keep at least one digit\n return wei.replace(/^0+/, '') || '0';\n }\n\n /**\n * Get currency address for the configured network\n */\n private getCurrencyAddress(currency: NFTCurrency): string {\n return CURRENCY_ADDRESSES[this.network][currency];\n }\n\n /**\n * Generate a unique nonce\n */\n private generateNonce(): number {\n return Date.now() * 1000 + this.nonceCounter++;\n }\n\n /**\n * Pad string to bytes32 format\n */\n private toBytes32(value: string): string {\n if (value.startsWith('0x')) {\n return value.padEnd(66, '0');\n }\n // Convert string to hex and pad\n const hex = Buffer.from(value).toString('hex');\n return '0x' + hex.padEnd(64, '0');\n }\n\n /**\n * Create a lazy mint voucher for off-chain NFT creation\n * The voucher can be redeemed on-chain when purchased\n *\n * @param params - Voucher creation parameters\n * @param signer - Object with signTypedData method (ethers.js wallet or viem client)\n */\n async createLazyMintVoucher(\n params: CreateVoucherParams,\n signer: { signTypedData: (domain: object, types: object, value: object) => Promise<string> }\n ): Promise<LazyMintVoucher> {\n const { metadata, creatorAddress, price, currency, nonce, watermarking } = params;\n\n // Ensure royaltyBps has a default value (500 = 5%)\n const royaltyBps = metadata.royaltyBps ?? 500;\n\n // Validate royalty\n if (royaltyBps > PLATFORM_CONFIG.maxRoyaltyBps) {\n throw new Error(`Royalty cannot exceed ${PLATFORM_CONFIG.maxRoyaltyBps / 100}%`);\n }\n\n // Validate price\n if (!price || parseFloat(price) <= 0) {\n throw new Error('Price must be greater than 0');\n }\n\n // Generate random tokenId\n const tokenId = this.generateTokenId();\n\n // Calculate deadline (30 days from now)\n const deadline = Math.floor(Date.now() / 1000) + PLATFORM_CONFIG.voucherValiditySecs;\n\n // Convert price to wei\n const priceInWei = this.priceToWei(price, currency);\n\n // Get currency address\n const currencyAddress = this.getCurrencyAddress(currency);\n\n // Generate or use provided nonce\n const voucherNonce = nonce ?? this.generateNonce();\n\n // Prepare watermarking data (use zero values if not provided)\n const watermarkTimestamp = watermarking ? Math.floor(Date.now() / 1000) : 0;\n const contentHash = watermarking ? this.toBytes32(watermarking.contentHash) : ZERO_ADDRESS.replace('0x', '0x' + '0'.repeat(64)).slice(0, 66);\n const userId = watermarking ? this.toBytes32(watermarking.userId) : ZERO_ADDRESS.replace('0x', '0x' + '0'.repeat(64)).slice(0, 66);\n const sessionId = watermarking ? this.toBytes32(watermarking.sessionId) : ZERO_ADDRESS.replace('0x', '0x' + '0'.repeat(64)).slice(0, 66);\n\n // Build voucher data for signing\n const voucherData = {\n tokenId,\n uri: metadata.image, // Will be IPFS URI\n creator: creatorAddress,\n royaltyBps, // Use the validated/defaulted value\n deadline,\n price: priceInWei,\n currency: currencyAddress,\n nonce: voucherNonce,\n contentHash,\n userId,\n watermarkTimestamp,\n sessionId,\n };\n\n // Create EIP-712 domain\n const domain = {\n ...NFT_VOUCHER_DOMAIN,\n chainId: this.chainId,\n verifyingContract: this.contractAddress,\n };\n\n // Sign the voucher\n const signature = await signer.signTypedData(domain, NFT_VOUCHER_TYPES, voucherData);\n\n return {\n tokenId,\n uri: metadata.image,\n creator: creatorAddress,\n royaltyBps, // Use the validated/defaulted value\n deadline,\n signature,\n price: priceInWei,\n currency: currencyAddress,\n nonce: voucherNonce,\n contentHash: watermarking ? contentHash : undefined,\n userId: watermarking ? userId : undefined,\n watermarkTimestamp: watermarking ? watermarkTimestamp : undefined,\n sessionId: watermarking ? sessionId : undefined,\n };\n }\n\n /**\n * @deprecated Use createLazyMintVoucher(params, signer) instead\n * Legacy method for backward compatibility\n */\n async createLazyMintVoucherLegacy(\n metadata: NFTMetadata,\n creatorAddress: string,\n signer: { signTypedData: (domain: object, types: object, value: object) => Promise<string> }\n ): Promise<LazyMintVoucher> {\n // Default to 0.01 ETH for legacy calls\n return this.createLazyMintVoucher(\n {\n metadata,\n creatorAddress,\n price: '0.01',\n currency: 'ETH',\n },\n signer\n );\n }\n\n /**\n * Redeem a lazy mint voucher to mint the NFT on-chain\n */\n async redeemVoucher(voucher: LazyMintVoucher, _buyerAddress: string): Promise<TxResult> {\n // Validate voucher deadline\n if (voucher.deadline < Math.floor(Date.now() / 1000)) {\n throw new Error('Voucher has expired');\n }\n\n // Placeholder - will call contract\n return {\n hash: '',\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * List an NFT for sale on the marketplace\n */\n async listForSale(_params: ListingParams): Promise<TxResult> {\n // Placeholder - will approve and list\n return {\n hash: '',\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Buy an NFT from the marketplace\n */\n async buyNFT(_listingId: string, _price: bigint): Promise<TxResult> {\n // Placeholder - will call marketplace contract\n return {\n hash: '',\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Transfer an NFT to another address\n */\n async transfer(_tokenId: string, _to: string): Promise<TxResult> {\n // Placeholder - will call NFT contract\n return {\n hash: '',\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Get NFTs owned by an address\n */\n async getOwnedNFTs(_address: string): Promise<NFT[]> {\n // Placeholder - will query contract/indexer\n return [];\n }\n\n /**\n * Generate a random tokenId (32 bytes hex)\n */\n private generateTokenId(): string {\n const bytes = new Uint8Array(32);\n crypto.getRandomValues(bytes);\n return '0x' + Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\n }\n}\n","[\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_treasury\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"_platformFeeBps\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [],\n \"name\": \"EnforcedPause\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ExpectedPause\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InsufficientPayment\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidAddress\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidDuration\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidFee\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidPrice\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ListingExpired\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ListingNotActive\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"NotApproved\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"NotSeller\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"NotTokenOwner\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableInvalidOwner\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableUnauthorizedAccount\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ReentrancyGuardReentrantCall\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"SafeERC20FailedOperation\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"TransferFailed\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"UnsupportedPaymentToken\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"nftContract\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"tokenId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"seller\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"expiresAt\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Listed\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"ListingCancelled\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newPrice\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"ListingUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"previousOwner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnershipTransferred\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Paused\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bool\",\n \"name\": \"supported\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"PaymentTokenUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"buyer\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"royaltyAmount\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"platformFee\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Sale\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Unpaused\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"buyItem\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"cancelListing\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getListing\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"nftContract\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"tokenId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"seller\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"expiresAt\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isActive\",\n \"type\": \"bool\"\n }\n ],\n \"internalType\": \"struct ZubariMarket.Listing\",\n \"name\": \"\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"isListingValid\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"nftContract\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"tokenId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"duration\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"listItem\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"listingCounter\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"listings\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"nftContract\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"tokenId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"seller\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"expiresAt\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isActive\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"owner\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"pause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"paused\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"platformFeeBps\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"renounceOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"_feeBps\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"setPlatformFee\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"supported\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"setSupportedToken\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_treasury\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"setTreasury\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"supportedTokens\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"tokenListings\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"transferOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"treasury\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"unpause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"newPrice\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"updatePrice\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n]","import type {\n ListingParams,\n Listing,\n BuyParams,\n TxResult,\n} from '../types';\nimport { PLATFORM_CONFIG } from '../config/contracts';\n\n// Import ABI\nimport ZubariMarketAbi from '../abi/ZubariMarket.json';\n\n/**\n * ZubariMarketProtocol - NFT Marketplace operations\n *\n * Handles NFT listings, purchases, and marketplace management\n * with support for ETH and ERC-20 payment tokens.\n */\nexport class ZubariMarketProtocol {\n private readonly contractAddress: string;\n private readonly chainId: number;\n private readonly abi = ZubariMarketAbi;\n\n constructor(contractAddress: string, chainId: number) {\n this.contractAddress = contractAddress;\n this.chainId = chainId;\n }\n\n /**\n * Get the contract ABI\n */\n getAbi() {\n return this.abi;\n }\n\n /**\n * Get the contract address\n */\n getAddress(): string {\n return this.contractAddress;\n }\n\n /**\n * List an NFT for sale\n * @param params Listing parameters\n * @param signer Wallet signer with sendTransaction method\n */\n async listItem(\n params: ListingParams,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n // Validate price\n if (params.price <= 0n) {\n throw new Error('Price must be greater than 0');\n }\n\n // Validate duration\n if (params.duration <= 0) {\n throw new Error('Duration must be greater than 0');\n }\n\n // Encode function data\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('listItem', [\n params.nftContract,\n params.tokenId,\n params.price,\n params.paymentToken,\n params.duration,\n ]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Buy an NFT from a listing\n * @param params Buy parameters\n * @param signer Wallet signer\n */\n async buyItem(\n params: BuyParams,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('buyItem', [params.listingId]);\n\n // If paying with ETH (zero address), include value\n const isEthPayment = params.paymentToken === '0x0000000000000000000000000000000000000000';\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: isEthPayment ? params.price : 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Cancel a listing\n * @param listingId The listing ID to cancel\n * @param signer Wallet signer\n */\n async cancelListing(\n listingId: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('cancelListing', [listingId]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Update listing price\n * @param listingId The listing ID\n * @param newPrice New price\n * @param signer Wallet signer\n */\n async updatePrice(\n listingId: string,\n newPrice: bigint,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n if (newPrice <= 0n) {\n throw new Error('Price must be greater than 0');\n }\n\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('updatePrice', [listingId, newPrice]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Get listing details\n * @param listingId The listing ID\n * @param provider JSON-RPC provider\n */\n async getListing(\n listingId: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<Listing | null> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('getListing', [listingId]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('getListing', result);\n const listing = decoded[0];\n\n return {\n listingId,\n nftContract: listing.nftContract,\n tokenId: listing.tokenId.toString(),\n seller: listing.seller,\n price: listing.price,\n paymentToken: listing.paymentToken,\n expiresAt: Number(listing.expiresAt),\n isActive: listing.isActive,\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Check if a payment token is supported\n * @param token Token address\n * @param provider JSON-RPC provider\n */\n async isTokenSupported(\n token: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<boolean> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('supportedTokens', [token]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('supportedTokens', result);\n return decoded[0];\n } catch {\n return false;\n }\n }\n\n /**\n * Calculate platform fee for a given price\n * @param price The sale price\n */\n calculateFee(price: bigint): { fee: bigint; sellerAmount: bigint } {\n const fee = (price * BigInt(PLATFORM_CONFIG.tipFeeBps)) / 10000n;\n return {\n fee,\n sellerAmount: price - fee,\n };\n }\n}\n","[\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_treasury\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"_platformFeeBps\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [],\n \"name\": \"EnforcedPause\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ExpectedPause\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidAddress\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidAmount\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidFee\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidRecipient\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableInvalidOwner\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableUnauthorizedAccount\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ReentrancyGuardReentrantCall\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"SafeERC20FailedOperation\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"TransferFailed\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"uint256[]\",\n \"name\": \"tipIds\",\n \"type\": \"uint256[]\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"BatchTipSent\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"previousOwner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnershipTransferred\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Paused\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"oldFee\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newFee\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"PlatformFeeUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"tipId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"platformFee\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"string\",\n \"name\": \"message\",\n \"type\": \"string\"\n }\n ],\n \"name\": \"TipSent\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"oldTreasury\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"newTreasury\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"TreasuryUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Unpaused\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"tipId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getTip\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"tipId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"platformFee\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"message\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"timestamp\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct ZubariTips.Tip\",\n \"name\": \"\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"owner\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"pause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"paused\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"platformFeeBps\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"renounceOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address[]\",\n \"name\": \"recipients\",\n \"type\": \"address[]\"\n },\n {\n \"internalType\": \"uint256[]\",\n \"name\": \"amounts\",\n \"type\": \"uint256[]\"\n },\n {\n \"internalType\": \"string[]\",\n \"name\": \"messages\",\n \"type\": \"string[]\"\n }\n ],\n \"name\": \"sendBatchTips\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"_feeBps\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"setPlatformFee\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_treasury\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"setTreasury\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"tipCounter\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"message\",\n \"type\": \"string\"\n }\n ],\n \"name\": \"tipETH\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"message\",\n \"type\": \"string\"\n }\n ],\n \"name\": \"tipToken\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"tips\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"tipId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"platformFee\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"message\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"timestamp\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"totalTipsReceived\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"transferOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"treasury\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"unpause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n]","import type { Tip, TxResult } from '../types';\n\n// Import ABI\nimport ZubariTipsAbi from '../abi/ZubariTips.json';\n\n/**\n * ZubariTipsProtocol - Micropayment tips for creators\n *\n * Handles ETH and ERC-20 token tips with platform fee distribution.\n * Supports individual tips, batch tips, and tip queries.\n */\nexport class ZubariTipsProtocol {\n private readonly contractAddress: string;\n private readonly chainId: number;\n private readonly abi = ZubariTipsAbi;\n\n constructor(contractAddress: string, chainId: number) {\n this.contractAddress = contractAddress;\n this.chainId = chainId;\n }\n\n /**\n * Get the contract ABI\n */\n getAbi() {\n return this.abi;\n }\n\n /**\n * Get the contract address\n */\n getAddress(): string {\n return this.contractAddress;\n }\n\n /**\n * Send ETH tip to a creator\n * @param recipient The recipient address\n * @param message Optional tip message\n * @param signer Wallet signer with sendTransaction method\n * @param value ETH amount to tip (in wei)\n */\n async tipETH(\n recipient: string,\n message: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> },\n value: bigint\n ): Promise<TxResult> {\n if (!recipient || recipient === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid recipient address');\n }\n if (value <= 0n) {\n throw new Error('Tip amount must be greater than 0');\n }\n\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('tipETH', [recipient, message || '']);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Send ERC-20 token tip to a creator\n * @param recipient The recipient address\n * @param token The ERC-20 token address\n * @param amount The amount of tokens to tip\n * @param message Optional tip message\n * @param signer Wallet signer\n */\n async tipToken(\n recipient: string,\n token: string,\n amount: bigint,\n message: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n if (!recipient || recipient === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid recipient address');\n }\n if (!token || token === '0x0000000000000000000000000000000000000000') {\n throw new Error('Use tipETH for native ETH tips');\n }\n if (amount <= 0n) {\n throw new Error('Tip amount must be greater than 0');\n }\n\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('tipToken', [recipient, token, amount, message || '']);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Send batch tips to multiple creators in a single transaction\n * @param recipients Array of recipient addresses\n * @param amounts Array of tip amounts (in wei)\n * @param messages Array of tip messages\n * @param signer Wallet signer\n * @param value Total ETH to send\n */\n async sendBatchTips(\n recipients: string[],\n amounts: bigint[],\n messages: string[],\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> },\n value: bigint\n ): Promise<TxResult> {\n if (recipients.length === 0) {\n throw new Error('At least one recipient is required');\n }\n if (recipients.length !== amounts.length || recipients.length !== messages.length) {\n throw new Error('Recipients, amounts, and messages arrays must have the same length');\n }\n\n // Validate all recipients\n for (const recipient of recipients) {\n if (!recipient || recipient === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid recipient address in batch');\n }\n }\n\n // Calculate total amount\n const totalAmount = amounts.reduce((sum, amount) => sum + amount, 0n);\n if (totalAmount <= 0n) {\n throw new Error('Total tip amount must be greater than 0');\n }\n\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('sendBatchTips', [recipients, amounts, messages]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Get tip details by ID\n * @param tipId The tip ID\n * @param provider JSON-RPC provider\n */\n async getTip(\n tipId: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<Tip | null> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('getTip', [tipId]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('getTip', result);\n const tip = decoded[0];\n\n // Check if tip exists (tipId != 0)\n if (BigInt(tip.tipId) === 0n) {\n return null;\n }\n\n return {\n tipId: tip.tipId.toString(),\n sender: tip.sender,\n recipient: tip.recipient,\n token: tip.token,\n amount: BigInt(tip.amount),\n platformFee: BigInt(tip.platformFee),\n message: tip.message,\n timestamp: Number(tip.timestamp),\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Get total tips received by an address\n * @param address The address to query\n * @param provider JSON-RPC provider\n */\n async getTotalTipsReceived(\n address: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<bigint> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('totalTipsReceived', [address]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('totalTipsReceived', result);\n return BigInt(decoded[0]);\n } catch {\n return 0n;\n }\n }\n\n /**\n * Get platform fee in basis points\n * @param provider JSON-RPC provider\n */\n async getPlatformFeeBps(\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<number> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('platformFeeBps', []);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('platformFeeBps', result);\n return Number(decoded[0]);\n } catch {\n return 300; // Default 3%\n }\n }\n\n /**\n * Get current tip counter\n * @param provider JSON-RPC provider\n */\n async getTipCounter(\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<bigint> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('tipCounter', []);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('tipCounter', result);\n return BigInt(decoded[0]);\n } catch {\n return 0n;\n }\n }\n\n /**\n * Get treasury address\n * @param provider JSON-RPC provider\n */\n async getTreasury(\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<string> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('treasury', []);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('treasury', result);\n return decoded[0];\n } catch {\n return '0x0000000000000000000000000000000000000000';\n }\n }\n\n /**\n * Calculate platform fee for a given amount\n * @param amount The tip amount\n * @param feeBps Fee in basis points (default: 300 = 3%)\n */\n calculateFee(amount: bigint, feeBps: number = 300): { fee: bigint; creatorAmount: bigint } {\n const fee = (amount * BigInt(feeBps)) / 10000n;\n return {\n fee,\n creatorAmount: amount - fee,\n };\n }\n}\n","[\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_treasury\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"_platformFeeBps\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [],\n \"name\": \"AlreadySubscribed\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"EnforcedPause\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ExpectedPause\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidAddress\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidAmount\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidDuration\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidFee\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"NotSubscriber\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableInvalidOwner\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableUnauthorizedAccount\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"PlanFull\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"PlanNotActive\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"PlanNotFound\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ReentrancyGuardReentrantCall\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"SafeERC20FailedOperation\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"previousOwner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnershipTransferred\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Paused\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"string\",\n \"name\": \"name\",\n \"type\": \"string\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"PlanCreated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"PlanDeactivated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"PlanUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"endTime\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Subscribed\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"SubscriptionCancelled\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newEndTime\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"SubscriptionRenewed\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Unpaused\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"activeSubscription\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"cancel\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"name\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"description\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"durationDays\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"maxSubscribers\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"createPlan\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"creatorPlans\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"deactivatePlan\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"getCreatorPlans\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32[]\",\n \"name\": \"\",\n \"type\": \"bytes32[]\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPlan\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"name\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"description\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"durationDays\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"maxSubscribers\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"subscriberCount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isActive\",\n \"type\": \"bool\"\n }\n ],\n \"internalType\": \"struct ZubariSubscription.SubscriptionPlan\",\n \"name\": \"\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getSubscription\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"startTime\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"endTime\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"autoRenew\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"enum ZubariSubscription.SubscriptionStatus\",\n \"name\": \"status\",\n \"type\": \"uint8\"\n }\n ],\n \"internalType\": \"struct ZubariSubscription.Subscription\",\n \"name\": \"\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"isSubscribed\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"owner\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"pause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"paused\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"plans\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"name\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"description\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"durationDays\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"maxSubscribers\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"subscriberCount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isActive\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"platformFeeBps\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"renounceOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"autoRenew\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"setAutoRenew\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"_feeBps\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"setPlatformFee\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_treasury\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"setTreasury\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"months\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"subscribe\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"subscriberSubscriptions\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"subscriptions\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"startTime\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"endTime\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"autoRenew\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"enum ZubariSubscription.SubscriptionStatus\",\n \"name\": \"status\",\n \"type\": \"uint8\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"transferOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"treasury\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"unpause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n]","import type { SubscriptionPlan, Subscription, TxResult } from '../types';\n\n// Import ABI\nimport ZubariSubscriptionAbi from '../abi/ZubariSubscription.json';\n\n// Subscription status enum matching the contract\nenum SubscriptionStatus {\n Active = 0,\n Cancelled = 1,\n Expired = 2,\n}\n\n/**\n * ZubariSubscriptionProtocol - Recurring subscription payments\n *\n * Handles subscription plan creation, subscription management,\n * and verification of active subscriptions using the ZubariSubscription smart contract.\n */\nexport class ZubariSubscriptionProtocol {\n private readonly contractAddress: string;\n private readonly chainId: number;\n private readonly abi = ZubariSubscriptionAbi;\n\n constructor(contractAddress: string, chainId: number) {\n this.contractAddress = contractAddress;\n this.chainId = chainId;\n }\n\n /**\n * Get the contract ABI\n */\n getAbi() {\n return this.abi;\n }\n\n /**\n * Get the contract address\n */\n getAddress(): string {\n return this.contractAddress;\n }\n\n /**\n * Create a new subscription plan\n * @param plan The plan details\n * @param signer Wallet signer with sendTransaction method\n */\n async createPlan(\n plan: SubscriptionPlan,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<string> {\n // Validate plan\n if (!plan.name || plan.name.length === 0) {\n throw new Error('Plan name is required');\n }\n if (plan.price <= 0n) {\n throw new Error('Plan price must be greater than 0');\n }\n if (plan.duration <= 0) {\n throw new Error('Plan duration must be greater than 0');\n }\n\n // Encode function data\n const iface = new (await import('ethers')).Interface(this.abi);\n\n // Convert duration from seconds to days (contract expects days)\n const durationDays = Math.ceil(plan.duration / (24 * 60 * 60));\n\n const data = iface.encodeFunctionData('createPlan', [\n plan.name,\n plan.description || '',\n plan.price,\n plan.paymentToken || '0x0000000000000000000000000000000000000000', // ETH by default\n durationDays,\n plan.maxSubscribers || 0, // 0 = unlimited\n ]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n // Return tx hash - the planId will be emitted in the event\n return result.hash;\n }\n\n /**\n * Deactivate a subscription plan (only creator can do this)\n * @param planId The plan ID to deactivate\n * @param signer Wallet signer\n */\n async deactivatePlan(\n planId: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('deactivatePlan', [planId]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Subscribe to a creator's plan\n * @param planId The plan ID to subscribe to\n * @param months Number of months to subscribe\n * @param signer Wallet signer\n * @param value ETH value to send (if paying with ETH)\n */\n async subscribe(\n planId: string,\n months: number,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> },\n value?: bigint\n ): Promise<TxResult> {\n if (months <= 0) {\n throw new Error('Subscription duration must be at least 1 month');\n }\n\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('subscribe', [planId, months]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: value || 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Cancel an active subscription\n * @param subscriptionId The subscription ID to cancel\n * @param signer Wallet signer\n */\n async cancel(\n subscriptionId: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('cancel', [subscriptionId]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Set auto-renew for a subscription\n * @param subscriptionId The subscription ID\n * @param autoRenew Whether to enable auto-renew\n * @param signer Wallet signer\n */\n async setAutoRenew(\n subscriptionId: string,\n autoRenew: boolean,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('setAutoRenew', [subscriptionId, autoRenew]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Check if an address is subscribed to a creator\n * @param subscriber The subscriber address\n * @param creator The creator address\n * @param provider JSON-RPC provider\n */\n async isSubscribed(\n subscriber: string,\n creator: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<boolean> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('isSubscribed', [subscriber, creator]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('isSubscribed', result);\n return decoded[0];\n } catch {\n return false;\n }\n }\n\n /**\n * Get the active subscription ID between subscriber and creator\n * @param subscriber The subscriber address\n * @param creator The creator address\n * @param provider JSON-RPC provider\n */\n async getActiveSubscriptionId(\n subscriber: string,\n creator: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<string | null> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('activeSubscription', [subscriber, creator]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('activeSubscription', result);\n const subscriptionId = decoded[0];\n\n // bytes32(0) means no active subscription\n if (subscriptionId === '0x0000000000000000000000000000000000000000000000000000000000000000') {\n return null;\n }\n\n return subscriptionId;\n } catch {\n return null;\n }\n }\n\n /**\n * Get subscription details by ID\n * @param subscriptionId The subscription ID\n * @param provider JSON-RPC provider\n */\n async getSubscription(\n subscriptionId: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<Subscription | null> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('getSubscription', [subscriptionId]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('getSubscription', result);\n const sub = decoded[0];\n\n // Check if subscription exists (subscriptionId != 0)\n if (sub.subscriptionId === '0x0000000000000000000000000000000000000000000000000000000000000000') {\n return null;\n }\n\n // Map status enum\n let status: 'active' | 'cancelled' | 'expired';\n switch (Number(sub.status)) {\n case SubscriptionStatus.Active:\n status = 'active';\n break;\n case SubscriptionStatus.Cancelled:\n status = 'cancelled';\n break;\n case SubscriptionStatus.Expired:\n status = 'expired';\n break;\n default:\n status = 'active';\n }\n\n return {\n subscriptionId: sub.subscriptionId,\n planId: sub.planId,\n creator: sub.creator,\n subscriber: sub.subscriber,\n startTime: Number(sub.startTime),\n endTime: Number(sub.endTime),\n autoRenew: sub.autoRenew,\n status,\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Get a specific plan by ID\n * @param planId The plan ID\n * @param provider JSON-RPC provider\n */\n async getPlan(\n planId: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<SubscriptionPlan | null> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('getPlan', [planId]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('getPlan', result);\n const plan = decoded[0];\n\n // Check if plan exists (planId != 0)\n if (plan.planId === '0x0000000000000000000000000000000000000000000000000000000000000000') {\n return null;\n }\n\n // Convert duration from days to seconds\n const durationSeconds = Number(plan.durationDays) * 24 * 60 * 60;\n\n return {\n planId: plan.planId,\n name: plan.name,\n description: plan.description,\n price: plan.price,\n paymentToken: plan.paymentToken,\n duration: durationSeconds,\n perks: [], // Not stored on-chain\n maxSubscribers: Number(plan.maxSubscribers),\n nftBadge: false, // Not stored on-chain in this contract version\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Get all plan IDs for a creator\n * @param creator The creator address\n * @param provider JSON-RPC provider\n */\n async getCreatorPlanIds(\n creator: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<string[]> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('getCreatorPlans', [creator]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('getCreatorPlans', result);\n return decoded[0] as string[];\n } catch {\n return [];\n }\n }\n\n /**\n * Get all plans for a creator with full details\n * @param creator The creator address\n * @param provider JSON-RPC provider\n */\n async getCreatorPlans(\n creator: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<SubscriptionPlan[]> {\n const planIds = await this.getCreatorPlanIds(creator, provider);\n const plans: SubscriptionPlan[] = [];\n\n for (const planId of planIds) {\n const plan = await this.getPlan(planId, provider);\n if (plan && plan.planId) {\n plans.push(plan);\n }\n }\n\n return plans;\n }\n\n /**\n * Get platform fee in basis points\n * @param provider JSON-RPC provider\n */\n async getPlatformFeeBps(\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<number> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('platformFeeBps', []);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('platformFeeBps', result);\n return Number(decoded[0]);\n } catch {\n return 300; // Default 3%\n }\n }\n\n /**\n * Calculate the total cost for a subscription\n * @param planPrice The plan price per period\n * @param months Number of months\n */\n calculateSubscriptionCost(planPrice: bigint, months: number): bigint {\n return planPrice * BigInt(months);\n }\n\n /**\n * Calculate platform fee for a given amount\n * @param amount The amount\n * @param feeBps Fee in basis points\n */\n calculateFee(amount: bigint, feeBps: number = 300): { fee: bigint; creatorAmount: bigint } {\n const fee = (amount * BigInt(feeBps)) / 10000n;\n return {\n fee,\n creatorAmount: amount - fee,\n };\n }\n}\n","import type {\n EarningsBreakdown,\n EarningsResponse,\n PayoutHistoryResponse,\n BreakdownResponse,\n PlatformFeeResponse,\n ClaimResult,\n RevenueSplit,\n TxResult,\n} from '../types';\n\n/**\n * ZubariPayoutsProtocol - Creator earnings management\n *\n * Handles earnings tracking, claiming, revenue splits,\n * and conversion to stablecoins.\n */\nexport class ZubariPayoutsProtocol {\n private readonly contractAddress: string;\n private readonly chainId: number;\n private readonly apiBaseUrl: string;\n\n constructor(contractAddress: string, chainId: number, apiBaseUrl?: string) {\n this.contractAddress = contractAddress;\n this.chainId = chainId;\n this.apiBaseUrl = apiBaseUrl || 'https://ckgwifsxka.us-east-2.awsapprunner.com';\n }\n\n /**\n * Get pending earnings breakdown for the current user (on-chain)\n */\n async getPendingEarnings(): Promise<EarningsBreakdown> {\n // Placeholder - will call contract directly\n return {\n tips: BigInt(0),\n subscriptions: BigInt(0),\n nftSales: BigInt(0),\n royalties: BigInt(0),\n total: BigInt(0),\n };\n }\n\n /**\n * Get earnings data from API (includes pending, total, breakdown, and recent payouts)\n * Requires authentication token\n */\n async getEarnings(authToken: string): Promise<EarningsResponse> {\n const response = await fetch(`${this.apiBaseUrl}/api/payouts/earnings`, {\n headers: {\n Authorization: `Bearer ${authToken}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || 'Failed to fetch earnings');\n }\n\n return response.json();\n }\n\n /**\n * Get payout history with pagination\n * Requires authentication token\n */\n async getPayoutHistory(\n authToken: string,\n page: number = 1,\n limit: number = 20\n ): Promise<PayoutHistoryResponse> {\n const response = await fetch(\n `${this.apiBaseUrl}/api/payouts/history?page=${page}&limit=${limit}`,\n {\n headers: {\n Authorization: `Bearer ${authToken}`,\n 'Content-Type': 'application/json',\n },\n }\n );\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || 'Failed to fetch payout history');\n }\n\n return response.json();\n }\n\n /**\n * Get earnings breakdown by source with percentages\n * Requires authentication token\n */\n async getBreakdown(authToken: string): Promise<BreakdownResponse> {\n const response = await fetch(`${this.apiBaseUrl}/api/payouts/breakdown`, {\n headers: {\n Authorization: `Bearer ${authToken}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || 'Failed to fetch earnings breakdown');\n }\n\n return response.json();\n }\n\n /**\n * Get current platform fee\n */\n async getPlatformFee(): Promise<PlatformFeeResponse> {\n const response = await fetch(`${this.apiBaseUrl}/api/payouts/platform-fee`, {\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || 'Failed to fetch platform fee');\n }\n\n return response.json();\n }\n\n /**\n * Get historical earnings for a time period\n */\n async getEarningsHistory(\n period: 'day' | 'week' | 'month' | 'all' = 'all'\n ): Promise<EarningsBreakdown[]> {\n // Placeholder - will query indexer\n return [];\n }\n\n /**\n * Claim all pending earnings via API\n * Requires authentication token and seed phrase\n */\n async claimEarningsViaApi(authToken: string, seed: string): Promise<ClaimResult> {\n const response = await fetch(`${this.apiBaseUrl}/api/payouts/claim`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${authToken}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ seed }),\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || 'Failed to claim earnings');\n }\n\n return response.json();\n }\n\n /**\n * Claim all pending earnings (direct contract call)\n */\n async claimEarnings(): Promise<TxResult> {\n // Placeholder - will call contract\n return {\n hash: '',\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Claim specific amount of earnings\n */\n async claimPartialEarnings(amount: bigint): Promise<TxResult> {\n if (amount <= 0n) {\n throw new Error('Amount must be greater than 0');\n }\n\n // Placeholder - will call contract\n return {\n hash: '',\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Setup revenue split with collaborators\n * Basis points must sum to 10000 (100%)\n */\n async setupRevenueSplit(splits: RevenueSplit[]): Promise<TxResult> {\n // Validate that basis points sum to 100%\n const totalBps = splits.reduce((sum, split) => sum + split.basisPoints, 0);\n if (totalBps !== 10000) {\n throw new Error('Revenue splits must sum to 100% (10000 basis points)');\n }\n\n // Validate each split\n for (const split of splits) {\n if (split.basisPoints <= 0) {\n throw new Error('Each split must have positive basis points');\n }\n if (!split.recipient || split.recipient.length === 0) {\n throw new Error('Each split must have a valid recipient address');\n }\n }\n\n // Placeholder - will call contract\n return {\n hash: '',\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Get current revenue split configuration\n */\n async getRevenueSplit(): Promise<RevenueSplit[]> {\n // Placeholder - will query contract\n return [];\n }\n\n /**\n * Remove revenue split (creator gets 100%)\n */\n async removeRevenueSplit(): Promise<TxResult> {\n // Placeholder - will call contract\n return {\n hash: '',\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Convert earnings to stablecoin (USDT)\n */\n async convertToStable(token: string, amount: bigint): Promise<TxResult> {\n if (amount <= 0n) {\n throw new Error('Amount must be greater than 0');\n }\n\n // Placeholder - will use swap protocol\n return {\n hash: '',\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Get the contract address\n */\n getContractAddress(): string {\n return this.contractAddress;\n }\n\n /**\n * Get the chain ID\n */\n getChainId(): number {\n return this.chainId;\n }\n}\n","import type { SwapQuote, TxResult } from '../types';\nimport { PLATFORM_CONFIG, getContractAddresses } from '../config/contracts';\n\n/**\n * SwapService - DEX integration via Velora\n *\n * Handles token swaps with slippage protection,\n * quote fetching, and earnings conversion.\n */\nexport class SwapService {\n private readonly _chainId: number;\n private readonly isTestnet: boolean;\n\n constructor(chainId: number, isTestnet: boolean = false) {\n this._chainId = chainId;\n this.isTestnet = isTestnet;\n }\n\n /**\n * Get a swap quote\n */\n async getQuote(\n tokenIn: string,\n tokenOut: string,\n amountIn: bigint\n ): Promise<SwapQuote> {\n if (amountIn <= 0n) {\n throw new Error('Amount must be greater than 0');\n }\n\n // Placeholder - will use Velora DEX\n return {\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: BigInt(0),\n priceImpact: 0,\n route: [tokenIn, tokenOut],\n estimatedGas: BigInt(0),\n };\n }\n\n /**\n * Execute a swap with slippage protection\n */\n async executeSwap(\n quote: SwapQuote,\n slippageToleranceBps: number = PLATFORM_CONFIG.defaultSlippageBps\n ): Promise<TxResult> {\n // Calculate minimum output with slippage\n const _minAmountOut =\n quote.amountOut - (quote.amountOut * BigInt(slippageToleranceBps)) / BigInt(10000);\n\n // Calculate deadline\n const _deadline = Math.floor(Date.now() / 1000) + PLATFORM_CONFIG.swapDeadlineSecs;\n\n // Warn if price impact is high\n if (quote.priceImpact > 5) {\n console.warn(`High price impact: ${quote.priceImpact}%`);\n }\n\n // Placeholder - will call swap contract\n return {\n hash: '',\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Convert earnings to USDT, keeping some ETH for gas\n */\n async convertEarningsToStable(\n ethBalance: bigint,\n reserveForGas: bigint = BigInt('10000000000000000') // 0.01 ETH\n ): Promise<TxResult> {\n const amountToSwap = ethBalance - reserveForGas;\n\n if (amountToSwap <= 0n) {\n throw new Error('Insufficient balance after gas reserve');\n }\n\n // Get quote for ETH -> USDT\n const contracts = getContractAddresses(this.isTestnet ? 'testnet' : 'mainnet');\n const quote = await this.getQuote(\n '0x0000000000000000000000000000000000000000', // ETH\n contracts.usdt, // USDT on Ethereum\n amountToSwap\n );\n\n return this.executeSwap(quote);\n }\n\n /**\n * Check if a swap route exists\n */\n async hasRoute(tokenIn: string, tokenOut: string): Promise<boolean> {\n try {\n const quote = await this.getQuote(tokenIn, tokenOut, BigInt(1));\n return quote.amountOut > 0n;\n } catch {\n return false;\n }\n }\n\n /**\n * Get supported tokens for swapping\n */\n async getSupportedTokens(): Promise<string[]> {\n // Placeholder - will query DEX\n return [];\n }\n}\n","/**\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://api.shasta.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://shasta.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 || 'testnet',\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","// Network Types\nexport type NetworkType = 'bitcoin' | 'ethereum' | 'ton' | 'tron' | 'solana' | 'spark';\n\n// Wallet Configuration\nexport interface ZubariWalletConfig {\n network: 'mainnet' | 'testnet';\n enabledNetworks: NetworkType[];\n gasless: boolean;\n paymasterUrl?: string;\n bundlerUrl?: string;\n rpcUrls?: Partial<Record<NetworkType, string>>;\n}\n\n// Balance Types\nexport interface TokenBalance {\n symbol: string;\n address: string;\n balance: bigint;\n balanceFormatted: string;\n balanceUsd: number;\n decimals: number;\n}\n\nexport interface NetworkBalance {\n network: NetworkType;\n native: {\n symbol: string;\n balance: bigint;\n balanceFormatted: string;\n balanceUsd: number;\n };\n tokens: TokenBalance[];\n}\n\n// Transaction Types\nexport interface TxResult {\n hash: string;\n network: NetworkType;\n status: 'pending' | 'confirmed' | 'failed';\n blockNumber?: number;\n gasUsed?: bigint;\n error?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface SendParams {\n to: string;\n amount: bigint;\n token?: string;\n gasless?: boolean;\n}\n\n// Account Types\nexport interface Account {\n network: NetworkType;\n address: string;\n publicKey: string;\n derivationPath: string;\n}\n\n// NFT Types\nexport type NFTCurrency = 'ETH' | 'USDT';\n\nexport interface NFTAttribute {\n trait_type: string;\n value: string | number;\n display_type?: 'boost_number' | 'boost_percentage' | 'number' | 'date';\n max_value?: number;\n}\n\nexport interface NFTMetadata {\n name: string;\n description: string;\n image: string;\n externalUrl?: string;\n animationUrl?: string;\n attributes?: NFTAttribute[];\n royaltyBps: number;\n}\n\nexport interface WatermarkingData {\n contentHash: string; // Hash of original content (bytes32)\n userId: string; // Unique user identifier (bytes32)\n sessionId: string; // Session identifier (bytes32)\n}\n\nexport interface CreateVoucherParams {\n metadata: NFTMetadata;\n creatorAddress: string;\n price: string; // Price in human-readable format (e.g., \"1.5\")\n currency: NFTCurrency;\n nonce?: number; // Optional, auto-generated if not provided\n watermarking?: WatermarkingData;\n}\n\nexport interface LazyMintVoucher {\n tokenId: string;\n uri: string;\n creator: string;\n royaltyBps: number;\n deadline: number;\n signature: string;\n // Pricing fields\n price: string; // Price in wei\n currency: string; // 0x0 for ETH, USDC address for ERC20\n nonce: number; // Unique nonce for replay protection\n // Watermarking fields (optional)\n contentHash?: string;\n userId?: string;\n watermarkTimestamp?: number;\n sessionId?: string;\n}\n\nexport interface NFT {\n tokenId: string;\n contractAddress: string;\n owner: string;\n creator: string;\n uri: string;\n metadata?: NFTMetadata;\n isLazyMinted: boolean;\n}\n\nexport interface ListingParams {\n nftContract: string;\n tokenId: string;\n price: bigint;\n paymentToken: string;\n duration: number;\n}\n\nexport interface Listing {\n listingId: string;\n nftContract: string;\n tokenId: string;\n seller: string;\n price: bigint;\n paymentToken: string;\n expiresAt: number;\n isActive: boolean;\n}\n\nexport interface BuyParams {\n listingId: string;\n price: bigint;\n paymentToken: string;\n}\n\n// Tip Types\nexport interface TipData {\n recipient: string;\n amount: bigint;\n token: string;\n message?: string;\n}\n\nexport interface TipResult {\n txHash: string;\n tipId: string;\n recipient: string;\n amount: bigint;\n platformFee: bigint;\n timestamp: number;\n}\n\nexport interface TipStats {\n totalReceived: bigint;\n tipCount: number;\n uniqueTippers: number;\n}\n\nexport interface Tip {\n tipId: string;\n sender: string;\n recipient: string;\n token: string;\n amount: bigint;\n platformFee: bigint;\n message: string;\n timestamp: number;\n}\n\n// Subscription Types\nexport interface SubscriptionPlan {\n planId?: string;\n name: string;\n description: string;\n price: bigint;\n paymentToken: string;\n duration: number;\n perks: string[];\n maxSubscribers?: number;\n nftBadge: boolean;\n}\n\nexport interface Subscription {\n subscriptionId: string;\n planId: string;\n creator: string;\n subscriber: string;\n startTime: number;\n endTime: number;\n autoRenew: boolean;\n status: 'active' | 'expired' | 'cancelled';\n}\n\n// Payout Types\nexport interface EarningsBreakdown {\n tips: bigint;\n subscriptions: bigint;\n nftSales: bigint;\n royalties: bigint;\n total: bigint;\n}\n\nexport interface EarningsBreakdownFormatted {\n tips: string;\n subscriptions: string;\n nftSales: string;\n royalties: string;\n total?: string;\n}\n\nexport interface EarningsPercentages {\n tips: string;\n subscriptions: string;\n nftSales: string;\n royalties: string;\n}\n\nexport interface PayoutRecord {\n id: string;\n amount: string;\n txHash: string;\n createdAt: string;\n status?: string;\n confirmedAt?: string;\n}\n\nexport interface EarningsResponse {\n address: string;\n pendingEarnings: string;\n totalEarnings: string;\n earningsBreakdown: EarningsBreakdownFormatted;\n recentPayouts: PayoutRecord[];\n}\n\nexport interface PayoutHistoryResponse {\n payouts: PayoutRecord[];\n pagination: {\n page: number;\n limit: number;\n total: number;\n pages: number;\n };\n}\n\nexport interface BreakdownResponse {\n breakdown: EarningsBreakdownFormatted & { total: string };\n percentages: EarningsPercentages;\n}\n\nexport interface PlatformFeeResponse {\n feeBps: number;\n feePercent: string;\n}\n\nexport interface ClaimResult {\n success: boolean;\n transactionHash: string;\n amount: string;\n message: string;\n}\n\nexport interface RevenueSplit {\n recipient: string;\n basisPoints: number;\n}\n\n// Swap Types\nexport interface SwapQuote {\n tokenIn: string;\n tokenOut: string;\n amountIn: bigint;\n amountOut: bigint;\n priceImpact: number;\n route: string[];\n estimatedGas: bigint;\n}\n\nexport interface SwapParams {\n tokenIn: string;\n tokenOut: string;\n amountIn: bigint;\n minAmountOut: bigint;\n deadline: number;\n}\n\n// Error Types\nexport type ZubariErrorCode =\n | 'TX_FAILED'\n | 'AUTH_EXPIRED'\n | 'RPC_ERROR'\n | 'VOUCHER_EXPIRED'\n | 'SLIPPAGE_ERROR'\n | 'RATE_LIMITED'\n | 'UPLOAD_ERROR'\n | 'INSUFFICIENT_FUNDS'\n | 'INVALID_SIGNATURE'\n | 'UNSUPPORTED_NETWORK'\n | 'UNKNOWN_ERROR';\n\nexport class ZubariError extends Error {\n constructor(\n public readonly code: ZubariErrorCode,\n message: string,\n public readonly details?: unknown\n ) {\n super(message);\n this.name = 'ZubariError';\n }\n}\n","/**\n * React hooks for WalletManager\n *\n * These hooks provide a React-friendly interface to the WalletManager class.\n * They handle state management, loading states, and error handling.\n */\n\nimport { useState, useCallback, useEffect, useMemo } from 'react';\nimport {\n WalletManager,\n SUPPORTED_CHAINS,\n type WalletState,\n type WalletManagerConfig,\n type ChainBalance,\n type MultiChainAddresses,\n} from '../wallet';\nimport type { NetworkType } from '../types';\n\nexport interface UseWalletManagerOptions extends WalletManagerConfig {\n autoCheckWallet?: boolean;\n}\n\n/** Transaction result from sendTransaction */\nexport interface SendTransactionResult {\n success: boolean;\n txHash?: string;\n from?: string;\n to?: string;\n amount?: string;\n chain?: NetworkType;\n error?: string;\n}\n\n/** Fee estimation result */\nexport interface FeeEstimateResult {\n success: boolean;\n fee?: string;\n feeUsd?: number;\n error?: string;\n}\n\nexport interface UseWalletManagerReturn {\n // State\n state: WalletState;\n isLoading: boolean;\n error: string | null;\n\n // Basic Actions\n createWallet: (password: string) => Promise<{ seed: string; address: string }>;\n importWallet: (seed: string, password: string) => Promise<void>;\n unlock: (password: string) => Promise<void>;\n lock: () => void;\n deleteWallet: () => Promise<void>;\n fetchBalance: () => Promise<string>;\n\n // Multi-chain Actions\n selectedChain: NetworkType;\n setSelectedChain: (chain: NetworkType) => void;\n chainBalances: ChainBalance[];\n fetchAllBalances: () => Promise<ChainBalance[]>;\n getAddressForChain: (chain: NetworkType) => string | null;\n getAllAddresses: () => Partial<MultiChainAddresses>;\n supportedChains: NetworkType[];\n\n // Transaction Actions (Powered by Tether WDK)\n sendTransaction: (chain: NetworkType, to: string, amount: string, token?: string) => Promise<SendTransactionResult>;\n estimateFee: (chain: NetworkType, to: string, amount: string, token?: string) => Promise<FeeEstimateResult>;\n\n // Utilities\n hasWallet: () => Promise<boolean>;\n getSeed: () => string | null;\n manager: WalletManager;\n}\n\n/**\n * React hook for managing a WDK wallet with multi-chain support\n */\nexport function useWalletManager(\n options: UseWalletManagerOptions = {}\n): UseWalletManagerReturn {\n const { autoCheckWallet = true, ...config } = options;\n\n // Create manager instance (memoized)\n const manager = useMemo(() => new WalletManager(config), [\n config.network,\n config.rpcUrl,\n ]);\n\n // State\n const [state, setState] = useState<WalletState>({\n isInitialized: false,\n isLocked: true,\n address: null,\n balance: null,\n });\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [selectedChain, setSelectedChainState] = useState<NetworkType>('ethereum');\n const [chainBalances, setChainBalances] = useState<ChainBalance[]>([]);\n\n // Update state from manager\n const updateState = useCallback(() => {\n setState(manager.getExtendedState());\n }, [manager]);\n\n // Check if wallet exists on mount\n useEffect(() => {\n if (autoCheckWallet) {\n manager.hasWallet().then((exists) => {\n if (exists) {\n setState((prev) => ({\n ...prev,\n isInitialized: true,\n isLocked: true,\n }));\n }\n });\n }\n }, [manager, autoCheckWallet]);\n\n // Create new wallet\n const createWallet = useCallback(\n async (password: string) => {\n setIsLoading(true);\n setError(null);\n try {\n // Initialize storage for web\n await manager.initializeStorage(password);\n const result = await manager.createWallet(password);\n // Derive addresses for all chains using Tether WDK (async)\n // Falls back to sync derivation if WDK is not available\n try {\n await manager.deriveAllAddressesAsync();\n } catch {\n manager.deriveAllAddresses();\n }\n updateState();\n // Fetch balances for all chains after create\n try {\n const balances = await manager.fetchAllBalances();\n setChainBalances(balances);\n } catch (err) {\n console.warn('Failed to fetch balances after create:', err);\n }\n return result;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to create wallet';\n setError(message);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [manager, updateState]\n );\n\n // Import existing wallet\n const importWallet = useCallback(\n async (seed: string, password: string) => {\n setIsLoading(true);\n setError(null);\n try {\n await manager.initializeStorage(password);\n await manager.importWallet(seed, password);\n // Derive addresses for all chains using Tether WDK (async)\n try {\n await manager.deriveAllAddressesAsync();\n } catch {\n manager.deriveAllAddresses();\n }\n updateState();\n // Fetch balances for all chains after import\n try {\n const balances = await manager.fetchAllBalances();\n setChainBalances(balances);\n } catch (err) {\n console.warn('Failed to fetch balances after import:', err);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to import wallet';\n setError(message);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [manager, updateState]\n );\n\n // Unlock wallet\n const unlock = useCallback(\n async (password: string) => {\n setIsLoading(true);\n setError(null);\n try {\n await manager.initializeStorage(password);\n await manager.unlock(password);\n // Derive addresses for all chains using Tether WDK (async)\n try {\n await manager.deriveAllAddressesAsync();\n } catch {\n manager.deriveAllAddresses();\n }\n updateState();\n // Fetch balances for all chains after unlock\n try {\n const balances = await manager.fetchAllBalances();\n setChainBalances(balances);\n } catch (err) {\n console.warn('Failed to fetch balances after unlock:', err);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Invalid password';\n setError(message);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [manager, updateState]\n );\n\n // Lock wallet\n const lock = useCallback(() => {\n manager.lock();\n setChainBalances([]);\n updateState();\n }, [manager, updateState]);\n\n // Delete wallet\n const deleteWallet = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n await manager.deleteWallet();\n setChainBalances([]);\n setState({\n isInitialized: false,\n isLocked: true,\n address: null,\n balance: null,\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to delete wallet';\n setError(message);\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, [manager]);\n\n // Fetch balance (for selected chain)\n const fetchBalance = useCallback(async () => {\n setIsLoading(true);\n // Don't clear error here - balance fetch errors shouldn't clear previous errors\n try {\n const balance = await manager.fetchBalance();\n setState((prev) => ({ ...prev, balance }));\n return balance;\n } catch (err) {\n // Log warning but don't throw - balance fetch errors shouldn't block UI\n console.warn('Failed to fetch balance:', err);\n // Return '0' instead of throwing to not block wallet operations\n setState((prev) => ({ ...prev, balance: '0' }));\n return '0';\n } finally {\n setIsLoading(false);\n }\n }, [manager]);\n\n // Fetch all chain balances\n const fetchAllBalances = useCallback(async () => {\n setIsLoading(true);\n // Don't clear error here - balance fetch errors shouldn't clear previous errors\n try {\n const balances = await manager.fetchAllBalances();\n setChainBalances(balances);\n return balances;\n } catch (err) {\n // Log warning but don't throw - balance fetch errors shouldn't block UI\n console.warn('Failed to fetch all balances:', err);\n // Return empty array instead of throwing\n return [];\n } finally {\n setIsLoading(false);\n }\n }, [manager]);\n\n // Set selected chain\n const setSelectedChain = useCallback((chain: NetworkType) => {\n manager.setSelectedChain(chain);\n setSelectedChainState(chain);\n }, [manager]);\n\n // Get address for chain\n const getAddressForChain = useCallback(\n (chain: NetworkType) => manager.getAddressForChain(chain),\n [manager]\n );\n\n // Get all addresses\n const getAllAddresses = useCallback(\n () => manager.getAllAddresses(),\n [manager]\n );\n\n // Check if wallet exists\n const hasWallet = useCallback(() => manager.hasWallet(), [manager]);\n\n // Get seed (only if unlocked)\n const getSeed = useCallback(() => manager.getSeed(), [manager]);\n\n // Send transaction using Tether WDK\n const sendTransaction = useCallback(\n async (chain: NetworkType, to: string, amount: string, token?: string) => {\n setIsLoading(true);\n try {\n const result = await manager.sendTransaction(chain, to, amount, token);\n // Refresh balances after successful transaction\n if (result.success) {\n try {\n const balances = await manager.fetchAllBalances();\n setChainBalances(balances);\n } catch (err) {\n console.warn('Failed to refresh balances after transaction:', err);\n }\n }\n return result;\n } finally {\n setIsLoading(false);\n }\n },\n [manager]\n );\n\n // Estimate transaction fee using Tether WDK\n const estimateFee = useCallback(\n async (chain: NetworkType, to: string, amount: string, token?: string) => {\n return manager.estimateFee(chain, to, amount, token);\n },\n [manager]\n );\n\n return {\n state,\n isLoading,\n error,\n createWallet,\n importWallet,\n unlock,\n lock,\n deleteWallet,\n fetchBalance,\n // Multi-chain\n selectedChain,\n setSelectedChain,\n chainBalances,\n fetchAllBalances,\n getAddressForChain,\n getAllAddresses,\n supportedChains: SUPPORTED_CHAINS,\n // Transaction Actions (Powered by Tether WDK)\n sendTransaction,\n estimateFee,\n // Utilities\n hasWallet,\n getSeed,\n manager,\n };\n}\n","/**\n * Utility functions for wallet operations\n */\n\n/**\n * Format address for display (truncate middle)\n */\nexport function formatAddress(address: string, chars: number = 4): string {\n if (!address || address.length < 10) return address;\n return `${address.slice(0, chars + 2)}...${address.slice(-chars)}`;\n}\n\n/**\n * Format balance for display\n */\nexport function formatBalance(\n balance: bigint,\n decimals: number = 18,\n precision: number = 4\n): string {\n const divisor = BigInt(10 ** decimals);\n const integerPart = balance / divisor;\n const fractionalPart = balance % divisor;\n\n const fractionalStr = fractionalPart\n .toString()\n .padStart(decimals, '0')\n .slice(0, precision);\n\n return `${integerPart}.${fractionalStr}`;\n}\n\n/**\n * Check if string is a valid Ethereum address\n */\nexport function isValidAddress(address: string): boolean {\n return /^0x[a-fA-F0-9]{40}$/.test(address);\n}\n\n/**\n * Normalize an Ethereum address to checksum format\n */\nexport function normalizeAddress(address: string): string {\n if (!isValidAddress(address)) {\n throw new Error('Invalid Ethereum address');\n }\n return address.toLowerCase();\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config/networks.ts","../src/config/contracts.ts","../src/services/WdkApiClient.ts","../src/services/BrowserAddressDerivation.ts","../src/services/ZubariWdkService.ts","../src/wallet/ZubariWallet.ts","../src/security/KeyManager.ts","../src/storage/SecureStorage.ts","../src/wallet/WalletManager.ts","../src/services/ZubariApiClient.ts","../src/protocols/NFTProtocol.ts","../src/abi/ZubariMarket.json","../src/protocols/MarketProtocol.ts","../src/abi/ZubariTips.json","../src/protocols/TipsProtocol.ts","../src/abi/ZubariSubscription.json","../src/protocols/SubscriptionProtocol.ts","../src/protocols/PayoutsProtocol.ts","../src/services/SwapService.ts","../src/services/TransactionService.ts","../src/types/index.ts","../src/react/useWalletManager.ts","../src/utils/index.ts"],"names":["DERIVATION_PATHS","DEFAULT_API_URL","HDNodeWallet","viemFormatEther","wdkService","result","COINGECKO_IDS","priceCache","PRICE_CACHE_TTL","fetchPrices","getPriceForChain","dynamicImport"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { NetworkType } from '../types';\n\nexport interface NetworkConfig {\n name: string;\n chainId: number;\n coinType: number; // BIP-44 coin type\n rpcUrl: string;\n explorerUrl: string;\n nativeCurrency: {\n name: string;\n symbol: string;\n decimals: number;\n };\n isEvm: boolean;\n}\n\nexport const NETWORKS: Record<NetworkType, NetworkConfig> = {\n bitcoin: {\n name: 'Bitcoin',\n chainId: 0,\n coinType: 0, // m/44'/0'\n rpcUrl: 'https://blockstream.info/api',\n explorerUrl: 'https://blockstream.info',\n nativeCurrency: {\n name: 'Bitcoin',\n symbol: 'BTC',\n decimals: 8,\n },\n isEvm: false,\n },\n ethereum: {\n name: 'Ethereum',\n chainId: 1,\n coinType: 60, // m/44'/60'\n rpcUrl: 'https://eth.llamarpc.com',\n explorerUrl: 'https://etherscan.io',\n nativeCurrency: {\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n isEvm: true,\n },\n ton: {\n name: 'TON',\n chainId: -239,\n coinType: 607, // m/44'/607'\n rpcUrl: 'https://toncenter.com/api/v2',\n explorerUrl: 'https://tonscan.org',\n nativeCurrency: {\n name: 'Toncoin',\n symbol: 'TON',\n decimals: 9,\n },\n isEvm: false,\n },\n tron: {\n name: 'TRON',\n chainId: 728126428,\n coinType: 195, // m/44'/195'\n rpcUrl: 'https://api.trongrid.io',\n explorerUrl: 'https://tronscan.org',\n nativeCurrency: {\n name: 'TRON',\n symbol: 'TRX',\n decimals: 6,\n },\n isEvm: false,\n },\n solana: {\n name: 'Solana',\n chainId: 0,\n coinType: 501, // m/44'/501'\n rpcUrl: 'https://api.mainnet-beta.solana.com',\n explorerUrl: 'https://solscan.io',\n nativeCurrency: {\n name: 'Solana',\n symbol: 'SOL',\n decimals: 9,\n },\n isEvm: false,\n },\n spark: {\n name: 'Spark (Lightning)',\n chainId: 0,\n coinType: 998, // m/44'/998'\n rpcUrl: '',\n explorerUrl: '',\n nativeCurrency: {\n name: 'Bitcoin',\n symbol: 'BTC',\n decimals: 8,\n },\n isEvm: false,\n },\n};\n\nexport const TESTNET_NETWORKS: Partial<Record<NetworkType, Partial<NetworkConfig>>> = {\n bitcoin: {\n name: 'Bitcoin Testnet',\n rpcUrl: 'https://blockstream.info/testnet/api',\n explorerUrl: 'https://mempool.space/testnet',\n },\n ethereum: {\n name: 'Sepolia',\n chainId: 11155111,\n // Using eth-sepolia.g.alchemy.com public endpoint (more reliable than rpc.sepolia.org)\n // Fallback order: 1. Alchemy public, 2. Infura public, 3. BlockPi\n rpcUrl: 'https://ethereum-sepolia-rpc.publicnode.com',\n explorerUrl: 'https://sepolia.etherscan.io',\n },\n solana: {\n name: 'Solana Devnet',\n rpcUrl: 'https://api.devnet.solana.com',\n explorerUrl: 'https://solscan.io?cluster=devnet',\n },\n};\n\n// BIP-44 derivation paths\nexport const DERIVATION_PATHS: Record<NetworkType, string> = {\n bitcoin: \"m/44'/0'/0'/0\",\n ethereum: \"m/44'/60'/0'/0\",\n ton: \"m/44'/607'/0'/0\",\n tron: \"m/44'/195'/0'/0\",\n solana: \"m/44'/501'/0'/0\",\n spark: \"m/44'/998'/0'/0\",\n};\n\nexport function getNetworkConfig(\n network: NetworkType,\n isTestnet: boolean = false\n): NetworkConfig {\n const mainnetConfig = NETWORKS[network];\n if (!isTestnet) return mainnetConfig;\n\n const testnetOverrides = TESTNET_NETWORKS[network];\n if (!testnetOverrides) return mainnetConfig;\n\n return {\n ...mainnetConfig,\n ...testnetOverrides,\n };\n}\n","// Contract addresses for Zubari ecosystem\nexport interface ContractAddresses {\n registry: string;\n nft: string;\n nft1155: string; // ERC-1155 multi-edition NFT\n marketplace: string;\n tips: string;\n subscriptions: string;\n payouts: string;\n entryPoint: string;\n paymaster: string;\n accountFactory: string;\n usdt: string;\n weth: string;\n}\n\n// Zero address for ETH payments and placeholder addresses\nexport const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nexport const ZUBARI_CONTRACTS: Record<'testnet' | 'mainnet', ContractAddresses> = {\n testnet: {\n // Ethereum Sepolia (11155111) - Deployed 2024-12-31\n registry: '0xe5CE1Eb986f58BE42EEDFe5C18ee5956803b2BDC',\n nft: '0xc165b8C6843e8f0B1489525D0f853d23f22c677B', // ZubariNFT ERC-721 with payment\n nft1155: '0x5e618B5bEaE1dc41369E7aa235Cc3b9245905192', // Zubari1155 ERC-1155 multi-edition\n marketplace: '0xfcEfDa6C73aC357b8695E5F8F8d17820750BF207',\n tips: '0x86a9A306C7fCC9e0B8cd6859f6f15498d0046BB7',\n subscriptions: '0xaB7F17A85F61d9ab9f96bCB4e73e910D019978F7',\n payouts: '0x8aaB23Fb2a83A259E965Aae8Ee0938b1400B7E6b',\n entryPoint: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n paymaster: ZERO_ADDRESS, // Deploy with: npx hardhat run deploy/deploy.ts --network ethereum-sepolia\n accountFactory: ZERO_ADDRESS, // Not yet deployed\n usdt: '0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0', // USDT on Sepolia\n weth: '0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14',\n },\n mainnet: {\n // Ethereum Mainnet (1)\n registry: ZERO_ADDRESS,\n nft: ZERO_ADDRESS,\n nft1155: ZERO_ADDRESS,\n marketplace: ZERO_ADDRESS,\n tips: ZERO_ADDRESS,\n subscriptions: ZERO_ADDRESS,\n payouts: ZERO_ADDRESS,\n entryPoint: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n paymaster: ZERO_ADDRESS,\n accountFactory: ZERO_ADDRESS,\n usdt: '0xdAC17F958D2ee523a2206206994597C13D831ec7', // USDT on Ethereum\n weth: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n },\n};\n\n// Platform configuration\nexport const PLATFORM_CONFIG = {\n // Platform fee in basis points (300 = 3%)\n tipFeeBps: 300,\n // Maximum royalty in basis points (1000 = 10%)\n maxRoyaltyBps: 1000,\n // Default slippage tolerance for swaps (50 = 0.5%)\n defaultSlippageBps: 50,\n // Voucher validity in seconds (30 days)\n voucherValiditySecs: 30 * 24 * 60 * 60,\n // Swap deadline in seconds (30 minutes)\n swapDeadlineSecs: 30 * 60,\n} as const;\n\n// EIP-712 Domain for lazy minting\nexport const NFT_VOUCHER_DOMAIN = {\n name: 'ZubariNFT',\n version: '1',\n} as const;\n\nexport const NFT_VOUCHER_TYPES = {\n NFTVoucher: [\n { name: 'tokenId', type: 'bytes32' },\n { name: 'uri', type: 'string' },\n { name: 'creator', type: 'address' },\n { name: 'royaltyBps', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n // Pricing fields\n { name: 'price', type: 'uint256' },\n { name: 'currency', type: 'address' },\n { name: 'nonce', type: 'uint256' },\n // Watermarking fields\n { name: 'contentHash', type: 'bytes32' },\n { name: 'userId', type: 'bytes32' },\n { name: 'watermarkTimestamp', type: 'uint256' },\n { name: 'sessionId', type: 'bytes32' },\n ],\n} as const;\n\n// 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: '0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0', // USDT on Sepolia\n },\n mainnet: {\n ETH: ZERO_ADDRESS,\n USDT: '0xdAC17F958D2ee523a2206206994597C13D831ec7', // USDT on Ethereum\n },\n} as const;\n\nexport function getContractAddresses(network: 'testnet' | 'mainnet'): ContractAddresses {\n return ZUBARI_CONTRACTS[network];\n}\n\n// Multi-chain Fee/Treasury Wallet Addresses\n// These wallets receive platform fees from transactions on their respective chains\nexport interface FeeWalletConfig {\n address: string;\n name: string;\n network: string;\n chainId?: number;\n}\n\nexport type SupportedFeeChain = 'ETH' | 'BTC' | 'SOLANA' | 'TON' | 'TRON';\n\n/**\n * Mainnet Fee Wallet Addresses\n * These are the production treasury wallets for collecting platform fees\n */\nexport const MAINNET_FEE_WALLETS: Record<SupportedFeeChain, FeeWalletConfig> = {\n // Ethereum (ETH, ERC-20 tokens like USDT)\n ETH: {\n address: '0x40Df60a57d02a7bB04B6624c65E2908Cc006badE',\n name: 'Zubari ETH Treasury',\n network: 'ethereum',\n chainId: 1,\n },\n // Bitcoin\n BTC: {\n address: 'bc1qh20fx23wk34pcm3zp0v9wctwprtl02uvh6q9qj',\n name: 'Zubari BTC Treasury',\n network: 'bitcoin',\n },\n // Solana (SOL, SPL tokens)\n SOLANA: {\n address: '2hXGumVRpD5KgdqNZUuYJ2YoyLR6jc8mvWbubciWjPuZ',\n name: 'Zubari Solana Treasury',\n network: 'solana',\n },\n // TON (The Open Network)\n TON: {\n address: 'UQB5hOrm9YGoKjrCVmvAUFgmApkvKWqVMROjieKs3z4kDz99',\n name: 'Zubari TON Treasury',\n network: 'ton',\n },\n // Tron (TRX, TRC-20 tokens like USDT)\n TRON: {\n address: 'TVBPjQFNe8JgVctDKWMxJNgjbPZoP6uu5h',\n name: 'Zubari Tron Treasury',\n network: 'tron',\n },\n} as const;\n\n/**\n * Testnet Fee Wallet Addresses\n * These are used for development and testing\n */\nexport const TESTNET_FEE_WALLETS: Record<SupportedFeeChain, FeeWalletConfig> = {\n // Ethereum Sepolia\n ETH: {\n address: ZERO_ADDRESS, // Configure via environment\n name: 'Zubari ETH Testnet Treasury',\n network: 'sepolia',\n chainId: 11155111,\n },\n // Bitcoin Testnet\n BTC: {\n address: '',\n name: 'Zubari BTC Testnet Treasury',\n network: 'bitcoin-testnet',\n },\n // Solana Devnet\n SOLANA: {\n address: '',\n name: 'Zubari Solana Devnet Treasury',\n network: 'solana-devnet',\n },\n // TON Testnet\n TON: {\n address: '',\n name: 'Zubari TON Testnet Treasury',\n network: 'ton-testnet',\n },\n // Tron Shasta Testnet\n TRON: {\n address: '',\n name: 'Zubari Tron Testnet Treasury',\n network: 'tron-shasta',\n },\n} as const;\n\n/**\n * Get fee wallet address for a specific chain\n * @param chain - The blockchain network\n * @param isMainnet - Whether to use mainnet addresses (default: false for testnet)\n */\nexport function getFeeWallet(chain: SupportedFeeChain, isMainnet: boolean = false): FeeWalletConfig {\n return isMainnet ? MAINNET_FEE_WALLETS[chain] : TESTNET_FEE_WALLETS[chain];\n}\n\n/**\n * Get all fee wallets for a network type\n * @param isMainnet - Whether to use mainnet addresses\n */\nexport function getAllFeeWallets(isMainnet: boolean = false): Record<SupportedFeeChain, FeeWalletConfig> {\n return isMainnet ? MAINNET_FEE_WALLETS : TESTNET_FEE_WALLETS;\n}\n","/**\n * WDK API Client\n *\n * Client for calling the backend WDK endpoints to derive addresses\n * using Tether WDK (which runs server-side in Node.js).\n */\n\nimport type { NetworkType } from '../types';\n\nexport interface WdkApiConfig {\n baseUrl: string;\n timeout?: number;\n}\n\nexport interface DeriveAddressResponse {\n success: boolean;\n address?: string;\n chain?: string;\n path?: string;\n network?: string;\n error?: string;\n}\n\nexport interface DeriveAllAddressesResponse {\n success: boolean;\n addresses?: {\n ethereum: string | null;\n bitcoin: string | null;\n ton: string | null;\n tron: string | null;\n solana: string | null;\n spark: string | null;\n };\n network?: string;\n error?: string;\n}\n\nexport interface ValidateSeedResponse {\n success: boolean;\n isValid?: boolean;\n wordCount?: number;\n error?: string;\n}\n\nexport interface GenerateSeedResponse {\n success: boolean;\n seed?: string;\n wordCount?: number;\n error?: string;\n}\n\nexport interface TransactionHistoryItem {\n hash: string;\n from: string;\n to: string;\n value: string;\n timestamp: number;\n status: 'confirmed' | 'pending' | 'failed';\n blockNumber?: number;\n}\n\nexport interface TransactionHistoryResponse {\n success: boolean;\n address?: string;\n transactions?: TransactionHistoryItem[];\n chain?: string;\n network?: string;\n error?: string;\n}\n\nexport interface SendTransactionResponse {\n success: boolean;\n txHash?: string;\n from?: string;\n to?: string;\n amount?: string;\n chain?: string;\n network?: string;\n error?: string;\n}\n\nexport interface TransactionStatusResponse {\n success: boolean;\n hash?: string;\n status?: 'confirmed' | 'pending' | 'failed';\n blockNumber?: number;\n confirmations?: number;\n timestamp?: number;\n from?: string;\n to?: string;\n value?: string;\n fee?: string;\n chain?: string;\n network?: string;\n error?: string;\n}\n\n/**\n * WDK API Client for server-side Tether WDK integration\n */\nexport class WdkApiClient {\n private config: Required<WdkApiConfig>;\n\n constructor(config: WdkApiConfig) {\n this.config = {\n baseUrl: config.baseUrl,\n timeout: config.timeout || 30000,\n };\n }\n\n /**\n * Generate a new BIP-39 seed phrase using Tether WDK\n */\n async generateSeed(): Promise<GenerateSeedResponse> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/generate-seed`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n return await response.json();\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to generate seed',\n };\n }\n }\n\n /**\n * Validate a BIP-39 seed phrase\n */\n async validateSeed(seed: string): Promise<ValidateSeedResponse> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/validate-seed`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ seed }),\n });\n\n return await response.json();\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to validate seed',\n };\n }\n }\n\n /**\n * Derive address for a specific chain using Tether WDK\n */\n async deriveAddress(\n seed: string,\n chain: NetworkType,\n network: 'mainnet' | 'testnet' = 'testnet'\n ): Promise<DeriveAddressResponse> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/derive-address`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ seed, chain, network }),\n });\n\n return await response.json();\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to derive address',\n };\n }\n }\n\n /**\n * Derive addresses for all chains using Tether WDK\n */\n async deriveAllAddresses(\n seed: string,\n network: 'mainnet' | 'testnet' = 'testnet'\n ): Promise<DeriveAllAddressesResponse> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/derive-all`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ seed, network }),\n });\n\n return await response.json();\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to derive addresses',\n };\n }\n }\n\n /**\n * Send a transaction on a specific chain using Tether WDK\n */\n async sendTransaction(\n seed: string,\n chain: NetworkType,\n to: string,\n amount: string,\n network: 'mainnet' | 'testnet' = 'testnet'\n ): Promise<SendTransactionResponse> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/send`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ seed, chain, to, amount, network }),\n });\n\n return await response.json();\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to send transaction',\n };\n }\n }\n\n /**\n * Get transaction history for an address on a specific chain\n * Fetches from blockchain explorers (Etherscan, mempool.space, etc.)\n */\n async getTransactionHistory(\n seed: string,\n chain: NetworkType,\n network: 'mainnet' | 'testnet' = 'testnet',\n limit: number = 10\n ): Promise<TransactionHistoryResponse> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/history`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ seed, chain, network, limit }),\n });\n\n return await response.json();\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get transaction history',\n };\n }\n }\n\n /**\n * Get transaction status by hash\n * Fetches from blockchain explorers to check confirmation status\n */\n async getTransactionStatus(\n txHash: string,\n chain: NetworkType,\n network: 'mainnet' | 'testnet' = 'testnet'\n ): Promise<TransactionStatusResponse> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/tx-status`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ txHash, chain, network }),\n });\n\n return await response.json();\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get transaction status',\n };\n }\n }\n}\n\n// Default API URL (can be overridden)\n// Uses the Zubari production API which has Tether WDK integrated\nconst DEFAULT_API_URL = process.env.NEXT_PUBLIC_API_URL || 'https://ckgwifsxka.us-east-2.awsapprunner.com';\n\n// Singleton instance\nlet wdkApiClient: WdkApiClient | null = null;\n\n/**\n * Get or create the WDK API client instance\n */\nexport function getWdkApiClient(baseUrl?: string): WdkApiClient {\n if (!wdkApiClient || (baseUrl && wdkApiClient['config'].baseUrl !== baseUrl)) {\n wdkApiClient = new WdkApiClient({\n baseUrl: baseUrl || DEFAULT_API_URL,\n });\n }\n return wdkApiClient;\n}\n","/**\n * Browser-Compatible Address Derivation\n *\n * This module provides multi-chain address derivation that works in browser environments.\n * It uses the @scure libraries which are pure JS and don't require Node.js polyfills.\n *\n * Supported chains:\n * - Ethereum: ethers.js (BIP-44)\n * - Bitcoin: @scure/bip32 + @scure/base (BIP-84 native SegWit)\n * - Solana: ed25519-hd-key + tweetnacl (SLIP-0010)\n * - TON: ed25519 derivation with TON address format\n * - TRON: secp256k1 + base58check\n * - Spark: Bitcoin-based with custom derivation\n */\n\nimport { HDNodeWallet, keccak256, getBytes, sha256 as ethSha256 } from 'ethers';\nimport { mnemonicToSeedSync, validateMnemonic, generateMnemonic } from '@scure/bip39';\nimport { wordlist } from '@scure/bip39/wordlists/english';\nimport { HDKey } from '@scure/bip32';\nimport { bech32, base58check } from '@scure/base';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { ripemd160 } from '@noble/hashes/ripemd160';\nimport type { NetworkType } from '../types';\n\nexport interface ChainAddress {\n chain: NetworkType;\n address: string;\n path: string;\n}\n\nexport interface BrowserMultiChainAddresses {\n ethereum: string | null;\n bitcoin: string | null;\n ton: string | null;\n tron: string | null;\n solana: string | null;\n spark: string | null;\n}\n\n// BIP-44/84 derivation paths\nconst DERIVATION_PATHS = {\n ethereum: \"m/44'/60'/0'/0/0\",\n bitcoin_mainnet: \"m/84'/0'/0'/0/0\",\n bitcoin_testnet: \"m/84'/1'/0'/0/0\",\n ton: \"m/44'/607'/0'/0'/0'\",\n tron: \"m/44'/195'/0'/0/0\",\n solana: \"m/44'/501'/0'/0'\",\n spark: \"m/44'/998'/0'/0/0\",\n};\n\n/**\n * Derive Ethereum address from seed phrase\n */\nexport function deriveEthereumAddress(seed: string): string {\n const hdNode = HDNodeWallet.fromPhrase(seed, undefined, DERIVATION_PATHS.ethereum);\n return hdNode.address;\n}\n\n/**\n * Derive Bitcoin address from seed phrase (BIP-84 native SegWit)\n * Uses @scure libraries for browser compatibility\n */\nexport function deriveBitcoinAddress(\n seed: string,\n network: 'mainnet' | 'testnet' = 'testnet'\n): string {\n try {\n // Convert mnemonic to seed using @scure/bip39\n const seedBytes = mnemonicToSeedSync(seed);\n\n // Derive HD key using @scure/bip32\n const hdKey = HDKey.fromMasterSeed(seedBytes);\n const path = network === 'testnet' ? DERIVATION_PATHS.bitcoin_testnet : DERIVATION_PATHS.bitcoin_mainnet;\n const child = hdKey.derive(path);\n\n if (!child.publicKey) {\n throw new Error('Failed to derive public key');\n }\n\n // Create P2WPKH address (native SegWit)\n // 1. Hash160 = RIPEMD160(SHA256(publicKey))\n const pubKeyHash = ripemd160(sha256(child.publicKey));\n\n // 2. Create witness program: version (0x00) + hash160\n // For bech32, we encode: witness version (0) + pubKeyHash as 5-bit words\n const witnessVersion = 0;\n const words = bech32.toWords(pubKeyHash);\n words.unshift(witnessVersion); // Prepend witness version\n\n // 3. Encode with bech32\n const hrp = network === 'testnet' ? 'tb' : 'bc';\n const address = bech32.encode(hrp, words);\n\n return address;\n } catch (error) {\n console.error('Bitcoin address derivation failed:', error);\n throw error;\n }\n}\n\n/**\n * Derive Solana address from seed phrase using SLIP-0010 (ed25519)\n */\nexport async function deriveSolanaAddress(seed: string): Promise<string> {\n try {\n const [ed25519, nacl, bs58Module] = await Promise.all([\n import('ed25519-hd-key'),\n import('tweetnacl'),\n import('bs58'),\n ]);\n\n // bs58 v6 uses default export\n const bs58 = bs58Module.default || bs58Module;\n\n // Use @scure/bip39 for seed generation (browser compatible)\n const seedBytes = mnemonicToSeedSync(seed);\n\n // SLIP-0010 derivation for ed25519\n const derived = ed25519.derivePath(DERIVATION_PATHS.solana, Buffer.from(seedBytes).toString('hex'));\n\n // Create keypair from derived seed\n const keypair = nacl.sign.keyPair.fromSeed(new Uint8Array(derived.key));\n\n // Solana address is the base58-encoded public key (32 bytes)\n return bs58.encode(keypair.publicKey);\n } catch (error) {\n console.error('Solana address derivation failed:', error);\n throw error;\n }\n}\n\n/**\n * Derive TON address from seed phrase\n * Uses proper BIP-44 derivation path m/44'/607'/0'/0'/0'\n */\nexport async function deriveTonAddress(seed: string): Promise<string> {\n try {\n const [ed25519, nacl] = await Promise.all([\n import('ed25519-hd-key'),\n import('tweetnacl'),\n ]);\n\n // Use @scure/bip39 for seed generation (browser compatible)\n const seedBytes = mnemonicToSeedSync(seed);\n\n // Use SLIP-0010 derivation for ed25519 with TON's coin type\n const derived = ed25519.derivePath(DERIVATION_PATHS.ton, Buffer.from(seedBytes).toString('hex'));\n\n // Create keypair\n const keypair = nacl.sign.keyPair.fromSeed(new Uint8Array(derived.key));\n\n // TON address is derived from public key using workchain + hash\n // Standard TON wallet v4r2 uses the public key to derive address\n const publicKey = keypair.publicKey;\n\n // Create TON bounceable address (EQ prefix for workchain 0)\n // Format: 1 byte flags + 1 byte workchain + 32 bytes hash + 2 bytes CRC16\n const workchain = 0;\n const flags = 0x11; // bounceable\n\n // For raw address, we use SHA256 of public key using @noble/hashes\n const hash = sha256(publicKey);\n\n // Build address bytes: flags + workchain + hash\n const addressData = new Uint8Array(34);\n addressData[0] = flags;\n addressData[1] = workchain;\n addressData.set(hash, 2);\n\n // Calculate CRC16\n const crc = crc16(addressData);\n\n // Full address with CRC\n const fullAddress = new Uint8Array(36);\n fullAddress.set(addressData);\n fullAddress[34] = (crc >> 8) & 0xff;\n fullAddress[35] = crc & 0xff;\n\n // Convert to base64url (TON standard format)\n const base64 = btoa(String.fromCharCode(...fullAddress))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_');\n\n return base64;\n } catch (error) {\n console.error('TON address derivation failed:', error);\n throw error;\n }\n}\n\n/**\n * CRC16-CCITT for TON addresses\n */\nfunction crc16(data: Uint8Array): number {\n let crc = 0;\n for (const byte of data) {\n crc ^= byte << 8;\n for (let i = 0; i < 8; i++) {\n crc = (crc & 0x8000) ? ((crc << 1) ^ 0x1021) : (crc << 1);\n crc &= 0xffff;\n }\n }\n return crc;\n}\n\n/**\n * Derive TRON address from seed phrase\n * TRON uses secp256k1 like Ethereum but with base58check encoding\n * Uses @scure/base for browser compatibility\n */\nexport function deriveTronAddress(seed: string): string {\n try {\n // Derive using TRON's BIP-44 path\n const hdNode = HDNodeWallet.fromPhrase(seed, undefined, DERIVATION_PATHS.tron);\n\n // Get the Ethereum-style address (last 20 bytes of keccak256 of public key)\n // TRON uses same derivation but different encoding\n const ethAddressHex = hdNode.address.slice(2).toLowerCase();\n\n // TRON address: 0x41 prefix + 20 bytes address\n const addressBytes = new Uint8Array(21);\n addressBytes[0] = 0x41; // TRON mainnet prefix\n\n // Copy ETH address bytes\n for (let i = 0; i < 20; i++) {\n addressBytes[i + 1] = parseInt(ethAddressHex.slice(i * 2, i * 2 + 2), 16);\n }\n\n // Base58check encode using @scure/base (uses double SHA256 for checksum)\n const tronBase58check = base58check(sha256);\n return tronBase58check.encode(addressBytes);\n } catch (error) {\n console.error('TRON address derivation failed:', error);\n throw error;\n }\n}\n\n/**\n * Derive Spark address from seed phrase\n * Spark uses its own derivation path and bech32 format\n * Uses @scure libraries for browser compatibility\n */\nexport function deriveSparkAddress(\n seed: string,\n network: 'mainnet' | 'testnet' = 'testnet'\n): string {\n try {\n // Convert mnemonic to seed using @scure/bip39\n const seedBytes = mnemonicToSeedSync(seed);\n\n // Derive HD key using @scure/bip32\n const hdKey = HDKey.fromMasterSeed(seedBytes);\n const child = hdKey.derive(DERIVATION_PATHS.spark);\n\n if (!child.publicKey) {\n throw new Error('Failed to derive public key');\n }\n\n // Create P2WPKH-style address (same as Bitcoin but with Spark HRP)\n // 1. Hash160 = RIPEMD160(SHA256(publicKey))\n const pubKeyHash = ripemd160(sha256(child.publicKey));\n\n // 2. Create witness program with version 0\n const witnessVersion = 0;\n const words = bech32.toWords(pubKeyHash);\n words.unshift(witnessVersion);\n\n // 3. Encode with bech32 using Spark's HRP\n // Note: Spark uses 'sp' for mainnet and 'tsp' for testnet\n const hrp = network === 'testnet' ? 'tsp' : 'sp';\n const address = bech32.encode(hrp, words);\n\n return address;\n } catch (error) {\n console.error('Spark address derivation failed:', error);\n throw error;\n }\n}\n\n/**\n * Derive addresses for all supported chains\n */\nexport async function deriveAllAddresses(\n seed: string,\n network: 'mainnet' | 'testnet' = 'testnet'\n): Promise<BrowserMultiChainAddresses> {\n const addresses: BrowserMultiChainAddresses = {\n ethereum: null,\n bitcoin: null,\n ton: null,\n tron: null,\n solana: null,\n spark: null,\n };\n\n // Derive synchronous chains first (Ethereum, Bitcoin, Spark, TRON)\n try {\n addresses.ethereum = deriveEthereumAddress(seed);\n } catch (e) {\n console.error('ETH derivation failed:', e);\n }\n\n try {\n addresses.bitcoin = deriveBitcoinAddress(seed, network);\n } catch (e) {\n console.error('BTC derivation failed:', e);\n }\n\n try {\n addresses.spark = deriveSparkAddress(seed, network);\n } catch (e) {\n console.error('Spark derivation failed:', e);\n }\n\n try {\n addresses.tron = deriveTronAddress(seed);\n } catch (e) {\n console.error('TRON derivation failed:', e);\n }\n\n // Derive async chains in parallel (Solana, TON use ed25519 which requires async imports)\n const [solResult, tonResult] = await Promise.allSettled([\n deriveSolanaAddress(seed),\n deriveTonAddress(seed),\n ]);\n\n if (solResult.status === 'fulfilled') {\n addresses.solana = solResult.value;\n } else {\n console.error('SOL derivation failed:', solResult.reason);\n }\n\n if (tonResult.status === 'fulfilled') {\n addresses.ton = tonResult.value;\n } else {\n console.error('TON derivation failed:', tonResult.reason);\n }\n\n return addresses;\n}\n\n/**\n * Validate a BIP-39 seed phrase using @scure/bip39\n */\nexport function isValidSeed(seed: string): boolean {\n return validateMnemonic(seed, wordlist);\n}\n\n/**\n * Generate a random BIP-39 seed phrase using @scure/bip39\n */\nexport function generateSeedPhrase(): string {\n return generateMnemonic(wordlist);\n}\n","/**\n * Zubari WDK Service - Unified Multi-Chain Wallet Service\n *\n * This service provides a unified interface for multi-chain wallet operations\n * that works in both browser and Node.js environments.\n *\n * Strategy:\n * - Browser: Uses WdkApiClient to call the backend API (which has Tether WDK)\n * - Node.js: Uses WdkService natively (with Tether WDK modules)\n *\n * The Tether WDK (@tetherto/wdk-*) only works in Node.js environments due to\n * native dependencies (Electrum client, gRPC, etc.). For browser environments,\n * we route all operations through the backend API.\n *\n * @see https://docs.wallet.tether.io/\n */\n\nimport { WdkApiClient, getWdkApiClient } from './WdkApiClient';\nimport * as BrowserDerivation from './BrowserAddressDerivation';\nimport type { NetworkType } from '../types';\n\n// Default API URL for the Zubari backend with Tether WDK\nconst DEFAULT_API_URL = 'https://ckgwifsxka.us-east-2.awsapprunner.com';\n\nexport type SupportedChain = 'ethereum' | 'bitcoin' | 'ton' | 'tron' | 'solana' | 'spark';\n\nexport interface ChainAddress {\n chain: SupportedChain;\n address: string;\n path: string;\n}\n\nexport interface MultiChainAddresses {\n ethereum: string | null;\n bitcoin: string | null;\n ton: string | null;\n tron: string | null;\n solana: string | null;\n spark: string | null;\n}\n\nexport interface ChainBalance {\n chain: SupportedChain;\n address: string;\n balance: string;\n symbol: string;\n}\n\nexport interface FeeRates {\n slow: string;\n normal: string;\n fast: string;\n}\n\nexport interface TransactionResult {\n success: boolean;\n txHash?: string;\n from?: string;\n to?: string;\n amount?: string;\n chain?: string;\n network?: string;\n error?: string;\n}\n\nexport interface ZubariWdkServiceConfig {\n /** Network to use (mainnet or testnet) */\n network: 'mainnet' | 'testnet';\n /** API URL for the Zubari backend (required for browser environments) */\n apiUrl?: string;\n /** Force using API even in Node.js (useful for testing) */\n forceApi?: boolean;\n /** Request timeout in milliseconds */\n timeout?: number;\n}\n\n/**\n * Check if we're running in a browser environment\n */\nfunction isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof window.document !== 'undefined';\n}\n\n/**\n * Dynamic import helper that bypasses bundler analysis\n * This ensures the import is truly runtime and not analyzed at build time\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst dynamicImport = new Function('specifier', 'return import(specifier)') as (\n specifier: string\n) => Promise<any>;\n\n/**\n * Check if native WDK modules are available (Node.js only)\n */\nasync function canUseNativeWdk(): Promise<boolean> {\n // Never use native WDK in browser\n if (isBrowser()) {\n return false;\n }\n\n try {\n // Try to dynamically import WDK to check if it's available\n await dynamicImport('@tetherto/wdk');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * ZubariWdkService - Unified wallet service for browser and Node.js\n *\n * This service automatically routes operations to:\n * - API backend (browser) - using WdkApiClient\n * - Native WDK (Node.js) - using WdkService\n * - Browser derivation (fallback) - using BrowserAddressDerivation\n */\nexport class ZubariWdkService {\n private config: Required<ZubariWdkServiceConfig>;\n private apiClient: WdkApiClient;\n private nativeWdkService: unknown | null = null;\n private initialized = false;\n private useNativeWdk = false;\n\n constructor(config: Partial<ZubariWdkServiceConfig> = {}) {\n this.config = {\n network: config.network || 'testnet',\n apiUrl: config.apiUrl || process.env.NEXT_PUBLIC_API_URL || DEFAULT_API_URL,\n forceApi: config.forceApi ?? false,\n timeout: config.timeout || 30000,\n };\n\n this.apiClient = getWdkApiClient(this.config.apiUrl);\n }\n\n /**\n * Initialize the service and determine the best strategy\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // In browser or if forceApi is set, always use API\n if (isBrowser() || this.config.forceApi) {\n this.useNativeWdk = false;\n this.initialized = true;\n return;\n }\n\n // In Node.js, try to use native WDK\n if (await canUseNativeWdk()) {\n try {\n // Use dynamic import helper to bypass bundler analysis\n // This ensures WdkService is never included in browser bundles\n const WdkServiceModule = await dynamicImport('./WdkService');\n const WdkService = WdkServiceModule.WdkService || WdkServiceModule.default;\n this.nativeWdkService = new WdkService({\n network: this.config.network,\n });\n this.useNativeWdk = true;\n } catch (error) {\n console.warn('Failed to initialize native WDK, falling back to API:', error);\n this.useNativeWdk = false;\n }\n }\n\n this.initialized = true;\n }\n\n /**\n * Get the current execution mode\n */\n getMode(): 'api' | 'native' | 'browser-fallback' {\n if (this.useNativeWdk) return 'native';\n if (isBrowser()) return 'api';\n return 'api';\n }\n\n /**\n * Check if running in browser\n */\n isBrowserEnvironment(): boolean {\n return isBrowser();\n }\n\n /**\n * Generate a new BIP-39 seed phrase (12 words)\n */\n async generateSeed(): Promise<string> {\n await this.initialize();\n\n // Try API first (most reliable, uses real WDK)\n try {\n const response = await this.apiClient.generateSeed();\n if (response.success && response.seed) {\n return response.seed;\n }\n } catch (error) {\n console.warn('API seed generation failed:', error);\n }\n\n // Try native WDK\n if (this.useNativeWdk && this.nativeWdkService) {\n try {\n const wdk = this.nativeWdkService as { generateSeedPhrase: () => Promise<string> };\n return await wdk.generateSeedPhrase();\n } catch (error) {\n console.warn('Native WDK seed generation failed:', error);\n }\n }\n\n // Fallback to browser-compatible generation\n return BrowserDerivation.generateSeedPhrase();\n }\n\n /**\n * Validate a BIP-39 seed phrase\n */\n async validateSeed(seed: string): Promise<boolean> {\n await this.initialize();\n\n // Try API first\n try {\n const response = await this.apiClient.validateSeed(seed);\n if (response.success) {\n return response.isValid ?? false;\n }\n } catch (error) {\n console.warn('API seed validation failed:', error);\n }\n\n // Try native WDK\n if (this.useNativeWdk && this.nativeWdkService) {\n try {\n const wdk = this.nativeWdkService as { isValidSeed: (seed: string) => Promise<boolean> };\n return await wdk.isValidSeed(seed);\n } catch (error) {\n console.warn('Native WDK seed validation failed:', error);\n }\n }\n\n // Fallback to browser-compatible validation\n return BrowserDerivation.isValidSeed(seed);\n }\n\n /**\n * Derive address for a specific chain using WDK API\n *\n * For Ethereum, falls back to local derivation if API fails.\n * For other chains, WDK API is required - no placeholder fallback.\n */\n async deriveAddress(seed: string, chain: SupportedChain): Promise<ChainAddress> {\n await this.initialize();\n\n const path = this.getDerivationPath(chain);\n\n // Try API first (uses real WDK on backend)\n try {\n const response = await this.apiClient.deriveAddress(seed, chain as NetworkType, this.config.network);\n if (response.success && response.address) {\n return {\n chain,\n address: response.address,\n path: response.path || path,\n };\n }\n } catch (error) {\n console.warn(`API address derivation failed for ${chain}:`, error);\n\n // For Ethereum only, fall back to local derivation\n if (chain === 'ethereum') {\n return this.deriveBrowserAddress(seed, chain);\n }\n }\n\n // Try native WDK (Node.js only)\n if (this.useNativeWdk && this.nativeWdkService) {\n try {\n const wdk = this.nativeWdkService as {\n initialize: (seed: string) => Promise<void>;\n deriveAddress: (chain: SupportedChain) => Promise<ChainAddress>;\n };\n await wdk.initialize(seed);\n return await wdk.deriveAddress(chain);\n } catch (error) {\n console.warn(`Native WDK address derivation failed for ${chain}:`, error);\n }\n }\n\n // For Ethereum, we can use browser derivation as final fallback\n if (chain === 'ethereum') {\n return this.deriveBrowserAddress(seed, chain);\n }\n\n // For other chains, throw error - no placeholder addresses\n throw new Error(\n `WDK API required for ${chain} address derivation. Ensure the backend is running.`\n );\n }\n\n /**\n * Derive addresses for all supported chains using WDK API\n *\n * Uses the backend WDK API for real cryptographically valid addresses.\n * No placeholder fallback - WDK API is required for multi-chain addresses.\n */\n async deriveAllAddresses(seed: string): Promise<MultiChainAddresses> {\n await this.initialize();\n\n // Try API first (uses real WDK on backend)\n try {\n const response = await this.apiClient.deriveAllAddresses(seed, this.config.network);\n if (response.success && response.addresses) {\n // Extract address strings from response - API may return objects or strings\n const extractAddress = (value: unknown): string | null => {\n if (!value) return null;\n if (typeof value === 'string') return value;\n if (typeof value === 'object' && value !== null && 'address' in value) {\n return (value as { address: string }).address;\n }\n return null;\n };\n\n return {\n ethereum: extractAddress(response.addresses.ethereum),\n bitcoin: extractAddress(response.addresses.bitcoin),\n ton: extractAddress(response.addresses.ton),\n tron: extractAddress(response.addresses.tron),\n solana: extractAddress(response.addresses.solana),\n spark: extractAddress(response.addresses.spark),\n };\n }\n } catch (error) {\n console.warn('API address derivation failed:', error);\n }\n\n // Try native WDK (Node.js only)\n if (this.useNativeWdk && this.nativeWdkService) {\n try {\n const wdk = this.nativeWdkService as {\n initialize: (seed: string) => Promise<void>;\n deriveAllAddresses: () => Promise<MultiChainAddresses>;\n };\n await wdk.initialize(seed);\n return await wdk.deriveAllAddresses();\n } catch (error) {\n console.warn('Native WDK multi-chain derivation failed:', error);\n }\n }\n\n // No fallback - Tether WDK is required for multi-chain address derivation\n throw new Error(\n 'Tether WDK API required for multi-chain address derivation. Service temporarily unavailable.'\n );\n }\n\n /**\n * Get balances for all chains\n */\n async getAllBalances(seed: string): Promise<Record<string, ChainBalance | null>> {\n await this.initialize();\n\n // This always uses API as it requires blockchain RPC calls\n try {\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/balances`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ seed, network: this.config.network }),\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.success) {\n return data.balances;\n }\n }\n } catch (error) {\n console.warn('Failed to fetch balances:', error);\n }\n\n return {};\n }\n\n /**\n * Get fee rates for a chain\n */\n async getFeeRates(seed: string, chain: SupportedChain): Promise<FeeRates> {\n await this.initialize();\n\n try {\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/fee-rates`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ seed, chain, network: this.config.network }),\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.feeRates) {\n return data.feeRates;\n }\n }\n } catch (error) {\n console.warn(`Failed to fetch fee rates for ${chain}:`, error);\n }\n\n return { slow: '0', normal: '0', fast: '0' };\n }\n\n /**\n * Estimate transaction fee\n */\n async estimateFee(\n seed: string,\n chain: SupportedChain,\n to: string,\n amount: string\n ): Promise<{ fee: string; symbol: string }> {\n await this.initialize();\n\n try {\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/estimate-fee`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ seed, chain, to, amount, network: this.config.network }),\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.success) {\n return { fee: data.fee, symbol: data.symbol };\n }\n }\n } catch (error) {\n console.warn(`Failed to estimate fee for ${chain}:`, error);\n }\n\n return { fee: '0', symbol: this.getChainSymbol(chain) };\n }\n\n /**\n * Send a transaction\n */\n async sendTransaction(\n seed: string,\n chain: SupportedChain,\n to: string,\n amount: string\n ): Promise<TransactionResult> {\n await this.initialize();\n\n try {\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/send`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ seed, chain, to, amount, network: this.config.network }),\n });\n\n if (response.ok) {\n const data = await response.json();\n\n // Extract transaction hash from various possible properties\n let txHash = data.txHash || data.transactionHash || data.hash;\n\n // Handle case where txHash might be an object\n if (txHash && typeof txHash === 'object' && 'hash' in txHash) {\n txHash = txHash.hash;\n }\n\n // Validate Ethereum tx hash format (should be 66 chars: 0x + 64 hex)\n if (chain === 'ethereum' && txHash && (typeof txHash !== 'string' || !txHash.startsWith('0x') || txHash.length !== 66)) {\n console.warn(`Invalid Ethereum tx hash format: ${txHash} (length: ${txHash?.length}, expected: 66)`);\n }\n\n return {\n success: data.success,\n txHash,\n from: data.from,\n to: data.to,\n amount: data.amount,\n chain: data.chain,\n network: data.network,\n };\n }\n\n const errorData = await response.json().catch(() => ({}));\n return {\n success: false,\n error: errorData.error || `HTTP ${response.status}`,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Transaction failed',\n };\n }\n }\n\n /**\n * Get the network configuration\n */\n getNetwork(): 'mainnet' | 'testnet' {\n return this.config.network;\n }\n\n /**\n * Get API URL\n */\n getApiUrl(): string {\n return this.config.apiUrl;\n }\n\n // ==========================================\n // Private Helper Methods\n // ==========================================\n\n private getDerivationPath(chain: SupportedChain): string {\n const paths: Record<SupportedChain, string> = {\n bitcoin: this.config.network === 'testnet' ? \"m/84'/1'/0'/0/0\" : \"m/84'/0'/0'/0/0\",\n ethereum: \"m/44'/60'/0'/0/0\",\n ton: \"m/44'/607'/0'/0'/0'\",\n tron: \"m/44'/195'/0'/0/0\",\n solana: \"m/44'/501'/0'/0'\",\n spark: \"m/44'/998'/0'/0/0\",\n };\n return paths[chain];\n }\n\n private getChainSymbol(chain: SupportedChain): string {\n const symbols: Record<SupportedChain, string> = {\n ethereum: 'ETH',\n bitcoin: 'BTC',\n ton: 'TON',\n tron: 'TRX',\n solana: 'SOL',\n spark: 'SAT',\n };\n return symbols[chain];\n }\n\n /**\n * Derive address using browser-compatible libraries\n */\n private async deriveBrowserAddress(seed: string, chain: SupportedChain): Promise<ChainAddress> {\n const path = this.getDerivationPath(chain);\n\n try {\n let address: string;\n\n switch (chain) {\n case 'ethereum':\n address = BrowserDerivation.deriveEthereumAddress(seed);\n break;\n case 'bitcoin':\n address = BrowserDerivation.deriveBitcoinAddress(seed, this.config.network);\n break;\n case 'tron':\n address = BrowserDerivation.deriveTronAddress(seed);\n break;\n case 'spark':\n address = BrowserDerivation.deriveSparkAddress(seed, this.config.network);\n break;\n case 'solana':\n address = await BrowserDerivation.deriveSolanaAddress(seed);\n break;\n case 'ton':\n address = await BrowserDerivation.deriveTonAddress(seed);\n break;\n default:\n throw new Error(`Unsupported chain: ${chain}`);\n }\n\n return { chain, address, path };\n } catch (error) {\n console.error(`Browser derivation failed for ${chain}:`, error);\n throw error;\n }\n }\n\n /**\n * Derive all addresses using browser-compatible libraries\n */\n private async deriveAllBrowserAddresses(seed: string): Promise<MultiChainAddresses> {\n return BrowserDerivation.deriveAllAddresses(seed, this.config.network);\n }\n}\n\n// ==========================================\n// Factory Functions\n// ==========================================\n\nlet defaultService: ZubariWdkService | null = null;\n\n/**\n * Get or create the default ZubariWdkService instance\n */\nexport function getZubariWdkService(config?: Partial<ZubariWdkServiceConfig>): ZubariWdkService {\n if (!defaultService || (config && config.network !== defaultService.getNetwork())) {\n defaultService = new ZubariWdkService(config);\n }\n return defaultService;\n}\n\n/**\n * Create a new ZubariWdkService instance\n */\nexport function createZubariWdkService(config?: Partial<ZubariWdkServiceConfig>): ZubariWdkService {\n return new ZubariWdkService(config);\n}\n\n/**\n * Check if the current environment is a browser\n */\nexport { isBrowser };\n","import type {\n ZubariWalletConfig,\n NetworkType,\n NetworkBalance,\n TxResult,\n Account,\n SendParams,\n} from '../types';\nimport { getNetworkConfig, DERIVATION_PATHS } from '../config/networks';\nimport { getContractAddresses } from '../config/contracts';\nimport {\n ZubariWdkService,\n getZubariWdkService,\n type SupportedChain,\n type ChainBalance,\n} from '../services/ZubariWdkService';\n\n/**\n * ZubariWallet - Multi-chain self-custodial wallet\n *\n * Core wallet class that manages accounts across multiple blockchain networks\n * using Tether WDK as the underlying infrastructure layer via ZubariWdkService.\n */\nexport class ZubariWallet {\n private readonly seed: string;\n private readonly config: ZubariWalletConfig;\n private readonly accounts: Map<NetworkType, Account> = new Map();\n private readonly wdkService: ZubariWdkService;\n private initialized: boolean = false;\n\n constructor(seed: string, config: ZubariWalletConfig) {\n this.seed = seed;\n this.config = {\n network: config.network || 'mainnet',\n enabledNetworks: config.enabledNetworks || ['ethereum'],\n gasless: config.gasless ?? false,\n paymasterUrl: config.paymasterUrl,\n bundlerUrl: config.bundlerUrl,\n rpcUrls: config.rpcUrls,\n };\n\n // Initialize WDK service for blockchain operations\n this.wdkService = getZubariWdkService({\n network: this.config.network === 'testnet' ? 'testnet' : 'mainnet',\n forceApi: true, // Use backend API for all operations\n });\n }\n\n /**\n * Initialize the wallet by deriving accounts for all enabled networks\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n for (const network of this.config.enabledNetworks) {\n await this.deriveAccount(network);\n }\n\n this.initialized = true;\n }\n\n /**\n * Derive account for a specific network using BIP-44 via WDK API\n */\n private async deriveAccount(network: NetworkType, index: number = 0): Promise<Account> {\n const basePath = DERIVATION_PATHS[network];\n const derivationPath = `${basePath}/${index}`;\n\n // Map NetworkType to SupportedChain for WDK service\n const chainMap: Record<NetworkType, SupportedChain> = {\n ethereum: 'ethereum',\n bitcoin: 'bitcoin',\n ton: 'ton',\n tron: 'tron',\n solana: 'solana',\n spark: 'spark',\n };\n\n const chain = chainMap[network];\n if (!chain) {\n throw new Error(`Unsupported network: ${network}`);\n }\n\n try {\n // Use WDK service to derive address\n const result = await this.wdkService.deriveAddress(this.seed, chain);\n\n const account: Account = {\n network,\n address: result.address,\n publicKey: '', // WDK doesn't expose public key directly\n derivationPath: result.path || derivationPath,\n };\n\n this.accounts.set(network, account);\n return account;\n } catch (error) {\n console.error(`Failed to derive account for ${network}:`, error);\n throw new Error(`Failed to derive ${network} address: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Get account for a specific network\n */\n async getAccount(network: NetworkType, index: number = 0): Promise<Account> {\n const existing = this.accounts.get(network);\n if (existing && existing.derivationPath.endsWith(`/${index}`)) {\n return existing;\n }\n return this.deriveAccount(network, index);\n }\n\n /**\n * Get address for a specific network\n */\n async getAddress(network: NetworkType): Promise<string> {\n const account = await this.getAccount(network);\n return account.address;\n }\n\n /**\n * Get all addresses for enabled networks\n */\n async getAllAddresses(): Promise<Record<NetworkType, string>> {\n const addresses: Partial<Record<NetworkType, string>> = {};\n\n for (const network of this.config.enabledNetworks) {\n addresses[network] = await this.getAddress(network);\n }\n\n return addresses as Record<NetworkType, string>;\n }\n\n /**\n * Get balance for a specific network via WDK API\n */\n async getBalance(network: NetworkType): Promise<NetworkBalance> {\n const networkConfig = getNetworkConfig(network, this.config.network === 'testnet');\n\n // Map NetworkType to SupportedChain\n const chainMap: Record<NetworkType, SupportedChain> = {\n ethereum: 'ethereum',\n bitcoin: 'bitcoin',\n ton: 'ton',\n tron: 'tron',\n solana: 'solana',\n spark: 'spark',\n };\n\n const chain = chainMap[network];\n if (!chain) {\n throw new Error(`Unsupported network: ${network}`);\n }\n\n try {\n const balances = await this.wdkService.getAllBalances(this.seed);\n const chainBalance = balances[chain] as ChainBalance | null;\n\n if (chainBalance) {\n const balanceValue = BigInt(chainBalance.balance || '0');\n const decimals = networkConfig.nativeCurrency.decimals;\n const balanceFormatted = this.formatBalance(balanceValue, decimals);\n\n return {\n network,\n native: {\n symbol: chainBalance.symbol || networkConfig.nativeCurrency.symbol,\n balance: balanceValue,\n balanceFormatted,\n balanceUsd: 0, // TODO: Integrate price feed\n },\n tokens: [],\n };\n }\n\n // Return zero balance if not found\n return {\n network,\n native: {\n symbol: networkConfig.nativeCurrency.symbol,\n balance: BigInt(0),\n balanceFormatted: '0',\n balanceUsd: 0,\n },\n tokens: [],\n };\n } catch (error) {\n console.error(`Failed to get balance for ${network}:`, error);\n // Return zero balance on error\n return {\n network,\n native: {\n symbol: networkConfig.nativeCurrency.symbol,\n balance: BigInt(0),\n balanceFormatted: '0',\n balanceUsd: 0,\n },\n tokens: [],\n };\n }\n }\n\n /**\n * Format balance from wei/satoshi to human-readable string\n */\n private formatBalance(balance: bigint, decimals: number): string {\n if (balance === BigInt(0)) return '0';\n const divisor = BigInt(10 ** decimals);\n const integerPart = balance / divisor;\n const fractionalPart = balance % divisor;\n const fractionalStr = fractionalPart.toString().padStart(decimals, '0').slice(0, 6);\n return `${integerPart}.${fractionalStr}`.replace(/\\.?0+$/, '') || '0';\n }\n\n /**\n * Get balances for all enabled networks\n */\n async getAllBalances(): Promise<NetworkBalance[]> {\n const balances: NetworkBalance[] = [];\n\n for (const network of this.config.enabledNetworks) {\n balances.push(await this.getBalance(network));\n }\n\n return balances;\n }\n\n /**\n * Get total portfolio value in USD\n */\n async getTotalPortfolioUsd(): Promise<number> {\n const balances = await this.getAllBalances();\n let total = 0;\n\n for (const balance of balances) {\n total += balance.native.balanceUsd;\n for (const token of balance.tokens) {\n total += token.balanceUsd;\n }\n }\n\n return total;\n }\n\n /**\n * Send native currency on a specific network via WDK API\n */\n async send(network: NetworkType, params: SendParams): Promise<TxResult> {\n const { to, amount } = params;\n\n // Map NetworkType to SupportedChain\n const chainMap: Record<NetworkType, SupportedChain> = {\n ethereum: 'ethereum',\n bitcoin: 'bitcoin',\n ton: 'ton',\n tron: 'tron',\n solana: 'solana',\n spark: 'spark',\n };\n\n const chain = chainMap[network];\n if (!chain) {\n throw new Error(`Unsupported network: ${network}`);\n }\n\n try {\n const result = await this.wdkService.sendTransaction(\n this.seed,\n chain,\n to,\n amount.toString()\n );\n\n if (result.success && result.txHash) {\n return {\n hash: result.txHash,\n network,\n status: 'pending',\n metadata: {\n from: result.from,\n to: result.to,\n amount: result.amount,\n },\n };\n }\n\n throw new Error(result.error || 'Transaction failed');\n } catch (error) {\n console.error(`Failed to send on ${network}:`, error);\n throw new Error(`Transaction failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Send ERC-20 token on EVM networks via WDK API\n */\n async sendToken(\n network: NetworkType,\n token: string,\n to: string,\n amount: bigint\n ): Promise<TxResult> {\n const networkConfig = getNetworkConfig(network, this.config.network === 'testnet');\n\n if (!networkConfig.isEvm) {\n throw new Error(`sendToken is only supported on EVM networks. ${network} is not an EVM chain.`);\n }\n\n try {\n // Use backend API for ERC-20 token transfers\n const apiUrl = this.wdkService.getApiUrl();\n const response = await fetch(`${apiUrl}/api/wallets/wdk/send-token`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n seed: this.seed,\n chain: 'ethereum',\n token,\n to,\n amount: amount.toString(),\n network: this.config.network,\n }),\n });\n\n const result = await response.json();\n\n if (result.success && result.txHash) {\n return {\n hash: result.txHash,\n network,\n status: 'pending',\n metadata: {\n token,\n from: result.from,\n to: result.to,\n amount: result.amount,\n },\n };\n }\n\n throw new Error(result.error || 'Token transfer failed');\n } catch (error) {\n console.error(`Failed to send token on ${network}:`, error);\n throw new Error(`Token transfer failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Send Bitcoin on-chain using WalletManagerBtc\n * @param to - Destination address (bc1q... for native segwit)\n * @param amount - Amount in satoshis\n */\n async sendBitcoin(to: string, amount: bigint): Promise<TxResult> {\n // Validate Bitcoin address format\n if (!this.isValidBitcoinAddress(to)) {\n throw new Error('Invalid Bitcoin address. Expected bc1q... (native segwit) format.');\n }\n\n // Use WDK WalletManagerBtc for transaction\n // const btcManager = new WalletManagerBtc({ seed: this.seed });\n // const tx = await btcManager.send(to, amount);\n\n return this.send('bitcoin', { to, amount });\n }\n\n /**\n * Validate Bitcoin address format\n */\n private isValidBitcoinAddress(address: string): boolean {\n // Native SegWit (bech32)\n if (address.startsWith('bc1q') || address.startsWith('tb1q')) {\n return address.length >= 42 && address.length <= 62;\n }\n // Legacy P2PKH\n if (address.startsWith('1') || address.startsWith('m') || address.startsWith('n')) {\n return address.length >= 25 && address.length <= 34;\n }\n // P2SH\n if (address.startsWith('3') || address.startsWith('2')) {\n return address.length >= 25 && address.length <= 34;\n }\n return false;\n }\n\n /**\n * Get Bitcoin address (native segwit bc1q...)\n */\n async getBitcoinAddress(): Promise<string> {\n const account = await this.getAccount('bitcoin');\n return account.address;\n }\n\n /**\n * Pay Lightning invoice via Spark network using WDK API\n * Uses WDK WalletManagerSpark (m/44'/998')\n * @param invoice - Lightning invoice string (lnbc...)\n */\n async sendLightning(invoice: string): Promise<TxResult> {\n // Validate Lightning invoice format\n if (!this.isValidLightningInvoice(invoice)) {\n throw new Error('Invalid Lightning invoice format. Expected lnbc... or lntb...');\n }\n\n // Decode invoice to get amount and destination\n const invoiceDetails = await this.decodeLightningInvoice(invoice);\n\n try {\n // Use backend API for Lightning payments via Spark\n const apiUrl = this.wdkService.getApiUrl();\n const response = await fetch(`${apiUrl}/api/wallets/wdk/lightning/pay`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n seed: this.seed,\n invoice,\n network: this.config.network,\n }),\n });\n\n const result = await response.json();\n\n if (result.success && result.paymentHash) {\n return {\n hash: result.paymentHash,\n network: 'spark',\n status: 'pending',\n metadata: {\n invoice,\n amount: invoiceDetails.amount,\n destination: invoiceDetails.destination,\n preimage: result.preimage,\n },\n };\n }\n\n throw new Error(result.error || 'Lightning payment failed');\n } catch (error) {\n console.error('Failed to send Lightning payment:', error);\n throw new Error(`Lightning payment failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Create Lightning invoice via Spark using WDK API\n * @param amount - Amount in millisatoshis\n * @param memo - Optional payment memo\n * @returns Lightning invoice string (lnbc...)\n */\n async createLightningInvoice(amount: bigint, memo?: string): Promise<string> {\n if (amount <= BigInt(0)) {\n throw new Error('Invoice amount must be greater than 0');\n }\n\n try {\n // Use backend API to create Lightning invoice via Spark\n const apiUrl = this.wdkService.getApiUrl();\n const response = await fetch(`${apiUrl}/api/wallets/wdk/lightning/invoice`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n seed: this.seed,\n amount: amount.toString(),\n memo: memo || '',\n network: this.config.network,\n }),\n });\n\n const result = await response.json();\n\n if (result.success && result.invoice) {\n return result.invoice;\n }\n\n throw new Error(result.error || 'Failed to create invoice');\n } catch (error) {\n console.error('Failed to create Lightning invoice:', error);\n throw new Error(`Failed to create invoice: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Validate Lightning invoice format\n */\n private isValidLightningInvoice(invoice: string): boolean {\n const lowerInvoice = invoice.toLowerCase();\n return (\n lowerInvoice.startsWith('lnbc') || // Mainnet\n lowerInvoice.startsWith('lntb') || // Testnet\n lowerInvoice.startsWith('lnbcrt') // Regtest\n );\n }\n\n /**\n * Decode Lightning invoice using backend API\n * Parses BOLT11 invoice to extract payment details\n */\n private async decodeLightningInvoice(invoice: string): Promise<{\n amount: bigint;\n destination: string;\n expiry: number;\n description?: string;\n }> {\n try {\n // Use backend API to decode invoice (which uses bolt11 library)\n const apiUrl = this.wdkService.getApiUrl();\n const response = await fetch(`${apiUrl}/api/wallets/wdk/lightning/decode`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ invoice }),\n });\n\n const result = await response.json();\n\n if (result.success) {\n return {\n amount: BigInt(result.amount || 0),\n destination: result.destination || '',\n expiry: result.expiry || 3600,\n description: result.description,\n };\n }\n\n // Fallback: basic parsing from invoice prefix\n return this.parseInvoiceBasic(invoice);\n } catch (error) {\n console.warn('Failed to decode invoice via API, using basic parsing:', error);\n return this.parseInvoiceBasic(invoice);\n }\n }\n\n /**\n * Basic Lightning invoice parsing (fallback)\n * Extracts amount from invoice prefix when API is unavailable\n */\n private parseInvoiceBasic(invoice: string): {\n amount: bigint;\n destination: string;\n expiry: number;\n } {\n // Extract amount from invoice prefix (e.g., lnbc100n, lnbc1m, lnbc100u)\n const lowerInvoice = invoice.toLowerCase();\n const amountMatch = lowerInvoice.match(/^ln(?:bc|tb|bcrt)(\\d+)([munp])?/);\n\n let amount = BigInt(0);\n if (amountMatch && amountMatch[1]) {\n const value = BigInt(amountMatch[1]);\n const multiplier = amountMatch[2];\n\n // Convert to millisatoshis based on multiplier\n switch (multiplier) {\n case 'm': amount = value * BigInt(100000000); break; // milli-BTC\n case 'u': amount = value * BigInt(100000); break; // micro-BTC\n case 'n': amount = value * BigInt(100); break; // nano-BTC\n case 'p': amount = value / BigInt(10); break; // pico-BTC\n default: amount = value * BigInt(100000000000); break; // BTC\n }\n }\n\n return {\n amount,\n destination: '',\n expiry: 3600,\n };\n }\n\n /**\n * Get Lightning (Spark) balance via WDK API\n */\n async getLightningBalance(): Promise<{\n available: bigint;\n pending: bigint;\n }> {\n try {\n const apiUrl = this.wdkService.getApiUrl();\n const response = await fetch(`${apiUrl}/api/wallets/wdk/lightning/balance`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n seed: this.seed,\n network: this.config.network,\n }),\n });\n\n const result = await response.json();\n\n if (result.success) {\n return {\n available: BigInt(result.available || 0),\n pending: BigInt(result.pending || 0),\n };\n }\n\n return { available: BigInt(0), pending: BigInt(0) };\n } catch (error) {\n console.error('Failed to get Lightning balance:', error);\n return { available: BigInt(0), pending: BigInt(0) };\n }\n }\n\n /**\n * Get configuration\n */\n getConfig(): ZubariWalletConfig {\n return { ...this.config };\n }\n\n /**\n * Check if wallet is initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * Get contract addresses for current network\n */\n getContractAddresses() {\n return getContractAddresses(this.config.network);\n }\n}\n","/**\n * KeyManager - Secure key storage and encryption\n *\n * Handles seed phrase encryption using AES-256-GCM\n * with PBKDF2 key derivation from user password.\n */\nexport class KeyManager {\n private static readonly ALGORITHM = 'AES-GCM';\n private static readonly KEY_LENGTH = 256;\n private static readonly IV_LENGTH = 12;\n private static readonly SALT_LENGTH = 16;\n private static readonly PBKDF2_ITERATIONS = 100000;\n\n /**\n * Encrypt a seed phrase with a password\n */\n static async encryptSeed(seed: string, password: string): Promise<string> {\n const encoder = new TextEncoder();\n const seedData = encoder.encode(seed);\n\n // Generate random salt and IV\n const salt = crypto.getRandomValues(new Uint8Array(this.SALT_LENGTH));\n const iv = crypto.getRandomValues(new Uint8Array(this.IV_LENGTH));\n\n // Derive key from password\n const key = await this.deriveKey(password, salt);\n\n // Encrypt\n const encrypted = await crypto.subtle.encrypt(\n { name: this.ALGORITHM, iv },\n key,\n seedData\n );\n\n // Combine salt + iv + encrypted data\n const combined = new Uint8Array(salt.length + iv.length + encrypted.byteLength);\n combined.set(salt, 0);\n combined.set(iv, salt.length);\n combined.set(new Uint8Array(encrypted), salt.length + iv.length);\n\n // Return as base64\n return btoa(String.fromCharCode(...combined));\n }\n\n /**\n * Decrypt a seed phrase with a password\n */\n static async decryptSeed(encryptedData: string, password: string): Promise<string> {\n // Decode from base64\n const combined = new Uint8Array(\n atob(encryptedData)\n .split('')\n .map(c => c.charCodeAt(0))\n );\n\n // Extract salt, iv, and encrypted data\n const salt = combined.slice(0, this.SALT_LENGTH);\n const iv = combined.slice(this.SALT_LENGTH, this.SALT_LENGTH + this.IV_LENGTH);\n const encrypted = combined.slice(this.SALT_LENGTH + this.IV_LENGTH);\n\n // Derive key from password\n const key = await this.deriveKey(password, salt);\n\n // Decrypt\n const decrypted = await crypto.subtle.decrypt(\n { name: this.ALGORITHM, iv },\n key,\n encrypted\n );\n\n const decoder = new TextDecoder();\n return decoder.decode(decrypted);\n }\n\n /**\n * Derive encryption key from password using PBKDF2\n */\n private static async deriveKey(\n password: string,\n salt: Uint8Array\n ): Promise<CryptoKey> {\n const encoder = new TextEncoder();\n const passwordData = encoder.encode(password);\n\n // Import password as key material\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n passwordData,\n 'PBKDF2',\n false,\n ['deriveKey']\n );\n\n // Derive AES key\n return crypto.subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt: salt.buffer.slice(salt.byteOffset, salt.byteOffset + salt.byteLength) as ArrayBuffer,\n iterations: this.PBKDF2_ITERATIONS,\n hash: 'SHA-256',\n },\n keyMaterial,\n { name: this.ALGORITHM, length: this.KEY_LENGTH },\n false,\n ['encrypt', 'decrypt']\n );\n }\n\n /**\n * Validate a BIP-39 seed phrase (basic validation)\n */\n static validateSeedPhrase(seed: string): boolean {\n const words = seed.trim().split(/\\s+/);\n // BIP-39 supports 12, 15, 18, 21, or 24 words\n const validWordCounts = [12, 15, 18, 21, 24];\n return validWordCounts.includes(words.length);\n }\n\n /**\n * Generate a random encryption key (for backup purposes)\n */\n static generateBackupKey(): string {\n const bytes = crypto.getRandomValues(new Uint8Array(32));\n return Array.from(bytes)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n }\n}\n","/**\n * Secure Storage Interface\n * Platform-agnostic interface for secure key storage\n */\nexport interface SecureStorageAdapter {\n /**\n * Store a value securely\n */\n setItem(key: string, value: string): Promise<void>;\n\n /**\n * Retrieve a value\n */\n getItem(key: string): Promise<string | null>;\n\n /**\n * Remove a value\n */\n removeItem(key: string): Promise<void>;\n\n /**\n * Check if a key exists\n */\n hasItem(key: string): Promise<boolean>;\n\n /**\n * Clear all stored values\n */\n clear(): Promise<void>;\n}\n\n/**\n * iOS Keychain Storage Adapter\n * Uses react-native-keychain for iOS Keychain access\n */\nexport class KeychainStorageAdapter implements SecureStorageAdapter {\n private serviceName: string;\n\n constructor(serviceName: string = 'com.zubari.wallet') {\n this.serviceName = serviceName;\n }\n\n async setItem(key: string, value: string): Promise<void> {\n // In React Native, use react-native-keychain\n // const Keychain = require('react-native-keychain');\n // await Keychain.setGenericPassword(key, value, { service: this.serviceName });\n\n // Placeholder for native implementation\n if (typeof global !== 'undefined' && (global as any).KeychainModule) {\n await (global as any).KeychainModule.setItem(this.serviceName, key, value);\n } else {\n throw new Error('Keychain not available on this platform');\n }\n }\n\n async getItem(key: string): Promise<string | null> {\n if (typeof global !== 'undefined' && (global as any).KeychainModule) {\n return (global as any).KeychainModule.getItem(this.serviceName, key);\n }\n throw new Error('Keychain not available on this platform');\n }\n\n async removeItem(key: string): Promise<void> {\n if (typeof global !== 'undefined' && (global as any).KeychainModule) {\n await (global as any).KeychainModule.removeItem(this.serviceName, key);\n } else {\n throw new Error('Keychain not available on this platform');\n }\n }\n\n async hasItem(key: string): Promise<boolean> {\n const value = await this.getItem(key);\n return value !== null;\n }\n\n async clear(): Promise<void> {\n if (typeof global !== 'undefined' && (global as any).KeychainModule) {\n await (global as any).KeychainModule.clear(this.serviceName);\n } else {\n throw new Error('Keychain not available on this platform');\n }\n }\n}\n\n/**\n * Android Keystore Storage Adapter\n * Uses Android Keystore for secure storage\n */\nexport class KeystoreStorageAdapter implements SecureStorageAdapter {\n private alias: string;\n\n constructor(alias: string = 'zubari_wallet_keys') {\n this.alias = alias;\n }\n\n async setItem(key: string, value: string): Promise<void> {\n // In React Native, use react-native-encrypted-storage or similar\n // const EncryptedStorage = require('react-native-encrypted-storage');\n // await EncryptedStorage.setItem(key, value);\n\n if (typeof global !== 'undefined' && (global as any).KeystoreModule) {\n await (global as any).KeystoreModule.setItem(this.alias, key, value);\n } else {\n throw new Error('Keystore not available on this platform');\n }\n }\n\n async getItem(key: string): Promise<string | null> {\n if (typeof global !== 'undefined' && (global as any).KeystoreModule) {\n return (global as any).KeystoreModule.getItem(this.alias, key);\n }\n throw new Error('Keystore not available on this platform');\n }\n\n async removeItem(key: string): Promise<void> {\n if (typeof global !== 'undefined' && (global as any).KeystoreModule) {\n await (global as any).KeystoreModule.removeItem(this.alias, key);\n } else {\n throw new Error('Keystore not available on this platform');\n }\n }\n\n async hasItem(key: string): Promise<boolean> {\n const value = await this.getItem(key);\n return value !== null;\n }\n\n async clear(): Promise<void> {\n if (typeof global !== 'undefined' && (global as any).KeystoreModule) {\n await (global as any).KeystoreModule.clear(this.alias);\n } else {\n throw new Error('Keystore not available on this platform');\n }\n }\n}\n\n/**\n * Web Encrypted LocalStorage Adapter\n * Uses Web Crypto API for encryption with localStorage\n */\nexport class WebEncryptedStorageAdapter implements SecureStorageAdapter {\n private encryptionKey: CryptoKey | null = null;\n private storagePrefix: string;\n\n constructor(storagePrefix: string = 'zubari_') {\n this.storagePrefix = storagePrefix;\n }\n\n /**\n * Initialize with a password-derived key\n */\n async initialize(password: string): Promise<void> {\n const encoder = new TextEncoder();\n const salt = this.getSalt();\n\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveKey']\n );\n\n this.encryptionKey = await crypto.subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt: salt.buffer as ArrayBuffer,\n iterations: 100000,\n hash: 'SHA-256',\n },\n keyMaterial,\n { name: 'AES-GCM', length: 256 },\n false,\n ['encrypt', 'decrypt']\n );\n }\n\n private getSalt(): Uint8Array {\n const saltKey = `${this.storagePrefix}salt`;\n let saltHex = localStorage.getItem(saltKey);\n\n if (!saltHex) {\n const salt = crypto.getRandomValues(new Uint8Array(16));\n saltHex = Array.from(salt)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n localStorage.setItem(saltKey, saltHex);\n }\n\n return new Uint8Array(\n saltHex.match(/.{1,2}/g)!.map((byte) => parseInt(byte, 16))\n );\n }\n\n async setItem(key: string, value: string): Promise<void> {\n if (!this.encryptionKey) {\n throw new Error('Storage not initialized. Call initialize() first.');\n }\n\n const encoder = new TextEncoder();\n const iv = crypto.getRandomValues(new Uint8Array(12));\n\n const encrypted = await crypto.subtle.encrypt(\n { name: 'AES-GCM', iv },\n this.encryptionKey,\n encoder.encode(value)\n );\n\n const combined = new Uint8Array(iv.length + encrypted.byteLength);\n combined.set(iv);\n combined.set(new Uint8Array(encrypted), iv.length);\n\n const base64 = btoa(String.fromCharCode(...combined));\n localStorage.setItem(`${this.storagePrefix}${key}`, base64);\n }\n\n async getItem(key: string): Promise<string | null> {\n if (!this.encryptionKey) {\n throw new Error('Storage not initialized. Call initialize() first.');\n }\n\n const base64 = localStorage.getItem(`${this.storagePrefix}${key}`);\n if (!base64) return null;\n\n try {\n const combined = new Uint8Array(\n atob(base64)\n .split('')\n .map((c) => c.charCodeAt(0))\n );\n\n const iv = combined.slice(0, 12);\n const encrypted = combined.slice(12);\n\n const decrypted = await crypto.subtle.decrypt(\n { name: 'AES-GCM', iv },\n this.encryptionKey,\n encrypted\n );\n\n const decoder = new TextDecoder();\n return decoder.decode(decrypted);\n } catch {\n return null;\n }\n }\n\n async removeItem(key: string): Promise<void> {\n localStorage.removeItem(`${this.storagePrefix}${key}`);\n }\n\n async hasItem(key: string): Promise<boolean> {\n return localStorage.getItem(`${this.storagePrefix}${key}`) !== null;\n }\n\n async clear(): Promise<void> {\n const keysToRemove: string[] = [];\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(this.storagePrefix)) {\n keysToRemove.push(key);\n }\n }\n\n keysToRemove.forEach((key) => localStorage.removeItem(key));\n }\n}\n\n/**\n * In-Memory Storage Adapter (for testing)\n */\nexport class MemoryStorageAdapter implements SecureStorageAdapter {\n private storage: Map<string, string> = new Map();\n\n async setItem(key: string, value: string): Promise<void> {\n this.storage.set(key, value);\n }\n\n async getItem(key: string): Promise<string | null> {\n return this.storage.get(key) || null;\n }\n\n async removeItem(key: string): Promise<void> {\n this.storage.delete(key);\n }\n\n async hasItem(key: string): Promise<boolean> {\n return this.storage.has(key);\n }\n\n async clear(): Promise<void> {\n this.storage.clear();\n }\n}\n\n/**\n * Secure Storage Factory\n * Creates appropriate storage adapter based on platform\n */\nexport function createSecureStorage(): SecureStorageAdapter {\n // Check for React Native\n if (\n typeof global !== 'undefined' &&\n (global as any).nativeModuleProxy !== undefined\n ) {\n // Check platform\n const Platform = (global as any).Platform;\n if (Platform?.OS === 'ios') {\n return new KeychainStorageAdapter();\n } else if (Platform?.OS === 'android') {\n return new KeystoreStorageAdapter();\n }\n }\n\n // Check for browser environment\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n return new WebEncryptedStorageAdapter();\n }\n\n // Fallback to memory storage (for Node.js/testing)\n return new MemoryStorageAdapter();\n}\n","import { Wallet, HDNodeWallet, formatEther, parseEther } from 'ethers';\nimport { createPublicClient, http, formatEther as viemFormatEther } from 'viem';\nimport { sepolia, mainnet } from 'viem/chains';\nimport { KeyManager } from '../security';\nimport type { SecureStorageAdapter } from '../storage/SecureStorage';\nimport { createSecureStorage, WebEncryptedStorageAdapter } from '../storage/SecureStorage';\nimport { NETWORKS, DERIVATION_PATHS, getNetworkConfig, type NetworkConfig } from '../config/networks';\nimport type { NetworkType } from '../types';\nimport { ZubariWdkService, getZubariWdkService } from '../services/ZubariWdkService';\nimport * as BrowserDerivation from '../services/BrowserAddressDerivation';\n\n/**\n * CoinGecko IDs for each supported chain\n */\nconst COINGECKO_IDS: Record<NetworkType, string> = {\n ethereum: 'ethereum',\n bitcoin: 'bitcoin',\n ton: 'the-open-network',\n tron: 'tron',\n solana: 'solana',\n spark: 'bitcoin', // Spark uses BTC\n};\n\n/**\n * Price cache to avoid excessive API calls\n */\ninterface PriceCache {\n prices: Record<string, number>;\n timestamp: number;\n}\n\nlet priceCache: PriceCache | null = null;\nconst PRICE_CACHE_TTL = 60000; // 1 minute cache\n\n/**\n * Fetch USD prices for all supported chains from CoinGecko\n */\nasync function fetchPrices(): Promise<Record<string, number>> {\n // Check cache\n if (priceCache && Date.now() - priceCache.timestamp < PRICE_CACHE_TTL) {\n return priceCache.prices;\n }\n\n const ids = Object.values(COINGECKO_IDS).filter((v, i, a) => a.indexOf(v) === i).join(',');\n\n try {\n const response = await fetch(\n `https://api.coingecko.com/api/v3/simple/price?ids=${ids}&vs_currencies=usd`,\n {\n headers: { 'Accept': 'application/json' },\n }\n );\n\n if (response.ok) {\n const data = await response.json();\n const prices: Record<string, number> = {};\n\n for (const [chain, geckoId] of Object.entries(COINGECKO_IDS)) {\n prices[chain] = data[geckoId]?.usd || 0;\n }\n\n // Update cache\n priceCache = { prices, timestamp: Date.now() };\n return prices;\n }\n } catch (error) {\n console.warn('Failed to fetch prices from CoinGecko:', error);\n }\n\n // Return cached prices if available, otherwise empty\n return priceCache?.prices || {};\n}\n\n/**\n * Get USD price for a specific chain\n */\nasync function getPriceForChain(chain: NetworkType): Promise<number> {\n const prices = await fetchPrices();\n return prices[chain] || 0;\n}\n\n/**\n * Note on Tether WDK Integration:\n *\n * Tether WDK (@tetherto/wdk, @tetherto/wdk-wallet-btc, @tetherto/wdk-wallet-evm)\n * is designed for Node.js and React Native environments. The Bitcoin wallet module\n * uses Electrum client which requires Node.js 'net' module.\n *\n * For browser environments (Next.js, React web), we use ethers.js for address derivation\n * following proper BIP-44/BIP-84 paths. This provides deterministic addresses that are\n * compatible with the same seed used in WDK-based apps.\n *\n * For React Native or Node.js apps, you can integrate WDK directly:\n * @see https://docs.wallet.tether.io/\n */\n\n/**\n * Storage keys for wallet data\n */\nconst STORAGE_KEYS = {\n ENCRYPTED_SEED: 'encrypted_seed',\n ACTIVE_WALLET: 'active_wallet',\n DERIVED_ADDRESSES: 'derived_addresses',\n} as const;\n\n/**\n * Supported chains for Zubari WDK Wallet\n */\nexport const SUPPORTED_CHAINS: NetworkType[] = ['ethereum', 'bitcoin', 'ton', 'tron', 'solana', 'spark'];\n\n/**\n * Chain balance information\n */\nexport interface ChainBalance {\n chain: NetworkType;\n symbol: string;\n balance: string;\n balanceUsd: number;\n address: string;\n decimals: number;\n icon?: string;\n}\n\n/**\n * Multi-chain addresses\n */\nexport interface MultiChainAddresses {\n ethereum: string;\n bitcoin: string;\n ton: string;\n tron: string;\n solana: string;\n spark: string;\n}\n\n/**\n * Wallet state interface\n */\nexport interface WalletState {\n isInitialized: boolean;\n isLocked: boolean;\n address: string | null;\n balance: string | null;\n // Multi-chain support\n addresses?: Partial<MultiChainAddresses>;\n balances?: ChainBalance[];\n selectedChain?: NetworkType;\n}\n\n/**\n * WalletManager Configuration\n */\nexport interface WalletManagerConfig {\n network?: 'mainnet' | 'testnet';\n rpcUrl?: string;\n storage?: SecureStorageAdapter;\n enabledChains?: NetworkType[];\n /** API URL for WDK backend (for multi-chain address derivation) */\n apiUrl?: string;\n}\n\n/**\n * WalletManager - Handles BIP-39 seed generation, address derivation, and secure storage\n *\n * This class provides:\n * - BIP-39 mnemonic generation (12 words)\n * - BIP-44 address derivation for multiple chains (Ethereum, Bitcoin, TON, TRON, Solana, Spark)\n * - Encrypted seed storage using AES-256-GCM\n * - Multi-chain balance fetching\n */\nexport class WalletManager {\n private readonly config: Required<Omit<WalletManagerConfig, 'enabledChains'>> & { enabledChains: NetworkType[] };\n private storage: SecureStorageAdapter;\n private currentSeed: string | null = null;\n private derivedAddress: string | null = null;\n private derivedAddresses: Partial<MultiChainAddresses> = {};\n private selectedChain: NetworkType = 'ethereum';\n private wdkService: ZubariWdkService;\n\n constructor(config: WalletManagerConfig = {}) {\n // Get the appropriate RPC URL from network config\n const isTestnet = config.network !== 'mainnet';\n const ethereumConfig = getNetworkConfig('ethereum', isTestnet);\n\n this.config = {\n network: config.network || 'testnet',\n rpcUrl: config.rpcUrl || ethereumConfig.rpcUrl,\n storage: config.storage || createSecureStorage(),\n enabledChains: config.enabledChains || SUPPORTED_CHAINS,\n apiUrl: config.apiUrl || process.env.NEXT_PUBLIC_API_URL || 'https://ckgwifsxka.us-east-2.awsapprunner.com',\n };\n this.storage = this.config.storage;\n\n // Initialize unified WDK service (works in browser and Node.js)\n this.wdkService = getZubariWdkService({\n network: this.config.network,\n apiUrl: this.config.apiUrl,\n });\n }\n\n /**\n * Generate a new BIP-39 seed phrase (12 words) using ethers.js\n * For native WDK generation, use generateSeedWithWdk() instead\n */\n static generateSeed(): string {\n const wallet = Wallet.createRandom();\n const mnemonic = wallet.mnemonic;\n if (!mnemonic) {\n throw new Error('Failed to generate mnemonic');\n }\n return mnemonic.phrase;\n }\n\n /**\n * Generate a new BIP-39 seed phrase using Tether WDK (via API in browser)\n * This is the recommended method for generating seed phrases\n */\n async generateSeedWithWdk(): Promise<string> {\n return await this.wdkService.generateSeed();\n }\n\n /**\n * Validate seed phrase using WDK (async, more accurate)\n */\n async validateSeedWithWdk(seed: string): Promise<boolean> {\n return await this.wdkService.validateSeed(seed);\n }\n\n /**\n * Validate a BIP-39 seed phrase\n */\n static validateSeed(seed: string): boolean {\n return KeyManager.validateSeedPhrase(seed);\n }\n\n /**\n * Derive Ethereum address from seed phrase using BIP-44 path\n * Path: m/44'/60'/0'/0/0\n */\n static deriveAddress(seed: string): string {\n const hdNode = HDNodeWallet.fromPhrase(seed, undefined, \"m/44'/60'/0'/0/0\");\n return hdNode.address;\n }\n\n /**\n * Get the HDNodeWallet for signing transactions\n */\n static getWallet(seed: string): HDNodeWallet {\n return HDNodeWallet.fromPhrase(seed, undefined, \"m/44'/60'/0'/0/0\");\n }\n\n /**\n * Initialize storage with password (required for web platform)\n */\n async initializeStorage(password: string): Promise<void> {\n if (this.storage instanceof WebEncryptedStorageAdapter) {\n await this.storage.initialize(password);\n }\n }\n\n /**\n * Create a new wallet with generated seed\n */\n async createWallet(password: string): Promise<{ seed: string; address: string }> {\n const seed = WalletManager.generateSeed();\n const address = WalletManager.deriveAddress(seed);\n\n // Encrypt and store seed\n const encrypted = await KeyManager.encryptSeed(seed, password);\n await this.storage.setItem(STORAGE_KEYS.ENCRYPTED_SEED, encrypted);\n\n this.currentSeed = seed;\n this.derivedAddress = address;\n\n return { seed, address };\n }\n\n /**\n * Import an existing wallet from seed phrase\n */\n async importWallet(seed: string, password: string): Promise<{ address: string }> {\n if (!WalletManager.validateSeed(seed)) {\n throw new Error('Invalid seed phrase');\n }\n\n const address = WalletManager.deriveAddress(seed);\n\n // Encrypt and store seed\n const encrypted = await KeyManager.encryptSeed(seed, password);\n await this.storage.setItem(STORAGE_KEYS.ENCRYPTED_SEED, encrypted);\n\n this.currentSeed = seed;\n this.derivedAddress = address;\n\n return { address };\n }\n\n /**\n * Unlock wallet with password\n */\n async unlock(password: string): Promise<{ address: string }> {\n const encrypted = await this.storage.getItem(STORAGE_KEYS.ENCRYPTED_SEED);\n if (!encrypted) {\n throw new Error('No wallet found');\n }\n\n try {\n const seed = await KeyManager.decryptSeed(encrypted, password);\n const address = WalletManager.deriveAddress(seed);\n\n this.currentSeed = seed;\n this.derivedAddress = address;\n\n return { address };\n } catch {\n throw new Error('Invalid password');\n }\n }\n\n /**\n * Lock wallet (clear seed from memory)\n */\n lock(): void {\n this.currentSeed = null;\n // Keep derived address for display\n }\n\n /**\n * Check if wallet exists in storage\n */\n async hasWallet(): Promise<boolean> {\n return this.storage.hasItem(STORAGE_KEYS.ENCRYPTED_SEED);\n }\n\n /**\n * Delete wallet from storage\n */\n async deleteWallet(): Promise<void> {\n await this.storage.removeItem(STORAGE_KEYS.ENCRYPTED_SEED);\n await this.storage.removeItem(STORAGE_KEYS.DERIVED_ADDRESSES);\n this.currentSeed = null;\n this.derivedAddress = null;\n this.derivedAddresses = {};\n }\n\n /**\n * Get current wallet state\n */\n getState(): WalletState {\n return {\n isInitialized: this.derivedAddress !== null,\n isLocked: this.currentSeed === null && this.derivedAddress !== null,\n address: this.derivedAddress,\n balance: null, // Use fetchBalance for current balance\n };\n }\n\n /**\n * Get current address (if unlocked)\n */\n getAddress(): string | null {\n return this.derivedAddress;\n }\n\n /**\n * Check if wallet is unlocked\n */\n isUnlocked(): boolean {\n return this.currentSeed !== null;\n }\n\n /**\n * Get the seed phrase (only if unlocked)\n */\n getSeed(): string | null {\n return this.currentSeed;\n }\n\n /**\n * Fetch balance for current address with timeout handling\n */\n async fetchBalance(): Promise<string> {\n if (!this.derivedAddress) {\n throw new Error('Wallet not initialized');\n }\n\n const chain = this.config.network === 'mainnet' ? mainnet : sepolia;\n const client = createPublicClient({\n chain,\n transport: http(this.config.rpcUrl, {\n timeout: 15000, // 15 second timeout\n retryCount: 2,\n retryDelay: 1000,\n }),\n });\n\n try {\n const balance = await client.getBalance({\n address: this.derivedAddress as `0x${string}`,\n });\n\n return viemFormatEther(balance);\n } catch (error) {\n console.warn('Failed to fetch balance:', error);\n // Return '0' instead of throwing to not block wallet operations\n return '0';\n }\n }\n\n /**\n * Create viem public client for the current network\n */\n getPublicClient() {\n const chain = this.config.network === 'mainnet' ? mainnet : sepolia;\n return createPublicClient({\n chain,\n transport: http(this.config.rpcUrl, {\n timeout: 15000, // 15 second timeout\n retryCount: 2,\n retryDelay: 1000,\n }),\n });\n }\n\n /**\n * Get ethers wallet for signing (only if unlocked)\n */\n getEthersWallet(): HDNodeWallet | null {\n if (!this.currentSeed) return null;\n return WalletManager.getWallet(this.currentSeed);\n }\n\n /**\n * Set active wallet preference\n */\n async setActiveWalletPreference(wallet: 'metamask' | 'wdk'): Promise<void> {\n await this.storage.setItem(STORAGE_KEYS.ACTIVE_WALLET, wallet);\n }\n\n /**\n * Get active wallet preference\n */\n async getActiveWalletPreference(): Promise<'metamask' | 'wdk'> {\n const stored = await this.storage.getItem(STORAGE_KEYS.ACTIVE_WALLET);\n return (stored === 'metamask' || stored === 'wdk') ? stored : 'metamask';\n }\n\n // ==========================================\n // Multi-Chain Support Methods (Powered by Tether WDK)\n // ==========================================\n\n /**\n * Derive address for a specific chain (async version)\n *\n * Uses the unified WDK service which:\n * - In browser: Calls the backend API (which has Tether WDK)\n * - In Node.js: Uses native WDK\n *\n * No fallback to placeholder addresses - WDK API is required for real addresses.\n */\n static async deriveAddressForChainAsync(\n seed: string,\n chain: NetworkType,\n network: 'mainnet' | 'testnet' = 'testnet',\n apiUrl?: string\n ): Promise<string> {\n // For Ethereum, we can derive locally as fallback\n if (chain === 'ethereum') {\n try {\n const wdkService = getZubariWdkService({ network, apiUrl });\n const result = await wdkService.deriveAddress(seed, chain);\n return result.address;\n } catch (error) {\n console.warn('WDK service failed for Ethereum, using local derivation:', error);\n return WalletManager.deriveAddressForChain(seed, 'ethereum');\n }\n }\n\n // For all other chains, WDK API is required\n const wdkService = getZubariWdkService({ network, apiUrl });\n const result = await wdkService.deriveAddress(seed, chain as 'bitcoin' | 'ton' | 'tron' | 'solana' | 'spark');\n return result.address;\n }\n\n /**\n * Derive address for a specific chain (sync version)\n * Only supports Ethereum - for other chains use deriveAddressForChainAsync with WDK API\n *\n * @throws Error for non-Ethereum chains - use WDK API instead\n */\n static deriveAddressForChain(seed: string, chain: NetworkType): string {\n if (chain === 'ethereum') {\n const ethPath = DERIVATION_PATHS['ethereum'];\n const ethNode = HDNodeWallet.fromPhrase(seed, undefined, `${ethPath}/0`);\n return ethNode.address;\n }\n\n // For non-Ethereum chains, throw error - must use WDK API\n throw new Error(\n `Sync derivation not supported for ${chain}. Use deriveAddressForChainAsync() with WDK API.`\n );\n }\n\n /**\n * Derive addresses for all enabled chains (sync version)\n * Only derives Ethereum address synchronously - use deriveAllAddressesAsync for all chains\n */\n deriveAllAddresses(): Partial<MultiChainAddresses> {\n if (!this.currentSeed) {\n throw new Error('Wallet is locked');\n }\n\n // Only derive Ethereum synchronously - other chains require WDK API\n const addresses: Partial<MultiChainAddresses> = {\n ethereum: WalletManager.deriveAddressForChain(this.currentSeed, 'ethereum'),\n };\n\n this.derivedAddresses = addresses;\n return addresses;\n }\n\n /**\n * Derive addresses for all enabled chains using Tether WDK\n * In browser: Uses the backend API (which has Tether WDK)\n * In Node.js: Uses native WDK directly\n * Returns REAL cryptographically valid addresses for all chains.\n * Addresses are persisted to storage for future use.\n */\n async deriveAllAddressesWithWdk(): Promise<Partial<MultiChainAddresses>> {\n if (!this.currentSeed) {\n throw new Error('Wallet is locked');\n }\n\n try {\n // Use the unified WDK service (handles browser/Node.js automatically)\n const wdkAddresses = await this.wdkService.deriveAllAddresses(this.currentSeed);\n\n // Filter to only enabled chains\n const enabledChainsSet = new Set(this.config.enabledChains);\n const addresses: Partial<MultiChainAddresses> = {};\n for (const [chain, address] of Object.entries(wdkAddresses)) {\n if (enabledChainsSet.has(chain as NetworkType) && address) {\n addresses[chain as NetworkType] = address;\n }\n }\n\n this.derivedAddresses = addresses;\n\n // Persist addresses to storage for future use\n await this.saveAddressesToStorage(addresses);\n\n return addresses;\n } catch (error) {\n console.error('WDK derivation failed:', error);\n throw error;\n }\n }\n\n /**\n * Save derived addresses to storage\n */\n private async saveAddressesToStorage(addresses: Partial<MultiChainAddresses>): Promise<void> {\n try {\n await this.storage.setItem(STORAGE_KEYS.DERIVED_ADDRESSES, JSON.stringify(addresses));\n console.log('Saved derived addresses to storage:', Object.keys(addresses));\n } catch (error) {\n console.warn('Failed to save addresses to storage:', error);\n }\n }\n\n /**\n * Normalize an address value - extract string from object format if needed\n * Handles both string addresses and object format {chain, address, path}\n */\n private normalizeAddress(value: unknown): string | null {\n if (typeof value === 'string') {\n return value;\n }\n if (value && typeof value === 'object' && 'address' in value) {\n const addr = (value as { address: unknown }).address;\n return typeof addr === 'string' ? addr : null;\n }\n return null;\n }\n\n /**\n * Normalize all addresses in an object - extract strings from object format\n */\n private normalizeAddresses(addresses: Record<string, unknown>): Partial<MultiChainAddresses> {\n const normalized: Partial<MultiChainAddresses> = {};\n for (const [chain, value] of Object.entries(addresses)) {\n const addr = this.normalizeAddress(value);\n if (addr) {\n normalized[chain as NetworkType] = addr;\n }\n }\n return normalized;\n }\n\n /**\n * Load derived addresses from storage\n */\n private async loadAddressesFromStorage(): Promise<Partial<MultiChainAddresses> | null> {\n try {\n const stored = await this.storage.getItem(STORAGE_KEYS.DERIVED_ADDRESSES);\n if (stored) {\n const rawAddresses = JSON.parse(stored) as Record<string, unknown>;\n console.log('[WalletManager] Raw addresses from storage:', rawAddresses);\n // Normalize addresses - they might be objects {chain, address, path} or strings\n const addresses = this.normalizeAddresses(rawAddresses);\n console.log('[WalletManager] Normalized addresses:', addresses);\n\n // Save normalized addresses back to storage to fix corrupted data\n await this.saveAddressesToStorage(addresses);\n\n return addresses;\n }\n } catch (error) {\n console.warn('Failed to load addresses from storage:', error);\n }\n return null;\n }\n\n /**\n * Derive addresses for all enabled chains using Tether WDK\n *\n * Uses the WDK API backend for real cryptographically valid addresses.\n * First tries to load from storage to avoid losing previously derived addresses.\n *\n * @throws Error if WDK API is unavailable and no cached addresses exist\n */\n async deriveAllAddressesAsync(): Promise<Partial<MultiChainAddresses>> {\n if (!this.currentSeed) {\n throw new Error('Wallet is locked');\n }\n\n // First, try to load addresses from storage\n // This preserves real WDK-derived addresses even if WDK service is temporarily unavailable\n const storedAddresses = await this.loadAddressesFromStorage();\n if (storedAddresses && Object.keys(storedAddresses).length > 1) {\n // Verify the stored Ethereum address matches the current seed\n const expectedEthAddress = WalletManager.deriveAddress(this.currentSeed);\n if (storedAddresses.ethereum === expectedEthAddress) {\n console.log('Using addresses from storage (verified by Ethereum address)');\n this.derivedAddresses = storedAddresses;\n return storedAddresses;\n } else {\n console.log('Stored addresses do not match current seed, re-deriving...');\n }\n }\n\n // Use WDK API to derive all addresses - no placeholder fallback\n return await this.deriveAllAddressesWithWdk();\n }\n\n /**\n * Get address for a specific chain\n * Returns cached address or null - use deriveAllAddressesAsync to derive addresses\n */\n getAddressForChain(chain: NetworkType): string | null {\n // Return cached address if available (normalize in case it's an object)\n const cachedValue = this.derivedAddresses[chain];\n if (cachedValue) {\n console.log(`[WalletManager] getAddressForChain(${chain}) cached value:`, cachedValue, 'type:', typeof cachedValue);\n const addr = this.normalizeAddress(cachedValue);\n console.log(`[WalletManager] getAddressForChain(${chain}) normalized:`, addr);\n if (addr) {\n // Update cache with normalized string\n (this.derivedAddresses as Record<string, string>)[chain] = addr;\n return addr;\n }\n }\n\n // For Ethereum, we can derive synchronously if unlocked\n if (chain === 'ethereum' && this.currentSeed) {\n this.derivedAddresses[chain] = WalletManager.deriveAddressForChain(this.currentSeed, chain);\n return this.derivedAddresses[chain];\n }\n\n // For other chains, return null - must use deriveAllAddressesAsync first\n return null;\n }\n\n /**\n * Get all derived addresses\n */\n getAllAddresses(): Partial<MultiChainAddresses> {\n // Normalize all addresses before returning\n return this.normalizeAddresses(this.derivedAddresses);\n }\n\n /**\n * Set the selected chain\n */\n setSelectedChain(chain: NetworkType): void {\n if (!this.config.enabledChains.includes(chain)) {\n throw new Error(`Chain ${chain} is not enabled`);\n }\n this.selectedChain = chain;\n }\n\n /**\n * Get the currently selected chain\n */\n getSelectedChain(): NetworkType {\n return this.selectedChain;\n }\n\n /**\n * Get enabled chains\n */\n getEnabledChains(): NetworkType[] {\n return [...this.config.enabledChains];\n }\n\n /**\n * Get chain configuration\n */\n getChainConfig(chain: NetworkType): NetworkConfig {\n return getNetworkConfig(chain, this.config.network === 'testnet');\n }\n\n /**\n * Fetch balance for a specific chain\n * Note: Currently only Ethereum is implemented\n */\n async fetchBalanceForChain(chain: NetworkType): Promise<ChainBalance> {\n const address = this.getAddressForChain(chain);\n if (!address) {\n throw new Error(`No address for chain ${chain}`);\n }\n\n const networkConfig = this.getChainConfig(chain);\n let balance = '0';\n\n // Fetch balance based on chain type\n if (chain === 'ethereum') {\n const viemChain = this.config.network === 'mainnet' ? mainnet : sepolia;\n console.log(`[WalletManager] Fetching ${chain} balance for ${address} using RPC: ${this.config.rpcUrl}`);\n\n const client = createPublicClient({\n chain: viemChain,\n transport: http(this.config.rpcUrl, {\n timeout: 15000, // 15 second timeout\n retryCount: 2,\n retryDelay: 1000,\n }),\n });\n\n try {\n const rawBalance = await client.getBalance({\n address: address as `0x${string}`,\n });\n balance = viemFormatEther(rawBalance);\n console.log(`[WalletManager] ${chain} balance fetched: ${balance} (raw: ${rawBalance})`);\n } catch (error) {\n console.error(`[WalletManager] Failed to fetch ${chain} balance from ${this.config.rpcUrl}:`, error);\n // Balance remains '0' on error\n }\n } else if (chain === 'bitcoin') {\n // Bitcoin: Use mempool.space API (more reliable, supports multiple testnets)\n // For testnet addresses, try both testnet3 and testnet4 since they use the same prefix\n const isMainnet = this.config.network === 'mainnet' || address.startsWith('bc1') || address.startsWith('1') || address.startsWith('3');\n\n // List of APIs to try (in order)\n const apisToTry: string[] = isMainnet\n ? ['https://mempool.space/api']\n : [\n 'https://mempool.space/testnet/api', // testnet3 first (more common)\n 'https://mempool.space/testnet4/api', // then testnet4\n ];\n\n for (const apiUrl of apisToTry) {\n try {\n const response = await fetch(`${apiUrl}/address/${address}`, {\n headers: { 'Accept': 'application/json' },\n });\n\n if (response.ok) {\n const data = await response.json();\n\n // Check if this address has any transactions on this network\n const txCount = (data.chain_stats?.tx_count || 0) + (data.mempool_stats?.tx_count || 0);\n\n if (txCount > 0 || isMainnet) {\n // Found transactions or mainnet - use this data\n const chainFunded = data.chain_stats?.funded_txo_sum || 0;\n const chainSpent = data.chain_stats?.spent_txo_sum || 0;\n const mempoolFunded = data.mempool_stats?.funded_txo_sum || 0;\n const mempoolSpent = data.mempool_stats?.spent_txo_sum || 0;\n\n // Total balance in satoshis\n const satoshis = (chainFunded - chainSpent) + (mempoolFunded - mempoolSpent);\n // Convert to BTC (1 BTC = 100,000,000 satoshis)\n balance = (satoshis / 100_000_000).toFixed(8);\n console.log(`Bitcoin balance for ${address}: ${balance} BTC (${satoshis} sats) via ${apiUrl}`);\n break; // Found balance, stop trying other APIs\n }\n // No transactions found, try next API\n console.log(`No transactions found on ${apiUrl}, trying next...`);\n }\n } catch (error) {\n console.warn(`Failed to fetch from ${apiUrl}:`, error);\n // Continue to next API\n }\n }\n } else if (chain === 'solana') {\n // Solana: Use public RPC API\n const rpcUrl = this.config.network === 'mainnet'\n ? 'https://api.mainnet-beta.solana.com'\n : 'https://api.devnet.solana.com';\n\n try {\n const response = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getBalance',\n params: [address],\n }),\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.result?.value !== undefined) {\n // Convert lamports to SOL (1 SOL = 1,000,000,000 lamports)\n balance = (data.result.value / 1_000_000_000).toFixed(9);\n }\n }\n } catch (error) {\n console.warn(`Failed to fetch ${chain} balance:`, error);\n }\n } else if (chain === 'tron') {\n // TRON: Use TronGrid API\n const baseUrl = this.config.network === 'mainnet'\n ? 'https://api.trongrid.io'\n : 'https://api.shasta.trongrid.io';\n\n try {\n const response = await fetch(`${baseUrl}/v1/accounts/${address}`, {\n headers: { 'Accept': 'application/json' },\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.data?.[0]?.balance !== undefined) {\n // Balance is in SUN (1 TRX = 1,000,000 SUN)\n balance = (data.data[0].balance / 1_000_000).toFixed(6);\n }\n }\n } catch (error) {\n console.warn(`Failed to fetch ${chain} balance:`, error);\n }\n } else if (chain === 'ton') {\n // TON: Use toncenter API\n const baseUrl = this.config.network === 'mainnet'\n ? 'https://toncenter.com/api/v2'\n : 'https://testnet.toncenter.com/api/v2';\n\n try {\n const response = await fetch(`${baseUrl}/getAddressBalance?address=${address}`, {\n headers: { 'Accept': 'application/json' },\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.ok && data.result !== undefined) {\n // Balance is in nanotons (1 TON = 1,000,000,000 nanotons)\n const nanotons = BigInt(data.result);\n balance = (Number(nanotons) / 1_000_000_000).toFixed(9);\n console.log(`TON balance for ${address}: ${balance} TON`);\n }\n }\n } catch (error) {\n console.warn(`Failed to fetch ${chain} balance:`, error);\n }\n } else if (chain === 'spark') {\n // Spark (Lightning): Balance fetching via Spark SDK\n // Note: Spark operates on Lightning Network with channels\n // For now, we try to get balance via the API if available\n try {\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/balance`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n chain: 'spark',\n address,\n network: this.config.network,\n }),\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.balance !== undefined) {\n // Balance in satoshis, convert to BTC\n balance = (parseFloat(data.balance) / 100_000_000).toFixed(8);\n console.log(`Spark balance for ${address}: ${balance} BTC`);\n }\n }\n } catch (error) {\n console.warn(`Failed to fetch ${chain} balance:`, error);\n // Balance remains '0' on error\n }\n }\n\n // Fetch USD price for this chain\n const priceUsd = await getPriceForChain(chain);\n const balanceNum = parseFloat(balance) || 0;\n const balanceUsd = balanceNum * priceUsd;\n\n return {\n chain,\n symbol: networkConfig.nativeCurrency.symbol,\n balance,\n balanceUsd,\n address,\n decimals: networkConfig.nativeCurrency.decimals,\n };\n }\n\n /**\n * Fetch balances for all enabled chains\n */\n async fetchAllBalances(): Promise<ChainBalance[]> {\n const balances: ChainBalance[] = [];\n\n for (const chain of this.config.enabledChains) {\n try {\n const balance = await this.fetchBalanceForChain(chain);\n balances.push(balance);\n } catch (error) {\n console.error(`Failed to fetch balance for ${chain}:`, error);\n // Add placeholder balance on error\n const networkConfig = this.getChainConfig(chain);\n balances.push({\n chain,\n symbol: networkConfig.nativeCurrency.symbol,\n balance: '0',\n balanceUsd: 0,\n address: this.getAddressForChain(chain) || '',\n decimals: networkConfig.nativeCurrency.decimals,\n });\n }\n }\n\n return balances;\n }\n\n /**\n * Get extended wallet state with multi-chain info\n */\n getExtendedState(): WalletState {\n return {\n isInitialized: this.derivedAddress !== null,\n isLocked: this.currentSeed === null && this.derivedAddress !== null,\n address: this.derivedAddress,\n balance: null,\n addresses: this.derivedAddresses,\n selectedChain: this.selectedChain,\n };\n }\n\n /**\n * Send a transaction using Tether WDK\n * Supports native tokens and USDT on all chains\n *\n * @param chain - Target blockchain (ethereum, bitcoin, ton, tron, solana, spark)\n * @param to - Recipient address\n * @param amount - Amount to send (in human-readable format)\n * @param token - Optional token symbol (e.g., 'USDT' for stablecoins)\n * @returns Transaction result with hash and status\n */\n async sendTransaction(\n chain: NetworkType,\n to: string,\n amount: string,\n token?: string\n ): Promise<{\n success: boolean;\n txHash?: string;\n from?: string;\n to?: string;\n amount?: string;\n chain?: NetworkType;\n error?: string;\n }> {\n if (!this.currentSeed) {\n return { success: false, error: 'Wallet is locked' };\n }\n\n const fromAddress = this.getAddressForChain(chain);\n if (!fromAddress) {\n return { success: false, error: `No address for chain ${chain}` };\n }\n\n try {\n // Use WDK service to send transaction via backend\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/send`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n seed: this.currentSeed,\n chain,\n to,\n amount,\n token,\n network: this.config.network,\n }),\n });\n\n if (response.ok) {\n const data = await response.json();\n console.log(`Transaction sent on ${chain}:`, data);\n\n // Extract and validate transaction hash\n let txHash = data.txHash || data.transactionHash || data.hash;\n\n // Handle case where txHash might be an object\n if (txHash && typeof txHash === 'object' && 'hash' in txHash) {\n txHash = txHash.hash;\n }\n\n // Validate Ethereum tx hash format (should be 66 chars: 0x + 64 hex)\n if (chain === 'ethereum' && txHash && (typeof txHash !== 'string' || !txHash.startsWith('0x') || txHash.length !== 66)) {\n console.warn(`Invalid Ethereum tx hash format: ${txHash} (length: ${txHash?.length}, expected: 66)`);\n }\n\n return {\n success: data.success,\n txHash,\n from: fromAddress,\n to,\n amount,\n chain,\n };\n }\n\n const errorData = await response.json().catch(() => ({}));\n return {\n success: false,\n error: errorData.error || `HTTP ${response.status}`,\n };\n } catch (error) {\n console.error(`Transaction failed on ${chain}:`, error);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Transaction failed',\n };\n }\n }\n\n /**\n * Estimate transaction fee using Tether WDK\n */\n async estimateFee(\n chain: NetworkType,\n to: string,\n amount: string,\n token?: string\n ): Promise<{\n success: boolean;\n fee?: string;\n feeUsd?: number;\n error?: string;\n }> {\n try {\n const response = await fetch(`${this.config.apiUrl}/api/wallets/wdk/estimate-fee`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n chain,\n to,\n amount,\n token,\n network: this.config.network,\n }),\n });\n\n if (response.ok) {\n const data = await response.json();\n return {\n success: true,\n fee: data.fee,\n feeUsd: data.feeUsd,\n };\n }\n\n return { success: false, error: 'Failed to estimate fee' };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Fee estimation failed',\n };\n }\n }\n}\n","/**\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","import type {\n NFTMetadata,\n LazyMintVoucher,\n NFT,\n ListingParams,\n TxResult,\n CreateVoucherParams,\n NFTCurrency,\n} from '../types';\nimport {\n PLATFORM_CONFIG,\n NFT_VOUCHER_DOMAIN,\n NFT_VOUCHER_TYPES,\n CURRENCY_ADDRESSES,\n ZERO_ADDRESS,\n} from '../config/contracts';\nimport { getZubariApiClient, ZubariApiClient } from '../services/ZubariApiClient';\n\n/**\n * ZubariNFTProtocol - NFT creation and marketplace operations\n *\n * Handles lazy minting via EIP-712 signatures, NFT listing,\n * and marketplace operations on Ethereum network.\n */\nexport class ZubariNFTProtocol {\n private readonly contractAddress: string;\n private readonly _marketplaceAddress: string;\n private readonly chainId: number;\n private readonly network: 'testnet' | 'mainnet';\n private readonly apiClient: ZubariApiClient;\n private nonceCounter: number = 0;\n\n constructor(\n contractAddress: string,\n marketplaceAddress: string,\n chainId: number,\n network: 'testnet' | 'mainnet' = 'testnet',\n apiUrl?: string\n ) {\n this.contractAddress = contractAddress;\n this._marketplaceAddress = marketplaceAddress;\n this.chainId = chainId;\n this.network = network;\n this.apiClient = getZubariApiClient(apiUrl ? { baseUrl: apiUrl } : undefined);\n }\n\n /**\n * Convert human-readable price to wei\n * @param price - Price in human-readable format (e.g., \"1.5\")\n * @param currency - ETH (18 decimals) or USDT (6 decimals)\n */\n private priceToWei(price: string, currency: NFTCurrency): string {\n const decimals = currency === 'ETH' ? 18 : 6;\n const [whole, fraction = ''] = price.split('.');\n const paddedFraction = fraction.padEnd(decimals, '0').slice(0, decimals);\n const wei = whole + paddedFraction;\n // Remove leading zeros but keep at least one digit\n return wei.replace(/^0+/, '') || '0';\n }\n\n /**\n * Get currency address for the configured network\n */\n private getCurrencyAddress(currency: NFTCurrency): string {\n return CURRENCY_ADDRESSES[this.network][currency];\n }\n\n /**\n * Generate a unique nonce\n */\n private generateNonce(): number {\n return Date.now() * 1000 + this.nonceCounter++;\n }\n\n /**\n * Pad string to bytes32 format\n */\n private toBytes32(value: string): string {\n if (value.startsWith('0x')) {\n return value.padEnd(66, '0');\n }\n // Convert string to hex and pad\n const hex = Buffer.from(value).toString('hex');\n return '0x' + hex.padEnd(64, '0');\n }\n\n /**\n * Create a lazy mint voucher for off-chain NFT creation\n * The voucher can be redeemed on-chain when purchased\n *\n * @param params - Voucher creation parameters\n * @param signer - Object with signTypedData method (ethers.js wallet or viem client)\n */\n async createLazyMintVoucher(\n params: CreateVoucherParams,\n signer: { signTypedData: (domain: object, types: object, value: object) => Promise<string> }\n ): Promise<LazyMintVoucher> {\n const { metadata, creatorAddress, price, currency, nonce, watermarking } = params;\n\n // Ensure royaltyBps has a default value (500 = 5%)\n const royaltyBps = metadata.royaltyBps ?? 500;\n\n // Validate royalty\n if (royaltyBps > PLATFORM_CONFIG.maxRoyaltyBps) {\n throw new Error(`Royalty cannot exceed ${PLATFORM_CONFIG.maxRoyaltyBps / 100}%`);\n }\n\n // Validate price\n if (!price || parseFloat(price) <= 0) {\n throw new Error('Price must be greater than 0');\n }\n\n // Generate random tokenId\n const tokenId = this.generateTokenId();\n\n // Calculate deadline (30 days from now)\n const deadline = Math.floor(Date.now() / 1000) + PLATFORM_CONFIG.voucherValiditySecs;\n\n // Convert price to wei\n const priceInWei = this.priceToWei(price, currency);\n\n // Get currency address\n const currencyAddress = this.getCurrencyAddress(currency);\n\n // Generate or use provided nonce\n const voucherNonce = nonce ?? this.generateNonce();\n\n // Prepare watermarking data (use zero values if not provided)\n const watermarkTimestamp = watermarking ? Math.floor(Date.now() / 1000) : 0;\n const contentHash = watermarking ? this.toBytes32(watermarking.contentHash) : ZERO_ADDRESS.replace('0x', '0x' + '0'.repeat(64)).slice(0, 66);\n const userId = watermarking ? this.toBytes32(watermarking.userId) : ZERO_ADDRESS.replace('0x', '0x' + '0'.repeat(64)).slice(0, 66);\n const sessionId = watermarking ? this.toBytes32(watermarking.sessionId) : ZERO_ADDRESS.replace('0x', '0x' + '0'.repeat(64)).slice(0, 66);\n\n // Build voucher data for signing\n const voucherData = {\n tokenId,\n uri: metadata.image, // Will be IPFS URI\n creator: creatorAddress,\n royaltyBps, // Use the validated/defaulted value\n deadline,\n price: priceInWei,\n currency: currencyAddress,\n nonce: voucherNonce,\n contentHash,\n userId,\n watermarkTimestamp,\n sessionId,\n };\n\n // Create EIP-712 domain\n const domain = {\n ...NFT_VOUCHER_DOMAIN,\n chainId: this.chainId,\n verifyingContract: this.contractAddress,\n };\n\n // Sign the voucher\n const signature = await signer.signTypedData(domain, NFT_VOUCHER_TYPES, voucherData);\n\n return {\n tokenId,\n uri: metadata.image,\n creator: creatorAddress,\n royaltyBps, // Use the validated/defaulted value\n deadline,\n signature,\n price: priceInWei,\n currency: currencyAddress,\n nonce: voucherNonce,\n contentHash: watermarking ? contentHash : undefined,\n userId: watermarking ? userId : undefined,\n watermarkTimestamp: watermarking ? watermarkTimestamp : undefined,\n sessionId: watermarking ? sessionId : undefined,\n };\n }\n\n /**\n * @deprecated Use createLazyMintVoucher(params, signer) instead\n * Legacy method for backward compatibility\n */\n async createLazyMintVoucherLegacy(\n metadata: NFTMetadata,\n creatorAddress: string,\n signer: { signTypedData: (domain: object, types: object, value: object) => Promise<string> }\n ): Promise<LazyMintVoucher> {\n // Default to 0.01 ETH for legacy calls\n return this.createLazyMintVoucher(\n {\n metadata,\n creatorAddress,\n price: '0.01',\n currency: 'ETH',\n },\n signer\n );\n }\n\n /**\n * Redeem a lazy mint voucher to mint the NFT on-chain\n * Uses the backend API which handles the on-chain transaction\n */\n async redeemVoucher(\n voucher: LazyMintVoucher,\n buyerAddress: string,\n nftId: string,\n authToken: string\n ): Promise<TxResult> {\n // Validate voucher deadline\n if (voucher.deadline < Math.floor(Date.now() / 1000)) {\n throw new Error('Voucher has expired');\n }\n\n try {\n const result = await this.apiClient.redeemVoucher(nftId, {\n buyerAddress,\n });\n\n if (result.success && result.transactionHash) {\n return {\n hash: result.transactionHash,\n network: 'ethereum',\n status: 'pending',\n metadata: {\n nftId: result.nftId,\n tokenId: voucher.tokenId,\n buyer: buyerAddress,\n },\n };\n }\n\n throw new Error(result.error || 'Failed to redeem voucher');\n } catch (error) {\n console.error('Failed to redeem voucher:', error);\n throw new Error(`Voucher redemption failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * List an NFT for sale on the marketplace via backend API\n */\n async listForSale(params: ListingParams, authToken: string): Promise<TxResult> {\n try {\n // Map paymentToken to currency\n const currency: NFTCurrency = params.paymentToken === ZERO_ADDRESS ? 'ETH' : 'USDT';\n\n const result = await this.apiClient.listItem({\n nftId: params.tokenId, // Using tokenId as nftId\n price: params.price.toString(),\n currency,\n duration: params.duration || 30 * 24 * 60 * 60, // 30 days default\n });\n\n if (result.success && result.listing) {\n return {\n hash: result.listing.id || '',\n network: 'ethereum',\n status: 'pending',\n metadata: {\n listingId: result.listing.id,\n price: params.price.toString(),\n tokenId: params.tokenId,\n },\n };\n }\n\n throw new Error(result.error || 'Failed to list NFT');\n } catch (error) {\n console.error('Failed to list NFT:', error);\n throw new Error(`Listing failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Buy an NFT from the marketplace via backend API\n */\n async buyNFT(listingId: string, price: bigint, buyerAddress: string): Promise<TxResult> {\n try {\n const result = await this.apiClient.buyItem({\n listingId,\n buyerAddress,\n });\n\n if (result.success && result.transactionHash) {\n return {\n hash: result.transactionHash,\n network: 'ethereum',\n status: 'pending',\n metadata: {\n listingId,\n price: price.toString(),\n buyer: buyerAddress,\n },\n };\n }\n\n throw new Error(result.error || 'Failed to buy NFT');\n } catch (error) {\n console.error('Failed to buy NFT:', error);\n throw new Error(`Purchase failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Transfer an NFT to another address\n * Note: This requires direct contract interaction via wallet\n */\n async transfer(\n tokenId: string,\n to: string,\n from: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n try {\n // Build transfer transaction data\n // ERC721 transferFrom(address from, address to, uint256 tokenId)\n const functionSelector = '0x23b872dd'; // transferFrom selector\n const encodedFrom = from.toLowerCase().replace('0x', '').padStart(64, '0');\n const encodedTo = to.toLowerCase().replace('0x', '').padStart(64, '0');\n const encodedTokenId = BigInt(tokenId).toString(16).padStart(64, '0');\n\n const data = `${functionSelector}${encodedFrom}${encodedTo}${encodedTokenId}`;\n\n const tx = await signer.sendTransaction({\n to: this.contractAddress,\n data,\n value: '0x0',\n });\n\n return {\n hash: tx.hash,\n network: 'ethereum',\n status: 'pending',\n metadata: {\n tokenId,\n from,\n to,\n },\n };\n } catch (error) {\n console.error('Failed to transfer NFT:', error);\n throw new Error(`Transfer failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Get NFTs owned by an address via backend API\n */\n async getOwnedNFTs(address: string): Promise<NFT[]> {\n try {\n const result = await this.apiClient.getNFTs({ ownerId: address });\n\n if (result.success && result.nfts) {\n return result.nfts.map(nft => ({\n tokenId: nft.tokenId || nft.id,\n contractAddress: nft.contractAddress || this.contractAddress,\n owner: nft.ownerId || address,\n creator: nft.creatorId || '',\n uri: nft.imageUrl || nft.animationUrl || '',\n metadata: nft.name ? {\n name: nft.name,\n description: nft.description || '',\n image: nft.imageUrl || '',\n royaltyBps: 0, // Default royalty, actual value from contract\n } : undefined,\n isLazyMinted: !nft.tokenId, // If no tokenId, it's lazy minted\n }));\n }\n\n return [];\n } catch (error) {\n console.error('Failed to get owned NFTs:', error);\n return [];\n }\n }\n\n /**\n * Generate a random tokenId (32 bytes hex)\n */\n private generateTokenId(): string {\n const bytes = new Uint8Array(32);\n crypto.getRandomValues(bytes);\n return '0x' + Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\n }\n}\n","[\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_treasury\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"_platformFeeBps\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [],\n \"name\": \"EnforcedPause\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ExpectedPause\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InsufficientPayment\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidAddress\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidDuration\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidFee\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidPrice\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ListingExpired\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ListingNotActive\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"NotApproved\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"NotSeller\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"NotTokenOwner\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableInvalidOwner\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableUnauthorizedAccount\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ReentrancyGuardReentrantCall\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"SafeERC20FailedOperation\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"TransferFailed\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"UnsupportedPaymentToken\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"nftContract\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"tokenId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"seller\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"expiresAt\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Listed\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"ListingCancelled\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newPrice\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"ListingUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"previousOwner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnershipTransferred\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Paused\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bool\",\n \"name\": \"supported\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"PaymentTokenUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"buyer\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"royaltyAmount\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"platformFee\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Sale\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Unpaused\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"buyItem\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"cancelListing\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getListing\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"nftContract\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"tokenId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"seller\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"expiresAt\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isActive\",\n \"type\": \"bool\"\n }\n ],\n \"internalType\": \"struct ZubariMarket.Listing\",\n \"name\": \"\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"isListingValid\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"nftContract\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"tokenId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"duration\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"listItem\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"listingCounter\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"listings\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"nftContract\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"tokenId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"seller\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"expiresAt\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isActive\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"owner\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"pause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"paused\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"platformFeeBps\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"renounceOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"_feeBps\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"setPlatformFee\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"supported\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"setSupportedToken\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_treasury\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"setTreasury\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"supportedTokens\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"tokenListings\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"transferOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"treasury\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"unpause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"newPrice\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"updatePrice\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n]","import type {\n ListingParams,\n Listing,\n BuyParams,\n TxResult,\n} from '../types';\nimport { PLATFORM_CONFIG } from '../config/contracts';\n\n// Import ABI\nimport ZubariMarketAbi from '../abi/ZubariMarket.json';\n\n/**\n * ZubariMarketProtocol - NFT Marketplace operations\n *\n * Handles NFT listings, purchases, and marketplace management\n * with support for ETH and ERC-20 payment tokens.\n */\nexport class ZubariMarketProtocol {\n private readonly contractAddress: string;\n private readonly chainId: number;\n private readonly abi = ZubariMarketAbi;\n\n constructor(contractAddress: string, chainId: number) {\n this.contractAddress = contractAddress;\n this.chainId = chainId;\n }\n\n /**\n * Get the contract ABI\n */\n getAbi() {\n return this.abi;\n }\n\n /**\n * Get the contract address\n */\n getAddress(): string {\n return this.contractAddress;\n }\n\n /**\n * List an NFT for sale\n * @param params Listing parameters\n * @param signer Wallet signer with sendTransaction method\n */\n async listItem(\n params: ListingParams,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n // Validate price\n if (params.price <= 0n) {\n throw new Error('Price must be greater than 0');\n }\n\n // Validate duration\n if (params.duration <= 0) {\n throw new Error('Duration must be greater than 0');\n }\n\n // Encode function data\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('listItem', [\n params.nftContract,\n params.tokenId,\n params.price,\n params.paymentToken,\n params.duration,\n ]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Buy an NFT from a listing\n * @param params Buy parameters\n * @param signer Wallet signer\n */\n async buyItem(\n params: BuyParams,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('buyItem', [params.listingId]);\n\n // If paying with ETH (zero address), include value\n const isEthPayment = params.paymentToken === '0x0000000000000000000000000000000000000000';\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: isEthPayment ? params.price : 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Cancel a listing\n * @param listingId The listing ID to cancel\n * @param signer Wallet signer\n */\n async cancelListing(\n listingId: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('cancelListing', [listingId]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Update listing price\n * @param listingId The listing ID\n * @param newPrice New price\n * @param signer Wallet signer\n */\n async updatePrice(\n listingId: string,\n newPrice: bigint,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n if (newPrice <= 0n) {\n throw new Error('Price must be greater than 0');\n }\n\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('updatePrice', [listingId, newPrice]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Get listing details\n * @param listingId The listing ID\n * @param provider JSON-RPC provider\n */\n async getListing(\n listingId: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<Listing | null> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('getListing', [listingId]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('getListing', result);\n const listing = decoded[0];\n\n return {\n listingId,\n nftContract: listing.nftContract,\n tokenId: listing.tokenId.toString(),\n seller: listing.seller,\n price: listing.price,\n paymentToken: listing.paymentToken,\n expiresAt: Number(listing.expiresAt),\n isActive: listing.isActive,\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Check if a payment token is supported\n * @param token Token address\n * @param provider JSON-RPC provider\n */\n async isTokenSupported(\n token: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<boolean> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('supportedTokens', [token]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('supportedTokens', result);\n return decoded[0];\n } catch {\n return false;\n }\n }\n\n /**\n * Calculate platform fee for a given price\n * @param price The sale price\n */\n calculateFee(price: bigint): { fee: bigint; sellerAmount: bigint } {\n const fee = (price * BigInt(PLATFORM_CONFIG.tipFeeBps)) / 10000n;\n return {\n fee,\n sellerAmount: price - fee,\n };\n }\n}\n","[\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_treasury\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"_platformFeeBps\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [],\n \"name\": \"EnforcedPause\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ExpectedPause\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidAddress\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidAmount\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidFee\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidRecipient\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableInvalidOwner\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableUnauthorizedAccount\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ReentrancyGuardReentrantCall\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"SafeERC20FailedOperation\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"TransferFailed\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"uint256[]\",\n \"name\": \"tipIds\",\n \"type\": \"uint256[]\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"BatchTipSent\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"previousOwner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnershipTransferred\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Paused\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"oldFee\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newFee\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"PlatformFeeUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"tipId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"platformFee\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"string\",\n \"name\": \"message\",\n \"type\": \"string\"\n }\n ],\n \"name\": \"TipSent\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"oldTreasury\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"newTreasury\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"TreasuryUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Unpaused\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"tipId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getTip\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"tipId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"platformFee\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"message\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"timestamp\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct ZubariTips.Tip\",\n \"name\": \"\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"owner\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"pause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"paused\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"platformFeeBps\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"renounceOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address[]\",\n \"name\": \"recipients\",\n \"type\": \"address[]\"\n },\n {\n \"internalType\": \"uint256[]\",\n \"name\": \"amounts\",\n \"type\": \"uint256[]\"\n },\n {\n \"internalType\": \"string[]\",\n \"name\": \"messages\",\n \"type\": \"string[]\"\n }\n ],\n \"name\": \"sendBatchTips\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"_feeBps\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"setPlatformFee\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_treasury\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"setTreasury\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"tipCounter\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"message\",\n \"type\": \"string\"\n }\n ],\n \"name\": \"tipETH\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"message\",\n \"type\": \"string\"\n }\n ],\n \"name\": \"tipToken\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"tips\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"tipId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"platformFee\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"message\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"timestamp\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"totalTipsReceived\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"transferOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"treasury\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"unpause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n]","import type { Tip, TxResult } from '../types';\n\n// Import ABI\nimport ZubariTipsAbi from '../abi/ZubariTips.json';\n\n/**\n * ZubariTipsProtocol - Micropayment tips for creators\n *\n * Handles ETH and ERC-20 token tips with platform fee distribution.\n * Supports individual tips, batch tips, and tip queries.\n */\nexport class ZubariTipsProtocol {\n private readonly contractAddress: string;\n private readonly chainId: number;\n private readonly abi = ZubariTipsAbi;\n\n constructor(contractAddress: string, chainId: number) {\n this.contractAddress = contractAddress;\n this.chainId = chainId;\n }\n\n /**\n * Get the contract ABI\n */\n getAbi() {\n return this.abi;\n }\n\n /**\n * Get the contract address\n */\n getAddress(): string {\n return this.contractAddress;\n }\n\n /**\n * Send ETH tip to a creator\n * @param recipient The recipient address\n * @param message Optional tip message\n * @param signer Wallet signer with sendTransaction method\n * @param value ETH amount to tip (in wei)\n */\n async tipETH(\n recipient: string,\n message: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> },\n value: bigint\n ): Promise<TxResult> {\n if (!recipient || recipient === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid recipient address');\n }\n if (value <= 0n) {\n throw new Error('Tip amount must be greater than 0');\n }\n\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('tipETH', [recipient, message || '']);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Send ERC-20 token tip to a creator\n * @param recipient The recipient address\n * @param token The ERC-20 token address\n * @param amount The amount of tokens to tip\n * @param message Optional tip message\n * @param signer Wallet signer\n */\n async tipToken(\n recipient: string,\n token: string,\n amount: bigint,\n message: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n if (!recipient || recipient === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid recipient address');\n }\n if (!token || token === '0x0000000000000000000000000000000000000000') {\n throw new Error('Use tipETH for native ETH tips');\n }\n if (amount <= 0n) {\n throw new Error('Tip amount must be greater than 0');\n }\n\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('tipToken', [recipient, token, amount, message || '']);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Send batch tips to multiple creators in a single transaction\n * @param recipients Array of recipient addresses\n * @param amounts Array of tip amounts (in wei)\n * @param messages Array of tip messages\n * @param signer Wallet signer\n * @param value Total ETH to send\n */\n async sendBatchTips(\n recipients: string[],\n amounts: bigint[],\n messages: string[],\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> },\n value: bigint\n ): Promise<TxResult> {\n if (recipients.length === 0) {\n throw new Error('At least one recipient is required');\n }\n if (recipients.length !== amounts.length || recipients.length !== messages.length) {\n throw new Error('Recipients, amounts, and messages arrays must have the same length');\n }\n\n // Validate all recipients\n for (const recipient of recipients) {\n if (!recipient || recipient === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid recipient address in batch');\n }\n }\n\n // Calculate total amount\n const totalAmount = amounts.reduce((sum, amount) => sum + amount, 0n);\n if (totalAmount <= 0n) {\n throw new Error('Total tip amount must be greater than 0');\n }\n\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('sendBatchTips', [recipients, amounts, messages]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Get tip details by ID\n * @param tipId The tip ID\n * @param provider JSON-RPC provider\n */\n async getTip(\n tipId: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<Tip | null> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('getTip', [tipId]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('getTip', result);\n const tip = decoded[0];\n\n // Check if tip exists (tipId != 0)\n if (BigInt(tip.tipId) === 0n) {\n return null;\n }\n\n return {\n tipId: tip.tipId.toString(),\n sender: tip.sender,\n recipient: tip.recipient,\n token: tip.token,\n amount: BigInt(tip.amount),\n platformFee: BigInt(tip.platformFee),\n message: tip.message,\n timestamp: Number(tip.timestamp),\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Get total tips received by an address\n * @param address The address to query\n * @param provider JSON-RPC provider\n */\n async getTotalTipsReceived(\n address: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<bigint> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('totalTipsReceived', [address]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('totalTipsReceived', result);\n return BigInt(decoded[0]);\n } catch {\n return 0n;\n }\n }\n\n /**\n * Get platform fee in basis points\n * @param provider JSON-RPC provider\n */\n async getPlatformFeeBps(\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<number> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('platformFeeBps', []);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('platformFeeBps', result);\n return Number(decoded[0]);\n } catch {\n return 300; // Default 3%\n }\n }\n\n /**\n * Get current tip counter\n * @param provider JSON-RPC provider\n */\n async getTipCounter(\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<bigint> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('tipCounter', []);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('tipCounter', result);\n return BigInt(decoded[0]);\n } catch {\n return 0n;\n }\n }\n\n /**\n * Get treasury address\n * @param provider JSON-RPC provider\n */\n async getTreasury(\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<string> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('treasury', []);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('treasury', result);\n return decoded[0];\n } catch {\n return '0x0000000000000000000000000000000000000000';\n }\n }\n\n /**\n * Calculate platform fee for a given amount\n * @param amount The tip amount\n * @param feeBps Fee in basis points (default: 300 = 3%)\n */\n calculateFee(amount: bigint, feeBps: number = 300): { fee: bigint; creatorAmount: bigint } {\n const fee = (amount * BigInt(feeBps)) / 10000n;\n return {\n fee,\n creatorAmount: amount - fee,\n };\n }\n}\n","[\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_treasury\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"_platformFeeBps\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [],\n \"name\": \"AlreadySubscribed\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"EnforcedPause\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ExpectedPause\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidAddress\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidAmount\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidDuration\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidFee\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"NotSubscriber\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableInvalidOwner\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableUnauthorizedAccount\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"PlanFull\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"PlanNotActive\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"PlanNotFound\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ReentrancyGuardReentrantCall\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"SafeERC20FailedOperation\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"previousOwner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnershipTransferred\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Paused\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"string\",\n \"name\": \"name\",\n \"type\": \"string\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"PlanCreated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"PlanDeactivated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"PlanUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"endTime\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Subscribed\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"SubscriptionCancelled\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newEndTime\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"SubscriptionRenewed\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Unpaused\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"activeSubscription\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"cancel\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"name\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"description\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"durationDays\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"maxSubscribers\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"createPlan\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"creatorPlans\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"deactivatePlan\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"getCreatorPlans\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32[]\",\n \"name\": \"\",\n \"type\": \"bytes32[]\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPlan\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"name\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"description\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"durationDays\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"maxSubscribers\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"subscriberCount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isActive\",\n \"type\": \"bool\"\n }\n ],\n \"internalType\": \"struct ZubariSubscription.SubscriptionPlan\",\n \"name\": \"\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getSubscription\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"startTime\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"endTime\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"autoRenew\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"enum ZubariSubscription.SubscriptionStatus\",\n \"name\": \"status\",\n \"type\": \"uint8\"\n }\n ],\n \"internalType\": \"struct ZubariSubscription.Subscription\",\n \"name\": \"\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"isSubscribed\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"owner\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"pause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"paused\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"plans\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"name\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"description\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"durationDays\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"maxSubscribers\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"subscriberCount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isActive\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"platformFeeBps\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"renounceOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"autoRenew\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"setAutoRenew\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"_feeBps\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"setPlatformFee\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_treasury\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"setTreasury\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"months\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"subscribe\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"subscriberSubscriptions\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"subscriptions\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"startTime\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"endTime\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"autoRenew\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"enum ZubariSubscription.SubscriptionStatus\",\n \"name\": \"status\",\n \"type\": \"uint8\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"transferOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"treasury\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"unpause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n]","import type { SubscriptionPlan, Subscription, TxResult } from '../types';\n\n// Import ABI\nimport ZubariSubscriptionAbi from '../abi/ZubariSubscription.json';\n\n// Subscription status enum matching the contract\nenum SubscriptionStatus {\n Active = 0,\n Cancelled = 1,\n Expired = 2,\n}\n\n/**\n * ZubariSubscriptionProtocol - Recurring subscription payments\n *\n * Handles subscription plan creation, subscription management,\n * and verification of active subscriptions using the ZubariSubscription smart contract.\n */\nexport class ZubariSubscriptionProtocol {\n private readonly contractAddress: string;\n private readonly chainId: number;\n private readonly abi = ZubariSubscriptionAbi;\n\n constructor(contractAddress: string, chainId: number) {\n this.contractAddress = contractAddress;\n this.chainId = chainId;\n }\n\n /**\n * Get the contract ABI\n */\n getAbi() {\n return this.abi;\n }\n\n /**\n * Get the contract address\n */\n getAddress(): string {\n return this.contractAddress;\n }\n\n /**\n * Create a new subscription plan\n * @param plan The plan details\n * @param signer Wallet signer with sendTransaction method\n */\n async createPlan(\n plan: SubscriptionPlan,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<string> {\n // Validate plan\n if (!plan.name || plan.name.length === 0) {\n throw new Error('Plan name is required');\n }\n if (plan.price <= 0n) {\n throw new Error('Plan price must be greater than 0');\n }\n if (plan.duration <= 0) {\n throw new Error('Plan duration must be greater than 0');\n }\n\n // Encode function data\n const iface = new (await import('ethers')).Interface(this.abi);\n\n // Convert duration from seconds to days (contract expects days)\n const durationDays = Math.ceil(plan.duration / (24 * 60 * 60));\n\n const data = iface.encodeFunctionData('createPlan', [\n plan.name,\n plan.description || '',\n plan.price,\n plan.paymentToken || '0x0000000000000000000000000000000000000000', // ETH by default\n durationDays,\n plan.maxSubscribers || 0, // 0 = unlimited\n ]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n // Return tx hash - the planId will be emitted in the event\n return result.hash;\n }\n\n /**\n * Deactivate a subscription plan (only creator can do this)\n * @param planId The plan ID to deactivate\n * @param signer Wallet signer\n */\n async deactivatePlan(\n planId: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('deactivatePlan', [planId]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Subscribe to a creator's plan\n * @param planId The plan ID to subscribe to\n * @param months Number of months to subscribe\n * @param signer Wallet signer\n * @param value ETH value to send (if paying with ETH)\n */\n async subscribe(\n planId: string,\n months: number,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> },\n value?: bigint\n ): Promise<TxResult> {\n if (months <= 0) {\n throw new Error('Subscription duration must be at least 1 month');\n }\n\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('subscribe', [planId, months]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: value || 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Cancel an active subscription\n * @param subscriptionId The subscription ID to cancel\n * @param signer Wallet signer\n */\n async cancel(\n subscriptionId: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('cancel', [subscriptionId]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Set auto-renew for a subscription\n * @param subscriptionId The subscription ID\n * @param autoRenew Whether to enable auto-renew\n * @param signer Wallet signer\n */\n async setAutoRenew(\n subscriptionId: string,\n autoRenew: boolean,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('setAutoRenew', [subscriptionId, autoRenew]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Check if an address is subscribed to a creator\n * @param subscriber The subscriber address\n * @param creator The creator address\n * @param provider JSON-RPC provider\n */\n async isSubscribed(\n subscriber: string,\n creator: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<boolean> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('isSubscribed', [subscriber, creator]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('isSubscribed', result);\n return decoded[0];\n } catch {\n return false;\n }\n }\n\n /**\n * Get the active subscription ID between subscriber and creator\n * @param subscriber The subscriber address\n * @param creator The creator address\n * @param provider JSON-RPC provider\n */\n async getActiveSubscriptionId(\n subscriber: string,\n creator: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<string | null> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('activeSubscription', [subscriber, creator]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('activeSubscription', result);\n const subscriptionId = decoded[0];\n\n // bytes32(0) means no active subscription\n if (subscriptionId === '0x0000000000000000000000000000000000000000000000000000000000000000') {\n return null;\n }\n\n return subscriptionId;\n } catch {\n return null;\n }\n }\n\n /**\n * Get subscription details by ID\n * @param subscriptionId The subscription ID\n * @param provider JSON-RPC provider\n */\n async getSubscription(\n subscriptionId: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<Subscription | null> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('getSubscription', [subscriptionId]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('getSubscription', result);\n const sub = decoded[0];\n\n // Check if subscription exists (subscriptionId != 0)\n if (sub.subscriptionId === '0x0000000000000000000000000000000000000000000000000000000000000000') {\n return null;\n }\n\n // Map status enum\n let status: 'active' | 'cancelled' | 'expired';\n switch (Number(sub.status)) {\n case SubscriptionStatus.Active:\n status = 'active';\n break;\n case SubscriptionStatus.Cancelled:\n status = 'cancelled';\n break;\n case SubscriptionStatus.Expired:\n status = 'expired';\n break;\n default:\n status = 'active';\n }\n\n return {\n subscriptionId: sub.subscriptionId,\n planId: sub.planId,\n creator: sub.creator,\n subscriber: sub.subscriber,\n startTime: Number(sub.startTime),\n endTime: Number(sub.endTime),\n autoRenew: sub.autoRenew,\n status,\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Get a specific plan by ID\n * @param planId The plan ID\n * @param provider JSON-RPC provider\n */\n async getPlan(\n planId: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<SubscriptionPlan | null> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('getPlan', [planId]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('getPlan', result);\n const plan = decoded[0];\n\n // Check if plan exists (planId != 0)\n if (plan.planId === '0x0000000000000000000000000000000000000000000000000000000000000000') {\n return null;\n }\n\n // Convert duration from days to seconds\n const durationSeconds = Number(plan.durationDays) * 24 * 60 * 60;\n\n return {\n planId: plan.planId,\n name: plan.name,\n description: plan.description,\n price: plan.price,\n paymentToken: plan.paymentToken,\n duration: durationSeconds,\n perks: [], // Not stored on-chain\n maxSubscribers: Number(plan.maxSubscribers),\n nftBadge: false, // Not stored on-chain in this contract version\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Get all plan IDs for a creator\n * @param creator The creator address\n * @param provider JSON-RPC provider\n */\n async getCreatorPlanIds(\n creator: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<string[]> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('getCreatorPlans', [creator]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('getCreatorPlans', result);\n return decoded[0] as string[];\n } catch {\n return [];\n }\n }\n\n /**\n * Get all plans for a creator with full details\n * @param creator The creator address\n * @param provider JSON-RPC provider\n */\n async getCreatorPlans(\n creator: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<SubscriptionPlan[]> {\n const planIds = await this.getCreatorPlanIds(creator, provider);\n const plans: SubscriptionPlan[] = [];\n\n for (const planId of planIds) {\n const plan = await this.getPlan(planId, provider);\n if (plan && plan.planId) {\n plans.push(plan);\n }\n }\n\n return plans;\n }\n\n /**\n * Get platform fee in basis points\n * @param provider JSON-RPC provider\n */\n async getPlatformFeeBps(\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<number> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('platformFeeBps', []);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('platformFeeBps', result);\n return Number(decoded[0]);\n } catch {\n return 300; // Default 3%\n }\n }\n\n /**\n * Calculate the total cost for a subscription\n * @param planPrice The plan price per period\n * @param months Number of months\n */\n calculateSubscriptionCost(planPrice: bigint, months: number): bigint {\n return planPrice * BigInt(months);\n }\n\n /**\n * Calculate platform fee for a given amount\n * @param amount The amount\n * @param feeBps Fee in basis points\n */\n calculateFee(amount: bigint, feeBps: number = 300): { fee: bigint; creatorAmount: bigint } {\n const fee = (amount * BigInt(feeBps)) / 10000n;\n return {\n fee,\n creatorAmount: amount - fee,\n };\n }\n}\n","import type {\n EarningsBreakdown,\n EarningsResponse,\n PayoutHistoryResponse,\n BreakdownResponse,\n PlatformFeeResponse,\n ClaimResult,\n RevenueSplit,\n TxResult,\n} from '../types';\nimport { getZubariApiClient, ZubariApiClient } from '../services/ZubariApiClient';\n\n// ZubariPayouts contract function selectors\nconst PAYOUTS_SELECTORS = {\n getEarningsBreakdown: '0xd4e9329c', // getEarningsBreakdown(address)\n claimEarnings: '0x48c54b9d', // claimEarnings(address)\n claimPartialEarnings: '0x7e3bfb5a', // claimPartialEarnings(address,uint256)\n setRevenueSplit: '0x92a8e3f5', // setRevenueSplit((address,uint256)[])\n getRevenueSplit: '0x6c8a4fd0', // getRevenueSplit(address)\n removeRevenueSplit: '0x8a4e3c5b', // removeRevenueSplit()\n};\n\n/**\n * ZubariPayoutsProtocol - Creator earnings management\n *\n * Handles earnings tracking, claiming, revenue splits,\n * and conversion to stablecoins.\n */\nexport class ZubariPayoutsProtocol {\n private readonly contractAddress: string;\n private readonly chainId: number;\n private readonly apiBaseUrl: string;\n private readonly apiClient: ZubariApiClient;\n\n constructor(contractAddress: string, chainId: number, apiBaseUrl?: string) {\n this.contractAddress = contractAddress;\n this.chainId = chainId;\n this.apiBaseUrl = apiBaseUrl || 'https://ckgwifsxka.us-east-2.awsapprunner.com';\n this.apiClient = getZubariApiClient({ baseUrl: this.apiBaseUrl });\n }\n\n /**\n * Get pending earnings breakdown for the current user via API\n * Uses backend API which reads from contract/database\n */\n async getPendingEarnings(authToken: string): Promise<EarningsBreakdown> {\n try {\n const response = await this.apiClient.getEarnings();\n\n if (response.success && response.earningsBreakdown) {\n const breakdown = response.earningsBreakdown;\n return {\n tips: BigInt(breakdown.tips || '0'),\n subscriptions: BigInt(breakdown.subscriptions || '0'),\n nftSales: BigInt(breakdown.nftSales || '0'),\n royalties: BigInt(breakdown.royalties || '0'),\n total: BigInt(breakdown.tips || '0') +\n BigInt(breakdown.subscriptions || '0') +\n BigInt(breakdown.nftSales || '0') +\n BigInt(breakdown.royalties || '0'),\n };\n }\n\n return {\n tips: BigInt(0),\n subscriptions: BigInt(0),\n nftSales: BigInt(0),\n royalties: BigInt(0),\n total: BigInt(0),\n };\n } catch (error) {\n console.error('Failed to get pending earnings:', error);\n return {\n tips: BigInt(0),\n subscriptions: BigInt(0),\n nftSales: BigInt(0),\n royalties: BigInt(0),\n total: BigInt(0),\n };\n }\n }\n\n /**\n * Get earnings data from API (includes pending, total, breakdown, and recent payouts)\n * Requires authentication token\n */\n async getEarnings(authToken: string): Promise<EarningsResponse> {\n const response = await fetch(`${this.apiBaseUrl}/api/payouts/earnings`, {\n headers: {\n Authorization: `Bearer ${authToken}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || 'Failed to fetch earnings');\n }\n\n return response.json();\n }\n\n /**\n * Get payout history with pagination\n * Requires authentication token\n */\n async getPayoutHistory(\n authToken: string,\n page: number = 1,\n limit: number = 20\n ): Promise<PayoutHistoryResponse> {\n const response = await fetch(\n `${this.apiBaseUrl}/api/payouts/history?page=${page}&limit=${limit}`,\n {\n headers: {\n Authorization: `Bearer ${authToken}`,\n 'Content-Type': 'application/json',\n },\n }\n );\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || 'Failed to fetch payout history');\n }\n\n return response.json();\n }\n\n /**\n * Get earnings breakdown by source with percentages\n * Requires authentication token\n */\n async getBreakdown(authToken: string): Promise<BreakdownResponse> {\n const response = await fetch(`${this.apiBaseUrl}/api/payouts/breakdown`, {\n headers: {\n Authorization: `Bearer ${authToken}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || 'Failed to fetch earnings breakdown');\n }\n\n return response.json();\n }\n\n /**\n * Get current platform fee\n */\n async getPlatformFee(): Promise<PlatformFeeResponse> {\n const response = await fetch(`${this.apiBaseUrl}/api/payouts/platform-fee`, {\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || 'Failed to fetch platform fee');\n }\n\n return response.json();\n }\n\n /**\n * Get historical earnings for a time period via API\n */\n async getEarningsHistory(\n authToken: string,\n period: 'day' | 'week' | 'month' | 'all' = 'all'\n ): Promise<EarningsBreakdown[]> {\n try {\n const response = await this.apiClient.getPayoutHistory({\n limit: period === 'day' ? 24 : period === 'week' ? 7 : period === 'month' ? 30 : 100,\n });\n\n if (response.success && response.payouts) {\n // Convert payout history to earnings breakdown format\n return response.payouts.map(payout => ({\n tips: BigInt(0), // Individual payouts don't have breakdown\n subscriptions: BigInt(0),\n nftSales: BigInt(0),\n royalties: BigInt(0),\n total: BigInt(payout.amount || '0'),\n timestamp: payout.createdAt,\n status: payout.status,\n }));\n }\n\n return [];\n } catch (error) {\n console.error('Failed to get earnings history:', error);\n return [];\n }\n }\n\n /**\n * Claim all pending earnings via API\n * Requires authentication token and seed phrase\n */\n async claimEarningsViaApi(authToken: string, seed: string): Promise<ClaimResult> {\n const response = await fetch(`${this.apiBaseUrl}/api/payouts/claim`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${authToken}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ seed }),\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || 'Failed to claim earnings');\n }\n\n return response.json();\n }\n\n /**\n * Claim all pending earnings (direct contract call)\n * Requires a signer with sendTransaction capability\n */\n async claimEarnings(\n tokenAddress: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n try {\n // Encode claimEarnings(address token) call\n const encodedToken = tokenAddress.toLowerCase().replace('0x', '').padStart(64, '0');\n const data = `${PAYOUTS_SELECTORS.claimEarnings}${encodedToken}`;\n\n const tx = await signer.sendTransaction({\n to: this.contractAddress,\n data,\n value: '0x0',\n });\n\n return {\n hash: tx.hash,\n network: 'ethereum',\n status: 'pending',\n metadata: { token: tokenAddress },\n };\n } catch (error) {\n console.error('Failed to claim earnings:', error);\n throw new Error(`Claim failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Claim specific amount of earnings\n * Requires a signer with sendTransaction capability\n */\n async claimPartialEarnings(\n tokenAddress: string,\n amount: bigint,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n if (amount <= 0n) {\n throw new Error('Amount must be greater than 0');\n }\n\n try {\n // Encode claimPartialEarnings(address token, uint256 amount) call\n const encodedToken = tokenAddress.toLowerCase().replace('0x', '').padStart(64, '0');\n const encodedAmount = amount.toString(16).padStart(64, '0');\n const data = `${PAYOUTS_SELECTORS.claimPartialEarnings}${encodedToken}${encodedAmount}`;\n\n const tx = await signer.sendTransaction({\n to: this.contractAddress,\n data,\n value: '0x0',\n });\n\n return {\n hash: tx.hash,\n network: 'ethereum',\n status: 'pending',\n metadata: { token: tokenAddress, amount: amount.toString() },\n };\n } catch (error) {\n console.error('Failed to claim partial earnings:', error);\n throw new Error(`Partial claim failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Setup revenue split with collaborators\n * Basis points must sum to 10000 (100%)\n * Requires a signer with sendTransaction capability\n */\n async setupRevenueSplit(\n splits: RevenueSplit[],\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n // Validate that basis points sum to 100%\n const totalBps = splits.reduce((sum, split) => sum + split.basisPoints, 0);\n if (totalBps !== 10000) {\n throw new Error('Revenue splits must sum to 100% (10000 basis points)');\n }\n\n // Validate each split\n for (const split of splits) {\n if (split.basisPoints <= 0) {\n throw new Error('Each split must have positive basis points');\n }\n if (!split.recipient || split.recipient.length === 0) {\n throw new Error('Each split must have a valid recipient address');\n }\n }\n\n try {\n // Encode setRevenueSplit((address,uint256)[]) call\n // ABI encode the array of structs\n const offset = '0'.padStart(64, '0').slice(-64); // Offset to array data (32 bytes = 0x20)\n const arrayLength = splits.length.toString(16).padStart(64, '0');\n\n let encodedSplits = '';\n for (const split of splits) {\n const encodedRecipient = split.recipient.toLowerCase().replace('0x', '').padStart(64, '0');\n const encodedBps = split.basisPoints.toString(16).padStart(64, '0');\n encodedSplits += encodedRecipient + encodedBps;\n }\n\n const data = `${PAYOUTS_SELECTORS.setRevenueSplit}${'0000000000000000000000000000000000000000000000000000000000000020'}${arrayLength}${encodedSplits}`;\n\n const tx = await signer.sendTransaction({\n to: this.contractAddress,\n data,\n value: '0x0',\n });\n\n return {\n hash: tx.hash,\n network: 'ethereum',\n status: 'pending',\n metadata: { splits },\n };\n } catch (error) {\n console.error('Failed to setup revenue split:', error);\n throw new Error(`Revenue split setup failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Get current revenue split configuration via API\n */\n async getRevenueSplit(creatorAddress: string): Promise<RevenueSplit[]> {\n try {\n // Use API to get revenue split configuration\n const response = await fetch(`${this.apiBaseUrl}/api/payouts/revenue-split/${creatorAddress}`, {\n headers: { 'Content-Type': 'application/json' },\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.splits) {\n return data.splits;\n }\n }\n\n return [];\n } catch (error) {\n console.error('Failed to get revenue split:', error);\n return [];\n }\n }\n\n /**\n * Remove revenue split (creator gets 100%)\n * Requires a signer with sendTransaction capability\n */\n async removeRevenueSplit(\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n try {\n const data = PAYOUTS_SELECTORS.removeRevenueSplit;\n\n const tx = await signer.sendTransaction({\n to: this.contractAddress,\n data,\n value: '0x0',\n });\n\n return {\n hash: tx.hash,\n network: 'ethereum',\n status: 'pending',\n };\n } catch (error) {\n console.error('Failed to remove revenue split:', error);\n throw new Error(`Remove revenue split failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Convert earnings to stablecoin (USDT) via swap\n * This will be implemented when SwapService is complete\n */\n async convertToStable(\n token: string,\n amount: bigint,\n swapService?: { executeSwap: (params: object) => Promise<TxResult> }\n ): Promise<TxResult> {\n if (amount <= 0n) {\n throw new Error('Amount must be greater than 0');\n }\n\n if (!swapService) {\n throw new Error('SwapService required for conversion. Import and pass SwapService instance.');\n }\n\n try {\n // Delegate to SwapService for the actual swap\n return await swapService.executeSwap({\n tokenIn: token,\n tokenOut: '0xdAC17F958D2ee523a2206206994597C13D831ec7', // USDT mainnet\n amountIn: amount,\n slippageBps: 50, // 0.5% slippage\n });\n } catch (error) {\n console.error('Failed to convert to stable:', error);\n throw new Error(`Conversion failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Get the contract address\n */\n getContractAddress(): string {\n return this.contractAddress;\n }\n\n /**\n * Get the chain ID\n */\n getChainId(): number {\n return this.chainId;\n }\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 * 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://api.shasta.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://shasta.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 || 'testnet',\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","// Network Types\nexport type NetworkType = 'bitcoin' | 'ethereum' | 'ton' | 'tron' | 'solana' | 'spark';\n\n// Wallet Configuration\nexport interface ZubariWalletConfig {\n network: 'mainnet' | 'testnet';\n enabledNetworks: NetworkType[];\n gasless: boolean;\n paymasterUrl?: string;\n bundlerUrl?: string;\n rpcUrls?: Partial<Record<NetworkType, string>>;\n}\n\n// Balance Types\nexport interface TokenBalance {\n symbol: string;\n address: string;\n balance: bigint;\n balanceFormatted: string;\n balanceUsd: number;\n decimals: number;\n}\n\nexport interface TokenInfo {\n address: string;\n symbol: string;\n decimals: number;\n name: string;\n}\n\nexport interface NetworkBalance {\n network: NetworkType;\n native: {\n symbol: string;\n balance: bigint;\n balanceFormatted: string;\n balanceUsd: number;\n };\n tokens: TokenBalance[];\n}\n\n// Transaction Types\nexport interface TxResult {\n hash: string;\n network: NetworkType;\n status: 'pending' | 'confirmed' | 'failed';\n blockNumber?: number;\n gasUsed?: bigint;\n error?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface SendParams {\n to: string;\n amount: bigint;\n token?: string;\n gasless?: boolean;\n}\n\n// Account Types\nexport interface Account {\n network: NetworkType;\n address: string;\n publicKey: string;\n derivationPath: string;\n}\n\n// NFT Types\nexport type NFTCurrency = 'ETH' | 'USDT';\n\nexport interface NFTAttribute {\n trait_type: string;\n value: string | number;\n display_type?: 'boost_number' | 'boost_percentage' | 'number' | 'date';\n max_value?: number;\n}\n\nexport interface NFTMetadata {\n name: string;\n description: string;\n image: string;\n externalUrl?: string;\n animationUrl?: string;\n attributes?: NFTAttribute[];\n royaltyBps: number;\n}\n\nexport interface WatermarkingData {\n contentHash: string; // Hash of original content (bytes32)\n userId: string; // Unique user identifier (bytes32)\n sessionId: string; // Session identifier (bytes32)\n}\n\nexport interface CreateVoucherParams {\n metadata: NFTMetadata;\n creatorAddress: string;\n price: string; // Price in human-readable format (e.g., \"1.5\")\n currency: NFTCurrency;\n nonce?: number; // Optional, auto-generated if not provided\n watermarking?: WatermarkingData;\n}\n\nexport interface LazyMintVoucher {\n tokenId: string;\n uri: string;\n creator: string;\n royaltyBps: number;\n deadline: number;\n signature: string;\n // Pricing fields\n price: string; // Price in wei\n currency: string; // 0x0 for ETH, USDC address for ERC20\n nonce: number; // Unique nonce for replay protection\n // Watermarking fields (optional)\n contentHash?: string;\n userId?: string;\n watermarkTimestamp?: number;\n sessionId?: string;\n}\n\nexport interface NFT {\n tokenId: string;\n contractAddress: string;\n owner: string;\n creator: string;\n uri: string;\n metadata?: NFTMetadata;\n isLazyMinted: boolean;\n}\n\nexport interface ListingParams {\n nftContract: string;\n tokenId: string;\n price: bigint;\n paymentToken: string;\n duration: number;\n}\n\nexport interface Listing {\n listingId: string;\n nftContract: string;\n tokenId: string;\n seller: string;\n price: bigint;\n paymentToken: string;\n expiresAt: number;\n isActive: boolean;\n}\n\nexport interface BuyParams {\n listingId: string;\n price: bigint;\n paymentToken: string;\n}\n\n// Tip Types\nexport interface TipData {\n recipient: string;\n amount: bigint;\n token: string;\n message?: string;\n}\n\nexport interface TipResult {\n txHash: string;\n tipId: string;\n recipient: string;\n amount: bigint;\n platformFee: bigint;\n timestamp: number;\n}\n\nexport interface TipStats {\n totalReceived: bigint;\n tipCount: number;\n uniqueTippers: number;\n}\n\nexport interface Tip {\n tipId: string;\n sender: string;\n recipient: string;\n token: string;\n amount: bigint;\n platformFee: bigint;\n message: string;\n timestamp: number;\n}\n\n// Subscription Types\nexport interface SubscriptionPlan {\n planId?: string;\n name: string;\n description: string;\n price: bigint;\n paymentToken: string;\n duration: number;\n perks: string[];\n maxSubscribers?: number;\n nftBadge: boolean;\n}\n\nexport interface Subscription {\n subscriptionId: string;\n planId: string;\n creator: string;\n subscriber: string;\n startTime: number;\n endTime: number;\n autoRenew: boolean;\n status: 'active' | 'expired' | 'cancelled';\n}\n\n// Payout Types\nexport interface EarningsBreakdown {\n tips: bigint;\n subscriptions: bigint;\n nftSales: bigint;\n royalties: bigint;\n total: bigint;\n}\n\nexport interface EarningsBreakdownFormatted {\n tips: string;\n subscriptions: string;\n nftSales: string;\n royalties: string;\n total?: string;\n}\n\nexport interface EarningsPercentages {\n tips: string;\n subscriptions: string;\n nftSales: string;\n royalties: string;\n}\n\nexport interface PayoutRecord {\n id: string;\n amount: string;\n txHash: string;\n createdAt: string;\n status?: string;\n confirmedAt?: string;\n}\n\nexport interface EarningsResponse {\n address: string;\n pendingEarnings: string;\n totalEarnings: string;\n earningsBreakdown: EarningsBreakdownFormatted;\n recentPayouts: PayoutRecord[];\n}\n\nexport interface PayoutHistoryResponse {\n payouts: PayoutRecord[];\n pagination: {\n page: number;\n limit: number;\n total: number;\n pages: number;\n };\n}\n\nexport interface BreakdownResponse {\n breakdown: EarningsBreakdownFormatted & { total: string };\n percentages: EarningsPercentages;\n}\n\nexport interface PlatformFeeResponse {\n feeBps: number;\n feePercent: string;\n}\n\nexport interface ClaimResult {\n success: boolean;\n transactionHash: string;\n amount: string;\n message: string;\n}\n\nexport interface RevenueSplit {\n recipient: string;\n basisPoints: number;\n}\n\n// Swap Types\nexport interface SwapQuote {\n tokenIn: string;\n tokenOut: string;\n amountIn: bigint;\n amountOut: bigint;\n priceImpact: number;\n route: string[];\n estimatedGas: bigint;\n}\n\nexport interface SwapParams {\n tokenIn: string;\n tokenOut: string;\n amountIn: bigint;\n minAmountOut: bigint;\n deadline: number;\n}\n\n// Error Types\nexport type ZubariErrorCode =\n | 'TX_FAILED'\n | 'AUTH_EXPIRED'\n | 'RPC_ERROR'\n | 'VOUCHER_EXPIRED'\n | 'SLIPPAGE_ERROR'\n | 'RATE_LIMITED'\n | 'UPLOAD_ERROR'\n | 'INSUFFICIENT_FUNDS'\n | 'INVALID_SIGNATURE'\n | 'UNSUPPORTED_NETWORK'\n | 'UNKNOWN_ERROR';\n\nexport class ZubariError extends Error {\n constructor(\n public readonly code: ZubariErrorCode,\n message: string,\n public readonly details?: unknown\n ) {\n super(message);\n this.name = 'ZubariError';\n }\n}\n","/**\n * React hooks for WalletManager\n *\n * These hooks provide a React-friendly interface to the WalletManager class.\n * They handle state management, loading states, and error handling.\n */\n\nimport { useState, useCallback, useEffect, useMemo } from 'react';\nimport {\n WalletManager,\n SUPPORTED_CHAINS,\n type WalletState,\n type WalletManagerConfig,\n type ChainBalance,\n type MultiChainAddresses,\n} from '../wallet';\nimport type { NetworkType } from '../types';\n\nexport interface UseWalletManagerOptions extends WalletManagerConfig {\n autoCheckWallet?: boolean;\n}\n\n/** Transaction result from sendTransaction */\nexport interface SendTransactionResult {\n success: boolean;\n txHash?: string;\n from?: string;\n to?: string;\n amount?: string;\n chain?: NetworkType;\n error?: string;\n}\n\n/** Fee estimation result */\nexport interface FeeEstimateResult {\n success: boolean;\n fee?: string;\n feeUsd?: number;\n error?: string;\n}\n\nexport interface UseWalletManagerReturn {\n // State\n state: WalletState;\n isLoading: boolean;\n error: string | null;\n\n // Basic Actions\n createWallet: (password: string) => Promise<{ seed: string; address: string }>;\n importWallet: (seed: string, password: string) => Promise<void>;\n unlock: (password: string) => Promise<void>;\n lock: () => void;\n deleteWallet: () => Promise<void>;\n fetchBalance: () => Promise<string>;\n\n // Multi-chain Actions\n selectedChain: NetworkType;\n setSelectedChain: (chain: NetworkType) => void;\n chainBalances: ChainBalance[];\n fetchAllBalances: () => Promise<ChainBalance[]>;\n getAddressForChain: (chain: NetworkType) => string | null;\n getAllAddresses: () => Partial<MultiChainAddresses>;\n supportedChains: NetworkType[];\n\n // Transaction Actions (Powered by Tether WDK)\n sendTransaction: (chain: NetworkType, to: string, amount: string, token?: string) => Promise<SendTransactionResult>;\n estimateFee: (chain: NetworkType, to: string, amount: string, token?: string) => Promise<FeeEstimateResult>;\n\n // Utilities\n hasWallet: () => Promise<boolean>;\n getSeed: () => string | null;\n manager: WalletManager;\n}\n\n/**\n * React hook for managing a WDK wallet with multi-chain support\n */\nexport function useWalletManager(\n options: UseWalletManagerOptions = {}\n): UseWalletManagerReturn {\n const { autoCheckWallet = true, ...config } = options;\n\n // Create manager instance (memoized)\n const manager = useMemo(() => new WalletManager(config), [\n config.network,\n config.rpcUrl,\n ]);\n\n // State\n const [state, setState] = useState<WalletState>({\n isInitialized: false,\n isLocked: true,\n address: null,\n balance: null,\n });\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [selectedChain, setSelectedChainState] = useState<NetworkType>('ethereum');\n const [chainBalances, setChainBalances] = useState<ChainBalance[]>([]);\n\n // Update state from manager\n const updateState = useCallback(() => {\n setState(manager.getExtendedState());\n }, [manager]);\n\n // Check if wallet exists on mount\n useEffect(() => {\n if (autoCheckWallet) {\n manager.hasWallet().then((exists) => {\n if (exists) {\n setState((prev) => ({\n ...prev,\n isInitialized: true,\n isLocked: true,\n }));\n }\n });\n }\n }, [manager, autoCheckWallet]);\n\n // Create new wallet\n const createWallet = useCallback(\n async (password: string) => {\n setIsLoading(true);\n setError(null);\n try {\n // Initialize storage for web\n await manager.initializeStorage(password);\n const result = await manager.createWallet(password);\n // Derive addresses for all chains using Tether WDK (async)\n // Falls back to sync derivation if WDK is not available\n try {\n await manager.deriveAllAddressesAsync();\n } catch {\n manager.deriveAllAddresses();\n }\n updateState();\n // Fetch balances for all chains after create\n try {\n const balances = await manager.fetchAllBalances();\n setChainBalances(balances);\n } catch (err) {\n console.warn('Failed to fetch balances after create:', err);\n }\n return result;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to create wallet';\n setError(message);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [manager, updateState]\n );\n\n // Import existing wallet\n const importWallet = useCallback(\n async (seed: string, password: string) => {\n setIsLoading(true);\n setError(null);\n try {\n await manager.initializeStorage(password);\n await manager.importWallet(seed, password);\n // Derive addresses for all chains using Tether WDK (async)\n try {\n await manager.deriveAllAddressesAsync();\n } catch {\n manager.deriveAllAddresses();\n }\n updateState();\n // Fetch balances for all chains after import\n try {\n const balances = await manager.fetchAllBalances();\n setChainBalances(balances);\n } catch (err) {\n console.warn('Failed to fetch balances after import:', err);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to import wallet';\n setError(message);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [manager, updateState]\n );\n\n // Unlock wallet\n const unlock = useCallback(\n async (password: string) => {\n setIsLoading(true);\n setError(null);\n try {\n await manager.initializeStorage(password);\n await manager.unlock(password);\n // Derive addresses for all chains using Tether WDK (async)\n try {\n await manager.deriveAllAddressesAsync();\n } catch {\n manager.deriveAllAddresses();\n }\n updateState();\n // Fetch balances for all chains after unlock\n try {\n const balances = await manager.fetchAllBalances();\n setChainBalances(balances);\n } catch (err) {\n console.warn('Failed to fetch balances after unlock:', err);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Invalid password';\n setError(message);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [manager, updateState]\n );\n\n // Lock wallet\n const lock = useCallback(() => {\n manager.lock();\n setChainBalances([]);\n updateState();\n }, [manager, updateState]);\n\n // Delete wallet\n const deleteWallet = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n await manager.deleteWallet();\n setChainBalances([]);\n setState({\n isInitialized: false,\n isLocked: true,\n address: null,\n balance: null,\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to delete wallet';\n setError(message);\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, [manager]);\n\n // Fetch balance (for selected chain)\n const fetchBalance = useCallback(async () => {\n setIsLoading(true);\n // Don't clear error here - balance fetch errors shouldn't clear previous errors\n try {\n const balance = await manager.fetchBalance();\n setState((prev) => ({ ...prev, balance }));\n return balance;\n } catch (err) {\n // Log warning but don't throw - balance fetch errors shouldn't block UI\n console.warn('Failed to fetch balance:', err);\n // Return '0' instead of throwing to not block wallet operations\n setState((prev) => ({ ...prev, balance: '0' }));\n return '0';\n } finally {\n setIsLoading(false);\n }\n }, [manager]);\n\n // Fetch all chain balances\n const fetchAllBalances = useCallback(async () => {\n setIsLoading(true);\n // Don't clear error here - balance fetch errors shouldn't clear previous errors\n try {\n const balances = await manager.fetchAllBalances();\n setChainBalances(balances);\n return balances;\n } catch (err) {\n // Log warning but don't throw - balance fetch errors shouldn't block UI\n console.warn('Failed to fetch all balances:', err);\n // Return empty array instead of throwing\n return [];\n } finally {\n setIsLoading(false);\n }\n }, [manager]);\n\n // Set selected chain\n const setSelectedChain = useCallback((chain: NetworkType) => {\n manager.setSelectedChain(chain);\n setSelectedChainState(chain);\n }, [manager]);\n\n // Get address for chain\n const getAddressForChain = useCallback(\n (chain: NetworkType) => manager.getAddressForChain(chain),\n [manager]\n );\n\n // Get all addresses\n const getAllAddresses = useCallback(\n () => manager.getAllAddresses(),\n [manager]\n );\n\n // Check if wallet exists\n const hasWallet = useCallback(() => manager.hasWallet(), [manager]);\n\n // Get seed (only if unlocked)\n const getSeed = useCallback(() => manager.getSeed(), [manager]);\n\n // Send transaction using Tether WDK\n const sendTransaction = useCallback(\n async (chain: NetworkType, to: string, amount: string, token?: string) => {\n setIsLoading(true);\n try {\n const result = await manager.sendTransaction(chain, to, amount, token);\n // Refresh balances after successful transaction\n if (result.success) {\n try {\n const balances = await manager.fetchAllBalances();\n setChainBalances(balances);\n } catch (err) {\n console.warn('Failed to refresh balances after transaction:', err);\n }\n }\n return result;\n } finally {\n setIsLoading(false);\n }\n },\n [manager]\n );\n\n // Estimate transaction fee using Tether WDK\n const estimateFee = useCallback(\n async (chain: NetworkType, to: string, amount: string, token?: string) => {\n return manager.estimateFee(chain, to, amount, token);\n },\n [manager]\n );\n\n return {\n state,\n isLoading,\n error,\n createWallet,\n importWallet,\n unlock,\n lock,\n deleteWallet,\n fetchBalance,\n // Multi-chain\n selectedChain,\n setSelectedChain,\n chainBalances,\n fetchAllBalances,\n getAddressForChain,\n getAllAddresses,\n supportedChains: SUPPORTED_CHAINS,\n // Transaction Actions (Powered by Tether WDK)\n sendTransaction,\n estimateFee,\n // Utilities\n hasWallet,\n getSeed,\n manager,\n };\n}\n","/**\n * Utility functions for wallet operations\n */\n\n/**\n * Format address for display (truncate middle)\n */\nexport function formatAddress(address: string, chars: number = 4): string {\n if (!address || address.length < 10) return address;\n return `${address.slice(0, chars + 2)}...${address.slice(-chars)}`;\n}\n\n/**\n * Format balance for display\n */\nexport function formatBalance(\n balance: bigint,\n decimals: number = 18,\n precision: number = 4\n): string {\n const divisor = BigInt(10 ** decimals);\n const integerPart = balance / divisor;\n const fractionalPart = balance % divisor;\n\n const fractionalStr = fractionalPart\n .toString()\n .padStart(decimals, '0')\n .slice(0, precision);\n\n return `${integerPart}.${fractionalStr}`;\n}\n\n/**\n * Check if string is a valid Ethereum address\n */\nexport function isValidAddress(address: string): boolean {\n return /^0x[a-fA-F0-9]{40}$/.test(address);\n}\n\n/**\n * Normalize an Ethereum address to checksum format\n */\nexport function normalizeAddress(address: string): string {\n if (!isValidAddress(address)) {\n throw new Error('Invalid Ethereum address');\n }\n return address.toLowerCase();\n}\n"]}
|