@t402/wdk 2.3.0 → 2.4.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.
Files changed (40) hide show
  1. package/README.md +8 -0
  2. package/dist/cjs/adapters/index.d.ts +5 -0
  3. package/dist/cjs/adapters/index.js +455 -0
  4. package/dist/cjs/adapters/index.js.map +1 -0
  5. package/dist/cjs/adapters/svm-adapter.d.ts +125 -0
  6. package/dist/cjs/adapters/svm-adapter.js +132 -0
  7. package/dist/cjs/adapters/svm-adapter.js.map +1 -0
  8. package/dist/cjs/adapters/ton-adapter.d.ts +139 -0
  9. package/dist/cjs/adapters/ton-adapter.js +152 -0
  10. package/dist/cjs/adapters/ton-adapter.js.map +1 -0
  11. package/dist/cjs/adapters/tron-adapter.d.ts +139 -0
  12. package/dist/cjs/adapters/tron-adapter.js +221 -0
  13. package/dist/cjs/adapters/tron-adapter.js.map +1 -0
  14. package/dist/cjs/index.d.ts +292 -217
  15. package/dist/cjs/index.js +1042 -23
  16. package/dist/cjs/index.js.map +1 -1
  17. package/dist/cjs/types-V7c-qhn6.d.ts +489 -0
  18. package/dist/esm/adapters/index.d.mts +5 -0
  19. package/dist/esm/adapters/index.mjs +21 -0
  20. package/dist/esm/adapters/index.mjs.map +1 -0
  21. package/dist/esm/adapters/svm-adapter.d.mts +125 -0
  22. package/dist/esm/adapters/svm-adapter.mjs +9 -0
  23. package/dist/esm/adapters/svm-adapter.mjs.map +1 -0
  24. package/dist/esm/adapters/ton-adapter.d.mts +139 -0
  25. package/dist/esm/adapters/ton-adapter.mjs +9 -0
  26. package/dist/esm/adapters/ton-adapter.mjs.map +1 -0
  27. package/dist/esm/adapters/tron-adapter.d.mts +139 -0
  28. package/dist/esm/adapters/tron-adapter.mjs +9 -0
  29. package/dist/esm/adapters/tron-adapter.mjs.map +1 -0
  30. package/dist/esm/chunk-HB2DGKQ3.mjs +196 -0
  31. package/dist/esm/chunk-HB2DGKQ3.mjs.map +1 -0
  32. package/dist/esm/chunk-MCFHZSF7.mjs +107 -0
  33. package/dist/esm/chunk-MCFHZSF7.mjs.map +1 -0
  34. package/dist/esm/chunk-YWBJJV5M.mjs +117 -0
  35. package/dist/esm/chunk-YWBJJV5M.mjs.map +1 -0
  36. package/dist/esm/index.d.mts +292 -217
  37. package/dist/esm/index.mjs +640 -23
  38. package/dist/esm/index.mjs.map +1 -1
  39. package/dist/esm/types-V7c-qhn6.d.mts +489 -0
  40. package/package.json +70 -6
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cache.ts","../../src/chains.ts","../../src/errors.ts","../../src/signer.ts","../../src/t402wdk.ts","../../src/bridge.ts","../../src/index.ts","../../src/hardware/types.ts","../../src/hardware/ledger.ts","../../src/hardware/trezor.ts","../../src/hardware/index.ts"],"sourcesContent":["/**\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>(key: string, fetcher: () => Promise<T>): 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') ?? tokens.find((t) => t.symbol === 'USDC') ?? 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(WDKErrorCode.RPC_RATE_LIMITED, `Rate limited: ${error.message}`, {\n cause: error,\n 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(new RPCError(WDKErrorCode.RPC_TIMEOUT, `${operation} timed out after ${timeoutMs}ms`))\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 } 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(WDKErrorCode.WDK_NOT_INITIALIZED, 'WDK instance is required', { chain })\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(signPromise, this._timeoutMs, 'Signing typed data')\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(\n error,\n WDKErrorCode.SIGN_TYPED_DATA_FAILED,\n 'Failed to sign typed data',\n {\n chain: this._chain,\n primaryType: message.primaryType,\n },\n )\n\n throw new SigningError(wrapped.code as WDKErrorCode, wrapped.message, {\n operation: 'signTypedData',\n cause: wrapped.cause,\n context: wrapped.context,\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(WDKErrorCode.INVALID_MESSAGE, 'Message is required for signing', {\n operation: 'signMessage',\n 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 =\n typeof message === 'string' ? message : Buffer.from(message).toString('utf-8')\n\n const signPromise = account.signMessage(messageStr)\n const signature = await withTimeout(signPromise, this._timeoutMs, 'Signing message')\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(wrapped.code as WDKErrorCode, wrapped.message, {\n operation: 'signMessage',\n cause: wrapped.cause,\n context: wrapped.context,\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(async () => {\n const balancePromise = account.getBalance()\n return withTimeout(balancePromise, this._timeoutMs, 'Fetching native balance')\n }, DEFAULT_BALANCE_RETRY)\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(async () => {\n const balancePromise = account.getTokenBalance(tokenAddress)\n return withTimeout(balancePromise, this._timeoutMs, 'Fetching token balance')\n }, DEFAULT_BALANCE_RETRY)\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(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 }, DEFAULT_BALANCE_RETRY)\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(wrapped.code as WDKErrorCode, wrapped.message, {\n chain: this._chain,\n cause: wrapped.cause,\n context: wrapped.context,\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\n constructor(address: Address, _privateKey: `0x${string}`) {\n this.address = address\n // Note: privateKey available for future signing implementation\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 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 _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\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('arbitrum', normalizeChainConfig('arbitrum', defaultEndpoint))\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(WDKErrorCode.CHAIN_NOT_CONFIGURED, `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(chain, address, async () =>\n 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 {\n cause: error instanceof Error ? error : undefined,\n context: { amount: amount.toString() },\n },\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(WDKErrorCode.BRIDGE_FAILED, 'Both fromChain and toChain are required', {\n fromChain: params.fromChain,\n toChain: params.toChain,\n })\n }\n\n if (params.fromChain === params.toChain) {\n throw new BridgeError(WDKErrorCode.BRIDGE_NOT_SUPPORTED, 'Cannot bridge to the same chain', {\n fromChain: params.fromChain,\n toChain: params.toChain,\n })\n }\n\n if (!params.amount || params.amount <= 0n) {\n throw new BridgeError(WDKErrorCode.BRIDGE_FAILED, 'Amount must be greater than 0', {\n fromChain: params.fromChain,\n toChain: params.toChain,\n 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 { WDKSigner } from './signer.js'\nimport type { BridgeResult } from './types.js'\nimport { Usdt0Bridge, supportsBridging, getBridgeableChains, type BridgeSigner } 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 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","/**\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 { CacheConfig, CacheStats, BalanceCacheConfig, BalanceCacheStats } 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// Hardware wallet support\nexport {\n // Types\n type HardwareWalletType,\n type DeviceStatus,\n type HardwareWalletConnectionOptions,\n type HardwareWalletDeviceInfo,\n type HardwareWalletSigner,\n type LedgerOptions,\n type TrezorOptions,\n HardwareWalletErrorCode,\n HardwareWalletError,\n // Ledger\n LedgerSigner,\n createLedgerSigner,\n // Trezor\n TrezorSigner,\n createTrezorSigner,\n // Utilities\n detectHardwareWalletSupport,\n isHardwareWalletSupported,\n} from './hardware/index.js'\n","/**\n * Hardware wallet type definitions for T402 WDK\n */\n\nimport type { Address } from 'viem'\n\n/**\n * Supported hardware wallet types\n */\nexport type HardwareWalletType = 'ledger' | 'trezor'\n\n/**\n * Hardware wallet device status\n */\nexport type DeviceStatus =\n | 'disconnected'\n | 'connecting'\n | 'connected'\n | 'locked'\n | 'unlocked'\n | 'app_closed'\n | 'ready'\n\n/**\n * Hardware wallet connection options\n */\nexport interface HardwareWalletConnectionOptions {\n /** Transport type for Ledger (default: \"webusb\") */\n transport?: 'webusb' | 'webhid' | 'bluetooth'\n /** Account index for HD derivation (default: 0) */\n accountIndex?: number\n /** Custom derivation path (default: m/44'/60'/0'/0/{accountIndex}) */\n derivationPath?: string\n /** Timeout for connection in milliseconds (default: 30000) */\n timeout?: number\n}\n\n/**\n * Hardware wallet device info\n */\nexport interface HardwareWalletDeviceInfo {\n /** Wallet type */\n type: HardwareWalletType\n /** Device model (e.g., \"Nano S\", \"Nano X\", \"Model T\") */\n model?: string\n /** Firmware version */\n firmwareVersion?: string\n /** Whether the device is locked */\n isLocked: boolean\n /** Current device status */\n status: DeviceStatus\n}\n\n/**\n * Hardware wallet signer interface\n */\nexport interface HardwareWalletSigner {\n /** Get wallet address */\n readonly address: Address\n /** Wallet type */\n readonly walletType: HardwareWalletType\n /** Device info */\n readonly deviceInfo: HardwareWalletDeviceInfo\n /** Whether the signer is connected */\n readonly isConnected: boolean\n\n /**\n * Connect to the hardware wallet\n */\n connect(): Promise<void>\n\n /**\n * Disconnect from the hardware wallet\n */\n disconnect(): Promise<void>\n\n /**\n * Sign EIP-712 typed data\n */\n signTypedData(params: {\n domain: Record<string, unknown>\n types: Record<string, unknown>\n primaryType: string\n message: Record<string, unknown>\n }): Promise<`0x${string}`>\n\n /**\n * Sign a personal message\n */\n signMessage(message: string | Uint8Array): Promise<`0x${string}`>\n\n /**\n * Get all available addresses (for account selection)\n * @param count Number of addresses to retrieve\n * @param startIndex Starting index\n */\n getAddresses?(count: number, startIndex?: number): Promise<Address[]>\n}\n\n/**\n * Ledger-specific options\n */\nexport interface LedgerOptions extends HardwareWalletConnectionOptions {\n /** Whether to scramble key for privacy (default: true) */\n scrambleKey?: boolean\n /** App name on the Ledger (default: \"Ethereum\") */\n appName?: string\n}\n\n/**\n * Trezor-specific options\n */\nexport interface TrezorOptions extends HardwareWalletConnectionOptions {\n /** Manifest for Trezor Connect (required) */\n manifest: {\n email: string\n appUrl: string\n }\n /** Whether to use popup for interactions (default: true) */\n popup?: boolean\n /** Debug mode */\n debug?: boolean\n}\n\n/**\n * Error codes for hardware wallet operations\n */\nexport enum HardwareWalletErrorCode {\n // Connection errors\n DEVICE_NOT_FOUND = 'DEVICE_NOT_FOUND',\n CONNECTION_FAILED = 'CONNECTION_FAILED',\n DEVICE_LOCKED = 'DEVICE_LOCKED',\n APP_NOT_OPEN = 'APP_NOT_OPEN',\n TRANSPORT_ERROR = 'TRANSPORT_ERROR',\n\n // Signing errors\n USER_REJECTED = 'USER_REJECTED',\n SIGNING_FAILED = 'SIGNING_FAILED',\n INVALID_DATA = 'INVALID_DATA',\n\n // General errors\n NOT_SUPPORTED = 'NOT_SUPPORTED',\n TIMEOUT = 'TIMEOUT',\n UNKNOWN_ERROR = 'UNKNOWN_ERROR',\n}\n\n/**\n * Hardware wallet error\n */\nexport class HardwareWalletError extends Error {\n readonly code: HardwareWalletErrorCode\n readonly walletType: HardwareWalletType\n readonly cause?: Error\n\n constructor(\n code: HardwareWalletErrorCode,\n message: string,\n walletType: HardwareWalletType,\n cause?: Error,\n ) {\n super(message)\n this.name = 'HardwareWalletError'\n this.code = code\n this.walletType = walletType\n this.cause = cause\n }\n}\n","/**\n * Ledger Hardware Wallet Signer for T402 WDK\n *\n * Provides T402-compatible signing using Ledger hardware wallets.\n * Supports Nano S, Nano S Plus, Nano X, and Stax devices.\n *\n * @example\n * ```typescript\n * import { LedgerSigner } from '@t402/wdk';\n *\n * const ledger = new LedgerSigner({ accountIndex: 0 });\n * await ledger.connect();\n *\n * // Get address\n * console.log('Address:', ledger.address);\n *\n * // Sign typed data for T402 payment\n * const signature = await ledger.signTypedData(typedData);\n * ```\n */\n\nimport type { Address } from 'viem'\nimport {\n type HardwareWalletSigner,\n type HardwareWalletDeviceInfo,\n type LedgerOptions,\n type DeviceStatus,\n HardwareWalletError,\n HardwareWalletErrorCode,\n} from './types.js'\n\n/**\n * Default derivation path for Ethereum\n */\nconst DEFAULT_DERIVATION_PATH = \"m/44'/60'/0'/0\"\n\n/**\n * Ledger hardware wallet signer\n */\nexport class LedgerSigner implements HardwareWalletSigner {\n readonly walletType = 'ledger' as const\n\n private _address: Address | null = null\n private _transport: unknown = null\n private _eth: unknown = null\n private _options: Required<LedgerOptions>\n private _status: DeviceStatus = 'disconnected'\n private _deviceInfo: HardwareWalletDeviceInfo\n\n constructor(options: LedgerOptions = {}) {\n this._options = {\n transport: options.transport ?? 'webusb',\n accountIndex: options.accountIndex ?? 0,\n derivationPath:\n options.derivationPath ?? `${DEFAULT_DERIVATION_PATH}/${options.accountIndex ?? 0}`,\n timeout: options.timeout ?? 30000,\n scrambleKey: options.scrambleKey ?? true,\n appName: options.appName ?? 'Ethereum',\n }\n\n this._deviceInfo = {\n type: 'ledger',\n isLocked: true,\n status: 'disconnected',\n }\n }\n\n /**\n * Get the wallet address\n */\n get address(): Address {\n if (!this._address) {\n throw new HardwareWalletError(\n HardwareWalletErrorCode.CONNECTION_FAILED,\n 'Ledger not connected. Call connect() first.',\n 'ledger',\n )\n }\n return this._address\n }\n\n /**\n * Get device info\n */\n get deviceInfo(): HardwareWalletDeviceInfo {\n return { ...this._deviceInfo }\n }\n\n /**\n * Check if connected\n */\n get isConnected(): boolean {\n return this._status === 'ready' && this._transport !== null\n }\n\n /**\n * Get the derivation path\n */\n get derivationPath(): string {\n return this._options.derivationPath\n }\n\n /**\n * Connect to the Ledger device\n */\n async connect(): Promise<void> {\n if (this.isConnected) {\n return\n }\n\n this._status = 'connecting'\n this._deviceInfo.status = 'connecting'\n\n try {\n // Dynamic import to avoid bundling issues\n const TransportModule = await this._getTransportModule()\n const EthModule = await import('@ledgerhq/hw-app-eth')\n\n // Create transport\n this._transport = await TransportModule.default.create()\n this._status = 'connected'\n this._deviceInfo.status = 'connected'\n\n // Create Ethereum app instance\n this._eth = new EthModule.default(this._transport as never)\n\n // Get device info\n try {\n const appConfig = await (\n this._eth as { getAppConfiguration: () => Promise<{ version: string }> }\n ).getAppConfiguration()\n this._deviceInfo.firmwareVersion = appConfig.version\n } catch {\n // App config not available, continue\n }\n\n // Get address\n const result = await (\n this._eth as {\n getAddress: (path: string, display?: boolean) => Promise<{ address: string }>\n }\n ).getAddress(this._options.derivationPath, false)\n\n this._address = result.address as Address\n this._status = 'ready'\n this._deviceInfo.status = 'ready'\n this._deviceInfo.isLocked = false\n } catch (error) {\n this._status = 'disconnected'\n this._deviceInfo.status = 'disconnected'\n this._transport = null\n this._eth = null\n\n throw this._wrapError(error)\n }\n }\n\n /**\n * Disconnect from the Ledger device\n */\n async disconnect(): Promise<void> {\n if (this._transport) {\n try {\n await (this._transport as { close: () => Promise<void> }).close()\n } catch {\n // Ignore close errors\n }\n }\n\n this._transport = null\n this._eth = null\n this._address = null\n this._status = 'disconnected'\n this._deviceInfo.status = 'disconnected'\n this._deviceInfo.isLocked = true\n }\n\n /**\n * Sign EIP-712 typed data\n *\n * Note: Requires Ethereum app version 1.6.0+ for EIP-712 support\n */\n async signTypedData(params: {\n domain: Record<string, unknown>\n types: Record<string, unknown>\n primaryType: string\n message: Record<string, unknown>\n }): Promise<`0x${string}`> {\n if (!this.isConnected || !this._eth) {\n throw new HardwareWalletError(\n HardwareWalletErrorCode.CONNECTION_FAILED,\n 'Ledger not connected',\n 'ledger',\n )\n }\n\n try {\n // Ledger uses signEIP712Message for typed data\n const result = await (\n this._eth as {\n signEIP712Message: (\n path: string,\n message: {\n domain: Record<string, unknown>\n types: Record<string, unknown>\n primaryType: string\n message: Record<string, unknown>\n },\n ) => Promise<{ v: number; r: string; s: string }>\n }\n ).signEIP712Message(this._options.derivationPath, {\n domain: params.domain,\n types: params.types,\n primaryType: params.primaryType,\n message: params.message,\n })\n\n // Construct signature from r, s, v\n const r = result.r.padStart(64, '0')\n const s = result.s.padStart(64, '0')\n const v = result.v.toString(16).padStart(2, '0')\n\n return `0x${r}${s}${v}` as `0x${string}`\n } catch (error) {\n throw this._wrapError(error)\n }\n }\n\n /**\n * Sign a personal message\n */\n async signMessage(message: string | Uint8Array): Promise<`0x${string}`> {\n if (!this.isConnected || !this._eth) {\n throw new HardwareWalletError(\n HardwareWalletErrorCode.CONNECTION_FAILED,\n 'Ledger not connected',\n 'ledger',\n )\n }\n\n try {\n // Convert message to hex if needed\n const messageHex =\n typeof message === 'string'\n ? Buffer.from(message).toString('hex')\n : Buffer.from(message).toString('hex')\n\n const result = await (\n this._eth as {\n signPersonalMessage: (\n path: string,\n messageHex: string,\n ) => Promise<{ v: number; r: string; s: string }>\n }\n ).signPersonalMessage(this._options.derivationPath, messageHex)\n\n // Construct signature from r, s, v\n const r = result.r.padStart(64, '0')\n const s = result.s.padStart(64, '0')\n const v = result.v.toString(16).padStart(2, '0')\n\n return `0x${r}${s}${v}` as `0x${string}`\n } catch (error) {\n throw this._wrapError(error)\n }\n }\n\n /**\n * Get multiple addresses for account selection\n */\n async getAddresses(count: number = 5, startIndex: number = 0): Promise<Address[]> {\n if (!this.isConnected || !this._eth) {\n throw new HardwareWalletError(\n HardwareWalletErrorCode.CONNECTION_FAILED,\n 'Ledger not connected',\n 'ledger',\n )\n }\n\n const addresses: Address[] = []\n\n for (let i = startIndex; i < startIndex + count; i++) {\n const path = `${DEFAULT_DERIVATION_PATH}/${i}`\n const result = await (\n this._eth as {\n getAddress: (path: string, display?: boolean) => Promise<{ address: string }>\n }\n ).getAddress(path, false)\n addresses.push(result.address as Address)\n }\n\n return addresses\n }\n\n /**\n * Get the appropriate transport module based on options\n */\n private async _getTransportModule(): Promise<{ default: { create: () => Promise<unknown> } }> {\n switch (this._options.transport) {\n case 'webhid':\n return import('@ledgerhq/hw-transport-webhid')\n case 'bluetooth':\n return import('@ledgerhq/hw-transport-web-ble')\n case 'webusb':\n default:\n return import('@ledgerhq/hw-transport-webusb')\n }\n }\n\n /**\n * Wrap errors in HardwareWalletError\n */\n private _wrapError(error: unknown): HardwareWalletError {\n const err = error instanceof Error ? error : new Error(String(error))\n const message = err.message.toLowerCase()\n\n // Map common Ledger errors\n if (message.includes('denied') || message.includes('rejected')) {\n return new HardwareWalletError(\n HardwareWalletErrorCode.USER_REJECTED,\n 'User rejected the action on the Ledger device',\n 'ledger',\n err,\n )\n }\n\n if (message.includes('locked')) {\n return new HardwareWalletError(\n HardwareWalletErrorCode.DEVICE_LOCKED,\n 'Ledger device is locked. Please unlock it.',\n 'ledger',\n err,\n )\n }\n\n if (message.includes('no device') || message.includes('not found')) {\n return new HardwareWalletError(\n HardwareWalletErrorCode.DEVICE_NOT_FOUND,\n 'Ledger device not found. Please connect your device.',\n 'ledger',\n err,\n )\n }\n\n if (message.includes('app') || message.includes('ethereum')) {\n return new HardwareWalletError(\n HardwareWalletErrorCode.APP_NOT_OPEN,\n 'Please open the Ethereum app on your Ledger device.',\n 'ledger',\n err,\n )\n }\n\n if (message.includes('timeout')) {\n return new HardwareWalletError(\n HardwareWalletErrorCode.TIMEOUT,\n 'Connection timed out',\n 'ledger',\n err,\n )\n }\n\n return new HardwareWalletError(\n HardwareWalletErrorCode.UNKNOWN_ERROR,\n err.message,\n 'ledger',\n err,\n )\n }\n}\n\n/**\n * Create a Ledger signer and connect\n */\nexport async function createLedgerSigner(options?: LedgerOptions): Promise<LedgerSigner> {\n const signer = new LedgerSigner(options)\n await signer.connect()\n return signer\n}\n","/**\n * Trezor Hardware Wallet Signer for T402 WDK\n *\n * Provides T402-compatible signing using Trezor hardware wallets.\n * Supports Trezor One, Model T, and Safe 3 devices.\n *\n * @example\n * ```typescript\n * import { TrezorSigner } from '@t402/wdk';\n *\n * const trezor = new TrezorSigner({\n * manifest: {\n * email: 'developer@example.com',\n * appUrl: 'https://example.com'\n * }\n * });\n * await trezor.connect();\n *\n * // Get address\n * console.log('Address:', trezor.address);\n *\n * // Sign typed data for T402 payment\n * const signature = await trezor.signTypedData(typedData);\n * ```\n */\n\nimport type { Address } from 'viem'\nimport {\n type HardwareWalletSigner,\n type HardwareWalletDeviceInfo,\n type TrezorOptions,\n type DeviceStatus,\n HardwareWalletError,\n HardwareWalletErrorCode,\n} from './types.js'\n\n/**\n * Default derivation path for Ethereum\n */\nconst DEFAULT_DERIVATION_PATH = \"m/44'/60'/0'/0\"\n\n/**\n * Trezor Connect instance (dynamically imported)\n */\nlet TrezorConnect: typeof import('@trezor/connect').default | null = null\n\n/**\n * Trezor hardware wallet signer\n */\nexport class TrezorSigner implements HardwareWalletSigner {\n readonly walletType = 'trezor' as const\n\n private _address: Address | null = null\n private _options: Required<Omit<TrezorOptions, 'manifest'>> & {\n manifest: TrezorOptions['manifest']\n }\n private _status: DeviceStatus = 'disconnected'\n private _deviceInfo: HardwareWalletDeviceInfo\n private _initialized = false\n\n constructor(options: TrezorOptions) {\n if (!options.manifest) {\n throw new HardwareWalletError(\n HardwareWalletErrorCode.INVALID_DATA,\n 'Trezor manifest is required (email and appUrl)',\n 'trezor',\n )\n }\n\n this._options = {\n manifest: options.manifest,\n transport: options.transport ?? 'webusb',\n accountIndex: options.accountIndex ?? 0,\n derivationPath:\n options.derivationPath ?? `${DEFAULT_DERIVATION_PATH}/${options.accountIndex ?? 0}`,\n timeout: options.timeout ?? 30000,\n popup: options.popup ?? true,\n debug: options.debug ?? false,\n }\n\n this._deviceInfo = {\n type: 'trezor',\n isLocked: true,\n status: 'disconnected',\n }\n }\n\n /**\n * Get the wallet address\n */\n get address(): Address {\n if (!this._address) {\n throw new HardwareWalletError(\n HardwareWalletErrorCode.CONNECTION_FAILED,\n 'Trezor not connected. Call connect() first.',\n 'trezor',\n )\n }\n return this._address\n }\n\n /**\n * Get device info\n */\n get deviceInfo(): HardwareWalletDeviceInfo {\n return { ...this._deviceInfo }\n }\n\n /**\n * Check if connected\n */\n get isConnected(): boolean {\n return this._status === 'ready' && this._address !== null\n }\n\n /**\n * Get the derivation path\n */\n get derivationPath(): string {\n return this._options.derivationPath\n }\n\n /**\n * Initialize Trezor Connect\n */\n private async _initTrezorConnect(): Promise<void> {\n if (this._initialized && TrezorConnect) {\n return\n }\n\n try {\n const module = await import('@trezor/connect')\n TrezorConnect = module.default\n\n await TrezorConnect.init({\n manifest: {\n email: this._options.manifest.email,\n appUrl: this._options.manifest.appUrl,\n appName: 'T402 WDK',\n },\n popup: this._options.popup,\n debug: this._options.debug,\n })\n\n this._initialized = true\n } catch (error) {\n throw new HardwareWalletError(\n HardwareWalletErrorCode.CONNECTION_FAILED,\n `Failed to initialize Trezor Connect: ${error instanceof Error ? error.message : String(error)}`,\n 'trezor',\n error instanceof Error ? error : undefined,\n )\n }\n }\n\n /**\n * Connect to the Trezor device\n */\n async connect(): Promise<void> {\n if (this.isConnected) {\n return\n }\n\n this._status = 'connecting'\n this._deviceInfo.status = 'connecting'\n\n try {\n await this._initTrezorConnect()\n\n if (!TrezorConnect) {\n throw new Error('TrezorConnect not initialized')\n }\n\n // Get device features\n const featuresResult = await TrezorConnect.getFeatures()\n if (featuresResult.success) {\n const features = featuresResult.payload\n this._deviceInfo.model = features.model\n this._deviceInfo.firmwareVersion = `${features.major_version}.${features.minor_version}.${features.patch_version}`\n }\n\n // Get address\n const result = await TrezorConnect.ethereumGetAddress({\n path: this._options.derivationPath,\n showOnTrezor: false,\n })\n\n if (!result.success) {\n throw new Error(result.payload.error || 'Failed to get address')\n }\n\n this._address = result.payload.address as Address\n this._status = 'ready'\n this._deviceInfo.status = 'ready'\n this._deviceInfo.isLocked = false\n } catch (error) {\n this._status = 'disconnected'\n this._deviceInfo.status = 'disconnected'\n this._address = null\n\n throw this._wrapError(error)\n }\n }\n\n /**\n * Disconnect from the Trezor device\n */\n async disconnect(): Promise<void> {\n if (TrezorConnect) {\n try {\n TrezorConnect.dispose()\n } catch {\n // Ignore dispose errors\n }\n }\n\n this._address = null\n this._status = 'disconnected'\n this._deviceInfo.status = 'disconnected'\n this._deviceInfo.isLocked = true\n this._initialized = false\n TrezorConnect = null\n }\n\n /**\n * Sign EIP-712 typed data\n */\n async signTypedData(params: {\n domain: Record<string, unknown>\n types: Record<string, unknown>\n primaryType: string\n message: Record<string, unknown>\n }): Promise<`0x${string}`> {\n if (!this.isConnected) {\n throw new HardwareWalletError(\n HardwareWalletErrorCode.CONNECTION_FAILED,\n 'Trezor not connected',\n 'trezor',\n )\n }\n\n await this._initTrezorConnect()\n\n if (!TrezorConnect) {\n throw new Error('TrezorConnect not initialized')\n }\n\n try {\n // Convert types to Trezor format\n const trezorTypes = this._convertTypesToTrezorFormat(params.types)\n\n // Ensure EIP712Domain is present (required by Trezor)\n if (!trezorTypes.EIP712Domain) {\n trezorTypes.EIP712Domain = [\n { name: 'name', type: 'string' },\n { name: 'version', type: 'string' },\n { name: 'chainId', type: 'uint256' },\n { name: 'verifyingContract', type: 'address' },\n ]\n }\n\n const result = await TrezorConnect.ethereumSignTypedData({\n path: this._options.derivationPath,\n data: {\n domain: params.domain as Record<string, string | number | boolean>,\n types: trezorTypes as Parameters<\n typeof TrezorConnect.ethereumSignTypedData\n >[0]['data']['types'],\n primaryType: params.primaryType,\n message: params.message as Record<string, string | number | boolean>,\n },\n metamask_v4_compat: true,\n })\n\n if (!result.success) {\n throw new Error(result.payload.error || 'Failed to sign typed data')\n }\n\n return result.payload.signature as `0x${string}`\n } catch (error) {\n throw this._wrapError(error)\n }\n }\n\n /**\n * Sign a personal message\n */\n async signMessage(message: string | Uint8Array): Promise<`0x${string}`> {\n if (!this.isConnected) {\n throw new HardwareWalletError(\n HardwareWalletErrorCode.CONNECTION_FAILED,\n 'Trezor not connected',\n 'trezor',\n )\n }\n\n await this._initTrezorConnect()\n\n if (!TrezorConnect) {\n throw new Error('TrezorConnect not initialized')\n }\n\n try {\n // Convert message to hex\n const messageHex =\n typeof message === 'string'\n ? `0x${Buffer.from(message).toString('hex')}`\n : `0x${Buffer.from(message).toString('hex')}`\n\n const result = await TrezorConnect.ethereumSignMessage({\n path: this._options.derivationPath,\n message: messageHex,\n hex: true,\n })\n\n if (!result.success) {\n throw new Error(result.payload.error || 'Failed to sign message')\n }\n\n return `0x${result.payload.signature}` as `0x${string}`\n } catch (error) {\n throw this._wrapError(error)\n }\n }\n\n /**\n * Get multiple addresses for account selection\n */\n async getAddresses(count: number = 5, startIndex: number = 0): Promise<Address[]> {\n if (!this.isConnected) {\n throw new HardwareWalletError(\n HardwareWalletErrorCode.CONNECTION_FAILED,\n 'Trezor not connected',\n 'trezor',\n )\n }\n\n await this._initTrezorConnect()\n\n if (!TrezorConnect) {\n throw new Error('TrezorConnect not initialized')\n }\n\n const addresses: Address[] = []\n\n // Get addresses in batch\n const bundle = []\n for (let i = startIndex; i < startIndex + count; i++) {\n bundle.push({\n path: `${DEFAULT_DERIVATION_PATH}/${i}`,\n showOnTrezor: false,\n })\n }\n\n const result = await TrezorConnect.ethereumGetAddress({ bundle })\n\n if (!result.success) {\n throw this._wrapError(new Error(result.payload.error || 'Failed to get addresses'))\n }\n\n for (const item of result.payload) {\n addresses.push(item.address as Address)\n }\n\n return addresses\n }\n\n /**\n * Convert EIP-712 types to Trezor format\n */\n private _convertTypesToTrezorFormat(\n types: Record<string, unknown>,\n ): Record<string, Array<{ name: string; type: string }>> {\n const result: Record<string, Array<{ name: string; type: string }>> = {}\n\n for (const [typeName, fields] of Object.entries(types)) {\n if (Array.isArray(fields)) {\n result[typeName] = fields.map((field) => ({\n name: String(field.name),\n type: String(field.type),\n }))\n }\n }\n\n return result\n }\n\n /**\n * Wrap errors in HardwareWalletError\n */\n private _wrapError(error: unknown): HardwareWalletError {\n const err = error instanceof Error ? error : new Error(String(error))\n const message = err.message.toLowerCase()\n\n // Map common Trezor errors\n if (\n message.includes('cancelled') ||\n message.includes('rejected') ||\n message.includes('denied')\n ) {\n return new HardwareWalletError(\n HardwareWalletErrorCode.USER_REJECTED,\n 'User cancelled the action on the Trezor device',\n 'trezor',\n err,\n )\n }\n\n if (message.includes('pin')) {\n return new HardwareWalletError(\n HardwareWalletErrorCode.DEVICE_LOCKED,\n 'Trezor device requires PIN entry',\n 'trezor',\n err,\n )\n }\n\n if (message.includes('passphrase')) {\n return new HardwareWalletError(\n HardwareWalletErrorCode.DEVICE_LOCKED,\n 'Trezor device requires passphrase entry',\n 'trezor',\n err,\n )\n }\n\n if (message.includes('device') && message.includes('not found')) {\n return new HardwareWalletError(\n HardwareWalletErrorCode.DEVICE_NOT_FOUND,\n 'Trezor device not found. Please connect your device.',\n 'trezor',\n err,\n )\n }\n\n if (message.includes('timeout')) {\n return new HardwareWalletError(\n HardwareWalletErrorCode.TIMEOUT,\n 'Connection timed out',\n 'trezor',\n err,\n )\n }\n\n return new HardwareWalletError(\n HardwareWalletErrorCode.UNKNOWN_ERROR,\n err.message,\n 'trezor',\n err,\n )\n }\n}\n\n/**\n * Create a Trezor signer and connect\n */\nexport async function createTrezorSigner(options: TrezorOptions): Promise<TrezorSigner> {\n const signer = new TrezorSigner(options)\n await signer.connect()\n return signer\n}\n","/**\n * Hardware Wallet Support for T402 WDK\n *\n * This module provides hardware wallet integration for T402 payments,\n * supporting Ledger and Trezor devices.\n *\n * @example Ledger\n * ```typescript\n * import { LedgerSigner, createLedgerSigner } from '@t402/wdk';\n *\n * // Create and connect\n * const ledger = await createLedgerSigner({ accountIndex: 0 });\n * console.log('Address:', ledger.address);\n *\n * // Sign T402 payment\n * const signature = await ledger.signTypedData(paymentData);\n *\n * // Disconnect when done\n * await ledger.disconnect();\n * ```\n *\n * @example Trezor\n * ```typescript\n * import { TrezorSigner, createTrezorSigner } from '@t402/wdk';\n *\n * // Create and connect (manifest required)\n * const trezor = await createTrezorSigner({\n * manifest: {\n * email: 'developer@example.com',\n * appUrl: 'https://example.com'\n * }\n * });\n * console.log('Address:', trezor.address);\n *\n * // Sign T402 payment\n * const signature = await trezor.signTypedData(paymentData);\n *\n * // Disconnect when done\n * await trezor.disconnect();\n * ```\n */\n\n// Types\nexport {\n type HardwareWalletType,\n type DeviceStatus,\n type HardwareWalletConnectionOptions,\n type HardwareWalletDeviceInfo,\n type HardwareWalletSigner,\n type LedgerOptions,\n type TrezorOptions,\n HardwareWalletErrorCode,\n HardwareWalletError,\n} from './types.js'\n\n// Ledger\nexport { LedgerSigner, createLedgerSigner } from './ledger.js'\n\n// Trezor\nexport { TrezorSigner, createTrezorSigner } from './trezor.js'\n\n/**\n * Detect available hardware wallets\n *\n * Note: This function checks for WebUSB/WebHID support and\n * doesn't actually probe for devices.\n */\nexport function detectHardwareWalletSupport(): {\n ledger: { webusb: boolean; webhid: boolean; bluetooth: boolean }\n trezor: boolean\n} {\n const hasNavigator = typeof navigator !== 'undefined'\n\n return {\n ledger: {\n webusb: hasNavigator && 'usb' in navigator,\n webhid: hasNavigator && 'hid' in navigator,\n bluetooth: hasNavigator && 'bluetooth' in navigator,\n },\n trezor: hasNavigator && 'usb' in navigator,\n }\n}\n\n/**\n * Check if hardware wallet signing is supported in the current environment\n */\nexport function isHardwareWalletSupported(): boolean {\n const support = detectHardwareWalletSupport()\n return (\n support.ledger.webusb || support.ledger.webhid || support.ledger.bluetooth || support.trezor\n )\n}\n"],"mappings":";AA8BO,IAAM,uBAAoC;AAAA,EAC/C,YAAY;AAAA;AAAA,EACZ,SAAS;AAAA,EACT,iBAAiB;AACnB;AAwBO,IAAM,WAAN,MAAkB;AAAA,EACf,SAAqC,oBAAI,IAAI;AAAA,EAC7C;AAAA,EACA,mBAA0D;AAAA,EAElE,YAAY,SAA+B,CAAC,GAAG;AAC7C,SAAK,UAAU,EAAE,GAAG,sBAAsB,GAAG,OAAO;AAGpD,QAAI,KAAK,QAAQ,UAAU,GAAG;AAC5B,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,KAA4B;AAC9B,UAAM,QAAQ,KAAK,OAAO,IAAI,GAAG;AAEjC,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAGA,QAAI,KAAK,IAAI,IAAI,MAAM,WAAW;AAChC,WAAK,OAAO,OAAO,GAAG;AACtB,aAAO;AAAA,IACT;AAGA,QAAI,KAAK,QAAQ,iBAAiB;AAChC,YAAM,YAAY,KAAK,IAAI,IAAI,KAAK,QAAQ;AAAA,IAC9C;AAEA,WAAO,MAAM;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,KAAa,OAAU,KAAoB;AAE7C,QAAI,KAAK,OAAO,QAAQ,KAAK,QAAQ,SAAS;AAC5C,WAAK,aAAa;AAAA,IACpB;AAEA,UAAM,YAAY,KAAK,IAAI,KAAK,OAAO,KAAK,QAAQ;AACpD,SAAK,OAAO,IAAI,KAAK,EAAE,OAAO,UAAU,CAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,KAAsB;AACxB,UAAM,QAAQ,KAAK,OAAO,IAAI,GAAG;AAEjC,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,IAAI,IAAI,MAAM,WAAW;AAChC,WAAK,OAAO,OAAO,GAAG;AACtB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,KAAsB;AAC3B,WAAO,KAAK,OAAO,OAAO,GAAG;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eAAe,QAAwB;AACrC,QAAI,QAAQ;AACZ,eAAW,OAAO,KAAK,OAAO,KAAK,GAAG;AACpC,UAAI,IAAI,WAAW,MAAM,GAAG;AAC1B,aAAK,OAAO,OAAO,GAAG;AACtB;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,OAAO,MAAM;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAe;AACjB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAoB;AACtB,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,QAAQ;AACZ,eAAW,SAAS,KAAK,OAAO,OAAO,GAAG;AACxC,UAAI,OAAO,MAAM,WAAW;AAC1B;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAiB;AACf,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,YAAsB,CAAC;AAC7B,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG;AAChD,UAAI,OAAO,MAAM,WAAW;AAC1B,kBAAU,KAAK,GAAG;AAAA,MACpB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,KAAqB;AAC1B,UAAM,QAAQ,KAAK,OAAO,IAAI,GAAG;AAEjC,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,MAAM,YAAY,KAAK,IAAI;AAC7C,QAAI,aAAa,GAAG;AAClB,WAAK,OAAO,OAAO,GAAG;AACtB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,KAAa,KAAuB;AACxC,UAAM,QAAQ,KAAK,OAAO,IAAI,GAAG;AAEjC,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,IAAI,IAAI,MAAM,WAAW;AAChC,WAAK,OAAO,OAAO,GAAG;AACtB,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,KAAK,IAAI,KAAK,OAAO,KAAK,QAAQ;AACpD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,SAAS,KAAa,SAA2B,KAA0B;AAC/E,UAAM,SAAS,KAAK,IAAI,GAAG;AAC3B,QAAI,WAAW,QAAW;AACxB,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,MAAM,QAAQ;AAC5B,SAAK,IAAI,KAAK,OAAO,GAAG;AACxB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAuB;AACrB,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,aAAa;AACjB,QAAI,eAAe;AACnB,QAAI,eAAe;AACnB,QAAI,eAAe;AAEnB,eAAW,SAAS,KAAK,OAAO,OAAO,GAAG;AACxC,UAAI,OAAO,MAAM,WAAW;AAC1B;AACA,YAAI,MAAM,YAAY,aAAc,gBAAe,MAAM;AACzD,YAAI,MAAM,YAAY,aAAc,gBAAe,MAAM;AAAA,MAC3D,OAAO;AACL;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,WAAW,KAAK,OAAO;AAAA,MACvB,WAAW;AAAA,MACX,aAAa;AAAA,MACb,SAAS,KAAK,QAAQ;AAAA,MACtB,YAAY,KAAK,QAAQ;AAAA,MACzB,gBAAgB,iBAAiB,WAAW,IAAI,eAAe;AAAA,MAC/D,gBAAgB,iBAAiB,IAAI,IAAI,eAAe;AAAA,IAC1D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,QAAI,KAAK,kBAAkB;AACzB,oBAAc,KAAK,gBAAgB;AACnC,WAAK,mBAAmB;AAAA,IAC1B;AACA,SAAK,OAAO,MAAM;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAsB;AAE5B,SAAK,mBAAmB,YAAY,MAAM;AACxC,WAAK,eAAe;AAAA,IACtB,GAAG,GAAK;AAGR,QAAI,KAAK,iBAAiB,OAAO;AAC/B,WAAK,iBAAiB,MAAM;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAyB;AAC/B,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,QAAQ;AAEZ,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG;AAChD,UAAI,MAAM,MAAM,WAAW;AACzB,aAAK,OAAO,OAAO,GAAG;AACtB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAqB;AAE3B,SAAK,eAAe;AAGpB,QAAI,KAAK,OAAO,QAAQ,KAAK,QAAQ,SAAS;AAC5C,UAAI,YAA2B;AAC/B,UAAI,eAAe;AAEnB,iBAAW,CAAC,KAAK,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG;AAChD,YAAI,MAAM,YAAY,cAAc;AAClC,yBAAe,MAAM;AACrB,sBAAY;AAAA,QACd;AAAA,MACF;AAEA,UAAI,WAAW;AACb,aAAK,OAAO,OAAO,SAAS;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACF;AAyCO,IAAM,+BAAmD;AAAA,EAC9D,SAAS;AAAA,EACT,kBAAkB;AAAA;AAAA,EAClB,iBAAiB;AAAA;AAAA,EACjB,sBAAsB;AAAA;AAAA,EACtB,SAAS;AACX;AA6BO,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,SAAsC,CAAC,GAAG;AACpD,SAAK,UAAU,EAAE,GAAG,8BAA8B,GAAG,OAAO;AAE5D,SAAK,SAAS,IAAI,SAAiB;AAAA,MACjC,YAAY,KAAK,QAAQ;AAAA,MACzB,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AAED,SAAK,mBAAmB,IAAI,SAAkB;AAAA,MAC5C,YAAY,KAAK,QAAQ;AAAA,MACzB,SAAS;AAAA;AAAA,IACX,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAmB;AACrB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAA6B;AAC/B,WAAO,EAAE,GAAG,KAAK,QAAQ;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB,OAAe,SAAqC;AACnE,QAAI,CAAC,KAAK,QAAQ,QAAS,QAAO;AAClC,WAAO,KAAK,OAAO,IAAI,KAAK,WAAW,OAAO,OAAO,CAAC;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,OAAe,SAAiB,SAAuB;AACtE,QAAI,CAAC,KAAK,QAAQ,QAAS;AAC3B,SAAK,OAAO,IAAI,KAAK,WAAW,OAAO,OAAO,GAAG,SAAS,KAAK,QAAQ,gBAAgB;AAAA,EACzF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBACJ,OACA,SACA,SACiB;AACjB,QAAI,CAAC,KAAK,QAAQ,SAAS;AACzB,aAAO,QAAQ;AAAA,IACjB;AAEA,WAAO,KAAK,OAAO;AAAA,MACjB,KAAK,WAAW,OAAO,OAAO;AAAA,MAC9B;AAAA,MACA,KAAK,QAAQ;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAgB,OAAe,OAAe,SAAqC;AACjF,QAAI,CAAC,KAAK,QAAQ,QAAS,QAAO;AAClC,WAAO,KAAK,OAAO,IAAI,KAAK,UAAU,OAAO,OAAO,OAAO,CAAC;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,OAAe,OAAe,SAAiB,SAAuB;AACpF,QAAI,CAAC,KAAK,QAAQ,QAAS;AAC3B,SAAK,OAAO,IAAI,KAAK,UAAU,OAAO,OAAO,OAAO,GAAG,SAAS,KAAK,QAAQ,eAAe;AAAA,EAC9F;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBACJ,OACA,OACA,SACA,SACiB;AACjB,QAAI,CAAC,KAAK,QAAQ,SAAS;AACzB,aAAO,QAAQ;AAAA,IACjB;AAEA,WAAO,KAAK,OAAO;AAAA,MACjB,KAAK,UAAU,OAAO,OAAO,OAAO;AAAA,MACpC;AAAA,MACA,KAAK,QAAQ;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,qBAAwB,KAA4B;AAClD,QAAI,CAAC,KAAK,QAAQ,QAAS,QAAO;AAClC,WAAO,KAAK,iBAAiB,IAAI,KAAK,eAAe,GAAG,CAAC;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAwB,KAAa,OAAgB;AACnD,QAAI,CAAC,KAAK,QAAQ,QAAS;AAC3B,SAAK,iBAAiB,IAAI,KAAK,eAAe,GAAG,GAAG,OAAO,KAAK,QAAQ,oBAAoB;AAAA,EAC9F;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,4BAA+B,KAAa,SAAuC;AACvF,QAAI,CAAC,KAAK,QAAQ,SAAS;AACzB,aAAO,QAAQ;AAAA,IACjB;AAEA,WAAO,KAAK,iBAAiB;AAAA,MAC3B,KAAK,eAAe,GAAG;AAAA,MACvB;AAAA,MACA,KAAK,QAAQ;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAgB,OAAuB;AACrC,UAAM,SAAS,KAAK,OAAO,eAAe,UAAU,KAAK,GAAG;AAC5D,UAAM,SAAS,KAAK,OAAO,eAAe,SAAS,KAAK,GAAG;AAC3D,UAAM,SAAS,KAAK,iBAAiB,eAAe,MAAM;AAC1D,WAAO,SAAS,SAAS;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,SAAyB;AACzC,QAAI,QAAQ;AACZ,UAAM,eAAe,QAAQ,YAAY;AAEzC,eAAW,OAAO,KAAK,OAAO,KAAK,GAAG;AACpC,UAAI,IAAI,YAAY,EAAE,SAAS,YAAY,GAAG;AAC5C,aAAK,OAAO,OAAO,GAAG;AACtB;AAAA,MACF;AAAA,IACF;AAGA,SAAK,iBAAiB,MAAM;AAE5B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAuB,OAAe,OAAe,SAA0B;AAC7E,WAAO,KAAK,OAAO,OAAO,KAAK,UAAU,OAAO,OAAO,OAAO,CAAC;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,OAAO,MAAM;AAClB,SAAK,iBAAiB,MAAM;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,WAA8B;AAC5B,WAAO;AAAA,MACL,cAAc,KAAK,OAAO,SAAS;AAAA,MACnC,iBAAiB,KAAK,iBAAiB,SAAS;AAAA,MAChD,QAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,SAAK,OAAO,QAAQ;AACpB,SAAK,iBAAiB,QAAQ;AAAA,EAChC;AAAA;AAAA,EAIQ,WAAW,OAAe,SAAyB;AACzD,WAAO,UAAU,KAAK,IAAI,QAAQ,YAAY,CAAC;AAAA,EACjD;AAAA,EAEQ,UAAU,OAAe,OAAe,SAAyB;AACvE,WAAO,SAAS,KAAK,IAAI,MAAM,YAAY,CAAC,IAAI,QAAQ,YAAY,CAAC;AAAA,EACvE;AAAA,EAEQ,eAAe,KAAqB;AAC1C,WAAO,OAAO,GAAG;AAAA,EACnB;AACF;;;AC9oBO,IAAM,iBAA0E;AAAA,EACrF,UAAU;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA,UAAU;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA,KAAK;AAAA,IACH,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA,WAAW;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA,UAAU;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AACF;AAKO,IAAM,wBAAgD;AAAA,EAC3D,UAAU;AAAA,EACV,UAAU;AAAA,EACV,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AACX;AAMO,IAAM,kBAA2C;AAAA,EACtD,UAAU;AAAA,EACV,UAAU;AAAA,EACV,KAAK;AAAA,EACL,WAAW;AAAA,EACX,UAAU;AACZ;AAKO,IAAM,iBAA0C;AAAA,EACrD,UAAU;AAAA,EACV,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AACX;AAKO,IAAM,wBAAiD;AAAA,EAC5D,UAAU;AAAA,EACV,SAAS;AACX;AAcO,IAAM,eAA4C;AAAA,EACvD,UAAU;AAAA,IACR;AAAA,MACE,SAAS,gBAAgB;AAAA,MACzB,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,iBAAiB;AAAA,IACnB;AAAA,IACA;AAAA,MACE,SAAS,eAAe;AAAA,MACxB,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,iBAAiB;AAAA,IACnB;AAAA,IACA;AAAA,MACE,SAAS,sBAAsB;AAAA,MAC/B,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,iBAAiB;AAAA,IACnB;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE,SAAS,gBAAgB;AAAA,MACzB,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,iBAAiB;AAAA,IACnB;AAAA,IACA;AAAA,MACE,SAAS,eAAe;AAAA,MACxB,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,iBAAiB;AAAA,IACnB;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ;AAAA,MACE,SAAS,eAAe;AAAA,MACxB,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,iBAAiB;AAAA,IACnB;AAAA,EACF;AAAA,EACA,KAAK;AAAA,IACH;AAAA,MACE,SAAS,gBAAgB;AAAA,MACzB,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,iBAAiB;AAAA,IACnB;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT;AAAA,MACE,SAAS,gBAAgB;AAAA,MACzB,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,iBAAiB;AAAA,IACnB;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE,SAAS,gBAAgB;AAAA,MACzB,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,iBAAiB;AAAA,IACnB;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP;AAAA,MACE,SAAS,eAAe;AAAA,MACxB,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,iBAAiB;AAAA,IACnB;AAAA,IACA;AAAA,MACE,SAAS,sBAAsB;AAAA,MAC/B,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,iBAAiB;AAAA,IACnB;AAAA,EACF;AACF;AAKO,SAAS,qBACd,WACA,QACuB;AACvB,QAAM,gBAAgB,eAAe,SAAS;AAE9C,MAAI,OAAO,WAAW,UAAU;AAE9B,WAAO;AAAA,MACL,UAAU;AAAA,MACV,SAAS,eAAe,WAAW;AAAA,MACnC,SAAS,eAAe,WAAW;AAAA,MACnC,MAAM;AAAA,IACR;AAAA,EACF;AAGA,SAAO;AAAA,IACL,UAAU,OAAO;AAAA,IACjB,SAAS,OAAO,WAAW,eAAe,WAAW;AAAA,IACrD,SAAS,OAAO,WAAW,eAAe,WAAW,UAAU,OAAO,OAAO;AAAA,IAC7E,MAAM;AAAA,EACR;AACF;AAKO,SAAS,oBAAoB,OAAuB;AACzD,SAAO,eAAe,KAAK,GAAG,WAAW;AAC3C;AAKO,SAAS,oBAAoB,SAAqC;AACvE,aAAW,CAAC,OAAO,MAAM,KAAK,OAAO,QAAQ,cAAc,GAAG;AAC5D,QAAI,OAAO,YAAY,SAAS;AAC9B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAKO,SAAS,WAAW,OAAuB;AAChD,SAAO,eAAe,KAAK,GAAG,WAAW;AAC3C;AAKO,SAAS,iBAA2B;AACzC,SAAO,OAAO,KAAK,eAAe;AACpC;AAKO,SAAS,kBAAkB,OAAsC;AACtE,QAAM,SAAS,aAAa,KAAK;AACjC,MAAI,CAAC,UAAU,OAAO,WAAW,EAAG,QAAO;AAG3C,SACE,OAAO,KAAK,CAAC,MAAM,EAAE,WAAW,OAAO,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM,KAAK,OAAO,CAAC;AAEnG;;;ACjQO,IAAK,eAAL,kBAAKA,kBAAL;AAEL,EAAAA,4BAAA,wBAAqB,QAArB;AACA,EAAAA,4BAAA,yBAAsB,QAAtB;AACA,EAAAA,4BAAA,yBAAsB,QAAtB;AACA,EAAAA,4BAAA,mCAAgC,QAAhC;AAGA,EAAAA,4BAAA,0BAAuB,QAAvB;AACA,EAAAA,4BAAA,yBAAsB,QAAtB;AACA,EAAAA,4BAAA,0BAAuB,QAAvB;AACA,EAAAA,4BAAA,sBAAmB,QAAnB;AAGA,EAAAA,4BAAA,4BAAyB,QAAzB;AACA,EAAAA,4BAAA,0BAAuB,QAAvB;AACA,EAAAA,4BAAA,0BAAuB,QAAvB;AAGA,EAAAA,4BAAA,4BAAyB,QAAzB;AACA,EAAAA,4BAAA,yBAAsB,QAAtB;AACA,EAAAA,4BAAA,wBAAqB,QAArB;AACA,EAAAA,4BAAA,qBAAkB,QAAlB;AACA,EAAAA,4BAAA,6BAA0B,QAA1B;AAGA,EAAAA,4BAAA,0BAAuB,QAAvB;AACA,EAAAA,4BAAA,gCAA6B,QAA7B;AACA,EAAAA,4BAAA,2BAAwB,QAAxB;AAGA,EAAAA,4BAAA,wBAAqB,QAArB;AACA,EAAAA,4BAAA,2BAAwB,QAAxB;AACA,EAAAA,4BAAA,0BAAuB,QAAvB;AACA,EAAAA,4BAAA,0BAAuB,QAAvB;AACA,EAAAA,4BAAA,yBAAsB,QAAtB;AAGA,EAAAA,4BAAA,0BAAuB,QAAvB;AACA,EAAAA,4BAAA,0BAAuB,QAAvB;AACA,EAAAA,4BAAA,mBAAgB,QAAhB;AACA,EAAAA,4BAAA,6BAA0B,QAA1B;AAGA,EAAAA,4BAAA,eAAY,QAAZ;AACA,EAAAA,4BAAA,iBAAc,QAAd;AACA,EAAAA,4BAAA,sBAAmB,QAAnB;AACA,EAAAA,4BAAA,2BAAwB,QAAxB;AAGA,EAAAA,4BAAA,mBAAgB,QAAhB;AAlDU,SAAAA;AAAA,GAAA;AAwDL,IAAM,WAAN,MAAM,kBAAiB,MAAM;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EAET,YACE,MACA,SACA,SAIA;AACA,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,QAAQ,SAAS;AACtB,SAAK,UAAU,SAAS;AAGxB,QAAI,MAAM,mBAAmB;AAC3B,YAAM,kBAAkB,MAAM,SAAQ;AAAA,IACxC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAkC;AAChC,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,SAAS,KAAK;AAAA,MACd,OAAO,KAAK,OAAO;AAAA,MACnB,OAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAuB;AACrB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,SAAS,KAAK,IAAI;AAAA,EACtB;AACF;AAKO,IAAM,yBAAN,cAAqC,SAAS;AAAA,EACnD,YACE,SACA,SAIA;AACA,UAAM,gCAAkC,SAAS,OAAO;AACxD,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,aAAN,cAAyB,SAAS;AAAA,EAC9B;AAAA,EAET,YACE,MACA,SACA,SAKA;AACA,UAAM,MAAM,SAAS;AAAA,MACnB,OAAO,SAAS;AAAA,MAChB,SAAS,EAAE,GAAG,SAAS,SAAS,OAAO,SAAS,MAAM;AAAA,IACxD,CAAC;AACD,SAAK,OAAO;AACZ,SAAK,QAAQ,SAAS;AAAA,EACxB;AACF;AAKO,IAAM,cAAN,cAA0B,SAAS;AAAA,EAC/B;AAAA,EACA;AAAA,EAET,YACE,MACA,SACA,SAMA;AACA,UAAM,MAAM,SAAS;AAAA,MACnB,OAAO,SAAS;AAAA,MAChB,SAAS,EAAE,GAAG,SAAS,SAAS,OAAO,SAAS,OAAO,SAAS,SAAS,QAAQ;AAAA,IACnF,CAAC;AACD,SAAK,OAAO;AACZ,SAAK,QAAQ,SAAS;AACtB,SAAK,UAAU,SAAS;AAAA,EAC1B;AACF;AAKO,IAAM,eAAN,cAA2B,SAAS;AAAA,EAChC;AAAA,EAET,YACE,MACA,SACA,SAKA;AACA,UAAM,MAAM,SAAS;AAAA,MACnB,OAAO,QAAQ;AAAA,MACf,SAAS,EAAE,GAAG,QAAQ,SAAS,WAAW,QAAQ,UAAU;AAAA,IAC9D,CAAC;AACD,SAAK,OAAO;AACZ,SAAK,YAAY,QAAQ;AAAA,EAC3B;AACF;AAKO,IAAM,eAAN,cAA2B,SAAS;AAAA,EAChC;AAAA,EACA;AAAA,EAET,YACE,MACA,SACA,SAMA;AACA,UAAM,MAAM,SAAS;AAAA,MACnB,OAAO,SAAS;AAAA,MAChB,SAAS,EAAE,GAAG,SAAS,SAAS,OAAO,SAAS,OAAO,OAAO,SAAS,MAAM;AAAA,IAC/E,CAAC;AACD,SAAK,OAAO;AACZ,SAAK,QAAQ,SAAS;AACtB,SAAK,QAAQ,SAAS;AAAA,EACxB;AACF;AAKO,IAAM,mBAAN,cAA+B,SAAS;AAAA,EACpC;AAAA,EACA;AAAA,EAET,YACE,MACA,SACA,SAMA;AACA,UAAM,MAAM,SAAS;AAAA,MACnB,OAAO,SAAS;AAAA,MAChB,SAAS,EAAE,GAAG,SAAS,SAAS,OAAO,SAAS,OAAO,QAAQ,SAAS,OAAO;AAAA,IACjF,CAAC;AACD,SAAK,OAAO;AACZ,SAAK,QAAQ,SAAS;AACtB,SAAK,SAAS,SAAS;AAAA,EACzB;AACF;AAKO,IAAM,cAAN,cAA0B,SAAS;AAAA,EAC/B;AAAA,EACA;AAAA,EAET,YACE,MACA,SACA,SAMA;AACA,UAAM,MAAM,SAAS;AAAA,MACnB,OAAO,SAAS;AAAA,MAChB,SAAS;AAAA,QACP,GAAG,SAAS;AAAA,QACZ,WAAW,SAAS;AAAA,QACpB,SAAS,SAAS;AAAA,MACpB;AAAA,IACF,CAAC;AACD,SAAK,OAAO;AACZ,SAAK,YAAY,SAAS;AAC1B,SAAK,UAAU,SAAS;AAAA,EAC1B;AACF;AAKO,IAAM,WAAN,cAAuB,SAAS;AAAA,EAC5B;AAAA,EACA;AAAA,EAET,YACE,MACA,SACA,SAMA;AACA,UAAM,MAAM,SAAS;AAAA,MACnB,OAAO,SAAS;AAAA,MAChB,SAAS;AAAA,QACP,GAAG,SAAS;AAAA,QACZ,UAAU,SAAS;AAAA,QACnB,SAAS,SAAS;AAAA,MACpB;AAAA,IACF,CAAC;AACD,SAAK,OAAO;AACZ,SAAK,WAAW,SAAS;AACzB,SAAK,UAAU,SAAS;AAAA,EAC1B;AACF;AAKO,SAAS,UACd,OACA,cAA4B,0BAC5B,iBAAiB,6BACjB,SACU;AAEV,MAAI,iBAAiB,UAAU;AAC7B,WAAO;AAAA,EACT;AAGA,MAAI,iBAAiB,OAAO;AAE1B,UAAM,MAAM,MAAM,QAAQ,YAAY;AAEtC,QAAI,IAAI,SAAS,SAAS,KAAK,IAAI,SAAS,WAAW,GAAG;AACxD,aAAO,IAAI,SAAS,wBAA0B,oBAAoB,MAAM,OAAO,IAAI;AAAA,QACjF,OAAO;AAAA,QACP;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,IAAI,SAAS,YAAY,KAAK,IAAI,SAAS,mBAAmB,KAAK,IAAI,SAAS,KAAK,GAAG;AAC1F,aAAO,IAAI,SAAS,6BAA+B,iBAAiB,MAAM,OAAO,IAAI;AAAA,QACnF,OAAO;AAAA,QACP;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QACE,IAAI,SAAS,YAAY,KACzB,IAAI,SAAS,SAAS,KACtB,IAAI,SAAS,cAAc,KAC3B,IAAI,SAAS,WAAW,GACxB;AACA,aAAO,IAAI;AAAA,QACT;AAAA,QACA,sBAAsB,MAAM,OAAO;AAAA,QACnC,EAAE,OAAO,OAAO,QAAQ;AAAA,MAC1B;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,oBAAoB,KAAK,IAAI,SAAS,sBAAsB,GAAG;AAC9E,aAAO,IAAI;AAAA,QACT;AAAA,QACA,yBAAyB,MAAM,OAAO;AAAA,QACtC,EAAE,OAAO,OAAO,QAAQ;AAAA,MAC1B;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,eAAe,KAAK,IAAI,SAAS,aAAa,GAAG;AAChE,aAAO,IAAI;AAAA,QACT;AAAA,QACA;AAAA,QACA,EAAE,WAAW,iBAAiB,OAAO,OAAO,QAAQ;AAAA,MACtD;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,UAAU,KAAK,IAAI,SAAS,QAAQ,GAAG;AACtD,aAAO,IAAI;AAAA,QACT;AAAA,QACA,yBAAyB,MAAM,OAAO;AAAA,QACtC,EAAE,OAAO,OAAO,QAAQ;AAAA,MAC1B;AAAA,IACF;AAEA,WAAO,IAAI,SAAS,aAAa,MAAM,WAAW,gBAAgB;AAAA,MAChE,OAAO;AAAA,MACP;AAAA,IACF,CAAC;AAAA,EACH;AAGA,SAAO,IAAI,SAAS,aAAa,OAAO,KAAK,KAAK,gBAAgB,EAAE,QAAQ,CAAC;AAC/E;AAKO,SAAS,WAAW,OAAmC;AAC5D,SAAO,iBAAiB;AAC1B;AAKO,SAAS,aAAa,OAAgB,MAA6B;AACxE,SAAO,WAAW,KAAK,KAAK,MAAM,SAAS;AAC7C;AAmBO,IAAM,uBAAoC;AAAA,EAC/C,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,oBAAoB;AACtB;AAKA,eAAsB,UACpB,IACA,SAA+B,CAAC,GACpB;AACZ,QAAM,EAAE,YAAY,WAAW,UAAU,mBAAmB,IAAI;AAAA,IAC9D,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAEA,MAAI;AAEJ,WAAS,UAAU,GAAG,WAAW,YAAY,WAAW;AACtD,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,SAAS,OAAO;AACd,kBAAY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAGpE,YAAM,WAAW,UAAU,KAAK;AAChC,UAAI,CAAC,SAAS,YAAY,KAAK,WAAW,YAAY;AACpD,cAAM;AAAA,MACR;AAGA,YAAM,QAAQ,qBACV,KAAK,IAAI,YAAY,KAAK,IAAI,GAAG,OAAO,GAAG,QAAQ,IACnD;AAGJ,YAAM,SAAS,KAAK,OAAO,IAAI,QAAQ;AACvC,YAAM,MAAM,QAAQ,MAAM;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,aAAa,IAAI,MAAM,iCAAiC;AAChE;AAKA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAKA,eAAsB,YACpB,SACA,WACA,YAAY,aACA;AACZ,MAAI;AAEJ,QAAM,iBAAiB,IAAI,QAAe,CAAC,GAAG,WAAW;AACvD,gBAAY,WAAW,MAAM;AAC3B,aAAO,IAAI,SAAS,wBAA0B,GAAG,SAAS,oBAAoB,SAAS,IAAI,CAAC;AAAA,IAC9F,GAAG,SAAS;AAAA,EACd,CAAC;AAED,MAAI;AACF,WAAO,MAAM,QAAQ,KAAK,CAAC,SAAS,cAAc,CAAC;AAAA,EACrD,UAAE;AACA,iBAAa,SAAU;AAAA,EACzB;AACF;;;ACveA,IAAM,qBAAqB;AAK3B,IAAM,wBAA8C;AAAA,EAClD,YAAY;AAAA,EACZ,WAAW;AACb;AAqBO,IAAM,YAAN,MAA2C;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAA8B;AAAA,EAC9B,WAA2B;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUR,YAAY,KAAkB,OAAe,eAAe,GAAG,YAAY,oBAAoB;AAC7F,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,4CAA8C,4BAA4B,EAAE,MAAM,CAAC;AAAA,IAC/F;AAEA,QAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,YAAM,IAAI;AAAA;AAAA,QAER;AAAA,QACA,EAAE,MAAM;AAAA,MACV;AAAA,IACF;AAEA,QAAI,eAAe,KAAK,CAAC,OAAO,UAAU,YAAY,GAAG;AACvD,YAAM,IAAI;AAAA;AAAA,QAER;AAAA,QACA,EAAE,OAAO,SAAS,EAAE,aAAa,EAAE;AAAA,MACrC;AAAA,IACF;AAEA,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,gBAAgB;AACrB,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,UAAmB;AACrB,QAAI,CAAC,KAAK,UAAU;AAClB,YAAM,IAAI;AAAA;AAAA,QAER,qCAAqC,KAAK,MAAM;AAAA,QAChD,EAAE,OAAO,KAAK,OAAO;AAAA,MACvB;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,gBAAyB;AAC3B,WAAO,KAAK,aAAa,QAAQ,KAAK,aAAa;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,aAA4B;AAChC,QAAI,KAAK,SAAU;AAEnB,QAAI;AACF,YAAM,iBAAiB,KAAK,KAAK,WAAW,KAAK,QAAQ,KAAK,aAAa;AAC3E,WAAK,WAAW,MAAM;AAAA,QACpB;AAAA,QACA,KAAK;AAAA,QACL,wBAAwB,KAAK,MAAM;AAAA,MACrC;AAEA,YAAM,iBAAiB,KAAK,SAAS,WAAW;AAChD,YAAM,gBAAgB,MAAM;AAAA,QAC1B;AAAA,QACA,KAAK;AAAA,QACL,wBAAwB,KAAK,MAAM;AAAA,MACrC;AAGA,UAAI,CAAC,iBAAiB,CAAC,cAAc,WAAW,IAAI,GAAG;AACrD,cAAM,IAAI;AAAA;AAAA,UAER,oCAAoC,aAAa;AAAA,UACjD,EAAE,OAAO,KAAK,OAAO;AAAA,QACvB;AAAA,MACF;AAEA,WAAK,WAAW;AAAA,IAClB,SAAS,OAAO;AAEd,WAAK,WAAW;AAChB,WAAK,WAAW;AAGhB,UAAI,iBAAiB,aAAa;AAChC,cAAM;AAAA,MACR;AAEA,YAAM,IAAI;AAAA;AAAA,QAER,0CAA0C,KAAK,MAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QACjH;AAAA,UACE,OAAO,KAAK;AAAA,UACZ,OAAO,iBAAiB,QAAQ,QAAQ;AAAA,UACxC,SAAS,EAAE,cAAc,KAAK,cAAc;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,aAAkC;AAC9C,QAAI,CAAC,KAAK,UAAU;AAClB,YAAM,KAAK,WAAW;AAAA,IACxB;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,cAAc,SAKO;AAEzB,QAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,YAAM,IAAI;AAAA;AAAA,QAER;AAAA,QACA,EAAE,WAAW,iBAAiB,SAAS,EAAE,OAAO,KAAK,OAAO,EAAE;AAAA,MAChE;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ,UAAU,CAAC,QAAQ,SAAS,CAAC,QAAQ,eAAe,CAAC,QAAQ,SAAS;AACjF,YAAM,IAAI;AAAA;AAAA,QAER;AAAA,QACA;AAAA,UACE,WAAW;AAAA,UACX,SAAS;AAAA,YACP,OAAO,KAAK;AAAA,YACZ,WAAW;AAAA,cACT,QAAQ,CAAC,CAAC,QAAQ;AAAA,cAClB,OAAO,CAAC,CAAC,QAAQ;AAAA,cACjB,aAAa,CAAC,CAAC,QAAQ;AAAA,cACvB,SAAS,CAAC,CAAC,QAAQ;AAAA,YACrB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,WAAW;AAEtC,YAAM,cAAc,QAAQ,cAAc;AAAA,QACxC,QAAQ,QAAQ;AAAA,QAChB,OAAO,QAAQ;AAAA,QACf,aAAa,QAAQ;AAAA,QACrB,SAAS,QAAQ;AAAA,MACnB,CAAC;AAED,YAAM,YAAY,MAAM,YAAY,aAAa,KAAK,YAAY,oBAAoB;AAGtF,UAAI,CAAC,aAAa,CAAC,UAAU,WAAW,IAAI,GAAG;AAC7C,cAAM,IAAI;AAAA;AAAA,UAER,sCAAsC,WAAW,UAAU,GAAG,EAAE,CAAC;AAAA,UACjE,EAAE,WAAW,iBAAiB,SAAS,EAAE,OAAO,KAAK,OAAO,EAAE;AAAA,QAChE;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,iBAAiB,cAAc;AACjC,cAAM;AAAA,MACR;AAEA,YAAM,UAAU;AAAA,QACd;AAAA;AAAA,QAEA;AAAA,QACA;AAAA,UACE,OAAO,KAAK;AAAA,UACZ,aAAa,QAAQ;AAAA,QACvB;AAAA,MACF;AAEA,YAAM,IAAI,aAAa,QAAQ,MAAsB,QAAQ,SAAS;AAAA,QACpE,WAAW;AAAA,QACX,OAAO,QAAQ;AAAA,QACf,SAAS,QAAQ;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAY,SAAsD;AAEtE,QAAI,YAAY,UAAa,YAAY,MAAM;AAC7C,YAAM,IAAI,yCAA2C,mCAAmC;AAAA,QACtF,WAAW;AAAA,QACX,SAAS,EAAE,OAAO,KAAK,OAAO;AAAA,MAChC,CAAC;AAAA,IACH;AAEA,QAAI,OAAO,YAAY,YAAY,EAAE,mBAAmB,aAAa;AACnE,YAAM,IAAI;AAAA;AAAA,QAER;AAAA,QACA,EAAE,WAAW,eAAe,SAAS,EAAE,OAAO,KAAK,QAAQ,MAAM,OAAO,QAAQ,EAAE;AAAA,MACpF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,WAAW;AAEtC,YAAM,aACJ,OAAO,YAAY,WAAW,UAAU,OAAO,KAAK,OAAO,EAAE,SAAS,OAAO;AAE/E,YAAM,cAAc,QAAQ,YAAY,UAAU;AAClD,YAAM,YAAY,MAAM,YAAY,aAAa,KAAK,YAAY,iBAAiB;AAGnF,UAAI,CAAC,aAAa,CAAC,UAAU,WAAW,IAAI,GAAG;AAC7C,cAAM,IAAI;AAAA;AAAA,UAER,sCAAsC,WAAW,UAAU,GAAG,EAAE,CAAC;AAAA,UACjE,EAAE,WAAW,eAAe,SAAS,EAAE,OAAO,KAAK,OAAO,EAAE;AAAA,QAC9D;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,iBAAiB,cAAc;AACjC,cAAM;AAAA,MACR;AAEA,YAAM,UAAU,UAAU,uCAAyC,0BAA0B;AAAA,QAC3F,OAAO,KAAK;AAAA,MACd,CAAC;AAED,YAAM,IAAI,aAAa,QAAQ,MAAsB,QAAQ,SAAS;AAAA,QACpE,WAAW;AAAA,QACX,OAAO,QAAQ;AAAA,QACf,SAAS,QAAQ;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAmB;AACjB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,aAAqB;AACnB,WAAO,WAAW,KAAK,MAAM;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,kBAA0B;AACxB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAA8B;AAClC,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,WAAW;AAEtC,aAAO,MAAM,UAAU,YAAY;AACjC,cAAM,iBAAiB,QAAQ,WAAW;AAC1C,eAAO,YAAY,gBAAgB,KAAK,YAAY,yBAAyB;AAAA,MAC/E,GAAG,qBAAqB;AAAA,IAC1B,SAAS,OAAO;AACd,UAAI,iBAAiB,cAAc;AACjC,cAAM;AAAA,MACR;AAEA,YAAM,IAAI;AAAA;AAAA,QAER,oCAAoC,KAAK,MAAM,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAC1G;AAAA,UACE,OAAO,KAAK;AAAA,UACZ,OAAO,iBAAiB,QAAQ,QAAQ;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAgB,cAAwC;AAE5D,QAAI,CAAC,gBAAgB,CAAC,aAAa,WAAW,IAAI,GAAG;AACnD,YAAM,IAAI;AAAA;AAAA,QAER,0BAA0B,YAAY;AAAA,QACtC,EAAE,OAAO,KAAK,QAAQ,OAAO,aAAa;AAAA,MAC5C;AAAA,IACF;AAEA,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,WAAW;AAEtC,aAAO,MAAM,UAAU,YAAY;AACjC,cAAM,iBAAiB,QAAQ,gBAAgB,YAAY;AAC3D,eAAO,YAAY,gBAAgB,KAAK,YAAY,wBAAwB;AAAA,MAC9E,GAAG,qBAAqB;AAAA,IAC1B,SAAS,OAAO;AACd,UAAI,iBAAiB,cAAc;AACjC,cAAM;AAAA,MACR;AAEA,YAAM,IAAI;AAAA;AAAA,QAER,mCAAmC,YAAY,OAAO,KAAK,MAAM,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAC5H;AAAA,UACE,OAAO,KAAK;AAAA,UACZ,OAAO;AAAA,UACP,OAAO,iBAAiB,QAAQ,QAAQ;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAY,QAAyE;AAEzF,QAAI,CAAC,OAAO,MAAM,CAAC,OAAO,GAAG,WAAW,IAAI,GAAG;AAC7C,YAAM,IAAI;AAAA;AAAA,QAER,yBAAyB,OAAO,EAAE;AAAA,QAClC,EAAE,OAAO,KAAK,QAAQ,SAAS,OAAO;AAAA,MACxC;AAAA,IACF;AAEA,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,WAAW;AAEtC,aAAO,MAAM,UAAU,YAAY;AACjC,cAAM,kBAAkB,QAAQ,YAAY;AAAA,UAC1C,IAAI,OAAO;AAAA,UACX,OAAO,OAAO;AAAA,UACd,MAAM,OAAO;AAAA,QACf,CAAC;AACD,eAAO,YAAY,iBAAiB,KAAK,YAAY,gBAAgB;AAAA,MACvE,GAAG,qBAAqB;AAAA,IAC1B,SAAS,OAAO;AACd,UAAI,iBAAiB,kBAAkB;AACrC,cAAM;AAAA,MACR;AAEA,YAAM,IAAI;AAAA;AAAA,QAER,6BAA6B,KAAK,MAAM,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QACnG;AAAA,UACE,OAAO,KAAK;AAAA,UACZ,OAAO,iBAAiB,QAAQ,QAAQ;AAAA,UACxC,SAAS,EAAE,IAAI,OAAO,IAAI,OAAO,OAAO,OAAO,SAAS,EAAE;AAAA,QAC5D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAgB,QAIe;AAEnC,QAAI,CAAC,OAAO,MAAM,CAAC,OAAO,GAAG,WAAW,IAAI,GAAG;AAC7C,YAAM,IAAI;AAAA;AAAA,QAER,yBAAyB,OAAO,EAAE;AAAA,QAClC,EAAE,OAAO,KAAK,QAAQ,SAAS,OAAO;AAAA,MACxC;AAAA,IACF;AAEA,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,WAAW;AAEtC,YAAM,cAAc,QAAQ,gBAAgB;AAAA,QAC1C,IAAI,OAAO;AAAA,QACX,OAAO,OAAO;AAAA,QACd,MAAM,OAAO;AAAA,MACf,CAAC;AAED,YAAM,OAAO,MAAM;AAAA,QACjB;AAAA,QACA,KAAK,aAAa;AAAA;AAAA,QAClB;AAAA,MACF;AAGA,UAAI,CAAC,QAAQ,CAAC,KAAK,WAAW,IAAI,GAAG;AACnC,cAAM,IAAI;AAAA;AAAA,UAER,sCAAsC,MAAM,UAAU,GAAG,EAAE,CAAC;AAAA,UAC5D,EAAE,OAAO,KAAK,OAAO;AAAA,QACvB;AAAA,MACF;AAEA,aAAO,EAAE,KAA4B;AAAA,IACvC,SAAS,OAAO;AACd,UAAI,iBAAiB,kBAAkB;AACrC,cAAM;AAAA,MACR;AAEA,YAAM,UAAU,UAAU,sCAAwC,sBAAsB;AAAA,QACtF,OAAO,KAAK;AAAA,QACZ,IAAI,OAAO;AAAA,MACb,CAAC;AAED,YAAM,IAAI,iBAAiB,QAAQ,MAAsB,QAAQ,SAAS;AAAA,QACxE,OAAO,KAAK;AAAA,QACZ,OAAO,QAAQ;AAAA,QACf,SAAS,QAAQ;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAgBA,eAAsB,gBACpB,KACA,OACA,eAAe,GACf,YAAY,oBACQ;AACpB,QAAM,SAAS,IAAI,UAAU,KAAK,OAAO,cAAc,SAAS;AAChE,QAAM,OAAO,WAAW;AACxB,SAAO;AACT;AAQO,IAAM,gBAAN,MAA+C;AAAA,EAC3C;AAAA,EAET,YAAY,SAAkB,aAA4B;AACxD,SAAK,UAAU;AAAA,EAEjB;AAAA,EAEA,MAAM,cAAc,UAKO;AAEzB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,UAAuD;AACvE,WAAO;AAAA,EACT;AACF;;;ACriBA,SAAS,kBAAkB,2BAA2B;AAmC/C,IAAM,UAAN,MAAM,SAAQ;AAAA,EACX,OAA2B;AAAA,EAC3B,oBAAwD,oBAAI,IAAI;AAAA,EAChE;AAAA,EACA,eAAuC,oBAAI,IAAI;AAAA,EAC/C;AAAA,EACA,uBAAqC;AAAA;AAAA,EAG7C,OAAe,OAA8B;AAAA,EAC7C,OAAe,oBAA6B;AAAA,EAC5C,OAAe,kBAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmB1C,OAAO,YACL,KACA,kBACA,gBACM;AACN,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,uBAAuB,6BAA6B;AAAA,IAChE;AAEA,QAAI,OAAO,QAAQ,YAAY;AAC7B,YAAM,IAAI,uBAAuB,oCAAoC;AAAA,IACvE;AAEA,aAAQ,OAAO;AACf,aAAQ,oBAAoB,oBAAoB;AAChD,aAAQ,kBAAkB,kBAAkB;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,kBAA2B;AAChC,WAAO,SAAQ,SAAS;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,4BAAqC;AAC1C,WAAO,SAAQ,sBAAsB;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,qBAA8B;AACnC,WAAO,SAAQ,oBAAoB;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,qBAA6B;AAClC,QAAI,CAAC,SAAQ,MAAM;AACjB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,aAAO,SAAQ,KAAK,oBAAoB;AAAA,IAC1C,SAAS,OAAO;AACd,YAAM,IAAI;AAAA,QACR,mCAAmC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QACzF,EAAE,OAAO,iBAAiB,QAAQ,QAAQ,OAAU;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,YAAY,YAAoB,SAAwB,CAAC,GAAG,UAA0B,CAAC,GAAG;AAExF,QAAI,CAAC,cAAc,OAAO,eAAe,UAAU;AACjD,YAAM,IAAI,uBAAuB,8CAA8C;AAAA,IACjF;AAGA,UAAM,QAAQ,WAAW,KAAK,EAAE,MAAM,KAAK;AAC3C,UAAM,kBAAkB,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE;AAC3C,QAAI,CAAC,gBAAgB,SAAS,MAAM,MAAM,GAAG;AAC3C,YAAM,IAAI;AAAA,QACR,kEAAkE,MAAM,MAAM;AAAA,QAC9E,EAAE,SAAS,EAAE,WAAW,MAAM,OAAO,EAAE;AAAA,MACzC;AAAA,IACF;AAEA,SAAK,cAAc;AAGnB,SAAK,gBAAgB,IAAI,aAAa,QAAQ,KAAK;AAGnD,eAAW,CAAC,OAAO,WAAW,KAAK,OAAO,QAAQ,MAAM,GAAG;AACzD,UAAI,aAAa;AACf,YAAI;AACF,eAAK,kBAAkB,IAAI,OAAO,qBAAqB,OAAO,WAAW,CAAC;AAAA,QAC5E,SAAS,OAAO;AACd,gBAAM,IAAI;AAAA;AAAA,YAER,oCAAoC,KAAK,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,YACrG,EAAE,OAAO,OAAO,iBAAiB,QAAQ,QAAQ,OAAU;AAAA,UAC7D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,SAAK,0BAA0B;AAG/B,QAAI,SAAQ,MAAM;AAChB,WAAK,eAAe;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,4BAAkC;AAExC,QAAI,KAAK,kBAAkB,SAAS,GAAG;AACrC,YAAM,kBAAkB,sBAAsB;AAC9C,UAAI,iBAAiB;AACnB,aAAK,kBAAkB,IAAI,YAAY,qBAAqB,YAAY,eAAe,CAAC;AAAA,MAC1F;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAuB;AAC7B,QAAI,CAAC,SAAQ,MAAM;AACjB,WAAK,uBAAuB,IAAI,uBAAuB,oBAAoB;AAC3E;AAAA,IACF;AAEA,QAAI,CAAC,SAAQ,mBAAmB;AAC9B,WAAK,uBAAuB,IAAI;AAAA,QAC9B;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI;AACF,UAAI,MAAM,IAAI,SAAQ,KAAK,KAAK,WAAW;AAG3C,iBAAW,CAAC,OAAO,MAAM,KAAK,KAAK,mBAAmB;AACpD,YAAI;AACF,gBAAM,IAAI,eAAe,OAAO,SAAQ,mBAAmB;AAAA,YACzD,UAAU,OAAO;AAAA,YACjB,SAAS,OAAO;AAAA,UAClB,CAAC;AAAA,QACH,SAAS,OAAO;AACd,gBAAM,IAAI;AAAA;AAAA,YAER,wCAAwC,KAAK,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,YACzG,EAAE,OAAO,OAAO,iBAAiB,QAAQ,QAAQ,OAAU;AAAA,UAC7D;AAAA,QACF;AAAA,MACF;AAGA,UAAI,SAAQ,iBAAiB;AAC3B,YAAI;AACF,gBAAM,IAAI,iBAAiB,gBAAgB,SAAQ,eAAe;AAAA,QACpE,SAAS,OAAO;AAEd,kBAAQ;AAAA,YACN,6CAA6C,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,UACrG;AAAA,QACF;AAAA,MACF;AAEA,WAAK,OAAO;AACZ,WAAK,uBAAuB;AAAA,IAC9B,SAAS,OAAO;AACd,WAAK,uBAAuB,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AACpF,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,MAAmB;AACrB,QAAI,KAAK,sBAAsB;AAC7B,YAAM,KAAK,gCAAgC,WACvC,KAAK,uBACL,IAAI;AAAA,QACF,8BAA8B,KAAK,qBAAqB,OAAO;AAAA,QAC/D,EAAE,OAAO,KAAK,qBAAqB;AAAA,MACrC;AAAA,IACN;AAEA,QAAI,CAAC,KAAK,MAAM;AACd,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,gBAAyB;AAC3B,WAAO,KAAK,SAAS,QAAQ,KAAK,yBAAyB;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,sBAAoC;AACtC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAgC;AAC9B,WAAO,MAAM,KAAK,KAAK,kBAAkB,KAAK,CAAC;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,OAAkD;AAC/D,WAAO,KAAK,kBAAkB,IAAI,KAAK;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,OAAwB;AACxC,WAAO,KAAK,kBAAkB,IAAI,KAAK;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,UAAU,OAAe,eAAe,GAAuB;AAEnE,QAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,YAAM,IAAI;AAAA;AAAA,QAER;AAAA,QACA,EAAE,MAAM;AAAA,MACV;AAAA,IACF;AAEA,UAAM,WAAW,GAAG,KAAK,IAAI,YAAY;AAGzC,UAAM,SAAS,KAAK,aAAa,IAAI,QAAQ;AAC7C,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAGA,QAAI,CAAC,KAAK,kBAAkB,IAAI,KAAK,GAAG;AACtC,YAAM,kBAAkB,KAAK,oBAAoB;AACjD,YAAM,IAAI;AAAA;AAAA,QAER,UAAU,KAAK,uCAAuC,gBAAgB,SAAS,IAAI,gBAAgB,KAAK,IAAI,IAAI,QAAQ;AAAA,QACxH,EAAE,OAAO,SAAS,EAAE,gBAAgB,EAAE;AAAA,MACxC;AAAA,IACF;AAEA,QAAI;AACF,YAAM,SAAS,MAAM,gBAAgB,KAAK,KAAK,OAAO,YAAY;AAClE,WAAK,aAAa,IAAI,UAAU,MAAM;AACtC,aAAO;AAAA,IACT,SAAS,OAAO;AAEd,UAAI,WAAW,KAAK,GAAG;AACrB,cAAM;AAAA,MACR;AAEA,YAAM;AAAA,QACJ;AAAA;AAAA,QAEA,sCAAsC,KAAK;AAAA,QAC3C,EAAE,OAAO,aAAa;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,mBAAyB;AACvB,SAAK,aAAa,MAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,WAAW,OAAe,eAAe,GAAqB;AAClE,UAAM,SAAS,MAAM,KAAK,UAAU,OAAO,YAAY;AACvD,WAAO,OAAO;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,gBAAgB,OAAe,eAAe,GAAoB;AACtE,UAAM,eAAe,gBAAgB,KAAK;AAC1C,QAAI,CAAC,cAAc;AACjB,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,UAAU,OAAO,YAAY;AACvD,YAAM,UAAU,OAAO;AAEvB,aAAO,MAAM,KAAK,cAAc;AAAA,QAC9B;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,OAAO,gBAAgB,YAAY;AAAA,MACjD;AAAA,IACF,SAAS,OAAO;AAEd,UAAI,WAAW,KAAK,KAAK,MAAM,gDAAkD;AAC/E,eAAO;AAAA,MACT;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eAAe,OAAe,eAAe,GAAoB;AACrE,UAAM,cAAc,eAAe,KAAK;AACxC,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,UAAU,OAAO,YAAY;AACvD,YAAM,UAAU,OAAO;AAEvB,aAAO,MAAM,KAAK,cAAc;AAAA,QAC9B;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,OAAO,gBAAgB,WAAW;AAAA,MAChD;AAAA,IACF,SAAS,OAAO;AAEd,UAAI,WAAW,KAAK,KAAK,MAAM,gDAAkD;AAC/E,eAAO;AAAA,MACT;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,iBAAiB,OAAe,eAAe,GAA0B;AAC7E,UAAM,SAAS,KAAK,kBAAkB,IAAI,KAAK;AAC/C,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,4CAA8C,UAAU,KAAK,oBAAoB;AAAA,QACzF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,UAAU,OAAO,YAAY;AACvD,YAAM,UAAU,OAAO;AACvB,YAAM,SAAS,aAAa,KAAK,KAAK,CAAC;AAGvC,YAAM,sBAAsB,MAAM,QAAQ;AAAA,QACxC,OAAO,IAAI,OAAO,UAAU;AAC1B,gBAAM,UAAU,MAAM,KAAK,cAAc;AAAA,YACvC;AAAA,YACA,MAAM;AAAA,YACN;AAAA,YACA,YAAY,OAAO,gBAAgB,MAAM,OAAO;AAAA,UAClD;AACA,iBAAO;AAAA,YACL,OAAO,MAAM;AAAA,YACb,QAAQ,MAAM;AAAA,YACd;AAAA,YACA,WAAW,kBAAkB,SAAS,MAAM,QAAQ;AAAA,YACpD,UAAU,MAAM;AAAA,UAClB;AAAA,QACF,CAAC;AAAA,MACH;AAGA,YAAM,gBAAgC,oBAAoB,IAAI,CAAC,QAAQ,UAAU;AAC/E,YAAI,OAAO,WAAW,aAAa;AACjC,iBAAO,OAAO;AAAA,QAChB;AAEA,cAAM,QAAQ,OAAO,KAAK;AAC1B,eAAO;AAAA,UACL,OAAO,MAAM;AAAA,UACb,QAAQ,MAAM;AAAA,UACd,SAAS;AAAA,UACT,WAAW;AAAA,UACX,UAAU,MAAM;AAAA,QAClB;AAAA,MACF,CAAC;AAGD,UAAI;AACJ,UAAI;AACF,wBAAgB,MAAM,KAAK,cAAc;AAAA,UAAwB;AAAA,UAAO;AAAA,UAAS,YAC/E,OAAO,WAAW;AAAA,QACpB;AAAA,MACF,QAAQ;AACN,wBAAgB;AAAA,MAClB;AAEA,aAAO;AAAA,QACL;AAAA,QACA,SAAS,OAAO;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,IACF,SAAS,OAAO;AACd,UAAI,WAAW,KAAK,GAAG;AACrB,cAAM;AAAA,MACR;AAEA,YAAM,IAAI;AAAA;AAAA,QAER,qCAAqC,KAAK,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QACtG,EAAE,OAAO,OAAO,iBAAiB,QAAQ,QAAQ,OAAU;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,sBACJ,eAAe,GACf,UAAyC,CAAC,GACd;AAC5B,UAAM,EAAE,kBAAkB,KAAK,IAAI;AACnC,UAAM,SAAS,KAAK,oBAAoB;AAGxC,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC5B,OAAO,IAAI,CAAC,UAAU,KAAK,iBAAiB,OAAO,YAAY,CAAC;AAAA,IAClE;AAEA,UAAM,gBAAgC,CAAC;AACvC,UAAM,SAAkB,CAAC;AAEzB,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAM,SAAS,QAAQ,CAAC;AACxB,UAAI,OAAO,WAAW,aAAa;AACjC,sBAAc,KAAK,OAAO,KAAK;AAAA,MACjC,OAAO;AACL,eAAO,KAAK,OAAO,MAAM;AACzB,YAAI,CAAC,iBAAiB;AACpB,gBAAM,OAAO;AAAA,QACf;AAEA,cAAM,SAAS,KAAK,kBAAkB,IAAI,OAAO,CAAC,CAAC;AACnD,YAAI,QAAQ;AACV,wBAAc,KAAK;AAAA,YACjB,OAAO,OAAO,CAAC;AAAA,YACf,SAAS,OAAO;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ,CAAC;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,QAAI,aAAa;AACjB,QAAI,YAAY;AAEhB,eAAW,gBAAgB,eAAe;AACxC,iBAAW,SAAS,aAAa,QAAQ;AACvC,YAAI,MAAM,WAAW,SAAS;AAC5B,wBAAc,MAAM;AAAA,QACtB,WAAW,MAAM,WAAW,QAAQ;AAClC,uBAAa,MAAM;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,wBACJ,QACA,iBAAmC,SACgC;AAEnE,QAAI,UAAU,IAAI;AAChB,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,sBAAsB,GAAG,EAAE,iBAAiB,KAAK,CAAC;AAG9E,YAAM,gBAAgB,mBAAmB,UAAU,CAAC,SAAS,MAAM,IAAI,CAAC,QAAQ,OAAO;AAEvF,iBAAW,eAAe,eAAe;AACvC,mBAAW,gBAAgB,SAAS,QAAQ;AAC1C,gBAAM,eAAe,aAAa,OAAO,KAAK,CAAC,MAAM,EAAE,WAAW,WAAW;AAC7E,cAAI,gBAAgB,aAAa,WAAW,QAAQ;AAClD,mBAAO;AAAA,cACL,OAAO,aAAa;AAAA,cACpB,OAAO;AAAA,cACP,SAAS,aAAa;AAAA,YACxB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,WAAW,KAAK,GAAG;AACrB,cAAM;AAAA,MACR;AAEA,YAAM,IAAI;AAAA;AAAA,QAER,0CAA0C,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAChG;AAAA,UACE,OAAO,iBAAiB,QAAQ,QAAQ;AAAA,UACxC,SAAS,EAAE,QAAQ,OAAO,SAAS,EAAE;AAAA,QACvC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,YAAY,QAA6C;AAE7D,QAAI,CAAC,SAAQ,iBAAiB;AAC5B,YAAM,IAAI;AAAA;AAAA,QAER;AAAA,QACA,EAAE,WAAW,OAAO,WAAW,SAAS,OAAO,QAAQ;AAAA,MACzD;AAAA,IACF;AAGA,QAAI,CAAC,OAAO,aAAa,CAAC,OAAO,SAAS;AACxC,YAAM,IAAI,sCAAwC,2CAA2C;AAAA,QAC3F,WAAW,OAAO;AAAA,QAClB,SAAS,OAAO;AAAA,MAClB,CAAC;AAAA,IACH;AAEA,QAAI,OAAO,cAAc,OAAO,SAAS;AACvC,YAAM,IAAI,6CAA+C,mCAAmC;AAAA,QAC1F,WAAW,OAAO;AAAA,QAClB,SAAS,OAAO;AAAA,MAClB,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,OAAO,UAAU,OAAO,UAAU,IAAI;AACzC,YAAM,IAAI,sCAAwC,iCAAiC;AAAA,QACjF,WAAW,OAAO;AAAA,QAClB,SAAS,OAAO;AAAA,QAChB,SAAS,EAAE,QAAQ,OAAO,QAAQ,SAAS,EAAE;AAAA,MAC/C,CAAC;AAAA,IACH;AAGA,QAAI,CAAC,KAAK,UAAU,OAAO,WAAW,OAAO,OAAO,GAAG;AACrD,YAAM,IAAI;AAAA;AAAA,QAER,kBAAkB,OAAO,SAAS,SAAS,OAAO,OAAO;AAAA,QACzD,EAAE,WAAW,OAAO,WAAW,SAAS,OAAO,QAAQ;AAAA,MACzD;AAAA,IACF;AAEA,QAAI;AACF,YAAM,YAAY,OAAO,aAAc,MAAM,KAAK,WAAW,OAAO,OAAO;AAE3E,YAAM,SAAS,MAAM,KAAK,IAAI,gBAAgB,gBAAgB;AAAA,QAC5D,WAAW,OAAO;AAAA,QAClB,SAAS,OAAO;AAAA,QAChB,QAAQ,OAAO;AAAA,QACf;AAAA,MACF,CAAC;AAED,UAAI,CAAC,UAAU,CAAC,OAAO,QAAQ;AAC7B,cAAM,IAAI;AAAA;AAAA,UAER;AAAA,UACA,EAAE,WAAW,OAAO,WAAW,SAAS,OAAO,QAAQ;AAAA,QACzD;AAAA,MACF;AAEA,aAAO;AAAA,QACL,QAAQ,OAAO;AAAA,QACf,eAAe;AAAA;AAAA,MACjB;AAAA,IACF,SAAS,OAAO;AACd,UAAI,iBAAiB,aAAa;AAChC,cAAM;AAAA,MACR;AAEA,YAAM,IAAI;AAAA;AAAA,QAER,4BAA4B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAClF;AAAA,UACE,WAAW,OAAO;AAAA,UAClB,SAAS,OAAO;AAAA,UAChB,OAAO,iBAAiB,QAAQ,QAAQ;AAAA,UACxC,SAAS,EAAE,QAAQ,OAAO,OAAO,SAAS,EAAE;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAA2B;AACzB,WAAO,KAAK,oBAAoB,EAAE,OAAO,CAAC,UAAU,gBAAgB,KAAK,CAAC;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,sBAAgC;AAC9B,WAAO,KAAK,oBAAoB,EAAE,OAAO,CAAC,UAAU,iBAAiB,KAAK,CAAC;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,WAAmB,SAA0B;AACrD,WACE,cAAc,WACd,iBAAiB,SAAS,KAC1B,iBAAiB,OAAO,KACxB,KAAK,kBAAkB,IAAI,SAAS;AAAA,EAExC;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB,WAA6B;AACjD,QAAI,CAAC,iBAAiB,SAAS,GAAG;AAChC,aAAO,CAAC;AAAA,IACV;AACA,WAAO,oBAAoB,EAAE,OAAO,CAAC,UAAU,UAAU,SAAS;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,iBAA0B;AAC5B,WAAO,KAAK,cAAc;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAqC;AACnC,WAAO,KAAK,cAAc;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAmC;AACjC,WAAO,KAAK,cAAc,SAAS;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,yBAA+B;AAC7B,SAAK,cAAc,MAAM;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,qBAAqB,OAAuB;AAC1C,WAAO,KAAK,cAAc,gBAAgB,KAAK;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,uBAAuB,SAAyB;AAC9C,WAAO,KAAK,cAAc,kBAAkB,OAAO;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAgB;AACd,SAAK,cAAc,QAAQ;AAC3B,SAAK,aAAa,MAAM;AAAA,EAC1B;AACF;AAKA,SAAS,kBAAkB,QAAgB,UAA0B;AACnE,MAAI,WAAW,IAAI;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,MAAM,QAAQ;AACrC,QAAM,QAAQ,SAAS;AACvB,QAAM,WAAW,SAAS;AAE1B,MAAI,aAAa,IAAI;AACnB,WAAO,MAAM,SAAS;AAAA,EACxB;AAEA,QAAM,cAAc,SAAS,SAAS,EAAE,SAAS,UAAU,GAAG;AAE9D,QAAM,UAAU,YAAY,QAAQ,OAAO,EAAE;AAC7C,SAAO,GAAG,KAAK,IAAI,OAAO;AAC5B;;;ACp3BA,SAAS,aAAa,oBAAAC,mBAAkB,uBAAAC,4BAA8C;AAsB/E,IAAM,YAAN,MAAgB;AAAA,EACb,UAAoC,oBAAI,IAAI;AAAA;AAAA;AAAA;AAAA,EAK5C,mBAAmB,QAAiC;AAC1D,WAAO;AAAA,MACL,SAAS,OAAO;AAAA,MAChB,cAAc,OAAO,UAAU;AAG7B,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,MACA,eAAe,OAAO,UAAU;AAC9B,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,MACA,2BAA2B,OAAO,UAAU;AAC1C,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,OAAe,QAAgC;AACvD,UAAM,SAAS,KAAK,QAAQ,IAAI,KAAK;AACrC,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,KAAK,mBAAmB,MAAM;AACnD,UAAM,SAAS,IAAI,YAAY,cAAc,KAAK;AAClD,SAAK,QAAQ,IAAI,OAAO,MAAM;AAC9B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,iBAAiB,OAAwB;AAC9C,WAAOD,kBAAiB,KAAK;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,sBAAgC;AACrC,WAAOC,qBAAoB;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,yBAAyB,WAA6B;AAC3D,WAAOA,qBAAoB,EAAE,OAAO,CAAC,UAAU,UAAU,SAAS;AAAA,EACpE;AACF;AA8CO,SAAS,mBAAmB,QAAsB,OAA4B;AACnF,SAAO,IAAI,YAAY,QAAQ,KAAK;AACtC;;;ACMA;AAAA,EACE,oBAAAC;AAAA,EACA,uBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAAC;AAAA,OACK;;;AC7BA,IAAK,0BAAL,kBAAKC,6BAAL;AAEL,EAAAA,yBAAA,sBAAmB;AACnB,EAAAA,yBAAA,uBAAoB;AACpB,EAAAA,yBAAA,mBAAgB;AAChB,EAAAA,yBAAA,kBAAe;AACf,EAAAA,yBAAA,qBAAkB;AAGlB,EAAAA,yBAAA,mBAAgB;AAChB,EAAAA,yBAAA,oBAAiB;AACjB,EAAAA,yBAAA,kBAAe;AAGf,EAAAA,yBAAA,mBAAgB;AAChB,EAAAA,yBAAA,aAAU;AACV,EAAAA,yBAAA,mBAAgB;AAhBN,SAAAA;AAAA,GAAA;AAsBL,IAAM,sBAAN,cAAkC,MAAM;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EAET,YACE,MACA,SACA,YACA,OACA;AACA,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,QAAQ;AAAA,EACf;AACF;;;ACpIA,IAAM,0BAA0B;AAKzB,IAAM,eAAN,MAAmD;AAAA,EAC/C,aAAa;AAAA,EAEd,WAA2B;AAAA,EAC3B,aAAsB;AAAA,EACtB,OAAgB;AAAA,EAChB;AAAA,EACA,UAAwB;AAAA,EACxB;AAAA,EAER,YAAY,UAAyB,CAAC,GAAG;AACvC,SAAK,WAAW;AAAA,MACd,WAAW,QAAQ,aAAa;AAAA,MAChC,cAAc,QAAQ,gBAAgB;AAAA,MACtC,gBACE,QAAQ,kBAAkB,GAAG,uBAAuB,IAAI,QAAQ,gBAAgB,CAAC;AAAA,MACnF,SAAS,QAAQ,WAAW;AAAA,MAC5B,aAAa,QAAQ,eAAe;AAAA,MACpC,SAAS,QAAQ,WAAW;AAAA,IAC9B;AAEA,SAAK,cAAc;AAAA,MACjB,MAAM;AAAA,MACN,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAmB;AACrB,QAAI,CAAC,KAAK,UAAU;AAClB,YAAM,IAAI;AAAA;AAAA,QAER;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,aAAuC;AACzC,WAAO,EAAE,GAAG,KAAK,YAAY;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,cAAuB;AACzB,WAAO,KAAK,YAAY,WAAW,KAAK,eAAe;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,iBAAyB;AAC3B,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAyB;AAC7B,QAAI,KAAK,aAAa;AACpB;AAAA,IACF;AAEA,SAAK,UAAU;AACf,SAAK,YAAY,SAAS;AAE1B,QAAI;AAEF,YAAM,kBAAkB,MAAM,KAAK,oBAAoB;AACvD,YAAM,YAAY,MAAM,OAAO,sBAAsB;AAGrD,WAAK,aAAa,MAAM,gBAAgB,QAAQ,OAAO;AACvD,WAAK,UAAU;AACf,WAAK,YAAY,SAAS;AAG1B,WAAK,OAAO,IAAI,UAAU,QAAQ,KAAK,UAAmB;AAG1D,UAAI;AACF,cAAM,YAAY,MAChB,KAAK,KACL,oBAAoB;AACtB,aAAK,YAAY,kBAAkB,UAAU;AAAA,MAC/C,QAAQ;AAAA,MAER;AAGA,YAAM,SAAS,MACb,KAAK,KAGL,WAAW,KAAK,SAAS,gBAAgB,KAAK;AAEhD,WAAK,WAAW,OAAO;AACvB,WAAK,UAAU;AACf,WAAK,YAAY,SAAS;AAC1B,WAAK,YAAY,WAAW;AAAA,IAC9B,SAAS,OAAO;AACd,WAAK,UAAU;AACf,WAAK,YAAY,SAAS;AAC1B,WAAK,aAAa;AAClB,WAAK,OAAO;AAEZ,YAAM,KAAK,WAAW,KAAK;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA4B;AAChC,QAAI,KAAK,YAAY;AACnB,UAAI;AACF,cAAO,KAAK,WAA8C,MAAM;AAAA,MAClE,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,SAAK,aAAa;AAClB,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,YAAY,SAAS;AAC1B,SAAK,YAAY,WAAW;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAc,QAKO;AACzB,QAAI,CAAC,KAAK,eAAe,CAAC,KAAK,MAAM;AACnC,YAAM,IAAI;AAAA;AAAA,QAER;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AAEF,YAAM,SAAS,MACb,KAAK,KAWL,kBAAkB,KAAK,SAAS,gBAAgB;AAAA,QAChD,QAAQ,OAAO;AAAA,QACf,OAAO,OAAO;AAAA,QACd,aAAa,OAAO;AAAA,QACpB,SAAS,OAAO;AAAA,MAClB,CAAC;AAGD,YAAM,IAAI,OAAO,EAAE,SAAS,IAAI,GAAG;AACnC,YAAM,IAAI,OAAO,EAAE,SAAS,IAAI,GAAG;AACnC,YAAM,IAAI,OAAO,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAE/C,aAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AAAA,IACvB,SAAS,OAAO;AACd,YAAM,KAAK,WAAW,KAAK;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,SAAsD;AACtE,QAAI,CAAC,KAAK,eAAe,CAAC,KAAK,MAAM;AACnC,YAAM,IAAI;AAAA;AAAA,QAER;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AAEF,YAAM,aACJ,OAAO,YAAY,WACf,OAAO,KAAK,OAAO,EAAE,SAAS,KAAK,IACnC,OAAO,KAAK,OAAO,EAAE,SAAS,KAAK;AAEzC,YAAM,SAAS,MACb,KAAK,KAML,oBAAoB,KAAK,SAAS,gBAAgB,UAAU;AAG9D,YAAM,IAAI,OAAO,EAAE,SAAS,IAAI,GAAG;AACnC,YAAM,IAAI,OAAO,EAAE,SAAS,IAAI,GAAG;AACnC,YAAM,IAAI,OAAO,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAE/C,aAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AAAA,IACvB,SAAS,OAAO;AACd,YAAM,KAAK,WAAW,KAAK;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,QAAgB,GAAG,aAAqB,GAAuB;AAChF,QAAI,CAAC,KAAK,eAAe,CAAC,KAAK,MAAM;AACnC,YAAM,IAAI;AAAA;AAAA,QAER;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,YAAuB,CAAC;AAE9B,aAAS,IAAI,YAAY,IAAI,aAAa,OAAO,KAAK;AACpD,YAAM,OAAO,GAAG,uBAAuB,IAAI,CAAC;AAC5C,YAAM,SAAS,MACb,KAAK,KAGL,WAAW,MAAM,KAAK;AACxB,gBAAU,KAAK,OAAO,OAAkB;AAAA,IAC1C;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,sBAAgF;AAC5F,YAAQ,KAAK,SAAS,WAAW;AAAA,MAC/B,KAAK;AACH,eAAO,OAAO,+BAA+B;AAAA,MAC/C,KAAK;AACH,eAAO,OAAO,gCAAgC;AAAA,MAChD,KAAK;AAAA,MACL;AACE,eAAO,OAAO,+BAA+B;AAAA,IACjD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,OAAqC;AACtD,UAAM,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AACpE,UAAM,UAAU,IAAI,QAAQ,YAAY;AAGxC,QAAI,QAAQ,SAAS,QAAQ,KAAK,QAAQ,SAAS,UAAU,GAAG;AAC9D,aAAO,IAAI;AAAA;AAAA,QAET;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,QAAQ,GAAG;AAC9B,aAAO,IAAI;AAAA;AAAA,QAET;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,WAAW,KAAK,QAAQ,SAAS,WAAW,GAAG;AAClE,aAAO,IAAI;AAAA;AAAA,QAET;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,KAAK,KAAK,QAAQ,SAAS,UAAU,GAAG;AAC3D,aAAO,IAAI;AAAA;AAAA,QAET;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,SAAS,GAAG;AAC/B,aAAO,IAAI;AAAA;AAAA,QAET;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO,IAAI;AAAA;AAAA,MAET,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAKA,eAAsB,mBAAmB,SAAgD;AACvF,QAAM,SAAS,IAAI,aAAa,OAAO;AACvC,QAAM,OAAO,QAAQ;AACrB,SAAO;AACT;;;ACnVA,IAAMC,2BAA0B;AAKhC,IAAI,gBAAiE;AAK9D,IAAM,eAAN,MAAmD;AAAA,EAC/C,aAAa;AAAA,EAEd,WAA2B;AAAA,EAC3B;AAAA,EAGA,UAAwB;AAAA,EACxB;AAAA,EACA,eAAe;AAAA,EAEvB,YAAY,SAAwB;AAClC,QAAI,CAAC,QAAQ,UAAU;AACrB,YAAM,IAAI;AAAA;AAAA,QAER;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,SAAK,WAAW;AAAA,MACd,UAAU,QAAQ;AAAA,MAClB,WAAW,QAAQ,aAAa;AAAA,MAChC,cAAc,QAAQ,gBAAgB;AAAA,MACtC,gBACE,QAAQ,kBAAkB,GAAGA,wBAAuB,IAAI,QAAQ,gBAAgB,CAAC;AAAA,MACnF,SAAS,QAAQ,WAAW;AAAA,MAC5B,OAAO,QAAQ,SAAS;AAAA,MACxB,OAAO,QAAQ,SAAS;AAAA,IAC1B;AAEA,SAAK,cAAc;AAAA,MACjB,MAAM;AAAA,MACN,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAmB;AACrB,QAAI,CAAC,KAAK,UAAU;AAClB,YAAM,IAAI;AAAA;AAAA,QAER;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,aAAuC;AACzC,WAAO,EAAE,GAAG,KAAK,YAAY;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,cAAuB;AACzB,WAAO,KAAK,YAAY,WAAW,KAAK,aAAa;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,iBAAyB;AAC3B,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAoC;AAChD,QAAI,KAAK,gBAAgB,eAAe;AACtC;AAAA,IACF;AAEA,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,iBAAiB;AAC7C,sBAAgB,OAAO;AAEvB,YAAM,cAAc,KAAK;AAAA,QACvB,UAAU;AAAA,UACR,OAAO,KAAK,SAAS,SAAS;AAAA,UAC9B,QAAQ,KAAK,SAAS,SAAS;AAAA,UAC/B,SAAS;AAAA,QACX;AAAA,QACA,OAAO,KAAK,SAAS;AAAA,QACrB,OAAO,KAAK,SAAS;AAAA,MACvB,CAAC;AAED,WAAK,eAAe;AAAA,IACtB,SAAS,OAAO;AACd,YAAM,IAAI;AAAA;AAAA,QAER,wCAAwC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAC9F;AAAA,QACA,iBAAiB,QAAQ,QAAQ;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAyB;AAC7B,QAAI,KAAK,aAAa;AACpB;AAAA,IACF;AAEA,SAAK,UAAU;AACf,SAAK,YAAY,SAAS;AAE1B,QAAI;AACF,YAAM,KAAK,mBAAmB;AAE9B,UAAI,CAAC,eAAe;AAClB,cAAM,IAAI,MAAM,+BAA+B;AAAA,MACjD;AAGA,YAAM,iBAAiB,MAAM,cAAc,YAAY;AACvD,UAAI,eAAe,SAAS;AAC1B,cAAM,WAAW,eAAe;AAChC,aAAK,YAAY,QAAQ,SAAS;AAClC,aAAK,YAAY,kBAAkB,GAAG,SAAS,aAAa,IAAI,SAAS,aAAa,IAAI,SAAS,aAAa;AAAA,MAClH;AAGA,YAAM,SAAS,MAAM,cAAc,mBAAmB;AAAA,QACpD,MAAM,KAAK,SAAS;AAAA,QACpB,cAAc;AAAA,MAChB,CAAC;AAED,UAAI,CAAC,OAAO,SAAS;AACnB,cAAM,IAAI,MAAM,OAAO,QAAQ,SAAS,uBAAuB;AAAA,MACjE;AAEA,WAAK,WAAW,OAAO,QAAQ;AAC/B,WAAK,UAAU;AACf,WAAK,YAAY,SAAS;AAC1B,WAAK,YAAY,WAAW;AAAA,IAC9B,SAAS,OAAO;AACd,WAAK,UAAU;AACf,WAAK,YAAY,SAAS;AAC1B,WAAK,WAAW;AAEhB,YAAM,KAAK,WAAW,KAAK;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA4B;AAChC,QAAI,eAAe;AACjB,UAAI;AACF,sBAAc,QAAQ;AAAA,MACxB,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,YAAY,SAAS;AAC1B,SAAK,YAAY,WAAW;AAC5B,SAAK,eAAe;AACpB,oBAAgB;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,QAKO;AACzB,QAAI,CAAC,KAAK,aAAa;AACrB,YAAM,IAAI;AAAA;AAAA,QAER;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,KAAK,mBAAmB;AAE9B,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACjD;AAEA,QAAI;AAEF,YAAM,cAAc,KAAK,4BAA4B,OAAO,KAAK;AAGjE,UAAI,CAAC,YAAY,cAAc;AAC7B,oBAAY,eAAe;AAAA,UACzB,EAAE,MAAM,QAAQ,MAAM,SAAS;AAAA,UAC/B,EAAE,MAAM,WAAW,MAAM,SAAS;AAAA,UAClC,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,UACnC,EAAE,MAAM,qBAAqB,MAAM,UAAU;AAAA,QAC/C;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,cAAc,sBAAsB;AAAA,QACvD,MAAM,KAAK,SAAS;AAAA,QACpB,MAAM;AAAA,UACJ,QAAQ,OAAO;AAAA,UACf,OAAO;AAAA,UAGP,aAAa,OAAO;AAAA,UACpB,SAAS,OAAO;AAAA,QAClB;AAAA,QACA,oBAAoB;AAAA,MACtB,CAAC;AAED,UAAI,CAAC,OAAO,SAAS;AACnB,cAAM,IAAI,MAAM,OAAO,QAAQ,SAAS,2BAA2B;AAAA,MACrE;AAEA,aAAO,OAAO,QAAQ;AAAA,IACxB,SAAS,OAAO;AACd,YAAM,KAAK,WAAW,KAAK;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,SAAsD;AACtE,QAAI,CAAC,KAAK,aAAa;AACrB,YAAM,IAAI;AAAA;AAAA,QAER;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,KAAK,mBAAmB;AAE9B,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACjD;AAEA,QAAI;AAEF,YAAM,aACJ,OAAO,YAAY,WACf,KAAK,OAAO,KAAK,OAAO,EAAE,SAAS,KAAK,CAAC,KACzC,KAAK,OAAO,KAAK,OAAO,EAAE,SAAS,KAAK,CAAC;AAE/C,YAAM,SAAS,MAAM,cAAc,oBAAoB;AAAA,QACrD,MAAM,KAAK,SAAS;AAAA,QACpB,SAAS;AAAA,QACT,KAAK;AAAA,MACP,CAAC;AAED,UAAI,CAAC,OAAO,SAAS;AACnB,cAAM,IAAI,MAAM,OAAO,QAAQ,SAAS,wBAAwB;AAAA,MAClE;AAEA,aAAO,KAAK,OAAO,QAAQ,SAAS;AAAA,IACtC,SAAS,OAAO;AACd,YAAM,KAAK,WAAW,KAAK;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,QAAgB,GAAG,aAAqB,GAAuB;AAChF,QAAI,CAAC,KAAK,aAAa;AACrB,YAAM,IAAI;AAAA;AAAA,QAER;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,KAAK,mBAAmB;AAE9B,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACjD;AAEA,UAAM,YAAuB,CAAC;AAG9B,UAAM,SAAS,CAAC;AAChB,aAAS,IAAI,YAAY,IAAI,aAAa,OAAO,KAAK;AACpD,aAAO,KAAK;AAAA,QACV,MAAM,GAAGA,wBAAuB,IAAI,CAAC;AAAA,QACrC,cAAc;AAAA,MAChB,CAAC;AAAA,IACH;AAEA,UAAM,SAAS,MAAM,cAAc,mBAAmB,EAAE,OAAO,CAAC;AAEhE,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,KAAK,WAAW,IAAI,MAAM,OAAO,QAAQ,SAAS,yBAAyB,CAAC;AAAA,IACpF;AAEA,eAAW,QAAQ,OAAO,SAAS;AACjC,gBAAU,KAAK,KAAK,OAAkB;AAAA,IACxC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,4BACN,OACuD;AACvD,UAAM,SAAgE,CAAC;AAEvE,eAAW,CAAC,UAAU,MAAM,KAAK,OAAO,QAAQ,KAAK,GAAG;AACtD,UAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,eAAO,QAAQ,IAAI,OAAO,IAAI,CAAC,WAAW;AAAA,UACxC,MAAM,OAAO,MAAM,IAAI;AAAA,UACvB,MAAM,OAAO,MAAM,IAAI;AAAA,QACzB,EAAE;AAAA,MACJ;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,OAAqC;AACtD,UAAM,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AACpE,UAAM,UAAU,IAAI,QAAQ,YAAY;AAGxC,QACE,QAAQ,SAAS,WAAW,KAC5B,QAAQ,SAAS,UAAU,KAC3B,QAAQ,SAAS,QAAQ,GACzB;AACA,aAAO,IAAI;AAAA;AAAA,QAET;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,KAAK,GAAG;AAC3B,aAAO,IAAI;AAAA;AAAA,QAET;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,YAAY,GAAG;AAClC,aAAO,IAAI;AAAA;AAAA,QAET;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,QAAQ,KAAK,QAAQ,SAAS,WAAW,GAAG;AAC/D,aAAO,IAAI;AAAA;AAAA,QAET;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,SAAS,GAAG;AAC/B,aAAO,IAAI;AAAA;AAAA,QAET;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO,IAAI;AAAA;AAAA,MAET,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAKA,eAAsB,mBAAmB,SAA+C;AACtF,QAAM,SAAS,IAAI,aAAa,OAAO;AACvC,QAAM,OAAO,QAAQ;AACrB,SAAO;AACT;;;ACzYO,SAAS,8BAGd;AACA,QAAM,eAAe,OAAO,cAAc;AAE1C,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,QAAQ,gBAAgB,SAAS;AAAA,MACjC,QAAQ,gBAAgB,SAAS;AAAA,MACjC,WAAW,gBAAgB,eAAe;AAAA,IAC5C;AAAA,IACA,QAAQ,gBAAgB,SAAS;AAAA,EACnC;AACF;AAKO,SAAS,4BAAqC;AACnD,QAAM,UAAU,4BAA4B;AAC5C,SACE,QAAQ,OAAO,UAAU,QAAQ,OAAO,UAAU,QAAQ,OAAO,aAAa,QAAQ;AAE1F;","names":["WDKErrorCode","supportsBridging","getBridgeableChains","supportsBridging","getBridgeableChains","Usdt0Bridge","HardwareWalletErrorCode","DEFAULT_DERIVATION_PATH"]}
1
+ {"version":3,"sources":["../../src/cache.ts","../../src/chains.ts","../../src/errors.ts","../../src/signer.ts","../../src/t402wdk.ts","../../src/bridge.ts","../../src/index.ts","../../src/compatibility.ts","../../src/hardware/types.ts","../../src/hardware/ledger.ts","../../src/hardware/trezor.ts","../../src/hardware/index.ts"],"sourcesContent":["/**\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>(key: string, fetcher: () => Promise<T>): 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 optimism: {\n chainId: 10,\n network: 'eip155:10',\n name: 'optimism',\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 optimism: 'https://mainnet.optimism.io',\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: '0x9151434b16b9763660705744891fA906F660EcC5',\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') ?? tokens.find((t) => t.symbol === 'USDC') ?? 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 // Protocol errors (8xxx - swap, lending, etc.)\n PROTOCOL_NOT_REGISTERED = 8101,\n PROTOCOL_EXECUTION_FAILED = 8102,\n INVALID_PARAMETER = 8103,\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(WDKErrorCode.RPC_RATE_LIMITED, `Rate limited: ${error.message}`, {\n cause: error,\n 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(new RPCError(WDKErrorCode.RPC_TIMEOUT, `${operation} timed out after ${timeoutMs}ms`))\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 } 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(WDKErrorCode.WDK_NOT_INITIALIZED, 'WDK instance is required', { chain })\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(signPromise, this._timeoutMs, 'Signing typed data')\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(\n error,\n WDKErrorCode.SIGN_TYPED_DATA_FAILED,\n 'Failed to sign typed data',\n {\n chain: this._chain,\n primaryType: message.primaryType,\n },\n )\n\n throw new SigningError(wrapped.code as WDKErrorCode, wrapped.message, {\n operation: 'signTypedData',\n cause: wrapped.cause,\n context: wrapped.context,\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(WDKErrorCode.INVALID_MESSAGE, 'Message is required for signing', {\n operation: 'signMessage',\n 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 =\n typeof message === 'string' ? message : Buffer.from(message).toString('utf-8')\n\n const signPromise = account.signMessage(messageStr)\n const signature = await withTimeout(signPromise, this._timeoutMs, 'Signing message')\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(wrapped.code as WDKErrorCode, wrapped.message, {\n operation: 'signMessage',\n cause: wrapped.cause,\n context: wrapped.context,\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(async () => {\n const balancePromise = account.getBalance()\n return withTimeout(balancePromise, this._timeoutMs, 'Fetching native balance')\n }, DEFAULT_BALANCE_RETRY)\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(async () => {\n const balancePromise = account.getTokenBalance(tokenAddress)\n return withTimeout(balancePromise, this._timeoutMs, 'Fetching token balance')\n }, DEFAULT_BALANCE_RETRY)\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 if (!account.estimateGas) {\n throw new TransactionError(\n WDKErrorCode.GAS_ESTIMATION_FAILED,\n `Gas estimation is not supported by this WDK account on ${this._chain}`,\n { chain: this._chain, context: { to: params.to } },\n )\n }\n\n return await withRetry(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 }, DEFAULT_BALANCE_RETRY)\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(wrapped.code as WDKErrorCode, wrapped.message, {\n chain: this._chain,\n cause: wrapped.cause,\n context: wrapped.context,\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\n constructor(address: Address, _privateKey: `0x${string}`) {\n this.address = address\n // Note: privateKey available for future signing implementation\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 ChainFamily,\n WDKWalletModules,\n WDKProtocolModules,\n WDKModulesConfig,\n WDKTonAccount,\n WDKSolanaAccount,\n WDKTronAccount,\n T402WDKCreateConfig,\n SignerEntry,\n GetAllSignersOptions,\n FromWDKOptions,\n SwapQuote,\n SwapResult,\n SwapParams,\n} from './types.js'\nimport {\n WDKTonSignerAdapter,\n createWDKTonSigner,\n type ClientTonSigner,\n} from './adapters/ton-adapter.js'\nimport {\n WDKSvmSignerAdapter,\n createWDKSvmSigner,\n type TransactionSigner as ClientSvmSigner,\n} from './adapters/svm-adapter.js'\nimport {\n WDKTronSignerAdapter,\n createWDKTronSigner,\n type ClientTronSigner,\n} from './adapters/tron-adapter.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 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 _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 // Multi-chain wallet module storage\n private static _WalletModules: WDKWalletModules = {}\n private static _ProtocolModules: WDKProtocolModules = {}\n\n // Multi-chain signer caches\n private _tonSignerCache: Map<number, WDKTonSignerAdapter> = new Map()\n private _svmSignerCache: Map<number, WDKSvmSignerAdapter> = new Map()\n private _tronSignerCache: Map<number, WDKTronSignerAdapter> = new Map()\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 * Supports two registration patterns:\n *\n * 1. Legacy (EVM-only):\n * ```typescript\n * T402WDK.registerWDK(WDK, WalletManagerEvm, BridgeUsdt0Evm);\n * ```\n *\n * 2. Unified (multi-chain):\n * ```typescript\n * T402WDK.registerWDK(WDK, {\n * wallets: {\n * evm: WalletManagerEvm,\n * ton: WalletManagerTon,\n * solana: WalletManagerSolana,\n * tron: WalletManagerTron,\n * },\n * protocols: {\n * bridgeUsdt0Evm: BridgeUsdt0Evm,\n * bridgeUsdt0Ton: BridgeUsdt0Ton,\n * }\n * });\n * ```\n *\n * @throws {WDKInitializationError} If registration fails\n */\n static registerWDK(\n WDK: WDKConstructor,\n modulesOrWalletManager?: WDKModulesConfig | 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\n // Check if using new unified registration pattern\n if (\n modulesOrWalletManager &&\n typeof modulesOrWalletManager === 'object' &&\n ('wallets' in modulesOrWalletManager || 'protocols' in modulesOrWalletManager)\n ) {\n const modules = modulesOrWalletManager as WDKModulesConfig\n T402WDK._WalletModules = modules.wallets ?? {}\n T402WDK._ProtocolModules = modules.protocols ?? {}\n // Backward compatibility: set legacy fields\n T402WDK._WalletManagerEvm = modules.wallets?.evm ?? null\n T402WDK._BridgeUsdt0Evm = modules.protocols?.bridgeUsdt0Evm ?? null\n } else {\n // Legacy registration pattern\n T402WDK._WalletManagerEvm = modulesOrWalletManager ?? null\n T402WDK._BridgeUsdt0Evm = BridgeUsdt0Evm ?? null\n T402WDK._WalletModules = { evm: modulesOrWalletManager as unknown }\n T402WDK._ProtocolModules = { bridgeUsdt0Evm: BridgeUsdt0Evm as unknown }\n }\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 * Check if TON wallet manager is registered\n */\n static isTonRegistered(): boolean {\n return T402WDK._WalletModules.ton !== undefined\n }\n\n /**\n * Check if Solana wallet manager is registered\n */\n static isSolanaRegistered(): boolean {\n return T402WDK._WalletModules.solana !== undefined\n }\n\n /**\n * Check if TRON wallet manager is registered\n */\n static isTronRegistered(): boolean {\n return T402WDK._WalletModules.tron !== undefined\n }\n\n /**\n * Get all registered wallet modules\n */\n static getRegisteredWalletModules(): (keyof WDKWalletModules)[] {\n return Object.keys(T402WDK._WalletModules).filter(\n (key) => T402WDK._WalletModules[key as keyof WDKWalletModules] !== undefined,\n ) as (keyof WDKWalletModules)[]\n }\n\n /**\n * Get all registered protocol modules\n */\n static getRegisteredProtocolModules(): (keyof WDKProtocolModules)[] {\n return Object.keys(T402WDK._ProtocolModules).filter(\n (key) => T402WDK._ProtocolModules[key as keyof WDKProtocolModules] !== undefined,\n ) as (keyof WDKProtocolModules)[]\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 * Quick setup: seed phrase + chains + modules → ready-to-use T402WDK.\n *\n * Registers all provided wallet/protocol modules and creates a fully\n * configured instance in a single call.\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 * const wallet = T402WDK.create({\n * seedPhrase: 'your twelve word seed phrase ...',\n * chains: {\n * arbitrum: 'https://arb1.arbitrum.io/rpc',\n * base: 'https://mainnet.base.org',\n * },\n * modules: {\n * wallets: { evm: WalletManagerEvm },\n * protocols: { bridgeUsdt0Evm: BridgeUsdt0Evm },\n * },\n * });\n * ```\n */\n static create(WDK: WDKConstructor, config: T402WDKCreateConfig): T402WDK {\n // Register modules\n T402WDK.registerWDK(WDK, config.modules)\n\n // Create and return configured instance\n return new T402WDK(config.seedPhrase, config.chains, config.options)\n }\n\n /**\n * Create a T402WDK from a pre-configured @tetherto/wdk instance.\n *\n * Wraps an existing WDK instance (already has wallets/protocols registered)\n * into a T402WDK without re-registering modules.\n *\n * @param wdkInstance - A pre-configured WDK instance\n * @param config - EVM chain configuration (RPC endpoints)\n * @param options - Additional options\n */\n static fromWDK(\n wdkInstance: WDKInstance,\n config: T402WDKConfig = {},\n options?: FromWDKOptions & T402WDKOptions,\n ): T402WDK {\n if (!wdkInstance) {\n throw new WDKInitializationError('WDK instance is required')\n }\n\n // Create a T402WDK that uses the provided instance directly\n // We use a dummy seed phrase since the WDK is already initialized\n const instance = new T402WDK('__from_wdk__', config, options)\n\n // Override the internal WDK with the provided instance\n instance._wdk = wdkInstance\n instance._initializationError = null\n\n return instance\n }\n\n /**\n * Get all signers as an array ready for T402 HTTP clients.\n *\n * Returns signer entries for all configured EVM chains, plus any\n * registered non-EVM chains (TON, Solana, TRON).\n *\n * @example\n * ```typescript\n * const signers = await wallet.getAllSigners();\n * const client = createT402HTTPClient({ signers });\n * ```\n */\n async getAllSigners(options?: GetAllSignersOptions): Promise<SignerEntry[]> {\n const accountIndex = options?.accountIndex ?? 0\n const schemes = options?.schemes ?? ['exact']\n const includeNonEvm = options?.includeNonEvm ?? true\n const entries: SignerEntry[] = []\n\n // Collect EVM signers for all configured chains\n for (const chain of this.getConfiguredChains()) {\n const config = this._normalizedChains.get(chain)\n if (!config) continue\n\n try {\n const signer = await this.getSigner(chain, accountIndex)\n for (const scheme of schemes) {\n entries.push({\n scheme,\n network: config.network,\n signer,\n family: 'evm',\n })\n }\n } catch {\n // Skip chains that fail to create signers\n }\n }\n\n if (!includeNonEvm) {\n return entries\n }\n\n // TON signer\n if (T402WDK.isTonRegistered()) {\n try {\n const signer = await this.getTonSigner(accountIndex)\n for (const scheme of schemes) {\n entries.push({ scheme, network: 'ton:mainnet', signer, family: 'ton' })\n }\n } catch {\n // Skip if TON signer fails\n }\n }\n\n // Solana signer\n if (T402WDK.isSolanaRegistered()) {\n try {\n const signer = await this.getSvmSigner(accountIndex)\n for (const scheme of schemes) {\n entries.push({\n scheme,\n network: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n signer,\n family: 'svm',\n })\n }\n } catch {\n // Skip if Solana signer fails\n }\n }\n\n // TRON signer\n if (T402WDK.isTronRegistered()) {\n try {\n const signer = await this.getTronSigner(accountIndex)\n for (const scheme of schemes) {\n entries.push({ scheme, network: 'tron:mainnet', signer, family: 'tron' })\n }\n } catch {\n // Skip if TRON signer fails\n }\n }\n\n return entries\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 (skip for fromWDK internal usage)\n const isFromWDK = seedPhrase === '__from_wdk__'\n\n if (!isFromWDK) {\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\n this._seedPhrase = seedPhrase\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 (skip for fromWDK — it sets _wdk directly)\n if (!isFromWDK && 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('arbitrum', normalizeChainConfig('arbitrum', defaultEndpoint))\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 this._tonSignerCache.clear()\n this._svmSignerCache.clear()\n this._tronSignerCache.clear()\n }\n\n // ========== Multi-Chain Signers ==========\n\n /**\n * Get a TON signer for T402 payments\n *\n * @param accountIndex - HD wallet account index (default: 0)\n * @throws {ChainError} If TON wallet manager is not registered\n * @returns An initialized ClientTonSigner\n *\n * @example\n * ```typescript\n * const tonSigner = await wallet.getTonSigner();\n *\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'ton:mainnet', signer: tonSigner }]\n * });\n * ```\n */\n async getTonSigner(accountIndex = 0): Promise<ClientTonSigner> {\n // Check cache first\n const cached = this._tonSignerCache.get(accountIndex)\n if (cached) {\n return cached\n }\n\n // Validate TON wallet manager is registered\n if (!T402WDK._WalletModules.ton) {\n throw new ChainError(\n WDKErrorCode.CHAIN_NOT_SUPPORTED,\n 'TON wallet manager not registered. Call T402WDK.registerWDK(WDK, { wallets: { ton: WalletManagerTon } }).',\n { chain: 'ton' },\n )\n }\n\n try {\n // Get TON account from WDK\n const account = (await this.wdk.getAccount('ton', accountIndex)) as unknown as WDKTonAccount\n\n // Create and cache the signer adapter\n const signer = await createWDKTonSigner(account)\n this._tonSignerCache.set(accountIndex, signer)\n return signer\n } catch (error) {\n if (isWDKError(error)) {\n throw error\n }\n\n throw wrapError(error, WDKErrorCode.SIGNER_NOT_INITIALIZED, 'Failed to create TON signer', {\n chain: 'ton',\n accountIndex,\n })\n }\n }\n\n /**\n * Get a Solana (SVM) signer for T402 payments\n *\n * @param accountIndex - HD wallet account index (default: 0)\n * @throws {ChainError} If Solana wallet manager is not registered\n * @returns An initialized TransactionSigner (ClientSvmSigner)\n *\n * @example\n * ```typescript\n * const svmSigner = await wallet.getSvmSigner();\n *\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'solana:mainnet', signer: svmSigner }]\n * });\n * ```\n */\n async getSvmSigner(accountIndex = 0): Promise<ClientSvmSigner> {\n // Check cache first\n const cached = this._svmSignerCache.get(accountIndex)\n if (cached) {\n return cached\n }\n\n // Validate Solana wallet manager is registered\n if (!T402WDK._WalletModules.solana) {\n throw new ChainError(\n WDKErrorCode.CHAIN_NOT_SUPPORTED,\n 'Solana wallet manager not registered. Call T402WDK.registerWDK(WDK, { wallets: { solana: WalletManagerSolana } }).',\n { chain: 'solana' },\n )\n }\n\n try {\n // Get Solana account from WDK\n const account = (await this.wdk.getAccount(\n 'solana',\n accountIndex,\n )) as unknown as WDKSolanaAccount\n\n // Create and cache the signer adapter\n const signer = await createWDKSvmSigner(account)\n this._svmSignerCache.set(accountIndex, signer)\n return signer\n } catch (error) {\n if (isWDKError(error)) {\n throw error\n }\n\n throw wrapError(\n error,\n WDKErrorCode.SIGNER_NOT_INITIALIZED,\n 'Failed to create Solana signer',\n { chain: 'solana', accountIndex },\n )\n }\n }\n\n /**\n * Get a TRON signer for T402 payments\n *\n * @param accountIndex - HD wallet account index (default: 0)\n * @param rpcUrl - Optional custom RPC URL (default: https://api.trongrid.io)\n * @throws {ChainError} If TRON wallet manager is not registered\n * @returns An initialized ClientTronSigner\n *\n * @example\n * ```typescript\n * const tronSigner = await wallet.getTronSigner();\n *\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'tron:mainnet', signer: tronSigner }]\n * });\n * ```\n */\n async getTronSigner(accountIndex = 0, rpcUrl?: string): Promise<ClientTronSigner> {\n // Check cache first (only if no custom RPC)\n if (!rpcUrl) {\n const cached = this._tronSignerCache.get(accountIndex)\n if (cached) {\n return cached\n }\n }\n\n // Validate TRON wallet manager is registered\n if (!T402WDK._WalletModules.tron) {\n throw new ChainError(\n WDKErrorCode.CHAIN_NOT_SUPPORTED,\n 'TRON wallet manager not registered. Call T402WDK.registerWDK(WDK, { wallets: { tron: WalletManagerTron } }).',\n { chain: 'tron' },\n )\n }\n\n try {\n // Get TRON account from WDK\n const account = (await this.wdk.getAccount('tron', accountIndex)) as unknown as WDKTronAccount\n\n // Create the signer adapter\n const signer = await createWDKTronSigner(account, rpcUrl)\n\n // Cache only if using default RPC\n if (!rpcUrl) {\n this._tronSignerCache.set(accountIndex, signer)\n }\n\n return signer\n } catch (error) {\n if (isWDKError(error)) {\n throw error\n }\n\n throw wrapError(error, WDKErrorCode.SIGNER_NOT_INITIALIZED, 'Failed to create TRON signer', {\n chain: 'tron',\n accountIndex,\n })\n }\n }\n\n /**\n * Get a signer for a specific chain family\n *\n * @param family - Chain family (evm, svm, ton, tron)\n * @param chainOrIndex - Chain name for EVM, or account index for others\n * @param accountIndex - Account index (only used for EVM)\n * @throws {ChainError} If chain family is not supported or not configured\n * @returns An appropriate signer for the chain family\n *\n * @example\n * ```typescript\n * // Get EVM signer for Arbitrum\n * const evmSigner = await wallet.getSignerByFamily('evm', 'arbitrum');\n *\n * // Get TON signer\n * const tonSigner = await wallet.getSignerByFamily('ton');\n *\n * // Get Solana signer with account index 1\n * const svmSigner = await wallet.getSignerByFamily('svm', 1);\n * ```\n */\n async getSignerByFamily(\n family: ChainFamily,\n chainOrIndex?: string | number,\n accountIndex = 0,\n ): Promise<WDKSigner | ClientTonSigner | ClientSvmSigner | ClientTronSigner> {\n switch (family) {\n case 'evm':\n if (typeof chainOrIndex !== 'string') {\n throw new ChainError(\n WDKErrorCode.INVALID_CHAIN_CONFIG,\n 'EVM signers require a chain name (e.g., \"arbitrum\", \"ethereum\")',\n { chain: family },\n )\n }\n return this.getSigner(chainOrIndex, accountIndex)\n\n case 'ton':\n return this.getTonSigner(typeof chainOrIndex === 'number' ? chainOrIndex : accountIndex)\n\n case 'svm':\n return this.getSvmSigner(typeof chainOrIndex === 'number' ? chainOrIndex : accountIndex)\n\n case 'tron':\n return this.getTronSigner(typeof chainOrIndex === 'number' ? chainOrIndex : accountIndex)\n\n default:\n throw new ChainError(\n WDKErrorCode.CHAIN_NOT_SUPPORTED,\n `Chain family \"${family}\" is not supported. Available: evm, ton, svm, tron`,\n { chain: family },\n )\n }\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(WDKErrorCode.CHAIN_NOT_CONFIGURED, `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(chain, address, async () =>\n 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 {\n cause: error instanceof Error ? error : undefined,\n context: { amount: amount.toString() },\n },\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(WDKErrorCode.BRIDGE_FAILED, 'Both fromChain and toChain are required', {\n fromChain: params.fromChain,\n toChain: params.toChain,\n })\n }\n\n if (params.fromChain === params.toChain) {\n throw new BridgeError(WDKErrorCode.BRIDGE_NOT_SUPPORTED, 'Cannot bridge to the same chain', {\n fromChain: params.fromChain,\n toChain: params.toChain,\n })\n }\n\n if (!params.amount || params.amount <= 0n) {\n throw new BridgeError(WDKErrorCode.BRIDGE_FAILED, 'Amount must be greater than 0', {\n fromChain: params.fromChain,\n toChain: params.toChain,\n 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 // ========== Swap Protocol ==========\n\n /**\n * Check if the Velora swap protocol is registered and available\n */\n canSwap(): boolean {\n return T402WDK._ProtocolModules.swapVeloraEvm !== undefined\n }\n\n /**\n * Get a swap quote for converting a token to USDT0\n *\n * @param chain - Chain name (e.g., \"ethereum\", \"arbitrum\")\n * @param fromToken - Input token address\n * @param amount - Amount to swap in smallest units\n * @throws {WDKError} If swap protocol is not registered or quote fails\n */\n async getSwapQuote(chain: string, fromToken: string, amount: bigint): Promise<SwapQuote> {\n if (!this.canSwap()) {\n throw new WDKError(\n WDKErrorCode.PROTOCOL_NOT_REGISTERED,\n 'Velora swap protocol not registered. Call T402WDK.registerWDK(WDK, { protocols: { swapVeloraEvm: SwapVeloraEvm } }).',\n )\n }\n\n const usdt0Address = USDT0_ADDRESSES[chain]\n if (!usdt0Address) {\n throw new ChainError(\n WDKErrorCode.CHAIN_NOT_SUPPORTED,\n `Chain \"${chain}\" does not have a known USDT0 address`,\n { chain },\n )\n }\n\n try {\n const result = await this.wdk.executeProtocol('swap-velora', {\n action: 'quote',\n chain,\n fromToken,\n toToken: usdt0Address,\n amount: amount.toString(),\n })\n return result as unknown as SwapQuote\n } catch (error) {\n throw wrapError(\n error,\n WDKErrorCode.PROTOCOL_EXECUTION_FAILED,\n `Failed to get swap quote on ${chain}`,\n { chain, fromToken, amount: amount.toString() },\n )\n }\n }\n\n /**\n * Swap any token to USDT0 for payment\n *\n * Uses the Velora protocol to execute a token swap on the specified chain.\n *\n * @param params - Swap parameters\n * @throws {WDKError} If swap protocol is not registered or swap fails\n *\n * @example\n * ```typescript\n * // Swap 0.1 WETH to USDT0 on Arbitrum\n * const result = await wallet.swapAndPay({\n * chain: 'arbitrum',\n * fromToken: '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1', // WETH\n * amount: 100000000000000000n, // 0.1 WETH\n * maxSlippage: 0.005,\n * });\n * ```\n */\n async swapAndPay(params: SwapParams): Promise<SwapResult> {\n if (!this.canSwap()) {\n throw new WDKError(\n WDKErrorCode.PROTOCOL_NOT_REGISTERED,\n 'Velora swap protocol not registered. Call T402WDK.registerWDK(WDK, { protocols: { swapVeloraEvm: SwapVeloraEvm } }).',\n )\n }\n\n const usdt0Address = USDT0_ADDRESSES[params.chain]\n if (!usdt0Address) {\n throw new ChainError(\n WDKErrorCode.CHAIN_NOT_SUPPORTED,\n `Chain \"${params.chain}\" does not have a known USDT0 address`,\n { chain: params.chain },\n )\n }\n\n if (params.maxSlippage !== undefined && (params.maxSlippage < 0 || params.maxSlippage > 0.5)) {\n throw new WDKError(\n WDKErrorCode.INVALID_PARAMETER,\n 'maxSlippage must be between 0 and 0.5 (0% to 50%)',\n )\n }\n\n try {\n const result = await this.wdk.executeProtocol('swap-velora', {\n action: 'swap',\n chain: params.chain,\n fromToken: params.fromToken,\n toToken: usdt0Address,\n amount: params.amount.toString(),\n maxSlippage: params.maxSlippage ?? 0.005,\n })\n\n // Invalidate balance cache for this chain after swap\n this._balanceCache.invalidateChain(params.chain)\n\n return result as unknown as SwapResult\n } catch (error) {\n throw wrapError(\n error,\n WDKErrorCode.PROTOCOL_EXECUTION_FAILED,\n `Failed to execute swap on ${params.chain}`,\n {\n chain: params.chain,\n fromToken: params.fromToken,\n amount: params.amount.toString(),\n },\n )\n }\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 this._tonSignerCache.clear()\n this._svmSignerCache.clear()\n this._tronSignerCache.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 { WDKSigner } from './signer.js'\nimport type { BridgeResult } from './types.js'\nimport { Usdt0Bridge, supportsBridging, getBridgeableChains, type BridgeSigner } 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 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","/**\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 (EVM, TON, Solana, TRON)\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 EVM 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 Multi-Chain Registration\n * ```typescript\n * import WDK from '@tetherto/wdk';\n * import WalletManagerEvm from '@tetherto/wdk-wallet-evm';\n * import WalletManagerTon from '@tetherto/wdk-wallet-ton';\n * import WalletManagerSolana from '@tetherto/wdk-wallet-solana';\n * import WalletManagerTron from '@tetherto/wdk-wallet-tron';\n * import { T402WDK } from '@t402/wdk';\n *\n * // Register all chain wallet modules at once\n * T402WDK.registerWDK(WDK, {\n * wallets: {\n * evm: WalletManagerEvm,\n * ton: WalletManagerTon,\n * solana: WalletManagerSolana,\n * tron: WalletManagerTron,\n * },\n * protocols: {\n * bridgeUsdt0Evm: BridgeUsdt0Evm,\n * }\n * });\n *\n * const wallet = new T402WDK(seedPhrase, { arbitrum: 'https://arb1.arbitrum.io/rpc' });\n *\n * // Get signers for different chains\n * const evmSigner = await wallet.getSigner('arbitrum'); // EVM\n * const tonSigner = await wallet.getTonSigner(); // TON\n * const svmSigner = await wallet.getSvmSigner(); // Solana\n * const tronSigner = await wallet.getTronSigner(); // TRON\n *\n * // Use with multi-chain T402 client\n * const client = createT402HTTPClient({\n * signers: [\n * { scheme: 'exact', network: 'eip155:42161', signer: evmSigner },\n * { scheme: 'exact', network: 'ton:mainnet', signer: tonSigner },\n * { scheme: 'exact', network: 'solana:mainnet', signer: svmSigner },\n * { scheme: 'exact', network: 'tron:mainnet', signer: tronSigner },\n * ]\n * });\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 WdkAccount,\n WDKInstance,\n WDKConstructor,\n // Multi-chain types\n ChainFamily,\n SvmChainConfig,\n TonChainConfig,\n TronChainConfig,\n MultiChainConfig,\n WDKWalletModules,\n WDKProtocolModules,\n WDKModulesConfig,\n WDKTonAccount,\n WDKSolanaAccount,\n WDKTronAccount,\n WDKInstanceMultiChain,\n // Factory method types\n T402WDKCreateConfig,\n SignerEntry,\n GetAllSignersOptions,\n FromWDKOptions,\n // Swap types\n SwapQuote,\n SwapResult,\n SwapParams,\n} from './types.js'\n\n// Multi-chain adapters\nexport {\n WDKTonSignerAdapter,\n createWDKTonSigner,\n type ClientTonSigner,\n type SignMessageParams as TonSignMessageParams,\n} from './adapters/ton-adapter.js'\nexport {\n WDKSvmSignerAdapter,\n createWDKSvmSigner,\n type TransactionSigner as ClientSvmSigner,\n type SolanaAddress,\n} from './adapters/svm-adapter.js'\nexport {\n WDKTronSignerAdapter,\n createWDKTronSigner,\n type ClientTronSigner,\n type SignTransactionParams as TronSignTransactionParams,\n type BlockInfo as TronBlockInfo,\n} from './adapters/tron-adapter.js'\n\n// Cache\nexport {\n TTLCache,\n BalanceCache,\n DEFAULT_CACHE_CONFIG,\n DEFAULT_BALANCE_CACHE_CONFIG,\n} from './cache.js'\nexport type { CacheConfig, CacheStats, BalanceCacheConfig, BalanceCacheStats } 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// WDK version compatibility\nexport {\n WDK_COMPATIBILITY,\n checkWdkCompatibility,\n checkWalletEvmCompatibility,\n getWalletModuleMinVersion,\n} from './compatibility.js'\nexport type { CompatibilityResult } from './compatibility.js'\n\n// Hardware wallet support\nexport {\n // Types\n type HardwareWalletType,\n type DeviceStatus,\n type HardwareWalletConnectionOptions,\n type HardwareWalletDeviceInfo,\n type HardwareWalletSigner,\n type LedgerOptions,\n type TrezorOptions,\n HardwareWalletErrorCode,\n HardwareWalletError,\n // Ledger\n LedgerSigner,\n createLedgerSigner,\n // Trezor\n TrezorSigner,\n createTrezorSigner,\n // Utilities\n detectHardwareWalletSupport,\n isHardwareWalletSupported,\n} from './hardware/index.js'\n","/**\n * Tether WDK Version Compatibility Tracking\n *\n * Tracks compatibility between @t402/wdk and @tetherto/wdk versions.\n */\n\n/**\n * WDK compatibility information\n */\nexport const WDK_COMPATIBILITY = {\n /** Minimum supported @tetherto/wdk version */\n minVersion: '1.0.0-beta.0',\n /** Versions that have been tested */\n testedVersions: ['1.0.0-beta.3', '1.0.0-beta.4', '1.0.0-beta.5'],\n /** Tested wallet-evm module versions */\n walletEvmVersions: ['1.0.0-beta.5', '2.0.0-rc.1'],\n /** Feature availability by @tetherto/wdk core version */\n features: {\n signTypedData: '1.0.0-beta.0',\n estimateGas: '1.0.0-beta.3',\n multiChainWallets: '1.0.0-beta.0',\n bridgeProtocol: '1.0.0-beta.3',\n swapProtocol: '1.0.0-beta.4',\n },\n /** Known wallet module minimum versions */\n walletModuleVersions: {\n evm: '1.0.0-beta.5',\n ton: '1.0.0-beta.7',\n btc: '1.0.0-beta.5',\n tron: '1.0.0-beta.4',\n solana: '1.0.0-beta.5',\n spark: '1.0.0-beta.6',\n },\n} as const\n\n/**\n * Result of a WDK compatibility check\n */\nexport interface CompatibilityResult {\n /** Whether the version is compatible */\n compatible: boolean\n /** Warning messages for potential issues */\n warnings: string[]\n}\n\n/**\n * Parse a semver version string into comparable parts.\n * Supports pre-release tags like -beta.0\n */\nfunction parseVersion(version: string): {\n major: number\n minor: number\n patch: number\n prerelease: string\n} {\n const match = version.match(/^(\\d+)\\.(\\d+)\\.(\\d+)(?:-(.+))?$/)\n if (!match) {\n return { major: 0, minor: 0, patch: 0, prerelease: '' }\n }\n\n return {\n major: parseInt(match[1]!, 10),\n minor: parseInt(match[2]!, 10),\n patch: parseInt(match[3]!, 10),\n prerelease: match[4] ?? '',\n }\n}\n\n/**\n * Compare two semver versions.\n * Returns -1 if a < b, 0 if a == b, 1 if a > b.\n */\nfunction compareVersions(a: string, b: string): number {\n const va = parseVersion(a)\n const vb = parseVersion(b)\n\n if (va.major !== vb.major) return va.major < vb.major ? -1 : 1\n if (va.minor !== vb.minor) return va.minor < vb.minor ? -1 : 1\n if (va.patch !== vb.patch) return va.patch < vb.patch ? -1 : 1\n\n // Pre-release versions have lower precedence than release\n if (va.prerelease && !vb.prerelease) return -1\n if (!va.prerelease && vb.prerelease) return 1\n if (va.prerelease && vb.prerelease) {\n return va.prerelease < vb.prerelease ? -1 : va.prerelease > vb.prerelease ? 1 : 0\n }\n\n return 0\n}\n\n/**\n * Check if a @tetherto/wdk version is compatible with @t402/wdk.\n *\n * @param version - The @tetherto/wdk version to check\n * @returns Compatibility result with warnings\n *\n * @example\n * ```typescript\n * import { checkWdkCompatibility } from '@t402/wdk';\n *\n * const result = checkWdkCompatibility('1.0.0-beta.4');\n * if (!result.compatible) {\n * console.error('Incompatible WDK version');\n * }\n * result.warnings.forEach(w => console.warn(w));\n * ```\n */\nexport function checkWdkCompatibility(version: string): CompatibilityResult {\n const warnings: string[] = []\n\n // Check minimum version\n if (compareVersions(version, WDK_COMPATIBILITY.minVersion) < 0) {\n return {\n compatible: false,\n warnings: [\n `@tetherto/wdk ${version} is below minimum supported version ${WDK_COMPATIBILITY.minVersion}`,\n ],\n }\n }\n\n // Check if version has been tested\n const isTested = (WDK_COMPATIBILITY.testedVersions as readonly string[]).includes(version)\n if (!isTested) {\n warnings.push(\n `@tetherto/wdk ${version} has not been explicitly tested. ` +\n `Tested versions: ${WDK_COMPATIBILITY.testedVersions.join(', ')}`,\n )\n }\n\n // Check feature-specific compatibility\n for (const [feature, minFeatureVersion] of Object.entries(WDK_COMPATIBILITY.features)) {\n if (compareVersions(version, minFeatureVersion) < 0) {\n warnings.push(`Feature '${feature}' requires @tetherto/wdk >= ${minFeatureVersion}`)\n }\n }\n\n return { compatible: true, warnings }\n}\n\n/**\n * Check if a @tetherto/wdk-wallet-evm version is compatible.\n *\n * @param version - The wallet-evm module version to check\n * @returns Compatibility result with warnings\n */\nexport function checkWalletEvmCompatibility(version: string): CompatibilityResult {\n const warnings: string[] = []\n\n const isTested = (WDK_COMPATIBILITY.walletEvmVersions as readonly string[]).includes(version)\n if (!isTested) {\n warnings.push(\n `@tetherto/wdk-wallet-evm ${version} has not been explicitly tested. ` +\n `Tested versions: ${WDK_COMPATIBILITY.walletEvmVersions.join(', ')}`,\n )\n }\n\n return { compatible: true, warnings }\n}\n\n/**\n * Get the minimum required version for a specific wallet module.\n *\n * @param module - Wallet module name (e.g., \"evm\", \"ton\", \"solana\")\n * @returns The minimum version string, or undefined if unknown\n */\nexport function getWalletModuleMinVersion(\n module: keyof typeof WDK_COMPATIBILITY.walletModuleVersions,\n): string | undefined {\n return WDK_COMPATIBILITY.walletModuleVersions[module]\n}\n","/**\n * Hardware wallet type definitions for T402 WDK\n */\n\nimport type { Address } from 'viem'\n\n/**\n * Supported hardware wallet types\n */\nexport type HardwareWalletType = 'ledger' | 'trezor'\n\n/**\n * Hardware wallet device status\n */\nexport type DeviceStatus =\n | 'disconnected'\n | 'connecting'\n | 'connected'\n | 'locked'\n | 'unlocked'\n | 'app_closed'\n | 'ready'\n\n/**\n * Hardware wallet connection options\n */\nexport interface HardwareWalletConnectionOptions {\n /** Transport type for Ledger (default: \"webusb\") */\n transport?: 'webusb' | 'webhid' | 'bluetooth'\n /** Account index for HD derivation (default: 0) */\n accountIndex?: number\n /** Custom derivation path (default: m/44'/60'/0'/0/{accountIndex}) */\n derivationPath?: string\n /** Timeout for connection in milliseconds (default: 30000) */\n timeout?: number\n}\n\n/**\n * Hardware wallet device info\n */\nexport interface HardwareWalletDeviceInfo {\n /** Wallet type */\n type: HardwareWalletType\n /** Device model (e.g., \"Nano S\", \"Nano X\", \"Model T\") */\n model?: string\n /** Firmware version */\n firmwareVersion?: string\n /** Whether the device is locked */\n isLocked: boolean\n /** Current device status */\n status: DeviceStatus\n}\n\n/**\n * Hardware wallet signer interface\n */\nexport interface HardwareWalletSigner {\n /** Get wallet address */\n readonly address: Address\n /** Wallet type */\n readonly walletType: HardwareWalletType\n /** Device info */\n readonly deviceInfo: HardwareWalletDeviceInfo\n /** Whether the signer is connected */\n readonly isConnected: boolean\n\n /**\n * Connect to the hardware wallet\n */\n connect(): Promise<void>\n\n /**\n * Disconnect from the hardware wallet\n */\n disconnect(): Promise<void>\n\n /**\n * Sign EIP-712 typed data\n */\n signTypedData(params: {\n domain: Record<string, unknown>\n types: Record<string, unknown>\n primaryType: string\n message: Record<string, unknown>\n }): Promise<`0x${string}`>\n\n /**\n * Sign a personal message\n */\n signMessage(message: string | Uint8Array): Promise<`0x${string}`>\n\n /**\n * Get all available addresses (for account selection)\n * @param count Number of addresses to retrieve\n * @param startIndex Starting index\n */\n getAddresses?(count: number, startIndex?: number): Promise<Address[]>\n}\n\n/**\n * Ledger-specific options\n */\nexport interface LedgerOptions extends HardwareWalletConnectionOptions {\n /** Whether to scramble key for privacy (default: true) */\n scrambleKey?: boolean\n /** App name on the Ledger (default: \"Ethereum\") */\n appName?: string\n}\n\n/**\n * Trezor-specific options\n */\nexport interface TrezorOptions extends HardwareWalletConnectionOptions {\n /** Manifest for Trezor Connect (required) */\n manifest: {\n email: string\n appUrl: string\n }\n /** Whether to use popup for interactions (default: true) */\n popup?: boolean\n /** Debug mode */\n debug?: boolean\n}\n\n/**\n * Error codes for hardware wallet operations\n */\nexport enum HardwareWalletErrorCode {\n // Connection errors\n DEVICE_NOT_FOUND = 'DEVICE_NOT_FOUND',\n CONNECTION_FAILED = 'CONNECTION_FAILED',\n DEVICE_LOCKED = 'DEVICE_LOCKED',\n APP_NOT_OPEN = 'APP_NOT_OPEN',\n TRANSPORT_ERROR = 'TRANSPORT_ERROR',\n\n // Signing errors\n USER_REJECTED = 'USER_REJECTED',\n SIGNING_FAILED = 'SIGNING_FAILED',\n INVALID_DATA = 'INVALID_DATA',\n\n // General errors\n NOT_SUPPORTED = 'NOT_SUPPORTED',\n TIMEOUT = 'TIMEOUT',\n UNKNOWN_ERROR = 'UNKNOWN_ERROR',\n}\n\n/**\n * Hardware wallet error\n */\nexport class HardwareWalletError extends Error {\n readonly code: HardwareWalletErrorCode\n readonly walletType: HardwareWalletType\n readonly cause?: Error\n\n constructor(\n code: HardwareWalletErrorCode,\n message: string,\n walletType: HardwareWalletType,\n cause?: Error,\n ) {\n super(message)\n this.name = 'HardwareWalletError'\n this.code = code\n this.walletType = walletType\n this.cause = cause\n }\n}\n","/**\n * Ledger Hardware Wallet Signer for T402 WDK\n *\n * Provides T402-compatible signing using Ledger hardware wallets.\n * Supports Nano S, Nano S Plus, Nano X, and Stax devices.\n *\n * @example\n * ```typescript\n * import { LedgerSigner } from '@t402/wdk';\n *\n * const ledger = new LedgerSigner({ accountIndex: 0 });\n * await ledger.connect();\n *\n * // Get address\n * console.log('Address:', ledger.address);\n *\n * // Sign typed data for T402 payment\n * const signature = await ledger.signTypedData(typedData);\n * ```\n */\n\nimport type { Address } from 'viem'\nimport {\n type HardwareWalletSigner,\n type HardwareWalletDeviceInfo,\n type LedgerOptions,\n type DeviceStatus,\n HardwareWalletError,\n HardwareWalletErrorCode,\n} from './types.js'\n\n/**\n * Default derivation path for Ethereum\n */\nconst DEFAULT_DERIVATION_PATH = \"m/44'/60'/0'/0\"\n\n/**\n * Ledger hardware wallet signer\n */\nexport class LedgerSigner implements HardwareWalletSigner {\n readonly walletType = 'ledger' as const\n\n private _address: Address | null = null\n private _transport: unknown = null\n private _eth: unknown = null\n private _options: Required<LedgerOptions>\n private _status: DeviceStatus = 'disconnected'\n private _deviceInfo: HardwareWalletDeviceInfo\n\n constructor(options: LedgerOptions = {}) {\n this._options = {\n transport: options.transport ?? 'webusb',\n accountIndex: options.accountIndex ?? 0,\n derivationPath:\n options.derivationPath ?? `${DEFAULT_DERIVATION_PATH}/${options.accountIndex ?? 0}`,\n timeout: options.timeout ?? 30000,\n scrambleKey: options.scrambleKey ?? true,\n appName: options.appName ?? 'Ethereum',\n }\n\n this._deviceInfo = {\n type: 'ledger',\n isLocked: true,\n status: 'disconnected',\n }\n }\n\n /**\n * Get the wallet address\n */\n get address(): Address {\n if (!this._address) {\n throw new HardwareWalletError(\n HardwareWalletErrorCode.CONNECTION_FAILED,\n 'Ledger not connected. Call connect() first.',\n 'ledger',\n )\n }\n return this._address\n }\n\n /**\n * Get device info\n */\n get deviceInfo(): HardwareWalletDeviceInfo {\n return { ...this._deviceInfo }\n }\n\n /**\n * Check if connected\n */\n get isConnected(): boolean {\n return this._status === 'ready' && this._transport !== null\n }\n\n /**\n * Get the derivation path\n */\n get derivationPath(): string {\n return this._options.derivationPath\n }\n\n /**\n * Connect to the Ledger device\n */\n async connect(): Promise<void> {\n if (this.isConnected) {\n return\n }\n\n this._status = 'connecting'\n this._deviceInfo.status = 'connecting'\n\n try {\n // Dynamic import to avoid bundling issues\n const TransportModule = await this._getTransportModule()\n const EthModule = await import('@ledgerhq/hw-app-eth')\n\n // Create transport\n this._transport = await TransportModule.default.create()\n this._status = 'connected'\n this._deviceInfo.status = 'connected'\n\n // Create Ethereum app instance\n this._eth = new EthModule.default(this._transport as never)\n\n // Get device info\n try {\n const appConfig = await (\n this._eth as { getAppConfiguration: () => Promise<{ version: string }> }\n ).getAppConfiguration()\n this._deviceInfo.firmwareVersion = appConfig.version\n } catch {\n // App config not available, continue\n }\n\n // Get address\n const result = await (\n this._eth as {\n getAddress: (path: string, display?: boolean) => Promise<{ address: string }>\n }\n ).getAddress(this._options.derivationPath, false)\n\n this._address = result.address as Address\n this._status = 'ready'\n this._deviceInfo.status = 'ready'\n this._deviceInfo.isLocked = false\n } catch (error) {\n this._status = 'disconnected'\n this._deviceInfo.status = 'disconnected'\n this._transport = null\n this._eth = null\n\n throw this._wrapError(error)\n }\n }\n\n /**\n * Disconnect from the Ledger device\n */\n async disconnect(): Promise<void> {\n if (this._transport) {\n try {\n await (this._transport as { close: () => Promise<void> }).close()\n } catch {\n // Ignore close errors\n }\n }\n\n this._transport = null\n this._eth = null\n this._address = null\n this._status = 'disconnected'\n this._deviceInfo.status = 'disconnected'\n this._deviceInfo.isLocked = true\n }\n\n /**\n * Sign EIP-712 typed data\n *\n * Note: Requires Ethereum app version 1.6.0+ for EIP-712 support\n */\n async signTypedData(params: {\n domain: Record<string, unknown>\n types: Record<string, unknown>\n primaryType: string\n message: Record<string, unknown>\n }): Promise<`0x${string}`> {\n if (!this.isConnected || !this._eth) {\n throw new HardwareWalletError(\n HardwareWalletErrorCode.CONNECTION_FAILED,\n 'Ledger not connected',\n 'ledger',\n )\n }\n\n try {\n // Ledger uses signEIP712Message for typed data\n const result = await (\n this._eth as {\n signEIP712Message: (\n path: string,\n message: {\n domain: Record<string, unknown>\n types: Record<string, unknown>\n primaryType: string\n message: Record<string, unknown>\n },\n ) => Promise<{ v: number; r: string; s: string }>\n }\n ).signEIP712Message(this._options.derivationPath, {\n domain: params.domain,\n types: params.types,\n primaryType: params.primaryType,\n message: params.message,\n })\n\n // Construct signature from r, s, v\n const r = result.r.padStart(64, '0')\n const s = result.s.padStart(64, '0')\n const v = result.v.toString(16).padStart(2, '0')\n\n return `0x${r}${s}${v}` as `0x${string}`\n } catch (error) {\n throw this._wrapError(error)\n }\n }\n\n /**\n * Sign a personal message\n */\n async signMessage(message: string | Uint8Array): Promise<`0x${string}`> {\n if (!this.isConnected || !this._eth) {\n throw new HardwareWalletError(\n HardwareWalletErrorCode.CONNECTION_FAILED,\n 'Ledger not connected',\n 'ledger',\n )\n }\n\n try {\n // Convert message to hex if needed\n const messageHex =\n typeof message === 'string'\n ? Buffer.from(message).toString('hex')\n : Buffer.from(message).toString('hex')\n\n const result = await (\n this._eth as {\n signPersonalMessage: (\n path: string,\n messageHex: string,\n ) => Promise<{ v: number; r: string; s: string }>\n }\n ).signPersonalMessage(this._options.derivationPath, messageHex)\n\n // Construct signature from r, s, v\n const r = result.r.padStart(64, '0')\n const s = result.s.padStart(64, '0')\n const v = result.v.toString(16).padStart(2, '0')\n\n return `0x${r}${s}${v}` as `0x${string}`\n } catch (error) {\n throw this._wrapError(error)\n }\n }\n\n /**\n * Get multiple addresses for account selection\n */\n async getAddresses(count: number = 5, startIndex: number = 0): Promise<Address[]> {\n if (!this.isConnected || !this._eth) {\n throw new HardwareWalletError(\n HardwareWalletErrorCode.CONNECTION_FAILED,\n 'Ledger not connected',\n 'ledger',\n )\n }\n\n const addresses: Address[] = []\n\n for (let i = startIndex; i < startIndex + count; i++) {\n const path = `${DEFAULT_DERIVATION_PATH}/${i}`\n const result = await (\n this._eth as {\n getAddress: (path: string, display?: boolean) => Promise<{ address: string }>\n }\n ).getAddress(path, false)\n addresses.push(result.address as Address)\n }\n\n return addresses\n }\n\n /**\n * Get the appropriate transport module based on options\n */\n private async _getTransportModule(): Promise<{ default: { create: () => Promise<unknown> } }> {\n switch (this._options.transport) {\n case 'webhid':\n return import('@ledgerhq/hw-transport-webhid')\n case 'bluetooth':\n return import('@ledgerhq/hw-transport-web-ble')\n case 'webusb':\n default:\n return import('@ledgerhq/hw-transport-webusb')\n }\n }\n\n /**\n * Wrap errors in HardwareWalletError\n */\n private _wrapError(error: unknown): HardwareWalletError {\n const err = error instanceof Error ? error : new Error(String(error))\n const message = err.message.toLowerCase()\n\n // Map common Ledger errors\n if (message.includes('denied') || message.includes('rejected')) {\n return new HardwareWalletError(\n HardwareWalletErrorCode.USER_REJECTED,\n 'User rejected the action on the Ledger device',\n 'ledger',\n err,\n )\n }\n\n if (message.includes('locked')) {\n return new HardwareWalletError(\n HardwareWalletErrorCode.DEVICE_LOCKED,\n 'Ledger device is locked. Please unlock it.',\n 'ledger',\n err,\n )\n }\n\n if (message.includes('no device') || message.includes('not found')) {\n return new HardwareWalletError(\n HardwareWalletErrorCode.DEVICE_NOT_FOUND,\n 'Ledger device not found. Please connect your device.',\n 'ledger',\n err,\n )\n }\n\n if (message.includes('app') || message.includes('ethereum')) {\n return new HardwareWalletError(\n HardwareWalletErrorCode.APP_NOT_OPEN,\n 'Please open the Ethereum app on your Ledger device.',\n 'ledger',\n err,\n )\n }\n\n if (message.includes('timeout')) {\n return new HardwareWalletError(\n HardwareWalletErrorCode.TIMEOUT,\n 'Connection timed out',\n 'ledger',\n err,\n )\n }\n\n return new HardwareWalletError(\n HardwareWalletErrorCode.UNKNOWN_ERROR,\n err.message,\n 'ledger',\n err,\n )\n }\n}\n\n/**\n * Create a Ledger signer and connect\n */\nexport async function createLedgerSigner(options?: LedgerOptions): Promise<LedgerSigner> {\n const signer = new LedgerSigner(options)\n await signer.connect()\n return signer\n}\n","/**\n * Trezor Hardware Wallet Signer for T402 WDK\n *\n * Provides T402-compatible signing using Trezor hardware wallets.\n * Supports Trezor One, Model T, and Safe 3 devices.\n *\n * @example\n * ```typescript\n * import { TrezorSigner } from '@t402/wdk';\n *\n * const trezor = new TrezorSigner({\n * manifest: {\n * email: 'developer@example.com',\n * appUrl: 'https://example.com'\n * }\n * });\n * await trezor.connect();\n *\n * // Get address\n * console.log('Address:', trezor.address);\n *\n * // Sign typed data for T402 payment\n * const signature = await trezor.signTypedData(typedData);\n * ```\n */\n\nimport type { Address } from 'viem'\nimport {\n type HardwareWalletSigner,\n type HardwareWalletDeviceInfo,\n type TrezorOptions,\n type DeviceStatus,\n HardwareWalletError,\n HardwareWalletErrorCode,\n} from './types.js'\n\n/**\n * Default derivation path for Ethereum\n */\nconst DEFAULT_DERIVATION_PATH = \"m/44'/60'/0'/0\"\n\n/**\n * Trezor Connect instance (dynamically imported)\n */\nlet TrezorConnect: typeof import('@trezor/connect').default | null = null\n\n/**\n * Trezor hardware wallet signer\n */\nexport class TrezorSigner implements HardwareWalletSigner {\n readonly walletType = 'trezor' as const\n\n private _address: Address | null = null\n private _options: Required<Omit<TrezorOptions, 'manifest'>> & {\n manifest: TrezorOptions['manifest']\n }\n private _status: DeviceStatus = 'disconnected'\n private _deviceInfo: HardwareWalletDeviceInfo\n private _initialized = false\n\n constructor(options: TrezorOptions) {\n if (!options.manifest) {\n throw new HardwareWalletError(\n HardwareWalletErrorCode.INVALID_DATA,\n 'Trezor manifest is required (email and appUrl)',\n 'trezor',\n )\n }\n\n this._options = {\n manifest: options.manifest,\n transport: options.transport ?? 'webusb',\n accountIndex: options.accountIndex ?? 0,\n derivationPath:\n options.derivationPath ?? `${DEFAULT_DERIVATION_PATH}/${options.accountIndex ?? 0}`,\n timeout: options.timeout ?? 30000,\n popup: options.popup ?? true,\n debug: options.debug ?? false,\n }\n\n this._deviceInfo = {\n type: 'trezor',\n isLocked: true,\n status: 'disconnected',\n }\n }\n\n /**\n * Get the wallet address\n */\n get address(): Address {\n if (!this._address) {\n throw new HardwareWalletError(\n HardwareWalletErrorCode.CONNECTION_FAILED,\n 'Trezor not connected. Call connect() first.',\n 'trezor',\n )\n }\n return this._address\n }\n\n /**\n * Get device info\n */\n get deviceInfo(): HardwareWalletDeviceInfo {\n return { ...this._deviceInfo }\n }\n\n /**\n * Check if connected\n */\n get isConnected(): boolean {\n return this._status === 'ready' && this._address !== null\n }\n\n /**\n * Get the derivation path\n */\n get derivationPath(): string {\n return this._options.derivationPath\n }\n\n /**\n * Initialize Trezor Connect\n */\n private async _initTrezorConnect(): Promise<void> {\n if (this._initialized && TrezorConnect) {\n return\n }\n\n try {\n const module = await import('@trezor/connect')\n TrezorConnect = module.default\n\n await TrezorConnect.init({\n manifest: {\n email: this._options.manifest.email,\n appUrl: this._options.manifest.appUrl,\n appName: 'T402 WDK',\n },\n popup: this._options.popup,\n debug: this._options.debug,\n })\n\n this._initialized = true\n } catch (error) {\n throw new HardwareWalletError(\n HardwareWalletErrorCode.CONNECTION_FAILED,\n `Failed to initialize Trezor Connect: ${error instanceof Error ? error.message : String(error)}`,\n 'trezor',\n error instanceof Error ? error : undefined,\n )\n }\n }\n\n /**\n * Connect to the Trezor device\n */\n async connect(): Promise<void> {\n if (this.isConnected) {\n return\n }\n\n this._status = 'connecting'\n this._deviceInfo.status = 'connecting'\n\n try {\n await this._initTrezorConnect()\n\n if (!TrezorConnect) {\n throw new Error('TrezorConnect not initialized')\n }\n\n // Get device features\n const featuresResult = await TrezorConnect.getFeatures()\n if (featuresResult.success) {\n const features = featuresResult.payload\n this._deviceInfo.model = features.model\n this._deviceInfo.firmwareVersion = `${features.major_version}.${features.minor_version}.${features.patch_version}`\n }\n\n // Get address\n const result = await TrezorConnect.ethereumGetAddress({\n path: this._options.derivationPath,\n showOnTrezor: false,\n })\n\n if (!result.success) {\n throw new Error(result.payload.error || 'Failed to get address')\n }\n\n this._address = result.payload.address as Address\n this._status = 'ready'\n this._deviceInfo.status = 'ready'\n this._deviceInfo.isLocked = false\n } catch (error) {\n this._status = 'disconnected'\n this._deviceInfo.status = 'disconnected'\n this._address = null\n\n throw this._wrapError(error)\n }\n }\n\n /**\n * Disconnect from the Trezor device\n */\n async disconnect(): Promise<void> {\n if (TrezorConnect) {\n try {\n TrezorConnect.dispose()\n } catch {\n // Ignore dispose errors\n }\n }\n\n this._address = null\n this._status = 'disconnected'\n this._deviceInfo.status = 'disconnected'\n this._deviceInfo.isLocked = true\n this._initialized = false\n TrezorConnect = null\n }\n\n /**\n * Sign EIP-712 typed data\n */\n async signTypedData(params: {\n domain: Record<string, unknown>\n types: Record<string, unknown>\n primaryType: string\n message: Record<string, unknown>\n }): Promise<`0x${string}`> {\n if (!this.isConnected) {\n throw new HardwareWalletError(\n HardwareWalletErrorCode.CONNECTION_FAILED,\n 'Trezor not connected',\n 'trezor',\n )\n }\n\n await this._initTrezorConnect()\n\n if (!TrezorConnect) {\n throw new Error('TrezorConnect not initialized')\n }\n\n try {\n // Convert types to Trezor format\n const trezorTypes = this._convertTypesToTrezorFormat(params.types)\n\n // Ensure EIP712Domain is present (required by Trezor)\n if (!trezorTypes.EIP712Domain) {\n trezorTypes.EIP712Domain = [\n { name: 'name', type: 'string' },\n { name: 'version', type: 'string' },\n { name: 'chainId', type: 'uint256' },\n { name: 'verifyingContract', type: 'address' },\n ]\n }\n\n const result = await TrezorConnect.ethereumSignTypedData({\n path: this._options.derivationPath,\n data: {\n domain: params.domain as Record<string, string | number | boolean>,\n types: trezorTypes as Parameters<\n typeof TrezorConnect.ethereumSignTypedData\n >[0]['data']['types'],\n primaryType: params.primaryType,\n message: params.message as Record<string, string | number | boolean>,\n },\n metamask_v4_compat: true,\n })\n\n if (!result.success) {\n throw new Error(result.payload.error || 'Failed to sign typed data')\n }\n\n return result.payload.signature as `0x${string}`\n } catch (error) {\n throw this._wrapError(error)\n }\n }\n\n /**\n * Sign a personal message\n */\n async signMessage(message: string | Uint8Array): Promise<`0x${string}`> {\n if (!this.isConnected) {\n throw new HardwareWalletError(\n HardwareWalletErrorCode.CONNECTION_FAILED,\n 'Trezor not connected',\n 'trezor',\n )\n }\n\n await this._initTrezorConnect()\n\n if (!TrezorConnect) {\n throw new Error('TrezorConnect not initialized')\n }\n\n try {\n // Convert message to hex\n const messageHex =\n typeof message === 'string'\n ? `0x${Buffer.from(message).toString('hex')}`\n : `0x${Buffer.from(message).toString('hex')}`\n\n const result = await TrezorConnect.ethereumSignMessage({\n path: this._options.derivationPath,\n message: messageHex,\n hex: true,\n })\n\n if (!result.success) {\n throw new Error(result.payload.error || 'Failed to sign message')\n }\n\n return `0x${result.payload.signature}` as `0x${string}`\n } catch (error) {\n throw this._wrapError(error)\n }\n }\n\n /**\n * Get multiple addresses for account selection\n */\n async getAddresses(count: number = 5, startIndex: number = 0): Promise<Address[]> {\n if (!this.isConnected) {\n throw new HardwareWalletError(\n HardwareWalletErrorCode.CONNECTION_FAILED,\n 'Trezor not connected',\n 'trezor',\n )\n }\n\n await this._initTrezorConnect()\n\n if (!TrezorConnect) {\n throw new Error('TrezorConnect not initialized')\n }\n\n const addresses: Address[] = []\n\n // Get addresses in batch\n const bundle = []\n for (let i = startIndex; i < startIndex + count; i++) {\n bundle.push({\n path: `${DEFAULT_DERIVATION_PATH}/${i}`,\n showOnTrezor: false,\n })\n }\n\n const result = await TrezorConnect.ethereumGetAddress({ bundle })\n\n if (!result.success) {\n throw this._wrapError(new Error(result.payload.error || 'Failed to get addresses'))\n }\n\n for (const item of result.payload) {\n addresses.push(item.address as Address)\n }\n\n return addresses\n }\n\n /**\n * Convert EIP-712 types to Trezor format\n */\n private _convertTypesToTrezorFormat(\n types: Record<string, unknown>,\n ): Record<string, Array<{ name: string; type: string }>> {\n const result: Record<string, Array<{ name: string; type: string }>> = {}\n\n for (const [typeName, fields] of Object.entries(types)) {\n if (Array.isArray(fields)) {\n result[typeName] = fields.map((field) => ({\n name: String(field.name),\n type: String(field.type),\n }))\n }\n }\n\n return result\n }\n\n /**\n * Wrap errors in HardwareWalletError\n */\n private _wrapError(error: unknown): HardwareWalletError {\n const err = error instanceof Error ? error : new Error(String(error))\n const message = err.message.toLowerCase()\n\n // Map common Trezor errors\n if (\n message.includes('cancelled') ||\n message.includes('rejected') ||\n message.includes('denied')\n ) {\n return new HardwareWalletError(\n HardwareWalletErrorCode.USER_REJECTED,\n 'User cancelled the action on the Trezor device',\n 'trezor',\n err,\n )\n }\n\n if (message.includes('pin')) {\n return new HardwareWalletError(\n HardwareWalletErrorCode.DEVICE_LOCKED,\n 'Trezor device requires PIN entry',\n 'trezor',\n err,\n )\n }\n\n if (message.includes('passphrase')) {\n return new HardwareWalletError(\n HardwareWalletErrorCode.DEVICE_LOCKED,\n 'Trezor device requires passphrase entry',\n 'trezor',\n err,\n )\n }\n\n if (message.includes('device') && message.includes('not found')) {\n return new HardwareWalletError(\n HardwareWalletErrorCode.DEVICE_NOT_FOUND,\n 'Trezor device not found. Please connect your device.',\n 'trezor',\n err,\n )\n }\n\n if (message.includes('timeout')) {\n return new HardwareWalletError(\n HardwareWalletErrorCode.TIMEOUT,\n 'Connection timed out',\n 'trezor',\n err,\n )\n }\n\n return new HardwareWalletError(\n HardwareWalletErrorCode.UNKNOWN_ERROR,\n err.message,\n 'trezor',\n err,\n )\n }\n}\n\n/**\n * Create a Trezor signer and connect\n */\nexport async function createTrezorSigner(options: TrezorOptions): Promise<TrezorSigner> {\n const signer = new TrezorSigner(options)\n await signer.connect()\n return signer\n}\n","/**\n * Hardware Wallet Support for T402 WDK\n *\n * This module provides hardware wallet integration for T402 payments,\n * supporting Ledger and Trezor devices.\n *\n * @example Ledger\n * ```typescript\n * import { LedgerSigner, createLedgerSigner } from '@t402/wdk';\n *\n * // Create and connect\n * const ledger = await createLedgerSigner({ accountIndex: 0 });\n * console.log('Address:', ledger.address);\n *\n * // Sign T402 payment\n * const signature = await ledger.signTypedData(paymentData);\n *\n * // Disconnect when done\n * await ledger.disconnect();\n * ```\n *\n * @example Trezor\n * ```typescript\n * import { TrezorSigner, createTrezorSigner } from '@t402/wdk';\n *\n * // Create and connect (manifest required)\n * const trezor = await createTrezorSigner({\n * manifest: {\n * email: 'developer@example.com',\n * appUrl: 'https://example.com'\n * }\n * });\n * console.log('Address:', trezor.address);\n *\n * // Sign T402 payment\n * const signature = await trezor.signTypedData(paymentData);\n *\n * // Disconnect when done\n * await trezor.disconnect();\n * ```\n */\n\n// Types\nexport {\n type HardwareWalletType,\n type DeviceStatus,\n type HardwareWalletConnectionOptions,\n type HardwareWalletDeviceInfo,\n type HardwareWalletSigner,\n type LedgerOptions,\n type TrezorOptions,\n HardwareWalletErrorCode,\n HardwareWalletError,\n} from './types.js'\n\n// Ledger\nexport { LedgerSigner, createLedgerSigner } from './ledger.js'\n\n// Trezor\nexport { TrezorSigner, createTrezorSigner } from './trezor.js'\n\n/**\n * Detect available hardware wallets\n *\n * Note: This function checks for WebUSB/WebHID support and\n * doesn't actually probe for devices.\n */\nexport function detectHardwareWalletSupport(): {\n ledger: { webusb: boolean; webhid: boolean; bluetooth: boolean }\n trezor: boolean\n} {\n const hasNavigator = typeof navigator !== 'undefined'\n\n return {\n ledger: {\n webusb: hasNavigator && 'usb' in navigator,\n webhid: hasNavigator && 'hid' in navigator,\n bluetooth: hasNavigator && 'bluetooth' in navigator,\n },\n trezor: hasNavigator && 'usb' in navigator,\n }\n}\n\n/**\n * Check if hardware wallet signing is supported in the current environment\n */\nexport function isHardwareWalletSupported(): boolean {\n const support = detectHardwareWalletSupport()\n return (\n support.ledger.webusb || support.ledger.webhid || support.ledger.bluetooth || support.trezor\n )\n}\n"],"mappings":"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","names":["WDKErrorCode","supportsBridging","getBridgeableChains","supportsBridging","getBridgeableChains","Usdt0Bridge","HardwareWalletErrorCode","DEFAULT_DERIVATION_PATH"]}