@t402/wdk 2.0.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index.ts","../../src/cache.ts","../../src/chains.ts","../../src/errors.ts","../../src/signer.ts","../../src/t402wdk.ts","../../src/bridge.ts"],"sourcesContent":["/**\n * @module @t402/wdk - T402 integration with Tether Wallet Development Kit\n *\n * This package provides seamless integration between T402 payment protocol\n * and Tether's WDK (Wallet Development Kit), enabling:\n *\n * - Multi-chain self-custodial wallets\n * - USDT0 and USDC payments with EIP-3009 support\n * - Cross-chain bridging via LayerZero\n * - T402-compatible signers for payment authorization\n *\n * @example Basic Usage\n * ```typescript\n * import WDK from '@tetherto/wdk';\n * import WalletManagerEvm from '@tetherto/wdk-wallet-evm';\n * import { T402WDK } from '@t402/wdk';\n * import { createT402HTTPClient } from '@t402/core';\n *\n * // Register WDK modules (once at app startup)\n * T402WDK.registerWDK(WDK, WalletManagerEvm);\n *\n * // Create wallet from seed phrase\n * const seedPhrase = T402WDK.generateSeedPhrase();\n * const wallet = new T402WDK(seedPhrase, {\n * arbitrum: 'https://arb1.arbitrum.io/rpc',\n * base: 'https://mainnet.base.org'\n * });\n *\n * // Get signer for T402 payments\n * const signer = await wallet.getSigner('arbitrum');\n *\n * // Use with T402 HTTP client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', signer }]\n * });\n *\n * // Make a paid request\n * const response = await client.fetch('https://api.example.com/premium');\n * ```\n *\n * @example Balance Checking\n * ```typescript\n * // Check USDT0 balance on Arbitrum\n * const balance = await wallet.getUsdt0Balance('arbitrum');\n * console.log(`USDT0 balance: ${balance}`);\n *\n * // Get aggregated balances across all chains\n * const allBalances = await wallet.getAggregatedBalances();\n * console.log(`Total USDT0: ${allBalances.totalUsdt0}`);\n *\n * // Find best chain for payment\n * const best = await wallet.findBestChainForPayment(1000000n); // 1 USDT0\n * if (best) {\n * console.log(`Use ${best.token} on ${best.chain}`);\n * }\n * ```\n *\n * @example Cross-Chain Bridging\n * ```typescript\n * // Bridge USDT0 from Ethereum to Arbitrum\n * const result = await wallet.bridgeUsdt0({\n * fromChain: 'ethereum',\n * toChain: 'arbitrum',\n * amount: 100000000n // 100 USDT0\n * });\n * console.log(`Bridge tx: ${result.txHash}`);\n * ```\n */\n\n// Main class\nexport { T402WDK } from \"./t402wdk.js\";\n\n// Signer\nexport { WDKSigner, createWDKSigner, MockWDKSigner } from \"./signer.js\";\n\n// Types\nexport type {\n T402WDKConfig,\n T402WDKOptions,\n T402BalanceCacheConfig,\n EvmChainConfig,\n NormalizedChainConfig,\n TokenBalance,\n ChainBalance,\n AggregatedBalance,\n BridgeParams,\n BridgeResult,\n TypedDataDomain,\n TypedDataTypes,\n T402WDKSigner,\n WDKAccount,\n WDKInstance,\n WDKConstructor,\n} from \"./types.js\";\n\n// Cache\nexport {\n TTLCache,\n BalanceCache,\n DEFAULT_CACHE_CONFIG,\n DEFAULT_BALANCE_CACHE_CONFIG,\n} from \"./cache.js\";\nexport type {\n CacheConfig,\n CacheStats,\n BalanceCacheConfig,\n BalanceCacheStats,\n} from \"./cache.js\";\n\n// Chain configuration\nexport {\n DEFAULT_CHAINS,\n DEFAULT_RPC_ENDPOINTS,\n USDT0_ADDRESSES,\n USDC_ADDRESSES,\n USDT_LEGACY_ADDRESSES,\n CHAIN_TOKENS,\n normalizeChainConfig,\n getNetworkFromChain,\n getChainFromNetwork,\n getChainId,\n getUsdt0Chains,\n getPreferredToken,\n} from \"./chains.js\";\nexport type { TokenInfo } from \"./chains.js\";\n\n// Error types and utilities\nexport {\n // Error classes\n WDKError,\n WDKInitializationError,\n ChainError,\n SignerError,\n SigningError,\n BalanceError,\n TransactionError,\n BridgeError,\n RPCError,\n // Error codes\n WDKErrorCode,\n // Utilities\n wrapError,\n isWDKError,\n hasErrorCode,\n withRetry,\n withTimeout,\n DEFAULT_RETRY_CONFIG,\n} from \"./errors.js\";\nexport type { RetryConfig } from \"./errors.js\";\n\n// Bridge utilities\nexport { WdkBridge, createDirectBridge } from \"./bridge.js\";\nexport type { BridgeQuoteResult, BridgeQuote, BridgeSigner } from \"./bridge.js\";\n\n// Re-export bridge utilities from @t402/evm for convenience\nexport {\n supportsBridging,\n getBridgeableChains,\n LAYERZERO_ENDPOINT_IDS,\n USDT0_OFT_ADDRESSES,\n Usdt0Bridge,\n} from \"@t402/evm\";\n","/**\n * TTL Cache implementation for balance caching\n *\n * Provides a generic cache with configurable TTL (Time To Live) for\n * reducing RPC calls and improving performance.\n */\n\n/**\n * Cache entry with value and expiration time\n */\ninterface CacheEntry<T> {\n value: T;\n expiresAt: number;\n}\n\n/**\n * Cache configuration options\n */\nexport interface CacheConfig {\n /** Default TTL in milliseconds (default: 30000 = 30 seconds) */\n defaultTTL: number;\n /** Maximum number of entries (default: 1000) */\n maxSize: number;\n /** Whether to refresh TTL on access (default: false) */\n refreshOnAccess: boolean;\n}\n\n/**\n * Default cache configuration\n */\nexport const DEFAULT_CACHE_CONFIG: CacheConfig = {\n defaultTTL: 30000, // 30 seconds\n maxSize: 1000,\n refreshOnAccess: false,\n};\n\n/**\n * Generic TTL cache implementation\n *\n * @example\n * ```typescript\n * const cache = new TTLCache<bigint>({ defaultTTL: 60000 });\n *\n * // Set with default TTL\n * cache.set('balance:arbitrum:0x123', 1000000n);\n *\n * // Set with custom TTL\n * cache.set('balance:ethereum:0x456', 2000000n, 120000);\n *\n * // Get value (returns undefined if expired)\n * const balance = cache.get('balance:arbitrum:0x123');\n *\n * // Check if key exists and is not expired\n * if (cache.has('balance:arbitrum:0x123')) {\n * // Use cached value\n * }\n * ```\n */\nexport class TTLCache<T> {\n private _cache: Map<string, CacheEntry<T>> = new Map();\n private _config: CacheConfig;\n private _cleanupInterval: ReturnType<typeof setInterval> | null = null;\n\n constructor(config: Partial<CacheConfig> = {}) {\n this._config = { ...DEFAULT_CACHE_CONFIG, ...config };\n\n // Start periodic cleanup if maxSize is set\n if (this._config.maxSize > 0) {\n this._startCleanup();\n }\n }\n\n /**\n * Get a value from the cache\n *\n * @param key - Cache key\n * @returns The cached value or undefined if not found/expired\n */\n get(key: string): T | undefined {\n const entry = this._cache.get(key);\n\n if (!entry) {\n return undefined;\n }\n\n // Check if expired\n if (Date.now() > entry.expiresAt) {\n this._cache.delete(key);\n return undefined;\n }\n\n // Optionally refresh TTL on access\n if (this._config.refreshOnAccess) {\n entry.expiresAt = Date.now() + this._config.defaultTTL;\n }\n\n return entry.value;\n }\n\n /**\n * Set a value in the cache\n *\n * @param key - Cache key\n * @param value - Value to cache\n * @param ttl - TTL in milliseconds (optional, uses default if not provided)\n */\n set(key: string, value: T, ttl?: number): void {\n // Enforce max size by removing oldest entries\n if (this._cache.size >= this._config.maxSize) {\n this._evictOldest();\n }\n\n const expiresAt = Date.now() + (ttl ?? this._config.defaultTTL);\n this._cache.set(key, { value, expiresAt });\n }\n\n /**\n * Check if a key exists and is not expired\n *\n * @param key - Cache key\n * @returns true if key exists and is not expired\n */\n has(key: string): boolean {\n const entry = this._cache.get(key);\n\n if (!entry) {\n return false;\n }\n\n if (Date.now() > entry.expiresAt) {\n this._cache.delete(key);\n return false;\n }\n\n return true;\n }\n\n /**\n * Delete a key from the cache\n *\n * @param key - Cache key\n * @returns true if key was deleted\n */\n delete(key: string): boolean {\n return this._cache.delete(key);\n }\n\n /**\n * Delete all keys matching a prefix\n *\n * @param prefix - Key prefix to match\n * @returns Number of keys deleted\n */\n deleteByPrefix(prefix: string): number {\n let count = 0;\n for (const key of this._cache.keys()) {\n if (key.startsWith(prefix)) {\n this._cache.delete(key);\n count++;\n }\n }\n return count;\n }\n\n /**\n * Clear all entries from the cache\n */\n clear(): void {\n this._cache.clear();\n }\n\n /**\n * Get the number of entries in the cache (including expired)\n */\n get size(): number {\n return this._cache.size;\n }\n\n /**\n * Get the number of valid (non-expired) entries\n */\n get validSize(): number {\n const now = Date.now();\n let count = 0;\n for (const entry of this._cache.values()) {\n if (now <= entry.expiresAt) {\n count++;\n }\n }\n return count;\n }\n\n /**\n * Get all valid keys\n */\n keys(): string[] {\n const now = Date.now();\n const validKeys: string[] = [];\n for (const [key, entry] of this._cache.entries()) {\n if (now <= entry.expiresAt) {\n validKeys.push(key);\n }\n }\n return validKeys;\n }\n\n /**\n * Get remaining TTL for a key in milliseconds\n *\n * @param key - Cache key\n * @returns Remaining TTL in ms, or -1 if not found/expired\n */\n getTTL(key: string): number {\n const entry = this._cache.get(key);\n\n if (!entry) {\n return -1;\n }\n\n const remaining = entry.expiresAt - Date.now();\n if (remaining <= 0) {\n this._cache.delete(key);\n return -1;\n }\n\n return remaining;\n }\n\n /**\n * Update TTL for an existing key\n *\n * @param key - Cache key\n * @param ttl - New TTL in milliseconds\n * @returns true if key exists and TTL was updated\n */\n touch(key: string, ttl?: number): boolean {\n const entry = this._cache.get(key);\n\n if (!entry) {\n return false;\n }\n\n if (Date.now() > entry.expiresAt) {\n this._cache.delete(key);\n return false;\n }\n\n entry.expiresAt = Date.now() + (ttl ?? this._config.defaultTTL);\n return true;\n }\n\n /**\n * Get or set a value using a factory function\n *\n * @param key - Cache key\n * @param factory - Function to create value if not cached\n * @param ttl - TTL in milliseconds (optional)\n * @returns The cached or newly created value\n */\n async getOrSet(key: string, factory: () => Promise<T>, ttl?: number): Promise<T> {\n const cached = this.get(key);\n if (cached !== undefined) {\n return cached;\n }\n\n const value = await factory();\n this.set(key, value, ttl);\n return value;\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n const now = Date.now();\n let validCount = 0;\n let expiredCount = 0;\n let oldestExpiry = Infinity;\n let newestExpiry = 0;\n\n for (const entry of this._cache.values()) {\n if (now <= entry.expiresAt) {\n validCount++;\n if (entry.expiresAt < oldestExpiry) oldestExpiry = entry.expiresAt;\n if (entry.expiresAt > newestExpiry) newestExpiry = entry.expiresAt;\n } else {\n expiredCount++;\n }\n }\n\n return {\n totalSize: this._cache.size,\n validSize: validCount,\n expiredSize: expiredCount,\n maxSize: this._config.maxSize,\n defaultTTL: this._config.defaultTTL,\n oldestExpiryMs: oldestExpiry === Infinity ? 0 : oldestExpiry - now,\n newestExpiryMs: newestExpiry === 0 ? 0 : newestExpiry - now,\n };\n }\n\n /**\n * Stop the cleanup interval\n */\n dispose(): void {\n if (this._cleanupInterval) {\n clearInterval(this._cleanupInterval);\n this._cleanupInterval = null;\n }\n this._cache.clear();\n }\n\n /**\n * Start periodic cleanup of expired entries\n */\n private _startCleanup(): void {\n // Run cleanup every minute\n this._cleanupInterval = setInterval(() => {\n this._removeExpired();\n }, 60000);\n\n // Don't prevent process from exiting\n if (this._cleanupInterval.unref) {\n this._cleanupInterval.unref();\n }\n }\n\n /**\n * Remove all expired entries\n */\n private _removeExpired(): number {\n const now = Date.now();\n let count = 0;\n\n for (const [key, entry] of this._cache.entries()) {\n if (now > entry.expiresAt) {\n this._cache.delete(key);\n count++;\n }\n }\n\n return count;\n }\n\n /**\n * Evict oldest entries to make room\n */\n private _evictOldest(): void {\n // First remove expired entries\n this._removeExpired();\n\n // If still at max, remove oldest by expiry time\n if (this._cache.size >= this._config.maxSize) {\n let oldestKey: string | null = null;\n let oldestExpiry = Infinity;\n\n for (const [key, entry] of this._cache.entries()) {\n if (entry.expiresAt < oldestExpiry) {\n oldestExpiry = entry.expiresAt;\n oldestKey = key;\n }\n }\n\n if (oldestKey) {\n this._cache.delete(oldestKey);\n }\n }\n }\n}\n\n/**\n * Cache statistics\n */\nexport interface CacheStats {\n /** Total entries including expired */\n totalSize: number;\n /** Valid (non-expired) entries */\n validSize: number;\n /** Expired entries pending cleanup */\n expiredSize: number;\n /** Maximum cache size */\n maxSize: number;\n /** Default TTL in milliseconds */\n defaultTTL: number;\n /** Time until oldest entry expires (ms) */\n oldestExpiryMs: number;\n /** Time until newest entry expires (ms) */\n newestExpiryMs: number;\n}\n\n/**\n * Balance cache configuration\n */\nexport interface BalanceCacheConfig {\n /** Whether caching is enabled (default: true) */\n enabled: boolean;\n /** TTL for native balance in milliseconds (default: 15000 = 15 seconds) */\n nativeBalanceTTL: number;\n /** TTL for token balance in milliseconds (default: 30000 = 30 seconds) */\n tokenBalanceTTL: number;\n /** TTL for aggregated balances in milliseconds (default: 60000 = 60 seconds) */\n aggregatedBalanceTTL: number;\n /** Maximum cache entries (default: 500) */\n maxSize: number;\n}\n\n/**\n * Default balance cache configuration\n */\nexport const DEFAULT_BALANCE_CACHE_CONFIG: BalanceCacheConfig = {\n enabled: true,\n nativeBalanceTTL: 15000, // 15 seconds\n tokenBalanceTTL: 30000, // 30 seconds\n aggregatedBalanceTTL: 60000, // 60 seconds\n maxSize: 500,\n};\n\n/**\n * Specialized balance cache for WDK\n *\n * Provides separate TTL settings for different balance types\n * and convenient methods for balance-specific caching.\n *\n * @example\n * ```typescript\n * const cache = new BalanceCache({\n * tokenBalanceTTL: 60000, // 1 minute for token balances\n * });\n *\n * // Cache token balance\n * cache.setTokenBalance('arbitrum', '0xUSDT', '0xWallet', 1000000n);\n *\n * // Get cached balance (returns undefined if expired)\n * const balance = cache.getTokenBalance('arbitrum', '0xUSDT', '0xWallet');\n *\n * // Or use getOrFetch pattern\n * const balance = await cache.getOrFetchTokenBalance(\n * 'arbitrum',\n * '0xUSDT',\n * '0xWallet',\n * async () => await signer.getTokenBalance('0xUSDT')\n * );\n * ```\n */\nexport class BalanceCache {\n private _cache: TTLCache<bigint>;\n private _aggregatedCache: TTLCache<unknown>;\n private _config: BalanceCacheConfig;\n\n constructor(config: Partial<BalanceCacheConfig> = {}) {\n this._config = { ...DEFAULT_BALANCE_CACHE_CONFIG, ...config };\n\n this._cache = new TTLCache<bigint>({\n defaultTTL: this._config.tokenBalanceTTL,\n maxSize: this._config.maxSize,\n });\n\n this._aggregatedCache = new TTLCache<unknown>({\n defaultTTL: this._config.aggregatedBalanceTTL,\n maxSize: 100, // Fewer aggregated balance entries\n });\n }\n\n /**\n * Check if caching is enabled\n */\n get enabled(): boolean {\n return this._config.enabled;\n }\n\n /**\n * Get cache configuration\n */\n get config(): BalanceCacheConfig {\n return { ...this._config };\n }\n\n // ========== Native Balance Methods ==========\n\n /**\n * Get cached native balance\n */\n getNativeBalance(chain: string, address: string): bigint | undefined {\n if (!this._config.enabled) return undefined;\n return this._cache.get(this._nativeKey(chain, address));\n }\n\n /**\n * Set native balance in cache\n */\n setNativeBalance(chain: string, address: string, balance: bigint): void {\n if (!this._config.enabled) return;\n this._cache.set(this._nativeKey(chain, address), balance, this._config.nativeBalanceTTL);\n }\n\n /**\n * Get or fetch native balance\n */\n async getOrFetchNativeBalance(\n chain: string,\n address: string,\n fetcher: () => Promise<bigint>,\n ): Promise<bigint> {\n if (!this._config.enabled) {\n return fetcher();\n }\n\n return this._cache.getOrSet(\n this._nativeKey(chain, address),\n fetcher,\n this._config.nativeBalanceTTL,\n );\n }\n\n // ========== Token Balance Methods ==========\n\n /**\n * Get cached token balance\n */\n getTokenBalance(chain: string, token: string, address: string): bigint | undefined {\n if (!this._config.enabled) return undefined;\n return this._cache.get(this._tokenKey(chain, token, address));\n }\n\n /**\n * Set token balance in cache\n */\n setTokenBalance(chain: string, token: string, address: string, balance: bigint): void {\n if (!this._config.enabled) return;\n this._cache.set(this._tokenKey(chain, token, address), balance, this._config.tokenBalanceTTL);\n }\n\n /**\n * Get or fetch token balance\n */\n async getOrFetchTokenBalance(\n chain: string,\n token: string,\n address: string,\n fetcher: () => Promise<bigint>,\n ): Promise<bigint> {\n if (!this._config.enabled) {\n return fetcher();\n }\n\n return this._cache.getOrSet(\n this._tokenKey(chain, token, address),\n fetcher,\n this._config.tokenBalanceTTL,\n );\n }\n\n // ========== Aggregated Balance Methods ==========\n\n /**\n * Get cached aggregated balance\n */\n getAggregatedBalance<T>(key: string): T | undefined {\n if (!this._config.enabled) return undefined;\n return this._aggregatedCache.get(this._aggregatedKey(key)) as T | undefined;\n }\n\n /**\n * Set aggregated balance in cache\n */\n setAggregatedBalance<T>(key: string, value: T): void {\n if (!this._config.enabled) return;\n this._aggregatedCache.set(this._aggregatedKey(key), value, this._config.aggregatedBalanceTTL);\n }\n\n /**\n * Get or fetch aggregated balance\n */\n async getOrFetchAggregatedBalance<T>(\n key: string,\n fetcher: () => Promise<T>,\n ): Promise<T> {\n if (!this._config.enabled) {\n return fetcher();\n }\n\n return this._aggregatedCache.getOrSet(\n this._aggregatedKey(key),\n fetcher,\n this._config.aggregatedBalanceTTL,\n ) as Promise<T>;\n }\n\n // ========== Cache Management ==========\n\n /**\n * Invalidate all balances for a chain\n */\n invalidateChain(chain: string): number {\n const count1 = this._cache.deleteByPrefix(`native:${chain}:`);\n const count2 = this._cache.deleteByPrefix(`token:${chain}:`);\n const count3 = this._aggregatedCache.deleteByPrefix(`agg:`);\n return count1 + count2 + count3;\n }\n\n /**\n * Invalidate all balances for an address\n */\n invalidateAddress(address: string): number {\n let count = 0;\n const lowerAddress = address.toLowerCase();\n\n for (const key of this._cache.keys()) {\n if (key.toLowerCase().includes(lowerAddress)) {\n this._cache.delete(key);\n count++;\n }\n }\n\n // Also clear aggregated cache\n this._aggregatedCache.clear();\n\n return count;\n }\n\n /**\n * Invalidate specific token balance\n */\n invalidateTokenBalance(chain: string, token: string, address: string): boolean {\n return this._cache.delete(this._tokenKey(chain, token, address));\n }\n\n /**\n * Clear all caches\n */\n clear(): void {\n this._cache.clear();\n this._aggregatedCache.clear();\n }\n\n /**\n * Get cache statistics\n */\n getStats(): BalanceCacheStats {\n return {\n balanceCache: this._cache.getStats(),\n aggregatedCache: this._aggregatedCache.getStats(),\n config: this.config,\n };\n }\n\n /**\n * Dispose of cache resources\n */\n dispose(): void {\n this._cache.dispose();\n this._aggregatedCache.dispose();\n }\n\n // ========== Private Key Generators ==========\n\n private _nativeKey(chain: string, address: string): string {\n return `native:${chain}:${address.toLowerCase()}`;\n }\n\n private _tokenKey(chain: string, token: string, address: string): string {\n return `token:${chain}:${token.toLowerCase()}:${address.toLowerCase()}`;\n }\n\n private _aggregatedKey(key: string): string {\n return `agg:${key}`;\n }\n}\n\n/**\n * Balance cache statistics\n */\nexport interface BalanceCacheStats {\n balanceCache: CacheStats;\n aggregatedCache: CacheStats;\n config: BalanceCacheConfig;\n}\n","/**\n * Chain configuration and token addresses for T402 WDK\n */\n\nimport type { Address } from \"viem\";\nimport type { NormalizedChainConfig, EvmChainConfig } from \"./types.js\";\n\n/**\n * Default chain configurations\n */\nexport const DEFAULT_CHAINS: Record<string, Omit<NormalizedChainConfig, \"provider\">> = {\n ethereum: {\n chainId: 1,\n network: \"eip155:1\",\n name: \"ethereum\",\n },\n arbitrum: {\n chainId: 42161,\n network: \"eip155:42161\",\n name: \"arbitrum\",\n },\n base: {\n chainId: 8453,\n network: \"eip155:8453\",\n name: \"base\",\n },\n ink: {\n chainId: 57073,\n network: \"eip155:57073\",\n name: \"ink\",\n },\n berachain: {\n chainId: 80094,\n network: \"eip155:80094\",\n name: \"berachain\",\n },\n unichain: {\n chainId: 130,\n network: \"eip155:130\",\n name: \"unichain\",\n },\n polygon: {\n chainId: 137,\n network: \"eip155:137\",\n name: \"polygon\",\n },\n};\n\n/**\n * Default RPC endpoints (public endpoints, may have rate limits)\n */\nexport const DEFAULT_RPC_ENDPOINTS: Record<string, string> = {\n ethereum: \"https://eth.drpc.org\",\n arbitrum: \"https://arb1.arbitrum.io/rpc\",\n base: \"https://mainnet.base.org\",\n ink: \"https://rpc-gel.inkonchain.com\",\n polygon: \"https://polygon-rpc.com\",\n};\n\n/**\n * USDT0 token addresses by chain\n * USDT0 is Tether's omnichain token with EIP-3009 support\n */\nexport const USDT0_ADDRESSES: Record<string, Address> = {\n ethereum: \"0x6C96dE32CEa08842dcc4058c14d3aaAD7Fa41dee\",\n arbitrum: \"0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9\",\n ink: \"0x0200C29006150606B650577BBE7B6248F58470c1\",\n berachain: \"0x779Ded0c9e1022225f8E0630b35a9b54bE713736\",\n unichain: \"0x588ce4F028D8e7B53B687865d6A67b3A54C75518\",\n};\n\n/**\n * USDC token addresses by chain\n */\nexport const USDC_ADDRESSES: Record<string, Address> = {\n ethereum: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n arbitrum: \"0xaf88d065e77c8cC2239327C5EDb3A432268e5831\",\n base: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n polygon: \"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359\",\n};\n\n/**\n * Legacy USDT addresses (no EIP-3009 support)\n */\nexport const USDT_LEGACY_ADDRESSES: Record<string, Address> = {\n ethereum: \"0xdAC17F958D2ee523a2206206994597C13D831ec7\",\n polygon: \"0xc2132D05D31c914a87C6611C10748AEb04B58e8F\",\n};\n\n/**\n * All supported tokens per chain with metadata\n */\nexport interface TokenInfo {\n address: Address;\n symbol: string;\n name: string;\n decimals: number;\n /** Whether token supports EIP-3009 (gasless transfers) */\n supportsEIP3009: boolean;\n}\n\nexport const CHAIN_TOKENS: Record<string, TokenInfo[]> = {\n ethereum: [\n {\n address: USDT0_ADDRESSES.ethereum,\n symbol: \"USDT0\",\n name: \"TetherToken\",\n decimals: 6,\n supportsEIP3009: true,\n },\n {\n address: USDC_ADDRESSES.ethereum,\n symbol: \"USDC\",\n name: \"USD Coin\",\n decimals: 6,\n supportsEIP3009: true,\n },\n {\n address: USDT_LEGACY_ADDRESSES.ethereum,\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n supportsEIP3009: false,\n },\n ],\n arbitrum: [\n {\n address: USDT0_ADDRESSES.arbitrum,\n symbol: \"USDT0\",\n name: \"TetherToken\",\n decimals: 6,\n supportsEIP3009: true,\n },\n {\n address: USDC_ADDRESSES.arbitrum,\n symbol: \"USDC\",\n name: \"USD Coin\",\n decimals: 6,\n supportsEIP3009: true,\n },\n ],\n base: [\n {\n address: USDC_ADDRESSES.base,\n symbol: \"USDC\",\n name: \"USD Coin\",\n decimals: 6,\n supportsEIP3009: true,\n },\n ],\n ink: [\n {\n address: USDT0_ADDRESSES.ink,\n symbol: \"USDT0\",\n name: \"TetherToken\",\n decimals: 6,\n supportsEIP3009: true,\n },\n ],\n berachain: [\n {\n address: USDT0_ADDRESSES.berachain,\n symbol: \"USDT0\",\n name: \"TetherToken\",\n decimals: 6,\n supportsEIP3009: true,\n },\n ],\n unichain: [\n {\n address: USDT0_ADDRESSES.unichain,\n symbol: \"USDT0\",\n name: \"TetherToken\",\n decimals: 6,\n supportsEIP3009: true,\n },\n ],\n polygon: [\n {\n address: USDC_ADDRESSES.polygon,\n symbol: \"USDC\",\n name: \"USD Coin\",\n decimals: 6,\n supportsEIP3009: true,\n },\n {\n address: USDT_LEGACY_ADDRESSES.polygon,\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n supportsEIP3009: false,\n },\n ],\n};\n\n/**\n * Normalize chain configuration from string or object\n */\nexport function normalizeChainConfig(\n chainName: string,\n config: string | EvmChainConfig,\n): NormalizedChainConfig {\n const defaultConfig = DEFAULT_CHAINS[chainName];\n\n if (typeof config === \"string\") {\n // String is RPC URL\n return {\n provider: config,\n chainId: defaultConfig?.chainId ?? 1,\n network: defaultConfig?.network ?? `eip155:1`,\n name: chainName,\n };\n }\n\n // Full config object\n return {\n provider: config.provider,\n chainId: config.chainId ?? defaultConfig?.chainId ?? 1,\n network: config.network ?? defaultConfig?.network ?? `eip155:${config.chainId}`,\n name: chainName,\n };\n}\n\n/**\n * Get CAIP-2 network ID from chain name\n */\nexport function getNetworkFromChain(chain: string): string {\n return DEFAULT_CHAINS[chain]?.network ?? `eip155:1`;\n}\n\n/**\n * Get chain name from CAIP-2 network ID\n */\nexport function getChainFromNetwork(network: string): string | undefined {\n for (const [chain, config] of Object.entries(DEFAULT_CHAINS)) {\n if (config.network === network) {\n return chain;\n }\n }\n return undefined;\n}\n\n/**\n * Get chain ID from chain name\n */\nexport function getChainId(chain: string): number {\n return DEFAULT_CHAINS[chain]?.chainId ?? 1;\n}\n\n/**\n * Get all chains that support USDT0\n */\nexport function getUsdt0Chains(): string[] {\n return Object.keys(USDT0_ADDRESSES);\n}\n\n/**\n * Get preferred token for a chain (USDT0 > USDC > USDT)\n */\nexport function getPreferredToken(chain: string): TokenInfo | undefined {\n const tokens = CHAIN_TOKENS[chain];\n if (!tokens || tokens.length === 0) return undefined;\n\n // Priority: USDT0 > USDC > others\n return (\n tokens.find((t) => t.symbol === \"USDT0\") ??\n tokens.find((t) => t.symbol === \"USDC\") ??\n tokens[0]\n );\n}\n","/**\n * Error classes for T402 WDK integration\n *\n * Provides structured error handling with error codes for\n * programmatic error handling and debugging.\n */\n\n/**\n * Error codes for WDK operations\n */\nexport enum WDKErrorCode {\n // Initialization errors (1xxx)\n WDK_NOT_REGISTERED = 1001,\n WDK_NOT_INITIALIZED = 1002,\n INVALID_SEED_PHRASE = 1003,\n WALLET_MANAGER_NOT_REGISTERED = 1004,\n\n // Chain errors (2xxx)\n CHAIN_NOT_CONFIGURED = 2001,\n CHAIN_NOT_SUPPORTED = 2002,\n INVALID_CHAIN_CONFIG = 2003,\n UNKNOWN_CHAIN_ID = 2004,\n\n // Signer errors (3xxx)\n SIGNER_NOT_INITIALIZED = 3001,\n ACCOUNT_FETCH_FAILED = 3002,\n ADDRESS_FETCH_FAILED = 3003,\n\n // Signing errors (4xxx)\n SIGN_TYPED_DATA_FAILED = 4001,\n SIGN_MESSAGE_FAILED = 4002,\n INVALID_TYPED_DATA = 4003,\n INVALID_MESSAGE = 4004,\n USER_REJECTED_SIGNATURE = 4005,\n\n // Balance errors (5xxx)\n BALANCE_FETCH_FAILED = 5001,\n TOKEN_BALANCE_FETCH_FAILED = 5002,\n INVALID_TOKEN_ADDRESS = 5003,\n\n // Transaction errors (6xxx)\n TRANSACTION_FAILED = 6001,\n GAS_ESTIMATION_FAILED = 6002,\n INSUFFICIENT_BALANCE = 6003,\n TRANSACTION_REVERTED = 6004,\n TRANSACTION_TIMEOUT = 6005,\n\n // Bridge errors (7xxx)\n BRIDGE_NOT_AVAILABLE = 7001,\n BRIDGE_NOT_SUPPORTED = 7002,\n BRIDGE_FAILED = 7003,\n INSUFFICIENT_BRIDGE_FEE = 7004,\n\n // RPC errors (8xxx)\n RPC_ERROR = 8001,\n RPC_TIMEOUT = 8002,\n RPC_RATE_LIMITED = 8003,\n RPC_CONNECTION_FAILED = 8004,\n\n // Unknown errors (9xxx)\n UNKNOWN_ERROR = 9999,\n}\n\n/**\n * Base error class for WDK operations\n */\nexport class WDKError extends Error {\n readonly code: WDKErrorCode;\n readonly cause?: Error;\n readonly context?: Record<string, unknown>;\n\n constructor(\n code: WDKErrorCode,\n message: string,\n options?: {\n cause?: Error;\n context?: Record<string, unknown>;\n },\n ) {\n super(message);\n this.name = \"WDKError\";\n this.code = code;\n this.cause = options?.cause;\n this.context = options?.context;\n\n // Maintain proper stack trace\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, WDKError);\n }\n }\n\n /**\n * Create a JSON-serializable representation\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n context: this.context,\n cause: this.cause?.message,\n stack: this.stack,\n };\n }\n\n /**\n * Check if error is retryable\n */\n isRetryable(): boolean {\n return [\n WDKErrorCode.RPC_TIMEOUT,\n WDKErrorCode.RPC_RATE_LIMITED,\n WDKErrorCode.RPC_CONNECTION_FAILED,\n WDKErrorCode.BALANCE_FETCH_FAILED,\n WDKErrorCode.TOKEN_BALANCE_FETCH_FAILED,\n WDKErrorCode.GAS_ESTIMATION_FAILED,\n ].includes(this.code);\n }\n}\n\n/**\n * Error thrown when WDK is not properly initialized\n */\nexport class WDKInitializationError extends WDKError {\n constructor(\n message: string,\n options?: {\n cause?: Error;\n context?: Record<string, unknown>;\n },\n ) {\n super(WDKErrorCode.WDK_NOT_INITIALIZED, message, options);\n this.name = \"WDKInitializationError\";\n }\n}\n\n/**\n * Error thrown for chain-related issues\n */\nexport class ChainError extends WDKError {\n readonly chain?: string;\n\n constructor(\n code: WDKErrorCode,\n message: string,\n options?: {\n chain?: string;\n cause?: Error;\n context?: Record<string, unknown>;\n },\n ) {\n super(code, message, {\n cause: options?.cause,\n context: { ...options?.context, chain: options?.chain },\n });\n this.name = \"ChainError\";\n this.chain = options?.chain;\n }\n}\n\n/**\n * Error thrown for signer-related issues\n */\nexport class SignerError extends WDKError {\n readonly chain?: string;\n readonly address?: string;\n\n constructor(\n code: WDKErrorCode,\n message: string,\n options?: {\n chain?: string;\n address?: string;\n cause?: Error;\n context?: Record<string, unknown>;\n },\n ) {\n super(code, message, {\n cause: options?.cause,\n context: { ...options?.context, chain: options?.chain, address: options?.address },\n });\n this.name = \"SignerError\";\n this.chain = options?.chain;\n this.address = options?.address;\n }\n}\n\n/**\n * Error thrown for signing operations\n */\nexport class SigningError extends WDKError {\n readonly operation: \"signTypedData\" | \"signMessage\";\n\n constructor(\n code: WDKErrorCode,\n message: string,\n options: {\n operation: \"signTypedData\" | \"signMessage\";\n cause?: Error;\n context?: Record<string, unknown>;\n },\n ) {\n super(code, message, {\n cause: options.cause,\n context: { ...options.context, operation: options.operation },\n });\n this.name = \"SigningError\";\n this.operation = options.operation;\n }\n}\n\n/**\n * Error thrown for balance operations\n */\nexport class BalanceError extends WDKError {\n readonly chain?: string;\n readonly token?: string;\n\n constructor(\n code: WDKErrorCode,\n message: string,\n options?: {\n chain?: string;\n token?: string;\n cause?: Error;\n context?: Record<string, unknown>;\n },\n ) {\n super(code, message, {\n cause: options?.cause,\n context: { ...options?.context, chain: options?.chain, token: options?.token },\n });\n this.name = \"BalanceError\";\n this.chain = options?.chain;\n this.token = options?.token;\n }\n}\n\n/**\n * Error thrown for transaction operations\n */\nexport class TransactionError extends WDKError {\n readonly chain?: string;\n readonly txHash?: string;\n\n constructor(\n code: WDKErrorCode,\n message: string,\n options?: {\n chain?: string;\n txHash?: string;\n cause?: Error;\n context?: Record<string, unknown>;\n },\n ) {\n super(code, message, {\n cause: options?.cause,\n context: { ...options?.context, chain: options?.chain, txHash: options?.txHash },\n });\n this.name = \"TransactionError\";\n this.chain = options?.chain;\n this.txHash = options?.txHash;\n }\n}\n\n/**\n * Error thrown for bridge operations\n */\nexport class BridgeError extends WDKError {\n readonly fromChain?: string;\n readonly toChain?: string;\n\n constructor(\n code: WDKErrorCode,\n message: string,\n options?: {\n fromChain?: string;\n toChain?: string;\n cause?: Error;\n context?: Record<string, unknown>;\n },\n ) {\n super(code, message, {\n cause: options?.cause,\n context: {\n ...options?.context,\n fromChain: options?.fromChain,\n toChain: options?.toChain,\n },\n });\n this.name = \"BridgeError\";\n this.fromChain = options?.fromChain;\n this.toChain = options?.toChain;\n }\n}\n\n/**\n * Error thrown for RPC-related issues\n */\nexport class RPCError extends WDKError {\n readonly endpoint?: string;\n readonly rpcCode?: number;\n\n constructor(\n code: WDKErrorCode,\n message: string,\n options?: {\n endpoint?: string;\n rpcCode?: number;\n cause?: Error;\n context?: Record<string, unknown>;\n },\n ) {\n super(code, message, {\n cause: options?.cause,\n context: {\n ...options?.context,\n endpoint: options?.endpoint,\n rpcCode: options?.rpcCode,\n },\n });\n this.name = \"RPCError\";\n this.endpoint = options?.endpoint;\n this.rpcCode = options?.rpcCode;\n }\n}\n\n/**\n * Wrap an unknown error into a WDKError\n */\nexport function wrapError(\n error: unknown,\n defaultCode: WDKErrorCode = WDKErrorCode.UNKNOWN_ERROR,\n defaultMessage = \"An unknown error occurred\",\n context?: Record<string, unknown>,\n): WDKError {\n // Already a WDKError\n if (error instanceof WDKError) {\n return error;\n }\n\n // Standard Error\n if (error instanceof Error) {\n // Check for common RPC error patterns\n const msg = error.message.toLowerCase();\n\n if (msg.includes(\"timeout\") || msg.includes(\"timed out\")) {\n return new RPCError(WDKErrorCode.RPC_TIMEOUT, `Request timeout: ${error.message}`, {\n cause: error,\n context,\n });\n }\n\n if (msg.includes(\"rate limit\") || msg.includes(\"too many requests\") || msg.includes(\"429\")) {\n return new RPCError(\n WDKErrorCode.RPC_RATE_LIMITED,\n `Rate limited: ${error.message}`,\n { cause: error, context },\n );\n }\n\n if (\n msg.includes(\"connection\") ||\n msg.includes(\"network\") ||\n msg.includes(\"econnrefused\") ||\n msg.includes(\"enotfound\")\n ) {\n return new RPCError(\n WDKErrorCode.RPC_CONNECTION_FAILED,\n `Connection failed: ${error.message}`,\n { cause: error, context },\n );\n }\n\n if (msg.includes(\"insufficient funds\") || msg.includes(\"insufficient balance\")) {\n return new TransactionError(\n WDKErrorCode.INSUFFICIENT_BALANCE,\n `Insufficient balance: ${error.message}`,\n { cause: error, context },\n );\n }\n\n if (msg.includes(\"user rejected\") || msg.includes(\"user denied\")) {\n return new SigningError(\n WDKErrorCode.USER_REJECTED_SIGNATURE,\n \"User rejected the signature request\",\n { operation: \"signTypedData\", cause: error, context },\n );\n }\n\n if (msg.includes(\"reverted\") || msg.includes(\"revert\")) {\n return new TransactionError(\n WDKErrorCode.TRANSACTION_REVERTED,\n `Transaction reverted: ${error.message}`,\n { cause: error, context },\n );\n }\n\n return new WDKError(defaultCode, error.message || defaultMessage, {\n cause: error,\n context,\n });\n }\n\n // Unknown error type\n return new WDKError(defaultCode, String(error) || defaultMessage, { context });\n}\n\n/**\n * Type guard to check if an error is a WDKError\n */\nexport function isWDKError(error: unknown): error is WDKError {\n return error instanceof WDKError;\n}\n\n/**\n * Type guard to check if an error has a specific code\n */\nexport function hasErrorCode(error: unknown, code: WDKErrorCode): boolean {\n return isWDKError(error) && error.code === code;\n}\n\n/**\n * Retry configuration\n */\nexport interface RetryConfig {\n /** Maximum number of retries */\n maxRetries: number;\n /** Base delay in milliseconds */\n baseDelay: number;\n /** Maximum delay in milliseconds */\n maxDelay: number;\n /** Whether to use exponential backoff */\n exponentialBackoff: boolean;\n}\n\n/**\n * Default retry configuration\n */\nexport const DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxRetries: 3,\n baseDelay: 1000,\n maxDelay: 10000,\n exponentialBackoff: true,\n};\n\n/**\n * Execute an async function with retry logic\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n config: Partial<RetryConfig> = {},\n): Promise<T> {\n const { maxRetries, baseDelay, maxDelay, exponentialBackoff } = {\n ...DEFAULT_RETRY_CONFIG,\n ...config,\n };\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Check if error is retryable\n const wdkError = wrapError(error);\n if (!wdkError.isRetryable() || attempt >= maxRetries) {\n throw wdkError;\n }\n\n // Calculate delay with exponential backoff\n const delay = exponentialBackoff\n ? Math.min(baseDelay * Math.pow(2, attempt), maxDelay)\n : baseDelay;\n\n // Add jitter to prevent thundering herd\n const jitter = Math.random() * delay * 0.1;\n await sleep(delay + jitter);\n }\n }\n\n throw lastError ?? new Error(\"Retry failed with unknown error\");\n}\n\n/**\n * Sleep for a given number of milliseconds\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Timeout wrapper for async operations\n */\nexport async function withTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n operation = \"Operation\",\n): Promise<T> {\n let timeoutId: ReturnType<typeof setTimeout>;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(\n new RPCError(\n WDKErrorCode.RPC_TIMEOUT,\n `${operation} timed out after ${timeoutMs}ms`,\n ),\n );\n }, timeoutMs);\n });\n\n try {\n return await Promise.race([promise, timeoutPromise]);\n } finally {\n clearTimeout(timeoutId!);\n }\n}\n","/**\n * WDK Signer implementation for T402 payments\n *\n * This signer wraps the Tether WDK account to provide a T402-compatible\n * signing interface for EVM chains.\n */\n\nimport type { Address } from \"viem\";\nimport type { ClientEvmSigner } from \"@t402/evm\";\nimport type { WDKAccount, WDKInstance, TypedDataDomain, TypedDataTypes } from \"./types.js\";\nimport { getChainId } from \"./chains.js\";\nimport {\n SignerError,\n SigningError,\n BalanceError,\n TransactionError,\n WDKErrorCode,\n wrapError,\n withRetry,\n withTimeout,\n type RetryConfig,\n} from \"./errors.js\";\n\n/**\n * Default timeout for signer operations (30 seconds)\n */\nconst DEFAULT_TIMEOUT_MS = 30000;\n\n/**\n * Default retry config for balance operations\n */\nconst DEFAULT_BALANCE_RETRY: Partial<RetryConfig> = {\n maxRetries: 2,\n baseDelay: 500,\n};\n\n/**\n * WDK Signer for T402 EVM payments\n *\n * Implements the ClientEvmSigner interface from @t402/evm,\n * wrapping a Tether WDK account for signing operations.\n *\n * @example\n * ```typescript\n * import { T402WDK } from '@t402/wdk';\n *\n * const wdk = new T402WDK(seedPhrase, { arbitrum: 'https://arb1.arbitrum.io/rpc' });\n * const signer = await wdk.getSigner('arbitrum');\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', signer }]\n * });\n * ```\n */\nexport class WDKSigner implements ClientEvmSigner {\n private _wdk: WDKInstance;\n private _chain: string;\n private _accountIndex: number;\n private _account: WDKAccount | null = null;\n private _address: Address | null = null;\n private _timeoutMs: number;\n\n /**\n * Create a new WDK signer\n *\n * @param wdk - The WDK instance\n * @param chain - Chain name (e.g., \"arbitrum\", \"ethereum\")\n * @param accountIndex - HD wallet account index (default: 0)\n * @param timeoutMs - Timeout for operations in milliseconds (default: 30000)\n */\n constructor(wdk: WDKInstance, chain: string, accountIndex = 0, timeoutMs = DEFAULT_TIMEOUT_MS) {\n if (!wdk) {\n throw new SignerError(\n WDKErrorCode.WDK_NOT_INITIALIZED,\n \"WDK instance is required\",\n { chain },\n );\n }\n\n if (!chain || typeof chain !== \"string\") {\n throw new SignerError(\n WDKErrorCode.CHAIN_NOT_CONFIGURED,\n \"Chain name is required and must be a string\",\n { chain },\n );\n }\n\n if (accountIndex < 0 || !Number.isInteger(accountIndex)) {\n throw new SignerError(\n WDKErrorCode.SIGNER_NOT_INITIALIZED,\n \"Account index must be a non-negative integer\",\n { chain, context: { accountIndex } },\n );\n }\n\n this._wdk = wdk;\n this._chain = chain;\n this._accountIndex = accountIndex;\n this._timeoutMs = timeoutMs;\n }\n\n /**\n * Get the wallet address\n * Throws if signer is not initialized\n */\n get address(): Address {\n if (!this._address) {\n throw new SignerError(\n WDKErrorCode.SIGNER_NOT_INITIALIZED,\n `Signer not initialized for chain \"${this._chain}\". Call initialize() first or use createWDKSigner() async factory.`,\n { chain: this._chain },\n );\n }\n return this._address;\n }\n\n /**\n * Check if the signer is initialized\n */\n get isInitialized(): boolean {\n return this._account !== null && this._address !== null;\n }\n\n /**\n * Initialize the signer by fetching the account\n * Must be called before using the signer\n *\n * @throws {SignerError} If account fetch fails\n */\n async initialize(): Promise<void> {\n if (this._account) return;\n\n try {\n const accountPromise = this._wdk.getAccount(this._chain, this._accountIndex);\n this._account = await withTimeout(\n accountPromise,\n this._timeoutMs,\n `Fetching account for ${this._chain}`,\n );\n\n const addressPromise = this._account.getAddress();\n const addressString = await withTimeout(\n addressPromise,\n this._timeoutMs,\n `Fetching address for ${this._chain}`,\n );\n\n // Validate address format\n if (!addressString || !addressString.startsWith(\"0x\")) {\n throw new SignerError(\n WDKErrorCode.ADDRESS_FETCH_FAILED,\n `Invalid address format received: ${addressString}`,\n { chain: this._chain },\n );\n }\n\n this._address = addressString as Address;\n } catch (error) {\n // Reset state on failure\n this._account = null;\n this._address = null;\n\n // Re-throw if already a typed error\n if (error instanceof SignerError) {\n throw error;\n }\n\n throw new SignerError(\n WDKErrorCode.ACCOUNT_FETCH_FAILED,\n `Failed to initialize signer for chain \"${this._chain}\": ${error instanceof Error ? error.message : String(error)}`,\n {\n chain: this._chain,\n cause: error instanceof Error ? error : undefined,\n context: { accountIndex: this._accountIndex },\n },\n );\n }\n }\n\n /**\n * Get the underlying WDK account\n * Initializes if not already done\n *\n * @throws {SignerError} If initialization fails\n */\n private async getAccount(): Promise<WDKAccount> {\n if (!this._account) {\n await this.initialize();\n }\n return this._account!;\n }\n\n /**\n * Sign EIP-712 typed data for T402 payments\n *\n * This is the primary signing method used by T402 for EIP-3009\n * transferWithAuthorization payments.\n *\n * @throws {SigningError} If signing fails\n */\n async signTypedData(message: {\n domain: Record<string, unknown>;\n types: Record<string, unknown>;\n primaryType: string;\n message: Record<string, unknown>;\n }): Promise<`0x${string}`> {\n // Validate input\n if (!message || typeof message !== \"object\") {\n throw new SigningError(\n WDKErrorCode.INVALID_TYPED_DATA,\n \"Invalid typed data: message object is required\",\n { operation: \"signTypedData\", context: { chain: this._chain } },\n );\n }\n\n if (!message.domain || !message.types || !message.primaryType || !message.message) {\n throw new SigningError(\n WDKErrorCode.INVALID_TYPED_DATA,\n \"Invalid typed data: domain, types, primaryType, and message are required\",\n {\n operation: \"signTypedData\",\n context: {\n chain: this._chain,\n hasFields: {\n domain: !!message.domain,\n types: !!message.types,\n primaryType: !!message.primaryType,\n message: !!message.message,\n },\n },\n },\n );\n }\n\n try {\n const account = await this.getAccount();\n\n const signPromise = account.signTypedData({\n domain: message.domain,\n types: message.types,\n primaryType: message.primaryType,\n message: message.message,\n });\n\n const signature = await withTimeout(\n signPromise,\n this._timeoutMs,\n \"Signing typed data\",\n );\n\n // Validate signature format\n if (!signature || !signature.startsWith(\"0x\")) {\n throw new SigningError(\n WDKErrorCode.SIGN_TYPED_DATA_FAILED,\n `Invalid signature format received: ${signature?.substring(0, 10)}...`,\n { operation: \"signTypedData\", context: { chain: this._chain } },\n );\n }\n\n return signature as `0x${string}`;\n } catch (error) {\n if (error instanceof SigningError) {\n throw error;\n }\n\n const wrapped = wrapError(error, WDKErrorCode.SIGN_TYPED_DATA_FAILED, \"Failed to sign typed data\", {\n chain: this._chain,\n primaryType: message.primaryType,\n });\n\n throw new SigningError(\n wrapped.code as WDKErrorCode,\n wrapped.message,\n {\n operation: \"signTypedData\",\n cause: wrapped.cause,\n context: wrapped.context,\n },\n );\n }\n }\n\n /**\n * Sign a personal message\n *\n * @throws {SigningError} If signing fails\n */\n async signMessage(message: string | Uint8Array): Promise<`0x${string}`> {\n // Validate input\n if (message === undefined || message === null) {\n throw new SigningError(\n WDKErrorCode.INVALID_MESSAGE,\n \"Message is required for signing\",\n { operation: \"signMessage\", context: { chain: this._chain } },\n );\n }\n\n if (typeof message !== \"string\" && !(message instanceof Uint8Array)) {\n throw new SigningError(\n WDKErrorCode.INVALID_MESSAGE,\n \"Message must be a string or Uint8Array\",\n { operation: \"signMessage\", context: { chain: this._chain, type: typeof message } },\n );\n }\n\n try {\n const account = await this.getAccount();\n\n const messageStr = typeof message === \"string\"\n ? message\n : Buffer.from(message).toString(\"utf-8\");\n\n const signPromise = account.signMessage(messageStr);\n const signature = await withTimeout(\n signPromise,\n this._timeoutMs,\n \"Signing message\",\n );\n\n // Validate signature format\n if (!signature || !signature.startsWith(\"0x\")) {\n throw new SigningError(\n WDKErrorCode.SIGN_MESSAGE_FAILED,\n `Invalid signature format received: ${signature?.substring(0, 10)}...`,\n { operation: \"signMessage\", context: { chain: this._chain } },\n );\n }\n\n return signature as `0x${string}`;\n } catch (error) {\n if (error instanceof SigningError) {\n throw error;\n }\n\n const wrapped = wrapError(error, WDKErrorCode.SIGN_MESSAGE_FAILED, \"Failed to sign message\", {\n chain: this._chain,\n });\n\n throw new SigningError(\n wrapped.code as WDKErrorCode,\n wrapped.message,\n {\n operation: \"signMessage\",\n cause: wrapped.cause,\n context: wrapped.context,\n },\n );\n }\n }\n\n /**\n * Get the chain name\n */\n getChain(): string {\n return this._chain;\n }\n\n /**\n * Get the chain ID\n */\n getChainId(): number {\n return getChainId(this._chain);\n }\n\n /**\n * Get the account index\n */\n getAccountIndex(): number {\n return this._accountIndex;\n }\n\n /**\n * Get native token balance (ETH, etc.)\n *\n * @throws {BalanceError} If balance fetch fails\n */\n async getBalance(): Promise<bigint> {\n try {\n const account = await this.getAccount();\n\n return await withRetry(\n async () => {\n const balancePromise = account.getBalance();\n return withTimeout(balancePromise, this._timeoutMs, \"Fetching native balance\");\n },\n DEFAULT_BALANCE_RETRY,\n );\n } catch (error) {\n if (error instanceof BalanceError) {\n throw error;\n }\n\n throw new BalanceError(\n WDKErrorCode.BALANCE_FETCH_FAILED,\n `Failed to get native balance for ${this._chain}: ${error instanceof Error ? error.message : String(error)}`,\n {\n chain: this._chain,\n cause: error instanceof Error ? error : undefined,\n },\n );\n }\n }\n\n /**\n * Get ERC20 token balance\n *\n * @throws {BalanceError} If balance fetch fails\n */\n async getTokenBalance(tokenAddress: Address): Promise<bigint> {\n // Validate token address\n if (!tokenAddress || !tokenAddress.startsWith(\"0x\")) {\n throw new BalanceError(\n WDKErrorCode.INVALID_TOKEN_ADDRESS,\n `Invalid token address: ${tokenAddress}`,\n { chain: this._chain, token: tokenAddress },\n );\n }\n\n try {\n const account = await this.getAccount();\n\n return await withRetry(\n async () => {\n const balancePromise = account.getTokenBalance(tokenAddress);\n return withTimeout(balancePromise, this._timeoutMs, \"Fetching token balance\");\n },\n DEFAULT_BALANCE_RETRY,\n );\n } catch (error) {\n if (error instanceof BalanceError) {\n throw error;\n }\n\n throw new BalanceError(\n WDKErrorCode.TOKEN_BALANCE_FETCH_FAILED,\n `Failed to get token balance for ${tokenAddress} on ${this._chain}: ${error instanceof Error ? error.message : String(error)}`,\n {\n chain: this._chain,\n token: tokenAddress,\n cause: error instanceof Error ? error : undefined,\n },\n );\n }\n }\n\n /**\n * Estimate gas for a transaction\n *\n * @throws {TransactionError} If gas estimation fails\n */\n async estimateGas(params: { to: Address; value?: bigint; data?: string }): Promise<bigint> {\n // Validate params\n if (!params.to || !params.to.startsWith(\"0x\")) {\n throw new TransactionError(\n WDKErrorCode.GAS_ESTIMATION_FAILED,\n `Invalid 'to' address: ${params.to}`,\n { chain: this._chain, context: params },\n );\n }\n\n try {\n const account = await this.getAccount();\n\n return await withRetry(\n async () => {\n const estimatePromise = account.estimateGas({\n to: params.to,\n value: params.value,\n data: params.data,\n });\n return withTimeout(estimatePromise, this._timeoutMs, \"Estimating gas\");\n },\n DEFAULT_BALANCE_RETRY,\n );\n } catch (error) {\n if (error instanceof TransactionError) {\n throw error;\n }\n\n throw new TransactionError(\n WDKErrorCode.GAS_ESTIMATION_FAILED,\n `Failed to estimate gas on ${this._chain}: ${error instanceof Error ? error.message : String(error)}`,\n {\n chain: this._chain,\n cause: error instanceof Error ? error : undefined,\n context: { to: params.to, value: params.value?.toString() },\n },\n );\n }\n }\n\n /**\n * Send a transaction (for advanced use cases)\n *\n * @throws {TransactionError} If transaction fails\n */\n async sendTransaction(params: {\n to: Address;\n value?: bigint;\n data?: string;\n }): Promise<{ hash: `0x${string}` }> {\n // Validate params\n if (!params.to || !params.to.startsWith(\"0x\")) {\n throw new TransactionError(\n WDKErrorCode.TRANSACTION_FAILED,\n `Invalid 'to' address: ${params.to}`,\n { chain: this._chain, context: params },\n );\n }\n\n try {\n const account = await this.getAccount();\n\n const sendPromise = account.sendTransaction({\n to: params.to,\n value: params.value,\n data: params.data,\n });\n\n const hash = await withTimeout(\n sendPromise,\n this._timeoutMs * 2, // Double timeout for transaction submission\n \"Sending transaction\",\n );\n\n // Validate hash format\n if (!hash || !hash.startsWith(\"0x\")) {\n throw new TransactionError(\n WDKErrorCode.TRANSACTION_FAILED,\n `Invalid transaction hash received: ${hash?.substring(0, 10)}...`,\n { chain: this._chain },\n );\n }\n\n return { hash: hash as `0x${string}` };\n } catch (error) {\n if (error instanceof TransactionError) {\n throw error;\n }\n\n const wrapped = wrapError(error, WDKErrorCode.TRANSACTION_FAILED, \"Transaction failed\", {\n chain: this._chain,\n to: params.to,\n });\n\n throw new TransactionError(\n wrapped.code as WDKErrorCode,\n wrapped.message,\n {\n chain: this._chain,\n cause: wrapped.cause,\n context: wrapped.context,\n },\n );\n }\n }\n}\n\n/**\n * Create an initialized WDK signer\n *\n * This async factory function creates and initializes a WDK signer,\n * ensuring the address is available immediately.\n *\n * @throws {SignerError} If initialization fails\n *\n * @example\n * ```typescript\n * const signer = await createWDKSigner(wdkInstance, 'arbitrum');\n * console.log('Address:', signer.address); // Works immediately\n * ```\n */\nexport async function createWDKSigner(\n wdk: WDKInstance,\n chain: string,\n accountIndex = 0,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n): Promise<WDKSigner> {\n const signer = new WDKSigner(wdk, chain, accountIndex, timeoutMs);\n await signer.initialize();\n return signer;\n}\n\n/**\n * Mock WDK signer for testing purposes\n *\n * Implements the same interface but uses a fixed private key\n * for deterministic testing.\n */\nexport class MockWDKSigner implements ClientEvmSigner {\n readonly address: Address;\n private _privateKey: `0x${string}`;\n\n constructor(address: Address, privateKey: `0x${string}`) {\n this.address = address;\n this._privateKey = privateKey;\n }\n\n async signTypedData(_message: {\n domain: Record<string, unknown>;\n types: Record<string, unknown>;\n primaryType: string;\n message: Record<string, unknown>;\n }): Promise<`0x${string}`> {\n // Mock signature - in real tests, use viem's signTypedData\n return \"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\";\n }\n\n async signMessage(_message: string | Uint8Array): Promise<`0x${string}`> {\n return \"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\";\n }\n}\n","/**\n * T402WDK - Main class for T402 integration with Tether WDK\n *\n * Provides a high-level API for:\n * - Multi-chain wallet management\n * - T402-compatible signers\n * - Balance aggregation\n * - Cross-chain bridging (USDT0)\n */\n\nimport type { Address } from \"viem\";\nimport type {\n T402WDKConfig,\n NormalizedChainConfig,\n WDKInstance,\n WDKConstructor,\n ChainBalance,\n AggregatedBalance,\n TokenBalance,\n BridgeParams,\n BridgeResult,\n T402WDKOptions,\n} from \"./types.js\";\nimport { BalanceCache, type BalanceCacheConfig, type BalanceCacheStats } from \"./cache.js\";\nimport {\n normalizeChainConfig,\n CHAIN_TOKENS,\n USDT0_ADDRESSES,\n USDC_ADDRESSES,\n DEFAULT_RPC_ENDPOINTS,\n} from \"./chains.js\";\nimport { WDKSigner, createWDKSigner } from \"./signer.js\";\nimport { supportsBridging, getBridgeableChains } from \"@t402/evm\";\nimport {\n WDKError,\n WDKInitializationError,\n ChainError,\n BridgeError,\n BalanceError,\n WDKErrorCode,\n wrapError,\n withRetry,\n isWDKError,\n} from \"./errors.js\";\n\n/**\n * T402WDK - Tether WDK integration for T402 payments\n *\n * @example\n * ```typescript\n * import { T402WDK } from '@t402/wdk';\n *\n * // Initialize with seed phrase\n * const seedPhrase = T402WDK.generateSeedPhrase();\n * const wdk = new T402WDK(seedPhrase, {\n * arbitrum: 'https://arb1.arbitrum.io/rpc',\n * base: 'https://mainnet.base.org'\n * });\n *\n * // Get signer for T402 payments\n * const signer = await wdk.getSigner('arbitrum');\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', signer }]\n * });\n * ```\n */\nexport class T402WDK {\n private _wdk: WDKInstance | null = null;\n private _config: T402WDKConfig;\n private _options: T402WDKOptions;\n private _normalizedChains: Map<string, NormalizedChainConfig> = new Map();\n private _seedPhrase: string;\n private _signerCache: Map<string, WDKSigner> = new Map();\n private _balanceCache: BalanceCache;\n private _initializationError: Error | null = null;\n\n // WDK module references (set via registerWDK)\n private static _WDK: WDKConstructor | null = null;\n private static _WalletManagerEvm: unknown = null;\n private static _BridgeUsdt0Evm: unknown = null;\n\n /**\n * Register the Tether WDK modules\n *\n * This must be called before creating T402WDK instances if you want\n * to use the actual WDK. Otherwise, a mock implementation is used.\n *\n * @throws {WDKInitializationError} If registration fails\n *\n * @example\n * ```typescript\n * import WDK from '@tetherto/wdk';\n * import WalletManagerEvm from '@tetherto/wdk-wallet-evm';\n * import BridgeUsdt0Evm from '@tetherto/wdk-protocol-bridge-usdt0-evm';\n *\n * T402WDK.registerWDK(WDK, WalletManagerEvm, BridgeUsdt0Evm);\n * ```\n */\n static registerWDK(\n WDK: WDKConstructor,\n WalletManagerEvm?: unknown,\n BridgeUsdt0Evm?: unknown,\n ): void {\n if (!WDK) {\n throw new WDKInitializationError(\"WDK constructor is required\");\n }\n\n if (typeof WDK !== \"function\") {\n throw new WDKInitializationError(\"WDK must be a constructor function\");\n }\n\n T402WDK._WDK = WDK;\n T402WDK._WalletManagerEvm = WalletManagerEvm ?? null;\n T402WDK._BridgeUsdt0Evm = BridgeUsdt0Evm ?? null;\n }\n\n /**\n * Check if WDK is registered\n */\n static isWDKRegistered(): boolean {\n return T402WDK._WDK !== null;\n }\n\n /**\n * Check if wallet manager is registered\n */\n static isWalletManagerRegistered(): boolean {\n return T402WDK._WalletManagerEvm !== null;\n }\n\n /**\n * Check if bridge protocol is registered\n */\n static isBridgeRegistered(): boolean {\n return T402WDK._BridgeUsdt0Evm !== null;\n }\n\n /**\n * Generate a new random seed phrase\n *\n * @throws {WDKInitializationError} If WDK is not registered\n * @returns A new BIP-39 mnemonic seed phrase\n */\n static generateSeedPhrase(): string {\n if (!T402WDK._WDK) {\n throw new WDKInitializationError(\n \"WDK not registered. Call T402WDK.registerWDK() first, or use a mock seed phrase for testing.\",\n );\n }\n\n try {\n return T402WDK._WDK.getRandomSeedPhrase();\n } catch (error) {\n throw new WDKInitializationError(\n `Failed to generate seed phrase: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * Create a new T402WDK instance\n *\n * @param seedPhrase - BIP-39 mnemonic seed phrase\n * @param config - Chain configuration (RPC endpoints)\n * @param options - Additional options (cache configuration, etc.)\n * @throws {WDKInitializationError} If seed phrase is invalid\n */\n constructor(seedPhrase: string, config: T402WDKConfig = {}, options: T402WDKOptions = {}) {\n // Validate seed phrase\n if (!seedPhrase || typeof seedPhrase !== \"string\") {\n throw new WDKInitializationError(\"Seed phrase is required and must be a string\");\n }\n\n // Basic seed phrase validation (BIP-39 has 12, 15, 18, 21, or 24 words)\n const words = seedPhrase.trim().split(/\\s+/);\n const validWordCounts = [12, 15, 18, 21, 24];\n if (!validWordCounts.includes(words.length)) {\n throw new WDKInitializationError(\n `Invalid seed phrase: expected 12, 15, 18, 21, or 24 words, got ${words.length}`,\n { context: { wordCount: words.length } },\n );\n }\n\n this._seedPhrase = seedPhrase;\n this._config = config;\n this._options = options;\n\n // Initialize balance cache\n this._balanceCache = new BalanceCache(options.cache);\n\n // Normalize chain configurations\n for (const [chain, chainConfig] of Object.entries(config)) {\n if (chainConfig) {\n try {\n this._normalizedChains.set(chain, normalizeChainConfig(chain, chainConfig));\n } catch (error) {\n throw new ChainError(\n WDKErrorCode.INVALID_CHAIN_CONFIG,\n `Invalid configuration for chain \"${chain}\": ${error instanceof Error ? error.message : String(error)}`,\n { chain, cause: error instanceof Error ? error : undefined },\n );\n }\n }\n }\n\n // Add default chains if not configured\n this._addDefaultChainsIfNeeded();\n\n // Initialize WDK if registered\n if (T402WDK._WDK) {\n this._initializeWDK();\n }\n }\n\n /**\n * Add default chain configurations for common chains\n */\n private _addDefaultChainsIfNeeded(): void {\n // Add Arbitrum as default if no chains configured (USDT0 hub)\n if (this._normalizedChains.size === 0) {\n const defaultEndpoint = DEFAULT_RPC_ENDPOINTS.arbitrum;\n if (defaultEndpoint) {\n this._normalizedChains.set(\n \"arbitrum\",\n normalizeChainConfig(\"arbitrum\", defaultEndpoint),\n );\n }\n }\n }\n\n /**\n * Initialize the underlying WDK instance\n */\n private _initializeWDK(): void {\n if (!T402WDK._WDK) {\n this._initializationError = new WDKInitializationError(\"WDK not registered\");\n return;\n }\n\n if (!T402WDK._WalletManagerEvm) {\n this._initializationError = new WDKInitializationError(\n \"WalletManagerEvm not registered. Call T402WDK.registerWDK(WDK, WalletManagerEvm) to enable wallet functionality.\",\n );\n return;\n }\n\n try {\n let wdk = new T402WDK._WDK(this._seedPhrase);\n\n // Register EVM wallets for each configured chain\n for (const [chain, config] of this._normalizedChains) {\n try {\n wdk = wdk.registerWallet(chain, T402WDK._WalletManagerEvm, {\n provider: config.provider,\n chainId: config.chainId,\n });\n } catch (error) {\n throw new ChainError(\n WDKErrorCode.CHAIN_NOT_SUPPORTED,\n `Failed to register wallet for chain \"${chain}\": ${error instanceof Error ? error.message : String(error)}`,\n { chain, cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n // Register USDT0 bridge protocol if available\n if (T402WDK._BridgeUsdt0Evm) {\n try {\n wdk = wdk.registerProtocol(\"bridge-usdt0\", T402WDK._BridgeUsdt0Evm);\n } catch (error) {\n // Bridge registration failure is non-fatal, just log it\n console.warn(\n `Failed to register USDT0 bridge protocol: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n this._wdk = wdk;\n this._initializationError = null;\n } catch (error) {\n this._initializationError = error instanceof Error ? error : new Error(String(error));\n this._wdk = null;\n }\n }\n\n /**\n * Get the underlying WDK instance\n *\n * @throws {WDKInitializationError} If WDK is not initialized\n */\n get wdk(): WDKInstance {\n if (this._initializationError) {\n throw this._initializationError instanceof WDKError\n ? this._initializationError\n : new WDKInitializationError(\n `WDK initialization failed: ${this._initializationError.message}`,\n { cause: this._initializationError },\n );\n }\n\n if (!this._wdk) {\n throw new WDKInitializationError(\n \"WDK not initialized. Call T402WDK.registerWDK() before creating instances.\",\n );\n }\n return this._wdk;\n }\n\n /**\n * Check if WDK is properly initialized\n */\n get isInitialized(): boolean {\n return this._wdk !== null && this._initializationError === null;\n }\n\n /**\n * Get initialization error if any\n */\n get initializationError(): Error | null {\n return this._initializationError;\n }\n\n /**\n * Get all configured chains\n */\n getConfiguredChains(): string[] {\n return Array.from(this._normalizedChains.keys());\n }\n\n /**\n * Get chain configuration\n */\n getChainConfig(chain: string): NormalizedChainConfig | undefined {\n return this._normalizedChains.get(chain);\n }\n\n /**\n * Check if a chain is configured\n */\n isChainConfigured(chain: string): boolean {\n return this._normalizedChains.has(chain);\n }\n\n /**\n * Get a T402-compatible signer for a chain\n *\n * @param chain - Chain name (e.g., \"arbitrum\", \"ethereum\")\n * @param accountIndex - HD wallet account index (default: 0)\n * @throws {ChainError} If chain is not configured\n * @throws {SignerError} If signer creation fails\n * @returns An initialized WDKSigner\n */\n async getSigner(chain: string, accountIndex = 0): Promise<WDKSigner> {\n // Validate chain parameter\n if (!chain || typeof chain !== \"string\") {\n throw new ChainError(\n WDKErrorCode.CHAIN_NOT_CONFIGURED,\n \"Chain name is required and must be a string\",\n { chain },\n );\n }\n\n const cacheKey = `${chain}:${accountIndex}`;\n\n // Return cached signer if available\n const cached = this._signerCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n // Validate chain is configured\n if (!this._normalizedChains.has(chain)) {\n const availableChains = this.getConfiguredChains();\n throw new ChainError(\n WDKErrorCode.CHAIN_NOT_CONFIGURED,\n `Chain \"${chain}\" not configured. Available chains: ${availableChains.length > 0 ? availableChains.join(\", \") : \"(none)\"}`,\n { chain, context: { availableChains } },\n );\n }\n\n try {\n const signer = await createWDKSigner(this.wdk, chain, accountIndex);\n this._signerCache.set(cacheKey, signer);\n return signer;\n } catch (error) {\n // Re-throw WDK errors as-is\n if (isWDKError(error)) {\n throw error;\n }\n\n throw wrapError(\n error,\n WDKErrorCode.SIGNER_NOT_INITIALIZED,\n `Failed to create signer for chain \"${chain}\"`,\n { chain, accountIndex },\n );\n }\n }\n\n /**\n * Clear the signer cache\n * Useful for forcing re-initialization of signers\n */\n clearSignerCache(): void {\n this._signerCache.clear();\n }\n\n /**\n * Get wallet address for a chain\n *\n * @param chain - Chain name\n * @param accountIndex - HD wallet account index (default: 0)\n * @throws {ChainError} If chain is not configured\n * @throws {SignerError} If address fetch fails\n */\n async getAddress(chain: string, accountIndex = 0): Promise<Address> {\n const signer = await this.getSigner(chain, accountIndex);\n return signer.address;\n }\n\n /**\n * Get USDT0 balance for a chain\n *\n * Uses cache if enabled to reduce RPC calls.\n *\n * @throws {BalanceError} If balance fetch fails\n */\n async getUsdt0Balance(chain: string, accountIndex = 0): Promise<bigint> {\n const usdt0Address = USDT0_ADDRESSES[chain];\n if (!usdt0Address) {\n return 0n;\n }\n\n try {\n const signer = await this.getSigner(chain, accountIndex);\n const address = signer.address;\n\n return await this._balanceCache.getOrFetchTokenBalance(\n chain,\n usdt0Address,\n address,\n async () => signer.getTokenBalance(usdt0Address),\n );\n } catch (error) {\n // Return 0 for balance errors (chain might not support USDT0)\n if (isWDKError(error) && error.code === WDKErrorCode.TOKEN_BALANCE_FETCH_FAILED) {\n return 0n;\n }\n throw error;\n }\n }\n\n /**\n * Get USDC balance for a chain\n *\n * Uses cache if enabled to reduce RPC calls.\n *\n * @throws {BalanceError} If balance fetch fails\n */\n async getUsdcBalance(chain: string, accountIndex = 0): Promise<bigint> {\n const usdcAddress = USDC_ADDRESSES[chain];\n if (!usdcAddress) {\n return 0n;\n }\n\n try {\n const signer = await this.getSigner(chain, accountIndex);\n const address = signer.address;\n\n return await this._balanceCache.getOrFetchTokenBalance(\n chain,\n usdcAddress,\n address,\n async () => signer.getTokenBalance(usdcAddress),\n );\n } catch (error) {\n // Return 0 for balance errors (chain might not support USDC)\n if (isWDKError(error) && error.code === WDKErrorCode.TOKEN_BALANCE_FETCH_FAILED) {\n return 0n;\n }\n throw error;\n }\n }\n\n /**\n * Get all token balances for a chain\n *\n * Uses cache if enabled to reduce RPC calls.\n *\n * @throws {ChainError} If chain is not configured\n * @throws {BalanceError} If balance fetch fails\n */\n async getChainBalances(chain: string, accountIndex = 0): Promise<ChainBalance> {\n const config = this._normalizedChains.get(chain);\n if (!config) {\n throw new ChainError(\n WDKErrorCode.CHAIN_NOT_CONFIGURED,\n `Chain \"${chain}\" not configured`,\n { chain },\n );\n }\n\n try {\n const signer = await this.getSigner(chain, accountIndex);\n const address = signer.address;\n const tokens = CHAIN_TOKENS[chain] || [];\n\n // Fetch all token balances in parallel with caching and error handling\n const tokenBalanceResults = await Promise.allSettled(\n tokens.map(async (token) => {\n const balance = await this._balanceCache.getOrFetchTokenBalance(\n chain,\n token.address,\n address,\n async () => signer.getTokenBalance(token.address),\n );\n return {\n token: token.address,\n symbol: token.symbol,\n balance,\n formatted: formatTokenAmount(balance, token.decimals),\n decimals: token.decimals,\n };\n }),\n );\n\n // Extract successful results, use 0 for failed ones\n const tokenBalances: TokenBalance[] = tokenBalanceResults.map((result, index) => {\n if (result.status === \"fulfilled\") {\n return result.value;\n }\n // Return zero balance for failed fetches\n const token = tokens[index];\n return {\n token: token.address,\n symbol: token.symbol,\n balance: 0n,\n formatted: \"0\",\n decimals: token.decimals,\n };\n });\n\n // Get native balance with caching\n let nativeBalance: bigint;\n try {\n nativeBalance = await this._balanceCache.getOrFetchNativeBalance(\n chain,\n address,\n async () => signer.getBalance(),\n );\n } catch {\n nativeBalance = 0n;\n }\n\n return {\n chain,\n network: config.network,\n native: nativeBalance,\n tokens: tokenBalances,\n };\n } catch (error) {\n if (isWDKError(error)) {\n throw error;\n }\n\n throw new BalanceError(\n WDKErrorCode.BALANCE_FETCH_FAILED,\n `Failed to get balances for chain \"${chain}\": ${error instanceof Error ? error.message : String(error)}`,\n { chain, cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * Get aggregated balances across all configured chains\n *\n * @param accountIndex - HD wallet account index (default: 0)\n * @param options - Options for balance aggregation\n */\n async getAggregatedBalances(\n accountIndex = 0,\n options: { continueOnError?: boolean } = {},\n ): Promise<AggregatedBalance> {\n const { continueOnError = true } = options;\n const chains = this.getConfiguredChains();\n\n // Fetch all chain balances in parallel\n const results = await Promise.allSettled(\n chains.map((chain) => this.getChainBalances(chain, accountIndex)),\n );\n\n const chainBalances: ChainBalance[] = [];\n const errors: Error[] = [];\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n if (result.status === \"fulfilled\") {\n chainBalances.push(result.value);\n } else {\n errors.push(result.reason);\n if (!continueOnError) {\n throw result.reason;\n }\n // Add empty balance for failed chain\n const config = this._normalizedChains.get(chains[i]);\n if (config) {\n chainBalances.push({\n chain: chains[i],\n network: config.network,\n native: 0n,\n tokens: [],\n });\n }\n }\n }\n\n // Calculate totals\n let totalUsdt0 = 0n;\n let totalUsdc = 0n;\n\n for (const chainBalance of chainBalances) {\n for (const token of chainBalance.tokens) {\n if (token.symbol === \"USDT0\") {\n totalUsdt0 += token.balance;\n } else if (token.symbol === \"USDC\") {\n totalUsdc += token.balance;\n }\n }\n }\n\n return {\n totalUsdt0,\n totalUsdc,\n chains: chainBalances,\n };\n }\n\n /**\n * Find the best chain for a payment\n *\n * Looks for the chain with sufficient balance, prioritizing USDT0.\n *\n * @param amount - Required amount in smallest units\n * @param preferredToken - Preferred token (\"USDT0\" | \"USDC\")\n * @throws {BalanceError} If balance aggregation fails\n */\n async findBestChainForPayment(\n amount: bigint,\n preferredToken: \"USDT0\" | \"USDC\" = \"USDT0\",\n ): Promise<{ chain: string; token: string; balance: bigint } | null> {\n // Validate amount\n if (amount <= 0n) {\n return null;\n }\n\n try {\n const balances = await this.getAggregatedBalances(0, { continueOnError: true });\n\n // Priority order based on preferred token\n const tokenPriority = preferredToken === \"USDT0\" ? [\"USDT0\", \"USDC\"] : [\"USDC\", \"USDT0\"];\n\n for (const tokenSymbol of tokenPriority) {\n for (const chainBalance of balances.chains) {\n const tokenBalance = chainBalance.tokens.find((t) => t.symbol === tokenSymbol);\n if (tokenBalance && tokenBalance.balance >= amount) {\n return {\n chain: chainBalance.chain,\n token: tokenSymbol,\n balance: tokenBalance.balance,\n };\n }\n }\n }\n\n return null;\n } catch (error) {\n if (isWDKError(error)) {\n throw error;\n }\n\n throw new BalanceError(\n WDKErrorCode.BALANCE_FETCH_FAILED,\n `Failed to find best chain for payment: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error instanceof Error ? error : undefined, context: { amount: amount.toString() } },\n );\n }\n }\n\n /**\n * Bridge USDT0 between chains\n *\n * Uses LayerZero OFT for cross-chain transfers.\n *\n * @param params - Bridge parameters\n * @throws {BridgeError} If bridge is not available or fails\n * @returns Bridge result with transaction hash\n */\n async bridgeUsdt0(params: BridgeParams): Promise<BridgeResult> {\n // Validate bridge availability\n if (!T402WDK._BridgeUsdt0Evm) {\n throw new BridgeError(\n WDKErrorCode.BRIDGE_NOT_AVAILABLE,\n \"USDT0 bridge not available. Register BridgeUsdt0Evm with T402WDK.registerWDK().\",\n { fromChain: params.fromChain, toChain: params.toChain },\n );\n }\n\n // Validate parameters\n if (!params.fromChain || !params.toChain) {\n throw new BridgeError(\n WDKErrorCode.BRIDGE_FAILED,\n \"Both fromChain and toChain are required\",\n { fromChain: params.fromChain, toChain: params.toChain },\n );\n }\n\n if (params.fromChain === params.toChain) {\n throw new BridgeError(\n WDKErrorCode.BRIDGE_NOT_SUPPORTED,\n \"Cannot bridge to the same chain\",\n { fromChain: params.fromChain, toChain: params.toChain },\n );\n }\n\n if (!params.amount || params.amount <= 0n) {\n throw new BridgeError(\n WDKErrorCode.BRIDGE_FAILED,\n \"Amount must be greater than 0\",\n { fromChain: params.fromChain, toChain: params.toChain, context: { amount: params.amount?.toString() } },\n );\n }\n\n // Check if bridging is supported\n if (!this.canBridge(params.fromChain, params.toChain)) {\n throw new BridgeError(\n WDKErrorCode.BRIDGE_NOT_SUPPORTED,\n `Bridging from \"${params.fromChain}\" to \"${params.toChain}\" is not supported`,\n { fromChain: params.fromChain, toChain: params.toChain },\n );\n }\n\n try {\n const recipient = params.recipient ?? (await this.getAddress(params.toChain));\n\n const result = await this.wdk.executeProtocol(\"bridge-usdt0\", {\n fromChain: params.fromChain,\n toChain: params.toChain,\n amount: params.amount,\n recipient,\n });\n\n if (!result || !result.txHash) {\n throw new BridgeError(\n WDKErrorCode.BRIDGE_FAILED,\n \"Bridge transaction did not return a transaction hash\",\n { fromChain: params.fromChain, toChain: params.toChain },\n );\n }\n\n return {\n txHash: result.txHash,\n estimatedTime: 300, // ~5 minutes typical for LayerZero\n };\n } catch (error) {\n if (error instanceof BridgeError) {\n throw error;\n }\n\n throw new BridgeError(\n WDKErrorCode.BRIDGE_FAILED,\n `Bridge operation failed: ${error instanceof Error ? error.message : String(error)}`,\n {\n fromChain: params.fromChain,\n toChain: params.toChain,\n cause: error instanceof Error ? error : undefined,\n context: { amount: params.amount.toString() },\n },\n );\n }\n }\n\n /**\n * Get chains that support USDT0\n */\n getUsdt0Chains(): string[] {\n return this.getConfiguredChains().filter((chain) => USDT0_ADDRESSES[chain]);\n }\n\n /**\n * Get chains that support USDT0 bridging\n *\n * Returns configured chains that have LayerZero OFT bridge support.\n */\n getBridgeableChains(): string[] {\n return this.getConfiguredChains().filter((chain) => supportsBridging(chain));\n }\n\n /**\n * Check if bridging is supported between two chains\n */\n canBridge(fromChain: string, toChain: string): boolean {\n return (\n fromChain !== toChain &&\n supportsBridging(fromChain) &&\n supportsBridging(toChain) &&\n this._normalizedChains.has(fromChain)\n );\n }\n\n /**\n * Get all possible bridge destinations from a chain\n */\n getBridgeDestinations(fromChain: string): string[] {\n if (!supportsBridging(fromChain)) {\n return [];\n }\n return getBridgeableChains().filter((chain) => chain !== fromChain);\n }\n\n // ========== Cache Management ==========\n\n /**\n * Check if balance caching is enabled\n */\n get isCacheEnabled(): boolean {\n return this._balanceCache.enabled;\n }\n\n /**\n * Get cache configuration\n */\n getCacheConfig(): BalanceCacheConfig {\n return this._balanceCache.config;\n }\n\n /**\n * Get cache statistics\n */\n getCacheStats(): BalanceCacheStats {\n return this._balanceCache.getStats();\n }\n\n /**\n * Invalidate all cached balances\n *\n * Call this after sending transactions to ensure fresh balance data.\n */\n invalidateBalanceCache(): void {\n this._balanceCache.clear();\n }\n\n /**\n * Invalidate cached balances for a specific chain\n *\n * @param chain - Chain name to invalidate\n * @returns Number of cache entries invalidated\n */\n invalidateChainCache(chain: string): number {\n return this._balanceCache.invalidateChain(chain);\n }\n\n /**\n * Invalidate cached balances for a specific address\n *\n * @param address - Address to invalidate (case-insensitive)\n * @returns Number of cache entries invalidated\n */\n invalidateAddressCache(address: string): number {\n return this._balanceCache.invalidateAddress(address);\n }\n\n /**\n * Dispose of cache resources\n *\n * Call this when the T402WDK instance is no longer needed.\n */\n dispose(): void {\n this._balanceCache.dispose();\n this._signerCache.clear();\n }\n}\n\n/**\n * Format token amount for display\n */\nfunction formatTokenAmount(amount: bigint, decimals: number): string {\n if (amount === 0n) {\n return \"0\";\n }\n\n const divisor = BigInt(10 ** decimals);\n const whole = amount / divisor;\n const fraction = amount % divisor;\n\n if (fraction === 0n) {\n return whole.toString();\n }\n\n const fractionStr = fraction.toString().padStart(decimals, \"0\");\n // Trim trailing zeros\n const trimmed = fractionStr.replace(/0+$/, \"\");\n return `${whole}.${trimmed}`;\n}\n","/**\n * USDT0 Bridge integration for T402 WDK\n *\n * Provides cross-chain USDT0 transfers using:\n * 1. Tether WDK bridge protocol (if available)\n * 2. Direct LayerZero OFT integration (fallback)\n */\n\nimport type { Address } from \"viem\";\nimport type { WDKSigner } from \"./signer.js\";\nimport type { BridgeParams, BridgeResult } from \"./types.js\";\nimport {\n Usdt0Bridge,\n supportsBridging,\n getBridgeableChains,\n type BridgeQuote,\n type BridgeSigner,\n} from \"@t402/evm\";\n\n/**\n * Extended bridge result with quote information\n */\nexport interface BridgeQuoteResult extends BridgeResult {\n /** Native fee in wei */\n nativeFee: bigint;\n /** Minimum amount to receive */\n minAmountToReceive: bigint;\n}\n\n/**\n * WDK Bridge wrapper for USDT0 cross-chain transfers\n *\n * This class provides a high-level API for bridging USDT0 between chains.\n * It automatically handles:\n * - Fee estimation\n * - Token approval\n * - Transaction execution\n * - Receipt handling\n */\nexport class WdkBridge {\n private bridges: Map<string, Usdt0Bridge> = new Map();\n\n /**\n * Create bridge signer adapter from WDK signer\n */\n private createBridgeSigner(signer: WDKSigner): BridgeSigner {\n return {\n address: signer.address,\n readContract: async (args) => {\n // WDK signer needs to be extended to support readContract\n // For now, throw an error indicating this needs WDK account\n throw new Error(\n \"readContract not available on WDKSigner. Use T402WDK.bridgeUsdt0() instead.\",\n );\n },\n writeContract: async (args) => {\n throw new Error(\n \"writeContract not available on WDKSigner. Use T402WDK.bridgeUsdt0() instead.\",\n );\n },\n waitForTransactionReceipt: async (args) => {\n throw new Error(\n \"waitForTransactionReceipt not available on WDKSigner. Use T402WDK.bridgeUsdt0() instead.\",\n );\n },\n };\n }\n\n /**\n * Get or create a bridge instance for a chain\n */\n private getBridge(chain: string, signer: WDKSigner): Usdt0Bridge {\n const cached = this.bridges.get(chain);\n if (cached) {\n return cached;\n }\n\n const bridgeSigner = this.createBridgeSigner(signer);\n const bridge = new Usdt0Bridge(bridgeSigner, chain);\n this.bridges.set(chain, bridge);\n return bridge;\n }\n\n /**\n * Check if a chain supports USDT0 bridging\n */\n static supportsBridging(chain: string): boolean {\n return supportsBridging(chain);\n }\n\n /**\n * Get all chains that support USDT0 bridging\n */\n static getBridgeableChains(): string[] {\n return getBridgeableChains();\n }\n\n /**\n * Get supported destinations from a source chain\n */\n static getSupportedDestinations(fromChain: string): string[] {\n return getBridgeableChains().filter((chain) => chain !== fromChain);\n }\n}\n\n/**\n * Bridge configuration for direct LayerZero OFT usage\n */\nexport interface DirectBridgeConfig {\n /** RPC URL for the source chain */\n rpcUrl: string;\n /** Private key or signer */\n signer: BridgeSigner;\n}\n\n/**\n * Create a direct USDT0 bridge (without WDK)\n *\n * Use this when you have a viem wallet client and want to bridge directly.\n *\n * @example\n * ```typescript\n * import { createDirectBridge } from '@t402/wdk';\n * import { createWalletClient, http } from 'viem';\n * import { arbitrum } from 'viem/chains';\n *\n * const walletClient = createWalletClient({\n * chain: arbitrum,\n * transport: http('https://arb1.arbitrum.io/rpc'),\n * account: privateKeyToAccount(privateKey),\n * });\n *\n * const bridge = createDirectBridge(walletClient, 'arbitrum');\n *\n * const quote = await bridge.quote({\n * fromChain: 'arbitrum',\n * toChain: 'ethereum',\n * amount: 100_000000n,\n * recipient: walletClient.account.address,\n * });\n *\n * const result = await bridge.send({\n * fromChain: 'arbitrum',\n * toChain: 'ethereum',\n * amount: 100_000000n,\n * recipient: walletClient.account.address,\n * });\n * ```\n */\nexport function createDirectBridge(signer: BridgeSigner, chain: string): Usdt0Bridge {\n return new Usdt0Bridge(signer, chain);\n}\n\n// Re-export types from @t402/evm for convenience\nexport type { BridgeQuote, BridgeSigner } from \"@t402/evm\";\n"],"mappings":"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","names":["WDKErrorCode","import_evm","import_evm"]}