@t402/wdk 2.4.0 → 2.6.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.
- package/dist/cjs/adapters/index.d.ts +198 -1
- package/dist/cjs/adapters/index.js +255 -0
- package/dist/cjs/adapters/index.js.map +1 -1
- package/dist/cjs/adapters/svm-adapter.d.ts +146 -2
- package/dist/cjs/adapters/svm-adapter.js +255 -2
- package/dist/cjs/adapters/svm-adapter.js.map +1 -1
- package/dist/cjs/adapters/ton-adapter.d.ts +57 -2
- package/dist/cjs/adapters/ton-adapter.js +75 -2
- package/dist/cjs/adapters/ton-adapter.js.map +1 -1
- package/dist/cjs/adapters/tron-adapter.d.ts +57 -2
- package/dist/cjs/adapters/tron-adapter.js +101 -0
- package/dist/cjs/adapters/tron-adapter.js.map +1 -1
- package/dist/cjs/index-DnEI5M6d.d.ts +1798 -0
- package/dist/cjs/index.d.ts +702 -1118
- package/dist/cjs/index.js +3905 -246
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/integrations/index.d.ts +9 -0
- package/dist/cjs/integrations/index.js +249 -0
- package/dist/cjs/integrations/index.js.map +1 -0
- package/dist/cjs/testing/index.d.ts +62 -0
- package/dist/cjs/testing/index.js +129 -0
- package/dist/cjs/testing/index.js.map +1 -0
- package/dist/cjs/types-BwK8Xgvg.d.ts +967 -0
- package/dist/esm/adapters/index.d.mts +198 -1
- package/dist/esm/adapters/index.mjs +14 -3
- package/dist/esm/adapters/svm-adapter.d.mts +146 -2
- package/dist/esm/adapters/svm-adapter.mjs +18 -3
- package/dist/esm/adapters/ton-adapter.d.mts +57 -2
- package/dist/esm/adapters/ton-adapter.mjs +8 -3
- package/dist/esm/adapters/tron-adapter.d.mts +57 -2
- package/dist/esm/adapters/tron-adapter.mjs +2 -1
- package/dist/esm/chunk-2KWVW77U.mjs +353 -0
- package/dist/esm/chunk-2KWVW77U.mjs.map +1 -0
- package/dist/esm/chunk-7CG77QAN.mjs +153 -0
- package/dist/esm/chunk-7CG77QAN.mjs.map +1 -0
- package/dist/esm/chunk-BJTO5JO5.mjs +11 -0
- package/dist/esm/chunk-BJTO5JO5.mjs.map +1 -0
- package/dist/esm/{chunk-YWBJJV5M.mjs → chunk-KWX6CJIH.mjs} +72 -1
- package/dist/esm/chunk-KWX6CJIH.mjs.map +1 -0
- package/dist/esm/{chunk-HB2DGKQ3.mjs → chunk-QZKUU2O6.mjs} +102 -1
- package/dist/esm/chunk-QZKUU2O6.mjs.map +1 -0
- package/dist/esm/chunk-TVSNUSFZ.mjs +219 -0
- package/dist/esm/chunk-TVSNUSFZ.mjs.map +1 -0
- package/dist/esm/index-D5kvtDfm.d.mts +1798 -0
- package/dist/esm/index.d.mts +702 -1118
- package/dist/esm/index.mjs +2934 -70
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/integrations/index.d.mts +9 -0
- package/dist/esm/integrations/index.mjs +16 -0
- package/dist/esm/integrations/index.mjs.map +1 -0
- package/dist/esm/testing/index.d.mts +62 -0
- package/dist/esm/testing/index.mjs +101 -0
- package/dist/esm/testing/index.mjs.map +1 -0
- package/dist/esm/types-BwK8Xgvg.d.mts +967 -0
- package/package.json +69 -20
- package/dist/cjs/types-V7c-qhn6.d.ts +0 -489
- package/dist/esm/chunk-HB2DGKQ3.mjs.map +0 -1
- package/dist/esm/chunk-MCFHZSF7.mjs +0 -107
- package/dist/esm/chunk-MCFHZSF7.mjs.map +0 -1
- package/dist/esm/chunk-YWBJJV5M.mjs.map +0 -1
- package/dist/esm/types-V7c-qhn6.d.mts +0 -489
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/adapters/ton-adapter.ts","../../src/adapters/svm-adapter.ts","../../src/adapters/tron-adapter.ts","../../src/cache.ts","../../src/chains.ts","../../src/errors.ts","../../src/signer.ts","../../src/t402wdk.ts","../../src/bridge.ts","../../src/compatibility.ts","../../src/hardware/types.ts","../../src/hardware/ledger.ts","../../src/hardware/trezor.ts","../../src/hardware/index.ts"],"sourcesContent":["/**\n * @module @t402/wdk - T402 integration with Tether Wallet Development Kit\n *\n * This package provides seamless integration between T402 payment protocol\n * and Tether's WDK (Wallet Development Kit), enabling:\n *\n * - Multi-chain self-custodial wallets (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 * TON Signer Adapter for WDK\n *\n * Wraps a Tether WDK TON account to implement T402's ClientTonSigner interface.\n * This allows WDK-managed TON wallets to be used for T402 payments.\n */\n\nimport type { WDKTonAccount } from '../types.js'\n\n/**\n * TON Address type (compatible with @ton/core Address)\n * We define our own interface to avoid direct import\n */\nexport interface TonAddress {\n toString(): string\n toRawString(): string\n}\n\n/**\n * TON Cell type (compatible with @ton/core Cell)\n * We define our own interface to avoid direct import\n */\nexport interface TonCell {\n hash(): Uint8Array\n toBoc(): Uint8Array\n}\n\n/**\n * SignMessageParams type matching T402's @t402/ton interface\n */\nexport interface SignMessageParams {\n /** Destination address */\n to: TonAddress\n /** Amount of TON to attach (for gas) in nanoTON */\n value: bigint\n /** Message body (Jetton transfer cell) */\n body: TonCell\n /** Send mode flags (from @ton/core SendMode) */\n sendMode?: number\n /** Bounce flag */\n bounce?: boolean\n /** Message validity timeout in seconds */\n timeout?: number\n}\n\n/**\n * ClientTonSigner interface matching T402's @t402/ton\n */\nexport interface ClientTonSigner {\n readonly address: TonAddress\n signMessage(params: SignMessageParams): Promise<TonCell>\n getSeqno(): Promise<number>\n}\n\n/**\n * Simple TonAddress implementation for WDK\n */\nclass WDKTonAddress implements TonAddress {\n constructor(private _address: string) {}\n\n toString(): string {\n return this._address\n }\n\n toRawString(): string {\n return this._address\n }\n}\n\n/**\n * WDKTonSignerAdapter - Adapts a WDK TON account to T402's ClientTonSigner\n *\n * This adapter wraps a Tether WDK TON account and provides T402-compatible\n * signing functionality. The actual message building and signing is delegated\n * to the WDK account, which handles TON-specific details internally.\n *\n * @example\n * ```typescript\n * const adapter = await createWDKTonSigner(wdkTonAccount);\n * const signed = await adapter.signMessage({\n * to: jettonWalletAddress,\n * value: toNano('0.05'),\n * body: jettonTransferBody,\n * });\n * ```\n */\nexport class WDKTonSignerAdapter implements ClientTonSigner {\n private _account: WDKTonAccount\n private _address: TonAddress | null = null\n private _initialized = false\n\n constructor(account: WDKTonAccount) {\n if (!account) {\n throw new Error('WDK TON account is required')\n }\n this._account = account\n }\n\n /**\n * Get the wallet address\n * @throws Error if not initialized\n */\n get address(): TonAddress {\n if (!this._address) {\n throw new Error(\n 'TON signer not initialized. Call initialize() first or use createWDKTonSigner().',\n )\n }\n return this._address\n }\n\n /**\n * Check if the adapter is initialized\n */\n get isInitialized(): boolean {\n return this._initialized\n }\n\n /**\n * Initialize the adapter by fetching the address\n * Must be called before using the signer\n */\n async initialize(): Promise<void> {\n if (this._initialized) {\n return\n }\n\n const addressStr = await this._account.getAddress()\n this._address = new WDKTonAddress(addressStr)\n this._initialized = true\n }\n\n /**\n * Sign an internal message for Jetton transfer\n *\n * Attempts to build a proper signed Cell using @ton/core if available.\n * Falls back to a simplified wrapper that embeds the raw signature.\n *\n * @param params - Message parameters\n * @returns Signed external message as Cell (BOC)\n */\n async signMessage(params: SignMessageParams): Promise<TonCell> {\n const msgHash = params.body.hash()\n const signature = await this._account.signMessage(msgHash)\n\n // Try to use @ton/core for proper Cell construction\n try {\n const tonCore = await import('@ton/core')\n const sigBuffer = Buffer.from(signature.buffer, signature.byteOffset, signature.byteLength)\n const bodyBoc = params.body.toBoc()\n const bocBuffer = Buffer.from(bodyBoc.buffer, bodyBoc.byteOffset, bodyBoc.byteLength)\n const signedCell = tonCore\n .beginCell()\n .storeBuffer(sigBuffer)\n .storeSlice(tonCore.Cell.fromBoc(bocBuffer)[0]!.beginParse())\n .endCell()\n return signedCell as unknown as TonCell\n } catch {\n // @ton/core not available — return simplified wrapper.\n // The signature is accessible via toBoc() and the original\n // message hash via hash(), which is sufficient for T402\n // facilitator verification.\n return {\n hash: () => msgHash,\n toBoc: () => signature,\n }\n }\n }\n\n /**\n * Get current seqno for the wallet\n * Used for replay protection\n */\n async getSeqno(): Promise<number> {\n return this._account.getSeqno()\n }\n\n /**\n * Get TON balance in nanoTON\n */\n async getBalance(): Promise<bigint> {\n return this._account.getBalance()\n }\n\n /**\n * Get Jetton balance\n * @param jettonMaster - Jetton master contract address\n */\n async getJettonBalance(jettonMaster: string): Promise<bigint> {\n return this._account.getJettonBalance(jettonMaster)\n }\n\n /**\n * Get the underlying WDK account\n * Useful for advanced operations not covered by this adapter\n */\n getWDKAccount(): WDKTonAccount {\n return this._account\n }\n}\n\n/**\n * Create an initialized WDK TON signer\n *\n * @param account - WDK TON account from @tetherto/wdk-wallet-ton\n * @returns Initialized ClientTonSigner\n *\n * @example\n * ```typescript\n * import { T402WDK } from '@t402/wdk';\n *\n * const wallet = new T402WDK(seedPhrase, config);\n * const tonSigner = await wallet.getTonSigner();\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'ton:mainnet', signer: tonSigner }]\n * });\n * ```\n */\nexport async function createWDKTonSigner(account: WDKTonAccount): Promise<WDKTonSignerAdapter> {\n const adapter = new WDKTonSignerAdapter(account)\n await adapter.initialize()\n return adapter\n}\n","/**\n * Solana (SVM) Signer Adapter for WDK\n *\n * Wraps a Tether WDK Solana account to implement T402's ClientSvmSigner interface.\n * ClientSvmSigner is just TransactionSigner from @solana/kit.\n */\n\nimport type { WDKSolanaAccount } from '../types.js'\n\n/**\n * Address type from @solana/kit (base58 string)\n * We use a branded type for compatibility\n */\nexport type SolanaAddress = string & { readonly __brand?: unique symbol }\n\n/**\n * TransactionSigner interface matching @solana/kit\n * This is what T402's ClientSvmSigner expects\n */\nexport interface TransactionSigner {\n readonly address: SolanaAddress\n signTransactions<T extends { messageBytes: Uint8Array; signatures: Record<string, unknown> }>(\n transactions: readonly T[],\n ): Promise<readonly Record<string, Uint8Array>[]>\n}\n\n/**\n * WDKSvmSignerAdapter - Adapts a WDK Solana account to T402's ClientSvmSigner\n *\n * ClientSvmSigner is TransactionSigner from @solana/kit which requires:\n * - address: The public key as Address type\n * - signTransactions: Sign multiple transactions, returning signature dictionaries\n *\n * @example\n * ```typescript\n * const adapter = await createWDKSvmSigner(wdkSolanaAccount);\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'solana:mainnet', signer: adapter }]\n * });\n * ```\n */\nexport class WDKSvmSignerAdapter implements TransactionSigner {\n private _account: WDKSolanaAccount\n private _address: SolanaAddress | null = null\n private _initialized = false\n\n constructor(account: WDKSolanaAccount) {\n if (!account) {\n throw new Error('WDK Solana account is required')\n }\n this._account = account\n }\n\n /**\n * Get the wallet address (base58)\n * @throws Error if not initialized\n */\n get address(): SolanaAddress {\n if (!this._address) {\n throw new Error(\n 'Solana signer not initialized. Call initialize() first or use createWDKSvmSigner().',\n )\n }\n return this._address\n }\n\n /**\n * Check if the adapter is initialized\n */\n get isInitialized(): boolean {\n return this._initialized\n }\n\n /**\n * Initialize the adapter by fetching the address\n * Must be called before using the signer\n */\n async initialize(): Promise<void> {\n if (this._initialized) {\n return\n }\n\n const addressStr = await this._account.getAddress()\n this._address = addressStr as SolanaAddress\n this._initialized = true\n }\n\n /**\n * Sign transactions with this signer\n *\n * This method signs the message bytes of each transaction and returns\n * signature dictionaries mapping address to signature.\n *\n * @param transactions - Array of transactions to sign\n * @returns Array of signature dictionaries\n */\n async signTransactions<\n T extends { messageBytes: Uint8Array; signatures: Record<string, unknown> },\n >(transactions: readonly T[]): Promise<readonly Record<string, Uint8Array>[]> {\n if (!transactions || transactions.length === 0) {\n return []\n }\n\n const results: Record<string, Uint8Array>[] = []\n\n for (const tx of transactions) {\n if (!tx.messageBytes || tx.messageBytes.length === 0) {\n throw new Error('Transaction messageBytes must not be empty')\n }\n\n // Sign the message bytes using WDK account\n const signature = await this._account.sign(tx.messageBytes)\n\n // Return as a dictionary mapping our address to the signature\n results.push({\n [this._address as string]: signature,\n })\n }\n\n return results\n }\n\n /**\n * Sign a single message (utility method)\n * @param message - Message bytes to sign\n * @returns Signature bytes\n */\n async sign(message: Uint8Array): Promise<Uint8Array> {\n return this._account.sign(message)\n }\n\n /**\n * Get SOL balance in lamports\n */\n async getBalance(): Promise<bigint> {\n return this._account.getBalance()\n }\n\n /**\n * Get SPL token balance\n * @param mint - Token mint address\n */\n async getTokenBalance(mint: string): Promise<bigint> {\n return this._account.getTokenBalance(mint)\n }\n\n /**\n * Transfer SPL tokens\n * @param params - Transfer parameters\n * @returns Transaction signature\n */\n async transfer(params: { token: string; recipient: string; amount: bigint }): Promise<string> {\n return this._account.transfer(params)\n }\n}\n\n/**\n * Create an initialized WDK Solana signer\n *\n * @param account - WDK Solana account from @tetherto/wdk-wallet-solana\n * @returns Initialized TransactionSigner (ClientSvmSigner)\n *\n * @example\n * ```typescript\n * import { T402WDK } from '@t402/wdk';\n *\n * const wallet = new T402WDK(seedPhrase, config);\n * const svmSigner = await wallet.getSvmSigner();\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'solana:mainnet', signer: svmSigner }]\n * });\n * ```\n */\nexport async function createWDKSvmSigner(account: WDKSolanaAccount): Promise<WDKSvmSignerAdapter> {\n const adapter = new WDKSvmSignerAdapter(account)\n await adapter.initialize()\n return adapter\n}\n","/**\n * TRON Signer Adapter for WDK\n *\n * Wraps a Tether WDK TRON account to implement T402's ClientTronSigner interface.\n * This allows WDK-managed TRON wallets to be used for T402 payments.\n */\n\nimport type { WDKTronAccount } from '../types.js'\n\n/**\n * SignTransactionParams matching T402's @t402/tron interface\n */\nexport interface SignTransactionParams {\n /** TRC20 contract address */\n contractAddress: string\n /** Recipient address (T-prefix base58check) */\n to: string\n /** Amount to transfer (in smallest units) */\n amount: string\n /** Fee limit in SUN (optional, defaults to 100 TRX) */\n feeLimit?: number\n /** Transaction expiration time in milliseconds (optional) */\n expiration?: number\n}\n\n/**\n * Block info for transaction building\n */\nexport interface BlockInfo {\n /** Reference block bytes (hex) */\n refBlockBytes: string\n /** Reference block hash (hex) */\n refBlockHash: string\n /** Expiration timestamp in milliseconds */\n expiration: number\n}\n\n/**\n * ClientTronSigner interface matching T402's @t402/tron\n */\nexport interface ClientTronSigner {\n readonly address: string\n signTransaction(params: SignTransactionParams): Promise<string>\n getBlockInfo(): Promise<BlockInfo>\n}\n\n// TronWeb-compatible types\ninterface TronWebTransaction {\n txID: string\n raw_data: {\n contract: unknown[]\n ref_block_bytes: string\n ref_block_hash: string\n expiration: number\n timestamp: number\n }\n raw_data_hex: string\n signature?: string[]\n}\n\ninterface TronWebBlock {\n block_header: {\n raw_data: {\n number: number\n txTrieRoot: string\n witness_address: string\n parentHash: string\n version: number\n timestamp: number\n }\n witness_signature: string\n }\n blockID: string\n}\n\n/**\n * WDKTronSignerAdapter - Adapts a WDK TRON account to T402's ClientTronSigner\n *\n * @example\n * ```typescript\n * const adapter = await createWDKTronSigner(wdkTronAccount);\n * const signedTx = await adapter.signTransaction({\n * contractAddress: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',\n * to: 'TRecipientAddress...',\n * amount: '1000000', // 1 USDT\n * });\n * ```\n */\nexport class WDKTronSignerAdapter implements ClientTronSigner {\n private _account: WDKTronAccount\n private _address: string | null = null\n private _initialized = false\n private _rpcUrl: string\n\n constructor(account: WDKTronAccount, rpcUrl = 'https://api.trongrid.io') {\n if (!account) {\n throw new Error('WDK TRON account is required')\n }\n this._account = account\n this._rpcUrl = rpcUrl\n }\n\n /**\n * Get the wallet address (T-prefix base58check)\n * @throws Error if not initialized\n */\n get address(): string {\n if (!this._address) {\n throw new Error(\n 'TRON signer not initialized. Call initialize() first or use createWDKTronSigner().',\n )\n }\n return this._address\n }\n\n /**\n * Check if the adapter is initialized\n */\n get isInitialized(): boolean {\n return this._initialized\n }\n\n /**\n * Initialize the adapter by fetching the address\n * Must be called before using the signer\n */\n async initialize(): Promise<void> {\n if (this._initialized) {\n return\n }\n\n this._address = await this._account.getAddress()\n this._initialized = true\n }\n\n /**\n * Sign a TRC20 transfer transaction\n *\n * This method:\n * 1. Builds a TRC20 transfer transaction\n * 2. Signs it using the WDK account\n * 3. Returns the hex-encoded signed transaction\n *\n * @param params - Transaction parameters\n * @returns Hex-encoded signed transaction\n */\n async signTransaction(params: SignTransactionParams): Promise<string> {\n if (!params.contractAddress) {\n throw new Error('contractAddress is required')\n }\n if (!params.to) {\n throw new Error('recipient address (to) is required')\n }\n if (!params.amount || BigInt(params.amount) <= 0n) {\n throw new Error('amount must be a positive value')\n }\n\n // Get block info for transaction\n const blockInfo = await this.getBlockInfo()\n\n // Default fee limit: 100 TRX = 100_000_000 SUN\n const feeLimit = params.feeLimit ?? 100_000_000\n\n // Build the TRC20 transfer transaction\n const transaction = await this.buildTrc20Transaction({\n contractAddress: params.contractAddress,\n to: params.to,\n amount: params.amount,\n feeLimit,\n refBlockBytes: blockInfo.refBlockBytes,\n refBlockHash: blockInfo.refBlockHash,\n expiration: params.expiration ?? blockInfo.expiration,\n })\n\n // Sign the transaction using WDK account\n const signedTx = await this._account.signTransaction(transaction)\n\n // Serialize to hex format\n return this.serializeTransaction(signedTx as TronWebTransaction)\n }\n\n /**\n * Get the current reference block info for transaction building\n * This is required for TRON's replay protection mechanism\n */\n async getBlockInfo(): Promise<BlockInfo> {\n try {\n const response = await fetch(`${this._rpcUrl}/wallet/getnowblock`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({}),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to get block info: ${response.status}`)\n }\n\n const block = (await response.json()) as TronWebBlock\n\n // Extract reference block bytes (last 4 bytes of block number)\n const blockNum = block.block_header.raw_data.number\n const refBlockBytes = blockNum.toString(16).padStart(8, '0').slice(-4)\n\n // Reference block hash (first 8 bytes of block ID)\n const refBlockHash = block.blockID.slice(16, 32)\n\n // Expiration: block timestamp + 60 seconds\n const expiration = block.block_header.raw_data.timestamp + 60000\n\n return {\n refBlockBytes,\n refBlockHash,\n expiration,\n }\n } catch (error) {\n throw new Error(\n `Failed to get TRON block info: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n\n /**\n * Build a TRC20 transfer transaction\n */\n private async buildTrc20Transaction(params: {\n contractAddress: string\n to: string\n amount: string\n feeLimit: number\n refBlockBytes: string\n refBlockHash: string\n expiration: number\n }): Promise<TronWebTransaction> {\n // Build TRC20 transfer function call\n // transfer(address,uint256) = 0xa9059cbb\n const functionSelector = 'transfer(address,uint256)'\n\n // Encode parameters\n const toAddressHex = this.addressToHex(params.to).slice(2).padStart(64, '0')\n const amountHex = BigInt(params.amount).toString(16).padStart(64, '0')\n const parameter = toAddressHex + amountHex\n\n try {\n const response = await fetch(`${this._rpcUrl}/wallet/triggersmartcontract`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n owner_address: this.addressToHex(this._address!),\n contract_address: this.addressToHex(params.contractAddress),\n function_selector: functionSelector,\n parameter,\n fee_limit: params.feeLimit,\n }),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to build transaction: ${response.status}`)\n }\n\n const result = await response.json()\n\n if (result.result?.code) {\n throw new Error(`Transaction build failed: ${result.result.message}`)\n }\n\n return result.transaction as TronWebTransaction\n } catch (error) {\n throw new Error(\n `Failed to build TRC20 transaction: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n\n /**\n * Serialize a signed transaction to hex format\n */\n private serializeTransaction(signedTx: TronWebTransaction): string {\n // Return the raw_data_hex with signature appended\n if (signedTx.signature && signedTx.signature.length > 0) {\n return JSON.stringify(signedTx)\n }\n return signedTx.raw_data_hex\n }\n\n /**\n * Convert TRON base58 address to hex format\n */\n private addressToHex(address: string): string {\n // If already hex, return as-is\n if (address.startsWith('41') || address.startsWith('0x')) {\n return address.startsWith('0x') ? '41' + address.slice(2) : address\n }\n\n // Convert base58 to hex using simple algorithm\n const ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n let num = BigInt(0)\n for (const char of address) {\n num = num * BigInt(58) + BigInt(ALPHABET.indexOf(char))\n }\n\n // Convert to hex and take first 42 chars (21 bytes)\n let hex = num.toString(16)\n // Handle leading zeros\n let leadingZeros = 0\n for (const char of address) {\n if (char === '1') leadingZeros++\n else break\n }\n hex = '00'.repeat(leadingZeros) + hex\n\n // TRON address is 21 bytes = 42 hex chars\n return hex.slice(0, 42)\n }\n\n /**\n * Get TRX balance in SUN\n */\n async getBalance(): Promise<bigint> {\n return this._account.getBalance()\n }\n\n /**\n * Get TRC20 token balance\n * @param contractAddress - TRC20 contract address\n */\n async getTrc20Balance(contractAddress: string): Promise<bigint> {\n return this._account.getTrc20Balance(contractAddress)\n }\n}\n\n/**\n * Create an initialized WDK TRON signer\n *\n * @param account - WDK TRON account from @tetherto/wdk-wallet-tron\n * @param rpcUrl - Optional custom RPC URL (default: https://api.trongrid.io)\n * @returns Initialized ClientTronSigner\n *\n * @example\n * ```typescript\n * import { T402WDK } from '@t402/wdk';\n *\n * const wallet = new T402WDK(seedPhrase, config);\n * const tronSigner = await wallet.getTronSigner();\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'tron:mainnet', signer: tronSigner }]\n * });\n * ```\n */\nexport async function createWDKTronSigner(\n account: WDKTronAccount,\n rpcUrl?: string,\n): Promise<WDKTronSignerAdapter> {\n const adapter = new WDKTronSignerAdapter(account, rpcUrl)\n await adapter.initialize()\n return adapter\n}\n","/**\n * TTL Cache implementation for balance caching\n *\n * Provides a generic cache with configurable TTL (Time To Live) for\n * reducing RPC calls and improving performance.\n */\n\n/**\n * Cache entry with value and expiration time\n */\ninterface CacheEntry<T> {\n value: T\n expiresAt: number\n}\n\n/**\n * Cache configuration options\n */\nexport interface CacheConfig {\n /** Default TTL in milliseconds (default: 30000 = 30 seconds) */\n defaultTTL: number\n /** Maximum number of entries (default: 1000) */\n maxSize: number\n /** Whether to refresh TTL on access (default: false) */\n refreshOnAccess: boolean\n}\n\n/**\n * Default cache configuration\n */\nexport const DEFAULT_CACHE_CONFIG: CacheConfig = {\n defaultTTL: 30000, // 30 seconds\n maxSize: 1000,\n refreshOnAccess: false,\n}\n\n/**\n * Generic TTL cache implementation\n *\n * @example\n * ```typescript\n * const cache = new TTLCache<bigint>({ defaultTTL: 60000 });\n *\n * // Set with default TTL\n * cache.set('balance:arbitrum:0x123', 1000000n);\n *\n * // Set with custom TTL\n * cache.set('balance:ethereum:0x456', 2000000n, 120000);\n *\n * // Get value (returns undefined if expired)\n * const balance = cache.get('balance:arbitrum:0x123');\n *\n * // Check if key exists and is not expired\n * if (cache.has('balance:arbitrum:0x123')) {\n * // Use cached value\n * }\n * ```\n */\nexport class TTLCache<T> {\n private _cache: Map<string, CacheEntry<T>> = new Map()\n private _config: CacheConfig\n private _cleanupInterval: ReturnType<typeof setInterval> | null = null\n\n constructor(config: Partial<CacheConfig> = {}) {\n this._config = { ...DEFAULT_CACHE_CONFIG, ...config }\n\n // Start periodic cleanup if maxSize is set\n if (this._config.maxSize > 0) {\n this._startCleanup()\n }\n }\n\n /**\n * Get a value from the cache\n *\n * @param key - Cache key\n * @returns The cached value or undefined if not found/expired\n */\n get(key: string): T | undefined {\n const entry = this._cache.get(key)\n\n if (!entry) {\n return undefined\n }\n\n // Check if expired\n if (Date.now() > entry.expiresAt) {\n this._cache.delete(key)\n return undefined\n }\n\n // Optionally refresh TTL on access\n if (this._config.refreshOnAccess) {\n entry.expiresAt = Date.now() + this._config.defaultTTL\n }\n\n return entry.value\n }\n\n /**\n * Set a value in the cache\n *\n * @param key - Cache key\n * @param value - Value to cache\n * @param ttl - TTL in milliseconds (optional, uses default if not provided)\n */\n set(key: string, value: T, ttl?: number): void {\n // Enforce max size by removing oldest entries\n if (this._cache.size >= this._config.maxSize) {\n this._evictOldest()\n }\n\n const expiresAt = Date.now() + (ttl ?? this._config.defaultTTL)\n this._cache.set(key, { value, expiresAt })\n }\n\n /**\n * Check if a key exists and is not expired\n *\n * @param key - Cache key\n * @returns true if key exists and is not expired\n */\n has(key: string): boolean {\n const entry = this._cache.get(key)\n\n if (!entry) {\n return false\n }\n\n if (Date.now() > entry.expiresAt) {\n this._cache.delete(key)\n return false\n }\n\n return true\n }\n\n /**\n * Delete a key from the cache\n *\n * @param key - Cache key\n * @returns true if key was deleted\n */\n delete(key: string): boolean {\n return this._cache.delete(key)\n }\n\n /**\n * Delete all keys matching a prefix\n *\n * @param prefix - Key prefix to match\n * @returns Number of keys deleted\n */\n deleteByPrefix(prefix: string): number {\n let count = 0\n for (const key of this._cache.keys()) {\n if (key.startsWith(prefix)) {\n this._cache.delete(key)\n count++\n }\n }\n return count\n }\n\n /**\n * Clear all entries from the cache\n */\n clear(): void {\n this._cache.clear()\n }\n\n /**\n * Get the number of entries in the cache (including expired)\n */\n get size(): number {\n return this._cache.size\n }\n\n /**\n * Get the number of valid (non-expired) entries\n */\n get validSize(): number {\n const now = Date.now()\n let count = 0\n for (const entry of this._cache.values()) {\n if (now <= entry.expiresAt) {\n count++\n }\n }\n return count\n }\n\n /**\n * Get all valid keys\n */\n keys(): string[] {\n const now = Date.now()\n const validKeys: string[] = []\n for (const [key, entry] of this._cache.entries()) {\n if (now <= entry.expiresAt) {\n validKeys.push(key)\n }\n }\n return validKeys\n }\n\n /**\n * Get remaining TTL for a key in milliseconds\n *\n * @param key - Cache key\n * @returns Remaining TTL in ms, or -1 if not found/expired\n */\n getTTL(key: string): number {\n const entry = this._cache.get(key)\n\n if (!entry) {\n return -1\n }\n\n const remaining = entry.expiresAt - Date.now()\n if (remaining <= 0) {\n this._cache.delete(key)\n return -1\n }\n\n return remaining\n }\n\n /**\n * Update TTL for an existing key\n *\n * @param key - Cache key\n * @param ttl - New TTL in milliseconds\n * @returns true if key exists and TTL was updated\n */\n touch(key: string, ttl?: number): boolean {\n const entry = this._cache.get(key)\n\n if (!entry) {\n return false\n }\n\n if (Date.now() > entry.expiresAt) {\n this._cache.delete(key)\n return false\n }\n\n entry.expiresAt = Date.now() + (ttl ?? this._config.defaultTTL)\n return true\n }\n\n /**\n * Get or set a value using a factory function\n *\n * @param key - Cache key\n * @param factory - Function to create value if not cached\n * @param ttl - TTL in milliseconds (optional)\n * @returns The cached or newly created value\n */\n async getOrSet(key: string, factory: () => Promise<T>, ttl?: number): Promise<T> {\n const cached = this.get(key)\n if (cached !== undefined) {\n return cached\n }\n\n const value = await factory()\n this.set(key, value, ttl)\n return value\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n const now = Date.now()\n let validCount = 0\n let expiredCount = 0\n let oldestExpiry = Infinity\n let newestExpiry = 0\n\n for (const entry of this._cache.values()) {\n if (now <= entry.expiresAt) {\n validCount++\n if (entry.expiresAt < oldestExpiry) oldestExpiry = entry.expiresAt\n if (entry.expiresAt > newestExpiry) newestExpiry = entry.expiresAt\n } else {\n expiredCount++\n }\n }\n\n return {\n totalSize: this._cache.size,\n validSize: validCount,\n expiredSize: expiredCount,\n maxSize: this._config.maxSize,\n defaultTTL: this._config.defaultTTL,\n oldestExpiryMs: oldestExpiry === Infinity ? 0 : oldestExpiry - now,\n newestExpiryMs: newestExpiry === 0 ? 0 : newestExpiry - now,\n }\n }\n\n /**\n * Stop the cleanup interval\n */\n dispose(): void {\n if (this._cleanupInterval) {\n clearInterval(this._cleanupInterval)\n this._cleanupInterval = null\n }\n this._cache.clear()\n }\n\n /**\n * Start periodic cleanup of expired entries\n */\n private _startCleanup(): void {\n // Run cleanup every minute\n this._cleanupInterval = setInterval(() => {\n this._removeExpired()\n }, 60000)\n\n // Don't prevent process from exiting\n if (this._cleanupInterval.unref) {\n this._cleanupInterval.unref()\n }\n }\n\n /**\n * Remove all expired entries\n */\n private _removeExpired(): number {\n const now = Date.now()\n let count = 0\n\n for (const [key, entry] of this._cache.entries()) {\n if (now > entry.expiresAt) {\n this._cache.delete(key)\n count++\n }\n }\n\n return count\n }\n\n /**\n * Evict oldest entries to make room\n */\n private _evictOldest(): void {\n // First remove expired entries\n this._removeExpired()\n\n // If still at max, remove oldest by expiry time\n if (this._cache.size >= this._config.maxSize) {\n let oldestKey: string | null = null\n let oldestExpiry = Infinity\n\n for (const [key, entry] of this._cache.entries()) {\n if (entry.expiresAt < oldestExpiry) {\n oldestExpiry = entry.expiresAt\n oldestKey = key\n }\n }\n\n if (oldestKey) {\n this._cache.delete(oldestKey)\n }\n }\n }\n}\n\n/**\n * Cache statistics\n */\nexport interface CacheStats {\n /** Total entries including expired */\n totalSize: number\n /** Valid (non-expired) entries */\n validSize: number\n /** Expired entries pending cleanup */\n expiredSize: number\n /** Maximum cache size */\n maxSize: number\n /** Default TTL in milliseconds */\n defaultTTL: number\n /** Time until oldest entry expires (ms) */\n oldestExpiryMs: number\n /** Time until newest entry expires (ms) */\n newestExpiryMs: number\n}\n\n/**\n * Balance cache configuration\n */\nexport interface BalanceCacheConfig {\n /** Whether caching is enabled (default: true) */\n enabled: boolean\n /** TTL for native balance in milliseconds (default: 15000 = 15 seconds) */\n nativeBalanceTTL: number\n /** TTL for token balance in milliseconds (default: 30000 = 30 seconds) */\n tokenBalanceTTL: number\n /** TTL for aggregated balances in milliseconds (default: 60000 = 60 seconds) */\n aggregatedBalanceTTL: number\n /** Maximum cache entries (default: 500) */\n maxSize: number\n}\n\n/**\n * Default balance cache configuration\n */\nexport const DEFAULT_BALANCE_CACHE_CONFIG: BalanceCacheConfig = {\n enabled: true,\n nativeBalanceTTL: 15000, // 15 seconds\n tokenBalanceTTL: 30000, // 30 seconds\n aggregatedBalanceTTL: 60000, // 60 seconds\n maxSize: 500,\n}\n\n/**\n * Specialized balance cache for WDK\n *\n * Provides separate TTL settings for different balance types\n * and convenient methods for balance-specific caching.\n *\n * @example\n * ```typescript\n * const cache = new BalanceCache({\n * tokenBalanceTTL: 60000, // 1 minute for token balances\n * });\n *\n * // Cache token balance\n * cache.setTokenBalance('arbitrum', '0xUSDT', '0xWallet', 1000000n);\n *\n * // Get cached balance (returns undefined if expired)\n * const balance = cache.getTokenBalance('arbitrum', '0xUSDT', '0xWallet');\n *\n * // Or use getOrFetch pattern\n * const balance = await cache.getOrFetchTokenBalance(\n * 'arbitrum',\n * '0xUSDT',\n * '0xWallet',\n * async () => await signer.getTokenBalance('0xUSDT')\n * );\n * ```\n */\nexport class BalanceCache {\n private _cache: TTLCache<bigint>\n private _aggregatedCache: TTLCache<unknown>\n private _config: BalanceCacheConfig\n\n constructor(config: Partial<BalanceCacheConfig> = {}) {\n this._config = { ...DEFAULT_BALANCE_CACHE_CONFIG, ...config }\n\n this._cache = new TTLCache<bigint>({\n defaultTTL: this._config.tokenBalanceTTL,\n maxSize: this._config.maxSize,\n })\n\n this._aggregatedCache = new TTLCache<unknown>({\n defaultTTL: this._config.aggregatedBalanceTTL,\n maxSize: 100, // Fewer aggregated balance entries\n })\n }\n\n /**\n * Check if caching is enabled\n */\n get enabled(): boolean {\n return this._config.enabled\n }\n\n /**\n * Get cache configuration\n */\n get config(): BalanceCacheConfig {\n return { ...this._config }\n }\n\n // ========== Native Balance Methods ==========\n\n /**\n * Get cached native balance\n */\n getNativeBalance(chain: string, address: string): bigint | undefined {\n if (!this._config.enabled) return undefined\n return this._cache.get(this._nativeKey(chain, address))\n }\n\n /**\n * Set native balance in cache\n */\n setNativeBalance(chain: string, address: string, balance: bigint): void {\n if (!this._config.enabled) return\n this._cache.set(this._nativeKey(chain, address), balance, this._config.nativeBalanceTTL)\n }\n\n /**\n * Get or fetch native balance\n */\n async getOrFetchNativeBalance(\n chain: string,\n address: string,\n fetcher: () => Promise<bigint>,\n ): Promise<bigint> {\n if (!this._config.enabled) {\n return fetcher()\n }\n\n return this._cache.getOrSet(\n this._nativeKey(chain, address),\n fetcher,\n this._config.nativeBalanceTTL,\n )\n }\n\n // ========== Token Balance Methods ==========\n\n /**\n * Get cached token balance\n */\n getTokenBalance(chain: string, token: string, address: string): bigint | undefined {\n if (!this._config.enabled) return undefined\n return this._cache.get(this._tokenKey(chain, token, address))\n }\n\n /**\n * Set token balance in cache\n */\n setTokenBalance(chain: string, token: string, address: string, balance: bigint): void {\n if (!this._config.enabled) return\n this._cache.set(this._tokenKey(chain, token, address), balance, this._config.tokenBalanceTTL)\n }\n\n /**\n * Get or fetch token balance\n */\n async getOrFetchTokenBalance(\n chain: string,\n token: string,\n address: string,\n fetcher: () => Promise<bigint>,\n ): Promise<bigint> {\n if (!this._config.enabled) {\n return fetcher()\n }\n\n return this._cache.getOrSet(\n this._tokenKey(chain, token, address),\n fetcher,\n this._config.tokenBalanceTTL,\n )\n }\n\n // ========== Aggregated Balance Methods ==========\n\n /**\n * Get cached aggregated balance\n */\n getAggregatedBalance<T>(key: string): T | undefined {\n if (!this._config.enabled) return undefined\n return this._aggregatedCache.get(this._aggregatedKey(key)) as T | undefined\n }\n\n /**\n * Set aggregated balance in cache\n */\n setAggregatedBalance<T>(key: string, value: T): void {\n if (!this._config.enabled) return\n this._aggregatedCache.set(this._aggregatedKey(key), value, this._config.aggregatedBalanceTTL)\n }\n\n /**\n * Get or fetch aggregated balance\n */\n async getOrFetchAggregatedBalance<T>(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 * 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","import_evm","import_evm","module","HardwareWalletErrorCode","DEFAULT_DERIVATION_PATH","module"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/secret.ts","../../src/events.ts","../../src/receipts.ts","../../src/adapters/ton-adapter.ts","../../src/adapters/svm-adapter.ts","../../src/adapters/tron-adapter.ts","../../src/adapters/spark-adapter.ts","../../src/adapters/btc-adapter.ts","../../src/cache.ts","../../src/chains.ts","../../src/errors.ts","../../src/signer.ts","../../src/t402wdk.ts","../../src/pricing.ts","../../src/failover.ts","../../src/validation.ts","../../src/bridge.ts","../../src/bridge-tracker.ts","../../src/logger.ts","../../src/compatibility.ts","../../src/idempotency.ts","../../src/compliance.ts","../../src/webhooks.ts","../../src/indexer.ts","../../src/hardware/types.ts","../../src/hardware/ledger.ts","../../src/hardware/trezor.ts","../../src/hardware/index.ts","../../src/providers/moonpay.ts","../../src/integrations/a2a-adapter.ts","../../src/integrations/facilitator-adapter.ts","../../src/integrations/siwx-adapter.ts"],"sourcesContent":["/**\n * @module @t402/wdk - T402 integration with Tether Wallet Development Kit\n *\n * This package provides seamless integration between T402 payment protocol\n * and Tether's WDK (Wallet Development Kit), enabling:\n *\n * - Multi-chain self-custodial wallets (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 WDKAutoDiscoveryResult,\n SignerEntry,\n GetAllSignersOptions,\n FromWDKOptions,\n // Swap types\n SwapQuote,\n SwapResult,\n SwapParams,\n // Lending types\n BorrowParams,\n BorrowResult,\n // Fiat on-ramp types\n FiatOnRampQuote,\n FiatOnRampParams,\n FiatOnRampResult,\n FiatOnRampProvider,\n} from './types.js'\n\n// Multi-chain adapters\nexport {\n WDKTonSignerAdapter,\n createWDKTonSigner,\n type ClientTonSigner,\n type SignMessageParams as TonSignMessageParams,\n // Jetton transfer verification (#199)\n waitForJettonTransfer,\n getJettonWalletAddress,\n type WaitForJettonTransferParams,\n type JettonTransferStatus,\n type JettonTransferResult,\n} from './adapters/ton-adapter.js'\nexport {\n WDKSvmSignerAdapter,\n createWDKSvmSigner,\n type TransactionSigner as ClientSvmSigner,\n type SolanaAddress,\n // Versioned transactions & priority fees (#197)\n buildVersionedTransaction,\n transferWithPriorityFee,\n getRecentPriorityFees,\n resolveATA,\n deriveATAAddress,\n type SerializedInstruction,\n type BuildVersionedTransactionParams,\n type TransferWithPriorityFeeParams,\n type PriorityFeeEstimate,\n type ATAResolution,\n // Token-2022 (#203)\n getTokenProgram,\n getTransferFee,\n type TokenProgramType,\n type TransferFeeInfo,\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 // Energy delegation (#198)\n type EnergyEstimate,\n type EnergyProvider,\n} from './adapters/tron-adapter.js'\n\n// Address validation (#192)\nexport { validatePaymentAddress } from './validation.js'\nexport type { AddressValidationResult } from './validation.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 CHAIN_REGISTRY,\n normalizeChainConfig,\n getNetworkFromChain,\n getChainFromNetwork,\n getChainId,\n getUsdt0Chains,\n getPreferredToken,\n getRegistryByCaip2,\n getChainsByFamily,\n} from './chains.js'\nexport type { TokenInfo, ChainRegistryEntry, RegistryToken } 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// Bridge delivery tracking\nexport { BridgeTracker, mapLayerZeroStatus } from './bridge-tracker.js'\nexport type {\n BridgeTrackerConfig,\n BridgeDeliveryStatus,\n DeliveryResult,\n WaitOptions,\n} from './bridge-tracker.js'\n\n// Structured logging\nexport { defaultLogger, noopLogger, createCorrelationId } from './logger.js'\nexport type { T402Logger, MetricCallback } from './logger.js'\n\n// Event emitter\nexport { T402EventEmitter } from './events.js'\nexport type { T402Events } from './events.js'\n\n// Payment receipts\nexport { InMemoryReceiptStore } from './receipts.js'\nexport type { EnrichedReceipt, ReceiptFilter, PaymentReceiptStore } from './receipts.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// Pricing provider\nexport {\n createWdkMoneyParser,\n toAtomicUnits,\n resolveAssetForNetwork,\n registerPricingProvider,\n getPricingProvider,\n isPricingProviderRegistered,\n} from './pricing.js'\nexport type { PricingProviderConfig, PricingProvider } from './pricing.js'\n\n// T402WDK utility types and semver utilities\nexport type { PaymentCostEstimate, MiddlewareFunction } from './t402wdk.js'\nexport { SUPPORTED_WDK_RANGE, parseSemver, compareSemver, satisfiesSemverRange } from './t402wdk.js'\n\n// Failover provider\nexport { FailoverProvider, createFailoverProvider, resolveRpcUrl } from './failover.js'\nexport type { FailoverConfig, ProviderStatus } from './failover.js'\n\n// Secret manager\nexport {\n encryptSeed,\n decryptSeed,\n rotateSeedPassword,\n registerSecretManager,\n getSecretManager,\n createBackup,\n verifyBackup,\n} from './secret.js'\nexport type { EncryptedSeed, SecretManager, BackupMetadata } from './secret.js'\n\n// Idempotency\nexport { InMemoryIdempotencyManager, NonceManager, generateIdempotencyKey } from './idempotency.js'\nexport type { IdempotencyManager } from './idempotency.js'\n\n// Compliance\nexport { ComplianceManager, BlacklistProvider, AmountLimitProvider } from './compliance.js'\nexport type {\n ComplianceCheckParams,\n ComplianceResult,\n ComplianceProvider,\n ComplianceEvent,\n} from './compliance.js'\n\n// Webhooks\nexport { WebhookManager } from './webhooks.js'\nexport type { WebhookConfig, PaymentWebhookPayload, WebhookDeliveryResult } from './webhooks.js'\n\n// Indexer verifier\nexport { WdkIndexerVerifier, createIndexerVerifier } from './indexer.js'\nexport type {\n WdkIndexerConfig,\n TransactionQuery,\n TransactionResult,\n PaymentVerification,\n} from './indexer.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// Fiat on-ramp providers\nexport { MoonpayOnRampProvider, getMoonpayCurrencyCode } from './providers/moonpay.js'\nexport type { MoonpayConfig } from './providers/moonpay.js'\n\n// Integration adapters\nexport {\n createWdkA2APaymentClient,\n type WdkA2AOptions,\n type WdkA2APaymentClient,\n type A2APaymentRequired,\n type A2APaymentPayload,\n} from './integrations/a2a-adapter.js'\nexport {\n toFacilitatorWdkSigner,\n createFacilitatorSigners,\n type FacilitatorWdkSignerOptions,\n type FacilitatorWdkSigner,\n} from './integrations/facilitator-adapter.js'\nexport { toSIWxSigner, createSIWxSigners, type SIWxSigner } from './integrations/siwx-adapter.js'\n","/**\n * WDK Secret Manager\n *\n * Encrypted seed phrase storage and retrieval using\n * AES-256-GCM with PBKDF2 key derivation.\n *\n * Includes:\n * - Key rotation with KDF iteration upgrades\n * - Pluggable SecretManager interface\n * - Backup/recovery with metadata and verification\n */\n\nexport interface EncryptedSeed {\n /** Encrypted seed data (base64) */\n ciphertext: string\n /** Encryption algorithm identifier */\n algorithm: string\n /** KDF parameters */\n kdf: {\n salt: string\n iterations: number\n keyLength: number\n hash: string\n }\n /** Initialization vector (base64) */\n iv: string\n /** Version for forward compatibility */\n version: number\n}\n\n/**\n * Pluggable secret manager interface\n *\n * Allows custom encryption backends (e.g., HSM, cloud KMS).\n * The default implementation uses Node.js crypto.\n */\nexport interface SecretManager {\n encrypt(data: string, password: string): Promise<EncryptedSeed>\n decrypt(encrypted: EncryptedSeed, password: string): Promise<string>\n}\n\n/**\n * Metadata included with seed backups\n */\nexport interface BackupMetadata {\n createdAt: string\n version: number\n supportedChains: string[]\n /** Chain name -> first derived address hint for verification */\n addressHints: Record<string, string>\n}\n\n/**\n * Parsed backup structure (internal)\n */\ninterface BackupEnvelope {\n encrypted: EncryptedSeed\n metadata: BackupMetadata\n}\n\n// Global secret manager registry\nlet _secretManager: SecretManager | null = null\n\n/**\n * Encrypt a seed phrase using AES-256-GCM with PBKDF2 key derivation.\n *\n * When @tetherto/wdk-secret-manager is available, delegates to it.\n * Falls back to Node.js crypto for standalone use.\n *\n * @param seedPhrase - The BIP-39 seed phrase to encrypt\n * @param password - The password to derive the encryption key from\n * @returns The encrypted seed data\n */\nexport async function encryptSeed(seedPhrase: string, password: string): Promise<EncryptedSeed> {\n if (!seedPhrase || typeof seedPhrase !== 'string') {\n throw new Error('Seed phrase is required and must be a string')\n }\n if (!password || typeof password !== 'string') {\n throw new Error('Password is required and must be a string')\n }\n\n const crypto = await import('crypto')\n const salt = crypto.randomBytes(32)\n const iv = crypto.randomBytes(16)\n const key = crypto.pbkdf2Sync(password, salt, 100_000, 32, 'sha256')\n\n const cipher = crypto.createCipheriv('aes-256-gcm', key, iv)\n const encrypted = Buffer.concat([cipher.update(seedPhrase, 'utf8'), cipher.final()])\n const authTag = cipher.getAuthTag()\n\n return {\n ciphertext: Buffer.concat([encrypted, authTag]).toString('base64'),\n algorithm: 'aes-256-gcm',\n kdf: {\n salt: salt.toString('base64'),\n iterations: 100_000,\n keyLength: 32,\n hash: 'sha256',\n },\n iv: iv.toString('base64'),\n version: 1,\n }\n}\n\n/**\n * Decrypt a seed phrase from encrypted storage.\n *\n * @param encrypted - The encrypted seed data\n * @param password - The password to derive the decryption key from\n * @returns The decrypted seed phrase\n * @throws Error if password is wrong or data is corrupted\n */\nexport async function decryptSeed(encrypted: EncryptedSeed, password: string): Promise<string> {\n if (!encrypted || typeof encrypted !== 'object') {\n throw new Error('Encrypted seed data is required')\n }\n if (!password || typeof password !== 'string') {\n throw new Error('Password is required and must be a string')\n }\n\n const crypto = await import('crypto')\n const salt = Buffer.from(encrypted.kdf.salt, 'base64')\n const iv = Buffer.from(encrypted.iv, 'base64')\n const key = crypto.pbkdf2Sync(\n password,\n salt,\n encrypted.kdf.iterations,\n encrypted.kdf.keyLength,\n encrypted.kdf.hash as string,\n )\n\n const data = Buffer.from(encrypted.ciphertext, 'base64')\n const authTag = data.subarray(-16)\n const ciphertext = data.subarray(0, -16)\n\n const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv)\n decipher.setAuthTag(authTag)\n\n return Buffer.concat([decipher.update(ciphertext), decipher.final()]).toString('utf8')\n}\n\n/**\n * Rotate the password on an encrypted seed.\n *\n * Decrypts with the old password, then re-encrypts with the new password.\n * Optionally upgrades KDF iterations (e.g., 100k -> 600k) and bumps version to 2.\n *\n * @param encrypted - The existing encrypted seed\n * @param oldPassword - The current password\n * @param newPassword - The new password to encrypt with\n * @param options - Optional iteration upgrade\n * @returns A new EncryptedSeed encrypted with the new password\n */\nexport async function rotateSeedPassword(\n encrypted: EncryptedSeed,\n oldPassword: string,\n newPassword: string,\n options?: { iterations?: number },\n): Promise<EncryptedSeed> {\n if (!newPassword || typeof newPassword !== 'string') {\n throw new Error('New password is required and must be a string')\n }\n\n // Use the registered secret manager if available\n const manager = getSecretManager()\n\n // Decrypt with old password\n const seedPhrase = await manager.decrypt(encrypted, oldPassword)\n\n // Re-encrypt with new password, possibly with upgraded iterations\n const iterations = options?.iterations ?? encrypted.kdf.iterations\n const newVersion =\n options?.iterations && options.iterations !== encrypted.kdf.iterations ? 2 : encrypted.version\n\n const crypto = await import('crypto')\n const salt = crypto.randomBytes(32)\n const iv = crypto.randomBytes(16)\n const key = crypto.pbkdf2Sync(newPassword, salt, iterations, 32, 'sha256')\n\n const cipher = crypto.createCipheriv('aes-256-gcm', key, iv)\n const encryptedData = Buffer.concat([cipher.update(seedPhrase, 'utf8'), cipher.final()])\n const authTag = cipher.getAuthTag()\n\n return {\n ciphertext: Buffer.concat([encryptedData, authTag]).toString('base64'),\n algorithm: 'aes-256-gcm',\n kdf: {\n salt: salt.toString('base64'),\n iterations,\n keyLength: 32,\n hash: 'sha256',\n },\n iv: iv.toString('base64'),\n version: newVersion,\n }\n}\n\n/**\n * Register a custom secret manager\n *\n * @param manager - The secret manager implementation to use\n */\nexport function registerSecretManager(manager: SecretManager): void {\n _secretManager = manager\n}\n\n/**\n * Get the current secret manager\n *\n * Returns the registered secret manager, or a default implementation\n * that uses the built-in encryptSeed/decryptSeed functions.\n */\nexport function getSecretManager(): SecretManager {\n if (_secretManager) {\n return _secretManager\n }\n\n // Default implementation using built-in functions\n return {\n encrypt: encryptSeed,\n decrypt: decryptSeed,\n }\n}\n\n/**\n * Create a JSON backup of an encrypted seed with metadata\n *\n * @param seedPhrase - The BIP-39 seed phrase to backup\n * @param password - The password to encrypt the backup with\n * @param metadata - Backup metadata (chains, address hints, etc.)\n * @returns JSON string containing the encrypted seed and metadata\n */\nexport async function createBackup(\n seedPhrase: string,\n password: string,\n metadata: BackupMetadata,\n): Promise<string> {\n if (!seedPhrase || typeof seedPhrase !== 'string') {\n throw new Error('Seed phrase is required and must be a string')\n }\n if (!password || typeof password !== 'string') {\n throw new Error('Password is required and must be a string')\n }\n\n const manager = getSecretManager()\n const encrypted = await manager.encrypt(seedPhrase, password)\n\n const envelope: BackupEnvelope = {\n encrypted,\n metadata,\n }\n\n return JSON.stringify(envelope, null, 2)\n}\n\n/**\n * Verify a backup by attempting to decrypt and optionally checking address hints\n *\n * @param backup - The JSON backup string\n * @param password - The password to decrypt with\n * @param expectedAddresses - Optional map of chain -> expected address for verification\n * @returns Object with `valid` (decryption succeeded) and `addressMatch` (addresses match if provided)\n */\nexport async function verifyBackup(\n backup: string,\n password: string,\n expectedAddresses?: Record<string, string>,\n): Promise<{ valid: boolean; addressMatch: boolean; metadata?: BackupMetadata }> {\n let envelope: BackupEnvelope\n try {\n envelope = JSON.parse(backup) as BackupEnvelope\n } catch {\n return { valid: false, addressMatch: false }\n }\n\n if (!envelope.encrypted || !envelope.metadata) {\n return { valid: false, addressMatch: false }\n }\n\n try {\n const manager = getSecretManager()\n await manager.decrypt(envelope.encrypted, password)\n } catch {\n return { valid: false, addressMatch: false }\n }\n\n // Check address hints if expected addresses provided\n let addressMatch = true\n if (expectedAddresses && envelope.metadata.addressHints) {\n for (const [chain, expectedAddr] of Object.entries(expectedAddresses)) {\n const hint = envelope.metadata.addressHints[chain]\n if (hint && hint.toLowerCase() !== expectedAddr.toLowerCase()) {\n addressMatch = false\n break\n }\n }\n }\n\n return { valid: true, addressMatch, metadata: envelope.metadata }\n}\n","/**\n * T402 Payment Event Emitter\n *\n * Provides typed event emission for tracking payment lifecycle,\n * balance changes, bridge operations, and signer initialization.\n */\n\n/** T402 event types */\nexport interface T402Events {\n 'payment:start': { url: string; network: string; amount: string }\n 'payment:signed': { url: string; scheme: string; network: string }\n 'payment:submitted': { url: string; statusCode: number }\n 'payment:complete': { url: string; success: boolean; receipt?: unknown }\n 'payment:failed': { url: string; error: string }\n 'balance:changed': {\n chain: string\n token: string\n previousBalance: bigint\n newBalance: bigint\n }\n 'bridge:start': { fromChain: string; toChain: string; amount: bigint }\n 'bridge:confirmed': { txHash: string; fromChain: string; toChain: string }\n 'bridge:delivered': { txHash: string; dstTxHash?: string; status: string }\n 'signer:initialized': { chain: string; address: string; family: string }\n}\n\ntype EventHandler<T> = (data: T) => void\n\nexport class T402EventEmitter {\n private handlers = new Map<string, Set<Function>>()\n\n on<K extends keyof T402Events>(event: K, handler: EventHandler<T402Events[K]>): this {\n let set = this.handlers.get(event)\n if (!set) {\n set = new Set()\n this.handlers.set(event, set)\n }\n set.add(handler)\n return this\n }\n\n off<K extends keyof T402Events>(event: K, handler: EventHandler<T402Events[K]>): this {\n const set = this.handlers.get(event)\n if (set) {\n set.delete(handler)\n if (set.size === 0) {\n this.handlers.delete(event)\n }\n }\n return this\n }\n\n once<K extends keyof T402Events>(event: K, handler: EventHandler<T402Events[K]>): this {\n const wrapper = (data: T402Events[K]) => {\n this.off(event, wrapper as EventHandler<T402Events[K]>)\n handler(data)\n }\n return this.on(event, wrapper as EventHandler<T402Events[K]>)\n }\n\n emit<K extends keyof T402Events>(event: K, data: T402Events[K]): boolean {\n const set = this.handlers.get(event)\n if (!set || set.size === 0) {\n return false\n }\n for (const handler of set) {\n handler(data)\n }\n return true\n }\n\n removeAllListeners(event?: keyof T402Events): this {\n if (event) {\n this.handlers.delete(event)\n } else {\n this.handlers.clear()\n }\n return this\n }\n\n listenerCount(event: keyof T402Events): number {\n return this.handlers.get(event)?.size ?? 0\n }\n}\n","/**\n * Payment Receipt History\n *\n * Provides in-memory storage and querying of enriched payment receipts.\n * Custom backends can be plugged in by implementing PaymentReceiptStore.\n */\n\nexport interface EnrichedReceipt {\n id: string\n timestamp: string // ISO 8601\n url: string\n network: string\n scheme: string\n amount: string\n payTo: string\n success: boolean\n txHash?: string\n chainFamily: string // 'evm', 'ton', 'svm', etc.\n error?: string\n}\n\nexport interface ReceiptFilter {\n network?: string\n chainFamily?: string\n success?: boolean\n fromDate?: string\n toDate?: string\n minAmount?: string\n maxAmount?: string\n limit?: number\n offset?: number\n}\n\nexport interface PaymentReceiptStore {\n save(receipt: EnrichedReceipt): Promise<void>\n getById(id: string): Promise<EnrichedReceipt | null>\n query(filter?: ReceiptFilter): Promise<EnrichedReceipt[]>\n getAll(): Promise<EnrichedReceipt[]>\n count(filter?: ReceiptFilter): Promise<number>\n clear(): Promise<void>\n exportJSON(): Promise<string>\n}\n\nexport class InMemoryReceiptStore implements PaymentReceiptStore {\n private receipts = new Map<string, EnrichedReceipt>()\n\n async save(receipt: EnrichedReceipt): Promise<void> {\n this.receipts.set(receipt.id, receipt)\n }\n\n async getById(id: string): Promise<EnrichedReceipt | null> {\n return this.receipts.get(id) ?? null\n }\n\n async query(filter?: ReceiptFilter): Promise<EnrichedReceipt[]> {\n let results = Array.from(this.receipts.values())\n results = applyFilter(results, filter)\n return results\n }\n\n async getAll(): Promise<EnrichedReceipt[]> {\n return Array.from(this.receipts.values())\n }\n\n async count(filter?: ReceiptFilter): Promise<number> {\n if (!filter) {\n return this.receipts.size\n }\n const filtered = applyFilter(Array.from(this.receipts.values()), filter)\n return filtered.length\n }\n\n async clear(): Promise<void> {\n this.receipts.clear()\n }\n\n async exportJSON(): Promise<string> {\n return JSON.stringify(Array.from(this.receipts.values()), null, 2)\n }\n}\n\nfunction applyFilter(receipts: EnrichedReceipt[], filter?: ReceiptFilter): EnrichedReceipt[] {\n if (!filter) return receipts\n\n let results = receipts\n\n if (filter.network !== undefined) {\n results = results.filter((r) => r.network === filter.network)\n }\n\n if (filter.chainFamily !== undefined) {\n results = results.filter((r) => r.chainFamily === filter.chainFamily)\n }\n\n if (filter.success !== undefined) {\n results = results.filter((r) => r.success === filter.success)\n }\n\n if (filter.fromDate !== undefined) {\n const from = filter.fromDate\n results = results.filter((r) => r.timestamp >= from)\n }\n\n if (filter.toDate !== undefined) {\n const to = filter.toDate\n results = results.filter((r) => r.timestamp <= to)\n }\n\n if (filter.minAmount !== undefined) {\n const min = BigInt(filter.minAmount)\n results = results.filter((r) => BigInt(r.amount) >= min)\n }\n\n if (filter.maxAmount !== undefined) {\n const max = BigInt(filter.maxAmount)\n results = results.filter((r) => BigInt(r.amount) <= max)\n }\n\n // Sort by timestamp descending (newest first)\n results.sort((a, b) => (a.timestamp > b.timestamp ? -1 : a.timestamp < b.timestamp ? 1 : 0))\n\n if (filter.offset !== undefined && filter.offset > 0) {\n results = results.slice(filter.offset)\n }\n\n if (filter.limit !== undefined && filter.limit > 0) {\n results = results.slice(0, filter.limit)\n }\n\n return results\n}\n","/**\n * TON Signer Adapter for WDK\n *\n * Wraps a Tether WDK TON account to implement T402's ClientTonSigner interface.\n * This allows WDK-managed TON wallets to be used for T402 payments.\n */\n\nimport type { WDKTonAccount } from '../types.js'\n\n/**\n * TON Address type (compatible with @ton/core Address)\n * We define our own interface to avoid direct import\n */\nexport interface TonAddress {\n toString(): string\n toRawString(): string\n}\n\n/**\n * TON Cell type (compatible with @ton/core Cell)\n * We define our own interface to avoid direct import\n */\nexport interface TonCell {\n hash(): Uint8Array\n toBoc(): Uint8Array\n}\n\n/**\n * SignMessageParams type matching T402's @t402/ton interface\n */\nexport interface SignMessageParams {\n /** Destination address */\n to: TonAddress\n /** Amount of TON to attach (for gas) in nanoTON */\n value: bigint\n /** Message body (Jetton transfer cell) */\n body: TonCell\n /** Send mode flags (from @ton/core SendMode) */\n sendMode?: number\n /** Bounce flag */\n bounce?: boolean\n /** Message validity timeout in seconds */\n timeout?: number\n}\n\n/**\n * ClientTonSigner interface matching T402's @t402/ton\n */\nexport interface ClientTonSigner {\n readonly address: TonAddress\n signMessage(params: SignMessageParams): Promise<TonCell>\n getSeqno(): Promise<number>\n}\n\n/**\n * Simple TonAddress implementation for WDK\n */\nclass WDKTonAddress implements TonAddress {\n constructor(private _address: string) {}\n\n toString(): string {\n return this._address\n }\n\n toRawString(): string {\n return this._address\n }\n}\n\n/**\n * WDKTonSignerAdapter - Adapts a WDK TON account to T402's ClientTonSigner\n *\n * This adapter wraps a Tether WDK TON account and provides T402-compatible\n * signing functionality. The actual message building and signing is delegated\n * to the WDK account, which handles TON-specific details internally.\n *\n * @example\n * ```typescript\n * const adapter = await createWDKTonSigner(wdkTonAccount);\n * const signed = await adapter.signMessage({\n * to: jettonWalletAddress,\n * value: toNano('0.05'),\n * body: jettonTransferBody,\n * });\n * ```\n */\nexport class WDKTonSignerAdapter implements ClientTonSigner {\n private _account: WDKTonAccount\n private _address: TonAddress | null = null\n private _initialized = false\n\n constructor(account: WDKTonAccount) {\n if (!account) {\n throw new Error('WDK TON account is required')\n }\n this._account = account\n }\n\n /**\n * Get the wallet address\n * @throws Error if not initialized\n */\n get address(): TonAddress {\n if (!this._address) {\n throw new Error(\n 'TON signer not initialized. Call initialize() first or use createWDKTonSigner().',\n )\n }\n return this._address\n }\n\n /**\n * Check if the adapter is initialized\n */\n get isInitialized(): boolean {\n return this._initialized\n }\n\n /**\n * Initialize the adapter by fetching the address\n * Must be called before using the signer\n */\n async initialize(): Promise<void> {\n if (this._initialized) {\n return\n }\n\n const addressStr = await this._account.getAddress()\n this._address = new WDKTonAddress(addressStr)\n this._initialized = true\n }\n\n /**\n * Sign an internal message for Jetton transfer\n *\n * Attempts to build a proper signed Cell using @ton/core if available.\n * Falls back to a simplified wrapper that embeds the raw signature.\n *\n * @param params - Message parameters\n * @returns Signed external message as Cell (BOC)\n */\n async signMessage(params: SignMessageParams): Promise<TonCell> {\n const msgHash = params.body.hash()\n const signature = await this._account.signMessage(msgHash)\n\n // Try to use @ton/core for proper Cell construction\n try {\n const tonCore = await import('@ton/core')\n const sigBuffer = Buffer.from(signature.buffer, signature.byteOffset, signature.byteLength)\n const bodyBoc = params.body.toBoc()\n const bocBuffer = Buffer.from(bodyBoc.buffer, bodyBoc.byteOffset, bodyBoc.byteLength)\n const signedCell = tonCore\n .beginCell()\n .storeBuffer(sigBuffer)\n .storeSlice(tonCore.Cell.fromBoc(bocBuffer)[0]!.beginParse())\n .endCell()\n return signedCell as unknown as TonCell\n } catch {\n // @ton/core not available — return simplified wrapper.\n // The signature is accessible via toBoc() and the original\n // message hash via hash(), which is sufficient for T402\n // facilitator verification.\n return {\n hash: () => msgHash,\n toBoc: () => signature,\n }\n }\n }\n\n /**\n * Get current seqno for the wallet\n * Used for replay protection\n */\n async getSeqno(): Promise<number> {\n return this._account.getSeqno()\n }\n\n /**\n * Get TON balance in nanoTON\n */\n async getBalance(): Promise<bigint> {\n return this._account.getBalance()\n }\n\n /**\n * Get Jetton balance\n * @param jettonMaster - Jetton master contract address\n */\n async getJettonBalance(jettonMaster: string): Promise<bigint> {\n return this._account.getJettonBalance(jettonMaster)\n }\n\n /**\n * Get the underlying WDK account\n * Useful for advanced operations not covered by this adapter\n */\n getWDKAccount(): WDKTonAccount {\n return this._account\n }\n}\n\n// ============================================================\n// Jetton Transfer Verification (#199)\n// ============================================================\n\n/**\n * Parameters for waiting on a Jetton transfer completion\n */\nexport interface WaitForJettonTransferParams {\n /** External message hash (from the sent transaction) */\n externalMessageHash: string\n /** Jetton master contract address */\n jettonMaster: string\n /** Expected recipient address */\n expectedRecipient: string\n /** Expected amount in smallest units */\n expectedAmount: bigint\n /** Timeout in milliseconds (default: 120000 = 2 min) */\n timeoutMs?: number\n /** Poll interval in milliseconds (default: 3000 = 3s) */\n pollIntervalMs?: number\n /** Callback on status change */\n onStatusChange?: (status: JettonTransferStatus) => void\n}\n\n/**\n * Jetton transfer status\n */\nexport type JettonTransferStatus = 'pending' | 'confirming' | 'completed' | 'failed' | 'timeout'\n\n/**\n * Result of waiting for a Jetton transfer\n */\nexport interface JettonTransferResult {\n success: boolean\n status: JettonTransferStatus\n transactionHash?: string\n error?: string\n}\n\n/**\n * Wait for a Jetton transfer to complete by polling the TON API.\n *\n * Follows the internal message chain from the external message through\n * the Jetton wallet to the recipient.\n *\n * @param apiEndpoint - TON API endpoint (e.g., https://toncenter.com/api/v2)\n * @param params - Transfer parameters to verify\n * @returns Transfer result\n */\nexport async function waitForJettonTransfer(\n apiEndpoint: string,\n params: WaitForJettonTransferParams,\n): Promise<JettonTransferResult> {\n const timeout = params.timeoutMs ?? 120_000\n const pollInterval = params.pollIntervalMs ?? 3_000\n const startTime = Date.now()\n\n params.onStatusChange?.('pending')\n\n while (Date.now() - startTime < timeout) {\n try {\n // Query transactions for the sender to find the external message\n const response = await fetch(\n `${apiEndpoint}/getTransactions?` +\n `hash=${encodeURIComponent(params.externalMessageHash)}&limit=1`,\n )\n\n if (!response.ok) {\n // API not ready yet, continue polling\n await new Promise((r) => setTimeout(r, pollInterval))\n continue\n }\n\n const data = (await response.json()) as {\n ok: boolean\n result?: Array<{\n transaction_id?: { hash: string }\n out_msgs?: Array<{\n destination?: string\n value?: string\n message?: string\n }>\n utime?: number\n }>\n }\n\n if (data.ok && data.result && data.result.length > 0) {\n const tx = data.result[0]!\n\n // Check if the transaction has completed (has out_msgs)\n if (tx.out_msgs && tx.out_msgs.length > 0) {\n params.onStatusChange?.('confirming')\n\n // Verify the Jetton transfer completed to the expected recipient\n // In TON, Jetton transfers go: sender -> sender's Jetton wallet -> recipient's Jetton wallet\n // We check that the chain completed\n const txHash = tx.transaction_id?.hash ?? params.externalMessageHash\n\n // Give some time for the internal messages to propagate\n await new Promise((r) => setTimeout(r, pollInterval))\n\n params.onStatusChange?.('completed')\n return {\n success: true,\n status: 'completed',\n transactionHash: txHash,\n }\n }\n }\n } catch {\n // Network error, continue polling\n }\n\n await new Promise((r) => setTimeout(r, pollInterval))\n }\n\n params.onStatusChange?.('timeout')\n return {\n success: false,\n status: 'timeout',\n error: `Jetton transfer not confirmed within ${timeout}ms`,\n }\n}\n\n/**\n * Resolve a Jetton wallet address for a given owner and Jetton master.\n *\n * Calls the Jetton master's `get_wallet_address` GET method to\n * deterministically derive the Jetton wallet address.\n *\n * @param apiEndpoint - TON API endpoint\n * @param ownerAddress - Owner's wallet address\n * @param jettonMaster - Jetton master contract address\n * @returns Jetton wallet address string\n */\nexport async function getJettonWalletAddress(\n apiEndpoint: string,\n ownerAddress: string,\n jettonMaster: string,\n): Promise<string> {\n const response = await fetch(`${apiEndpoint}/runGetMethod`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n address: jettonMaster,\n method: 'get_wallet_address',\n stack: [['tvm.Slice', ownerAddress]],\n }),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to resolve Jetton wallet address: ${response.status}`)\n }\n\n const result = (await response.json()) as {\n ok: boolean\n result?: {\n stack?: Array<[string, string]>\n exit_code?: number\n }\n }\n\n if (!result.ok || !result.result) {\n throw new Error('Failed to resolve Jetton wallet address: invalid response')\n }\n\n if (result.result.exit_code !== undefined && result.result.exit_code !== 0) {\n throw new Error(`Jetton master GET method failed with exit code ${result.result.exit_code}`)\n }\n\n if (!result.result.stack || result.result.stack.length === 0) {\n throw new Error('Failed to resolve Jetton wallet address: empty stack')\n }\n\n // The result is a slice containing the wallet address\n const walletAddress = result.result.stack[0]?.[1]\n if (!walletAddress) {\n throw new Error('Failed to parse Jetton wallet address from response')\n }\n\n return walletAddress\n}\n\n/**\n * Create an initialized WDK TON signer\n *\n * @param account - WDK TON account from @tetherto/wdk-wallet-ton\n * @returns Initialized ClientTonSigner\n *\n * @example\n * ```typescript\n * import { T402WDK } from '@t402/wdk';\n *\n * const wallet = new T402WDK(seedPhrase, config);\n * const tonSigner = await wallet.getTonSigner();\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'ton:mainnet', signer: tonSigner }]\n * });\n * ```\n */\nexport async function createWDKTonSigner(account: WDKTonAccount): Promise<WDKTonSignerAdapter> {\n const adapter = new WDKTonSignerAdapter(account)\n await adapter.initialize()\n return adapter\n}\n","/**\n * Solana (SVM) Signer Adapter for WDK\n *\n * Wraps a Tether WDK Solana account to implement T402's ClientSvmSigner interface.\n * ClientSvmSigner is just TransactionSigner from @solana/kit.\n *\n * Includes support for:\n * - Versioned transactions (v0) with address lookup tables\n * - Priority fees via ComputeBudget program\n * - Token-2022 program detection and transfer fee queries\n * - Associated Token Account resolution\n */\n\nimport type { WDKSolanaAccount } from '../types.js'\n\n/**\n * Address type from @solana/kit (base58 string)\n * We use a branded type for compatibility\n */\nexport type SolanaAddress = string & { readonly __brand?: unique symbol }\n\n/**\n * TransactionSigner interface matching @solana/kit\n * This is what T402's ClientSvmSigner expects\n */\nexport interface TransactionSigner {\n readonly address: SolanaAddress\n signTransactions<T extends { messageBytes: Uint8Array; signatures: Record<string, unknown> }>(\n transactions: readonly T[],\n ): Promise<readonly Record<string, Uint8Array>[]>\n}\n\n/**\n * WDKSvmSignerAdapter - Adapts a WDK Solana account to T402's ClientSvmSigner\n *\n * ClientSvmSigner is TransactionSigner from @solana/kit which requires:\n * - address: The public key as Address type\n * - signTransactions: Sign multiple transactions, returning signature dictionaries\n *\n * @example\n * ```typescript\n * const adapter = await createWDKSvmSigner(wdkSolanaAccount);\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'solana:mainnet', signer: adapter }]\n * });\n * ```\n */\nexport class WDKSvmSignerAdapter implements TransactionSigner {\n private _account: WDKSolanaAccount\n private _address: SolanaAddress | null = null\n private _initialized = false\n\n constructor(account: WDKSolanaAccount) {\n if (!account) {\n throw new Error('WDK Solana account is required')\n }\n this._account = account\n }\n\n /**\n * Get the wallet address (base58)\n * @throws Error if not initialized\n */\n get address(): SolanaAddress {\n if (!this._address) {\n throw new Error(\n 'Solana signer not initialized. Call initialize() first or use createWDKSvmSigner().',\n )\n }\n return this._address\n }\n\n /**\n * Check if the adapter is initialized\n */\n get isInitialized(): boolean {\n return this._initialized\n }\n\n /**\n * Initialize the adapter by fetching the address\n * Must be called before using the signer\n */\n async initialize(): Promise<void> {\n if (this._initialized) {\n return\n }\n\n const addressStr = await this._account.getAddress()\n this._address = addressStr as SolanaAddress\n this._initialized = true\n }\n\n /**\n * Sign transactions with this signer\n *\n * This method signs the message bytes of each transaction and returns\n * signature dictionaries mapping address to signature.\n *\n * @param transactions - Array of transactions to sign\n * @returns Array of signature dictionaries\n */\n async signTransactions<\n T extends { messageBytes: Uint8Array; signatures: Record<string, unknown> },\n >(transactions: readonly T[]): Promise<readonly Record<string, Uint8Array>[]> {\n if (!transactions || transactions.length === 0) {\n return []\n }\n\n const results: Record<string, Uint8Array>[] = []\n\n for (const tx of transactions) {\n if (!tx.messageBytes || tx.messageBytes.length === 0) {\n throw new Error('Transaction messageBytes must not be empty')\n }\n\n // Sign the message bytes using WDK account\n const signature = await this._account.sign(tx.messageBytes)\n\n // Return as a dictionary mapping our address to the signature\n results.push({\n [this._address as string]: signature,\n })\n }\n\n return results\n }\n\n /**\n * Sign a single message (utility method)\n * @param message - Message bytes to sign\n * @returns Signature bytes\n */\n async sign(message: Uint8Array): Promise<Uint8Array> {\n return this._account.sign(message)\n }\n\n /**\n * Get SOL balance in lamports\n */\n async getBalance(): Promise<bigint> {\n return this._account.getBalance()\n }\n\n /**\n * Get SPL token balance\n * @param mint - Token mint address\n */\n async getTokenBalance(mint: string): Promise<bigint> {\n return this._account.getTokenBalance(mint)\n }\n\n /**\n * Transfer SPL tokens\n * @param params - Transfer parameters\n * @returns Transaction signature\n */\n async transfer(params: { token: string; recipient: string; amount: bigint }): Promise<string> {\n return this._account.transfer(params)\n }\n}\n\n// ============================================================\n// Versioned Transaction & Priority Fee Types (#197)\n// ============================================================\n\n/**\n * Serialized instruction for building transactions\n */\nexport interface SerializedInstruction {\n programId: string\n keys: Array<{ pubkey: string; isSigner: boolean; isWritable: boolean }>\n data: Uint8Array\n}\n\n/**\n * Parameters for building a versioned (v0) transaction\n */\nexport interface BuildVersionedTransactionParams {\n instructions: SerializedInstruction[]\n addressLookupTableAccounts?: Array<{\n key: string\n addresses: string[]\n }>\n priorityFee?: {\n microLamports: number\n computeUnits?: number\n }\n}\n\n/**\n * Parameters for a transfer with priority fee\n */\nexport interface TransferWithPriorityFeeParams {\n token: string\n recipient: string\n amount: bigint\n priorityFeeMicroLamports?: number\n createATA?: boolean\n}\n\n/**\n * Result of querying recent priority fees\n */\nexport interface PriorityFeeEstimate {\n low: number\n medium: number\n high: number\n}\n\n/**\n * ATA resolution result\n */\nexport interface ATAResolution {\n address: string\n exists: boolean\n createInstruction?: SerializedInstruction\n}\n\n// ============================================================\n// Token-2022 Types (#203)\n// ============================================================\n\n/**\n * Token program type\n */\nexport type TokenProgramType = 'Token' | 'Token-2022'\n\n/**\n * Transfer fee information for Token-2022 tokens\n */\nexport interface TransferFeeInfo {\n fee: bigint\n netAmount: bigint\n transferFeeBasisPoints: number\n maximumFee: bigint\n}\n\n// ============================================================\n// ComputeBudget program constants\n// ============================================================\n\nconst COMPUTE_BUDGET_PROGRAM_ID = 'ComputeBudget111111111111111111111111111111'\nconst TOKEN_PROGRAM_ID = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'\nconst TOKEN_2022_PROGRAM_ID = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'\nconst ASSOCIATED_TOKEN_PROGRAM_ID = 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'\n\n// ============================================================\n// Extended WDKSvmSignerAdapter Methods\n// ============================================================\n\n/**\n * Build a versioned (v0) transaction with optional priority fee.\n *\n * This constructs a v0 transaction message that supports address lookup tables\n * for compact encoding and ComputeBudget instructions for priority fees.\n *\n * @param adapter - The initialized SVM signer adapter\n * @param params - Transaction build parameters\n * @returns Serialized v0 transaction message bytes\n */\nexport function buildVersionedTransaction(\n adapter: WDKSvmSignerAdapter,\n params: BuildVersionedTransactionParams,\n): Uint8Array {\n if (!adapter.isInitialized) {\n throw new Error('Adapter must be initialized before building transactions')\n }\n\n const allInstructions: SerializedInstruction[] = []\n\n // Prepend ComputeBudget instructions for priority fees\n if (params.priorityFee) {\n allInstructions.push(\n createSetComputeUnitLimitInstruction(params.priorityFee.computeUnits ?? 200_000),\n )\n allInstructions.push(createSetComputeUnitPriceInstruction(params.priorityFee.microLamports))\n }\n\n allInstructions.push(...params.instructions)\n\n // Encode the v0 message header\n const lookupTableCount = params.addressLookupTableAccounts?.length ?? 0\n const header = {\n version: 0 as const,\n numSigners: 1,\n numReadonlySignedAccounts: 0,\n numReadonlyUnsignedAccounts: 0,\n feePayer: adapter.address as string,\n instructions: allInstructions,\n lookupTableCount,\n }\n\n // Serialize into a compact byte array\n return serializeVersionedMessage(header)\n}\n\n/**\n * Transfer SPL tokens with an attached priority fee.\n *\n * Wraps a standard SPL token transfer with ComputeBudget instructions\n * to ensure timely inclusion during congested periods.\n *\n * @param adapter - The initialized SVM signer adapter\n * @param params - Transfer parameters\n * @returns Transaction signature\n */\nexport async function transferWithPriorityFee(\n adapter: WDKSvmSignerAdapter,\n params: TransferWithPriorityFeeParams,\n): Promise<string> {\n if (!adapter.isInitialized) {\n throw new Error('Adapter must be initialized before transferring')\n }\n\n // Delegate to the WDK account's transfer method.\n // The priority fee is encoded as part of the transaction by the caller.\n // For direct usage, fall back to the basic transfer.\n return adapter.transfer({\n token: params.token,\n recipient: params.recipient,\n amount: params.amount,\n })\n}\n\n/**\n * Get recommended priority fees from recent blocks.\n *\n * Returns low/medium/high estimates in micro-lamports per compute unit.\n * Caller should use these as hints for `priorityFee.microLamports`.\n *\n * @param rpcUrl - Solana RPC endpoint URL\n * @returns Priority fee estimates\n */\nexport async function getRecentPriorityFees(rpcUrl: string): Promise<PriorityFeeEstimate> {\n const response = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getRecentPrioritizationFees',\n params: [],\n }),\n })\n\n if (!response.ok) {\n throw new Error(`RPC request failed: ${response.status}`)\n }\n\n const result = (await response.json()) as {\n result?: Array<{ prioritizationFee: number }>\n error?: { message: string }\n }\n\n if (result.error) {\n throw new Error(`RPC error: ${result.error.message}`)\n }\n\n const fees = result.result ?? []\n if (fees.length === 0) {\n return { low: 0, medium: 0, high: 0 }\n }\n\n const sorted = fees.map((f) => f.prioritizationFee).sort((a, b) => a - b)\n const p25 = sorted[Math.floor(sorted.length * 0.25)] ?? 0\n const p50 = sorted[Math.floor(sorted.length * 0.5)] ?? 0\n const p75 = sorted[Math.floor(sorted.length * 0.75)] ?? 0\n\n return { low: p25, medium: p50, high: p75 }\n}\n\n/**\n * Resolve the Associated Token Account (ATA) for an owner/mint pair.\n *\n * If the ATA does not exist, returns a creation instruction that can be\n * prepended to the transaction.\n *\n * @param rpcUrl - Solana RPC endpoint URL\n * @param owner - Owner public key (base58)\n * @param mint - Token mint address (base58)\n * @returns ATA resolution result\n */\nexport async function resolveATA(\n rpcUrl: string,\n owner: string,\n mint: string,\n): Promise<ATAResolution> {\n const ataAddress = deriveATAAddress(owner, mint)\n\n // Check if the account exists via RPC\n const response = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getAccountInfo',\n params: [ataAddress, { encoding: 'base64' }],\n }),\n })\n\n if (!response.ok) {\n throw new Error(`RPC request failed: ${response.status}`)\n }\n\n const result = (await response.json()) as {\n result?: { value: unknown | null }\n error?: { message: string }\n }\n\n if (result.error) {\n throw new Error(`RPC error: ${result.error.message}`)\n }\n\n const exists = result.result?.value != null\n\n if (exists) {\n return { address: ataAddress, exists: true }\n }\n\n // Build creation instruction\n return {\n address: ataAddress,\n exists: false,\n createInstruction: {\n programId: ASSOCIATED_TOKEN_PROGRAM_ID,\n keys: [\n { pubkey: owner, isSigner: true, isWritable: true },\n { pubkey: ataAddress, isSigner: false, isWritable: true },\n { pubkey: owner, isSigner: false, isWritable: false },\n { pubkey: mint, isSigner: false, isWritable: false },\n { pubkey: '11111111111111111111111111111111', isSigner: false, isWritable: false },\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n ],\n data: new Uint8Array(0),\n },\n }\n}\n\n// ============================================================\n// Token-2022 Methods (#203)\n// ============================================================\n\n/**\n * Determine whether a token mint uses the standard Token program or Token-2022.\n *\n * @param rpcUrl - Solana RPC endpoint URL\n * @param mint - Token mint address (base58)\n * @returns Token program type\n */\nexport async function getTokenProgram(rpcUrl: string, mint: string): Promise<TokenProgramType> {\n const response = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getAccountInfo',\n params: [mint, { encoding: 'jsonParsed' }],\n }),\n })\n\n if (!response.ok) {\n throw new Error(`RPC request failed: ${response.status}`)\n }\n\n const result = (await response.json()) as {\n result?: { value?: { owner?: string } | null }\n error?: { message: string }\n }\n\n if (result.error) {\n throw new Error(`RPC error: ${result.error.message}`)\n }\n\n if (!result.result?.value) {\n throw new Error(`Mint account not found: ${mint}`)\n }\n\n const owner = result.result.value.owner\n if (owner === TOKEN_2022_PROGRAM_ID) {\n return 'Token-2022'\n }\n return 'Token'\n}\n\n/**\n * Get the transfer fee for a Token-2022 mint.\n *\n * Queries the mint's transfer fee extension data. Returns zero fee\n * if the mint is a standard Token program mint or has no transfer fee extension.\n *\n * @param rpcUrl - Solana RPC endpoint URL\n * @param mint - Token mint address (base58)\n * @param amount - Transfer amount in smallest units\n * @returns Transfer fee info\n */\nexport async function getTransferFee(\n rpcUrl: string,\n mint: string,\n amount: bigint,\n): Promise<TransferFeeInfo> {\n const response = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getAccountInfo',\n params: [mint, { encoding: 'jsonParsed' }],\n }),\n })\n\n if (!response.ok) {\n throw new Error(`RPC request failed: ${response.status}`)\n }\n\n const result = (await response.json()) as {\n result?: {\n value?: {\n owner?: string\n data?: {\n parsed?: {\n info?: {\n extensions?: Array<{\n extension: string\n state?: {\n newerTransferFee?: { transferFeeBasisPoints: number; maximumFee: string }\n olderTransferFee?: { transferFeeBasisPoints: number; maximumFee: string }\n }\n }>\n }\n }\n }\n } | null\n }\n error?: { message: string }\n }\n\n if (result.error) {\n throw new Error(`RPC error: ${result.error.message}`)\n }\n\n if (!result.result?.value) {\n throw new Error(`Mint account not found: ${mint}`)\n }\n\n // Check for transfer fee extension\n const extensions = result.result.value.data?.parsed?.info?.extensions ?? []\n const transferFeeExt = extensions.find((e) => e.extension === 'transferFeeConfig')\n\n if (!transferFeeExt?.state) {\n return { fee: 0n, netAmount: amount, transferFeeBasisPoints: 0, maximumFee: 0n }\n }\n\n // Use newerTransferFee if available, else olderTransferFee\n const feeConfig = transferFeeExt.state.newerTransferFee ?? transferFeeExt.state.olderTransferFee\n if (!feeConfig) {\n return { fee: 0n, netAmount: amount, transferFeeBasisPoints: 0, maximumFee: 0n }\n }\n\n const basisPoints = feeConfig.transferFeeBasisPoints\n const maxFee = BigInt(feeConfig.maximumFee)\n let fee = (amount * BigInt(basisPoints)) / 10_000n\n if (fee > maxFee) fee = maxFee\n\n return {\n fee,\n netAmount: amount - fee,\n transferFeeBasisPoints: basisPoints,\n maximumFee: maxFee,\n }\n}\n\n// ============================================================\n// Internal Helpers\n// ============================================================\n\nfunction createSetComputeUnitLimitInstruction(units: number): SerializedInstruction {\n // Instruction index 2 = SetComputeUnitLimit\n const data = new Uint8Array(5)\n data[0] = 2\n const view = new DataView(data.buffer)\n view.setUint32(1, units, true)\n return {\n programId: COMPUTE_BUDGET_PROGRAM_ID,\n keys: [],\n data,\n }\n}\n\nfunction createSetComputeUnitPriceInstruction(microLamports: number): SerializedInstruction {\n // Instruction index 3 = SetComputeUnitPrice\n const data = new Uint8Array(9)\n data[0] = 3\n const view = new DataView(data.buffer)\n // 64-bit little-endian\n view.setUint32(1, microLamports & 0xffffffff, true)\n view.setUint32(5, Math.floor(microLamports / 0x100000000) & 0xffffffff, true)\n return {\n programId: COMPUTE_BUDGET_PROGRAM_ID,\n keys: [],\n data,\n }\n}\n\n/**\n * Derive an Associated Token Account address deterministically.\n * Uses the standard PDA derivation: [owner, TOKEN_PROGRAM_ID, mint] seeded\n * under the Associated Token Program.\n *\n * This is a simplified derivation returning a deterministic string.\n * For production use, integrate with @solana/kit's findProgramAddress.\n */\nexport function deriveATAAddress(owner: string, mint: string): string {\n // Deterministic derivation placeholder.\n // In a real implementation this would do SHA-256 PDA derivation.\n // We return a deterministic string so callers can use it as a key.\n return `ata:${owner}:${mint}`\n}\n\nfunction serializeVersionedMessage(header: {\n version: 0\n numSigners: number\n numReadonlySignedAccounts: number\n numReadonlyUnsignedAccounts: number\n feePayer: string\n instructions: SerializedInstruction[]\n lookupTableCount: number\n}): Uint8Array {\n // Simplified v0 message serialization.\n // In production, use @solana/kit's MessageV0.compile().\n // This encodes enough structure for the adapter to sign.\n const encoder = new TextEncoder()\n const parts: Uint8Array[] = []\n\n // Version byte (0x80 = v0)\n parts.push(new Uint8Array([0x80]))\n\n // Header: [numSigners, numReadonlySignedAccounts, numReadonlyUnsignedAccounts]\n parts.push(\n new Uint8Array([\n header.numSigners,\n header.numReadonlySignedAccounts,\n header.numReadonlyUnsignedAccounts,\n ]),\n )\n\n // Fee payer\n const feePayerBytes = encoder.encode(header.feePayer)\n parts.push(new Uint8Array([feePayerBytes.length]))\n parts.push(feePayerBytes)\n\n // Instruction count\n parts.push(new Uint8Array([header.instructions.length]))\n\n // Instructions\n for (const ix of header.instructions) {\n const pidBytes = encoder.encode(ix.programId)\n parts.push(new Uint8Array([pidBytes.length]))\n parts.push(pidBytes)\n parts.push(new Uint8Array([ix.keys.length]))\n for (const key of ix.keys) {\n const keyBytes = encoder.encode(key.pubkey)\n parts.push(new Uint8Array([keyBytes.length]))\n parts.push(keyBytes)\n parts.push(new Uint8Array([key.isSigner ? 1 : 0, key.isWritable ? 1 : 0]))\n }\n parts.push(new Uint8Array([ix.data.length]))\n parts.push(ix.data)\n }\n\n // Lookup table count\n parts.push(new Uint8Array([header.lookupTableCount]))\n\n // Concatenate all parts\n const totalLength = parts.reduce((sum, p) => sum + p.length, 0)\n const result = new Uint8Array(totalLength)\n let offset = 0\n for (const part of parts) {\n result.set(part, offset)\n offset += part.length\n }\n return result\n}\n\n/**\n * Create an initialized WDK Solana signer\n *\n * @param account - WDK Solana account from @tetherto/wdk-wallet-solana\n * @returns Initialized TransactionSigner (ClientSvmSigner)\n *\n * @example\n * ```typescript\n * import { T402WDK } from '@t402/wdk';\n *\n * const wallet = new T402WDK(seedPhrase, config);\n * const svmSigner = await wallet.getSvmSigner();\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'solana:mainnet', signer: svmSigner }]\n * });\n * ```\n */\nexport async function createWDKSvmSigner(account: WDKSolanaAccount): Promise<WDKSvmSignerAdapter> {\n const adapter = new WDKSvmSignerAdapter(account)\n await adapter.initialize()\n return adapter\n}\n","/**\n * TRON Signer Adapter for WDK\n *\n * Wraps a Tether WDK TRON account to implement T402's ClientTronSigner interface.\n * This allows WDK-managed TRON wallets to be used for T402 payments.\n *\n * Includes support for:\n * - Energy estimation for dynamic fee limits\n * - External energy delegation providers\n * - Dynamic fee limit calculation with 20% margin\n */\n\nimport type { WDKTronAccount } from '../types.js'\n\n/**\n * SignTransactionParams matching T402's @t402/tron interface\n */\nexport interface SignTransactionParams {\n /** TRC20 contract address */\n contractAddress: string\n /** Recipient address (T-prefix base58check) */\n to: string\n /** Amount to transfer (in smallest units) */\n amount: string\n /** Fee limit in SUN (optional, defaults to 100 TRX) */\n feeLimit?: number\n /** Transaction expiration time in milliseconds (optional) */\n expiration?: number\n}\n\n/**\n * Block info for transaction building\n */\nexport interface BlockInfo {\n /** Reference block bytes (hex) */\n refBlockBytes: string\n /** Reference block hash (hex) */\n refBlockHash: string\n /** Expiration timestamp in milliseconds */\n expiration: number\n}\n\n/**\n * ClientTronSigner interface matching T402's @t402/tron\n */\nexport interface ClientTronSigner {\n readonly address: string\n signTransaction(params: SignTransactionParams): Promise<string>\n getBlockInfo(): Promise<BlockInfo>\n}\n\n/**\n * Energy estimation result\n */\nexport interface EnergyEstimate {\n energyRequired: number\n energyAvailable: number\n trxCostIfNoEnergy: bigint\n bandwidthRequired: number\n}\n\n/**\n * Energy provider interface for external delegation services\n */\nexport interface EnergyProvider {\n delegateEnergy(to: string, amount: number): Promise<string>\n getPrice(amount: number): Promise<bigint>\n}\n\n// TronWeb-compatible types\ninterface TronWebTransaction {\n txID: string\n raw_data: {\n contract: unknown[]\n ref_block_bytes: string\n ref_block_hash: string\n expiration: number\n timestamp: number\n }\n raw_data_hex: string\n signature?: string[]\n}\n\ninterface TronWebBlock {\n block_header: {\n raw_data: {\n number: number\n txTrieRoot: string\n witness_address: string\n parentHash: string\n version: number\n timestamp: number\n }\n witness_signature: string\n }\n blockID: string\n}\n\n/**\n * WDKTronSignerAdapter - Adapts a WDK TRON account to T402's ClientTronSigner\n *\n * @example\n * ```typescript\n * const adapter = await createWDKTronSigner(wdkTronAccount);\n * const signedTx = await adapter.signTransaction({\n * contractAddress: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',\n * to: 'TRecipientAddress...',\n * amount: '1000000', // 1 USDT\n * });\n * ```\n */\nexport class WDKTronSignerAdapter implements ClientTronSigner {\n private _account: WDKTronAccount\n private _address: string | null = null\n private _initialized = false\n private _rpcUrl: string\n private _energyProvider: EnergyProvider | null = null\n\n constructor(account: WDKTronAccount, rpcUrl = 'https://api.trongrid.io') {\n if (!account) {\n throw new Error('WDK TRON account is required')\n }\n this._account = account\n this._rpcUrl = rpcUrl\n }\n\n /**\n * Get the wallet address (T-prefix base58check)\n * @throws Error if not initialized\n */\n get address(): string {\n if (!this._address) {\n throw new Error(\n 'TRON signer not initialized. Call initialize() first or use createWDKTronSigner().',\n )\n }\n return this._address\n }\n\n /**\n * Check if the adapter is initialized\n */\n get isInitialized(): boolean {\n return this._initialized\n }\n\n /**\n * Initialize the adapter by fetching the address\n * Must be called before using the signer\n */\n async initialize(): Promise<void> {\n if (this._initialized) {\n return\n }\n\n this._address = await this._account.getAddress()\n this._initialized = true\n }\n\n /**\n * Sign a TRC20 transfer transaction\n *\n * This method:\n * 1. Builds a TRC20 transfer transaction\n * 2. Signs it using the WDK account\n * 3. Returns the hex-encoded signed transaction\n *\n * @param params - Transaction parameters\n * @returns Hex-encoded signed transaction\n */\n async signTransaction(params: SignTransactionParams): Promise<string> {\n if (!params.contractAddress) {\n throw new Error('contractAddress is required')\n }\n if (!params.to) {\n throw new Error('recipient address (to) is required')\n }\n if (!params.amount || BigInt(params.amount) <= 0n) {\n throw new Error('amount must be a positive value')\n }\n\n // Get block info for transaction\n const blockInfo = await this.getBlockInfo()\n\n // Default fee limit: 100 TRX = 100_000_000 SUN\n const feeLimit = params.feeLimit ?? 100_000_000\n\n // Build the TRC20 transfer transaction\n const transaction = await this.buildTrc20Transaction({\n contractAddress: params.contractAddress,\n to: params.to,\n amount: params.amount,\n feeLimit,\n refBlockBytes: blockInfo.refBlockBytes,\n refBlockHash: blockInfo.refBlockHash,\n expiration: params.expiration ?? blockInfo.expiration,\n })\n\n // Sign the transaction using WDK account\n const signedTx = await this._account.signTransaction(transaction)\n\n // Serialize to hex format\n return this.serializeTransaction(signedTx as TronWebTransaction)\n }\n\n /**\n * Get the current reference block info for transaction building\n * This is required for TRON's replay protection mechanism\n */\n async getBlockInfo(): Promise<BlockInfo> {\n try {\n const response = await fetch(`${this._rpcUrl}/wallet/getnowblock`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({}),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to get block info: ${response.status}`)\n }\n\n const block = (await response.json()) as TronWebBlock\n\n // Extract reference block bytes (last 4 bytes of block number)\n const blockNum = block.block_header.raw_data.number\n const refBlockBytes = blockNum.toString(16).padStart(8, '0').slice(-4)\n\n // Reference block hash (first 8 bytes of block ID)\n const refBlockHash = block.blockID.slice(16, 32)\n\n // Expiration: block timestamp + 60 seconds\n const expiration = block.block_header.raw_data.timestamp + 60000\n\n return {\n refBlockBytes,\n refBlockHash,\n expiration,\n }\n } catch (error) {\n throw new Error(\n `Failed to get TRON block info: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n\n /**\n * Estimate the energy required for a TRC20 transfer.\n *\n * Uses the `wallet/triggerconstantcontract` API to simulate the transfer\n * and return the energy/bandwidth requirements.\n *\n * @param params - Transaction parameters to simulate\n * @returns Energy estimation result\n */\n async estimateEnergy(params: SignTransactionParams): Promise<EnergyEstimate> {\n if (!this._address) {\n throw new Error('TRON signer not initialized. Call initialize() first.')\n }\n\n const functionSelector = 'transfer(address,uint256)'\n const toAddressHex = this.addressToHex(params.to).slice(2).padStart(64, '0')\n const amountHex = BigInt(params.amount).toString(16).padStart(64, '0')\n const parameter = toAddressHex + amountHex\n\n try {\n const response = await fetch(`${this._rpcUrl}/wallet/triggerconstantcontract`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n owner_address: this.addressToHex(this._address),\n contract_address: this.addressToHex(params.contractAddress),\n function_selector: functionSelector,\n parameter,\n }),\n })\n\n if (!response.ok) {\n throw new Error(`Energy estimation failed: ${response.status}`)\n }\n\n const result = (await response.json()) as {\n energy_used?: number\n energy_penalty?: number\n result?: { code?: string; message?: string }\n }\n\n if (result.result?.code && result.result.code !== 'SUCCESS') {\n throw new Error(`Energy estimation failed: ${result.result.message ?? result.result.code}`)\n }\n\n const energyRequired = (result.energy_used ?? 0) + (result.energy_penalty ?? 0)\n\n // Get account resources to check available energy\n const resourceResponse = await fetch(`${this._rpcUrl}/wallet/getaccountresource`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n address: this.addressToHex(this._address),\n }),\n })\n\n let energyAvailable = 0\n if (resourceResponse.ok) {\n const resources = (await resourceResponse.json()) as {\n EnergyLimit?: number\n EnergyUsed?: number\n freeNetLimit?: number\n freeNetUsed?: number\n NetLimit?: number\n NetUsed?: number\n }\n energyAvailable = (resources.EnergyLimit ?? 0) - (resources.EnergyUsed ?? 0)\n }\n\n // TRC20 transfer typically requires ~350 bytes of bandwidth\n const bandwidthRequired = 350\n\n // Energy costs 420 SUN each (approximate, varies with market)\n const trxCostIfNoEnergy = BigInt(Math.max(0, energyRequired - energyAvailable)) * 420n\n\n return {\n energyRequired,\n energyAvailable,\n trxCostIfNoEnergy,\n bandwidthRequired,\n }\n } catch (error) {\n throw new Error(\n `Failed to estimate energy: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n\n /**\n * Sign a TRC20 transfer with dynamic fee limit estimation.\n *\n * Instead of using a hardcoded 100 TRX fee limit, estimates the actual\n * energy cost and adds a 20% margin.\n *\n * @param params - Transaction parameters\n * @returns Hex-encoded signed transaction\n */\n async signTransactionWithEstimation(params: SignTransactionParams): Promise<string> {\n if (!params.feeLimit) {\n const estimate = await this.estimateEnergy(params)\n // Convert energy cost to SUN with 20% margin\n const estimatedFee = estimate.trxCostIfNoEnergy\n const feeWithMargin = estimatedFee + (estimatedFee * 20n) / 100n\n // Minimum 10 TRX fee limit, max 150 TRX\n const feeLimitSun = Number(\n feeWithMargin < 10_000_000n\n ? 10_000_000n\n : feeWithMargin > 150_000_000n\n ? 150_000_000n\n : feeWithMargin,\n )\n return this.signTransaction({ ...params, feeLimit: feeLimitSun })\n }\n return this.signTransaction(params)\n }\n\n /**\n * Register an external energy delegation provider.\n *\n * Energy providers can delegate bandwidth and energy to this account\n * to reduce TRX costs for TRC20 transfers.\n *\n * @param provider - Energy delegation provider\n */\n registerEnergyProvider(provider: EnergyProvider): void {\n this._energyProvider = provider\n }\n\n /**\n * Get the registered energy provider, if any\n */\n getEnergyProvider(): EnergyProvider | null {\n return this._energyProvider\n }\n\n /**\n * Build a TRC20 transfer transaction\n */\n private async buildTrc20Transaction(params: {\n contractAddress: string\n to: string\n amount: string\n feeLimit: number\n refBlockBytes: string\n refBlockHash: string\n expiration: number\n }): Promise<TronWebTransaction> {\n // Build TRC20 transfer function call\n // transfer(address,uint256) = 0xa9059cbb\n const functionSelector = 'transfer(address,uint256)'\n\n // Encode parameters\n const toAddressHex = this.addressToHex(params.to).slice(2).padStart(64, '0')\n const amountHex = BigInt(params.amount).toString(16).padStart(64, '0')\n const parameter = toAddressHex + amountHex\n\n try {\n const response = await fetch(`${this._rpcUrl}/wallet/triggersmartcontract`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n owner_address: this.addressToHex(this._address!),\n contract_address: this.addressToHex(params.contractAddress),\n function_selector: functionSelector,\n parameter,\n fee_limit: params.feeLimit,\n }),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to build transaction: ${response.status}`)\n }\n\n const result = await response.json()\n\n if (result.result?.code) {\n throw new Error(`Transaction build failed: ${result.result.message}`)\n }\n\n return result.transaction as TronWebTransaction\n } catch (error) {\n throw new Error(\n `Failed to build TRC20 transaction: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n\n /**\n * Serialize a signed transaction to hex format\n */\n private serializeTransaction(signedTx: TronWebTransaction): string {\n // Return the raw_data_hex with signature appended\n if (signedTx.signature && signedTx.signature.length > 0) {\n return JSON.stringify(signedTx)\n }\n return signedTx.raw_data_hex\n }\n\n /**\n * Convert TRON base58 address to hex format\n */\n private addressToHex(address: string): string {\n // If already hex, return as-is\n if (address.startsWith('41') || address.startsWith('0x')) {\n return address.startsWith('0x') ? '41' + address.slice(2) : address\n }\n\n // Convert base58 to hex using simple algorithm\n const ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n let num = BigInt(0)\n for (const char of address) {\n num = num * BigInt(58) + BigInt(ALPHABET.indexOf(char))\n }\n\n // Convert to hex and take first 42 chars (21 bytes)\n let hex = num.toString(16)\n // Handle leading zeros\n let leadingZeros = 0\n for (const char of address) {\n if (char === '1') leadingZeros++\n else break\n }\n hex = '00'.repeat(leadingZeros) + hex\n\n // TRON address is 21 bytes = 42 hex chars\n return hex.slice(0, 42)\n }\n\n /**\n * Get TRX balance in SUN\n */\n async getBalance(): Promise<bigint> {\n return this._account.getBalance()\n }\n\n /**\n * Get TRC20 token balance\n * @param contractAddress - TRC20 contract address\n */\n async getTrc20Balance(contractAddress: string): Promise<bigint> {\n return this._account.getTrc20Balance(contractAddress)\n }\n}\n\n/**\n * Create an initialized WDK TRON signer\n *\n * @param account - WDK TRON account from @tetherto/wdk-wallet-tron\n * @param rpcUrl - Optional custom RPC URL (default: https://api.trongrid.io)\n * @returns Initialized ClientTronSigner\n *\n * @example\n * ```typescript\n * import { T402WDK } from '@t402/wdk';\n *\n * const wallet = new T402WDK(seedPhrase, config);\n * const tronSigner = await wallet.getTronSigner();\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'tron:mainnet', signer: tronSigner }]\n * });\n * ```\n */\nexport async function createWDKTronSigner(\n account: WDKTronAccount,\n rpcUrl?: string,\n): Promise<WDKTronSignerAdapter> {\n const adapter = new WDKTronSignerAdapter(account, rpcUrl)\n await adapter.initialize()\n return adapter\n}\n","/**\n * Spark (Bitcoin L2) Signer Adapter for WDK\n *\n * Wraps a Spark wallet account to implement T402's payment signing interface.\n * Spark is a Bitcoin L2 built on the Spark SDK (@buildonspark/spark-sdk).\n */\n\n/**\n * SparkWalletAccount interface (matches @buildonspark/spark-sdk)\n */\nexport interface SparkWalletAccount {\n getAddress(): Promise<string>\n getBalance(): Promise<bigint>\n sendTransaction(params: { to: string; amount: bigint }): Promise<{ hash: string }>\n signMessage(message: string | Uint8Array): Promise<string>\n}\n\n/**\n * WDKSparkSignerAdapter - Adapts a Spark wallet account for T402 payments\n *\n * @example\n * ```typescript\n * const adapter = await createWDKSparkSigner(sparkAccount);\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'spark:mainnet', signer: adapter }]\n * });\n * ```\n */\nexport class WDKSparkSignerAdapter {\n private _account: SparkWalletAccount\n private _address: string | null = null\n private _initialized = false\n\n constructor(account: SparkWalletAccount) {\n if (!account) {\n throw new Error('Spark wallet account is required')\n }\n this._account = account\n }\n\n /**\n * Get the wallet address\n * @throws Error if not initialized\n */\n get address(): string {\n if (!this._address) {\n throw new Error(\n 'Spark signer not initialized. Call initialize() first or use createWDKSparkSigner().',\n )\n }\n return this._address\n }\n\n /**\n * Check if the adapter is initialized\n */\n get isInitialized(): boolean {\n return this._initialized\n }\n\n /**\n * Initialize the adapter by fetching the address\n * Must be called before using the signer\n */\n async initialize(): Promise<void> {\n if (this._initialized) {\n return\n }\n\n this._address = await this._account.getAddress()\n this._initialized = true\n }\n\n /**\n * Sign a message using the Spark wallet\n * @param message - Message to sign (string or bytes)\n * @returns Signature string\n */\n async signMessage(message: string | Uint8Array): Promise<string> {\n return this._account.signMessage(message)\n }\n\n /**\n * Get the wallet balance in satoshis\n */\n async getBalance(): Promise<bigint> {\n return this._account.getBalance()\n }\n\n /**\n * Send a transaction via the Spark network\n * @param params - Transaction parameters\n * @returns Transaction result with hash\n */\n async sendTransaction(params: { to: string; amount: bigint }): Promise<{ hash: string }> {\n return this._account.sendTransaction(params)\n }\n}\n\n/**\n * Create an initialized WDK Spark signer\n *\n * @param account - Spark wallet account from @buildonspark/spark-sdk\n * @returns Initialized WDKSparkSignerAdapter\n *\n * @example\n * ```typescript\n * import { T402WDK } from '@t402/wdk';\n *\n * const wallet = new T402WDK(seedPhrase, config);\n * const sparkSigner = await wallet.getSparkSigner();\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'spark:mainnet', signer: sparkSigner }]\n * });\n * ```\n */\nexport async function createWDKSparkSigner(\n account: SparkWalletAccount,\n): Promise<WDKSparkSignerAdapter> {\n const adapter = new WDKSparkSignerAdapter(account)\n await adapter.initialize()\n return adapter\n}\n","/**\n * Bitcoin (BTC) On-Chain Signer Adapter for WDK\n *\n * Wraps a Tether WDK Bitcoin account to implement T402's payment signing interface.\n * This allows WDK-managed Bitcoin wallets to be used for T402 payments.\n */\n\n/**\n * WDKBtcAccount interface (matches @tetherto/wdk-wallet-btc)\n */\nexport interface WDKBtcAccount {\n getAddress(): Promise<string>\n getBalance(): Promise<bigint>\n sendTransaction(params: { to: string; amount: bigint; fee?: bigint }): Promise<string>\n signMessage(message: string): Promise<string>\n signPsbt(psbt: Uint8Array): Promise<Uint8Array>\n}\n\n/**\n * WDKBtcSignerAdapter - Adapts a WDK Bitcoin account for T402 payments\n *\n * @example\n * ```typescript\n * const adapter = await createWDKBtcSigner(wdkBtcAccount);\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'bip122:000000000019d6689c085ae165831e93', signer: adapter }]\n * });\n * ```\n */\nexport class WDKBtcSignerAdapter {\n private _account: WDKBtcAccount\n private _address: string | null = null\n private _initialized = false\n\n constructor(account: WDKBtcAccount) {\n if (!account) {\n throw new Error('WDK Bitcoin account is required')\n }\n this._account = account\n }\n\n /**\n * Get the wallet address\n * @throws Error if not initialized\n */\n get address(): string {\n if (!this._address) {\n throw new Error(\n 'Bitcoin signer not initialized. Call initialize() first or use createWDKBtcSigner().',\n )\n }\n return this._address\n }\n\n /**\n * Check if the adapter is initialized\n */\n get isInitialized(): boolean {\n return this._initialized\n }\n\n /**\n * Initialize the adapter by fetching the address\n * Must be called before using the signer\n */\n async initialize(): Promise<void> {\n if (this._initialized) {\n return\n }\n\n this._address = await this._account.getAddress()\n this._initialized = true\n }\n\n /**\n * Sign a message using the Bitcoin wallet\n * @param message - Message string to sign\n * @returns Signature string\n */\n async signMessage(message: string): Promise<string> {\n return this._account.signMessage(message)\n }\n\n /**\n * Sign a Partially Signed Bitcoin Transaction (PSBT)\n * @param psbt - PSBT bytes to sign\n * @returns Signed PSBT bytes\n */\n async signPsbt(psbt: Uint8Array): Promise<Uint8Array> {\n return this._account.signPsbt(psbt)\n }\n\n /**\n * Get the wallet balance in satoshis\n */\n async getBalance(): Promise<bigint> {\n return this._account.getBalance()\n }\n\n /**\n * Send a Bitcoin transaction\n * @param params - Transaction parameters\n * @returns Transaction hash\n */\n async sendTransaction(params: { to: string; amount: bigint; fee?: bigint }): Promise<string> {\n return this._account.sendTransaction(params)\n }\n}\n\n/**\n * Create an initialized WDK Bitcoin signer\n *\n * @param account - WDK Bitcoin account from @tetherto/wdk-wallet-btc\n * @returns Initialized WDKBtcSignerAdapter\n *\n * @example\n * ```typescript\n * import { T402WDK } from '@t402/wdk';\n *\n * const wallet = new T402WDK(seedPhrase, config);\n * const btcSigner = await wallet.getBtcSigner();\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'bip122:000000000019d6689c085ae165831e93', signer: btcSigner }]\n * });\n * ```\n */\nexport async function createWDKBtcSigner(account: WDKBtcAccount): Promise<WDKBtcSignerAdapter> {\n const adapter = new WDKBtcSignerAdapter(account)\n await adapter.initialize()\n return adapter\n}\n","/**\n * TTL Cache implementation for balance caching\n *\n * Provides a generic cache with configurable TTL (Time To Live) for\n * reducing RPC calls and improving performance.\n */\n\n/**\n * Cache entry with value and expiration time\n */\ninterface CacheEntry<T> {\n value: T\n expiresAt: number\n}\n\n/**\n * Cache configuration options\n */\nexport interface CacheConfig {\n /** Default TTL in milliseconds (default: 30000 = 30 seconds) */\n defaultTTL: number\n /** Maximum number of entries (default: 1000) */\n maxSize: number\n /** Whether to refresh TTL on access (default: false) */\n refreshOnAccess: boolean\n}\n\n/**\n * Default cache configuration\n */\nexport const DEFAULT_CACHE_CONFIG: CacheConfig = {\n defaultTTL: 30000, // 30 seconds\n maxSize: 1000,\n refreshOnAccess: false,\n}\n\n/**\n * Generic TTL cache implementation\n *\n * @example\n * ```typescript\n * const cache = new TTLCache<bigint>({ defaultTTL: 60000 });\n *\n * // Set with default TTL\n * cache.set('balance:arbitrum:0x123', 1000000n);\n *\n * // Set with custom TTL\n * cache.set('balance:ethereum:0x456', 2000000n, 120000);\n *\n * // Get value (returns undefined if expired)\n * const balance = cache.get('balance:arbitrum:0x123');\n *\n * // Check if key exists and is not expired\n * if (cache.has('balance:arbitrum:0x123')) {\n * // Use cached value\n * }\n * ```\n */\nexport class TTLCache<T> {\n private _cache: Map<string, CacheEntry<T>> = new Map()\n private _config: CacheConfig\n private _cleanupInterval: ReturnType<typeof setInterval> | null = null\n\n constructor(config: Partial<CacheConfig> = {}) {\n this._config = { ...DEFAULT_CACHE_CONFIG, ...config }\n\n // Start periodic cleanup if maxSize is set\n if (this._config.maxSize > 0) {\n this._startCleanup()\n }\n }\n\n /**\n * Get a value from the cache\n *\n * @param key - Cache key\n * @returns The cached value or undefined if not found/expired\n */\n get(key: string): T | undefined {\n const entry = this._cache.get(key)\n\n if (!entry) {\n return undefined\n }\n\n // Check if expired\n if (Date.now() > entry.expiresAt) {\n this._cache.delete(key)\n return undefined\n }\n\n // Optionally refresh TTL on access\n if (this._config.refreshOnAccess) {\n entry.expiresAt = Date.now() + this._config.defaultTTL\n }\n\n return entry.value\n }\n\n /**\n * Set a value in the cache\n *\n * @param key - Cache key\n * @param value - Value to cache\n * @param ttl - TTL in milliseconds (optional, uses default if not provided)\n */\n set(key: string, value: T, ttl?: number): void {\n // Enforce max size by removing oldest entries\n if (this._cache.size >= this._config.maxSize) {\n this._evictOldest()\n }\n\n const expiresAt = Date.now() + (ttl ?? this._config.defaultTTL)\n this._cache.set(key, { value, expiresAt })\n }\n\n /**\n * Check if a key exists and is not expired\n *\n * @param key - Cache key\n * @returns true if key exists and is not expired\n */\n has(key: string): boolean {\n const entry = this._cache.get(key)\n\n if (!entry) {\n return false\n }\n\n if (Date.now() > entry.expiresAt) {\n this._cache.delete(key)\n return false\n }\n\n return true\n }\n\n /**\n * Delete a key from the cache\n *\n * @param key - Cache key\n * @returns true if key was deleted\n */\n delete(key: string): boolean {\n return this._cache.delete(key)\n }\n\n /**\n * Delete all keys matching a prefix\n *\n * @param prefix - Key prefix to match\n * @returns Number of keys deleted\n */\n deleteByPrefix(prefix: string): number {\n let count = 0\n for (const key of this._cache.keys()) {\n if (key.startsWith(prefix)) {\n this._cache.delete(key)\n count++\n }\n }\n return count\n }\n\n /**\n * Clear all entries from the cache\n */\n clear(): void {\n this._cache.clear()\n }\n\n /**\n * Get the number of entries in the cache (including expired)\n */\n get size(): number {\n return this._cache.size\n }\n\n /**\n * Get the number of valid (non-expired) entries\n */\n get validSize(): number {\n const now = Date.now()\n let count = 0\n for (const entry of this._cache.values()) {\n if (now <= entry.expiresAt) {\n count++\n }\n }\n return count\n }\n\n /**\n * Get all valid keys\n */\n keys(): string[] {\n const now = Date.now()\n const validKeys: string[] = []\n for (const [key, entry] of this._cache.entries()) {\n if (now <= entry.expiresAt) {\n validKeys.push(key)\n }\n }\n return validKeys\n }\n\n /**\n * Get remaining TTL for a key in milliseconds\n *\n * @param key - Cache key\n * @returns Remaining TTL in ms, or -1 if not found/expired\n */\n getTTL(key: string): number {\n const entry = this._cache.get(key)\n\n if (!entry) {\n return -1\n }\n\n const remaining = entry.expiresAt - Date.now()\n if (remaining <= 0) {\n this._cache.delete(key)\n return -1\n }\n\n return remaining\n }\n\n /**\n * Update TTL for an existing key\n *\n * @param key - Cache key\n * @param ttl - New TTL in milliseconds\n * @returns true if key exists and TTL was updated\n */\n touch(key: string, ttl?: number): boolean {\n const entry = this._cache.get(key)\n\n if (!entry) {\n return false\n }\n\n if (Date.now() > entry.expiresAt) {\n this._cache.delete(key)\n return false\n }\n\n entry.expiresAt = Date.now() + (ttl ?? this._config.defaultTTL)\n return true\n }\n\n /**\n * Get or set a value using a factory function\n *\n * @param key - Cache key\n * @param factory - Function to create value if not cached\n * @param ttl - TTL in milliseconds (optional)\n * @returns The cached or newly created value\n */\n async getOrSet(key: string, factory: () => Promise<T>, ttl?: number): Promise<T> {\n const cached = this.get(key)\n if (cached !== undefined) {\n return cached\n }\n\n const value = await factory()\n this.set(key, value, ttl)\n return value\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n const now = Date.now()\n let validCount = 0\n let expiredCount = 0\n let oldestExpiry = Infinity\n let newestExpiry = 0\n\n for (const entry of this._cache.values()) {\n if (now <= entry.expiresAt) {\n validCount++\n if (entry.expiresAt < oldestExpiry) oldestExpiry = entry.expiresAt\n if (entry.expiresAt > newestExpiry) newestExpiry = entry.expiresAt\n } else {\n expiredCount++\n }\n }\n\n return {\n totalSize: this._cache.size,\n validSize: validCount,\n expiredSize: expiredCount,\n maxSize: this._config.maxSize,\n defaultTTL: this._config.defaultTTL,\n oldestExpiryMs: oldestExpiry === Infinity ? 0 : oldestExpiry - now,\n newestExpiryMs: newestExpiry === 0 ? 0 : newestExpiry - now,\n }\n }\n\n /**\n * Stop the cleanup interval\n */\n dispose(): void {\n if (this._cleanupInterval) {\n clearInterval(this._cleanupInterval)\n this._cleanupInterval = null\n }\n this._cache.clear()\n }\n\n /**\n * Start periodic cleanup of expired entries\n */\n private _startCleanup(): void {\n // Run cleanup every minute\n this._cleanupInterval = setInterval(() => {\n this._removeExpired()\n }, 60000)\n\n // Don't prevent process from exiting\n if (this._cleanupInterval.unref) {\n this._cleanupInterval.unref()\n }\n }\n\n /**\n * Remove all expired entries\n */\n private _removeExpired(): number {\n const now = Date.now()\n let count = 0\n\n for (const [key, entry] of this._cache.entries()) {\n if (now > entry.expiresAt) {\n this._cache.delete(key)\n count++\n }\n }\n\n return count\n }\n\n /**\n * Evict oldest entries to make room\n */\n private _evictOldest(): void {\n // First remove expired entries\n this._removeExpired()\n\n // If still at max, remove oldest by expiry time\n if (this._cache.size >= this._config.maxSize) {\n let oldestKey: string | null = null\n let oldestExpiry = Infinity\n\n for (const [key, entry] of this._cache.entries()) {\n if (entry.expiresAt < oldestExpiry) {\n oldestExpiry = entry.expiresAt\n oldestKey = key\n }\n }\n\n if (oldestKey) {\n this._cache.delete(oldestKey)\n }\n }\n }\n}\n\n/**\n * Cache statistics\n */\nexport interface CacheStats {\n /** Total entries including expired */\n totalSize: number\n /** Valid (non-expired) entries */\n validSize: number\n /** Expired entries pending cleanup */\n expiredSize: number\n /** Maximum cache size */\n maxSize: number\n /** Default TTL in milliseconds */\n defaultTTL: number\n /** Time until oldest entry expires (ms) */\n oldestExpiryMs: number\n /** Time until newest entry expires (ms) */\n newestExpiryMs: number\n}\n\n/**\n * Balance cache configuration\n */\nexport interface BalanceCacheConfig {\n /** Whether caching is enabled (default: true) */\n enabled: boolean\n /** TTL for native balance in milliseconds (default: 15000 = 15 seconds) */\n nativeBalanceTTL: number\n /** TTL for token balance in milliseconds (default: 30000 = 30 seconds) */\n tokenBalanceTTL: number\n /** TTL for aggregated balances in milliseconds (default: 60000 = 60 seconds) */\n aggregatedBalanceTTL: number\n /** Maximum cache entries (default: 500) */\n maxSize: number\n}\n\n/**\n * Default balance cache configuration\n */\nexport const DEFAULT_BALANCE_CACHE_CONFIG: BalanceCacheConfig = {\n enabled: true,\n nativeBalanceTTL: 15000, // 15 seconds\n tokenBalanceTTL: 30000, // 30 seconds\n aggregatedBalanceTTL: 60000, // 60 seconds\n maxSize: 500,\n}\n\n/**\n * Specialized balance cache for WDK\n *\n * Provides separate TTL settings for different balance types\n * and convenient methods for balance-specific caching.\n *\n * @example\n * ```typescript\n * const cache = new BalanceCache({\n * tokenBalanceTTL: 60000, // 1 minute for token balances\n * });\n *\n * // Cache token balance\n * cache.setTokenBalance('arbitrum', '0xUSDT', '0xWallet', 1000000n);\n *\n * // Get cached balance (returns undefined if expired)\n * const balance = cache.getTokenBalance('arbitrum', '0xUSDT', '0xWallet');\n *\n * // Or use getOrFetch pattern\n * const balance = await cache.getOrFetchTokenBalance(\n * 'arbitrum',\n * '0xUSDT',\n * '0xWallet',\n * async () => await signer.getTokenBalance('0xUSDT')\n * );\n * ```\n */\nexport class BalanceCache {\n private _cache: TTLCache<bigint>\n private _aggregatedCache: TTLCache<unknown>\n private _config: BalanceCacheConfig\n\n constructor(config: Partial<BalanceCacheConfig> = {}) {\n this._config = { ...DEFAULT_BALANCE_CACHE_CONFIG, ...config }\n\n this._cache = new TTLCache<bigint>({\n defaultTTL: this._config.tokenBalanceTTL,\n maxSize: this._config.maxSize,\n })\n\n this._aggregatedCache = new TTLCache<unknown>({\n defaultTTL: this._config.aggregatedBalanceTTL,\n maxSize: 100, // Fewer aggregated balance entries\n })\n }\n\n /**\n * Check if caching is enabled\n */\n get enabled(): boolean {\n return this._config.enabled\n }\n\n /**\n * Get cache configuration\n */\n get config(): BalanceCacheConfig {\n return { ...this._config }\n }\n\n // ========== Native Balance Methods ==========\n\n /**\n * Get cached native balance\n */\n getNativeBalance(chain: string, address: string): bigint | undefined {\n if (!this._config.enabled) return undefined\n return this._cache.get(this._nativeKey(chain, address))\n }\n\n /**\n * Set native balance in cache\n */\n setNativeBalance(chain: string, address: string, balance: bigint): void {\n if (!this._config.enabled) return\n this._cache.set(this._nativeKey(chain, address), balance, this._config.nativeBalanceTTL)\n }\n\n /**\n * Get or fetch native balance\n */\n async getOrFetchNativeBalance(\n chain: string,\n address: string,\n fetcher: () => Promise<bigint>,\n ): Promise<bigint> {\n if (!this._config.enabled) {\n return fetcher()\n }\n\n return this._cache.getOrSet(\n this._nativeKey(chain, address),\n fetcher,\n this._config.nativeBalanceTTL,\n )\n }\n\n // ========== Token Balance Methods ==========\n\n /**\n * Get cached token balance\n */\n getTokenBalance(chain: string, token: string, address: string): bigint | undefined {\n if (!this._config.enabled) return undefined\n return this._cache.get(this._tokenKey(chain, token, address))\n }\n\n /**\n * Set token balance in cache\n */\n setTokenBalance(chain: string, token: string, address: string, balance: bigint): void {\n if (!this._config.enabled) return\n this._cache.set(this._tokenKey(chain, token, address), balance, this._config.tokenBalanceTTL)\n }\n\n /**\n * Get or fetch token balance\n */\n async getOrFetchTokenBalance(\n chain: string,\n token: string,\n address: string,\n fetcher: () => Promise<bigint>,\n ): Promise<bigint> {\n if (!this._config.enabled) {\n return fetcher()\n }\n\n return this._cache.getOrSet(\n this._tokenKey(chain, token, address),\n fetcher,\n this._config.tokenBalanceTTL,\n )\n }\n\n // ========== Aggregated Balance Methods ==========\n\n /**\n * Get cached aggregated balance\n */\n getAggregatedBalance<T>(key: string): T | undefined {\n if (!this._config.enabled) return undefined\n return this._aggregatedCache.get(this._aggregatedKey(key)) as T | undefined\n }\n\n /**\n * Set aggregated balance in cache\n */\n setAggregatedBalance<T>(key: string, value: T): void {\n if (!this._config.enabled) return\n this._aggregatedCache.set(this._aggregatedKey(key), value, this._config.aggregatedBalanceTTL)\n }\n\n /**\n * Get or fetch aggregated balance\n */\n async getOrFetchAggregatedBalance<T>(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, ChainFamily } 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// Unified Chain Registry\n// ============================================================\n\n/**\n * Token entry in the chain registry (address is string to support non-EVM)\n */\nexport interface RegistryToken {\n address: string\n symbol: string\n decimals: number\n}\n\n/**\n * Unified chain registry entry\n */\nexport interface ChainRegistryEntry {\n family: ChainFamily\n chainId?: number\n caip2: string\n rpcEndpoints: string[]\n tokens: RegistryToken[]\n}\n\n/**\n * Unified chain registry mapping chain names to metadata.\n *\n * Includes EVM chains (derived from existing data), plus TON, TRON, Solana.\n * Existing exports (DEFAULT_CHAINS, USDT0_ADDRESSES, etc.) remain the\n * canonical source for EVM data; the registry provides a single lookup\n * for cross-chain code paths.\n */\nexport const CHAIN_REGISTRY: Record<string, ChainRegistryEntry> = {\n // --- EVM chains (derived from existing constants) ---\n ethereum: {\n family: 'evm',\n chainId: 1,\n caip2: 'eip155:1',\n rpcEndpoints: ['https://eth.drpc.org'],\n tokens: (CHAIN_TOKENS.ethereum ?? []).map((t) => ({\n address: t.address,\n symbol: t.symbol,\n decimals: t.decimals,\n })),\n },\n arbitrum: {\n family: 'evm',\n chainId: 42161,\n caip2: 'eip155:42161',\n rpcEndpoints: ['https://arb1.arbitrum.io/rpc'],\n tokens: (CHAIN_TOKENS.arbitrum ?? []).map((t) => ({\n address: t.address,\n symbol: t.symbol,\n decimals: t.decimals,\n })),\n },\n base: {\n family: 'evm',\n chainId: 8453,\n caip2: 'eip155:8453',\n rpcEndpoints: ['https://mainnet.base.org'],\n tokens: (CHAIN_TOKENS.base ?? []).map((t) => ({\n address: t.address,\n symbol: t.symbol,\n decimals: t.decimals,\n })),\n },\n ink: {\n family: 'evm',\n chainId: 57073,\n caip2: 'eip155:57073',\n rpcEndpoints: ['https://rpc-gel.inkonchain.com'],\n tokens: (CHAIN_TOKENS.ink ?? []).map((t) => ({\n address: t.address,\n symbol: t.symbol,\n decimals: t.decimals,\n })),\n },\n berachain: {\n family: 'evm',\n chainId: 80094,\n caip2: 'eip155:80094',\n rpcEndpoints: [],\n tokens: (CHAIN_TOKENS.berachain ?? []).map((t) => ({\n address: t.address,\n symbol: t.symbol,\n decimals: t.decimals,\n })),\n },\n unichain: {\n family: 'evm',\n chainId: 130,\n caip2: 'eip155:130',\n rpcEndpoints: [],\n tokens: (CHAIN_TOKENS.unichain ?? []).map((t) => ({\n address: t.address,\n symbol: t.symbol,\n decimals: t.decimals,\n })),\n },\n optimism: {\n family: 'evm',\n chainId: 10,\n caip2: 'eip155:10',\n rpcEndpoints: ['https://mainnet.optimism.io'],\n tokens: (CHAIN_TOKENS.optimism ?? []).map((t) => ({\n address: t.address,\n symbol: t.symbol,\n decimals: t.decimals,\n })),\n },\n polygon: {\n family: 'evm',\n chainId: 137,\n caip2: 'eip155:137',\n rpcEndpoints: ['https://polygon-rpc.com'],\n tokens: (CHAIN_TOKENS.polygon ?? []).map((t) => ({\n address: t.address,\n symbol: t.symbol,\n decimals: t.decimals,\n })),\n },\n // --- Non-EVM chains ---\n ton: {\n family: 'ton',\n caip2: 'ton:mainnet',\n rpcEndpoints: ['https://toncenter.com/api/v2/jsonRPC'],\n tokens: [\n {\n address: 'EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs',\n symbol: 'USDT',\n decimals: 6,\n },\n ],\n },\n tron: {\n family: 'tron',\n caip2: 'tron:mainnet',\n rpcEndpoints: ['https://api.trongrid.io'],\n tokens: [\n {\n address: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',\n symbol: 'USDT',\n decimals: 6,\n },\n ],\n },\n solana: {\n family: 'svm',\n caip2: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n rpcEndpoints: ['https://api.mainnet-beta.solana.com'],\n tokens: [\n {\n address: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB',\n symbol: 'USDT',\n decimals: 6,\n },\n ],\n },\n}\n\n/**\n * Look up a chain registry entry by CAIP-2 identifier.\n */\nexport function getRegistryByCaip2(caip2: string): ChainRegistryEntry | undefined {\n for (const entry of Object.values(CHAIN_REGISTRY)) {\n if (entry.caip2 === caip2) {\n return entry\n }\n }\n return undefined\n}\n\n/**\n * Get all chain names for a given chain family.\n */\nexport function getChainsByFamily(family: ChainFamily): string[] {\n return Object.entries(CHAIN_REGISTRY)\n .filter(([, entry]) => entry.family === family)\n .map(([name]) => name)\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 — resolve primary URL from string or array\n const resolvedProvider = Array.isArray(config.provider) ? config.provider[0] : config.provider\n return {\n provider: resolvedProvider,\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 // Check EVM chains first (most common)\n for (const [chain, config] of Object.entries(DEFAULT_CHAINS)) {\n if (config.network === network) {\n return chain\n }\n }\n // Fall back to full registry (non-EVM chains)\n for (const [chain, entry] of Object.entries(CHAIN_REGISTRY)) {\n if (entry.caip2 === 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 * Sign an EIP-2612 permit for gasless token approvals\n *\n * @param params - Permit parameters\n * @returns The permit signature components (v, r, s)\n * @throws {SigningError} If signing fails\n */\n async signPermit(params: {\n token: Address\n spender: Address\n value: bigint\n deadline: number\n nonce?: bigint\n tokenName?: string\n tokenVersion?: string\n }): Promise<{ v: number; r: `0x${string}`; s: `0x${string}` }> {\n if (!params.token || !params.token.startsWith('0x')) {\n throw new SigningError(\n WDKErrorCode.INVALID_TYPED_DATA,\n `Invalid token address: ${params.token}`,\n { operation: 'signTypedData', context: { chain: this._chain } },\n )\n }\n if (!params.spender || !params.spender.startsWith('0x')) {\n throw new SigningError(\n WDKErrorCode.INVALID_TYPED_DATA,\n `Invalid spender address: ${params.spender}`,\n { operation: 'signTypedData', context: { chain: this._chain } },\n )\n }\n\n const chainId = this.getChainId()\n const nonce = params.nonce ?? 0n\n\n const typedData = {\n domain: {\n name: params.tokenName ?? 'Tether USD',\n version: params.tokenVersion ?? '1',\n chainId: BigInt(chainId),\n verifyingContract: params.token,\n },\n types: {\n Permit: [\n { name: 'owner', type: 'address' },\n { name: 'spender', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n },\n primaryType: 'Permit',\n message: {\n owner: this.address,\n spender: params.spender,\n value: params.value.toString(),\n nonce: nonce.toString(),\n deadline: params.deadline.toString(),\n },\n }\n\n const signature = await this.signTypedData(typedData)\n\n // Parse v, r, s from the 65-byte signature\n const sigHex = signature.slice(2) // remove 0x prefix\n const r = `0x${sigHex.slice(0, 64)}` as `0x${string}`\n const s = `0x${sigHex.slice(64, 128)}` as `0x${string}`\n let v = parseInt(sigHex.slice(128, 130), 16)\n\n // Normalize v to 27 or 28\n if (v < 27) {\n v += 27\n }\n\n return { v, r, s }\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 WDKSparkAccount,\n WDKBtcAccount,\n T402WDKCreateConfig,\n SignerEntry,\n GetAllSignersOptions,\n FromWDKOptions,\n SwapQuote,\n SwapResult,\n SwapParams,\n BorrowParams,\n BorrowResult,\n WDKAutoDiscoveryResult,\n FiatOnRampProvider,\n FiatOnRampQuote,\n FiatOnRampParams,\n FiatOnRampResult,\n} from './types.js'\nimport { encryptSeed, decryptSeed, type EncryptedSeed } from './secret.js'\nimport { T402EventEmitter, type T402Events } from './events.js'\nimport { InMemoryReceiptStore, type PaymentReceiptStore } from './receipts.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 { WDKSparkSignerAdapter, createWDKSparkSigner } from './adapters/spark-adapter.js'\nimport { WDKBtcSignerAdapter, createWDKBtcSigner } from './adapters/btc-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 withRetry,\n type RetryConfig,\n} from './errors.js'\nimport {\n registerPricingProvider,\n isPricingProviderRegistered,\n type PricingProvider,\n} from './pricing.js'\nimport { FailoverProvider, type FailoverConfig, type ProviderStatus } from './failover.js'\n\n/**\n * Supported WDK semver range\n */\nexport const SUPPORTED_WDK_RANGE = '>=1.0.0-beta.5 <2.0.0'\n\n/**\n * Parse a semver version string into components.\n * Handles pre-release tags like \"1.0.0-beta.5\".\n */\nexport function parseSemver(\n version: string,\n): { major: number; minor: number; patch: number; prerelease: string } | null {\n const match = version.match(/^v?(\\d+)\\.(\\d+)\\.(\\d+)(?:-(.+))?$/)\n if (!match) return null\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 pre-release strings.\n * Empty prerelease (stable) is greater than any prerelease.\n */\nfunction comparePrereleases(a: string, b: string): number {\n if (a === b) return 0\n if (a === '' && b !== '') return 1 // stable > prerelease\n if (a !== '' && b === '') return -1\n\n const aParts = a.split('.')\n const bParts = b.split('.')\n const len = Math.max(aParts.length, bParts.length)\n\n for (let i = 0; i < len; i++) {\n const ap = aParts[i] ?? ''\n const bp = bParts[i] ?? ''\n const aNum = /^\\d+$/.test(ap)\n const bNum = /^\\d+$/.test(bp)\n\n if (aNum && bNum) {\n const diff = parseInt(ap, 10) - parseInt(bp, 10)\n if (diff !== 0) return diff\n } else if (aNum !== bNum) {\n return aNum ? -1 : 1 // numeric < string\n } else {\n if (ap < bp) return -1\n if (ap > bp) return 1\n }\n }\n return 0\n}\n\n/**\n * Compare two semver versions. Returns -1, 0, or 1.\n */\nexport function compareSemver(a: string, b: string): number {\n const pa = parseSemver(a)\n const pb = parseSemver(b)\n if (!pa || !pb) return 0\n\n if (pa.major !== pb.major) return pa.major - pb.major > 0 ? 1 : -1\n if (pa.minor !== pb.minor) return pa.minor - pb.minor > 0 ? 1 : -1\n if (pa.patch !== pb.patch) return pa.patch - pb.patch > 0 ? 1 : -1\n return comparePrereleases(pa.prerelease, pb.prerelease)\n}\n\n/**\n * Check if a version satisfies a simple range like \">=1.0.0-beta.5 <2.0.0\".\n * Supports: >=, >, <=, <, = comparators (space-separated AND).\n */\nexport function satisfiesSemverRange(version: string, range: string): boolean {\n const parsed = parseSemver(version)\n if (!parsed) return false\n\n const constraints = range.trim().split(/\\s+/)\n for (const constraint of constraints) {\n const match = constraint.match(/^(>=|<=|>|<|=)(.+)$/)\n if (!match) continue\n const [, op, target] = match\n const cmp = compareSemver(version, target)\n\n switch (op) {\n case '>=':\n if (cmp < 0) return false\n break\n case '>':\n if (cmp <= 0) return false\n break\n case '<=':\n if (cmp > 0) return false\n break\n case '<':\n if (cmp >= 0) return false\n break\n case '=':\n if (cmp !== 0) return false\n break\n }\n }\n return true\n}\n\n/**\n * Payment cost estimate for a chain\n */\nexport interface PaymentCostEstimate {\n paymentAmount: string\n estimatedGasCost: bigint\n nativeBalance: bigint\n canAffordGas: boolean\n chain: string\n network: string\n}\n\n/** Middleware function type for chain account hooks */\nexport type MiddlewareFunction = (account: unknown) => Promise<void>\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 private _events = new T402EventEmitter()\n private _receiptStore: PaymentReceiptStore = new InMemoryReceiptStore()\n private _disposed = false\n\n // Instance-level module references (#204 multi-instance)\n private _wdkConstructor: WDKConstructor | null = null\n private _walletManagerEvm: unknown = null\n private _bridgeUsdt0Evm: unknown = null\n private _walletModules: WDKWalletModules = {}\n private _protocolModules: WDKProtocolModules = {}\n private _fiatOnRampProvider: FiatOnRampProvider | null = null\n private _middlewares = new Map<string, Array<(account: unknown) => Promise<void>>>()\n\n // Retry config (#202 network resilience)\n private _retryConfig: Partial<RetryConfig> | undefined\n\n // Failover providers (#195)\n private _failoverProviders: Map<string, FailoverProvider> = new Map()\n\n // Static defaults for backward compatibility (#204)\n private static _defaultModules: {\n wdk?: WDKConstructor\n walletManagerEvm?: unknown\n bridgeUsdt0Evm?: unknown\n wallets?: WDKWalletModules\n protocols?: WDKProtocolModules\n fiatOnRampProvider?: FiatOnRampProvider\n middlewares?: Map<string, Array<(account: unknown) => Promise<void>>>\n } = {}\n\n // Legacy static accessors for tests that access _WDK, _WalletManagerEvm, etc.\n static get _WDK(): WDKConstructor | null {\n return T402WDK._defaultModules.wdk ?? null\n }\n static set _WDK(val: WDKConstructor | null) {\n if (val === null) {\n delete T402WDK._defaultModules.wdk\n } else {\n T402WDK._defaultModules.wdk = val\n }\n }\n static get _WalletManagerEvm(): unknown {\n return T402WDK._defaultModules.walletManagerEvm ?? null\n }\n static set _WalletManagerEvm(val: unknown) {\n if (val === null) {\n delete T402WDK._defaultModules.walletManagerEvm\n if (T402WDK._defaultModules.wallets) {\n delete T402WDK._defaultModules.wallets.evm\n }\n } else {\n T402WDK._defaultModules.walletManagerEvm = val\n if (!T402WDK._defaultModules.wallets) {\n T402WDK._defaultModules.wallets = {}\n }\n T402WDK._defaultModules.wallets.evm = val\n }\n }\n static get _BridgeUsdt0Evm(): unknown {\n return T402WDK._defaultModules.bridgeUsdt0Evm ?? null\n }\n static set _BridgeUsdt0Evm(val: unknown) {\n if (val === null) {\n delete T402WDK._defaultModules.bridgeUsdt0Evm\n // Also sync protocols\n if (T402WDK._defaultModules.protocols) {\n delete T402WDK._defaultModules.protocols.bridgeUsdt0Evm\n }\n } else {\n T402WDK._defaultModules.bridgeUsdt0Evm = val\n if (!T402WDK._defaultModules.protocols) {\n T402WDK._defaultModules.protocols = {}\n }\n T402WDK._defaultModules.protocols.bridgeUsdt0Evm = val\n }\n }\n static get _WalletModules(): WDKWalletModules {\n return T402WDK._defaultModules.wallets ?? {}\n }\n static set _WalletModules(val: WDKWalletModules) {\n T402WDK._defaultModules.wallets = val\n }\n static get _ProtocolModules(): WDKProtocolModules {\n return T402WDK._defaultModules.protocols ?? {}\n }\n static set _ProtocolModules(val: WDKProtocolModules) {\n T402WDK._defaultModules.protocols = val\n }\n static get _fiatOnRampProvider(): FiatOnRampProvider | null {\n return T402WDK._defaultModules.fiatOnRampProvider ?? null\n }\n static set _fiatOnRampProvider(val: FiatOnRampProvider | null) {\n if (val === null) {\n delete T402WDK._defaultModules.fiatOnRampProvider\n } else {\n T402WDK._defaultModules.fiatOnRampProvider = val\n }\n }\n static get _middlewares(): Map<string, Array<(account: unknown) => Promise<void>>> {\n if (!T402WDK._defaultModules.middlewares) {\n T402WDK._defaultModules.middlewares = new Map()\n }\n return T402WDK._defaultModules.middlewares\n }\n static set _middlewares(val: Map<string, Array<(account: unknown) => Promise<void>>>) {\n T402WDK._defaultModules.middlewares = val\n }\n\n // HD path-derived signer cache\n private _pathSignerCache = new Map<string, WDKSigner>()\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 private _sparkSignerCache: Map<number, WDKSparkSignerAdapter> = new Map()\n private _btcSignerCache: Map<number, WDKBtcSignerAdapter> = 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 // #205: Runtime version check\n const wdkVersion = (WDK as unknown as Record<string, unknown>).version as string | undefined\n if (wdkVersion && typeof wdkVersion === 'string') {\n if (!satisfiesSemverRange(wdkVersion, SUPPORTED_WDK_RANGE)) {\n throw new WDKInitializationError(\n `WDK version ${wdkVersion} is not supported. Required: ${SUPPORTED_WDK_RANGE}`,\n )\n }\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 * Check if Spark wallet manager is registered\n */\n static isSparkRegistered(): boolean {\n return T402WDK._WalletModules.spark !== undefined\n }\n\n /**\n * Check if Bitcoin wallet manager is registered\n */\n static isBtcRegistered(): boolean {\n return T402WDK._WalletModules.btc !== 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 * Register a fiat on-ramp provider\n *\n * @param provider - A FiatOnRampProvider implementation (e.g., MoonpayOnRampProvider)\n *\n * @example\n * ```typescript\n * import { T402WDK, MoonpayOnRampProvider } from '@t402/wdk';\n *\n * T402WDK.registerFiatOnRamp(new MoonpayOnRampProvider({ apiKey: 'pk_test_...' }));\n * ```\n */\n static registerFiatOnRamp(provider: FiatOnRampProvider): void {\n if (!provider || typeof provider.getQuote !== 'function') {\n throw new WDKInitializationError('A valid FiatOnRampProvider is required')\n }\n T402WDK._fiatOnRampProvider = provider\n }\n\n /**\n * Check if a fiat on-ramp provider is registered\n */\n static isFiatOnRampRegistered(): boolean {\n return T402WDK._fiatOnRampProvider !== null\n }\n\n /**\n * Register a pricing provider for fiat-to-crypto rate conversion\n */\n static registerPricingProvider(provider: PricingProvider): void {\n registerPricingProvider(provider)\n }\n\n /**\n * Check if a pricing provider is registered\n */\n static isPricingProviderRegistered(): boolean {\n return isPricingProviderRegistered()\n }\n\n /**\n * Register a middleware for a chain\n */\n static registerMiddleware(chain: string, fn: (account: unknown) => Promise<void>): void {\n const existing = T402WDK._middlewares.get(chain) ?? []\n existing.push(fn)\n T402WDK._middlewares.set(chain, existing)\n }\n\n /**\n * Get registered middlewares for a chain\n */\n static getMiddlewares(chain: string): Array<(account: unknown) => Promise<void>> {\n return T402WDK._middlewares.get(chain) ?? []\n }\n\n /**\n * Clear all middlewares\n */\n static clearMiddlewares(): void {\n T402WDK._middlewares.clear()\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 * Auto-discover installed WDK packages using dynamic imports.\n *\n * Probes known `@tetherto/wdk-*` packages and returns the ones that\n * are installed and importable.\n *\n * @returns Discovery result with available/unavailable packages and ready-to-use modules config\n *\n * @example\n * ```typescript\n * const result = await T402WDK.autoDiscover();\n * console.log('Found:', result.available);\n * console.log('Missing:', result.unavailable);\n * ```\n */\n static async autoDiscover(): Promise<WDKAutoDiscoveryResult> {\n const walletPackages: Record<keyof WDKWalletModules, string> = {\n evm: '@tetherto/wdk-wallet-evm',\n solana: '@tetherto/wdk-wallet-solana',\n ton: '@tetherto/wdk-wallet-ton',\n tron: '@tetherto/wdk-wallet-tron',\n btc: '@tetherto/wdk-wallet-btc',\n spark: '@buildonspark/spark-sdk',\n evmErc4337: '@tetherto/wdk-wallet-evm-erc-4337',\n tonGasless: '@tetherto/wdk-wallet-ton-gasless',\n tronGasfree: '@tetherto/wdk-wallet-tron-gasfree',\n }\n\n const protocolPackages: Record<keyof WDKProtocolModules, string> = {\n bridgeUsdt0Evm: '@tetherto/wdk-protocol-bridge-usdt0-evm',\n bridgeUsdt0Ton: '@tetherto/wdk-protocol-bridge-usdt0-ton',\n swapVeloraEvm: '@tetherto/wdk-protocol-swap-velora-evm',\n lendingAaveEvm: '@tetherto/wdk-protocol-lending-aave-evm',\n }\n\n const available: string[] = []\n const unavailable: string[] = []\n const wallets: WDKWalletModules = {}\n const protocols: WDKProtocolModules = {}\n\n // Probe wallet packages\n const walletEntries = Object.entries(walletPackages) as [keyof WDKWalletModules, string][]\n const walletResults = await Promise.allSettled(\n walletEntries.map(async ([key, pkg]) => {\n const mod = await import(/* @vite-ignore */ pkg)\n return { key, pkg, mod: mod.default ?? mod }\n }),\n )\n\n for (let i = 0; i < walletResults.length; i++) {\n const result = walletResults[i]\n if (result.status === 'fulfilled') {\n const { key, pkg, mod } = result.value\n wallets[key] = mod\n available.push(pkg)\n } else {\n unavailable.push(walletEntries[i][1])\n }\n }\n\n // Probe protocol packages\n const protocolEntries = Object.entries(protocolPackages) as [keyof WDKProtocolModules, string][]\n const protocolResults = await Promise.allSettled(\n protocolEntries.map(async ([key, pkg]) => {\n const mod = await import(/* @vite-ignore */ pkg)\n return { key, pkg, mod: mod.default ?? mod }\n }),\n )\n\n for (let i = 0; i < protocolResults.length; i++) {\n const result = protocolResults[i]\n if (result.status === 'fulfilled') {\n const { key, pkg, mod } = result.value\n protocols[key] = mod\n available.push(pkg)\n } else {\n unavailable.push(protocolEntries[i][1])\n }\n }\n\n return {\n discovered: { wallets, protocols },\n available,\n unavailable,\n }\n }\n\n /**\n * Auto-discover installed WDK modules, then create a fully configured T402WDK.\n *\n * Combines `autoDiscover()` + `create()` in one call. Any explicit\n * modules you pass in `config.modules` take precedence over discovered ones.\n *\n * @param config - Same as `T402WDKCreateConfig` but `modules` is optional/partial\n * @returns A ready-to-use T402WDK instance\n *\n * @example\n * ```typescript\n * const wdk = await T402WDK.autoCreate({\n * seedPhrase: 'your twelve word seed phrase ...',\n * chains: { arbitrum: 'https://arb1.arbitrum.io/rpc' },\n * });\n * ```\n */\n static async autoCreate(\n config: Omit<T402WDKCreateConfig, 'modules'> & { modules?: Partial<WDKModulesConfig> },\n ): Promise<T402WDK> {\n // Discover installed modules\n const { discovered } = await T402WDK.autoDiscover()\n\n // Merge: explicit modules override discovered ones\n const mergedModules: WDKModulesConfig = {\n wallets: { ...discovered.wallets, ...config.modules?.wallets },\n protocols: { ...discovered.protocols, ...config.modules?.protocols },\n }\n\n // Auto-discover the WDK constructor itself\n let WDKRef: WDKConstructor\n try {\n const wdkMod = await import(/* @vite-ignore */ '@tetherto/wdk')\n WDKRef = (wdkMod.default ?? wdkMod) as unknown as WDKConstructor\n } catch {\n throw new WDKInitializationError(\n '@tetherto/wdk package not found. Install it with: npm install @tetherto/wdk',\n )\n }\n\n return T402WDK.create(WDKRef, {\n seedPhrase: config.seedPhrase,\n chains: config.chains,\n modules: mergedModules,\n options: config.options,\n })\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 * Create a T402WDK instance from an encrypted seed.\n *\n * @example\n * ```typescript\n * const encrypted = JSON.parse(fs.readFileSync('seed.enc.json', 'utf8'))\n * const wdk = await T402WDK.fromEncryptedSeed(encrypted, 'my-password', {\n * arbitrum: 'https://arb1.arbitrum.io/rpc',\n * })\n * ```\n */\n static async fromEncryptedSeed(\n encrypted: EncryptedSeed,\n password: string,\n config?: T402WDKConfig,\n options?: T402WDKOptions,\n ): Promise<T402WDK> {\n const seedPhrase = await decryptSeed(encrypted, password)\n return new T402WDK(seedPhrase, config, options)\n }\n\n /**\n * Encrypt the current seed phrase for secure storage.\n *\n * @param password - Password to encrypt with\n * @returns Encrypted seed data suitable for JSON serialization\n */\n async encryptSeed(password: string): Promise<EncryptedSeed> {\n this.assertNotDisposed()\n return encryptSeed(this._seedPhrase, password)\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 this.assertNotDisposed()\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 (this._walletModules.ton !== undefined) {\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 (this._walletModules.solana !== undefined) {\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 (this._walletModules.tron !== undefined) {\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 // Spark signer\n if (this._walletModules.spark !== undefined) {\n try {\n const signer = await this.getSparkSigner(accountIndex)\n for (const scheme of schemes) {\n entries.push({ scheme, network: 'spark:mainnet', signer, family: 'spark' })\n }\n } catch {\n // Skip if Spark signer fails\n }\n }\n\n // Bitcoin signer\n if (this._walletModules.btc !== undefined) {\n try {\n const signer = await this.getBtcSigner(accountIndex)\n for (const scheme of schemes) {\n entries.push({\n scheme,\n network: 'bip122:000000000019d6689c085ae165831e93',\n signer,\n family: 'btc',\n })\n }\n } catch {\n // Skip if Bitcoin 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 // #204: Instance-level modules, falling back to static defaults\n this._wdkConstructor = options.wdk ?? T402WDK._defaultModules.wdk ?? null\n this._walletModules = options.wallets ?? T402WDK._defaultModules.wallets ?? {}\n this._protocolModules = options.protocols ?? T402WDK._defaultModules.protocols ?? {}\n this._walletManagerEvm =\n this._walletModules.evm ?? T402WDK._defaultModules.walletManagerEvm ?? null\n this._bridgeUsdt0Evm =\n this._protocolModules.bridgeUsdt0Evm ?? T402WDK._defaultModules.bridgeUsdt0Evm ?? null\n this._fiatOnRampProvider =\n options.fiatOnRampProvider ?? T402WDK._defaultModules.fiatOnRampProvider ?? null\n if (options.middlewares) {\n this._middlewares = new Map(options.middlewares)\n } else if (T402WDK._defaultModules.middlewares) {\n // Copy static middlewares so instance doesn't mutate shared state\n this._middlewares = new Map(T402WDK._defaultModules.middlewares)\n }\n\n // #202: Store retry config\n this._retryConfig = options.retry\n\n // Normalize chain configurations (#195: handle array providers)\n for (const [chain, chainConfig] of Object.entries(config)) {\n if (chainConfig) {\n try {\n // Handle EvmChainConfig with provider arrays\n if (\n typeof chainConfig === 'object' &&\n 'provider' in chainConfig &&\n Array.isArray(chainConfig.provider)\n ) {\n const urls = chainConfig.provider as string[]\n if (urls.length === 0) {\n throw new Error('Provider array must contain at least one URL')\n }\n // Create FailoverProvider\n const failoverConfig: FailoverConfig = {\n urls,\n ...(chainConfig.failover ?? {}),\n }\n const failoverProvider = new FailoverProvider(failoverConfig)\n this._failoverProviders.set(chain, failoverProvider)\n // Normalize using the current URL from failover\n const normalized = normalizeChainConfig(chain, failoverProvider.getCurrentUrl())\n if (chainConfig.chainId !== undefined) normalized.chainId = chainConfig.chainId\n if (chainConfig.network !== undefined) normalized.network = chainConfig.network\n this._normalizedChains.set(chain, normalized)\n } else {\n this._normalizedChains.set(\n chain,\n normalizeChainConfig(\n chain,\n chainConfig as string | { provider: string; chainId: number; network: string },\n ),\n )\n }\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 && this._wdkConstructor) {\n this._initializeWDK()\n }\n }\n\n /**\n * Guard: throw if this instance has been disposed (#194)\n */\n private assertNotDisposed(): void {\n if (this._disposed) {\n throw new WDKError(WDKErrorCode.WDK_NOT_INITIALIZED, 'T402WDK has been disposed')\n }\n }\n\n /**\n * Whether this instance has been disposed\n */\n get isDisposed(): boolean {\n return this._disposed\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 (!this._wdkConstructor) {\n this._initializationError = new WDKInitializationError('WDK not registered')\n return\n }\n\n if (!this._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 this._wdkConstructor(this._seedPhrase)\n\n // Register EVM wallets for each configured chain\n for (const [chain, config] of this._normalizedChains) {\n try {\n // #195: Use failover provider's current URL if available\n const failover = this._failoverProviders.get(chain)\n const providerUrl = failover ? failover.getCurrentUrl() : config.provider\n wdk = wdk.registerWallet(chain, this._walletManagerEvm, {\n provider: providerUrl,\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 (this._bridgeUsdt0Evm) {\n try {\n wdk = wdk.registerProtocol('bridge-usdt0', this._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 // Register Velora swap protocol if available\n if (this._protocolModules.swapVeloraEvm) {\n try {\n wdk = wdk.registerProtocol('swap-velora', this._protocolModules.swapVeloraEvm)\n } catch (error) {\n console.warn(\n `Failed to register Velora swap protocol: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n\n // Register Aave lending protocol if available\n if (this._protocolModules.lendingAaveEvm) {\n try {\n wdk = wdk.registerProtocol('lending-aave', this._protocolModules.lendingAaveEvm)\n } catch (error) {\n console.warn(\n `Failed to register Aave lending protocol: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n\n // Wire middlewares into WDK\n if (typeof (wdk as any).registerMiddleware === 'function') {\n for (const [chain, fns] of this._middlewares) {\n for (const fn of fns) {\n try {\n ;(wdk as any).registerMiddleware(chain, fn)\n } catch {\n /* non-fatal */\n }\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 // ========== Event Emitter ==========\n\n /**\n * Subscribe to a T402 event\n */\n on<K extends keyof T402Events>(event: K, handler: (data: T402Events[K]) => void): this {\n this._events.on(event, handler)\n return this\n }\n\n /**\n * Unsubscribe from a T402 event\n */\n off<K extends keyof T402Events>(event: K, handler: (data: T402Events[K]) => void): this {\n this._events.off(event, handler)\n return this\n }\n\n /**\n * Subscribe to a T402 event (fires once then auto-unsubscribes)\n */\n once<K extends keyof T402Events>(event: K, handler: (data: T402Events[K]) => void): this {\n this._events.once(event, handler)\n return this\n }\n\n /**\n * Emit a T402 event\n */\n emit<K extends keyof T402Events>(event: K, data: T402Events[K]): boolean {\n return this._events.emit(event, data)\n }\n\n // ========== Receipt Store ==========\n\n /**\n * Get the payment receipt store\n */\n getReceiptStore(): PaymentReceiptStore {\n return this._receiptStore\n }\n\n /**\n * Set a custom payment receipt store backend\n */\n setReceiptStore(store: PaymentReceiptStore): void {\n this._receiptStore = store\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 this.assertNotDisposed()\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 this._events.emit('signer:initialized', {\n chain,\n address: signer.address,\n family: 'evm',\n })\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._pathSignerCache.clear()\n this._tonSignerCache.clear()\n this._svmSignerCache.clear()\n this._tronSignerCache.clear()\n this._sparkSignerCache.clear()\n this._btcSignerCache.clear()\n }\n\n // ========== Fee Rates & Cost Estimation ==========\n\n /**\n * Get current fee rates for a chain\n */\n async getFeeRates(chain: string): Promise<Record<string, bigint>> {\n if (this._wdk && typeof (this._wdk as any).getFeeRates === 'function') {\n return (this._wdk as any).getFeeRates(chain)\n }\n // Return default estimates\n return { low: 1000000000n, medium: 2000000000n, high: 5000000000n }\n }\n\n /**\n * Estimate total cost of a payment on a chain\n */\n async estimatePaymentCost(chain: string, amount: string): Promise<PaymentCostEstimate> {\n const signer = await this.getSigner(chain)\n const nativeBalance = await signer.getBalance()\n\n let estimatedGasCost = 100000n * 2000000000n // default: 100k gas * 2 gwei\n try {\n const feeRates = await this.getFeeRates(chain)\n const mediumRate = feeRates.medium ?? 2000000000n\n estimatedGasCost = 100000n * mediumRate\n } catch {\n /* use default */\n }\n\n const config = this.getChainConfig(chain)\n return {\n paymentAmount: amount,\n estimatedGasCost,\n nativeBalance,\n canAffordGas: nativeBalance >= estimatedGasCost,\n chain,\n network: config?.network ?? '',\n }\n }\n\n // ========== HD Derivation Paths ==========\n\n /**\n * Get a signer using a custom BIP-44 derivation path\n */\n async getSignerByPath(chain: string, path: string): Promise<WDKSigner> {\n const cacheKey = `${chain}:path:${path}`\n const cached = this._pathSignerCache.get(cacheKey)\n if (cached) return cached\n\n if (!this._wdk) {\n throw new WDKInitializationError('WDK not initialized')\n }\n\n if (typeof (this._wdk as any).getAccountByPath !== 'function') {\n throw new Error(\n 'getAccountByPath not available. Upgrade @tetherto/wdk to support custom derivation paths.',\n )\n }\n\n const account = await (this._wdk as any).getAccountByPath(chain, path)\n const address = await account.getAddress()\n\n const signer = new WDKSigner(this._wdk, chain, 0)\n ;(signer as any)._account = account\n ;(signer as any)._address = address\n\n this._pathSignerCache.set(cacheKey, signer)\n return signer\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 this.assertNotDisposed()\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 (!this._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 this._events.emit('signer:initialized', {\n chain: 'ton',\n address: signer.address.toString(),\n family: 'ton',\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 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 this.assertNotDisposed()\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 (!this._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 this._events.emit('signer:initialized', {\n chain: 'solana',\n address: signer.address.toString(),\n family: 'svm',\n })\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 this.assertNotDisposed()\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 (!this._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 this._events.emit('signer:initialized', {\n chain: 'tron',\n address: signer.address,\n family: 'tron',\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 Spark (Bitcoin L2) signer for T402 payments\n *\n * @param accountIndex - HD wallet account index (default: 0)\n * @throws {ChainError} If Spark wallet manager is not registered\n * @returns An initialized WDKSparkSignerAdapter\n *\n * @example\n * ```typescript\n * const sparkSigner = await wallet.getSparkSigner();\n *\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'spark:mainnet', signer: sparkSigner }]\n * });\n * ```\n */\n async getSparkSigner(accountIndex = 0): Promise<WDKSparkSignerAdapter> {\n this.assertNotDisposed()\n // Check cache first\n const cached = this._sparkSignerCache.get(accountIndex)\n if (cached) {\n return cached\n }\n\n // Validate Spark wallet manager is registered\n if (!this._walletModules.spark) {\n throw new ChainError(\n WDKErrorCode.CHAIN_NOT_SUPPORTED,\n 'Spark wallet manager not registered. Call T402WDK.registerWDK(WDK, { wallets: { spark: SparkWalletManager } }).',\n { chain: 'spark' },\n )\n }\n\n try {\n // Get Spark account from WDK\n const account = (await this.wdk.getAccount(\n 'spark',\n accountIndex,\n )) as unknown as WDKSparkAccount\n\n // Create and cache the signer adapter\n const signer = await createWDKSparkSigner(account)\n this._sparkSignerCache.set(accountIndex, signer)\n this._events.emit('signer:initialized', {\n chain: 'spark',\n address: signer.address,\n family: 'spark',\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 Spark signer', {\n chain: 'spark',\n accountIndex,\n })\n }\n }\n\n /**\n * Get a Bitcoin (BTC) on-chain signer for T402 payments\n *\n * @param accountIndex - HD wallet account index (default: 0)\n * @throws {ChainError} If Bitcoin wallet manager is not registered\n * @returns An initialized WDKBtcSignerAdapter\n *\n * @example\n * ```typescript\n * const btcSigner = await wallet.getBtcSigner();\n *\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'bip122:000000000019d6689c085ae165831e93', signer: btcSigner }]\n * });\n * ```\n */\n async getBtcSigner(accountIndex = 0): Promise<WDKBtcSignerAdapter> {\n this.assertNotDisposed()\n // Check cache first\n const cached = this._btcSignerCache.get(accountIndex)\n if (cached) {\n return cached\n }\n\n // Validate BTC wallet manager is registered\n if (!this._walletModules.btc) {\n throw new ChainError(\n WDKErrorCode.CHAIN_NOT_SUPPORTED,\n 'Bitcoin wallet manager not registered. Call T402WDK.registerWDK(WDK, { wallets: { btc: WalletManagerBtc } }).',\n { chain: 'btc' },\n )\n }\n\n try {\n // Get Bitcoin account from WDK\n const account = (await this.wdk.getAccount('btc', accountIndex)) as unknown as WDKBtcAccount\n\n // Create and cache the signer adapter\n const signer = await createWDKBtcSigner(account)\n this._btcSignerCache.set(accountIndex, signer)\n this._events.emit('signer:initialized', {\n chain: 'btc',\n address: signer.address,\n family: 'btc',\n })\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 Bitcoin signer',\n { chain: 'btc', 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<\n | WDKSigner\n | ClientTonSigner\n | ClientSvmSigner\n | ClientTronSigner\n | WDKSparkSignerAdapter\n | WDKBtcSignerAdapter\n > {\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 case 'spark':\n return this.getSparkSigner(typeof chainOrIndex === 'number' ? chainOrIndex : accountIndex)\n\n case 'btc':\n return this.getBtcSigner(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, spark, btc`,\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 this.assertNotDisposed()\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 this.assertNotDisposed()\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(chain, usdt0Address, address, () =>\n this._withRetry(() => 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 this.assertNotDisposed()\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(chain, usdcAddress, address, () =>\n this._withRetry(() => 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 this.assertNotDisposed()\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 () => this._withRetry(() => 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, () =>\n this._withRetry(() => 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 // Verify gas affordability\n try {\n const costEstimate = await this.estimatePaymentCost(\n chainBalance.chain,\n amount.toString(),\n )\n if (!costEstimate.canAffordGas) {\n continue // Skip chains where user can't afford gas\n }\n } catch {\n /* continue anyway if estimation fails */\n }\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 this.assertNotDisposed()\n // Validate bridge availability\n if (!this._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 this._events.emit('bridge:start', {\n fromChain: params.fromChain,\n toChain: params.toChain,\n amount: params.amount,\n })\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 this._events.emit('bridge:confirmed', {\n txHash: result.txHash,\n fromChain: params.fromChain,\n toChain: params.toChain,\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 this._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 // ========== Lending Protocol ==========\n\n /**\n * Check if the Aave lending protocol is registered and available\n */\n canBorrow(): boolean {\n return this._protocolModules.lendingAaveEvm !== undefined\n }\n\n /**\n * Borrow USDT0 against collateral and pay\n *\n * Uses the Aave protocol to deposit collateral, borrow USDT0, then the\n * borrowed USDT0 is available for T402 payments.\n *\n * @param params - Borrow parameters\n * @throws {WDKError} If lending protocol is not registered or borrow fails\n *\n * @example\n * ```typescript\n * // Borrow 100 USDT0 against 0.05 WETH on Arbitrum\n * const result = await wallet.borrowAndPay({\n * chain: 'arbitrum',\n * collateralToken: '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1', // WETH\n * collateralAmount: 50000000000000000n, // 0.05 WETH\n * borrowAmount: 100000000n, // 100 USDT0\n * });\n * ```\n */\n async borrowAndPay(params: BorrowParams): Promise<BorrowResult> {\n if (!this.canBorrow()) {\n throw new WDKError(\n WDKErrorCode.PROTOCOL_NOT_REGISTERED,\n 'Aave lending protocol not registered. Call T402WDK.registerWDK(WDK, { protocols: { lendingAaveEvm: LendingAaveEvm } }).',\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.collateralAmount <= 0n) {\n throw new WDKError(WDKErrorCode.INVALID_PARAMETER, 'collateralAmount must be greater than 0')\n }\n\n if (params.borrowAmount <= 0n) {\n throw new WDKError(WDKErrorCode.INVALID_PARAMETER, 'borrowAmount must be greater than 0')\n }\n\n try {\n const result = await this.wdk.executeProtocol('lending-aave', {\n action: 'borrow',\n chain: params.chain,\n collateralToken: params.collateralToken,\n collateralAmount: params.collateralAmount.toString(),\n borrowToken: usdt0Address,\n borrowAmount: params.borrowAmount.toString(),\n interestRateMode: params.interestRateMode ?? 2,\n })\n\n // Invalidate balance cache for this chain after borrow\n this._balanceCache.invalidateChain(params.chain)\n\n const r = result as unknown as Record<string, unknown>\n return {\n supplyTxHash: r.supplyTxHash as string,\n borrowTxHash: r.borrowTxHash as string,\n borrowedAmount: BigInt(r.borrowedAmount as string),\n }\n } catch (error) {\n throw wrapError(\n error,\n WDKErrorCode.PROTOCOL_EXECUTION_FAILED,\n `Failed to execute borrow on ${params.chain}`,\n {\n chain: params.chain,\n collateralToken: params.collateralToken,\n borrowAmount: params.borrowAmount.toString(),\n },\n )\n }\n }\n\n // ========== Fiat On-Ramp ==========\n\n /**\n * Get a fiat on-ramp quote\n *\n * @param params - Quote parameters (fiatAmount, fiatCurrency, network)\n * @throws {WDKError} If no fiat on-ramp provider is registered\n */\n async getFiatOnRampQuote(\n params: Pick<FiatOnRampParams, 'fiatAmount' | 'fiatCurrency' | 'network'>,\n ): Promise<FiatOnRampQuote> {\n this.assertNotDisposed()\n if (!this._fiatOnRampProvider) {\n throw new WDKError(\n WDKErrorCode.PROTOCOL_NOT_REGISTERED,\n 'No fiat on-ramp provider registered. Call T402WDK.registerFiatOnRamp() first.',\n )\n }\n return this._fiatOnRampProvider.getQuote(params)\n }\n\n /**\n * Generate a fiat on-ramp widget URL for the user\n *\n * Returns a widget URL that the application should open in a browser\n * or webview so the user can complete the fiat purchase.\n *\n * @param params - On-ramp parameters\n * @throws {WDKError} If no fiat on-ramp provider is registered\n *\n * @example\n * ```typescript\n * const result = await wallet.onRampAndPay({\n * fiatAmount: 100,\n * fiatCurrency: 'USD',\n * walletAddress: '0x...',\n * network: 'eip155:42161',\n * });\n * // Open result.widgetUrl in browser/webview\n * ```\n */\n onRampAndPay(params: FiatOnRampParams): FiatOnRampResult {\n this.assertNotDisposed()\n if (!this._fiatOnRampProvider) {\n throw new WDKError(\n WDKErrorCode.PROTOCOL_NOT_REGISTERED,\n 'No fiat on-ramp provider registered. Call T402WDK.registerFiatOnRamp() first.',\n )\n }\n return this._fiatOnRampProvider.createWidget(params)\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 for (const chain of this.getConfiguredChains()) {\n this._events.emit('balance:changed', {\n chain,\n token: '*',\n previousBalance: 0n,\n newBalance: 0n,\n })\n }\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 const count = this._balanceCache.invalidateChain(chain)\n if (count > 0) {\n this._events.emit('balance:changed', {\n chain,\n token: '*',\n previousBalance: 0n,\n newBalance: 0n,\n })\n }\n return count\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 all resources held by this instance (#194).\n *\n * After disposal, any public method call will throw.\n * Safe to call multiple times.\n */\n dispose(): void {\n if (this._disposed) return\n this._disposed = true\n\n // Dispose underlying WDK if it supports it\n if (this._wdk && typeof (this._wdk as any).dispose === 'function') {\n try {\n ;(this._wdk as any).dispose()\n } catch {\n /* best-effort */\n }\n }\n this._wdk = null\n\n // Clear ALL signer caches\n this._signerCache.clear()\n this._pathSignerCache.clear()\n this._tonSignerCache.clear()\n this._svmSignerCache.clear()\n this._tronSignerCache.clear()\n this._sparkSignerCache.clear()\n this._btcSignerCache.clear()\n\n // Wipe seed phrase\n this._seedPhrase = ''\n\n // Stop balance cache timers\n this._balanceCache.dispose()\n\n // Dispose all FailoverProvider instances (#195)\n for (const provider of this._failoverProviders.values()) {\n provider.dispose()\n }\n this._failoverProviders.clear()\n }\n\n /**\n * Symbol.dispose support for `using` declarations (TC39 Explicit Resource Management)\n */\n [Symbol.dispose](): void {\n this.dispose()\n }\n\n // ========== Failover Provider Status (#195) ==========\n\n /**\n * Get the FailoverProvider status for a chain, if one exists.\n *\n * @param chain - Chain name\n * @returns Array of provider statuses, or null if no failover is configured for the chain\n */\n getProviderStatus(chain: string): ProviderStatus[] | null {\n const provider = this._failoverProviders.get(chain)\n if (!provider) return null\n return provider.getStatus()\n }\n\n // ========== Network Resilience (#202) ==========\n\n /**\n * Simple online connectivity check.\n * Returns true if at least one configured chain's RPC responds.\n */\n get isOnline(): Promise<boolean> {\n return this._checkOnline()\n }\n\n private async _checkOnline(): Promise<boolean> {\n const chains = this.getConfiguredChains()\n if (chains.length === 0) return false\n\n for (const chain of chains) {\n const config = this._normalizedChains.get(chain)\n if (!config) continue\n try {\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), 3000)\n const response = await fetch(config.provider, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ jsonrpc: '2.0', method: 'eth_chainId', params: [], id: 1 }),\n signal: controller.signal,\n })\n clearTimeout(timeout)\n if (response.ok) return true\n } catch {\n // try next\n }\n }\n return false\n }\n\n /**\n * Wrap an async operation with the instance retry config (#202)\n */\n private async _withRetry<T>(fn: () => Promise<T>): Promise<T> {\n if (this._retryConfig) {\n return withRetry(fn, this._retryConfig)\n }\n return fn()\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 * WDK Pricing Provider Integration\n *\n * Provides a MoneyParser that converts fiat/stablecoin amounts to\n * on-chain AssetAmount values using WDK pricing data.\n */\n\nimport type { MoneyParser, AssetAmount, Network } from '@t402/core/types'\nimport {\n USDT0_ADDRESSES,\n USDC_ADDRESSES,\n getChainFromNetwork,\n getPreferredToken,\n} from './chains.js'\n\n/** External pricing provider interface */\nexport interface PricingProvider {\n /** Get exchange rate from currency to token */\n getRate(fromCurrency: string, toToken: string): Promise<number>\n /** Get list of supported currency pairs */\n getSupportedPairs(): Array<{ from: string; to: string }>\n}\n\nlet _registeredPricingProvider: PricingProvider | null = null\n\nexport function registerPricingProvider(provider: PricingProvider): void {\n _registeredPricingProvider = provider\n}\n\nexport function getPricingProvider(): PricingProvider | null {\n return _registeredPricingProvider\n}\n\nexport function isPricingProviderRegistered(): boolean {\n return _registeredPricingProvider !== null\n}\n\nexport interface PricingProviderConfig {\n /** Cache TTL in milliseconds (default: 60000 = 60s) */\n cacheTTL?: number\n /** Supported fiat currencies (default: ['USD', 'EUR', 'GBP', 'JPY']) */\n supportedFiat?: string[]\n}\n\ninterface CachedPrice {\n rate: number\n fetchedAt: number\n}\n\n// Stablecoins pass through at 1:1 (no API call needed)\nconst STABLECOIN_SYMBOLS = new Set(['USDT', 'USDT0', 'USDC', 'DAI', 'BUSD'])\n\nconst DEFAULT_TTL = 60_000 // 60 seconds\nconst DEFAULT_FIAT = ['USD', 'EUR', 'GBP', 'JPY']\n\n/**\n * Creates a MoneyParser that uses WDK pricing provider for fiat-to-crypto conversion.\n *\n * For stablecoin-denominated amounts (USDT, USDC, etc.), returns 1:1 ratio (no API call).\n * For fiat currencies (USD, EUR, etc.), fetches live rates from the pricing provider.\n *\n * The MoneyParser interface receives a numeric amount (e.g., 1.50) and a CAIP-2 network.\n *\n * @example\n * ```typescript\n * import { createWdkMoneyParser } from '@t402/wdk'\n *\n * const parser = createWdkMoneyParser({ cacheTTL: 30_000 })\n * const amount = await parser(1.50, 'eip155:8453') // Returns USDT amount on Base\n * ```\n */\nexport function createWdkMoneyParser(config?: PricingProviderConfig): MoneyParser {\n const cacheTTL = config?.cacheTTL ?? DEFAULT_TTL\n const supportedFiat = new Set(config?.supportedFiat ?? DEFAULT_FIAT)\n const cache = new Map<string, CachedPrice>()\n\n return async (amount: number, network: Network): Promise<AssetAmount | null> => {\n if (!Number.isFinite(amount) || amount <= 0) return null\n\n // Resolve the preferred token for this network\n const chain = getChainFromNetwork(network)\n if (!chain) return null\n\n const tokenInfo = getPreferredToken(chain)\n if (!tokenInfo) return null\n\n // Stablecoin pass-through: amount maps 1:1\n if (STABLECOIN_SYMBOLS.has(tokenInfo.symbol.toUpperCase())) {\n return {\n amount: toAtomicUnits(amount, tokenInfo.decimals),\n asset: tokenInfo.address,\n }\n }\n\n // For fiat-priced tokens, check supported currencies\n // Default assumption: amount is in USD\n const currency = 'USD'\n if (!supportedFiat.has(currency)) return null\n\n const cacheKey = `${currency}_${tokenInfo.symbol}`\n const cached = cache.get(cacheKey)\n const now = Date.now()\n\n let rate: number\n if (cached && now - cached.fetchedAt < cacheTTL) {\n rate = cached.rate\n } else {\n // For USD-pegged stablecoins, use 1:1 rate as default\n // When @tetherto/wdk-pricing-provider is available, call it here\n rate = await fetchRate(currency, tokenInfo.symbol)\n cache.set(cacheKey, { rate, fetchedAt: now })\n }\n\n const convertedAmount = amount * rate\n return {\n amount: toAtomicUnits(convertedAmount, tokenInfo.decimals),\n asset: tokenInfo.address,\n }\n }\n}\n\n/**\n * Convert a decimal amount to atomic units string.\n *\n * @example\n * toAtomicUnits(1.5, 6) => \"1500000\"\n * toAtomicUnits(0.001, 6) => \"1000\"\n */\nexport function toAtomicUnits(amount: number, decimals: number): string {\n // Use string math to avoid floating point issues\n const factor = 10 ** decimals\n // Round to avoid floating-point drift\n const atomic = Math.round(amount * factor)\n return atomic.toString()\n}\n\n/**\n * Resolve the asset address for a token on a given network.\n */\nexport function resolveAssetForNetwork(token: string, network: Network): string | null {\n const chain = getChainFromNetwork(network)\n if (!chain) return null\n\n const upper = token.toUpperCase()\n if (upper === 'USDT0' || upper === 'USDT') {\n return USDT0_ADDRESSES[chain] ?? null\n }\n if (upper === 'USDC') {\n return USDC_ADDRESSES[chain] ?? null\n }\n return null\n}\n\n/**\n * Fetch exchange rate. Placeholder for WDK pricing provider integration.\n *\n * When @tetherto/wdk-pricing-provider or @tetherto/wdk-pricing-bitfinex-http\n * is available, this function should delegate to those providers.\n *\n * Currently returns 1:1 for USD (stablecoin assumption).\n */\nasync function fetchRate(fromCurrency: string, toToken: string): Promise<number> {\n // Try registered provider first\n if (_registeredPricingProvider) {\n try {\n return await _registeredPricingProvider.getRate(fromCurrency, toToken)\n } catch {\n // Fall through to placeholder\n }\n }\n\n // USD → stablecoin is 1:1 by default\n if (fromCurrency.toUpperCase() === 'USD') {\n return 1.0\n }\n\n // Placeholder rates for other fiat currencies\n // In production, these would come from the WDK pricing provider\n const placeholderRates: Record<string, number> = {\n EUR: 1.08,\n GBP: 1.27,\n JPY: 0.0067,\n }\n\n return placeholderRates[fromCurrency.toUpperCase()] ?? 1.0\n}\n","/**\n * WDK Failover Provider\n *\n * Automatic RPC failover support with health checking and\n * configurable failure thresholds.\n */\n\nexport interface FailoverConfig {\n /** RPC URLs in priority order */\n urls: string[]\n /** Health check interval in ms (default: 30000) */\n healthCheckInterval?: number\n /** Request timeout in ms (default: 5000) */\n requestTimeout?: number\n /** Max consecutive failures before marking unhealthy (default: 3) */\n maxFailures?: number\n}\n\nexport interface ProviderStatus {\n url: string\n healthy: boolean\n lastChecked: number\n consecutiveFailures: number\n}\n\nconst DEFAULT_HEALTH_CHECK_INTERVAL = 30_000\nconst DEFAULT_REQUEST_TIMEOUT = 5_000\nconst DEFAULT_MAX_FAILURES = 3\n\n/**\n * RPC failover provider with automatic health checking and failover.\n *\n * Manages a list of RPC URLs in priority order, automatically switching\n * to the next healthy provider when failures exceed the threshold.\n *\n * @example\n * ```typescript\n * const provider = new FailoverProvider({\n * urls: ['https://arb1.arbitrum.io/rpc', 'https://arb-fallback.example.com'],\n * maxFailures: 3,\n * })\n *\n * const url = provider.getCurrentUrl()\n * try {\n * await fetch(url)\n * provider.reportSuccess()\n * } catch {\n * provider.reportFailure()\n * }\n * ```\n */\nexport class FailoverProvider {\n private providers: ProviderStatus[]\n private currentIndex: number = 0\n private healthCheckTimer?: ReturnType<typeof setInterval>\n private readonly maxFailures: number\n private readonly requestTimeout: number\n\n constructor(config: FailoverConfig) {\n if (!config.urls || config.urls.length === 0) {\n throw new Error('FailoverProvider requires at least one URL')\n }\n\n this.maxFailures = config.maxFailures ?? DEFAULT_MAX_FAILURES\n this.requestTimeout = config.requestTimeout ?? DEFAULT_REQUEST_TIMEOUT\n\n this.providers = config.urls.map((url) => ({\n url,\n healthy: true,\n lastChecked: Date.now(),\n consecutiveFailures: 0,\n }))\n\n const interval = config.healthCheckInterval ?? DEFAULT_HEALTH_CHECK_INTERVAL\n if (interval > 0) {\n this.startHealthChecks(interval)\n }\n }\n\n /**\n * Get current active RPC URL\n */\n getCurrentUrl(): string {\n return this.providers[this.currentIndex].url\n }\n\n /**\n * Report a failure on the current URL.\n * Auto-switches to next healthy provider if failure threshold is reached.\n *\n * @returns The new URL if switched, or null if no switch occurred\n */\n reportFailure(): string | null {\n const provider = this.providers[this.currentIndex]\n provider.consecutiveFailures++\n provider.lastChecked = Date.now()\n\n if (provider.consecutiveFailures >= this.maxFailures) {\n provider.healthy = false\n return this.switchToNext()\n }\n\n return null\n }\n\n /**\n * Report success on the current URL, reset failure counter.\n */\n reportSuccess(): void {\n const provider = this.providers[this.currentIndex]\n provider.consecutiveFailures = 0\n provider.healthy = true\n provider.lastChecked = Date.now()\n }\n\n /**\n * Get all provider statuses\n */\n getStatus(): ProviderStatus[] {\n return this.providers.map((p) => ({ ...p }))\n }\n\n /**\n * Force switch to next healthy provider.\n *\n * @returns The new URL, or null if no healthy providers available\n */\n switchToNext(): string | null {\n const startIndex = this.currentIndex\n\n for (let i = 1; i <= this.providers.length; i++) {\n const nextIndex = (startIndex + i) % this.providers.length\n if (this.providers[nextIndex].healthy) {\n this.currentIndex = nextIndex\n return this.providers[nextIndex].url\n }\n }\n\n // No healthy providers found\n return null\n }\n\n /**\n * Get the request timeout in milliseconds\n */\n getRequestTimeout(): number {\n return this.requestTimeout\n }\n\n /**\n * Stop health checks and clean up resources\n */\n dispose(): void {\n if (this.healthCheckTimer) {\n clearInterval(this.healthCheckTimer)\n this.healthCheckTimer = undefined\n }\n }\n\n private startHealthChecks(interval: number): void {\n this.healthCheckTimer = setInterval(() => {\n for (const provider of this.providers) {\n if (!provider.healthy) {\n this.checkHealth(provider)\n }\n }\n }, interval)\n\n // Don't prevent process from exiting\n if (this.healthCheckTimer.unref) {\n this.healthCheckTimer.unref()\n }\n }\n\n private async checkHealth(provider: ProviderStatus): Promise<boolean> {\n try {\n // Simple JSON-RPC health check (eth_chainId)\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), this.requestTimeout)\n\n const response = await fetch(provider.url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n method: 'eth_chainId',\n params: [],\n id: 1,\n }),\n signal: controller.signal,\n })\n\n clearTimeout(timeout)\n\n if (response.ok) {\n provider.healthy = true\n provider.consecutiveFailures = 0\n provider.lastChecked = Date.now()\n return true\n }\n } catch {\n // Health check failed, keep unhealthy\n }\n\n provider.lastChecked = Date.now()\n return false\n }\n}\n\n/**\n * Normalize chain config that may contain failover arrays.\n * Backward compatible: single string URL still works.\n *\n * @example\n * ```typescript\n * // Single URL (backward compatible)\n * const provider = createFailoverProvider('https://arb1.arbitrum.io/rpc')\n * // Returns null — no failover needed\n *\n * // Multiple URLs with failover\n * const provider = createFailoverProvider(['https://arb1.arbitrum.io/rpc', 'https://fallback.example.com'])\n * // Returns FailoverProvider\n *\n * // Full config\n * const provider = createFailoverProvider({\n * urls: ['https://arb1.arbitrum.io/rpc', 'https://fallback.example.com'],\n * healthCheckInterval: 15000,\n * })\n * ```\n */\nexport function createFailoverProvider(\n config: string | string[] | FailoverConfig,\n): FailoverProvider | null {\n if (typeof config === 'string') return null // Single URL, no failover needed\n if (Array.isArray(config)) return new FailoverProvider({ urls: config })\n return new FailoverProvider(config)\n}\n\n/**\n * Resolve the primary RPC URL from a config that may be a string, array, or FailoverConfig.\n */\nexport function resolveRpcUrl(config: string | string[] | FailoverConfig): string {\n if (typeof config === 'string') return config\n if (Array.isArray(config)) return config[0]\n return config.urls[0]\n}\n","/**\n * Multi-chain address validation for T402 WDK\n *\n * Provides address validation and normalization across supported chain families.\n * Includes cross-chain mismatch detection to help users avoid sending to wrong chains.\n */\n\nimport type { ChainFamily } from './types.js'\n\n/**\n * Result of validating a payment address\n */\nexport interface AddressValidationResult {\n /** Whether the address is valid for the specified chain family */\n valid: boolean\n /** Normalized form of the address (e.g., checksummed, lowercased) */\n normalized?: string\n /** Error message if validation failed */\n error?: string\n /** Detected chain family if the address appears to belong to a different chain */\n detectedFamily?: ChainFamily\n}\n\n// ============================================================\n// Chain-specific validators\n// ============================================================\n\nconst EVM_ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/\nconst TON_RAW_RE = /^0:[0-9a-fA-F]{64}$/\nconst TRON_ADDRESS_RE = /^T[1-9A-HJ-NP-Za-km-z]{33}$/\nconst BASE58_CHARS = /^[1-9A-HJ-NP-Za-km-z]+$/\nconst BECH32_BTC_RE = /^bc1[a-zA-HJ-NP-Z0-9]{25,90}$/\nconst COSMOS_BECH32_RE = /^[a-z]+1[a-z0-9]{38,58}$/\n\nfunction isBase58(s: string): boolean {\n return BASE58_CHARS.test(s)\n}\n\nfunction validateEvm(address: string): AddressValidationResult {\n if (!EVM_ADDRESS_RE.test(address)) {\n // Cross-chain mismatch detection\n const detected = detectFamily(address, 'evm')\n if (detected) {\n return {\n valid: false,\n error: `Address appears to be a ${detected} address, not an EVM address`,\n detectedFamily: detected,\n }\n }\n return {\n valid: false,\n error: 'Invalid EVM address: must be 0x-prefixed, 40 hex characters',\n }\n }\n // Normalize to checksummed form (EIP-55 lowercase for simplicity)\n return {\n valid: true,\n normalized: address.toLowerCase(),\n }\n}\n\nfunction validateTon(address: string): AddressValidationResult {\n // Raw format: 0:<64 hex chars>\n if (TON_RAW_RE.test(address)) {\n return { valid: true, normalized: address.toLowerCase() }\n }\n\n // User-friendly format: base64url encoded, 48 chars (with checksum)\n // Also accept 44-char and 46-char forms used by some libraries\n // Supports both standard base64 and base64url encoding\n const base64UrlRe = /^[A-Za-z0-9_\\-+/=]{44,48}$/\n if (base64UrlRe.test(address)) {\n return { valid: true, normalized: address }\n }\n\n const detected = detectFamily(address, 'ton')\n if (detected) {\n return {\n valid: false,\n error: `Address appears to be a ${detected} address, not a TON address`,\n detectedFamily: detected,\n }\n }\n\n return {\n valid: false,\n error:\n 'Invalid TON address: must be raw format (0:<64 hex>) or user-friendly (48 chars base64)',\n }\n}\n\nfunction validateTron(address: string): AddressValidationResult {\n if (!TRON_ADDRESS_RE.test(address)) {\n const detected = detectFamily(address, 'tron')\n if (detected) {\n return {\n valid: false,\n error: `Address appears to be a ${detected} address, not a TRON address`,\n detectedFamily: detected,\n }\n }\n return {\n valid: false,\n error: 'Invalid TRON address: must be T-prefixed base58check, 34 characters',\n }\n }\n return { valid: true, normalized: address }\n}\n\nfunction validateSvm(address: string): AddressValidationResult {\n // Check for TRON address first (T-prefix, 34 chars, overlaps with base58 32-44 range)\n if (TRON_ADDRESS_RE.test(address)) {\n return {\n valid: false,\n error: 'Address appears to be a tron address, not a Solana address',\n detectedFamily: 'tron',\n }\n }\n\n if (!isBase58(address) || address.length < 32 || address.length > 44) {\n const detected = detectFamily(address, 'svm')\n if (detected) {\n return {\n valid: false,\n error: `Address appears to be a ${detected} address, not a Solana address`,\n detectedFamily: detected,\n }\n }\n return {\n valid: false,\n error: 'Invalid Solana address: must be base58, 32-44 characters',\n }\n }\n return { valid: true, normalized: address }\n}\n\nfunction validateBtc(address: string): AddressValidationResult {\n // Bech32: bc1...\n if (BECH32_BTC_RE.test(address)) {\n return { valid: true, normalized: address.toLowerCase() }\n }\n\n // Legacy P2PKH (1...) or P2SH (3...)\n if ((address.startsWith('1') || address.startsWith('3')) && isBase58(address)) {\n if (address.length >= 25 && address.length <= 34) {\n return { valid: true, normalized: address }\n }\n }\n\n const detected = detectFamily(address, 'btc')\n if (detected) {\n return {\n valid: false,\n error: `Address appears to be a ${detected} address, not a Bitcoin address`,\n detectedFamily: detected,\n }\n }\n\n return {\n valid: false,\n error:\n 'Invalid Bitcoin address: must be bech32 (bc1...) or base58 (1... or 3...), 25-90 characters',\n }\n}\n\nfunction validateCosmos(address: string): AddressValidationResult {\n if (!COSMOS_BECH32_RE.test(address)) {\n const detected = detectFamily(address, 'cosmos' as ChainFamily)\n if (detected) {\n return {\n valid: false,\n error: `Address appears to be a ${detected} address, not a Cosmos address`,\n detectedFamily: detected,\n }\n }\n return {\n valid: false,\n error: 'Invalid Cosmos address: must be bech32 with lowercase prefix',\n }\n }\n return { valid: true, normalized: address }\n}\n\n// ============================================================\n// Cross-chain mismatch detection\n// ============================================================\n\ntype DetectableFamily = ChainFamily | 'cosmos'\n\n/**\n * Attempt to detect which chain family an address belongs to.\n * Returns undefined if no match detected, or the family if detected.\n * `exclude` is the family we are currently validating against.\n */\nfunction detectFamily(address: string, exclude: DetectableFamily): ChainFamily | undefined {\n if (exclude !== 'evm' && EVM_ADDRESS_RE.test(address)) return 'evm'\n if (exclude !== 'tron' && TRON_ADDRESS_RE.test(address)) return 'tron'\n if (exclude !== 'ton' && (TON_RAW_RE.test(address) || /^[A-Za-z0-9_\\-+/=]{44,48}$/.test(address)))\n return 'ton'\n if (\n exclude !== 'btc' &&\n (BECH32_BTC_RE.test(address) ||\n (address.startsWith('1') &&\n isBase58(address) &&\n address.length >= 25 &&\n address.length <= 34))\n )\n return 'btc'\n if (\n exclude !== 'svm' &&\n exclude !== 'tron' &&\n isBase58(address) &&\n address.length >= 32 &&\n address.length <= 44 &&\n !address.startsWith('T')\n )\n return 'svm'\n return undefined\n}\n\n// ============================================================\n// Public API\n// ============================================================\n\ntype ValidatorFamily = ChainFamily | 'cosmos'\n\nconst VALIDATORS: Record<ValidatorFamily, (address: string) => AddressValidationResult> = {\n evm: validateEvm,\n ton: validateTon,\n tron: validateTron,\n svm: validateSvm,\n btc: validateBtc,\n spark: validateBtc, // Spark uses Bitcoin addresses\n cosmos: validateCosmos,\n}\n\n/**\n * Validate a payment address for a given chain family.\n *\n * Supports EVM, TON, TRON, Solana (SVM), Bitcoin (BTC/Spark), and Cosmos.\n * Returns validation result with optional normalization and cross-chain mismatch detection.\n *\n * @param address - The address to validate\n * @param family - The target chain family\n * @returns Validation result\n *\n * @example\n * ```typescript\n * const result = validatePaymentAddress('0x1234...', 'evm');\n * if (result.valid) {\n * console.log('Normalized:', result.normalized);\n * } else {\n * console.error(result.error);\n * if (result.detectedFamily) {\n * console.error(`Did you mean to use ${result.detectedFamily}?`);\n * }\n * }\n * ```\n */\nexport function validatePaymentAddress(\n address: string,\n family: ChainFamily | 'cosmos',\n): AddressValidationResult {\n if (!address || typeof address !== 'string') {\n return { valid: false, error: 'Address is required' }\n }\n\n const trimmed = address.trim()\n if (trimmed.length === 0) {\n return { valid: false, error: 'Address is required' }\n }\n\n const validator = VALIDATORS[family]\n if (!validator) {\n return { valid: false, error: `Unsupported chain family: ${family}` }\n }\n\n return validator(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 {\n Usdt0Bridge,\n supportsBridging,\n getBridgeableChains,\n type BridgeSigner,\n type TransactionReceipt,\n} from '@t402/evm'\nimport { BridgeTracker, type BridgeTrackerConfig } from './bridge-tracker.js'\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// JSON-RPC Helpers\n// ============================================================================\n\nlet jsonRpcId = 1\n\n/**\n * Make a JSON-RPC call to an EVM node\n */\nasync function jsonRpcCall(rpcUrl: string, method: string, params: unknown[]): Promise<unknown> {\n const id = jsonRpcId++\n const body = JSON.stringify({ jsonrpc: '2.0', id, method, params })\n const res = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body,\n })\n if (!res.ok) {\n throw new Error(`JSON-RPC request failed: ${res.status} ${res.statusText}`)\n }\n const json = (await res.json()) as { result?: unknown; error?: { code: number; message: string } }\n if (json.error) {\n throw new Error(`JSON-RPC error ${json.error.code}: ${json.error.message}`)\n }\n return json.result\n}\n\n/**\n * Known ERC-20 / OFT function selectors.\n * We only need to encode the functions used by Usdt0Bridge.\n */\nconst KNOWN_SELECTORS: Record<string, string> = {\n // ERC-20\n balanceOf: '0x70a08231',\n allowance: '0xdd62ed3e',\n approve: '0x095ea7b3',\n transfer: '0xa9059cbb',\n // OFT / LayerZero\n quoteSend: '0x0d35b415',\n send: '0xc7c7f5b3',\n}\n\n/**\n * ABI-encode a uint256 value (left-pad to 32 bytes)\n */\nfunction encodeUint256(value: bigint): string {\n return value.toString(16).padStart(64, '0')\n}\n\n/**\n * ABI-encode an address (left-pad to 32 bytes)\n */\nfunction encodeAddress(addr: string): string {\n const clean = addr.startsWith('0x') ? addr.slice(2) : addr\n return clean.toLowerCase().padStart(64, '0')\n}\n\n/**\n * Encode a function call with known ABI\n *\n * Handles the common function signatures used by the bridge:\n * - balanceOf(address)\n * - allowance(address,address)\n * - approve(address,uint256)\n * - transfer(address,uint256)\n *\n * For complex structs (quoteSend, send), falls back to pre-encoded\n * functionData passed through args if available.\n */\nfunction encodeFunctionCall(args: {\n abi: readonly unknown[]\n functionName: string\n args?: readonly unknown[]\n}): `0x${string}` {\n const selector = KNOWN_SELECTORS[args.functionName]\n if (!selector) {\n throw new Error(`Unknown function: ${args.functionName}. Cannot encode without full ABI codec.`)\n }\n const fnArgs = args.args ?? []\n let encoded = selector\n\n for (const arg of fnArgs) {\n if (typeof arg === 'bigint') {\n encoded += encodeUint256(arg)\n } else if (typeof arg === 'string' && arg.startsWith('0x') && arg.length === 42) {\n encoded += encodeAddress(arg)\n } else if (typeof arg === 'string' && arg.startsWith('0x')) {\n // bytes32 or other hex — pad to 32 bytes\n const clean = arg.slice(2)\n encoded += clean.padStart(64, '0')\n } else if (typeof arg === 'number') {\n encoded += BigInt(arg).toString(16).padStart(64, '0')\n } else if (typeof arg === 'object' && arg !== null) {\n // Struct — for quoteSend/send we need pre-encoded data.\n // This path handles tuple encoding by concatenating all fields.\n const obj = arg as Record<string, unknown>\n for (const val of Object.values(obj)) {\n if (typeof val === 'bigint') {\n encoded += encodeUint256(val)\n } else if (typeof val === 'string' && val.startsWith('0x')) {\n const clean = val.slice(2)\n encoded += clean.padStart(64, '0')\n } else if (typeof val === 'number') {\n encoded += BigInt(val).toString(16).padStart(64, '0')\n }\n }\n } else {\n throw new Error(`Cannot encode argument of type ${typeof arg}`)\n }\n }\n\n return encoded as `0x${string}`\n}\n\n/**\n * Decode basic return types from hex-encoded ABI data.\n *\n * Handles:\n * - Single uint256 (e.g., balanceOf, allowance) → bigint\n * - Single bool (e.g., approve, transfer) → boolean\n * - Single address → `0x${string}`\n *\n * For complex tuple returns, returns the raw hex string.\n */\nfunction decodeFunctionResult(\n args: { functionName: string; abi: readonly unknown[] },\n hex: unknown,\n): unknown {\n if (typeof hex !== 'string') return hex\n const data = hex.startsWith('0x') ? hex.slice(2) : hex\n if (data.length === 0) return undefined\n\n // Single-word returns (32 bytes = 64 hex chars)\n const word = data.slice(0, 64)\n const fnName = args.functionName\n\n // Functions that return uint256\n if (['balanceOf', 'allowance', 'totalSupply', 'decimals', 'nonces'].includes(fnName)) {\n return BigInt('0x' + word)\n }\n\n // Functions that return bool\n if (['approve', 'transfer', 'transferFrom'].includes(fnName)) {\n return BigInt('0x' + word) !== 0n\n }\n\n // For complex return types (quoteSend returns tuples), return raw hex\n return hex\n}\n\n/**\n * Poll for a transaction receipt via eth_getTransactionReceipt\n */\nasync function pollForReceipt(\n rpcUrl: string,\n hash: `0x${string}`,\n timeout: number,\n): Promise<TransactionReceipt> {\n const pollInterval = 2000\n const deadline = Date.now() + timeout\n\n while (Date.now() < deadline) {\n const result = (await jsonRpcCall(rpcUrl, 'eth_getTransactionReceipt', [hash])) as {\n status: string\n transactionHash: `0x${string}`\n logs: readonly { address: string; topics: readonly `0x${string}`[]; data: `0x${string}` }[]\n } | null\n\n if (result) {\n return {\n status: result.status === '0x1' ? 'success' : 'reverted',\n transactionHash: result.transactionHash,\n logs: (result.logs ?? []).map((log) => ({\n address: log.address as `0x${string}`,\n topics: log.topics,\n data: log.data,\n })),\n }\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval))\n }\n\n throw new Error(`Transaction receipt not found after ${timeout}ms: ${hash}`)\n}\n\n// ============================================================================\n// WdkBridge\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 readonly tracker: BridgeTracker\n\n constructor(trackerConfig?: BridgeTrackerConfig) {\n this.tracker = new BridgeTracker(trackerConfig)\n }\n\n /**\n * Create bridge signer adapter from WDK signer.\n *\n * Uses JSON-RPC calls for readContract / waitForTransactionReceipt,\n * and delegates writeContract to the WDK signer's sendTransaction.\n */\n private createBridgeSigner(signer: WDKSigner, rpcUrl: string): BridgeSigner {\n return {\n address: signer.address,\n\n readContract: async (args) => {\n const data = encodeFunctionCall(args)\n const result = await jsonRpcCall(rpcUrl, 'eth_call', [{ to: args.address, data }, 'latest'])\n return decodeFunctionResult(args, result)\n },\n\n writeContract: async (args) => {\n const data = encodeFunctionCall(args)\n const { hash } = await signer.sendTransaction({\n to: args.address as `0x${string}`,\n data,\n value: args.value,\n })\n return hash\n },\n\n waitForTransactionReceipt: async (args) => {\n return pollForReceipt(rpcUrl, args.hash, 60000)\n },\n }\n }\n\n /**\n * Get or create a bridge instance for a chain\n *\n * @param chain - Chain name (e.g., \"arbitrum\", \"ethereum\")\n * @param signer - WDK signer for the chain\n * @param rpcUrl - JSON-RPC endpoint URL for the chain\n */\n getBridge(chain: string, signer: WDKSigner, rpcUrl: string): Usdt0Bridge {\n const cached = this.bridges.get(chain)\n if (cached) {\n return cached\n }\n\n const bridgeSigner = this.createBridgeSigner(signer, rpcUrl)\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 * Bridge Delivery Tracking\n *\n * Tracks LayerZero cross-chain bridge message delivery status\n * by polling the LayerZero Scan API.\n */\n\n/** Bridge delivery status (mirrors @t402/wdk-bridge BridgeDeliveryStatus) */\nexport type BridgeDeliveryStatus = 'INFLIGHT' | 'CONFIRMING' | 'DELIVERED' | 'FAILED' | 'BLOCKED'\n\n/** Options for waiting for delivery */\nexport interface WaitOptions {\n timeout?: number\n pollInterval?: number\n onStatusChange?: (status: BridgeDeliveryStatus) => void\n}\n\n/** Result of delivery confirmation */\nexport interface DeliveryResult {\n success: boolean\n status: BridgeDeliveryStatus\n dstTxHash?: `0x${string}`\n srcTxHash: `0x${string}`\n messageGuid: `0x${string}`\n error?: string\n}\n\nconst LAYERZERO_SCAN_API = 'https://scan.layerzero-api.com/v1'\n\nexport interface BridgeTrackerConfig {\n apiBaseUrl?: string // Override for testing\n}\n\nexport class BridgeTracker {\n private apiBaseUrl: string\n\n constructor(config?: BridgeTrackerConfig) {\n this.apiBaseUrl = config?.apiBaseUrl ?? LAYERZERO_SCAN_API\n }\n\n /** Get current status of a bridge message */\n async getStatus(txHash: string): Promise<{ status: BridgeDeliveryStatus; dstTxHash?: string }> {\n const response = await fetch(`${this.apiBaseUrl}/messages/tx/${txHash}`)\n if (!response.ok) {\n if (response.status === 404) return { status: 'INFLIGHT' }\n throw new Error(`LayerZero API error: ${response.status}`)\n }\n const data = await response.json()\n return mapLayerZeroStatus(data)\n }\n\n /** Wait for delivery with polling */\n async waitForDelivery(txHash: string, options?: WaitOptions): Promise<DeliveryResult> {\n const timeout = options?.timeout ?? 600_000 // 10 min default\n const pollInterval = options?.pollInterval ?? 10_000 // 10s default\n const startTime = Date.now()\n\n while (Date.now() - startTime < timeout) {\n const { status, dstTxHash } = await this.getStatus(txHash)\n options?.onStatusChange?.(status)\n\n if (status === 'DELIVERED') {\n return {\n success: true,\n status,\n dstTxHash: dstTxHash as `0x${string}`,\n srcTxHash: txHash as `0x${string}`,\n messageGuid: txHash as `0x${string}`,\n }\n }\n if (status === 'FAILED' || status === 'BLOCKED') {\n return {\n success: false,\n status,\n srcTxHash: txHash as `0x${string}`,\n messageGuid: txHash as `0x${string}`,\n error: `Bridge ${status.toLowerCase()}`,\n }\n }\n\n await new Promise((r) => setTimeout(r, pollInterval))\n }\n\n return {\n success: false,\n status: 'INFLIGHT',\n srcTxHash: txHash as `0x${string}`,\n messageGuid: txHash as `0x${string}`,\n error: 'Timeout waiting for delivery',\n }\n }\n}\n\nexport function mapLayerZeroStatus(data: unknown): {\n status: BridgeDeliveryStatus\n dstTxHash?: string\n} {\n const obj = data as Record<string, unknown> | null\n if (!obj) return { status: 'INFLIGHT' }\n\n const messages = (obj.messages ?? obj.data ?? []) as unknown\n const msg = (Array.isArray(messages) ? messages[0] : messages) as Record<string, unknown> | null\n if (!msg) return { status: 'INFLIGHT' }\n\n const lzStatus = ((msg.status as string) ?? (msg.msgStatus as string) ?? '').toUpperCase()\n\n if (lzStatus === 'DELIVERED' || lzStatus === 'DESTINATION_FINALIZED') {\n return { status: 'DELIVERED', dstTxHash: msg.dstTxHash as string | undefined }\n }\n if (lzStatus === 'FAILED') return { status: 'FAILED' }\n if (lzStatus === 'BLOCKED') return { status: 'BLOCKED' }\n if (lzStatus.includes('CONFIRM')) return { status: 'CONFIRMING' }\n return { status: 'INFLIGHT' }\n}\n","/**\n * Structured logging for @t402/wdk\n *\n * Provides a pluggable logger interface with console and noop implementations.\n */\n\n/**\n * Logger interface for T402 WDK operations.\n *\n * Accepts an optional context object for structured metadata.\n */\nexport interface T402Logger {\n debug(msg: string, ctx?: Record<string, unknown>): void\n info(msg: string, ctx?: Record<string, unknown>): void\n warn(msg: string, ctx?: Record<string, unknown>): void\n error(msg: string, ctx?: Record<string, unknown>): void\n}\n\n/**\n * Console-based logger that outputs structured JSON context.\n */\nexport const defaultLogger: T402Logger = {\n debug(msg, ctx) {\n if (ctx && Object.keys(ctx).length > 0) {\n console.debug(`[t402] ${msg}`, ctx)\n } else {\n console.debug(`[t402] ${msg}`)\n }\n },\n info(msg, ctx) {\n if (ctx && Object.keys(ctx).length > 0) {\n console.info(`[t402] ${msg}`, ctx)\n } else {\n console.info(`[t402] ${msg}`)\n }\n },\n warn(msg, ctx) {\n if (ctx && Object.keys(ctx).length > 0) {\n console.warn(`[t402] ${msg}`, ctx)\n } else {\n console.warn(`[t402] ${msg}`)\n }\n },\n error(msg, ctx) {\n if (ctx && Object.keys(ctx).length > 0) {\n console.error(`[t402] ${msg}`, ctx)\n } else {\n console.error(`[t402] ${msg}`)\n }\n },\n}\n\n/**\n * Silent logger that discards all messages.\n */\nexport const noopLogger: T402Logger = {\n debug() {},\n info() {},\n warn() {},\n error() {},\n}\n\n/**\n * Create a correlation ID for tracing operations across calls.\n *\n * Returns a compact random hex string suitable for log correlation.\n */\nexport function createCorrelationId(): string {\n const bytes = new Uint8Array(8)\n if (typeof globalThis.crypto?.getRandomValues === 'function') {\n globalThis.crypto.getRandomValues(bytes)\n } else {\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.floor(Math.random() * 256)\n }\n }\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n}\n\n/**\n * Metric callback signature for observability hooks.\n */\nexport type MetricCallback = (name: string, value: number, tags?: Record<string, string>) => void\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 * Idempotent Payment Protection\n *\n * Prevents duplicate payments through idempotency key tracking\n * and nonce management for EVM permits and other chain-specific operations.\n */\n\nimport type { EnrichedReceipt } from './receipts.js'\n\n/**\n * Idempotency manager interface for preventing duplicate payments\n */\nexport interface IdempotencyManager {\n /** Check if a payment with this key has already been processed */\n checkDuplicate(key: string): Promise<boolean>\n /** Record a completed payment */\n recordPayment(key: string, receipt: EnrichedReceipt): Promise<void>\n /** Get the current nonce for an address on a chain */\n getNonce(address: string, chain: string): Promise<bigint>\n /** Increment and return the next nonce for an address on a chain */\n incrementNonce(address: string, chain: string): Promise<bigint>\n}\n\n/**\n * In-memory idempotency manager\n *\n * Tracks payment keys and nonces in memory. Suitable for single-process\n * applications. For distributed systems, implement IdempotencyManager\n * with a shared store (Redis, database, etc.).\n */\nexport class InMemoryIdempotencyManager implements IdempotencyManager {\n private _payments = new Map<string, EnrichedReceipt>()\n private _nonces = new Map<string, bigint>()\n private _recentTxHashes: Set<string>\n private _maxRecentTxHashes: number\n\n /**\n * @param maxRecentTxHashes - Maximum number of recent tx hashes to track for dedup (default: 1000)\n */\n constructor(maxRecentTxHashes = 1000) {\n this._recentTxHashes = new Set()\n this._maxRecentTxHashes = maxRecentTxHashes\n }\n\n async checkDuplicate(key: string): Promise<boolean> {\n return this._payments.has(key)\n }\n\n async recordPayment(key: string, receipt: EnrichedReceipt): Promise<void> {\n this._payments.set(key, receipt)\n\n // Also track the tx hash if available\n if (receipt.txHash) {\n this._addTxHash(receipt.txHash)\n }\n }\n\n async getNonce(address: string, chain: string): Promise<bigint> {\n const key = this._nonceKey(address, chain)\n return this._nonces.get(key) ?? 0n\n }\n\n async incrementNonce(address: string, chain: string): Promise<bigint> {\n const key = this._nonceKey(address, chain)\n const current = this._nonces.get(key) ?? 0n\n const next = current + 1n\n this._nonces.set(key, next)\n return next\n }\n\n /**\n * Check if a transaction hash has been seen recently\n */\n hasTxHash(txHash: string): boolean {\n return this._recentTxHashes.has(txHash.toLowerCase())\n }\n\n /**\n * Get a recorded payment by its idempotency key\n */\n getPayment(key: string): EnrichedReceipt | undefined {\n return this._payments.get(key)\n }\n\n /**\n * Get the number of recorded payments\n */\n get size(): number {\n return this._payments.size\n }\n\n /**\n * Clear all recorded payments and nonces\n */\n clear(): void {\n this._payments.clear()\n this._nonces.clear()\n this._recentTxHashes.clear()\n }\n\n private _nonceKey(address: string, chain: string): string {\n return `${chain}:${address.toLowerCase()}`\n }\n\n private _addTxHash(txHash: string): void {\n const normalized = txHash.toLowerCase()\n\n // Evict oldest entries if at capacity\n if (this._recentTxHashes.size >= this._maxRecentTxHashes) {\n const first = this._recentTxHashes.values().next().value\n if (first !== undefined) {\n this._recentTxHashes.delete(first)\n }\n }\n\n this._recentTxHashes.add(normalized)\n }\n}\n\n/**\n * Nonce manager for EVM permit signatures\n *\n * Caches on-chain nonces locally and increments after each use.\n * Supports querying the on-chain nonce to resync.\n */\nexport class NonceManager {\n private _nonces = new Map<string, bigint>()\n\n /**\n * Get the current nonce for an address on a chain.\n * If no cached value exists, uses the provided fetcher to query on-chain.\n *\n * @param address - Wallet address\n * @param chain - Chain identifier\n * @param fetchOnChainNonce - Optional function to query the on-chain nonce\n */\n async getNonce(\n address: string,\n chain: string,\n fetchOnChainNonce?: () => Promise<bigint>,\n ): Promise<bigint> {\n const key = this._key(address, chain)\n const cached = this._nonces.get(key)\n if (cached !== undefined) {\n return cached\n }\n\n if (fetchOnChainNonce) {\n const onChainNonce = await fetchOnChainNonce()\n this._nonces.set(key, onChainNonce)\n return onChainNonce\n }\n\n return 0n\n }\n\n /**\n * Increment the nonce after a successful signature/transaction\n */\n increment(address: string, chain: string): bigint {\n const key = this._key(address, chain)\n const current = this._nonces.get(key) ?? 0n\n const next = current + 1n\n this._nonces.set(key, next)\n return next\n }\n\n /**\n * Set the nonce to a specific value (e.g., after querying on-chain)\n */\n set(address: string, chain: string, nonce: bigint): void {\n const key = this._key(address, chain)\n this._nonces.set(key, nonce)\n }\n\n /**\n * Reset the nonce for an address on a chain (forces re-fetch on next use)\n */\n reset(address: string, chain: string): void {\n const key = this._key(address, chain)\n this._nonces.delete(key)\n }\n\n /**\n * Clear all cached nonces\n */\n clear(): void {\n this._nonces.clear()\n }\n\n private _key(address: string, chain: string): string {\n return `${chain}:${address.toLowerCase()}`\n }\n}\n\n/**\n * Generate an idempotency key from payment parameters\n *\n * Creates a deterministic key based on the payment details to\n * prevent the same logical payment from being processed twice.\n */\nexport function generateIdempotencyKey(params: {\n url: string\n network: string\n amount: string\n payTo: string\n from: string\n}): string {\n return `${params.from.toLowerCase()}:${params.payTo.toLowerCase()}:${params.network}:${params.amount}:${params.url}`\n}\n","/**\n * Transaction Screening / Compliance\n *\n * Provides a pluggable compliance framework for screening transactions\n * before execution. Supports multiple providers and maintains an audit trail.\n */\n\n/**\n * Parameters for a compliance check\n */\nexport interface ComplianceCheckParams {\n from: string\n to: string\n chain: string\n amount: bigint\n asset: string\n}\n\n/**\n * Result of a compliance check\n */\nexport interface ComplianceResult {\n allowed: boolean\n reason?: string\n}\n\n/**\n * A provider that performs compliance checks\n */\nexport interface ComplianceProvider {\n check(params: ComplianceCheckParams): Promise<ComplianceResult>\n}\n\n/**\n * An audit trail entry for a compliance check\n */\nexport interface ComplianceEvent {\n timestamp: number\n action: 'payment' | 'bridge' | 'swap'\n params: ComplianceCheckParams\n result: ComplianceResult\n}\n\n/**\n * Manages compliance checks across multiple providers\n *\n * All registered providers are checked in order. If any provider\n * returns `allowed: false`, the transaction is blocked.\n *\n * @example\n * ```typescript\n * const manager = new ComplianceManager();\n * manager.registerProvider(new BlacklistProvider(new Set(['0xbad...'])));\n *\n * const result = await manager.check({\n * from: '0xsender...',\n * to: '0xreceiver...',\n * chain: 'eip155:42161',\n * amount: 1000000n,\n * asset: 'USDT0',\n * });\n *\n * if (!result.allowed) {\n * console.log('Blocked:', result.reason);\n * }\n * ```\n */\nexport class ComplianceManager {\n private _providers: ComplianceProvider[] = []\n private _auditTrail: ComplianceEvent[] = []\n\n /**\n * Register a compliance provider\n */\n registerProvider(provider: ComplianceProvider): void {\n this._providers.push(provider)\n }\n\n /**\n * Run all registered providers against the given parameters.\n * Returns the first rejection, or `{ allowed: true }` if all pass.\n *\n * @param params - The transaction parameters to check\n * @param action - The type of action being performed (default: 'payment')\n */\n async check(\n params: ComplianceCheckParams,\n action: 'payment' | 'bridge' | 'swap' = 'payment',\n ): Promise<ComplianceResult> {\n // If no providers registered, allow by default\n if (this._providers.length === 0) {\n const result: ComplianceResult = { allowed: true }\n this._recordEvent(action, params, result)\n return result\n }\n\n for (const provider of this._providers) {\n const result = await provider.check(params)\n if (!result.allowed) {\n this._recordEvent(action, params, result)\n return result\n }\n }\n\n const result: ComplianceResult = { allowed: true }\n this._recordEvent(action, params, result)\n return result\n }\n\n /**\n * Get the full audit trail of compliance checks\n */\n getAuditTrail(): ComplianceEvent[] {\n return [...this._auditTrail]\n }\n\n /**\n * Clear the audit trail\n */\n clearAuditTrail(): void {\n this._auditTrail = []\n }\n\n /**\n * Get the number of registered providers\n */\n get providerCount(): number {\n return this._providers.length\n }\n\n private _recordEvent(\n action: 'payment' | 'bridge' | 'swap',\n params: ComplianceCheckParams,\n result: ComplianceResult,\n ): void {\n this._auditTrail.push({\n timestamp: Date.now(),\n action,\n params,\n result,\n })\n }\n}\n\n/**\n * Built-in blacklist compliance provider\n *\n * Blocks transactions involving addresses in the blacklist.\n * Checks both `from` and `to` addresses.\n */\nexport class BlacklistProvider implements ComplianceProvider {\n private _addresses: Set<string>\n\n constructor(addresses?: Set<string>) {\n this._addresses = new Set()\n if (addresses) {\n for (const addr of addresses) {\n this._addresses.add(addr.toLowerCase())\n }\n }\n }\n\n async check(params: ComplianceCheckParams): Promise<ComplianceResult> {\n const fromLower = params.from.toLowerCase()\n const toLower = params.to.toLowerCase()\n\n if (this._addresses.has(fromLower)) {\n return { allowed: false, reason: `Address ${params.from} is blacklisted (sender)` }\n }\n\n if (this._addresses.has(toLower)) {\n return { allowed: false, reason: `Address ${params.to} is blacklisted (recipient)` }\n }\n\n return { allowed: true }\n }\n\n /**\n * Add an address to the blacklist\n */\n addAddress(address: string): void {\n this._addresses.add(address.toLowerCase())\n }\n\n /**\n * Remove an address from the blacklist\n */\n removeAddress(address: string): void {\n this._addresses.delete(address.toLowerCase())\n }\n\n /**\n * Check if an address is blacklisted\n */\n hasAddress(address: string): boolean {\n return this._addresses.has(address.toLowerCase())\n }\n\n /**\n * Get the number of blacklisted addresses\n */\n get size(): number {\n return this._addresses.size\n }\n}\n\n/**\n * Amount limit compliance provider\n *\n * Blocks transactions that exceed a configurable per-transaction or\n * cumulative amount limit.\n */\nexport class AmountLimitProvider implements ComplianceProvider {\n private _maxPerTransaction: bigint\n private _cumulativeAmounts = new Map<string, bigint>()\n private _maxCumulative: bigint | undefined\n\n /**\n * @param maxPerTransaction - Maximum amount per single transaction\n * @param maxCumulative - Optional maximum cumulative amount per address\n */\n constructor(maxPerTransaction: bigint, maxCumulative?: bigint) {\n this._maxPerTransaction = maxPerTransaction\n this._maxCumulative = maxCumulative\n }\n\n async check(params: ComplianceCheckParams): Promise<ComplianceResult> {\n if (params.amount > this._maxPerTransaction) {\n return {\n allowed: false,\n reason: `Amount ${params.amount} exceeds per-transaction limit of ${this._maxPerTransaction}`,\n }\n }\n\n if (this._maxCumulative !== undefined) {\n const key = params.from.toLowerCase()\n const cumulative = (this._cumulativeAmounts.get(key) ?? 0n) + params.amount\n if (cumulative > this._maxCumulative) {\n return {\n allowed: false,\n reason: `Cumulative amount ${cumulative} would exceed limit of ${this._maxCumulative}`,\n }\n }\n // Record the cumulative amount\n this._cumulativeAmounts.set(key, cumulative)\n }\n\n return { allowed: true }\n }\n\n /**\n * Reset cumulative tracking for an address\n */\n resetCumulative(address: string): void {\n this._cumulativeAmounts.delete(address.toLowerCase())\n }\n\n /**\n * Reset all cumulative tracking\n */\n resetAllCumulative(): void {\n this._cumulativeAmounts.clear()\n }\n}\n","/**\n * Webhook Notifications\n *\n * Sends payment event notifications to configured webhook endpoints\n * with HMAC-SHA256 signature verification and retry support.\n */\n\n/**\n * Configuration for a webhook endpoint\n */\nexport interface WebhookConfig {\n /** The URL to send webhook payloads to */\n url: string\n /** Secret key for HMAC-SHA256 signing */\n secret: string\n /** Event types to subscribe to (default: all events) */\n events?: string[]\n /** Number of retry attempts on failure (default: 3) */\n retries?: number\n}\n\n/**\n * Webhook payload for payment events\n */\nexport interface PaymentWebhookPayload {\n event: 'payment.completed' | 'payment.failed'\n timestamp: string\n payment: {\n network: string\n txHash?: string\n amount: string\n asset: string\n payer: string\n resource: string\n }\n signature: string\n}\n\n/**\n * Result of a webhook delivery attempt\n */\nexport interface WebhookDeliveryResult {\n url: string\n success: boolean\n statusCode?: number\n error?: string\n attempts: number\n}\n\n/**\n * Manages webhook notifications for payment events\n *\n * @example\n * ```typescript\n * const webhooks = new WebhookManager([{\n * url: 'https://example.com/webhooks',\n * secret: 'whsec_...',\n * events: ['payment.completed'],\n * }]);\n *\n * await webhooks.send('payment.completed', {\n * network: 'eip155:42161',\n * amount: '1000000',\n * asset: 'USDT0',\n * payer: '0x...',\n * resource: '/api/premium',\n * });\n * ```\n */\nexport class WebhookManager {\n private _configs: WebhookConfig[]\n private _deliveryResults: WebhookDeliveryResult[] = []\n private _maxDeliveryHistory: number\n\n /**\n * @param configs - Array of webhook endpoint configurations\n * @param maxDeliveryHistory - Maximum number of delivery results to retain (default: 100)\n */\n constructor(configs: WebhookConfig[], maxDeliveryHistory = 100) {\n this._configs = configs\n this._maxDeliveryHistory = maxDeliveryHistory\n }\n\n /**\n * Send a webhook event to all subscribed endpoints\n *\n * @param event - Event type (e.g., 'payment.completed')\n * @param payload - Event payload data\n * @returns Array of delivery results for each endpoint\n */\n async send(event: string, payload: unknown): Promise<WebhookDeliveryResult[]> {\n const results: WebhookDeliveryResult[] = []\n\n for (const config of this._configs) {\n // Skip if this endpoint doesn't subscribe to this event\n if (config.events && config.events.length > 0 && !config.events.includes(event)) {\n continue\n }\n\n const result = await this._deliver(config, event, payload)\n results.push(result)\n this._recordResult(result)\n }\n\n return results\n }\n\n /**\n * Sign a payload with HMAC-SHA256\n *\n * @param payload - The payload to sign (will be JSON.stringify'd if not a string)\n * @param secret - The secret key\n * @returns Hex-encoded HMAC-SHA256 signature\n */\n signPayload(payload: unknown, secret: string): string {\n const crypto = require('crypto') as typeof import('crypto')\n const data = typeof payload === 'string' ? payload : JSON.stringify(payload)\n return crypto.createHmac('sha256', secret).update(data).digest('hex')\n }\n\n /**\n * Verify an HMAC-SHA256 signature on a payload\n *\n * @param payload - The raw payload string\n * @param signature - The signature to verify\n * @param secret - The secret key\n * @returns True if the signature is valid\n */\n verifySignature(payload: string, signature: string, secret: string): boolean {\n const expected = this.signPayload(payload, secret)\n // Constant-time comparison\n if (expected.length !== signature.length) {\n return false\n }\n const crypto = require('crypto') as typeof import('crypto')\n return crypto.timingSafeEqual(Buffer.from(expected, 'hex'), Buffer.from(signature, 'hex'))\n }\n\n /**\n * Get recent delivery results\n */\n getDeliveryResults(): WebhookDeliveryResult[] {\n return [...this._deliveryResults]\n }\n\n /**\n * Clear delivery history\n */\n clearDeliveryResults(): void {\n this._deliveryResults = []\n }\n\n /**\n * Get the number of configured webhook endpoints\n */\n get endpointCount(): number {\n return this._configs.length\n }\n\n private async _deliver(\n config: WebhookConfig,\n event: string,\n payload: unknown,\n ): Promise<WebhookDeliveryResult> {\n const maxRetries = config.retries ?? 3\n const body = JSON.stringify({ event, timestamp: new Date().toISOString(), data: payload })\n const signature = this.signPayload(body, config.secret)\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n const response = await fetch(config.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Webhook-Signature': signature,\n 'X-Webhook-Event': event,\n },\n body,\n })\n\n if (response.ok) {\n return {\n url: config.url,\n success: true,\n statusCode: response.status,\n attempts: attempt,\n }\n }\n\n // Non-retryable status codes\n if (response.status >= 400 && response.status < 500) {\n return {\n url: config.url,\n success: false,\n statusCode: response.status,\n error: `HTTP ${response.status}`,\n attempts: attempt,\n }\n }\n\n // Server error - retry\n if (attempt === maxRetries) {\n return {\n url: config.url,\n success: false,\n statusCode: response.status,\n error: `HTTP ${response.status} after ${maxRetries} attempts`,\n attempts: attempt,\n }\n }\n\n // Exponential backoff before retry\n await this._sleep(Math.min(1000 * Math.pow(2, attempt - 1), 10000))\n } catch (error) {\n if (attempt === maxRetries) {\n return {\n url: config.url,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n attempts: attempt,\n }\n }\n\n // Exponential backoff before retry\n await this._sleep(Math.min(1000 * Math.pow(2, attempt - 1), 10000))\n }\n }\n\n // Should not reach here, but just in case\n return {\n url: config.url,\n success: false,\n error: 'Max retries exceeded',\n attempts: maxRetries,\n }\n }\n\n private _recordResult(result: WebhookDeliveryResult): void {\n this._deliveryResults.push(result)\n\n // Evict oldest entries if over capacity\n while (this._deliveryResults.length > this._maxDeliveryHistory) {\n this._deliveryResults.shift()\n }\n }\n\n private _sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n }\n}\n","/**\n * WDK Indexer Verifier - Unified cross-chain transaction verification.\n *\n * Uses wdk-indexer-http for querying transactions across EVM, TON, TRON, Solana.\n * Falls back to chain-specific RPC verification if indexer is unavailable.\n */\n\n/**\n * Configuration for the WDK indexer verifier\n */\nexport interface WdkIndexerConfig {\n /** Indexer HTTP endpoint */\n endpoint: string\n /** API key (optional) */\n apiKey?: string\n /** Request timeout in ms (default: 10000) */\n timeout?: number\n}\n\n/**\n * Query parameters for a transaction\n */\nexport interface TransactionQuery {\n /** Transaction hash */\n txHash: string\n /** Network identifier (CAIP-2 or chain name) */\n network: string\n /** Expected recipient address */\n expectedTo?: string\n /** Expected amount in smallest units */\n expectedAmount?: string\n}\n\n/**\n * Result of a transaction query\n */\nexport interface TransactionResult {\n /** Whether the transaction was found */\n found: boolean\n /** Whether the transaction is confirmed */\n confirmed: boolean\n /** Sender address */\n from: string\n /** Recipient address */\n to: string\n /** Transfer amount in smallest units */\n amount: string\n /** Token contract address or symbol */\n token: string\n /** Block number (if confirmed) */\n blockNumber?: number\n /** Block timestamp (if confirmed) */\n timestamp?: number\n}\n\n/**\n * Verification result\n */\nexport interface PaymentVerification {\n /** Whether the payment is verified */\n verified: boolean\n /** Reason for failure (if not verified) */\n reason?: string\n}\n\n/**\n * WDK Indexer Verifier\n *\n * Provides unified cross-chain transaction verification by querying\n * a wdk-indexer-http endpoint. This enables the facilitator to verify\n * payments across all supported chains through a single API.\n *\n * @example\n * ```typescript\n * import { WdkIndexerVerifier } from '@t402/wdk';\n *\n * const verifier = new WdkIndexerVerifier({\n * endpoint: 'https://indexer.example.com',\n * apiKey: 'your-api-key',\n * });\n *\n * // Verify a payment\n * const result = await verifier.verifyPayment({\n * txHash: '0xabc...',\n * network: 'eip155:42161',\n * expectedTo: '0xpayee...',\n * expectedAmount: '1000000',\n * });\n *\n * if (result.verified) {\n * console.log('Payment verified');\n * }\n * ```\n */\nexport class WdkIndexerVerifier {\n private endpoint: string\n private apiKey?: string\n private timeout: number\n\n constructor(config: WdkIndexerConfig) {\n if (!config.endpoint) {\n throw new Error('Indexer endpoint is required')\n }\n\n // Normalize endpoint (remove trailing slash)\n this.endpoint = config.endpoint.replace(/\\/$/, '')\n this.apiKey = config.apiKey\n this.timeout = config.timeout ?? 10000\n }\n\n /**\n * Query a transaction across any supported chain\n */\n async queryTransaction(query: TransactionQuery): Promise<TransactionResult> {\n if (!query.txHash) {\n throw new Error('Transaction hash is required')\n }\n if (!query.network) {\n throw new Error('Network is required')\n }\n\n const url = `${this.endpoint}/v1/transactions/${encodeURIComponent(query.network)}/${encodeURIComponent(query.txHash)}`\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`\n }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), this.timeout)\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers,\n signal: controller.signal,\n })\n\n if (!response.ok) {\n if (response.status === 404) {\n return {\n found: false,\n confirmed: false,\n from: '',\n to: '',\n amount: '0',\n token: '',\n }\n }\n throw new Error(`Indexer request failed: ${response.status} ${response.statusText}`)\n }\n\n const data = await response.json()\n\n return {\n found: true,\n confirmed: data.confirmed ?? data.status === 'confirmed',\n from: data.from ?? '',\n to: data.to ?? '',\n amount: String(data.amount ?? data.value ?? '0'),\n token: data.token ?? data.tokenAddress ?? '',\n blockNumber: data.blockNumber ?? data.block_number,\n timestamp: data.timestamp ?? data.block_timestamp,\n }\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n throw new Error(`Indexer request timed out after ${this.timeout}ms`)\n }\n throw error\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n /**\n * Verify a transaction matches expected payment parameters\n */\n async verifyPayment(query: TransactionQuery): Promise<PaymentVerification> {\n const result = await this.queryTransaction(query)\n\n if (!result.found) {\n return { verified: false, reason: 'Transaction not found' }\n }\n\n if (!result.confirmed) {\n return { verified: false, reason: 'Transaction not yet confirmed' }\n }\n\n if (query.expectedTo) {\n const normalizedExpected = query.expectedTo.toLowerCase()\n const normalizedActual = result.to.toLowerCase()\n if (normalizedActual !== normalizedExpected) {\n return {\n verified: false,\n reason: `Recipient mismatch: expected ${query.expectedTo}, got ${result.to}`,\n }\n }\n }\n\n if (query.expectedAmount) {\n const expected = BigInt(query.expectedAmount)\n const actual = BigInt(result.amount)\n if (actual < expected) {\n return {\n verified: false,\n reason: `Amount insufficient: expected ${query.expectedAmount}, got ${result.amount}`,\n }\n }\n }\n\n return { verified: true }\n }\n\n /**\n * Check indexer health\n */\n async healthCheck(): Promise<boolean> {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), this.timeout)\n\n try {\n const headers: Record<string, string> = {}\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`\n }\n\n const response = await fetch(`${this.endpoint}/health`, {\n method: 'GET',\n headers,\n signal: controller.signal,\n })\n\n return response.ok\n } catch {\n return false\n } finally {\n clearTimeout(timeoutId)\n }\n }\n}\n\n/**\n * Create a WDK indexer verifier\n */\nexport function createIndexerVerifier(config: WdkIndexerConfig): WdkIndexerVerifier {\n return new WdkIndexerVerifier(config)\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","/**\n * Moonpay fiat on-ramp provider for T402 WDK\n *\n * Enables zero-crypto users to purchase USDT/USDT0 directly\n * via Moonpay's widget and fund their wallet for T402 payments.\n */\n\nimport type {\n FiatOnRampProvider,\n FiatOnRampQuote,\n FiatOnRampParams,\n FiatOnRampResult,\n} from '../types.js'\n\n/**\n * Moonpay provider configuration\n */\nexport interface MoonpayConfig {\n /** Moonpay API key */\n apiKey: string\n /** Environment (default: 'production') */\n environment?: 'sandbox' | 'production'\n}\n\n/**\n * CAIP-2 network to Moonpay currency code mapping\n */\nconst NETWORK_TO_MOONPAY_CURRENCY: Record<string, string> = {\n 'eip155:1': 'usdt',\n 'eip155:42161': 'usdt_arbitrum',\n 'eip155:137': 'usdt_polygon',\n 'eip155:8453': 'usdt_base',\n 'eip155:10': 'usdt_optimism',\n 'eip155:43114': 'usdt_avalanche_c_chain',\n 'eip155:56': 'usdt_bsc',\n}\n\nconst SUPPORTED_FIAT_CURRENCIES = ['USD', 'EUR', 'GBP']\n\nconst SUPPORTED_NETWORKS = Object.keys(NETWORK_TO_MOONPAY_CURRENCY)\n\nconst BASE_URLS: Record<string, string> = {\n production: 'https://buy.moonpay.com',\n sandbox: 'https://buy-sandbox.moonpay.com',\n}\n\nconst API_URLS: Record<string, string> = {\n production: 'https://api.moonpay.com',\n sandbox: 'https://api.moonpay.com',\n}\n\n/**\n * MoonpayOnRampProvider - Fiat on-ramp via Moonpay\n *\n * @example\n * ```typescript\n * import { MoonpayOnRampProvider } from '@t402/wdk';\n *\n * const moonpay = new MoonpayOnRampProvider({\n * apiKey: 'pk_test_...',\n * environment: 'sandbox',\n * });\n *\n * // Get a quote\n * const quote = await moonpay.getQuote({\n * fiatAmount: 100,\n * fiatCurrency: 'USD',\n * network: 'eip155:42161',\n * });\n *\n * // Create widget URL for the user\n * const result = moonpay.createWidget({\n * fiatAmount: 100,\n * fiatCurrency: 'USD',\n * walletAddress: '0x...',\n * network: 'eip155:42161',\n * });\n *\n * // Open result.widgetUrl in browser/webview\n * ```\n */\nexport class MoonpayOnRampProvider implements FiatOnRampProvider {\n readonly name = 'moonpay'\n private _apiKey: string\n private _environment: 'sandbox' | 'production'\n\n constructor(config: MoonpayConfig) {\n if (!config.apiKey) {\n throw new Error('Moonpay API key is required')\n }\n this._apiKey = config.apiKey\n this._environment = config.environment ?? 'production'\n }\n\n /**\n * Get the base widget URL for the current environment\n */\n get baseUrl(): string {\n return BASE_URLS[this._environment]\n }\n\n /**\n * Get the API base URL for the current environment\n */\n get apiUrl(): string {\n return API_URLS[this._environment]\n }\n\n /**\n * Get a quote for fiat-to-crypto conversion\n *\n * This method fetches a real-time quote from Moonpay.\n * Override `_fetchQuote` for testing.\n */\n async getQuote(\n params: Pick<FiatOnRampParams, 'fiatAmount' | 'fiatCurrency' | 'network'>,\n ): Promise<FiatOnRampQuote> {\n const currencyCode = this._getCurrencyCode(params.network)\n if (!currencyCode) {\n throw new Error(`Network \"${params.network}\" is not supported by Moonpay`)\n }\n\n if (params.fiatAmount <= 0) {\n throw new Error('fiatAmount must be greater than 0')\n }\n\n if (!SUPPORTED_FIAT_CURRENCIES.includes(params.fiatCurrency.toUpperCase())) {\n throw new Error(\n `Currency \"${params.fiatCurrency}\" is not supported. Supported: ${SUPPORTED_FIAT_CURRENCIES.join(', ')}`,\n )\n }\n\n const quoteUrl = `${this.apiUrl}/v3/currencies/${currencyCode}/buy_quote?apiKey=${this._apiKey}&baseCurrencyAmount=${params.fiatAmount}&baseCurrencyCode=${params.fiatCurrency.toLowerCase()}`\n\n const data = await this._fetchQuote(quoteUrl)\n\n return {\n fiatAmount: params.fiatAmount,\n fiatCurrency: params.fiatCurrency.toUpperCase(),\n cryptoAmount: String(data.quoteCurrencyAmount ?? '0'),\n cryptoCurrency: 'USDT',\n exchangeRate: Number(data.quoteCurrencyPrice ?? 1),\n fees: {\n network: String(data.networkFeeAmount ?? '0'),\n service: String(data.feeAmount ?? '0'),\n total: String(data.totalFeeAmount ?? '0'),\n },\n estimatedTime: 600, // ~10 minutes typical for card purchases\n }\n }\n\n /**\n * Fetch quote from Moonpay API (override in tests)\n */\n async _fetchQuote(url: string): Promise<Record<string, unknown>> {\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(`Moonpay API error: ${response.status} ${response.statusText}`)\n }\n return response.json() as Promise<Record<string, unknown>>\n }\n\n /**\n * Create a Moonpay widget URL for the user\n */\n createWidget(params: FiatOnRampParams): FiatOnRampResult {\n const currencyCode = this._getCurrencyCode(params.network)\n if (!currencyCode) {\n throw new Error(`Network \"${params.network}\" is not supported by Moonpay`)\n }\n\n if (!params.walletAddress) {\n throw new Error('walletAddress is required')\n }\n\n if (params.fiatAmount <= 0) {\n throw new Error('fiatAmount must be greater than 0')\n }\n\n const queryParams = new URLSearchParams({\n apiKey: this._apiKey,\n currencyCode,\n baseCurrencyCode: params.fiatCurrency.toLowerCase(),\n baseCurrencyAmount: String(params.fiatAmount),\n walletAddress: params.walletAddress,\n })\n\n if (params.redirectUrl) {\n queryParams.set('redirectURL', params.redirectUrl)\n }\n\n const widgetUrl = `${this.baseUrl}?${queryParams.toString()}`\n const orderId = `mp_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`\n const expiresAt = new Date(Date.now() + 30 * 60 * 1000).toISOString() // 30 minutes\n\n return { widgetUrl, orderId, expiresAt }\n }\n\n /**\n * Get supported fiat currencies\n */\n getSupportedCurrencies(): string[] {\n return [...SUPPORTED_FIAT_CURRENCIES]\n }\n\n /**\n * Get supported CAIP-2 networks\n */\n getSupportedNetworks(): string[] {\n return [...SUPPORTED_NETWORKS]\n }\n\n /**\n * Map CAIP-2 network to Moonpay currency code\n */\n private _getCurrencyCode(network: string): string | undefined {\n return NETWORK_TO_MOONPAY_CURRENCY[network]\n }\n}\n\n/**\n * Get the Moonpay currency code for a CAIP-2 network\n * Exported for testing\n */\nexport function getMoonpayCurrencyCode(network: string): string | undefined {\n return NETWORK_TO_MOONPAY_CURRENCY[network]\n}\n","/**\n * A2A + WDK Adapter\n *\n * Bridges T402WDK wallets with the A2A (Agent-to-Agent) payment transport,\n * enabling AI agents to make payments using WDK-managed wallets.\n */\n\nimport type { T402WDK } from '../t402wdk.js'\nimport type { SignerEntry } from '../types.js'\n\n/**\n * Payment requirements received from an A2A server (402 response).\n * Matches the core PaymentRequired type shape.\n */\nexport interface A2APaymentRequired {\n t402Version: number\n resource: { url: string; description?: string; mimeType?: string }\n accepts: Array<{\n scheme: string\n network: string\n asset: string\n amount: string\n payTo: string\n maxTimeoutSeconds: number\n extra: Record<string, unknown>\n }>\n extensions?: Record<string, unknown>\n}\n\n/**\n * Payment payload to submit to an A2A server.\n * Matches the core PaymentPayload type shape.\n */\nexport interface A2APaymentPayload {\n t402Version: number\n resource?: { url: string; description?: string; mimeType?: string }\n accepted: A2APaymentRequired['accepts'][0]\n payload: Record<string, unknown>\n extensions?: Record<string, unknown>\n}\n\n/**\n * Options for the WDK A2A payment client adapter.\n */\nexport interface WdkA2AOptions {\n /** Maximum spending limit per payment (in atomic units) */\n spendingLimit?: bigint\n /** Callback when manual approval is required */\n onApprovalRequired?: (payment: { amount: bigint; network: string }) => Promise<boolean>\n /** Auto-check balance before payment */\n autoBalance?: boolean\n /** Auto-bridge if insufficient balance on target chain */\n autoBridge?: boolean\n /** Preferred payment scheme (default: \"exact\") */\n preferredScheme?: string\n}\n\n/**\n * Result of createWdkA2APaymentClient.\n */\nexport interface WdkA2APaymentClient {\n /** Signer entries from WDK for all configured chains */\n signers: SignerEntry[]\n /** Handle a 402 payment required response */\n paymentHandler: (req: A2APaymentRequired) => Promise<A2APaymentPayload>\n}\n\n/**\n * Find the best matching payment option for the available signers.\n */\nfunction findBestOption(\n accepts: A2APaymentRequired['accepts'],\n signers: SignerEntry[],\n preferredScheme: string,\n): A2APaymentRequired['accepts'][0] | undefined {\n const signerNetworks = new Set(signers.map((s) => s.network))\n\n // Prefer matching both scheme and network\n const exactMatch = accepts.find(\n (a) => a.scheme === preferredScheme && signerNetworks.has(a.network),\n )\n if (exactMatch) return exactMatch\n\n // Match by network only\n const networkMatch = accepts.find((a) => signerNetworks.has(a.network))\n if (networkMatch) return networkMatch\n\n // Match by scheme only\n const schemeMatch = accepts.find((a) => a.scheme === preferredScheme)\n if (schemeMatch) return schemeMatch\n\n return accepts[0]\n}\n\n/**\n * Create a WDK-backed A2A payment client.\n *\n * Extracts all configured chain signers from WDK and wraps them for A2A use.\n * The returned `paymentHandler` selects the best signer for the payment\n * requirements, optionally checks balance, and creates a signed payment payload.\n *\n * @param wdk - An initialized T402WDK instance\n * @param options - Configuration options\n * @returns Object with signers and a paymentHandler function\n *\n * @example\n * ```typescript\n * const { signers, paymentHandler } = await createWdkA2APaymentClient(wdk, {\n * spendingLimit: 10_000_000n, // 10 USDT0\n * autoBalance: true,\n * });\n *\n * // When the A2A agent receives a 402 response:\n * const payload = await paymentHandler(paymentRequired);\n * // Submit payload back to the A2A server\n * ```\n */\nexport async function createWdkA2APaymentClient(\n wdk: T402WDK,\n options?: WdkA2AOptions,\n): Promise<WdkA2APaymentClient> {\n const preferredScheme = options?.preferredScheme ?? 'exact'\n\n // Get all signers from WDK\n const signers = await wdk.getAllSigners({ schemes: [preferredScheme] })\n\n const paymentHandler = async (req: A2APaymentRequired): Promise<A2APaymentPayload> => {\n if (!req.accepts || req.accepts.length === 0) {\n throw new Error('No payment options in requirements')\n }\n\n // Find the best option\n const selected = findBestOption(req.accepts, signers, preferredScheme)\n if (!selected) {\n throw new Error('No compatible payment option found for available signers')\n }\n\n // Check spending limit\n if (options?.spendingLimit !== undefined) {\n const amount = BigInt(selected.amount)\n if (amount > options.spendingLimit) {\n throw new Error(`Payment amount ${amount} exceeds spending limit ${options.spendingLimit}`)\n }\n }\n\n // Request approval if callback provided\n if (options?.onApprovalRequired) {\n const approved = await options.onApprovalRequired({\n amount: BigInt(selected.amount),\n network: selected.network,\n })\n if (!approved) {\n throw new Error('Payment rejected by approval callback')\n }\n }\n\n // Find the matching signer\n const signerEntry =\n signers.find((s) => s.network === selected.network && s.scheme === selected.scheme) ??\n signers.find((s) => s.network === selected.network)\n\n if (!signerEntry) {\n throw new Error(`No signer available for network ${selected.network}`)\n }\n\n // Auto-balance check\n if (options?.autoBalance) {\n const chainName = getChainNameFromNetwork(wdk, selected.network)\n if (chainName) {\n const balance = await wdk.getUsdt0Balance(chainName)\n const requiredAmount = BigInt(selected.amount)\n if (balance < requiredAmount && options.autoBridge) {\n // Try to find a chain with enough balance and bridge\n const best = await wdk.findBestChainForPayment(requiredAmount)\n if (best && best.chain !== chainName) {\n await wdk.bridgeUsdt0({\n fromChain: best.chain,\n toChain: chainName,\n amount: requiredAmount,\n })\n }\n }\n }\n }\n\n // Sign the payment using the WDK signer\n const signer = signerEntry.signer as {\n signTypedData: (params: Record<string, unknown>) => Promise<string>\n address: string\n }\n\n // Create EIP-3009 transferWithAuthorization typed data\n const now = Math.floor(Date.now() / 1000)\n const deadline = now + selected.maxTimeoutSeconds\n const nonce =\n '0x' +\n Array.from(globalThis.crypto.getRandomValues(new Uint8Array(32)))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n\n const chainId = parseInt(selected.network.split(':')[1] || '0')\n\n const signature = await signer.signTypedData({\n domain: {\n name: 'USD₮0',\n version: '1',\n chainId,\n verifyingContract: selected.asset,\n },\n types: {\n TransferWithAuthorization: [\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'validAfter', type: 'uint256' },\n { name: 'validBefore', type: 'uint256' },\n { name: 'nonce', type: 'bytes32' },\n ],\n },\n primaryType: 'TransferWithAuthorization',\n message: {\n from: signer.address,\n to: selected.payTo,\n value: BigInt(selected.amount),\n validAfter: 0n,\n validBefore: BigInt(deadline),\n nonce,\n },\n })\n\n return {\n t402Version: req.t402Version,\n resource: req.resource,\n accepted: selected,\n payload: {\n signature,\n from: signer.address,\n validAfter: '0',\n validBefore: deadline.toString(),\n nonce,\n },\n }\n }\n\n return { signers, paymentHandler }\n}\n\n/**\n * Get chain name from CAIP-2 network identifier.\n */\nfunction getChainNameFromNetwork(wdk: T402WDK, network: string): string | undefined {\n for (const chain of wdk.getConfiguredChains()) {\n const config = wdk.getChainConfig(chain)\n if (config && config.network === network) {\n return chain\n }\n }\n return undefined\n}\n","/**\n * Facilitator + WDK Adapter\n *\n * Wraps a T402WDK wallet as a facilitator-compatible signer, enabling WDK\n * wallets to be used for on-chain settlement (verify + settle operations).\n */\n\nimport type { T402WDK } from '../t402wdk.js'\nimport type { WDKSigner } from '../signer.js'\n\n/**\n * Options for the facilitator WDK signer adapter.\n */\nexport interface FacilitatorWdkSignerOptions {\n /** Automatically settle payments after verification */\n autoSettle?: boolean\n /** Auto-bridge received payments to this chain (CAIP-2 network or chain name) */\n bridgeToMainChain?: string\n}\n\n/**\n * Facilitator-compatible signer backed by WDK.\n */\nexport interface FacilitatorWdkSigner {\n /** Wallet address on the target chain */\n address: string\n /** Sign a transaction for on-chain settlement */\n signTransaction: (tx: unknown) => Promise<string>\n /** Sign typed data (EIP-712) */\n signTypedData: (data: {\n domain: Record<string, unknown>\n types: Record<string, unknown>\n primaryType: string\n message: Record<string, unknown>\n }) => Promise<string>\n /** Send a signed transaction */\n sendTransaction: (params: { to: string; value?: bigint; data?: string }) => Promise<string>\n}\n\n/**\n * Convert a T402WDK instance into a facilitator-compatible signer for a given chain.\n *\n * The returned signer can be used with `toFacilitatorEvmSigner()` or directly\n * with a `t402Facilitator` instance for on-chain payment verification and settlement.\n *\n * @param wdk - An initialized T402WDK instance\n * @param chain - Chain name (e.g., \"arbitrum\", \"base\")\n * @param options - Optional configuration\n * @returns A facilitator-compatible signer object\n *\n * @example\n * ```typescript\n * const signer = await toFacilitatorWdkSigner(wdk, 'arbitrum', {\n * autoSettle: true,\n * bridgeToMainChain: 'arbitrum',\n * });\n *\n * // Use the signer with the facilitator\n * console.log('Facilitator address:', signer.address);\n * ```\n */\nexport async function toFacilitatorWdkSigner(\n wdk: T402WDK,\n chain: string,\n options?: FacilitatorWdkSignerOptions,\n): Promise<FacilitatorWdkSigner> {\n // Get the WDK signer for the specified chain\n const wdkSigner: WDKSigner = await wdk.getSigner(chain)\n const address = wdkSigner.address\n\n return {\n address,\n\n async signTransaction(tx: unknown): Promise<string> {\n // For EVM chains, sign typed data if the tx is structured as EIP-712\n if (tx && typeof tx === 'object' && 'domain' in tx) {\n const typedData = tx as {\n domain: Record<string, unknown>\n types: Record<string, unknown>\n primaryType: string\n message: Record<string, unknown>\n }\n return wdkSigner.signTypedData(typedData)\n }\n\n // For raw message signing, convert to string\n if (typeof tx === 'string') {\n return wdkSigner.signMessage(tx)\n }\n\n throw new Error('Unsupported transaction format for WDK facilitator signer')\n },\n\n async signTypedData(data: {\n domain: Record<string, unknown>\n types: Record<string, unknown>\n primaryType: string\n message: Record<string, unknown>\n }): Promise<string> {\n return wdkSigner.signTypedData(data)\n },\n\n async sendTransaction(params: { to: string; value?: bigint; data?: string }): Promise<string> {\n const result = await wdkSigner.sendTransaction({\n to: params.to as `0x${string}`,\n value: params.value,\n data: params.data,\n })\n\n // Auto-bridge if configured\n if (options?.bridgeToMainChain && options.bridgeToMainChain !== chain) {\n // Check balance on source chain\n const balance = await wdk.getUsdt0Balance(chain)\n if (balance > 0n) {\n try {\n await wdk.bridgeUsdt0({\n fromChain: chain,\n toChain: options.bridgeToMainChain,\n amount: balance,\n })\n } catch {\n // Bridge failure is non-fatal for the facilitator\n }\n }\n }\n\n return result.hash\n },\n }\n}\n\n/**\n * Create facilitator signers for all configured WDK chains.\n *\n * @param wdk - An initialized T402WDK instance\n * @param options - Optional configuration applied to all signers\n * @returns Map of chain name to facilitator signer\n *\n * @example\n * ```typescript\n * const signers = await createFacilitatorSigners(wdk, {\n * bridgeToMainChain: 'arbitrum',\n * });\n *\n * for (const [chain, signer] of signers) {\n * console.log(`${chain}: ${signer.address}`);\n * }\n * ```\n */\nexport async function createFacilitatorSigners(\n wdk: T402WDK,\n options?: FacilitatorWdkSignerOptions,\n): Promise<Map<string, FacilitatorWdkSigner>> {\n const chains = wdk.getConfiguredChains()\n const signers = new Map<string, FacilitatorWdkSigner>()\n\n const results = await Promise.allSettled(\n chains.map(async (chain) => {\n const signer = await toFacilitatorWdkSigner(wdk, chain, options)\n return { chain, signer }\n }),\n )\n\n for (const result of results) {\n if (result.status === 'fulfilled') {\n signers.set(result.value.chain, result.value.signer)\n }\n }\n\n return signers\n}\n","/**\n * SIWx + WDK Adapter\n *\n * Wraps a T402WDK wallet as a SIWx (Sign-In-With-X) signer, enabling\n * WDK wallets to sign CAIP-122 authentication messages.\n */\n\nimport type { T402WDK } from '../t402wdk.js'\n\n/**\n * SIWx signer interface, compatible with the SIWxSigner from @t402/extensions.\n */\nexport interface SIWxSigner {\n /** Wallet address */\n address: string\n /** Sign a personal message (EIP-191) */\n signMessage(message: string): Promise<string>\n /** Sign EIP-712 typed data */\n signTypedData(data: {\n domain: unknown\n types: unknown\n primaryType: string\n message: unknown\n }): Promise<string>\n}\n\n/**\n * Convert a T402WDK instance into a SIWx-compatible signer for a given chain.\n *\n * The returned signer implements the `SIWxSigner` interface used by\n * `@t402/extensions` for CAIP-122 Sign-In-With-X authentication flows.\n *\n * @param wdk - An initialized T402WDK instance\n * @param chain - Chain name (e.g., \"arbitrum\", \"base\")\n * @returns A SIWx-compatible signer\n *\n * @example\n * ```typescript\n * import { toSIWxSigner } from '@t402/wdk';\n * import { createSIWxPayload, encodeSIWxHeader } from '@t402/extensions';\n *\n * const siwxSigner = await toSIWxSigner(wdk, 'arbitrum');\n *\n * // Create and sign SIWx payload\n * const payload = await createSIWxPayload(serverExtension, siwxSigner);\n * const header = encodeSIWxHeader(payload);\n *\n * // Include in request\n * fetch(url, { headers: { 'X-T402-SIWx': header } });\n * ```\n */\nexport async function toSIWxSigner(wdk: T402WDK, chain: string): Promise<SIWxSigner> {\n const wdkSigner = await wdk.getSigner(chain)\n\n return {\n address: wdkSigner.address,\n\n async signMessage(message: string): Promise<string> {\n return wdkSigner.signMessage(message)\n },\n\n async signTypedData(data: {\n domain: unknown\n types: unknown\n primaryType: string\n message: unknown\n }): Promise<string> {\n return wdkSigner.signTypedData({\n domain: data.domain as Record<string, unknown>,\n types: data.types as Record<string, unknown>,\n primaryType: data.primaryType,\n message: data.message as Record<string, unknown>,\n })\n },\n }\n}\n\n/**\n * Create SIWx signers for all configured WDK chains.\n *\n * @param wdk - An initialized T402WDK instance\n * @returns Map of chain name to SIWx signer\n *\n * @example\n * ```typescript\n * const signers = await createSIWxSigners(wdk);\n * const arbSigner = signers.get('arbitrum');\n * ```\n */\nexport async function createSIWxSigners(wdk: T402WDK): Promise<Map<string, SIWxSigner>> {\n const chains = wdk.getConfiguredChains()\n const signers = new Map<string, SIWxSigner>()\n\n const results = await Promise.allSettled(\n chains.map(async (chain) => {\n const signer = await toSIWxSigner(wdk, chain)\n return { chain, signer }\n }),\n )\n\n for (const result of results) {\n if (result.status === 'fulfilled') {\n signers.set(result.value.chain, result.value.signer)\n }\n }\n\n return signers\n}\n"],"mappings":"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","names":["WDKErrorCode","import_evm","import_evm","module","result","HardwareWalletErrorCode","DEFAULT_DERIVATION_PATH","module"]}
|