@enclave-hq/wallet-sdk 1.2.2 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -1
- package/dist/index.d.mts +413 -10
- package/dist/index.d.ts +413 -10
- package/dist/index.js +3492 -107
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3454 -76
- package/dist/index.mjs.map +1 -1
- package/dist/react/index.d.mts +88 -9
- package/dist/react/index.d.ts +88 -9
- package/dist/react/index.js +3341 -79
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +3315 -57
- package/dist/react/index.mjs.map +1 -1
- package/package.json +7 -2
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/events.ts","../src/core/types.ts","../src/core/errors.ts","../src/adapters/base/wallet-adapter.ts","../src/adapters/base/browser-wallet-adapter.ts","../src/utils/address/universal-address.ts","../src/utils/address/evm-utils.ts","../src/utils/chain-info.ts","../src/adapters/evm/metamask.ts","../src/adapters/tron/tronlink.ts","../src/adapters/evm/private-key.ts","../src/core/adapter-registry.ts","../src/core/wallet-manager.ts","../src/auth/message-generator.ts","../src/auth/signature-verifier.ts","../src/detection/supported-wallets.ts","../src/detection/detector.ts","../src/utils/address/tron-converter.ts","../src/utils/validation.ts","../src/utils/hex.ts","../src/index.ts"],"names":["ChainUtilsChainType","WalletType","WalletState","EventEmitter","ChainType","createWalletClient","http","createPublicClient","account"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Event System\n */\n\nimport EventEmitter from 'eventemitter3'\n\n/**\n * Type-safe Event Emitter\n * Uses type assertion to provide type-safe API while avoiding type conflicts with base class\n */\nexport class TypedEventEmitter<\n TEvents extends Record<string, (...args: any[]) => void>\n> {\n private emitter = new EventEmitter()\n\n on<K extends keyof TEvents>(\n event: K,\n handler: TEvents[K]\n ): this {\n this.emitter.on(event as string, handler as any)\n return this\n }\n\n once<K extends keyof TEvents>(\n event: K,\n handler: TEvents[K]\n ): this {\n this.emitter.once(event as string, handler as any)\n return this\n }\n\n off<K extends keyof TEvents>(\n event: K,\n handler: TEvents[K]\n ): this {\n this.emitter.off(event as string, handler as any)\n return this\n }\n\n emit<K extends keyof TEvents>(\n event: K,\n ...args: Parameters<TEvents[K]>\n ): boolean {\n return this.emitter.emit(event as string, ...args)\n }\n\n removeAllListeners<K extends keyof TEvents>(event?: K): this {\n if (event !== undefined) {\n this.emitter.removeAllListeners(event as string)\n } else {\n this.emitter.removeAllListeners()\n }\n return this\n }\n}\n\n","/**\n * Core type definitions\n */\n\nimport { ChainType as ChainUtilsChainType } from '@enclave-hq/chain-utils'\n\n// ========== Enumerations ==========\n\n/**\n * Chain type (re-exported from chain-utils)\n */\nexport const ChainType = ChainUtilsChainType\nexport type ChainType = ChainUtilsChainType\n\n/**\n * Wallet Types\n */\nexport enum WalletType {\n METAMASK = 'metamask',\n WALLETCONNECT = 'walletconnect',\n COINBASE_WALLET = 'coinbase-wallet',\n TRONLINK = 'tronlink',\n WALLETCONNECT_TRON = 'walletconnect-tron',\n PRIVATE_KEY = 'private-key',\n}\n\n/**\n * Wallet States\n */\nexport enum WalletState {\n DISCONNECTED = 'disconnected',\n CONNECTING = 'connecting',\n CONNECTED = 'connected',\n ERROR = 'error',\n}\n\n// ========== Account Related ==========\n\n/**\n * Universal Address (chain-agnostic address)\n * Format: \"chainId:address\"\n */\nexport type UniversalAddress = string\n\n/**\n * Account Information\n */\nexport interface Account {\n /** Universal Address (chainId:address) */\n universalAddress: UniversalAddress\n /** Native address (e.g., 0x... or T...) */\n nativeAddress: string\n /** Chain ID */\n chainId: number\n /** Chain Type */\n chainType: ChainType\n /** Whether this is an active account */\n isActive: boolean\n /** Account balance (optional) */\n balance?: string\n /** Account name (optional) */\n name?: string\n}\n\n// ========== Signer Interface ==========\n\n/**\n * Signer interface\n * Compatible with Enclave SDK's ISigner interface\n * Provides a unified interface for signing operations\n * \n * Note: The signer should handle the appropriate signature standard:\n * - EIP-191 for EVM chains\n * - TIP-191 for TRON\n * - Other standards for other chains\n */\nexport interface ISigner {\n /**\n * Sign a message (raw message string, not hash)\n * @param message - Raw message string to sign\n * The signer should handle the appropriate signature standard\n * @returns Signature (hex string with 0x prefix)\n */\n signMessage(message: string): Promise<string>;\n\n /**\n * Get the signer's address\n * @returns Address (hex string with 0x prefix for EVM, Base58 for TRON)\n */\n getAddress(): Promise<string>;\n}\n\n// ========== Adapter Related ==========\n\n/**\n * 钱包适配器接口\n * Extends ISigner to provide unified signing interface\n */\nexport interface IWalletAdapter extends ISigner {\n // 元数据\n readonly type: WalletType\n readonly chainType: ChainType\n readonly name: string\n readonly icon?: string\n \n // 状态\n state: WalletState\n currentAccount: Account | null\n \n // 连接管理\n connect(chainId?: number): Promise<Account>\n disconnect(): Promise<void>\n isAvailable(): Promise<boolean>\n \n // 签名\n signMessage(message: string): Promise<string>\n signTransaction?(transaction: Transaction): Promise<string>\n signTypedData?(typedData: any): Promise<string>\n \n // 链切换(仅 EVM 支持)\n switchChain?(chainId: number): Promise<void>\n addChain?(chainConfig: AddChainParams): Promise<void>\n \n // 合约调用\n readContract?<T = any>(params: ContractReadParams): Promise<T>\n writeContract?(params: ContractWriteParams): Promise<string>\n estimateGas?(params: ContractWriteParams): Promise<bigint>\n waitForTransaction?(txHash: string, confirmations?: number): Promise<TransactionReceipt>\n \n // Provider 访问\n getProvider(): any\n getSigner?(): any\n \n // 事件监听\n on(event: string, handler: (...args: any[]) => void): void\n off(event: string, handler: (...args: any[]) => void): void\n removeAllListeners(event?: string): void\n}\n\n/**\n * 合约读取参数\n */\nexport interface ContractReadParams {\n address: string\n abi: any[]\n functionName: string\n args?: any[]\n}\n\n/**\n * 合约写入参数\n */\nexport interface ContractWriteParams extends ContractReadParams {\n value?: string // 发送的原生代币数量(wei)\n gas?: number\n gasPrice?: string // Legacy gas price (for pre-EIP-1559 networks)\n maxFeePerGas?: string // EIP-1559: Maximum fee per gas (in wei)\n maxPriorityFeePerGas?: string // EIP-1559: Maximum priority fee per gas (in wei)\n}\n\n/**\n * EVM 交易参数\n */\nexport interface EVMTransaction {\n to: string\n value?: string | bigint\n data?: string\n gas?: string | bigint\n gasPrice?: string | bigint\n maxFeePerGas?: string | bigint\n maxPriorityFeePerGas?: string | bigint\n nonce?: number\n chainId?: number\n}\n\n/**\n * Tron 交易参数\n */\nexport interface TronTransaction {\n // Tron 交易格式\n txID?: string\n raw_data?: any\n raw_data_hex?: string\n visible?: boolean\n}\n\n/**\n * 通用交易类型\n */\nexport type Transaction = EVMTransaction | TronTransaction\n\n/**\n * 交易回执\n */\nexport interface TransactionReceipt {\n transactionHash: string\n blockNumber: number\n blockHash: string\n from: string\n to?: string\n status: 'success' | 'failed'\n gasUsed: string\n effectiveGasPrice?: string\n logs?: any[]\n}\n\n/**\n * 添加链参数\n */\nexport interface AddChainParams {\n chainId: number\n chainName: string\n nativeCurrency: {\n name: string\n symbol: string\n decimals: number\n }\n rpcUrls: string[]\n blockExplorerUrls?: string[]\n iconUrls?: string[]\n}\n\n// ========== WalletManager 相关 ==========\n\n/**\n * WalletManager 配置\n */\nexport interface WalletManagerConfig {\n /** 是否启用自动存储(localStorage) */\n enableStorage?: boolean\n /** 存储键前缀 */\n storagePrefix?: string\n /** 默认链 ID(EVM) */\n defaultChainId?: number\n /** 默认 Tron 链 ID */\n defaultTronChainId?: number\n /** WalletConnect 项目 ID */\n walletConnectProjectId?: string\n}\n\n/**\n * 已连接的钱包信息\n */\nexport interface ConnectedWallet {\n /** 账户信息 */\n account: Account\n /** 钱包类型 */\n walletType: WalletType\n /** Chain Type */\n chainType: ChainType\n /** 是否为主钱包 */\n isPrimary: boolean\n /** 是否支持链切换 */\n canSwitchChain: boolean\n /** 适配器实例 */\n adapter: IWalletAdapter\n}\n\n// ========== 事件相关 ==========\n\n/**\n * WalletManager 事件类型\n */\nexport interface WalletManagerEvents extends Record<string, (...args: any[]) => void> {\n // 主钱包事件\n accountChanged: (account: Account | null) => void\n chainChanged: (chainId: number, account: Account) => void\n disconnected: () => void\n \n // 任意钱包事件\n walletAccountChanged: (chainType: ChainType, account: Account | null, isPrimary: boolean) => void\n walletChainChanged: (chainType: ChainType, chainId: number, account: Account, isPrimary: boolean) => void\n walletDisconnected: (chainType: ChainType, isPrimary: boolean) => void\n \n // 主钱包切换\n primaryWalletSwitched: (newPrimary: Account, oldPrimary: Account | null, chainType: ChainType) => void\n \n // 错误\n error: (error: Error) => void\n}\n\n// ========== 存储相关 ==========\n\n/**\n * 存储的钱包历史记录\n */\nexport interface WalletHistoryRecord {\n universalAddress: UniversalAddress\n nativeAddress: string\n chainId: number\n chainType: ChainType\n walletType: WalletType\n lastConnected: number // 时间戳\n name?: string\n}\n\n/**\n * 存储的数据结构\n */\nexport interface StorageData {\n /** 当前 Universal Address */\n current: UniversalAddress | null\n /** 主钱包类型(用于自动恢复连接) */\n primaryWalletType?: WalletType\n /** 主钱包的 ChainID(用于自动恢复连接) */\n primaryChainId?: number\n /** 历史记录 */\n history: WalletHistoryRecord[]\n}\n\n// ========== 钱包检测 ==========\n\n/**\n * 钱包可用性信息\n */\nexport interface WalletAvailability {\n walletType: WalletType\n chainType: ChainType\n isAvailable: boolean\n downloadUrl?: string\n detected: boolean\n}\n\n","/**\n * Error Type Definitions\n */\n\n/**\n * Base Error Class\n */\nexport class WalletSDKError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: any\n ) {\n super(message)\n this.name = 'WalletSDKError'\n Object.setPrototypeOf(this, WalletSDKError.prototype)\n }\n}\n\n/**\n * Wallet Not Connected Error\n */\nexport class WalletNotConnectedError extends WalletSDKError {\n constructor(walletType?: string) {\n super(\n walletType\n ? `Wallet ${walletType} is not connected`\n : 'No wallet is connected',\n 'WALLET_NOT_CONNECTED',\n { walletType }\n )\n this.name = 'WalletNotConnectedError'\n }\n}\n\n/**\n * Wallet Not Available Error\n */\nexport class WalletNotAvailableError extends WalletSDKError {\n constructor(walletType: string, downloadUrl?: string) {\n super(\n `Wallet ${walletType} is not available. Please install it first.`,\n 'WALLET_NOT_AVAILABLE',\n { walletType, downloadUrl }\n )\n this.name = 'WalletNotAvailableError'\n }\n}\n\n/**\n * Connection Rejected Error\n */\nexport class ConnectionRejectedError extends WalletSDKError {\n constructor(walletType: string) {\n super(\n `Connection to ${walletType} was rejected by user`,\n 'CONNECTION_REJECTED',\n { walletType }\n )\n this.name = 'ConnectionRejectedError'\n }\n}\n\n/**\n * Chain Not Supported Error\n */\nexport class ChainNotSupportedError extends WalletSDKError {\n constructor(chainId: number, walletType: string) {\n super(\n `Chain ${chainId} is not supported by ${walletType}`,\n 'CHAIN_NOT_SUPPORTED',\n { chainId, walletType }\n )\n this.name = 'ChainNotSupportedError'\n }\n}\n\n/**\n * Signature Rejected Error\n */\nexport class SignatureRejectedError extends WalletSDKError {\n constructor(message?: string) {\n super(\n message || 'Signature was rejected by user',\n 'SIGNATURE_REJECTED'\n )\n this.name = 'SignatureRejectedError'\n }\n}\n\n/**\n * Transaction Failed Error\n */\nexport class TransactionFailedError extends WalletSDKError {\n constructor(txHash: string, reason?: string) {\n super(\n `Transaction ${txHash} failed${reason ? `: ${reason}` : ''}`,\n 'TRANSACTION_FAILED',\n { txHash, reason }\n )\n this.name = 'TransactionFailedError'\n }\n}\n\n/**\n * Method Not Supported Error\n */\nexport class MethodNotSupportedError extends WalletSDKError {\n constructor(method: string, walletType: string) {\n super(\n `Method ${method} is not supported by ${walletType}`,\n 'METHOD_NOT_SUPPORTED',\n { method, walletType }\n )\n this.name = 'MethodNotSupportedError'\n }\n}\n\n/**\n * 配置错误\n */\nexport class ConfigurationError extends WalletSDKError {\n constructor(message: string, details?: any) {\n super(message, 'CONFIGURATION_ERROR', details)\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * 网络错误\n */\nexport class NetworkError extends WalletSDKError {\n constructor(message: string, details?: any) {\n super(message, 'NETWORK_ERROR', details)\n this.name = 'NetworkError'\n }\n}\n\n\n","/**\n * 钱包适配器基类\n */\n\nimport EventEmitter from 'eventemitter3'\nimport {\n WalletType,\n ChainType,\n WalletState,\n Account,\n IWalletAdapter,\n ContractReadParams,\n ContractWriteParams,\n TransactionReceipt,\n} from '../../core/types'\nimport { WalletNotConnectedError, MethodNotSupportedError } from '../../core/errors'\n\n/**\n * 钱包适配器基类\n */\nexport abstract class WalletAdapter extends EventEmitter implements IWalletAdapter {\n // 元数据\n abstract readonly type: WalletType\n abstract readonly chainType: ChainType\n abstract readonly name: string\n readonly icon?: string\n\n // 状态\n state: WalletState = WalletState.DISCONNECTED\n currentAccount: Account | null = null\n\n // 连接管理\n abstract connect(chainId?: number): Promise<Account>\n abstract disconnect(): Promise<void>\n abstract isAvailable(): Promise<boolean>\n\n // 签名\n abstract signMessage(message: string): Promise<string>\n\n /**\n * Get the signer's address (implements ISigner interface)\n * Returns the native address of the current account\n */\n async getAddress(): Promise<string> {\n this.ensureConnected()\n if (!this.currentAccount) {\n throw new WalletNotConnectedError(this.type)\n }\n return this.currentAccount.nativeAddress\n }\n\n signTransaction?(_transaction: any): Promise<string> {\n throw new MethodNotSupportedError('signTransaction', this.type)\n }\n\n signTypedData?(_typedData: any): Promise<string> {\n throw new MethodNotSupportedError('signTypedData', this.type)\n }\n\n // 链切换(默认不支持)\n switchChain?(_chainId: number): Promise<void> {\n throw new MethodNotSupportedError('switchChain', this.type)\n }\n\n addChain?(_chainConfig: any): Promise<void> {\n throw new MethodNotSupportedError('addChain', this.type)\n }\n\n // 合约调用(默认不支持)\n async readContract<T = any>(_params: ContractReadParams): Promise<T> {\n throw new MethodNotSupportedError('readContract', this.type)\n }\n\n async writeContract(_params: ContractWriteParams): Promise<string> {\n throw new MethodNotSupportedError('writeContract', this.type)\n }\n\n async estimateGas(_params: ContractWriteParams): Promise<bigint> {\n throw new MethodNotSupportedError('estimateGas', this.type)\n }\n\n async waitForTransaction(_txHash: string, _confirmations?: number): Promise<TransactionReceipt> {\n throw new MethodNotSupportedError('waitForTransaction', this.type)\n }\n\n // Provider 访问\n abstract getProvider(): any\n\n getSigner?(): any {\n throw new MethodNotSupportedError('getSigner', this.type)\n }\n\n // 工具方法\n protected ensureConnected(): void {\n if (this.state !== WalletState.CONNECTED || !this.currentAccount) {\n throw new WalletNotConnectedError(this.type)\n }\n }\n\n protected setState(state: WalletState): void {\n this.state = state\n }\n\n protected setAccount(account: Account | null): void {\n this.currentAccount = account\n }\n\n protected emitAccountChanged(account: Account | null): void {\n this.emit('accountChanged', account)\n }\n\n protected emitChainChanged(chainId: number): void {\n this.emit('chainChanged', chainId)\n }\n\n protected emitDisconnected(): void {\n this.emit('disconnected')\n }\n\n protected emitError(error: Error): void {\n this.emit('error', error)\n }\n\n // EventEmitter 方法(从 EventEmitter3 继承)\n // removeAllListeners 已经由 EventEmitter 提供\n}\n\n","/**\n * 浏览器钱包适配器基类\n * 用于 MetaMask、TronLink 等浏览器插件钱包\n */\n\nimport { WalletAdapter } from './wallet-adapter'\nimport { WalletState } from '../../core/types'\nimport { WalletNotAvailableError } from '../../core/errors'\n\n/**\n * 浏览器钱包适配器基类\n */\nexport abstract class BrowserWalletAdapter extends WalletAdapter {\n /**\n * 获取浏览器中的钱包 provider\n */\n protected abstract getBrowserProvider(): any | undefined\n\n /**\n * 检查钱包是否可用\n */\n async isAvailable(): Promise<boolean> {\n if (typeof window === 'undefined') {\n return false\n }\n return this.getBrowserProvider() !== undefined\n }\n\n /**\n * 确保钱包已安装\n */\n protected async ensureAvailable(): Promise<void> {\n const isAvailable = await this.isAvailable()\n if (!isAvailable) {\n throw new WalletNotAvailableError(\n this.type,\n this.getDownloadUrl()\n )\n }\n }\n\n /**\n * 获取下载链接\n */\n protected abstract getDownloadUrl(): string\n\n /**\n * 设置事件监听\n */\n protected abstract setupEventListeners(): void\n\n /**\n * 移除事件监听\n */\n protected abstract removeEventListeners(): void\n\n /**\n * 断开连接时清理\n */\n async disconnect(): Promise<void> {\n this.removeEventListeners()\n this.setState(WalletState.DISCONNECTED)\n this.setAccount(null)\n this.emitDisconnected()\n }\n}\n\n\n","/**\n * Universal Address 工具\n * 格式: \"chainId:address\"\n */\n\nimport type { UniversalAddress } from '../../core/types'\n\n/**\n * 创建 Universal Address\n */\nexport function createUniversalAddress(\n chainId: number,\n address: string\n): UniversalAddress {\n return `${chainId}:${address}`\n}\n\n/**\n * 解析 Universal Address\n */\nexport function parseUniversalAddress(universalAddress: UniversalAddress): {\n chainId: number\n address: string\n} | null {\n const parts = universalAddress.split(':')\n if (parts.length !== 2) {\n return null\n }\n \n const chainId = parseInt(parts[0], 10)\n if (isNaN(chainId)) {\n return null\n }\n \n return {\n chainId,\n address: parts[1],\n }\n}\n\n/**\n * 验证 Universal Address 格式\n */\nexport function isValidUniversalAddress(universalAddress: string): boolean {\n return parseUniversalAddress(universalAddress) !== null\n}\n\n/**\n * 从 Universal Address 提取链 ID\n */\nexport function getChainIdFromUniversalAddress(\n universalAddress: UniversalAddress\n): number | null {\n const parsed = parseUniversalAddress(universalAddress)\n return parsed ? parsed.chainId : null\n}\n\n/**\n * 从 Universal Address 提取地址\n */\nexport function getAddressFromUniversalAddress(\n universalAddress: UniversalAddress\n): string | null {\n const parsed = parseUniversalAddress(universalAddress)\n return parsed ? parsed.address : null\n}\n\n/**\n * 比较两个 Universal Address 是否相同\n */\nexport function compareUniversalAddresses(\n a: UniversalAddress,\n b: UniversalAddress\n): boolean {\n return a.toLowerCase() === b.toLowerCase()\n}\n\n\n","/**\n * EVM 地址工具\n */\n\nimport { getAddress, isAddress } from 'viem'\n\n/**\n * 验证 EVM 地址\n */\nexport function isValidEVMAddress(address: string): boolean {\n return isAddress(address)\n}\n\n/**\n * 格式化 EVM 地址(checksum)\n */\nexport function formatEVMAddress(address: string): string {\n if (!isAddress(address)) {\n throw new Error(`Invalid EVM address: ${address}`)\n }\n return getAddress(address)\n}\n\n/**\n * 比较两个 EVM 地址是否相同\n */\nexport function compareEVMAddresses(a: string, b: string): boolean {\n try {\n return getAddress(a) === getAddress(b)\n } catch {\n return false\n }\n}\n\n/**\n * 缩短地址显示\n * 例如: 0x1234...5678\n */\nexport function shortenAddress(address: string, chars = 4): string {\n if (!isAddress(address)) {\n return address\n }\n const formatted = getAddress(address)\n return `${formatted.substring(0, chars + 2)}...${formatted.substring(42 - chars)}`\n}\n\n\n","/**\n * Chain information constants\n */\n\nimport { \n ChainType,\n nativeToSlip44,\n slip44ToNative,\n ChainInfo as ChainUtilsChainInfo\n} from '@enclave-hq/chain-utils'\n\n/**\n * Extended chain information interface (adds RPC and explorer URLs)\n */\nexport interface ChainInfo extends Omit<ChainUtilsChainInfo, 'nativeChainId' | 'slip44'> {\n id: number // Native chain ID\n slip44?: number // SLIP-44 ID (optional)\n nativeCurrency: {\n name: string\n symbol: string\n decimals: number\n }\n rpcUrls: string[]\n blockExplorerUrls?: string[]\n iconUrls?: string[]\n}\n\n/**\n * Predefined chain information\n */\nexport const CHAIN_INFO: Record<number, ChainInfo> = {\n // EVM Mainnet\n 1: {\n id: 1,\n slip44: 60, // Ethereum SLIP-44\n name: 'Ethereum Mainnet',\n chainType: ChainType.EVM,\n symbol: 'ETH',\n nativeCurrency: {\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n rpcUrls: ['https://eth.llamarpc.com'],\n blockExplorerUrls: ['https://etherscan.io'],\n },\n \n // EVM Testnets\n 11155111: {\n id: 11155111,\n name: 'Sepolia Testnet',\n chainType: ChainType.EVM,\n symbol: 'ETH',\n nativeCurrency: {\n name: 'Sepolia Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n rpcUrls: ['https://rpc.sepolia.org'],\n blockExplorerUrls: ['https://sepolia.etherscan.io'],\n },\n \n // Binance Smart Chain\n 56: {\n id: 56,\n slip44: 714, // BSC SLIP-44\n name: 'BNB Smart Chain',\n chainType: ChainType.EVM,\n symbol: 'BNB',\n nativeCurrency: {\n name: 'BNB',\n symbol: 'BNB',\n decimals: 18,\n },\n rpcUrls: ['https://bsc-dataseed.binance.org'],\n blockExplorerUrls: ['https://bscscan.com'],\n },\n \n 97: {\n id: 97,\n name: 'BNB Smart Chain Testnet',\n chainType: ChainType.EVM,\n symbol: 'BNB',\n nativeCurrency: {\n name: 'BNB',\n symbol: 'BNB',\n decimals: 18,\n },\n rpcUrls: [\n 'https://data-seed-prebsc-2-s1.binance.org:8545',\n 'https://data-seed-prebsc-1-s2.binance.org:8545',\n 'https://data-seed-prebsc-2-s2.binance.org:8545',\n 'https://data-seed-prebsc-1-s3.binance.org:8545',\n 'https://data-seed-prebsc-2-s3.binance.org:8545',\n 'https://data-seed-prebsc-1-s1.binance.org:8545' // Original main node as last fallback\n ],\n blockExplorerUrls: ['https://testnet.bscscan.com'],\n },\n \n // Polygon\n 137: {\n id: 137,\n slip44: 966, // Polygon SLIP-44\n name: 'Polygon Mainnet',\n chainType: ChainType.EVM,\n symbol: 'MATIC',\n nativeCurrency: {\n name: 'MATIC',\n symbol: 'MATIC',\n decimals: 18,\n },\n rpcUrls: ['https://polygon-rpc.com'],\n blockExplorerUrls: ['https://polygonscan.com'],\n },\n \n 80002: {\n id: 80002,\n name: 'Polygon Amoy Testnet',\n chainType: ChainType.EVM,\n symbol: 'MATIC',\n nativeCurrency: {\n name: 'MATIC',\n symbol: 'MATIC',\n decimals: 18,\n },\n rpcUrls: ['https://rpc-amoy.polygon.technology'],\n blockExplorerUrls: ['https://www.oklink.com/amoy'],\n },\n \n // Tron\n 195: {\n id: 195,\n slip44: 195, // Tron SLIP-44\n name: 'Tron Mainnet',\n chainType: ChainType.TRON,\n symbol: 'TRX',\n nativeCurrency: {\n name: 'TRX',\n symbol: 'TRX',\n decimals: 6,\n },\n rpcUrls: ['https://api.trongrid.io'],\n blockExplorerUrls: ['https://tronscan.org'],\n },\n \n // Arbitrum\n 42161: {\n id: 42161,\n slip44: 1042161, // Custom SLIP-44 (1000000 + 42161)\n name: 'Arbitrum One',\n chainType: ChainType.EVM,\n symbol: 'ETH',\n nativeCurrency: {\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n rpcUrls: ['https://arb1.arbitrum.io/rpc'],\n blockExplorerUrls: ['https://arbiscan.io'],\n },\n \n // Optimism\n 10: {\n id: 10,\n slip44: 1000010, // Custom SLIP-44 (1000000 + 10)\n name: 'Optimism',\n chainType: ChainType.EVM,\n symbol: 'ETH',\n nativeCurrency: {\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n rpcUrls: ['https://mainnet.optimism.io'],\n blockExplorerUrls: ['https://optimistic.etherscan.io'],\n },\n \n // Avalanche\n 43114: {\n id: 43114,\n slip44: 9000, // Avalanche SLIP-44\n name: 'Avalanche C-Chain',\n chainType: ChainType.EVM,\n symbol: 'AVAX',\n nativeCurrency: {\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 18,\n },\n rpcUrls: ['https://api.avax.network/ext/bc/C/rpc'],\n blockExplorerUrls: ['https://snowtrace.io'],\n },\n}\n\n/**\n * Get chain information\n */\nexport function getChainInfo(chainId: number): ChainInfo | undefined {\n return CHAIN_INFO[chainId]\n}\n\n/**\n * Get chain type\n */\nexport function getChainType(chainId: number): ChainType | undefined {\n return CHAIN_INFO[chainId]?.chainType\n}\n\n/**\n * Check if chain is EVM\n */\nexport function isEVMChain(chainId: number): boolean {\n return getChainType(chainId) === ChainType.EVM\n}\n\n/**\n * Check if chain is Tron\n */\nexport function isTronChain(chainId: number): boolean {\n return getChainType(chainId) === ChainType.TRON\n}\n\n/**\n * Get SLIP-44 ID from native chain ID\n */\nexport function getSlip44(chainId: number): number | null {\n // Check local config first\n const localInfo = CHAIN_INFO[chainId]\n if (localInfo?.slip44) {\n return localInfo.slip44\n }\n \n // Fall back to chain-utils\n return nativeToSlip44(chainId)\n}\n\n/**\n * Get native chain ID from SLIP-44 ID\n */\nexport function getNativeChainId(slip44: number): number | string | null {\n return slip44ToNative(slip44)\n}\n\n/**\n * Get all supported chains (combines local and chain-utils data)\n */\nexport function getAllChains(): ChainInfo[] {\n return Object.values(CHAIN_INFO)\n}\n\n","/**\n * MetaMask Adapter\n */\n\nimport { createWalletClient, createPublicClient, custom, http, type WalletClient, type PublicClient } from 'viem'\nimport { BrowserWalletAdapter } from '../base/browser-wallet-adapter'\nimport {\n WalletType,\n ChainType,\n WalletState,\n Account,\n AddChainParams,\n ContractReadParams,\n ContractWriteParams,\n TransactionReceipt,\n} from '../../core/types'\nimport { createUniversalAddress } from '../../utils/address/universal-address'\nimport { formatEVMAddress } from '../../utils/address/evm-utils'\nimport { ConnectionRejectedError, SignatureRejectedError, TransactionFailedError } from '../../core/errors'\nimport { getChainInfo } from '../../utils/chain-info'\n\n/**\n * MetaMask Adapter\n */\nexport class MetaMaskAdapter extends BrowserWalletAdapter {\n readonly type = WalletType.METAMASK\n readonly chainType = ChainType.EVM\n readonly name = 'MetaMask'\n readonly icon = 'https://upload.wikimedia.org/wikipedia/commons/3/36/MetaMask_Fox.svg'\n\n private walletClient: WalletClient | null = null\n private publicClient: PublicClient | null = null\n\n /**\n * Connect wallet\n */\n async connect(chainId?: number): Promise<Account> {\n await this.ensureAvailable()\n\n try {\n this.setState(WalletState.CONNECTING)\n\n const provider = this.getBrowserProvider()\n\n // Request accounts\n const accounts = await provider.request({\n method: 'eth_requestAccounts',\n })\n\n if (!accounts || accounts.length === 0) {\n throw new ConnectionRejectedError(this.type)\n }\n\n // Get current chain ID\n const currentChainId = await provider.request({\n method: 'eth_chainId',\n })\n const parsedChainId = parseInt(currentChainId, 16)\n\n // If chain ID is specified and doesn't match, try to switch\n if (chainId && chainId !== parsedChainId) {\n await this.switchChain(chainId)\n }\n\n const finalChainId = chainId || parsedChainId\n const viemChain = this.getViemChain(finalChainId) as any\n\n // Create clients (need to specify chain to support writeContract)\n this.walletClient = createWalletClient({\n account: accounts[0] as `0x${string}`,\n chain: viemChain,\n transport: custom(provider),\n })\n\n // Use our configured RPC nodes for read operations to avoid MetaMask internal RPC issues\n const chainInfo = getChainInfo(finalChainId)\n const primaryRpcUrl = chainInfo?.rpcUrls[0] // Use first (most reliable) RPC node\n \n this.publicClient = createPublicClient({\n chain: viemChain,\n transport: primaryRpcUrl ? http(primaryRpcUrl) : custom(provider), // 优先使用我们的 RPC,降级到 MetaMask provider\n }) as any\n\n // 创建账户信息\n const address = formatEVMAddress(accounts[0])\n const account: Account = {\n universalAddress: createUniversalAddress(finalChainId, address),\n nativeAddress: address,\n chainId: finalChainId,\n chainType: ChainType.EVM,\n isActive: true,\n }\n\n this.setState(WalletState.CONNECTED)\n this.setAccount(account)\n this.setupEventListeners()\n\n return account\n } catch (error: any) {\n this.setState(WalletState.ERROR)\n this.setAccount(null)\n\n if (error.code === 4001) {\n throw new ConnectionRejectedError(this.type)\n }\n\n throw error\n }\n }\n\n /**\n * 签名消息\n */\n async signMessage(message: string): Promise<string> {\n this.ensureConnected()\n\n try {\n const provider = this.getBrowserProvider()\n const signature = await provider.request({\n method: 'personal_sign',\n params: [message, this.currentAccount!.nativeAddress],\n })\n\n return signature\n } catch (error: any) {\n if (error.code === 4001) {\n throw new SignatureRejectedError()\n }\n throw error\n }\n }\n\n /**\n * 签名 TypedData (EIP-712)\n */\n async signTypedData(typedData: any): Promise<string> {\n this.ensureConnected()\n\n try {\n const provider = this.getBrowserProvider()\n const signature = await provider.request({\n method: 'eth_signTypedData_v4',\n params: [this.currentAccount!.nativeAddress, JSON.stringify(typedData)],\n })\n\n return signature\n } catch (error: any) {\n if (error.code === 4001) {\n throw new SignatureRejectedError()\n }\n throw error\n }\n }\n\n /**\n * 签名交易\n * \n * Note: This signs a raw transaction without sending it.\n * The transaction can be broadcast later using the returned signature.\n */\n async signTransaction(transaction: any): Promise<string> {\n this.ensureConnected()\n\n try {\n const provider = this.getBrowserProvider()\n \n // Prepare transaction object with proper formatting\n const tx = {\n from: this.currentAccount!.nativeAddress,\n to: transaction.to,\n value: transaction.value ? `0x${BigInt(transaction.value).toString(16)}` : undefined,\n data: transaction.data || '0x',\n gas: transaction.gas ? `0x${BigInt(transaction.gas).toString(16)}` : undefined,\n gasPrice: transaction.gasPrice && transaction.gasPrice !== 'auto' ? `0x${BigInt(transaction.gasPrice).toString(16)}` : undefined,\n maxFeePerGas: transaction.maxFeePerGas ? `0x${BigInt(transaction.maxFeePerGas).toString(16)}` : undefined,\n maxPriorityFeePerGas: transaction.maxPriorityFeePerGas ? `0x${BigInt(transaction.maxPriorityFeePerGas).toString(16)}` : undefined,\n nonce: transaction.nonce !== undefined ? `0x${transaction.nonce.toString(16)}` : undefined,\n chainId: transaction.chainId || this.currentAccount!.chainId,\n }\n\n // Sign the transaction\n const signature = await provider.request({\n method: 'eth_signTransaction',\n params: [tx],\n })\n\n return signature\n } catch (error: any) {\n if (error.code === 4001) {\n throw new SignatureRejectedError('Transaction signature was rejected by user')\n }\n throw error\n }\n }\n\n /**\n * 切换链\n */\n async switchChain(chainId: number): Promise<void> {\n // 在连接过程中允许切换链,不需要检查连接状态\n const provider = this.getBrowserProvider()\n\n try {\n await provider.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: `0x${chainId.toString(16)}` }],\n })\n\n // 更新账户信息\n if (this.currentAccount) {\n const updatedAccount: Account = {\n ...this.currentAccount,\n chainId,\n universalAddress: createUniversalAddress(chainId, this.currentAccount.nativeAddress),\n }\n this.setAccount(updatedAccount)\n this.emitChainChanged(chainId)\n }\n } catch (error: any) {\n // 链不存在,尝试添加\n if (error.code === 4902) {\n const chainInfo = getChainInfo(chainId)\n if (chainInfo) {\n await this.addChain({\n chainId: chainInfo.id,\n chainName: chainInfo.name,\n nativeCurrency: chainInfo.nativeCurrency,\n rpcUrls: chainInfo.rpcUrls,\n blockExplorerUrls: chainInfo.blockExplorerUrls,\n })\n // 添加成功后再次尝试切换\n await this.switchChain(chainId)\n } else {\n throw new Error(`Chain ${chainId} not supported`)\n }\n } else {\n throw error\n }\n }\n }\n\n /**\n * 添加链\n */\n async addChain(chainConfig: AddChainParams): Promise<void> {\n const provider = this.getBrowserProvider()\n\n await provider.request({\n method: 'wallet_addEthereumChain',\n params: [{\n chainId: `0x${chainConfig.chainId.toString(16)}`,\n chainName: chainConfig.chainName,\n nativeCurrency: chainConfig.nativeCurrency,\n rpcUrls: chainConfig.rpcUrls,\n blockExplorerUrls: chainConfig.blockExplorerUrls,\n }],\n })\n }\n\n /**\n * 读取合约\n */\n async readContract<T = any>(params: ContractReadParams): Promise<T> {\n if (!this.publicClient) {\n throw new Error('Public client not initialized')\n }\n\n const result = await this.publicClient.readContract({\n address: params.address as `0x${string}`,\n abi: params.abi,\n functionName: params.functionName,\n ...(params.args ? { args: params.args as readonly any[] } : {}),\n } as any)\n\n return result as T\n }\n\n /**\n * 写入合约\n */\n async writeContract(params: ContractWriteParams): Promise<string> {\n this.ensureConnected()\n\n if (!this.walletClient) {\n throw new Error('Wallet client not initialized')\n }\n\n try {\n // 调试日志\n console.log('🔍 [MetaMask writeContract] Gas params:', {\n gasPrice: params.gasPrice,\n maxFeePerGas: params.maxFeePerGas,\n maxPriorityFeePerGas: params.maxPriorityFeePerGas,\n });\n \n // 构建交易选项\n const txOptions: any = {\n address: params.address as `0x${string}`,\n abi: params.abi,\n functionName: params.functionName,\n ...(params.args ? { args: params.args as readonly any[] } : {}),\n value: params.value ? BigInt(params.value) : undefined,\n gas: params.gas ? BigInt(params.gas) : undefined,\n };\n\n // EIP-1559 网络优先使用 maxFeePerGas 和 maxPriorityFeePerGas\n // 如果提供了 EIP-1559 参数,使用它们;否则如果提供了 gasPrice,使用 gasPrice;否则让 viem 自动获取\n if (params.maxFeePerGas || params.maxPriorityFeePerGas) {\n // 使用 EIP-1559 参数\n if (params.maxFeePerGas) {\n txOptions.maxFeePerGas = BigInt(params.maxFeePerGas);\n }\n if (params.maxPriorityFeePerGas) {\n txOptions.maxPriorityFeePerGas = BigInt(params.maxPriorityFeePerGas);\n }\n // 在 EIP-1559 网络中,不应该同时设置 gasPrice\n console.log('🔍 [MetaMask writeContract] Using EIP-1559 gas params');\n } else if (params.gasPrice) {\n // Legacy 网络或明确指定 gasPrice\n if (params.gasPrice === 'auto') {\n // 让 viem 自动获取 gas price(会根据网络类型自动选择 EIP-1559 或 Legacy)\n console.log('🔍 [MetaMask writeContract] Auto gas price - letting viem decide');\n } else {\n txOptions.gasPrice = BigInt(params.gasPrice);\n console.log('🔍 [MetaMask writeContract] Using legacy gasPrice');\n }\n } else {\n // 没有提供任何 gas 参数,主动获取并设置合理的 gas 费用\n console.log('🔍 [MetaMask writeContract] No gas params - fetching and setting reasonable gas fees');\n \n // 获取当前网络的 gas 费用信息并设置\n if (this.publicClient) {\n try {\n // 尝试获取 EIP-1559 费用(如果网络支持)\n const feesPerGas = await this.publicClient.estimateFeesPerGas().catch(() => null);\n if (feesPerGas) {\n // 确保 maxPriorityFeePerGas 有合理的最小值(至少 0.1 Gwei = 100000000 wei)\n // 如果太小,MetaMask 可能会使用默认值导致费用过高\n const minPriorityFeeWei = BigInt(100_000_000); // 0.1 Gwei\n const maxPriorityFeePerGas = feesPerGas.maxPriorityFeePerGas > minPriorityFeeWei \n ? feesPerGas.maxPriorityFeePerGas \n : minPriorityFeeWei;\n \n // maxFeePerGas 应该至少是 baseFee + priorityFee\n // 如果估算的 maxFeePerGas 太小,增加一些缓冲\n const adjustedMaxFeePerGas = feesPerGas.maxFeePerGas > maxPriorityFeePerGas\n ? feesPerGas.maxFeePerGas\n : maxPriorityFeePerGas + BigInt(1_000_000_000); // 至少增加 1 Gwei\n \n // 设置 EIP-1559 参数\n txOptions.maxFeePerGas = adjustedMaxFeePerGas;\n txOptions.maxPriorityFeePerGas = maxPriorityFeePerGas;\n \n const maxFeePerGasGwei = Number(adjustedMaxFeePerGas) / 1e9;\n const maxPriorityFeePerGasGwei = Number(maxPriorityFeePerGas) / 1e9;\n \n console.log('💰 [MetaMask writeContract] Set gas fees (EIP-1559):', {\n maxFeePerGas: `${maxFeePerGasGwei.toFixed(6)} Gwei`,\n maxPriorityFeePerGas: `${maxPriorityFeePerGasGwei.toFixed(6)} Gwei`,\n maxFeePerGasWei: adjustedMaxFeePerGas.toString(),\n maxPriorityFeePerGasWei: maxPriorityFeePerGas.toString(),\n note: '已设置合理的 gas 费用,避免 MetaMask 使用默认值',\n });\n } else {\n // 回退到 Legacy gas price\n const gasPrice = await this.publicClient.getGasPrice();\n txOptions.gasPrice = gasPrice;\n \n const gasPriceGwei = Number(gasPrice) / 1e9;\n console.log('💰 [MetaMask writeContract] Set gas price (Legacy):', {\n gasPrice: `${gasPriceGwei.toFixed(6)} Gwei`,\n gasPriceWei: gasPrice.toString(),\n });\n }\n } catch (err) {\n console.warn('⚠️ [MetaMask writeContract] Failed to estimate gas fees, letting viem auto-estimate:', err);\n }\n }\n }\n \n const txHash = await this.walletClient.writeContract(txOptions as any)\n\n return txHash\n } catch (error: any) {\n if (error.code === 4001) {\n throw new SignatureRejectedError('Transaction was rejected by user')\n }\n throw error\n }\n }\n\n /**\n * 估算 gas\n */\n async estimateGas(params: ContractWriteParams): Promise<bigint> {\n if (!this.publicClient) {\n throw new Error('Public client not initialized')\n }\n\n const gas = await this.publicClient.estimateContractGas({\n address: params.address as `0x${string}`,\n abi: params.abi,\n functionName: params.functionName,\n ...(params.args ? { args: params.args as readonly any[] } : {}),\n value: params.value ? BigInt(params.value) : undefined,\n account: this.currentAccount!.nativeAddress as `0x${string}`,\n } as any)\n\n return gas\n }\n\n /**\n * 等待交易确认\n */\n async waitForTransaction(txHash: string, confirmations: number = 1): Promise<TransactionReceipt> {\n if (!this.publicClient) {\n throw new Error('Public client not initialized')\n }\n\n const receipt = await this.publicClient.waitForTransactionReceipt({\n hash: txHash as `0x${string}`,\n confirmations,\n })\n\n if (receipt.status === 'reverted') {\n throw new TransactionFailedError(txHash, 'Transaction reverted')\n }\n\n return {\n transactionHash: receipt.transactionHash,\n blockNumber: Number(receipt.blockNumber),\n blockHash: receipt.blockHash,\n from: receipt.from,\n to: receipt.to || undefined,\n status: receipt.status === 'success' ? 'success' : 'failed',\n gasUsed: receipt.gasUsed.toString(),\n effectiveGasPrice: receipt.effectiveGasPrice?.toString(),\n logs: receipt.logs,\n }\n }\n\n /**\n * 获取 Provider\n */\n getProvider(): any {\n return this.getBrowserProvider()\n }\n\n /**\n * 获取 Signer\n */\n getSigner(): WalletClient | null {\n return this.walletClient\n }\n\n /**\n * 获取浏览器中的 MetaMask provider\n */\n protected getBrowserProvider(): any | undefined {\n if (typeof window === 'undefined') {\n return undefined\n }\n const w = window as any\n // 支持所有提供 window.ethereum 接口的钱包(MetaMask、TP钱包、Trust Wallet等)\n return w.ethereum ? w.ethereum : undefined\n }\n\n /**\n * 获取下载链接\n */\n protected getDownloadUrl(): string {\n return 'https://metamask.io/download/'\n }\n\n /**\n * 设置事件监听\n */\n protected setupEventListeners(): void {\n const provider = this.getBrowserProvider()\n if (!provider) return\n\n provider.on('accountsChanged', this.handleAccountsChanged)\n provider.on('chainChanged', this.handleChainChanged)\n provider.on('disconnect', this.handleDisconnect)\n }\n\n /**\n * 移除事件监听\n */\n protected removeEventListeners(): void {\n const provider = this.getBrowserProvider()\n if (!provider) return\n\n provider.removeListener('accountsChanged', this.handleAccountsChanged)\n provider.removeListener('chainChanged', this.handleChainChanged)\n provider.removeListener('disconnect', this.handleDisconnect)\n }\n\n /**\n * 处理账户变化\n * \n * 注意:MetaMask 的行为\n * - 切换到已连接的账户:触发事件,返回新账户 ['0xNewAddress']\n * - 切换到未连接的账户:不触发事件(用户需要手动断开和重新连接)\n * - 锁定钱包:触发事件,返回空数组 []\n */\n private handleAccountsChanged = (accounts: string[]) => {\n console.log('[MetaMask] accountsChanged event triggered:', accounts)\n \n if (accounts.length === 0) {\n // 用户锁定钱包或手动断开连接\n console.log('[MetaMask] Disconnecting: wallet locked or manually disconnected')\n this.setState(WalletState.DISCONNECTED)\n this.setAccount(null)\n this.emitAccountChanged(null)\n } else {\n // 用户在已连接的账户之间切换\n const address = formatEVMAddress(accounts[0])\n console.log('[MetaMask] Account changed to:', address)\n const account: Account = {\n universalAddress: createUniversalAddress(this.currentAccount!.chainId, address),\n nativeAddress: address,\n chainId: this.currentAccount!.chainId,\n chainType: ChainType.EVM,\n isActive: true,\n }\n this.setAccount(account)\n this.emitAccountChanged(account)\n }\n }\n\n /**\n * 处理链变化\n */\n private handleChainChanged = (chainIdHex: string) => {\n const chainId = parseInt(chainIdHex, 16)\n\n if (this.currentAccount) {\n const account: Account = {\n ...this.currentAccount,\n chainId,\n universalAddress: createUniversalAddress(chainId, this.currentAccount.nativeAddress),\n }\n this.setAccount(account)\n this.emitChainChanged(chainId)\n }\n }\n\n /**\n * 处理断开连接\n */\n private handleDisconnect = () => {\n this.setState(WalletState.DISCONNECTED)\n this.setAccount(null)\n this.emitDisconnected()\n }\n\n /**\n * 获取 viem chain 配置(简化版)\n */\n private getViemChain(chainId: number): any {\n const chainInfo = getChainInfo(chainId)\n if (chainInfo) {\n return {\n id: chainId,\n name: chainInfo.name,\n network: chainInfo.name.toLowerCase().replace(/\\s+/g, '-'),\n nativeCurrency: chainInfo.nativeCurrency,\n rpcUrls: {\n default: { http: chainInfo.rpcUrls },\n public: { http: chainInfo.rpcUrls },\n },\n blockExplorers: chainInfo.blockExplorerUrls ? {\n default: { name: 'Explorer', url: chainInfo.blockExplorerUrls[0] },\n } : undefined,\n }\n }\n\n // 默认配置\n return {\n id: chainId,\n name: `Chain ${chainId}`,\n network: `chain-${chainId}`,\n nativeCurrency: {\n name: 'ETH',\n symbol: 'ETH',\n decimals: 18,\n },\n rpcUrls: {\n default: { http: [] },\n public: { http: [] },\n },\n }\n }\n}\n\n","/**\n * TronWeb 兼容钱包适配器\n * 支持所有提供 TronWeb 接口的钱包,包括但不限于:\n * - TronLink\n * - TokenPocket\n * - 其他 TronWeb 兼容的钱包\n */\n\nimport { BrowserWalletAdapter } from '../base/browser-wallet-adapter'\nimport {\n WalletType,\n ChainType,\n WalletState,\n Account,\n ContractReadParams,\n ContractWriteParams,\n TransactionReceipt,\n} from '../../core/types'\nimport { createUniversalAddress } from '../../utils/address/universal-address'\nimport { ConnectionRejectedError, SignatureRejectedError, TransactionFailedError } from '../../core/errors'\n\n/**\n * TronWeb 兼容钱包适配器\n * 支持所有提供 window.tronWeb 或 window.tronLink.tronWeb 接口的钱包\n */\nexport class TronLinkAdapter extends BrowserWalletAdapter {\n readonly type = WalletType.TRONLINK\n readonly chainType = ChainType.TRON\n readonly name = 'TronWeb'\n readonly icon = 'https://www.tronlink.org/static/logoIcon.svg'\n\n // Tron 主网链 ID\n private static readonly TRON_MAINNET_CHAIN_ID = 195\n\n /**\n * 连接钱包\n */\n async connect(chainId?: number): Promise<Account> {\n await this.ensureAvailable()\n\n try {\n this.setState(WalletState.CONNECTING)\n\n const w = window as any\n const tronWeb = this.getTronWeb()\n\n // 等待 TronWeb 就绪(如果支持 ready 属性)\n if (tronWeb.ready) {\n await tronWeb.ready\n }\n\n // 先检查是否已经有地址(已授权),避免不必要的连接请求\n let address = tronWeb.defaultAddress?.base58\n \n // 如果还没有地址,尝试从 hex 地址转换(某些钱包可能只提供 hex)\n if (!address && tronWeb.defaultAddress?.hex && tronWeb.address && typeof tronWeb.address.fromHex === 'function') {\n try {\n address = tronWeb.address.fromHex(tronWeb.defaultAddress.hex)\n } catch (e) {\n // 转换失败,继续尝试其他方式\n }\n }\n\n // 如果仍然没有地址,等待一小段时间让钱包初始化\n if (!address) {\n // 某些钱包需要时间初始化,等待最多 2 秒\n for (let i = 0; i < 20; i++) {\n await new Promise(resolve => setTimeout(resolve, 100))\n address = tronWeb.defaultAddress?.base58\n if (address) break\n }\n }\n\n // 只有在没有地址时才请求连接\n if (!address) {\n // 优先使用 TronLink 特定的 request API(如果存在)\n if (w.tronLink && typeof w.tronLink.request === 'function') {\n try {\n const result = await w.tronLink.request({\n method: 'tron_requestAccounts',\n })\n\n if (!result || result.code !== 200) {\n throw new ConnectionRejectedError(this.type)\n }\n } catch (error: any) {\n // 如果用户拒绝连接\n if (error.code === 4001 || error.message?.includes('User rejected') || error.message?.includes('rejected')) {\n throw new ConnectionRejectedError(this.type)\n }\n // 其他错误继续,尝试直接获取地址\n }\n }\n\n // 请求连接后,再次尝试获取地址\n address = tronWeb.defaultAddress?.base58\n \n // 如果还没有地址,尝试从 hex 地址转换\n if (!address && tronWeb.defaultAddress?.hex && tronWeb.address && typeof tronWeb.address.fromHex === 'function') {\n try {\n address = tronWeb.address.fromHex(tronWeb.defaultAddress.hex)\n } catch (e) {\n // 转换失败\n }\n }\n\n // 如果仍然没有地址,等待一小段时间让钱包初始化\n if (!address) {\n for (let i = 0; i < 20; i++) {\n await new Promise(resolve => setTimeout(resolve, 100))\n address = tronWeb.defaultAddress?.base58\n if (address) break\n }\n }\n }\n\n if (!address) {\n throw new Error('Failed to get Tron address. Please make sure your wallet is unlocked and try again.')\n }\n\n // Tron 主网的链 ID\n const tronChainId = chainId || TronLinkAdapter.TRON_MAINNET_CHAIN_ID\n\n // 创建账户信息\n const account: Account = {\n universalAddress: createUniversalAddress(tronChainId, address),\n nativeAddress: address,\n chainId: tronChainId,\n chainType: ChainType.TRON,\n isActive: true,\n }\n\n this.setState(WalletState.CONNECTED)\n this.setAccount(account)\n this.setupEventListeners()\n\n return account\n } catch (error: any) {\n this.setState(WalletState.ERROR)\n this.setAccount(null)\n\n if (error.code === 4001 || error.message?.includes('User rejected')) {\n throw new ConnectionRejectedError(this.type)\n }\n\n throw error\n }\n }\n\n /**\n * 签名消息\n * \n * Note: TronWeb 兼容钱包支持两种签名方法:\n * - trx.sign(): 签名交易对象\n * - trx.signMessageV2(): 签名纯文本消息(我们使用此方法)\n */\n async signMessage(message: string): Promise<string> {\n this.ensureConnected()\n\n try {\n const tronWeb = this.getTronWeb()\n\n // Use signMessageV2 for plain text message signing (not transaction signing)\n // This is equivalent to personal_sign in EVM\n if (typeof tronWeb.trx.signMessageV2 === 'function') {\n // signMessageV2 returns a hex signature\n const signature = await tronWeb.trx.signMessageV2(message)\n return signature\n } else {\n // Fallback to older method if signMessageV2 not available\n // Note: This might not work correctly for message signing\n console.warn('[TronLink] signMessageV2 not available, falling back to sign()')\n const signature = await tronWeb.trx.sign(message)\n return signature\n }\n } catch (error: any) {\n if (error.message?.includes('User rejected') || error.message?.includes('Confirmation declined')) {\n throw new SignatureRejectedError()\n }\n \n // Better error message for invalid input\n if (error.message?.includes('Invalid transaction')) {\n throw new Error('Invalid message format. For transaction signing, use signTransaction() instead.')\n }\n \n throw error\n }\n }\n\n /**\n * 签名交易\n * \n * Note: This uses trx.sign() which is specifically for signing transaction objects.\n * For plain text message signing, use signMessage() instead.\n */\n async signTransaction(transaction: any): Promise<string> {\n this.ensureConnected()\n\n try {\n const tronWeb = this.getTronWeb()\n\n // TronLink's trx.sign() expects a transaction object\n // The transaction should be properly formatted with fields like:\n // - txID, raw_data, raw_data_hex, etc.\n const signature = await tronWeb.trx.sign(transaction)\n\n return signature\n } catch (error: any) {\n if (error.message?.includes('User rejected') || error.message?.includes('Confirmation declined')) {\n throw new SignatureRejectedError('Transaction signature was rejected by user')\n }\n \n // Better error message for invalid input\n if (error.message?.includes('Invalid transaction')) {\n throw new Error('Invalid transaction format. Please provide a properly formatted Tron transaction object.')\n }\n \n throw error\n }\n }\n\n /**\n * 读取合约\n * 参考 webserver 的实现,使用 TronWeb 合约实例的标准 call() 方法\n */\n async readContract<T = any>(params: ContractReadParams): Promise<T> {\n this.ensureConnected()\n\n try {\n const tronWeb = this.getTronWeb()\n \n if (!this.currentAccount) {\n throw new Error('No account connected')\n }\n \n // 方法1: 使用 TronWeb 标准方法(参考 webserver 的实现)\n try {\n // 创建合约实例(使用 ABI)\n const contract = await tronWeb.contract(params.abi, params.address)\n \n // 获取方法\n const method = contract[params.functionName]\n if (!method || typeof method !== 'function') {\n throw new Error(`Function ${params.functionName} not found in contract ABI`)\n }\n \n // 直接调用 call() 方法(不需要传入地址参数)\n // 这是 TronWeb 的标准只读调用方式\n const result = await method(...(params.args || [])).call()\n \n return result as T\n } catch (method1Error: any) {\n // 如果方法1失败,尝试方法2:不使用 ABI,直接使用合约地址\n console.warn('⚠️ [方法1] TronWeb标准方法失败,尝试方法2:', method1Error.message)\n \n try {\n // 方法2: 不使用 ABI,直接使用合约地址(某些钱包可能不支持 ABI)\n const contract2 = await (tronWeb as any).contract().at(params.address)\n const method2 = contract2[params.functionName]\n \n if (!method2 || typeof method2 !== 'function') {\n throw new Error(`Function ${params.functionName} not found in contract`)\n }\n \n const result = await method2(...(params.args || [])).call()\n return result as T\n } catch (method2Error: any) {\n console.error('⚠️ [方法2] 也失败:', method2Error.message)\n // 如果两种方法都失败,抛出原始错误\n throw method1Error\n }\n }\n } catch (error: any) {\n console.error('Read contract error:', error)\n throw new Error(`Failed to read contract: ${error.message || 'Unknown error'}`)\n }\n }\n\n /**\n * 写入合约\n */\n async writeContract(params: ContractWriteParams): Promise<string> {\n this.ensureConnected()\n\n try {\n const tronWeb = this.getTronWeb()\n \n console.log('[TronLink] writeContract params:', {\n address: params.address,\n functionName: params.functionName,\n args: params.args,\n value: params.value,\n gas: params.gas,\n })\n \n // 验证参数\n if (!params.args || params.args.length === 0) {\n throw new Error('Contract function arguments are required')\n }\n \n // 检查参数是否包含 undefined\n const hasUndefined = params.args.some(arg => arg === undefined || arg === null)\n if (hasUndefined) {\n console.error('[TronLink] Invalid args detected:', params.args)\n throw new Error(`Invalid contract arguments: some arguments are undefined or null`)\n }\n \n // 使用 TronWeb 的 transactionBuilder.triggerSmartContract API\n // 这是更底层、更可靠的 API\n \n // 构建函数签名\n const functionAbi = params.abi.find((item: any) => \n item.name === params.functionName && item.type === 'function'\n )\n \n if (!functionAbi) {\n throw new Error(`Function ${params.functionName} not found in ABI`)\n }\n \n console.log('[TronLink] Function ABI:', functionAbi)\n console.log('[TronLink] Calling with args:', params.args)\n \n // 准备交易参数\n const options = {\n feeLimit: params.gas || 100_000_000, // 默认 100 TRX 的能量限制\n callValue: params.value || 0, // 发送的 TRX 数量(单位:SUN)\n }\n \n // 构建参数数组\n const parameter = functionAbi.inputs.map((input: any, index: number) => ({\n type: input.type,\n value: params.args![index]\n }))\n \n console.log('[TronLink] Transaction options:', options)\n console.log('[TronLink] Parameters:', parameter)\n \n // 构建函数选择器(参考 webserver 的实现)\n const functionSelector = params.functionName + '(' + functionAbi.inputs.map((i: any) => i.type).join(',') + ')'\n \n console.log('[TronLink] Function selector:', functionSelector)\n console.log('[TronLink] Transaction options:', options)\n console.log('[TronLink] Parameters:', parameter)\n \n // 使用 triggerSmartContract 触发合约(参考 webserver 的实现)\n const tx = await tronWeb.transactionBuilder.triggerSmartContract(\n params.address,\n functionSelector,\n options,\n parameter,\n this.currentAccount!.nativeAddress\n )\n \n console.log('[TronLink] Transaction built:', tx)\n \n // 验证交易构建结果\n if (!tx || !tx.transaction) {\n throw new Error('Failed to build transaction')\n }\n \n // 请求用户签名(参考 webserver 的实现)\n console.log('[TronLink] Requesting user signature...')\n const signedTx = await tronWeb.trx.sign(tx.transaction)\n console.log('[TronLink] Transaction signed:', signedTx)\n \n // ✅ 从签名的交易中提取 txID(这是最可靠的方式,参考 webserver)\n const txID = signedTx.txID\n console.log('[TronLink] Transaction hash (txID):', txID)\n \n // 广播交易(参考 webserver 的实现)\n console.log('[TronLink] Broadcasting transaction...')\n const broadcast = await tronWeb.trx.sendRawTransaction(signedTx)\n console.log('[TronLink] Broadcast result:', broadcast)\n \n // 验证广播结果\n if (broadcast && broadcast.result === true) {\n // 广播成功,返回交易哈希\n return txID || broadcast.txid || ''\n } else {\n // 广播失败,但如果有 txID,仍然返回(交易可能已经上链)\n if (txID) {\n console.warn('[TronLink] Broadcast returned false but txID exists:', txID)\n return txID\n }\n throw new Error(broadcast?.message || 'Transaction broadcast failed')\n }\n } catch (error: any) {\n console.error('Write contract error:', error)\n \n if (error.message?.includes('User rejected') || error.message?.includes('Confirmation declined')) {\n throw new SignatureRejectedError('Transaction was rejected by user')\n }\n \n throw new Error(`Failed to write contract: ${error.message}`)\n }\n }\n\n /**\n * 等待交易确认\n */\n async waitForTransaction(txHash: string, _confirmations: number = 1): Promise<TransactionReceipt> {\n try {\n const tronWeb = this.getTronWeb()\n \n // 等待交易确认\n let attempts = 0\n const maxAttempts = 60 // 最多等待 60 秒\n \n while (attempts < maxAttempts) {\n try {\n const txInfo = await tronWeb.trx.getTransactionInfo(txHash)\n \n if (txInfo && txInfo.id) {\n // 交易已确认\n const receipt: TransactionReceipt = {\n transactionHash: txHash,\n blockNumber: txInfo.blockNumber || 0,\n blockHash: txInfo.blockHash || '',\n from: this.currentAccount!.nativeAddress,\n to: txInfo.contract_address || '',\n status: txInfo.receipt?.result === 'SUCCESS' ? 'success' : 'failed',\n gasUsed: (txInfo.receipt?.energy_usage_total || 0).toString(),\n logs: txInfo.log || [],\n }\n \n if (receipt.status === 'failed') {\n throw new TransactionFailedError(txHash, 'Transaction failed on Tron network')\n }\n \n return receipt\n }\n } catch (error) {\n // 交易可能还未确认,继续等待\n }\n \n await new Promise(resolve => setTimeout(resolve, 1000))\n attempts++\n }\n \n throw new Error('Transaction confirmation timeout')\n } catch (error: any) {\n throw new Error(`Failed to wait for transaction: ${error.message}`)\n }\n }\n\n /**\n * 获取 Provider\n */\n getProvider(): any {\n return this.getTronWeb()\n }\n\n /**\n * 获取浏览器中的 TronWeb 实例\n * 支持所有 TronWeb 兼容的钱包,包括:\n * - TronLink (window.tronLink.tronWeb 或 window.tronWeb)\n * - TokenPocket (window.tronWeb)\n * - 其他提供 window.tronWeb 接口的钱包\n */\n protected getBrowserProvider(): any | undefined {\n if (typeof window === 'undefined') {\n return undefined\n }\n const w = window as any\n // 优先使用 window.tronWeb(所有 TronWeb 兼容钱包都提供)\n // 如果没有,则尝试 window.tronLink.tronWeb(TronLink 特定)\n return w.tronWeb || w.tronLink?.tronWeb\n }\n\n /**\n * 获取 TronWeb 实例\n */\n private getTronWeb(): any {\n const provider = this.getBrowserProvider()\n if (!provider) {\n throw new Error('未检测到 TronWeb 兼容的钱包。请安装 TronLink 或其他 TronWeb 兼容的钱包。')\n }\n return provider\n }\n\n /**\n * 获取下载链接\n */\n protected getDownloadUrl(): string {\n return 'https://www.tronlink.org/'\n }\n\n /**\n * 设置事件监听\n */\n protected setupEventListeners(): void {\n // TronWeb 兼容钱包事件监听\n if (typeof window === 'undefined') return\n\n const w = window as any\n \n // TronWeb 兼容钱包的事件监听方式可能因钱包而异\n // TronLink 使用 tronLink.on,其他钱包可能使用不同的方式\n try {\n if (w.tronLink && typeof w.tronLink.on === 'function') {\n // TronLink 特定的事件监听\n w.tronLink.on('accountsChanged', this.handleAccountsChanged)\n w.tronLink.on('disconnect', this.handleDisconnect)\n } else if (w.tronWeb && w.tronWeb.eventServer) {\n // 其他 TronWeb 兼容钱包可能使用 eventServer\n // 备用方案:使用轮询检测账户变化\n this.startPolling()\n } else {\n // 如果没有事件监听支持,使用轮询\n this.startPolling()\n }\n } catch (error) {\n console.warn('TronWeb 钱包事件监听设置失败,使用轮询方式:', error)\n // 降级到轮询\n this.startPolling()\n }\n }\n\n /**\n * 移除事件监听\n */\n protected removeEventListeners(): void {\n if (typeof window === 'undefined') return\n\n const w = window as any\n\n try {\n if (w.tronLink && typeof w.tronLink.off === 'function') {\n // TronLink 特定的事件移除\n w.tronLink.off('accountsChanged', this.handleAccountsChanged)\n w.tronLink.off('disconnect', this.handleDisconnect)\n }\n } catch (error) {\n console.warn('TronWeb 钱包事件监听移除失败:', error)\n }\n\n this.stopPolling()\n }\n\n /**\n * 轮询检测账户变化(备用方案)\n */\n private pollingInterval: NodeJS.Timeout | null = null\n private lastKnownAddress: string | null = null\n\n private startPolling(): void {\n if (this.pollingInterval) return\n\n this.lastKnownAddress = this.currentAccount?.nativeAddress || null\n\n this.pollingInterval = setInterval(async () => {\n try {\n const tronWeb = this.getTronWeb()\n const currentAddress = tronWeb.defaultAddress?.base58\n\n if (currentAddress && currentAddress !== this.lastKnownAddress) {\n this.lastKnownAddress = currentAddress\n this.handleAccountsChanged({ address: { base58: currentAddress } })\n } else if (!currentAddress && this.lastKnownAddress) {\n this.lastKnownAddress = null\n this.handleAccountsChanged(null)\n }\n } catch (error) {\n // 忽略轮询错误\n }\n }, 2000) // 每 2 秒检查一次\n }\n\n private stopPolling(): void {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval)\n this.pollingInterval = null\n }\n }\n\n /**\n * 处理账户变化\n */\n private handleAccountsChanged = (data: any) => {\n if (!data || !data.address) {\n // 用户断开连接\n this.setState(WalletState.DISCONNECTED)\n this.setAccount(null)\n this.emitAccountChanged(null)\n } else {\n // 用户切换账户\n const address = data.address.base58 || data.address\n const account: Account = {\n universalAddress: createUniversalAddress(this.currentAccount!.chainId, address),\n nativeAddress: address,\n chainId: this.currentAccount!.chainId,\n chainType: ChainType.TRON,\n isActive: true,\n }\n this.setAccount(account)\n this.emitAccountChanged(account)\n }\n }\n\n /**\n * 处理断开连接\n */\n private handleDisconnect = () => {\n this.setState(WalletState.DISCONNECTED)\n this.setAccount(null)\n this.emitDisconnected()\n }\n}\n\n","/**\n * EVM 私钥适配器\n * 用于开发和测试,不推荐在生产环境中使用\n */\n\nimport { createWalletClient, createPublicClient, http, type WalletClient, type PublicClient } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { WalletAdapter } from '../base/wallet-adapter'\nimport {\n WalletType,\n ChainType,\n WalletState,\n Account,\n ContractReadParams,\n ContractWriteParams,\n TransactionReceipt,\n} from '../../core/types'\nimport { createUniversalAddress } from '../../utils/address/universal-address'\nimport { formatEVMAddress } from '../../utils/address/evm-utils'\nimport { TransactionFailedError } from '../../core/errors'\nimport { getChainInfo } from '../../utils/chain-info'\n\n/**\n * EVM 私钥适配器\n */\nexport class EVMPrivateKeyAdapter extends WalletAdapter {\n readonly type = WalletType.PRIVATE_KEY\n readonly chainType = ChainType.EVM\n readonly name = 'Private Key (EVM)'\n\n private privateKey: string | null = null\n private walletClient: WalletClient | null = null\n private publicClient: PublicClient | null = null\n\n /**\n * 连接(导入私钥)\n */\n async connect(chainId: number = 1): Promise<Account> {\n if (!this.privateKey) {\n throw new Error('Private key not set. Call setPrivateKey() first.')\n }\n\n try {\n this.setState(WalletState.CONNECTING)\n\n // 从私钥创建账户\n const account = privateKeyToAccount(this.privateKey as `0x${string}`)\n\n // 创建客户端\n this.walletClient = createWalletClient({\n account,\n chain: this.getViemChain(chainId),\n transport: http(),\n })\n\n this.publicClient = createPublicClient({\n chain: this.getViemChain(chainId) as any,\n transport: http(),\n }) as any\n\n // 创建账户信息\n const address = formatEVMAddress(account.address)\n const accountInfo: Account = {\n universalAddress: createUniversalAddress(chainId, address),\n nativeAddress: address,\n chainId,\n chainType: ChainType.EVM,\n isActive: true,\n }\n\n this.setState(WalletState.CONNECTED)\n this.setAccount(accountInfo)\n\n return accountInfo\n } catch (error) {\n this.setState(WalletState.ERROR)\n this.setAccount(null)\n throw error\n }\n }\n\n /**\n * 断开连接\n */\n async disconnect(): Promise<void> {\n this.privateKey = null\n this.walletClient = null\n this.publicClient = null\n this.setState(WalletState.DISCONNECTED)\n this.setAccount(null)\n this.emitDisconnected()\n }\n\n /**\n * 检查是否可用(私钥钱包总是可用)\n */\n async isAvailable(): Promise<boolean> {\n return true\n }\n\n /**\n * 设置私钥\n */\n setPrivateKey(privateKey: string): void {\n // 确保私钥有 0x 前缀\n this.privateKey = privateKey.startsWith('0x') ? privateKey : `0x${privateKey}`\n }\n\n /**\n * 签名消息\n */\n async signMessage(message: string): Promise<string> {\n this.ensureConnected()\n\n if (!this.walletClient || !this.walletClient.account) {\n throw new Error('Wallet client not initialized')\n }\n\n const signature = await this.walletClient.signMessage({\n message,\n account: this.walletClient.account,\n })\n\n return signature\n }\n\n /**\n * 签名 TypedData\n */\n async signTypedData(typedData: any): Promise<string> {\n this.ensureConnected()\n\n if (!this.walletClient || !this.walletClient.account) {\n throw new Error('Wallet client not initialized')\n }\n\n const signature = await this.walletClient.signTypedData({\n ...typedData,\n account: this.walletClient.account,\n })\n\n return signature\n }\n\n /**\n * 切换链\n */\n async switchChain(chainId: number): Promise<void> {\n this.ensureConnected()\n\n // 重新创建客户端\n const account = this.walletClient!.account!\n\n this.walletClient = createWalletClient({\n account,\n chain: this.getViemChain(chainId),\n transport: http(),\n })\n\n this.publicClient = createPublicClient({\n chain: this.getViemChain(chainId) as any,\n transport: http(),\n }) as any\n\n // 更新账户信息\n const updatedAccount: Account = {\n ...this.currentAccount!,\n chainId,\n universalAddress: createUniversalAddress(chainId, this.currentAccount!.nativeAddress),\n }\n this.setAccount(updatedAccount)\n this.emitChainChanged(chainId)\n }\n\n /**\n * 读取合约\n */\n async readContract<T = any>(params: ContractReadParams): Promise<T> {\n if (!this.publicClient) {\n throw new Error('Public client not initialized')\n }\n\n const result = await this.publicClient.readContract({\n address: params.address as `0x${string}`,\n abi: params.abi,\n functionName: params.functionName,\n ...(params.args ? { args: params.args as readonly any[] } : {}),\n } as any)\n\n return result as T\n }\n\n /**\n * 写入合约\n */\n async writeContract(params: ContractWriteParams): Promise<string> {\n this.ensureConnected()\n\n if (!this.walletClient) {\n throw new Error('Wallet client not initialized')\n }\n\n const txHash = await this.walletClient.writeContract({\n address: params.address as `0x${string}`,\n abi: params.abi,\n functionName: params.functionName,\n ...(params.args ? { args: params.args as readonly any[] } : {}),\n value: params.value ? BigInt(params.value) : undefined,\n gas: params.gas ? BigInt(params.gas) : undefined,\n gasPrice: params.gasPrice ? BigInt(params.gasPrice) : undefined,\n } as any)\n\n return txHash\n }\n\n /**\n * 估算 gas\n */\n async estimateGas(params: ContractWriteParams): Promise<bigint> {\n if (!this.publicClient || !this.currentAccount) {\n throw new Error('Client not initialized')\n }\n\n const gas = await this.publicClient.estimateContractGas({\n address: params.address as `0x${string}`,\n abi: params.abi,\n functionName: params.functionName,\n ...(params.args ? { args: params.args as readonly any[] } : {}),\n value: params.value ? BigInt(params.value) : undefined,\n account: this.currentAccount.nativeAddress as `0x${string}`,\n } as any)\n\n return gas\n }\n\n /**\n * 等待交易确认\n */\n async waitForTransaction(txHash: string, confirmations: number = 1): Promise<TransactionReceipt> {\n if (!this.publicClient) {\n throw new Error('Public client not initialized')\n }\n\n const receipt = await this.publicClient.waitForTransactionReceipt({\n hash: txHash as `0x${string}`,\n confirmations,\n })\n\n if (receipt.status === 'reverted') {\n throw new TransactionFailedError(txHash, 'Transaction reverted')\n }\n\n return {\n transactionHash: receipt.transactionHash,\n blockNumber: Number(receipt.blockNumber),\n blockHash: receipt.blockHash,\n from: receipt.from,\n to: receipt.to || undefined,\n status: receipt.status === 'success' ? 'success' : 'failed',\n gasUsed: receipt.gasUsed.toString(),\n effectiveGasPrice: receipt.effectiveGasPrice?.toString(),\n logs: receipt.logs,\n }\n }\n\n /**\n * 获取 Provider\n */\n getProvider(): any {\n return this.publicClient\n }\n\n /**\n * 获取 Signer\n */\n getSigner(): WalletClient | null {\n return this.walletClient\n }\n\n /**\n * 获取 viem chain 配置\n */\n private getViemChain(chainId: number): any {\n const chainInfo = getChainInfo(chainId)\n if (chainInfo) {\n return {\n id: chainId,\n name: chainInfo.name,\n network: chainInfo.name.toLowerCase().replace(/\\s+/g, '-'),\n nativeCurrency: chainInfo.nativeCurrency,\n rpcUrls: {\n default: { http: chainInfo.rpcUrls },\n public: { http: chainInfo.rpcUrls },\n },\n blockExplorers: chainInfo.blockExplorerUrls ? {\n default: { name: 'Explorer', url: chainInfo.blockExplorerUrls[0] },\n } : undefined,\n }\n }\n\n return {\n id: chainId,\n name: `Chain ${chainId}`,\n network: `chain-${chainId}`,\n nativeCurrency: {\n name: 'ETH',\n symbol: 'ETH',\n decimals: 18,\n },\n rpcUrls: {\n default: { http: [] },\n public: { http: [] },\n },\n }\n }\n}\n\n","/**\n * Adapter Registry\n */\n\nimport { IWalletAdapter, WalletType, ChainType } from './types'\nimport { MetaMaskAdapter } from '../adapters/evm/metamask'\nimport { TronLinkAdapter } from '../adapters/tron/tronlink'\nimport { EVMPrivateKeyAdapter } from '../adapters/evm/private-key'\n\n/**\n * Adapter Registry\n */\nexport class AdapterRegistry {\n private adapters: Map<WalletType, () => IWalletAdapter> = new Map()\n\n constructor() {\n this.registerDefaultAdapters()\n }\n\n /**\n * Register default adapters\n */\n private registerDefaultAdapters(): void {\n // EVM adapters\n this.register(WalletType.METAMASK, () => new MetaMaskAdapter())\n this.register(WalletType.PRIVATE_KEY, () => new EVMPrivateKeyAdapter())\n\n // Tron adapters\n this.register(WalletType.TRONLINK, () => new TronLinkAdapter())\n }\n\n /**\n * Register adapter\n */\n register(type: WalletType, factory: () => IWalletAdapter): void {\n this.adapters.set(type, factory)\n }\n\n /**\n * Get adapter\n */\n getAdapter(type: WalletType): IWalletAdapter | null {\n const factory = this.adapters.get(type)\n if (!factory) {\n return null\n }\n return factory()\n }\n\n /**\n * Check if adapter is registered\n */\n has(type: WalletType): boolean {\n return this.adapters.has(type)\n }\n\n /**\n * Get all registered adapter types\n */\n getRegisteredTypes(): WalletType[] {\n return Array.from(this.adapters.keys())\n }\n\n /**\n * 根据链类型获取适配器类型列表\n */\n getAdapterTypesByChainType(chainType: ChainType): WalletType[] {\n const types: WalletType[] = []\n\n for (const type of this.adapters.keys()) {\n const adapter = this.getAdapter(type)\n if (adapter && adapter.chainType === chainType) {\n types.push(type)\n }\n }\n\n return types\n }\n}\n\n\n","/**\n * Wallet Manager (Core)\n */\n\nimport { TypedEventEmitter } from './events'\nimport { AdapterRegistry } from './adapter-registry'\nimport {\n Account,\n ChainType,\n WalletType,\n IWalletAdapter,\n WalletManagerConfig,\n WalletManagerEvents,\n ConnectedWallet,\n StorageData,\n WalletHistoryRecord,\n TransactionReceipt,\n AddChainParams,\n} from './types'\nimport {\n WalletNotConnectedError,\n WalletNotAvailableError,\n} from './errors'\nimport { EVMPrivateKeyAdapter } from '../adapters/evm/private-key'\n\n/**\n * Wallet Manager\n */\nexport class WalletManager extends TypedEventEmitter<WalletManagerEvents> {\n private config: Required<WalletManagerConfig>\n private registry: AdapterRegistry\n\n // Primary wallet\n private primaryWallet: IWalletAdapter | null = null\n\n // Connected wallet pool\n private connectedWallets: Map<ChainType, IWalletAdapter> = new Map()\n\n constructor(config: WalletManagerConfig = {}) {\n super()\n\n this.config = {\n enableStorage: config.enableStorage ?? true,\n storagePrefix: config.storagePrefix ?? 'enclave_wallet_',\n defaultChainId: config.defaultChainId ?? 1,\n defaultTronChainId: config.defaultTronChainId ?? 195,\n walletConnectProjectId: config.walletConnectProjectId ?? '',\n }\n\n this.registry = new AdapterRegistry()\n\n // Note: No longer auto-restoring connection in constructor\n // Async operations should be handled in WalletProvider by calling restoreFromStorage()\n }\n\n // ===== Connection Management =====\n\n /**\n * Connect primary wallet\n */\n async connect(type: WalletType, chainId?: number): Promise<Account> {\n const adapter = this.registry.getAdapter(type)\n if (!adapter) {\n throw new WalletNotAvailableError(type)\n }\n\n // Check if available\n const isAvailable = await adapter.isAvailable()\n if (!isAvailable) {\n throw new WalletNotAvailableError(type)\n }\n\n // Connect wallet\n const account = await adapter.connect(chainId)\n\n // Set as primary wallet\n this.setPrimaryWallet(adapter)\n\n // Add to connected wallet pool\n this.connectedWallets.set(adapter.chainType, adapter)\n\n // Setup event listeners\n this.setupAdapterListeners(adapter, true)\n\n // Save to storage\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n\n return account\n }\n\n /**\n * Connect additional wallet (without changing primary wallet)\n */\n async connectAdditional(type: WalletType, chainId?: number): Promise<Account> {\n const adapter = this.registry.getAdapter(type)\n if (!adapter) {\n throw new WalletNotAvailableError(type)\n }\n\n const isAvailable = await adapter.isAvailable()\n if (!isAvailable) {\n throw new WalletNotAvailableError(type)\n }\n\n const account = await adapter.connect(chainId)\n\n // Add to connected wallet pool (without setting as primary)\n this.connectedWallets.set(adapter.chainType, adapter)\n\n // Setup event listeners\n this.setupAdapterListeners(adapter, false)\n\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n\n return account\n }\n\n /**\n * Connect with private key (for development/testing only)\n */\n async connectWithPrivateKey(privateKey: string, chainId?: number): Promise<Account> {\n const adapter = new EVMPrivateKeyAdapter()\n adapter.setPrivateKey(privateKey)\n\n const account = await adapter.connect(chainId || this.config.defaultChainId)\n\n this.setPrimaryWallet(adapter)\n this.connectedWallets.set(adapter.chainType, adapter)\n this.setupAdapterListeners(adapter, true)\n\n return account\n }\n\n /**\n * Disconnect primary wallet\n */\n async disconnect(): Promise<void> {\n if (!this.primaryWallet) {\n return\n }\n\n // Save chainType first, as it may be cleared after disconnect()\n const chainType = this.primaryWallet.chainType\n\n await this.primaryWallet.disconnect()\n\n // Remove listeners\n this.removeAdapterListeners(this.primaryWallet)\n\n // Remove from connected wallet pool\n this.connectedWallets.delete(chainType)\n\n this.primaryWallet = null\n\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n\n this.emit('disconnected')\n }\n\n /**\n * Disconnect all wallets\n */\n async disconnectAll(): Promise<void> {\n const wallets = Array.from(this.connectedWallets.values())\n\n for (const wallet of wallets) {\n await wallet.disconnect()\n this.removeAdapterListeners(wallet)\n }\n\n this.primaryWallet = null\n this.connectedWallets.clear()\n\n if (this.config.enableStorage) {\n this.clearStorage()\n }\n\n this.emit('disconnected')\n }\n\n // ===== Primary Wallet Management =====\n\n /**\n * Switch primary wallet\n */\n async switchPrimaryWallet(chainType: ChainType): Promise<Account> {\n const adapter = this.connectedWallets.get(chainType)\n if (!adapter || !adapter.currentAccount) {\n throw new WalletNotConnectedError(`Wallet for chain type ${chainType} not connected`)\n }\n\n const oldPrimary = this.primaryWallet?.currentAccount || null\n\n // Remove listeners from old primary wallet\n if (this.primaryWallet) {\n this.removeAdapterListeners(this.primaryWallet)\n }\n\n // Set new primary wallet\n this.setPrimaryWallet(adapter)\n\n // Setup listeners for new primary wallet\n this.setupAdapterListeners(adapter, true)\n\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n\n this.emit('primaryWalletSwitched', adapter.currentAccount, oldPrimary, chainType)\n\n return adapter.currentAccount\n }\n\n /**\n * Get primary wallet account\n */\n getPrimaryAccount(): Account | null {\n return this.primaryWallet?.currentAccount || null\n }\n\n /**\n * Get all connected wallets\n */\n getConnectedWallets(): ConnectedWallet[] {\n return Array.from(this.connectedWallets.values()).map(adapter => ({\n account: adapter.currentAccount!,\n walletType: adapter.type,\n chainType: adapter.chainType,\n isPrimary: adapter === this.primaryWallet,\n canSwitchChain: this.canSwitchChain(adapter),\n adapter,\n }))\n }\n\n /**\n * Get wallet by chain type\n */\n getWalletByChainType(chainType: ChainType): IWalletAdapter | null {\n return this.connectedWallets.get(chainType) || null\n }\n\n // ===== Signing =====\n\n /**\n * Sign message with primary wallet\n */\n async signMessage(message: string): Promise<string> {\n if (!this.primaryWallet) {\n throw new WalletNotConnectedError()\n }\n\n return this.primaryWallet.signMessage(message)\n }\n\n /**\n * Sign message with wallet of specified chain type\n */\n async signMessageWithChainType(message: string, chainType?: ChainType): Promise<string> {\n if (!chainType) {\n return this.signMessage(message)\n }\n\n const adapter = this.connectedWallets.get(chainType)\n if (!adapter) {\n throw new WalletNotConnectedError(`Wallet for chain type ${chainType}`)\n }\n\n return adapter.signMessage(message)\n }\n\n /**\n * Sign TypedData (EVM only)\n */\n async signTypedData(typedData: any, chainType?: ChainType): Promise<string> {\n const adapter = chainType\n ? this.connectedWallets.get(chainType)\n : this.primaryWallet\n\n if (!adapter) {\n throw new WalletNotConnectedError()\n }\n\n if (!adapter.signTypedData) {\n throw new Error(`signTypedData not supported by ${adapter.type}`)\n }\n\n return adapter.signTypedData(typedData)\n }\n\n /**\n * Sign transaction (with primary wallet)\n */\n async signTransaction(transaction: any): Promise<string> {\n if (!this.primaryWallet) {\n throw new WalletNotConnectedError()\n }\n\n if (!this.primaryWallet.signTransaction) {\n throw new Error(`signTransaction not supported by ${this.primaryWallet.type}`)\n }\n\n return this.primaryWallet.signTransaction(transaction)\n }\n\n /**\n * Sign transaction with wallet of specified chain type\n */\n async signTransactionWithChainType(transaction: any, chainType?: ChainType): Promise<string> {\n if (!chainType) {\n return this.signTransaction(transaction)\n }\n\n const adapter = this.connectedWallets.get(chainType)\n if (!adapter) {\n throw new WalletNotConnectedError(`Wallet for chain type ${chainType}`)\n }\n\n if (!adapter.signTransaction) {\n throw new Error(`signTransaction not supported by ${adapter.type}`)\n }\n\n return adapter.signTransaction(transaction)\n }\n\n // ===== Chain Switching =====\n\n /**\n * Request chain switch (EVM only)\n */\n async requestSwitchChain(chainId: number, options?: {\n addChainIfNotExists?: boolean\n chainConfig?: AddChainParams\n }): Promise<Account> {\n if (!this.primaryWallet) {\n throw new WalletNotConnectedError()\n }\n\n if (!this.primaryWallet.switchChain) {\n throw new Error(`Chain switching not supported by ${this.primaryWallet.type}`)\n }\n\n try {\n await this.primaryWallet.switchChain(chainId)\n return this.primaryWallet.currentAccount!\n } catch (error: any) {\n // If chain doesn't exist and auto-add is configured\n if (options?.addChainIfNotExists && options.chainConfig && this.primaryWallet.addChain) {\n await this.primaryWallet.addChain(options.chainConfig)\n await this.primaryWallet.switchChain(chainId)\n return this.primaryWallet.currentAccount!\n }\n throw error\n }\n }\n\n // ===== Contract Calls =====\n\n /**\n * Read contract\n */\n async readContract<T = any>(\n address: string,\n abi: any[],\n functionName: string,\n args?: any[],\n chainType?: ChainType\n ): Promise<T> {\n const adapter = chainType\n ? this.connectedWallets.get(chainType)\n : this.primaryWallet\n\n if (!adapter) {\n throw new WalletNotConnectedError()\n }\n\n if (!adapter.readContract) {\n throw new Error(`readContract not supported by ${adapter.type}`)\n }\n\n return adapter.readContract({ address, abi, functionName, args })\n }\n\n /**\n * Write contract\n */\n async writeContract(\n address: string,\n abi: any[],\n functionName: string,\n args?: any[],\n options?: {\n value?: string\n gas?: number\n gasPrice?: string // Legacy gas price (for pre-EIP-1559 networks)\n maxFeePerGas?: string // EIP-1559: Maximum fee per gas (in wei)\n maxPriorityFeePerGas?: string // EIP-1559: Maximum priority fee per gas (in wei)\n },\n chainType?: ChainType\n ): Promise<string> {\n const adapter = chainType\n ? this.connectedWallets.get(chainType)\n : this.primaryWallet\n\n if (!adapter) {\n throw new WalletNotConnectedError()\n }\n\n if (!adapter.writeContract) {\n throw new Error(`writeContract not supported by ${adapter.type}`)\n }\n\n return adapter.writeContract({\n address,\n abi,\n functionName,\n args,\n ...options,\n })\n }\n\n /**\n * Estimate gas\n */\n async estimateGas(\n address: string,\n abi: any[],\n functionName: string,\n args?: any[],\n chainType?: ChainType\n ): Promise<bigint> {\n const adapter = chainType\n ? this.connectedWallets.get(chainType)\n : this.primaryWallet\n\n if (!adapter) {\n throw new WalletNotConnectedError()\n }\n\n if (!adapter.estimateGas) {\n throw new Error(`estimateGas not supported by ${adapter.type}`)\n }\n\n return adapter.estimateGas({ address, abi, functionName, args })\n }\n\n /**\n * Wait for transaction confirmation\n */\n async waitForTransaction(\n txHash: string,\n confirmations?: number,\n chainType?: ChainType\n ): Promise<TransactionReceipt> {\n const adapter = chainType\n ? this.connectedWallets.get(chainType)\n : this.primaryWallet\n\n if (!adapter) {\n throw new WalletNotConnectedError()\n }\n\n if (!adapter.waitForTransaction) {\n throw new Error(`waitForTransaction not supported by ${adapter.type}`)\n }\n\n return adapter.waitForTransaction(txHash, confirmations)\n }\n\n // ===== Provider Access =====\n\n /**\n * Get primary wallet Provider\n */\n getProvider(): any {\n if (!this.primaryWallet) {\n throw new WalletNotConnectedError()\n }\n\n return this.primaryWallet.getProvider()\n }\n\n /**\n * Get Provider by chain type\n */\n getProviderByChainType(chainType: ChainType): any {\n const adapter = this.connectedWallets.get(chainType)\n if (!adapter) {\n throw new WalletNotConnectedError(`Wallet for chain type ${chainType}`)\n }\n\n return adapter.getProvider()\n }\n\n // ===== Private Methods =====\n\n /**\n * Set primary wallet\n */\n private setPrimaryWallet(adapter: IWalletAdapter): void {\n this.primaryWallet = adapter\n }\n\n /**\n * Check if wallet supports chain switching\n */\n private canSwitchChain(adapter: IWalletAdapter): boolean {\n return !!adapter.switchChain\n }\n\n /**\n * Setup adapter event listeners\n */\n private setupAdapterListeners(adapter: IWalletAdapter, isPrimary: boolean): void {\n adapter.on('accountChanged', (account: Account | null) => {\n if (isPrimary) {\n this.emit('accountChanged', account)\n }\n this.emit('walletAccountChanged', adapter.chainType, account, isPrimary)\n\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n })\n\n adapter.on('chainChanged', (chainId: number) => {\n if (isPrimary && adapter.currentAccount) {\n this.emit('chainChanged', chainId, adapter.currentAccount)\n }\n if (adapter.currentAccount) {\n this.emit('walletChainChanged', adapter.chainType, chainId, adapter.currentAccount, isPrimary)\n }\n\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n })\n\n adapter.on('disconnected', () => {\n if (isPrimary) {\n this.emit('disconnected')\n }\n this.emit('walletDisconnected', adapter.chainType, isPrimary)\n\n this.connectedWallets.delete(adapter.chainType)\n\n if (adapter === this.primaryWallet) {\n this.primaryWallet = null\n }\n\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n })\n\n adapter.on('error', (error: Error) => {\n this.emit('error', error)\n })\n }\n\n /**\n * Remove adapter event listeners\n */\n private removeAdapterListeners(adapter: IWalletAdapter | null): void {\n if (!adapter) return\n adapter.removeAllListeners()\n }\n\n // ===== Storage =====\n\n /**\n * Save to storage\n */\n private saveToStorage(): void {\n if (typeof window === 'undefined' || !this.config.enableStorage) {\n return\n }\n\n const data: StorageData = {\n current: this.primaryWallet?.currentAccount?.universalAddress || null,\n primaryWalletType: this.primaryWallet?.type,\n primaryChainId: this.primaryWallet?.currentAccount?.chainId,\n history: this.getHistoryRecords(),\n }\n\n try {\n localStorage.setItem(\n `${this.config.storagePrefix}data`,\n JSON.stringify(data)\n )\n } catch (error) {\n console.error('Failed to save wallet data to storage:', error)\n }\n }\n\n /**\n * Restore from storage\n * Returns a Promise that can be used for auto-reconnection\n */\n async restoreFromStorage(): Promise<Account | null> {\n if (typeof window === 'undefined' || !this.config.enableStorage) {\n return null\n }\n\n try {\n const stored = localStorage.getItem(`${this.config.storagePrefix}data`)\n if (!stored) {\n console.debug('[WalletManager] No stored wallet data found')\n return null\n }\n\n const data: StorageData = JSON.parse(stored)\n console.debug('[WalletManager] Restoring from storage:', data)\n \n // Cannot restore if primary wallet info is missing\n if (!data.primaryWalletType || !data.current) {\n console.debug('[WalletManager] Missing primary wallet info in storage')\n return null\n }\n\n // Get adapter\n const adapter = this.registry.getAdapter(data.primaryWalletType)\n if (!adapter) {\n console.debug('[WalletManager] Adapter not found for type:', data.primaryWalletType)\n return null\n }\n\n // Check if wallet is available\n const isAvailable = await adapter.isAvailable()\n if (!isAvailable) {\n console.debug('[WalletManager] Wallet not available:', data.primaryWalletType)\n return null\n }\n\n console.debug('[WalletManager] Wallet is available, attempting restoration')\n\n // For browser wallets (e.g., MetaMask), try to silently get authorized accounts first\n if (adapter.chainType === ChainType.EVM && data.primaryWalletType === WalletType.METAMASK) {\n try {\n // Try to silently get authorized accounts (no popup)\n const provider = typeof window !== 'undefined' ? (window as any).ethereum : null\n if (provider) {\n const accounts = await provider.request({\n method: 'eth_accounts',\n })\n\n console.debug('[WalletManager] Checking authorized accounts:', accounts)\n\n if (accounts && accounts.length > 0) {\n // Check if account matches saved address\n const savedAddress = data.current.split(':')[1] // Extract address from universalAddress\n const currentAddress = accounts[0].toLowerCase()\n \n console.debug('[WalletManager] Comparing addresses - saved:', savedAddress, 'current:', currentAddress)\n \n if (currentAddress === savedAddress.toLowerCase()) {\n // Authorized account found and address matches, call connect directly\n // If account is already authorized, eth_requestAccounts should not popup\n console.debug('[WalletManager] Address matches, attempting connect (should be silent if already authorized)')\n try {\n const account = await adapter.connect(data.primaryChainId)\n \n // Set as primary wallet and setup listeners\n this.setPrimaryWallet(adapter)\n this.connectedWallets.set(adapter.chainType, adapter)\n this.setupAdapterListeners(adapter, true)\n this.emit('accountChanged', account)\n \n console.debug('[WalletManager] Connect successful')\n return account\n } catch (connectError: any) {\n // If connection fails (might be user rejection), fail silently\n console.debug('[WalletManager] Connect failed (might be user rejection):', connectError?.message)\n return null\n }\n } else {\n console.debug('[WalletManager] Address mismatch, will try normal connect')\n }\n } else {\n console.debug('[WalletManager] No authorized accounts found')\n }\n }\n } catch (silentError) {\n // Silent connection failed, continue with normal connection\n console.debug('Silent connection failed, trying normal connection:', silentError)\n }\n }\n\n // For TronLink, similar handling\n if (adapter.chainType === ChainType.TRON && data.primaryWalletType === WalletType.TRONLINK) {\n try {\n const tronWeb = (adapter as any).getTronWeb?.()\n if (tronWeb && tronWeb.defaultAddress?.base58) {\n // TronLink is authorized, connect directly\n const account = await adapter.connect(data.primaryChainId)\n \n // Set as primary wallet\n this.setPrimaryWallet(adapter)\n this.connectedWallets.set(adapter.chainType, adapter)\n this.setupAdapterListeners(adapter, true)\n this.emit('accountChanged', account)\n \n return account\n }\n } catch (silentError) {\n console.debug('Silent TronLink connection failed:', silentError)\n }\n }\n\n // Try normal connection (may popup)\n const account = await adapter.connect(data.primaryChainId)\n\n // Set as primary wallet\n this.setPrimaryWallet(adapter)\n this.connectedWallets.set(adapter.chainType, adapter)\n this.setupAdapterListeners(adapter, true)\n\n // Don't save to storage here again to avoid loop\n this.emit('accountChanged', account)\n\n return account\n } catch (error) {\n // Silently handle errors, might be user rejection or wallet unavailable\n console.debug('Failed to restore wallet from storage:', error)\n return null\n }\n }\n\n /**\n * Clear storage\n */\n private clearStorage(): void {\n if (typeof window === 'undefined') {\n return\n }\n\n try {\n localStorage.removeItem(`${this.config.storagePrefix}data`)\n } catch (error) {\n console.error('Failed to clear wallet data from storage:', error)\n }\n }\n\n /**\n * Get history records\n */\n private getHistoryRecords(): WalletHistoryRecord[] {\n const records: WalletHistoryRecord[] = []\n\n for (const adapter of this.connectedWallets.values()) {\n if (adapter.currentAccount) {\n records.push({\n universalAddress: adapter.currentAccount.universalAddress,\n nativeAddress: adapter.currentAccount.nativeAddress,\n chainId: adapter.currentAccount.chainId,\n chainType: adapter.chainType,\n walletType: adapter.type,\n lastConnected: Date.now(),\n name: adapter.currentAccount.name,\n })\n }\n }\n\n return records\n }\n}\n\n","/**\n * 认证消息生成器\n */\n\nimport { ChainType } from '../core/types'\n\n/**\n * 认证消息参数\n */\nexport interface AuthMessageParams {\n domain: string\n nonce: string\n chainId: number\n timestamp: number\n statement?: string\n}\n\n/**\n * 认证消息生成器\n */\nexport class AuthMessageGenerator {\n constructor(private readonly domain: string) {}\n\n /**\n * 生成认证消息\n */\n generateAuthMessage(\n chainType: ChainType,\n nonce: string,\n chainId: number,\n timestamp: number = Date.now(),\n statement?: string\n ): string {\n switch (chainType) {\n case ChainType.EVM:\n return this.generateEIP191Message({\n domain: this.domain,\n nonce,\n chainId,\n timestamp,\n statement,\n })\n case ChainType.TRON:\n return this.generateTIP191Message({\n domain: this.domain,\n nonce,\n chainId,\n timestamp,\n statement,\n })\n default:\n throw new Error(`Unsupported chain type: ${chainType}`)\n }\n }\n\n /**\n * 生成 EIP-191 格式的认证消息\n */\n private generateEIP191Message(params: AuthMessageParams): string {\n const lines = [\n `${params.domain} wants you to sign in.`,\n '',\n ]\n\n if (params.statement) {\n lines.push(params.statement, '')\n }\n\n lines.push(\n `Nonce: ${params.nonce}`,\n `Chain ID: ${params.chainId}`,\n `Issued At: ${new Date(params.timestamp).toISOString()}`\n )\n\n return lines.join('\\n')\n }\n\n /**\n * 生成 TIP-191 格式的认证消息\n */\n private generateTIP191Message(params: AuthMessageParams): string {\n // TIP-191 与 EIP-191 格式相同,但使用 \"Tron\" 而不是 \"Ethereum\"\n const lines = [\n `${params.domain} wants you to sign in with your Tron account.`,\n '',\n ]\n\n if (params.statement) {\n lines.push(params.statement, '')\n }\n\n lines.push(\n `Nonce: ${params.nonce}`,\n `Chain ID: ${params.chainId}`,\n `Issued At: ${new Date(params.timestamp).toISOString()}`\n )\n\n return lines.join('\\n')\n }\n\n /**\n * 生成随机 nonce\n */\n static generateNonce(): string {\n const array = new Uint8Array(16)\n crypto.getRandomValues(array)\n return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('')\n }\n}\n\n\n","/**\n * 签名验证器\n */\n\nimport { verifyMessage } from 'viem'\nimport { ChainType } from '../core/types'\n\n/**\n * 签名验证器\n */\nexport class SignatureVerifier {\n /**\n * 验证签名\n */\n async verifySignature(\n message: string,\n signature: string,\n expectedAddress: string,\n chainType: ChainType\n ): Promise<boolean> {\n switch (chainType) {\n case ChainType.EVM:\n return this.verifyEIP191Signature(message, signature, expectedAddress)\n case ChainType.TRON:\n return this.verifyTIP191Signature(message, signature, expectedAddress)\n default:\n throw new Error(`Unsupported chain type: ${chainType}`)\n }\n }\n\n /**\n * 验证 EIP-191 签名\n */\n private async verifyEIP191Signature(\n message: string,\n signature: string,\n expectedAddress: string\n ): Promise<boolean> {\n try {\n const isValid = await verifyMessage({\n address: expectedAddress as `0x${string}`,\n message,\n signature: signature as `0x${string}`,\n })\n\n return isValid\n } catch (error) {\n console.error('EIP-191 signature verification failed:', error)\n return false\n }\n }\n\n /**\n * 验证 TIP-191 签名\n * 注意:这里需要 TronWeb 或类似库来验证 Tron 签名\n * 这是一个占位实现\n */\n private async verifyTIP191Signature(\n _message: string,\n _signature: string,\n _expectedAddress: string\n ): Promise<boolean> {\n // TODO: 实现 Tron 签名验证\n // 需要使用 TronWeb 的 verifyMessage 方法\n console.warn('TIP-191 signature verification not implemented yet')\n return false\n }\n}\n\n","/**\n * 支持的钱包列表\n */\n\nimport { ChainType, WalletType } from '../core/types'\n\n/**\n * 钱包元数据\n */\nexport interface WalletMetadata {\n type: WalletType\n name: string\n chainType: ChainType\n icon?: string\n downloadUrl?: string\n description?: string\n}\n\n/**\n * 支持的钱包列表\n */\nexport const SUPPORTED_WALLETS: Record<WalletType, WalletMetadata> = {\n [WalletType.METAMASK]: {\n type: WalletType.METAMASK,\n name: 'MetaMask',\n chainType: ChainType.EVM,\n icon: 'https://upload.wikimedia.org/wikipedia/commons/3/36/MetaMask_Fox.svg',\n downloadUrl: 'https://metamask.io/download/',\n description: 'The most popular Ethereum wallet',\n },\n\n [WalletType.WALLETCONNECT]: {\n type: WalletType.WALLETCONNECT,\n name: 'WalletConnect',\n chainType: ChainType.EVM,\n icon: 'https://avatars.githubusercontent.com/u/37784886',\n downloadUrl: 'https://walletconnect.com/',\n description: 'Connect to 170+ wallets',\n },\n\n [WalletType.COINBASE_WALLET]: {\n type: WalletType.COINBASE_WALLET,\n name: 'Coinbase Wallet',\n chainType: ChainType.EVM,\n icon: 'https://www.coinbase.com/img/favicon/favicon-96x96.png',\n downloadUrl: 'https://www.coinbase.com/wallet',\n description: 'Coinbase self-custody wallet',\n },\n\n [WalletType.TRONLINK]: {\n type: WalletType.TRONLINK,\n name: 'TronWeb',\n chainType: ChainType.TRON,\n icon: 'https://www.tronlink.org/static/logoIcon.svg',\n downloadUrl: 'https://www.tronlink.org/',\n description: 'TronWeb 兼容钱包(支持 TronLink、TokenPocket 等)',\n },\n\n [WalletType.WALLETCONNECT_TRON]: {\n type: WalletType.WALLETCONNECT_TRON,\n name: 'WalletConnect (Tron)',\n chainType: ChainType.TRON,\n downloadUrl: 'https://walletconnect.com/',\n description: 'WalletConnect for Tron',\n },\n\n [WalletType.PRIVATE_KEY]: {\n type: WalletType.PRIVATE_KEY,\n name: 'Private Key',\n chainType: ChainType.EVM, // 可以用于任何链\n description: 'Import wallet using private key (for development)',\n },\n}\n\n/**\n * 根据类型获取钱包元数据\n */\nexport function getWalletMetadata(type: WalletType): WalletMetadata | undefined {\n return SUPPORTED_WALLETS[type]\n}\n\n/**\n * 获取所有 EVM 钱包\n */\nexport function getEVMWallets(): WalletMetadata[] {\n return Object.values(SUPPORTED_WALLETS).filter(\n wallet => wallet.chainType === ChainType.EVM\n )\n}\n\n/**\n * 获取所有 Tron 钱包\n */\nexport function getTronWallets(): WalletMetadata[] {\n return Object.values(SUPPORTED_WALLETS).filter(\n wallet => wallet.chainType === ChainType.TRON\n )\n}\n\n","/**\n * Wallet Detector\n */\n\nimport { WalletType, ChainType, WalletAvailability } from '../core/types'\nimport { SUPPORTED_WALLETS } from './supported-wallets'\n\n/**\n * Wallet Detector\n */\nexport class WalletDetector {\n /**\n * Detect all wallet availability\n */\n async detectAllWallets(): Promise<WalletAvailability[]> {\n const walletTypes = Object.values(WalletType).filter(\n type => type !== WalletType.PRIVATE_KEY // Private key wallet does not need detection\n )\n\n const results = await Promise.all(\n walletTypes.map(type => this.detectWallet(type))\n )\n\n return results\n }\n\n /**\n * Detect specific wallet\n */\n async detectWallet(walletType: WalletType): Promise<WalletAvailability> {\n const metadata = SUPPORTED_WALLETS[walletType]\n \n if (!metadata) {\n return {\n walletType,\n chainType: ChainType.EVM, // Default\n isAvailable: false,\n detected: false,\n }\n }\n\n const isAvailable = await this.isWalletAvailable(walletType)\n\n return {\n walletType,\n chainType: metadata.chainType,\n isAvailable,\n downloadUrl: metadata.downloadUrl,\n detected: isAvailable,\n }\n }\n\n /**\n * Determine if wallet is available\n */\n private async isWalletAvailable(walletType: WalletType): Promise<boolean> {\n if (typeof window === 'undefined') {\n return false\n }\n\n switch (walletType) {\n case WalletType.METAMASK:\n return this.isMetaMaskAvailable()\n\n case WalletType.TRONLINK:\n return this.isTronLinkAvailable()\n\n case WalletType.COINBASE_WALLET:\n return this.isCoinbaseWalletAvailable()\n\n case WalletType.WALLETCONNECT:\n case WalletType.WALLETCONNECT_TRON:\n // WalletConnect does not need installation, always available\n return true\n\n case WalletType.PRIVATE_KEY:\n // Private key wallet is always available\n return true\n\n default:\n return false\n }\n }\n\n /**\n * 检测 MetaMask(现在支持所有 window.ethereum 钱包)\n */\n private isMetaMaskAvailable(): boolean {\n const w = window as any\n // 支持所有提供 window.ethereum 接口的钱包\n return !!w.ethereum\n }\n\n /**\n * 检测 TronWeb 兼容钱包\n * 支持所有提供 window.tronWeb 或 window.tronLink 接口的钱包\n * 包括但不限于:TronLink、TokenPocket 等\n */\n private isTronLinkAvailable(): boolean {\n const w = window as any\n // 检测 window.tronWeb(所有 TronWeb 兼容钱包都提供)\n // 或 window.tronLink(TronLink 特定)\n return !!(w.tronLink || w.tronWeb)\n }\n\n /**\n * 检测 Coinbase Wallet\n */\n private isCoinbaseWalletAvailable(): boolean {\n const w = window as any\n return !!(w.ethereum && w.ethereum.isCoinbaseWallet)\n }\n\n /**\n * 等待钱包加载(有些钱包可能延迟注入)\n */\n async waitForWallet(\n walletType: WalletType,\n timeout: number = 3000\n ): Promise<boolean> {\n const startTime = Date.now()\n\n while (Date.now() - startTime < timeout) {\n if (await this.isWalletAvailable(walletType)) {\n return true\n }\n await new Promise(resolve => setTimeout(resolve, 100))\n }\n\n return false\n }\n}\n\n\n","/**\n * Tron 地址转换工具\n */\n\n/**\n * 验证 Tron 地址(Base58 格式)\n */\nexport function isValidTronAddress(address: string): boolean {\n // Tron 地址以 T 开头,长度为 34\n if (!address || typeof address !== 'string') {\n return false\n }\n if (address.length !== 34 || !address.startsWith('T')) {\n return false\n }\n // Base58 字符集\n const base58Regex = /^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$/\n return base58Regex.test(address)\n}\n\n/**\n * 验证 Tron 地址(Hex 格式)\n */\nexport function isValidTronHexAddress(address: string): boolean {\n // Tron Hex 地址以 41 开头,长度为 42\n if (!address || typeof address !== 'string') {\n return false\n }\n if (address.length !== 42 || !address.startsWith('41')) {\n return false\n }\n const hexRegex = /^[0-9a-fA-F]+$/\n return hexRegex.test(address.substring(2))\n}\n\n/**\n * 比较两个 Tron 地址是否相同\n */\nexport function compareTronAddresses(a: string, b: string): boolean {\n // 简单比较(实际应该转换为同一格式后比较)\n return a === b\n}\n\n/**\n * 缩短 Tron 地址显示\n * 例如: TJmm...d7PK\n */\nexport function shortenTronAddress(address: string, chars = 4): string {\n if (!isValidTronAddress(address)) {\n return address\n }\n return `${address.substring(0, chars + 1)}...${address.substring(34 - chars)}`\n}\n\n/**\n * 注意:完整的 Tron 地址转换(Base58 <-> Hex)需要额外的库\n * 如 tronweb 或 @tronscan/client\n * 这里只提供基础验证功能\n */\n\n\n","/**\n * 验证工具函数\n */\n\nimport { isValidEVMAddress } from './address/evm-utils'\nimport { isValidTronAddress } from './address/tron-converter'\nimport { ChainType } from '../core/types'\nimport { getChainType } from './chain-info'\n\n/**\n * 根据链类型验证地址\n */\nexport function validateAddress(address: string, chainType: ChainType): boolean {\n switch (chainType) {\n case ChainType.EVM:\n return isValidEVMAddress(address)\n case ChainType.TRON:\n return isValidTronAddress(address)\n default:\n return false\n }\n}\n\n/**\n * 根据链 ID 验证地址\n */\nexport function validateAddressForChain(address: string, chainId: number): boolean {\n const chainType = getChainType(chainId)\n if (!chainType) {\n return false\n }\n return validateAddress(address, chainType)\n}\n\n/**\n * 验证链 ID\n */\nexport function isValidChainId(chainId: number): boolean {\n return Number.isInteger(chainId) && chainId > 0\n}\n\n/**\n * 验证签名\n */\nexport function isValidSignature(signature: string): boolean {\n // 基本验证:以 0x 开头,长度为 132(65 字节)\n return /^0x[0-9a-fA-F]{130}$/.test(signature)\n}\n\n/**\n * 验证交易哈希\n */\nexport function isValidTransactionHash(txHash: string, chainType: ChainType): boolean {\n switch (chainType) {\n case ChainType.EVM:\n // EVM: 0x + 64 hex chars\n return /^0x[0-9a-fA-F]{64}$/.test(txHash)\n case ChainType.TRON:\n // Tron: 64 hex chars (no 0x prefix)\n return /^[0-9a-fA-F]{64}$/.test(txHash)\n default:\n return false\n }\n}\n\n\n","/**\n * Hex 工具函数\n */\n\n/**\n * 判断是否为有效的 Hex 字符串\n */\nexport function isHex(value: string): boolean {\n return /^0x[0-9a-fA-F]*$/.test(value)\n}\n\n/**\n * 将字符串转换为 Hex\n */\nexport function toHex(value: string): string {\n let hex = ''\n for (let i = 0; i < value.length; i++) {\n hex += value.charCodeAt(i).toString(16)\n }\n return `0x${hex}`\n}\n\n/**\n * 将 Hex 转换为字符串\n */\nexport function fromHex(hex: string): string {\n const hexString = hex.startsWith('0x') ? hex.slice(2) : hex\n let str = ''\n for (let i = 0; i < hexString.length; i += 2) {\n str += String.fromCharCode(parseInt(hexString.substr(i, 2), 16))\n }\n return str\n}\n\n/**\n * 将数字转换为 Hex\n */\nexport function numberToHex(value: number | bigint): string {\n return `0x${value.toString(16)}`\n}\n\n/**\n * 将 Hex 转换为数字\n */\nexport function hexToNumber(hex: string): number {\n return parseInt(hex, 16)\n}\n\n/**\n * 确保 Hex 字符串有 0x 前缀\n */\nexport function ensureHexPrefix(value: string): string {\n return value.startsWith('0x') ? value : `0x${value}`\n}\n\n/**\n * 移除 Hex 字符串的 0x 前缀\n */\nexport function removeHexPrefix(value: string): string {\n return value.startsWith('0x') ? value.slice(2) : value\n}\n\n\n","/**\n * @enclave-hq/wallet-sdk\n * \n * Multi-chain wallet adapter for Enclave\n * Supports EVM and Tron ecosystems\n */\n\n// ===== Core =====\nexport { WalletManager } from './core/wallet-manager'\nexport { AdapterRegistry } from './core/adapter-registry'\n\n// ===== Types =====\nexport type {\n Account,\n UniversalAddress,\n ISigner,\n IWalletAdapter,\n WalletManagerConfig,\n WalletManagerEvents,\n ConnectedWallet,\n ContractReadParams,\n ContractWriteParams,\n TransactionReceipt,\n AddChainParams,\n WalletHistoryRecord,\n StorageData,\n WalletAvailability,\n EVMTransaction,\n TronTransaction,\n Transaction,\n} from './core/types'\n\nexport {\n ChainType,\n WalletType,\n WalletState,\n} from './core/types'\n\n// ===== Errors =====\nexport {\n WalletSDKError,\n WalletNotConnectedError,\n WalletNotAvailableError,\n ConnectionRejectedError,\n ChainNotSupportedError,\n SignatureRejectedError,\n TransactionFailedError,\n MethodNotSupportedError,\n ConfigurationError,\n NetworkError,\n} from './core/errors'\n\n// ===== Adapters =====\nexport { WalletAdapter } from './adapters/base/wallet-adapter'\nexport { BrowserWalletAdapter } from './adapters/base/browser-wallet-adapter'\nexport { MetaMaskAdapter } from './adapters/evm/metamask'\nexport { TronLinkAdapter } from './adapters/tron/tronlink'\nexport { EVMPrivateKeyAdapter } from './adapters/evm/private-key'\n\n// ===== Auth =====\nexport { AuthMessageGenerator } from './auth/message-generator'\nexport { SignatureVerifier } from './auth/signature-verifier'\nexport type { AuthMessageParams } from './auth/message-generator'\n\n// ===== Detection =====\nexport { WalletDetector } from './detection/detector'\nexport { SUPPORTED_WALLETS, getWalletMetadata, getEVMWallets, getTronWallets } from './detection/supported-wallets'\nexport type { WalletMetadata } from './detection/supported-wallets'\n\n// ===== Utils =====\nexport {\n createUniversalAddress,\n parseUniversalAddress,\n isValidUniversalAddress,\n getChainIdFromUniversalAddress,\n getAddressFromUniversalAddress,\n compareUniversalAddresses,\n} from './utils/address/universal-address'\n\nexport {\n isValidEVMAddress,\n formatEVMAddress,\n compareEVMAddresses,\n shortenAddress,\n} from './utils/address/evm-utils'\n\nexport {\n isValidTronAddress,\n isValidTronHexAddress,\n compareTronAddresses,\n shortenTronAddress,\n} from './utils/address/tron-converter'\n\nexport {\n CHAIN_INFO,\n getChainInfo,\n getChainType,\n isEVMChain,\n isTronChain,\n} from './utils/chain-info'\n\nexport type { ChainInfo } from './utils/chain-info'\n\nexport {\n validateAddress,\n validateAddressForChain,\n isValidChainId,\n isValidSignature,\n isValidTransactionHash,\n} from './utils/validation'\n\nexport {\n isHex,\n toHex,\n fromHex,\n numberToHex,\n hexToNumber,\n ensureHexPrefix,\n removeHexPrefix,\n} from './utils/hex'\n\n// ===== Default Export =====\nimport { WalletManager as WM } from './core/wallet-manager'\nexport default WM\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/types.ts","../src/adapters/deep-link/providers/tokenpocket.ts","../src/adapters/deep-link/providers/tronlink.ts","../src/adapters/deep-link/providers/imtoken.ts","../src/adapters/deep-link/providers/metamask.ts","../src/adapters/deep-link/providers/okx.ts","../src/core/events.ts","../src/core/adapter-registry.ts","../src/adapters/base/wallet-adapter.ts","../src/core/errors.ts","../src/adapters/base/browser-wallet-adapter.ts","../src/adapters/evm/metamask.ts","../src/utils/address/universal-address.ts","../src/utils/address/evm-utils.ts","../src/utils/chain-info.ts","../src/adapters/tron/tronlink.ts","../src/adapters/evm/private-key.ts","../src/adapters/evm/wallet-connect.ts","../src/adapters/tron/wallet-connect.ts","../src/adapters/deep-link/adapter.ts","../src/core/wallet-manager.ts","../src/utils/qrcode-signer.ts","../src/index.ts","../src/adapters/tron/deep-link.ts","../src/auth/message-generator.ts","../src/auth/signature-verifier.ts","../src/detection/detector.ts","../src/detection/supported-wallets.ts","../src/utils/address/tron-converter.ts","../src/utils/validation.ts","../src/utils/hex.ts"],"names":["ChainUtilsChainType","WalletType","WalletState","EventEmitter","ChainType","createWalletClient","http","createPublicClient","custom","DeepLinkProviderType","TokenPocketDeepLinkProvider","TronLinkDeepLinkProvider","ImTokenDeepLinkProvider","MetaMaskDeepLinkProvider","OKXDeepLinkProvider","QRCodeSignStatus","account","DeepLinkWalletType"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Core type definitions\n */\n\nimport { ChainType as ChainUtilsChainType } from '@enclave-hq/chain-utils'\n\n// ========== Enumerations ==========\n\n/**\n * Chain type (re-exported from chain-utils)\n */\nexport const ChainType = ChainUtilsChainType\nexport type ChainType = ChainUtilsChainType\n\n/**\n * Wallet Types\n */\nexport enum WalletType {\n METAMASK = 'metamask',\n WALLETCONNECT = 'walletconnect',\n COINBASE_WALLET = 'coinbase-wallet',\n TRONLINK = 'tronlink',\n WALLETCONNECT_TRON = 'walletconnect-tron',\n PRIVATE_KEY = 'private-key',\n // Deep Link (通用深度链接,与 WalletConnect 同级)\n DEEP_LINK_EVM = 'deep-link-evm',\n DEEP_LINK_TRON = 'deep-link-tron',\n}\n\n/**\n * Wallet States\n */\nexport enum WalletState {\n DISCONNECTED = 'disconnected',\n CONNECTING = 'connecting',\n CONNECTED = 'connected',\n ERROR = 'error',\n}\n\n// ========== Account Related ==========\n\n/**\n * Universal Address (chain-agnostic address)\n * Format: \"chainId:address\"\n */\nexport type UniversalAddress = string\n\n/**\n * Account Information\n */\nexport interface Account {\n /** Universal Address (chainId:address) */\n universalAddress: UniversalAddress\n /** Native address (e.g., 0x... or T...) */\n nativeAddress: string\n /** Chain ID */\n chainId: number\n /** Chain Type */\n chainType: ChainType\n /** Whether this is an active account */\n isActive: boolean\n /** Account balance (optional) */\n balance?: string\n /** Account name (optional) */\n name?: string\n}\n\n// ========== Signer Interface ==========\n\n/**\n * Signer interface\n * Compatible with Enclave SDK's ISigner interface\n * Provides a unified interface for signing operations\n * \n * Note: The signer should handle the appropriate signature standard:\n * - EIP-191 for EVM chains\n * - TIP-191 for TRON\n * - Other standards for other chains\n */\nexport interface ISigner {\n /**\n * Sign a message (raw message string, not hash)\n * @param message - Raw message string to sign\n * The signer should handle the appropriate signature standard\n * @returns Signature (hex string with 0x prefix)\n */\n signMessage(message: string): Promise<string>;\n\n /**\n * Get the signer's address\n * @returns Address (hex string with 0x prefix for EVM, Base58 for TRON)\n */\n getAddress(): Promise<string>;\n}\n\n// ========== Adapter Related ==========\n\n/**\n * 钱包适配器接口\n * Extends ISigner to provide unified signing interface\n */\nexport interface IWalletAdapter extends ISigner {\n // 元数据\n readonly type: WalletType\n readonly chainType: ChainType\n readonly name: string\n readonly icon?: string\n \n // 状态\n state: WalletState\n currentAccount: Account | null\n \n // 连接管理\n connect(chainId?: number | number[]): Promise<Account>\n disconnect(): Promise<void>\n isAvailable(): Promise<boolean>\n isConnected(): boolean\n \n // 签名\n signMessage(message: string): Promise<string>\n signTransaction?(transaction: Transaction): Promise<string>\n signTypedData?(typedData: any): Promise<string>\n \n // 链切换(仅 EVM 支持)\n switchChain?(chainId: number): Promise<void>\n addChain?(chainConfig: AddChainParams): Promise<void>\n \n // 合约调用\n readContract?<T = any>(params: ContractReadParams): Promise<T>\n writeContract?(params: ContractWriteParams): Promise<string>\n estimateGas?(params: ContractWriteParams): Promise<bigint>\n waitForTransaction?(txHash: string, confirmations?: number): Promise<TransactionReceipt>\n \n // Provider 访问\n getProvider(): any\n getSigner?(): any\n \n // 事件监听\n on(event: string, handler: (...args: any[]) => void): void\n off(event: string, handler: (...args: any[]) => void): void\n removeAllListeners(event?: string): void\n}\n\n/**\n * 合约读取参数\n */\nexport interface ContractReadParams {\n address: string\n abi: any[]\n functionName: string\n args?: any[]\n}\n\n/**\n * 合约写入参数\n */\nexport interface ContractWriteParams extends ContractReadParams {\n value?: string // 发送的原生代币数量(wei)\n gas?: number\n gasPrice?: string // Legacy gas price (for pre-EIP-1559 networks)\n maxFeePerGas?: string // EIP-1559: Maximum fee per gas (in wei)\n maxPriorityFeePerGas?: string // EIP-1559: Maximum priority fee per gas (in wei)\n}\n\n/**\n * EVM 交易参数\n */\nexport interface EVMTransaction {\n to: string\n value?: string | bigint\n data?: string\n gas?: string | bigint\n gasPrice?: string | bigint\n maxFeePerGas?: string | bigint\n maxPriorityFeePerGas?: string | bigint\n nonce?: number\n chainId?: number\n}\n\n/**\n * Tron 交易参数\n */\nexport interface TronTransaction {\n // Tron 交易格式\n txID?: string\n raw_data?: any\n raw_data_hex?: string\n visible?: boolean\n}\n\n/**\n * 通用交易类型\n */\nexport type Transaction = EVMTransaction | TronTransaction\n\n/**\n * 交易回执\n */\nexport interface TransactionReceipt {\n transactionHash: string\n blockNumber: number\n blockHash: string\n from: string\n to?: string\n status: 'success' | 'failed'\n gasUsed: string\n effectiveGasPrice?: string\n logs?: any[]\n}\n\n/**\n * 添加链参数\n */\nexport interface AddChainParams {\n chainId: number\n chainName: string\n nativeCurrency: {\n name: string\n symbol: string\n decimals: number\n }\n rpcUrls: string[]\n blockExplorerUrls?: string[]\n iconUrls?: string[]\n}\n\n// ========== WalletManager 相关 ==========\n\n/**\n * WalletManager 配置\n */\nexport interface WalletManagerConfig {\n /** 是否启用自动存储(localStorage) */\n enableStorage?: boolean\n /** 存储键前缀 */\n storagePrefix?: string\n /** 默认链 ID(EVM) */\n defaultChainId?: number\n /** 默认 Tron 链 ID */\n defaultTronChainId?: number\n /** WalletConnect 项目 ID */\n walletConnectProjectId?: string\n}\n\n/**\n * 已连接的钱包信息\n */\nexport interface ConnectedWallet {\n /** 账户信息 */\n account: Account\n /** 钱包类型 */\n walletType: WalletType\n /** Chain Type */\n chainType: ChainType\n /** 是否为主钱包 */\n isPrimary: boolean\n /** 是否支持链切换 */\n canSwitchChain: boolean\n /** 适配器实例 */\n adapter: IWalletAdapter\n}\n\n// ========== 事件相关 ==========\n\n/**\n * WalletManager 事件类型\n */\nexport interface WalletManagerEvents extends Record<string, (...args: any[]) => void> {\n // 主钱包事件\n accountChanged: (account: Account | null) => void\n chainChanged: (chainId: number, account: Account) => void\n disconnected: () => void\n \n // 任意钱包事件\n walletAccountChanged: (chainType: ChainType, account: Account | null, isPrimary: boolean) => void\n walletChainChanged: (chainType: ChainType, chainId: number, account: Account, isPrimary: boolean) => void\n walletDisconnected: (chainType: ChainType, isPrimary: boolean) => void\n \n // 主钱包切换\n primaryWalletSwitched: (newPrimary: Account, oldPrimary: Account | null, chainType: ChainType) => void\n \n // 错误\n error: (error: Error) => void\n}\n\n// ========== 存储相关 ==========\n\n/**\n * 存储的钱包历史记录\n */\nexport interface WalletHistoryRecord {\n universalAddress: UniversalAddress\n nativeAddress: string\n chainId: number\n chainType: ChainType\n walletType: WalletType\n lastConnected: number // 时间戳\n name?: string\n}\n\n/**\n * 存储的数据结构\n */\nexport interface StorageData {\n /** 当前 Universal Address */\n current: UniversalAddress | null\n /** 主钱包类型(用于自动恢复连接) */\n primaryWalletType?: WalletType\n /** 主钱包的 ChainID(用于自动恢复连接) */\n primaryChainId?: number\n /** 历史记录 */\n history: WalletHistoryRecord[]\n}\n\n// ========== 钱包检测 ==========\n\n/**\n * 钱包可用性信息\n */\nexport interface WalletAvailability {\n walletType: WalletType\n chainType: ChainType\n isAvailable: boolean\n downloadUrl?: string\n detected: boolean\n}\n\n","/**\n * TokenPocket Deep Link Provider\n * \n * 实现 TokenPocket 钱包的深度链接格式\n * 支持 EVM 和 TRON 链\n * \n * 参考文档: https://help.tokenpocket.pro/developer-en/wallet/pull-up-wallet-with-deeplink\n */\n\nimport { ChainType } from '../../../core/types'\nimport { IDeepLinkProvider, DeepLinkSignMessageParams, DeepLinkSignTransactionParams, DeepLinkConnectParams } from './base'\n\nexport class TokenPocketDeepLinkProvider implements IDeepLinkProvider {\n readonly name = 'TokenPocket'\n readonly icon = 'https://tokenpocket.pro/icon.png'\n readonly supportedChainTypes = [ChainType.EVM, ChainType.TRON]\n\n private callbackUrl?: string\n private callbackSchema?: string\n\n constructor(options?: {\n callbackUrl?: string\n callbackSchema?: string\n }) {\n this.callbackUrl = options?.callbackUrl\n this.callbackSchema = options?.callbackSchema\n }\n\n async isAvailable(): Promise<boolean> {\n if (typeof window === 'undefined') {\n return false\n }\n\n // Check if in Telegram Mini App\n // @ts-expect-error - Telegram WebApp is not in standard types\n const isTelegramMiniApp = !!(window.Telegram && window.Telegram.WebApp)\n if (isTelegramMiniApp) {\n return true\n }\n\n // Check if mobile device\n const isMobile = /Mobile|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent\n )\n\n return isMobile\n }\n\n /**\n * Generate unique actionId\n */\n private generateActionId(): string {\n return `web-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`\n }\n\n /**\n * Get callback configuration\n */\n private getCallbackConfig(): { callbackSchema?: string; callbackUrl?: string } {\n if (this.callbackSchema) {\n return { callbackSchema: this.callbackSchema }\n }\n if (this.callbackUrl) {\n return { callbackUrl: this.callbackUrl }\n }\n // Default: use current page URL as callbackSchema\n if (typeof window !== 'undefined' && window.location) {\n return {\n callbackSchema: `${window.location.protocol}//${window.location.host}${window.location.pathname}`\n }\n }\n return {}\n }\n\n /**\n * Get blockchain configuration based on chain type\n */\n private getBlockchainConfig(chainId: number, chainType: ChainType): any {\n if (chainType === ChainType.TRON) {\n return {\n chainId: String(chainId),\n network: 'tron'\n }\n } else if (chainType === ChainType.EVM) {\n return {\n chainId: String(chainId),\n network: 'ethereum'\n }\n }\n throw new Error(`Unsupported chain type: ${chainType}`)\n }\n\n buildSignMessageLink(params: DeepLinkSignMessageParams): {\n url: string\n actionId: string\n callbackSchema?: string\n callbackUrl?: string\n } {\n const actionId = this.generateActionId()\n const callback = this.getCallbackConfig()\n const blockchain = this.getBlockchainConfig(params.chainId, params.chainType)\n\n // Build param object according to TokenPocket docs\n const param: any = {\n action: 'sign',\n actionId: actionId,\n message: params.message,\n hash: false,\n signType: params.chainType === ChainType.TRON ? 'ethPersonalSign' : 'ethPersonalSign',\n memo: `${params.chainType} message signature`,\n blockchains: [blockchain],\n dappName: 'Enclave Wallet SDK',\n dappIcon: 'https://walletconnect.com/walletconnect-logo.svg',\n protocol: 'TokenPocket',\n version: '1.1.8',\n expired: 0,\n ...callback,\n }\n\n const encodedParam = encodeURIComponent(JSON.stringify(param))\n const url = `tpoutside://pull.activity?param=${encodedParam}`\n\n return {\n url,\n actionId,\n ...callback,\n }\n }\n\n buildSignTransactionLink(params: DeepLinkSignTransactionParams): {\n url: string\n actionId: string\n callbackSchema?: string\n callbackUrl?: string\n } {\n const actionId = this.generateActionId()\n const callback = this.getCallbackConfig()\n const blockchain = this.getBlockchainConfig(params.chainId, params.chainType)\n\n // Prepare transaction data\n let transactionData: string\n if (typeof params.transaction === 'string') {\n transactionData = params.transaction\n } else {\n transactionData = JSON.stringify(params.transaction)\n }\n\n // Build param object according to TokenPocket docs\n const param: any = {\n action: 'pushTransaction',\n actionId: actionId,\n txData: transactionData,\n blockchains: [blockchain],\n dappName: 'Enclave Wallet SDK',\n dappIcon: 'https://walletconnect.com/walletconnect-logo.svg',\n protocol: 'TokenPocket',\n version: '1.1.8',\n expired: 0,\n ...callback,\n }\n\n const encodedParam = encodeURIComponent(JSON.stringify(param))\n const url = `tpoutside://pull.activity?param=${encodedParam}`\n\n return {\n url,\n actionId,\n ...callback,\n }\n }\n\n buildConnectLink(params: DeepLinkConnectParams): {\n url: string\n actionId?: string\n } {\n const actionId = this.generateActionId()\n const blockchain = this.getBlockchainConfig(params.chainId, params.chainType)\n\n const param: any = {\n action: 'login',\n actionId: actionId,\n blockchains: [blockchain],\n dappName: 'Enclave Wallet SDK',\n dappIcon: 'https://walletconnect.com/walletconnect-logo.svg',\n protocol: 'TokenPocket',\n version: '1.0',\n expired: 1602, // 30 minutes\n }\n\n const encodedParam = encodeURIComponent(JSON.stringify(param))\n const url = `tpoutside://pull.activity?param=${encodedParam}`\n\n return {\n url,\n actionId,\n }\n }\n\n parseCallbackResult(urlParams: URLSearchParams): {\n actionId: string | null\n result: any | null\n error: string | null\n } {\n const actionId = urlParams.get('actionId')\n const resultParam = urlParams.get('result')\n const error = urlParams.get('error')\n\n let result: any = null\n if (resultParam) {\n try {\n result = JSON.parse(decodeURIComponent(resultParam))\n } catch (e) {\n result = resultParam\n }\n }\n\n return {\n actionId,\n result,\n error,\n }\n }\n\n getDefaultCallbackSchema(): string {\n if (typeof window !== 'undefined' && window.location) {\n return `${window.location.protocol}//${window.location.host}${window.location.pathname}`\n }\n return ''\n }\n}\n\n","/**\n * TronLink Deep Link Provider\n * \n * 实现 TronLink 钱包的深度链接格式\n * 主要支持 TRON 链\n * \n * 参考文档: https://docs.tronlink.org/zh/mobile/deeplink\n */\n\nimport { ChainType } from '../../../core/types'\nimport { IDeepLinkProvider, DeepLinkSignMessageParams, DeepLinkSignTransactionParams, DeepLinkConnectParams } from './base'\n\nexport class TronLinkDeepLinkProvider implements IDeepLinkProvider {\n readonly name = 'TronLink'\n readonly icon = 'https://www.tronlink.org/static/logoIcon.svg'\n readonly supportedChainTypes = [ChainType.TRON]\n\n async isAvailable(): Promise<boolean> {\n if (typeof window === 'undefined') {\n return false\n }\n\n // Check if in Telegram Mini App\n // @ts-expect-error - Telegram WebApp is not in standard types\n const isTelegramMiniApp = !!(window.Telegram && window.Telegram.WebApp)\n if (isTelegramMiniApp) {\n return true\n }\n\n // Check if mobile device\n const isMobile = /Mobile|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent\n )\n\n return isMobile\n }\n\n buildSignMessageLink(params: DeepLinkSignMessageParams): {\n url: string\n actionId: string\n callbackSchema?: string\n callbackUrl?: string\n } {\n if (params.chainType !== ChainType.TRON) {\n throw new Error('TronLink only supports TRON chain')\n }\n\n const encodedMessage = encodeURIComponent(params.message)\n const url = `tronlink://signMessage?message=${encodedMessage}`\n \n // TronLink may not support callback, so we use a simple actionId for tracking\n const actionId = `tronlink-${Date.now()}`\n\n return {\n url,\n actionId,\n }\n }\n\n buildSignTransactionLink(params: DeepLinkSignTransactionParams): {\n url: string\n actionId: string\n callbackSchema?: string\n callbackUrl?: string\n } {\n if (params.chainType !== ChainType.TRON) {\n throw new Error('TronLink only supports TRON chain')\n }\n\n const transactionData = typeof params.transaction === 'string'\n ? params.transaction\n : JSON.stringify(params.transaction)\n const encodedData = encodeURIComponent(transactionData)\n const url = `tronlink://signTransaction?transaction=${encodedData}`\n \n // TronLink may not support callback, so we use a simple actionId for tracking\n const actionId = `tronlink-${Date.now()}`\n\n return {\n url,\n actionId,\n }\n }\n\n buildConnectLink(params: DeepLinkConnectParams): {\n url: string\n actionId?: string\n } {\n if (params.chainType !== ChainType.TRON) {\n throw new Error('TronLink only supports TRON chain')\n }\n\n const url = `tronlink://open?action=connect&network=tron`\n \n return {\n url,\n }\n }\n\n parseCallbackResult(_urlParams: URLSearchParams): {\n actionId: string | null\n result: any | null\n error: string | null\n } {\n // TronLink may not support standard callback format\n // This is a placeholder for future implementation\n return {\n actionId: null,\n result: null,\n error: null,\n }\n }\n}\n\n","/**\n * ImToken Deep Link Provider\n * \n * 实现 ImToken 钱包的深度链接格式\n * 支持 EVM 和 TRON 链\n * \n * 参考文档: https://imtoken.gitbook.io/developers/products/deep-linking\n */\n\nimport { ChainType } from '../../../core/types'\nimport { IDeepLinkProvider, DeepLinkSignMessageParams, DeepLinkSignTransactionParams, DeepLinkConnectParams } from './base'\n\nexport class ImTokenDeepLinkProvider implements IDeepLinkProvider {\n readonly name = 'ImToken'\n readonly icon = 'https://token.im/static/img/logo.png'\n readonly supportedChainTypes = [ChainType.EVM, ChainType.TRON]\n\n private callbackUrl?: string\n private callbackSchema?: string\n\n constructor(options?: {\n callbackUrl?: string\n callbackSchema?: string\n }) {\n this.callbackUrl = options?.callbackUrl\n this.callbackSchema = options?.callbackSchema\n }\n\n async isAvailable(): Promise<boolean> {\n if (typeof window === 'undefined') {\n return false\n }\n\n // Check if in Telegram Mini App\n // @ts-expect-error - Telegram WebApp is not in standard types\n const isTelegramMiniApp = !!(window.Telegram && window.Telegram.WebApp)\n if (isTelegramMiniApp) {\n return true\n }\n\n // Check if mobile device\n const isMobile = /Mobile|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent\n )\n\n return isMobile\n }\n\n /**\n * Generate unique actionId\n */\n private generateActionId(): string {\n return `imtoken-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`\n }\n\n /**\n * Get callback configuration\n */\n private getCallbackConfig(): { callbackSchema?: string; callbackUrl?: string } {\n if (this.callbackSchema) {\n return { callbackSchema: this.callbackSchema }\n }\n if (this.callbackUrl) {\n return { callbackUrl: this.callbackUrl }\n }\n // Default: use current page URL as callbackSchema\n if (typeof window !== 'undefined' && window.location) {\n return {\n callbackSchema: `${window.location.protocol}//${window.location.host}${window.location.pathname}`\n }\n }\n return {}\n }\n\n buildSignMessageLink(params: DeepLinkSignMessageParams): {\n url: string\n actionId: string\n callbackSchema?: string\n callbackUrl?: string\n } {\n const actionId = this.generateActionId()\n const callback = this.getCallbackConfig()\n\n // ImToken deep link format according to official docs\n // Format: imtokenv2://navigate/DappView?url={dappUrl}\n // For signing, we can open DApp in imToken's in-app browser\n // Note: ImToken doesn't have direct signMessage deep link, so we use DappView\n const dappUrl = `${window.location.origin}${window.location.pathname}?action=signMessage&message=${encodeURIComponent(params.message)}&chainId=${params.chainId}`\n const encodedDappUrl = encodeURIComponent(dappUrl)\n const url = `imtokenv2://navigate/DappView?url=${encodedDappUrl}`\n\n return {\n url,\n actionId,\n ...callback,\n }\n }\n\n buildSignTransactionLink(params: DeepLinkSignTransactionParams): {\n url: string\n actionId: string\n callbackSchema?: string\n callbackUrl?: string\n } {\n const actionId = this.generateActionId()\n const callback = this.getCallbackConfig()\n\n // ImToken deep link format according to official docs\n // Format: imtokenv2://navigate/DappView?url={dappUrl}\n // For signing transaction, we can open DApp in imToken's in-app browser\n const transactionData = typeof params.transaction === 'string'\n ? params.transaction\n : JSON.stringify(params.transaction)\n const dappUrl = `${window.location.origin}${window.location.pathname}?action=signTransaction&transaction=${encodeURIComponent(transactionData)}&chainId=${params.chainId}`\n const encodedDappUrl = encodeURIComponent(dappUrl)\n const url = `imtokenv2://navigate/DappView?url=${encodedDappUrl}`\n\n return {\n url,\n actionId,\n ...callback,\n }\n }\n\n buildConnectLink(params: DeepLinkConnectParams): {\n url: string\n actionId?: string\n } {\n // ImToken deep link format according to official docs\n // Format: imtokenv2://navigate/AssetsTab (home page)\n // Or: imtokenv2://navigate/DappView?url={dappUrl} (open DApp)\n const dappUrl = `${window.location.origin}${window.location.pathname}?action=connect&chainId=${params.chainId}`\n const encodedDappUrl = encodeURIComponent(dappUrl)\n const url = `imtokenv2://navigate/DappView?url=${encodedDappUrl}`\n\n return {\n url,\n }\n }\n\n parseCallbackResult(urlParams: URLSearchParams): {\n actionId: string | null\n result: any | null\n error: string | null\n } {\n const actionId = urlParams.get('actionId')\n const resultParam = urlParams.get('result')\n const error = urlParams.get('error')\n\n let result: any = null\n if (resultParam) {\n try {\n result = JSON.parse(decodeURIComponent(resultParam))\n } catch (e) {\n result = resultParam\n }\n }\n\n return {\n actionId,\n result,\n error,\n }\n }\n\n getDefaultCallbackSchema(): string {\n if (typeof window !== 'undefined' && window.location) {\n return `${window.location.protocol}//${window.location.host}${window.location.pathname}`\n }\n return ''\n }\n}\n\n","/**\n * MetaMask Deep Link Provider\n * \n * 实现 MetaMask 钱包的深度链接格式\n * 支持 EVM 链\n * \n * 参考文档: https://docs.metamask.io/sdk/guides/use-deeplinks\n */\n\nimport { ChainType } from '../../../core/types'\nimport { IDeepLinkProvider, DeepLinkSignMessageParams, DeepLinkSignTransactionParams, DeepLinkConnectParams } from './base'\n\nexport class MetaMaskDeepLinkProvider implements IDeepLinkProvider {\n readonly name = 'MetaMask'\n readonly icon = 'https://upload.wikimedia.org/wikipedia/commons/3/36/MetaMask_Fox.svg'\n readonly supportedChainTypes = [ChainType.EVM]\n\n async isAvailable(): Promise<boolean> {\n if (typeof window === 'undefined') {\n return false\n }\n\n // Check if in Telegram Mini App\n // @ts-expect-error - Telegram WebApp is not in standard types\n const isTelegramMiniApp = !!(window.Telegram && window.Telegram.WebApp)\n if (isTelegramMiniApp) {\n return true\n }\n\n // Check if mobile device\n const isMobile = /Mobile|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent\n )\n\n return isMobile\n }\n\n buildSignMessageLink(params: DeepLinkSignMessageParams): {\n url: string\n actionId: string\n callbackSchema?: string\n callbackUrl?: string\n } {\n if (params.chainType !== ChainType.EVM) {\n throw new Error('MetaMask only supports EVM chains')\n }\n\n // MetaMask deep link format: https://link.metamask.io/dapp/{dappUrl}\n // For signing, we open the DApp in MetaMask's in-app browser\n const dappUrl = `${window.location.origin}${window.location.pathname}?action=signMessage&message=${encodeURIComponent(params.message)}&chainId=${params.chainId}`\n const encodedDappUrl = encodeURIComponent(dappUrl)\n const url = `https://link.metamask.io/dapp/${encodedDappUrl}`\n const actionId = `metamask-${Date.now()}`\n\n return {\n url,\n actionId,\n }\n }\n\n buildSignTransactionLink(params: DeepLinkSignTransactionParams): {\n url: string\n actionId: string\n callbackSchema?: string\n callbackUrl?: string\n } {\n if (params.chainType !== ChainType.EVM) {\n throw new Error('MetaMask only supports EVM chains')\n }\n\n // MetaMask supports sending native currency or ERC-20 tokens\n // Format: https://link.metamask.io/send/{recipient}@{chainId}?value={amount}\n // For generic transaction signing, we use DApp link\n const transactionData = typeof params.transaction === 'string'\n ? params.transaction\n : JSON.stringify(params.transaction)\n const dappUrl = `${window.location.origin}${window.location.pathname}?action=signTransaction&transaction=${encodeURIComponent(transactionData)}&chainId=${params.chainId}`\n const encodedDappUrl = encodeURIComponent(dappUrl)\n const url = `https://link.metamask.io/dapp/${encodedDappUrl}`\n const actionId = `metamask-${Date.now()}`\n\n return {\n url,\n actionId,\n }\n }\n\n buildConnectLink(params: DeepLinkConnectParams): {\n url: string\n actionId?: string\n } {\n if (params.chainType !== ChainType.EVM) {\n throw new Error('MetaMask only supports EVM chains')\n }\n\n // MetaMask deep link format: https://link.metamask.io/dapp/{dappUrl}\n const dappUrl = `${window.location.origin}${window.location.pathname}?action=connect&chainId=${params.chainId}`\n const encodedDappUrl = encodeURIComponent(dappUrl)\n const url = `https://link.metamask.io/dapp/${encodedDappUrl}`\n\n return {\n url,\n }\n }\n\n parseCallbackResult(urlParams: URLSearchParams): {\n actionId: string | null\n result: any | null\n error: string | null\n } {\n // MetaMask may not support standard callback format\n // This is a placeholder for future implementation\n const actionId = urlParams.get('actionId')\n const resultParam = urlParams.get('result')\n const error = urlParams.get('error')\n\n let result: any = null\n if (resultParam) {\n try {\n result = JSON.parse(decodeURIComponent(resultParam))\n } catch (e) {\n result = resultParam\n }\n }\n\n return {\n actionId,\n result,\n error,\n }\n }\n\n getDefaultCallbackSchema(): string {\n if (typeof window !== 'undefined' && window.location) {\n return `${window.location.protocol}//${window.location.host}${window.location.pathname}`\n }\n return ''\n }\n}\n\n","/**\n * OKX Deep Link Provider\n * \n * 实现 OKX 钱包的深度链接格式\n * 支持 EVM 和 TRON 链\n * \n * 参考文档: https://web3.okx.com/zh-hans/build/docs/waas/app-universal-link\n */\n\nimport { ChainType } from '../../../core/types'\nimport { IDeepLinkProvider, DeepLinkSignMessageParams, DeepLinkSignTransactionParams, DeepLinkConnectParams } from './base'\n\nexport class OKXDeepLinkProvider implements IDeepLinkProvider {\n readonly name = 'OKX'\n readonly icon = 'https://www.okx.com/favicon.ico'\n readonly supportedChainTypes = [ChainType.EVM, ChainType.TRON]\n\n async isAvailable(): Promise<boolean> {\n if (typeof window === 'undefined') {\n return false\n }\n\n // Check if in Telegram Mini App\n // @ts-expect-error - Telegram WebApp is not in standard types\n const isTelegramMiniApp = !!(window.Telegram && window.Telegram.WebApp)\n if (isTelegramMiniApp) {\n return true\n }\n\n // Check if mobile device\n const isMobile = /Mobile|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent\n )\n\n return isMobile\n }\n\n buildSignMessageLink(params: DeepLinkSignMessageParams): {\n url: string\n actionId: string\n callbackSchema?: string\n callbackUrl?: string\n } {\n // OKX deep link format: okx://wallet/dapp/url?dappUrl={dappUrl}\n // For signing, we open the DApp in OKX's in-app browser\n const dappUrl = `${window.location.origin}${window.location.pathname}?action=signMessage&message=${encodeURIComponent(params.message)}&chainId=${params.chainId}`\n const encodedDappUrl = encodeURIComponent(dappUrl)\n const url = `okx://wallet/dapp/url?dappUrl=${encodedDappUrl}`\n const actionId = `okx-${Date.now()}`\n\n return {\n url,\n actionId,\n }\n }\n\n buildSignTransactionLink(params: DeepLinkSignTransactionParams): {\n url: string\n actionId: string\n callbackSchema?: string\n callbackUrl?: string\n } {\n // OKX deep link format: okx://wallet/dapp/url?dappUrl={dappUrl}\n const transactionData = typeof params.transaction === 'string'\n ? params.transaction\n : JSON.stringify(params.transaction)\n const dappUrl = `${window.location.origin}${window.location.pathname}?action=signTransaction&transaction=${encodeURIComponent(transactionData)}&chainId=${params.chainId}`\n const encodedDappUrl = encodeURIComponent(dappUrl)\n const url = `okx://wallet/dapp/url?dappUrl=${encodedDappUrl}`\n const actionId = `okx-${Date.now()}`\n\n return {\n url,\n actionId,\n }\n }\n\n buildConnectLink(params: DeepLinkConnectParams): {\n url: string\n actionId?: string\n } {\n // OKX deep link format: okx://wallet/dapp/url?dappUrl={dappUrl}\n const dappUrl = `${window.location.origin}${window.location.pathname}?action=connect&chainId=${params.chainId}`\n const encodedDappUrl = encodeURIComponent(dappUrl)\n const url = `okx://wallet/dapp/url?dappUrl=${encodedDappUrl}`\n\n return {\n url,\n }\n }\n\n parseCallbackResult(urlParams: URLSearchParams): {\n actionId: string | null\n result: any | null\n error: string | null\n } {\n const actionId = urlParams.get('actionId')\n const resultParam = urlParams.get('result')\n const error = urlParams.get('error')\n\n let result: any = null\n if (resultParam) {\n try {\n result = JSON.parse(decodeURIComponent(resultParam))\n } catch (e) {\n result = resultParam\n }\n }\n\n return {\n actionId,\n result,\n error,\n }\n }\n\n getDefaultCallbackSchema(): string {\n if (typeof window !== 'undefined' && window.location) {\n return `${window.location.protocol}//${window.location.host}${window.location.pathname}`\n }\n return ''\n }\n}\n\n","/**\n * Event System\n */\n\nimport EventEmitter from 'eventemitter3'\n\n/**\n * Type-safe Event Emitter\n * Uses type assertion to provide type-safe API while avoiding type conflicts with base class\n */\nexport class TypedEventEmitter<\n TEvents extends Record<string, (...args: any[]) => void>\n> {\n private emitter = new EventEmitter()\n\n on<K extends keyof TEvents>(\n event: K,\n handler: TEvents[K]\n ): this {\n this.emitter.on(event as string, handler as any)\n return this\n }\n\n once<K extends keyof TEvents>(\n event: K,\n handler: TEvents[K]\n ): this {\n this.emitter.once(event as string, handler as any)\n return this\n }\n\n off<K extends keyof TEvents>(\n event: K,\n handler: TEvents[K]\n ): this {\n this.emitter.off(event as string, handler as any)\n return this\n }\n\n emit<K extends keyof TEvents>(\n event: K,\n ...args: Parameters<TEvents[K]>\n ): boolean {\n return this.emitter.emit(event as string, ...args)\n }\n\n removeAllListeners<K extends keyof TEvents>(event?: K): this {\n if (event !== undefined) {\n this.emitter.removeAllListeners(event as string)\n } else {\n this.emitter.removeAllListeners()\n }\n return this\n }\n}\n\n","/**\n * Adapter Registry\n */\n\nimport { IWalletAdapter, WalletType, ChainType, WalletManagerConfig } from './types'\nimport { MetaMaskAdapter } from '../adapters/evm/metamask'\nimport { TronLinkAdapter } from '../adapters/tron/tronlink'\nimport { EVMPrivateKeyAdapter } from '../adapters/evm/private-key'\nimport { WalletConnectAdapter } from '../adapters/evm/wallet-connect'\nimport { WalletConnectTronAdapter } from '../adapters/tron/wallet-connect'\nimport { DeepLinkAdapter, DeepLinkProviderType } from '../adapters/deep-link/adapter'\n\n/**\n * Adapter Registry\n */\nexport class AdapterRegistry {\n private adapters: Map<WalletType, () => IWalletAdapter> = new Map()\n private config: WalletManagerConfig\n\n constructor(config: WalletManagerConfig = {}) {\n this.config = config\n this.registerDefaultAdapters()\n }\n\n /**\n * Register default adapters\n */\n private registerDefaultAdapters(): void {\n // EVM adapters\n this.register(WalletType.METAMASK, () => new MetaMaskAdapter())\n this.register(WalletType.PRIVATE_KEY, () => new EVMPrivateKeyAdapter())\n \n // Wallet Connect adapter (only register if projectId is provided)\n if (this.config.walletConnectProjectId) {\n this.register(WalletType.WALLETCONNECT, () => \n new WalletConnectAdapter(this.config.walletConnectProjectId!)\n )\n // Wallet Connect Tron adapter\n this.register(WalletType.WALLETCONNECT_TRON, () => \n new WalletConnectTronAdapter(this.config.walletConnectProjectId!)\n )\n }\n\n // Tron adapters\n this.register(WalletType.TRONLINK, () => new TronLinkAdapter())\n \n // Deep Link adapters (通用深度链接,与 WalletConnect 同级)\n // 支持多链(EVM、TRON)和多个钱包提供者(TokenPocket、ImToken、TronLink等)\n // 注意:Deep Link 主要用于签名操作,连接功能可能受限\n this.register(WalletType.DEEP_LINK_EVM, () => \n new DeepLinkAdapter({\n providerType: DeepLinkProviderType.TOKENPOCKET,\n })\n )\n this.register(WalletType.DEEP_LINK_TRON, () => \n new DeepLinkAdapter({\n providerType: DeepLinkProviderType.TOKENPOCKET,\n })\n )\n }\n\n /**\n * Register adapter\n */\n register(type: WalletType, factory: () => IWalletAdapter): void {\n this.adapters.set(type, factory)\n }\n\n /**\n * Get adapter\n */\n getAdapter(type: WalletType): IWalletAdapter | null {\n const factory = this.adapters.get(type)\n if (!factory) {\n return null\n }\n return factory()\n }\n\n /**\n * Check if adapter is registered\n */\n has(type: WalletType): boolean {\n return this.adapters.has(type)\n }\n\n /**\n * Get all registered adapter types\n */\n getRegisteredTypes(): WalletType[] {\n return Array.from(this.adapters.keys())\n }\n\n /**\n * 根据链类型获取适配器类型列表\n */\n getAdapterTypesByChainType(chainType: ChainType): WalletType[] {\n const types: WalletType[] = []\n\n for (const type of this.adapters.keys()) {\n const adapter = this.getAdapter(type)\n if (adapter && adapter.chainType === chainType) {\n types.push(type)\n }\n }\n\n return types\n }\n}\n\n\n","/**\n * 钱包适配器基类\n */\n\nimport EventEmitter from 'eventemitter3'\nimport {\n WalletType,\n ChainType,\n WalletState,\n Account,\n IWalletAdapter,\n ContractReadParams,\n ContractWriteParams,\n TransactionReceipt,\n} from '../../core/types'\nimport { WalletNotConnectedError, MethodNotSupportedError } from '../../core/errors'\n\n/**\n * 钱包适配器基类\n */\nexport abstract class WalletAdapter extends EventEmitter implements IWalletAdapter {\n // 元数据\n abstract readonly type: WalletType\n abstract readonly chainType: ChainType\n abstract readonly name: string\n readonly icon?: string\n\n // 状态\n state: WalletState = WalletState.DISCONNECTED\n currentAccount: Account | null = null\n\n // 连接管理\n // Support both single chain ID and array of chain IDs for multi-chain support\n // Most adapters will use the first chain ID if an array is provided\n abstract connect(chainId?: number | number[]): Promise<Account>\n abstract disconnect(): Promise<void>\n abstract isAvailable(): Promise<boolean>\n \n /**\n * Check if the wallet is currently connected\n * @returns true if the wallet is connected (state is CONNECTED and has an account)\n */\n isConnected(): boolean {\n return this.state === WalletState.CONNECTED && this.currentAccount !== null\n }\n\n // 签名\n abstract signMessage(message: string): Promise<string>\n\n /**\n * Get the signer's address (implements ISigner interface)\n * Returns the native address of the current account\n */\n async getAddress(): Promise<string> {\n this.ensureConnected()\n if (!this.currentAccount) {\n throw new WalletNotConnectedError(this.type)\n }\n return this.currentAccount.nativeAddress\n }\n\n signTransaction?(_transaction: any): Promise<string> {\n throw new MethodNotSupportedError('signTransaction', this.type)\n }\n\n signTypedData?(_typedData: any): Promise<string> {\n throw new MethodNotSupportedError('signTypedData', this.type)\n }\n\n // 链切换(默认不支持)\n switchChain?(_chainId: number): Promise<void> {\n throw new MethodNotSupportedError('switchChain', this.type)\n }\n\n addChain?(_chainConfig: any): Promise<void> {\n throw new MethodNotSupportedError('addChain', this.type)\n }\n\n // 合约调用(默认不支持)\n async readContract<T = any>(_params: ContractReadParams): Promise<T> {\n throw new MethodNotSupportedError('readContract', this.type)\n }\n\n async writeContract(_params: ContractWriteParams): Promise<string> {\n throw new MethodNotSupportedError('writeContract', this.type)\n }\n\n async estimateGas(_params: ContractWriteParams): Promise<bigint> {\n throw new MethodNotSupportedError('estimateGas', this.type)\n }\n\n async waitForTransaction(_txHash: string, _confirmations?: number): Promise<TransactionReceipt> {\n throw new MethodNotSupportedError('waitForTransaction', this.type)\n }\n\n // Provider 访问\n abstract getProvider(): any\n\n getSigner?(): any {\n throw new MethodNotSupportedError('getSigner', this.type)\n }\n\n // 工具方法\n protected ensureConnected(): void {\n if (this.state !== WalletState.CONNECTED || !this.currentAccount) {\n throw new WalletNotConnectedError(this.type)\n }\n }\n\n protected setState(state: WalletState): void {\n this.state = state\n }\n\n protected setAccount(account: Account | null): void {\n this.currentAccount = account\n }\n\n protected emitAccountChanged(account: Account | null): void {\n this.emit('accountChanged', account)\n }\n\n protected emitChainChanged(chainId: number): void {\n this.emit('chainChanged', chainId)\n }\n\n protected emitDisconnected(): void {\n this.emit('disconnected')\n }\n\n protected emitError(error: Error): void {\n this.emit('error', error)\n }\n\n // EventEmitter 方法(从 EventEmitter3 继承)\n // removeAllListeners 已经由 EventEmitter 提供\n}\n\n","/**\n * Error Type Definitions\n */\n\n/**\n * Base Error Class\n */\nexport class WalletSDKError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: any\n ) {\n super(message)\n this.name = 'WalletSDKError'\n Object.setPrototypeOf(this, WalletSDKError.prototype)\n }\n}\n\n/**\n * Wallet Not Connected Error\n */\nexport class WalletNotConnectedError extends WalletSDKError {\n constructor(walletType?: string) {\n super(\n walletType\n ? `Wallet ${walletType} is not connected`\n : 'No wallet is connected',\n 'WALLET_NOT_CONNECTED',\n { walletType }\n )\n this.name = 'WalletNotConnectedError'\n }\n}\n\n/**\n * Wallet Not Available Error\n */\nexport class WalletNotAvailableError extends WalletSDKError {\n constructor(walletType: string, downloadUrl?: string) {\n super(\n `Wallet ${walletType} is not available. Please install it first.`,\n 'WALLET_NOT_AVAILABLE',\n { walletType, downloadUrl }\n )\n this.name = 'WalletNotAvailableError'\n }\n}\n\n/**\n * Connection Rejected Error\n */\nexport class ConnectionRejectedError extends WalletSDKError {\n constructor(walletType: string) {\n super(\n `Connection to ${walletType} was rejected by user`,\n 'CONNECTION_REJECTED',\n { walletType }\n )\n this.name = 'ConnectionRejectedError'\n }\n}\n\n/**\n * Chain Not Supported Error\n */\nexport class ChainNotSupportedError extends WalletSDKError {\n constructor(chainId: number, walletType: string) {\n super(\n `Chain ${chainId} is not supported by ${walletType}`,\n 'CHAIN_NOT_SUPPORTED',\n { chainId, walletType }\n )\n this.name = 'ChainNotSupportedError'\n }\n}\n\n/**\n * Signature Rejected Error\n */\nexport class SignatureRejectedError extends WalletSDKError {\n constructor(message?: string) {\n super(\n message || 'Signature was rejected by user',\n 'SIGNATURE_REJECTED'\n )\n this.name = 'SignatureRejectedError'\n }\n}\n\n/**\n * Transaction Failed Error\n */\nexport class TransactionFailedError extends WalletSDKError {\n constructor(txHash: string, reason?: string) {\n super(\n `Transaction ${txHash} failed${reason ? `: ${reason}` : ''}`,\n 'TRANSACTION_FAILED',\n { txHash, reason }\n )\n this.name = 'TransactionFailedError'\n }\n}\n\n/**\n * Method Not Supported Error\n */\nexport class MethodNotSupportedError extends WalletSDKError {\n constructor(method: string, walletType: string) {\n super(\n `Method ${method} is not supported by ${walletType}`,\n 'METHOD_NOT_SUPPORTED',\n { method, walletType }\n )\n this.name = 'MethodNotSupportedError'\n }\n}\n\n/**\n * 配置错误\n */\nexport class ConfigurationError extends WalletSDKError {\n constructor(message: string, details?: any) {\n super(message, 'CONFIGURATION_ERROR', details)\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * 网络错误\n */\nexport class NetworkError extends WalletSDKError {\n constructor(message: string, details?: any) {\n super(message, 'NETWORK_ERROR', details)\n this.name = 'NetworkError'\n }\n}\n\n\n","/**\n * 浏览器钱包适配器基类\n * 用于 MetaMask、TronLink 等浏览器插件钱包\n */\n\nimport { WalletAdapter } from './wallet-adapter'\nimport { WalletState } from '../../core/types'\nimport { WalletNotAvailableError } from '../../core/errors'\n\n/**\n * 浏览器钱包适配器基类\n */\nexport abstract class BrowserWalletAdapter extends WalletAdapter {\n /**\n * 获取浏览器中的钱包 provider\n */\n protected abstract getBrowserProvider(): any | undefined\n\n /**\n * 检查钱包是否可用\n */\n async isAvailable(): Promise<boolean> {\n if (typeof window === 'undefined') {\n return false\n }\n return this.getBrowserProvider() !== undefined\n }\n\n /**\n * 确保钱包已安装\n */\n protected async ensureAvailable(): Promise<void> {\n const isAvailable = await this.isAvailable()\n if (!isAvailable) {\n throw new WalletNotAvailableError(\n this.type,\n this.getDownloadUrl()\n )\n }\n }\n\n /**\n * 获取下载链接\n */\n protected abstract getDownloadUrl(): string\n\n /**\n * 设置事件监听\n */\n protected abstract setupEventListeners(): void\n\n /**\n * 移除事件监听\n */\n protected abstract removeEventListeners(): void\n\n /**\n * 断开连接时清理\n */\n async disconnect(): Promise<void> {\n this.removeEventListeners()\n this.setState(WalletState.DISCONNECTED)\n this.setAccount(null)\n this.emitDisconnected()\n }\n}\n\n\n","/**\n * MetaMask Adapter\n */\n\nimport { createWalletClient, createPublicClient, custom, http, type WalletClient, type PublicClient } from 'viem'\nimport { BrowserWalletAdapter } from '../base/browser-wallet-adapter'\nimport {\n WalletType,\n ChainType,\n WalletState,\n Account,\n AddChainParams,\n ContractReadParams,\n ContractWriteParams,\n TransactionReceipt,\n} from '../../core/types'\nimport { createUniversalAddress } from '../../utils/address/universal-address'\nimport { formatEVMAddress } from '../../utils/address/evm-utils'\nimport { ConnectionRejectedError, SignatureRejectedError, TransactionFailedError } from '../../core/errors'\nimport { getChainInfo } from '../../utils/chain-info'\n\n/**\n * MetaMask Adapter\n */\nexport class MetaMaskAdapter extends BrowserWalletAdapter {\n readonly type = WalletType.METAMASK\n readonly chainType = ChainType.EVM\n readonly name = 'MetaMask'\n readonly icon = 'https://upload.wikimedia.org/wikipedia/commons/3/36/MetaMask_Fox.svg'\n\n private walletClient: WalletClient | null = null\n private publicClient: PublicClient | null = null\n\n /**\n * Connect wallet\n */\n async connect(chainId?: number | number[]): Promise<Account> {\n await this.ensureAvailable()\n \n // For MetaMask, use first chain ID if array is provided\n const targetChainId = Array.isArray(chainId) ? chainId[0] : chainId\n\n try {\n this.setState(WalletState.CONNECTING)\n\n const provider = this.getBrowserProvider()\n\n // Request accounts\n const accounts = await provider.request({\n method: 'eth_requestAccounts',\n })\n\n if (!accounts || accounts.length === 0) {\n throw new ConnectionRejectedError(this.type)\n }\n\n // Get current chain ID\n const currentChainId = await provider.request({\n method: 'eth_chainId',\n })\n const parsedChainId = parseInt(currentChainId, 16)\n\n // If chain ID is specified and doesn't match, try to switch\n // For MetaMask, use first chain ID if array is provided\n if (targetChainId && targetChainId !== parsedChainId) {\n await this.switchChain(targetChainId)\n }\n\n const finalChainId = targetChainId || parsedChainId\n const viemChain = this.getViemChain(finalChainId) as any\n\n // Create clients (need to specify chain to support writeContract)\n this.walletClient = createWalletClient({\n account: accounts[0] as `0x${string}`,\n chain: viemChain,\n transport: custom(provider),\n })\n\n // Use our configured RPC nodes for read operations to avoid MetaMask internal RPC issues\n const chainInfo = getChainInfo(finalChainId)\n const primaryRpcUrl = chainInfo?.rpcUrls[0] // Use first (most reliable) RPC node\n \n this.publicClient = createPublicClient({\n chain: viemChain,\n transport: primaryRpcUrl ? http(primaryRpcUrl) : custom(provider), // 优先使用我们的 RPC,降级到 MetaMask provider\n }) as any\n\n // 创建账户信息\n const address = formatEVMAddress(accounts[0])\n const account: Account = {\n universalAddress: createUniversalAddress(finalChainId, address),\n nativeAddress: address,\n chainId: finalChainId,\n chainType: ChainType.EVM,\n isActive: true,\n }\n\n this.setState(WalletState.CONNECTED)\n this.setAccount(account)\n this.setupEventListeners()\n\n return account\n } catch (error: any) {\n this.setState(WalletState.ERROR)\n this.setAccount(null)\n\n if (error.code === 4001) {\n throw new ConnectionRejectedError(this.type)\n }\n\n throw error\n }\n }\n\n /**\n * 签名消息\n */\n async signMessage(message: string): Promise<string> {\n this.ensureConnected()\n\n try {\n const provider = this.getBrowserProvider()\n const signature = await provider.request({\n method: 'personal_sign',\n params: [message, this.currentAccount!.nativeAddress],\n })\n\n return signature\n } catch (error: any) {\n if (error.code === 4001) {\n throw new SignatureRejectedError()\n }\n throw error\n }\n }\n\n /**\n * 签名 TypedData (EIP-712)\n */\n async signTypedData(typedData: any): Promise<string> {\n this.ensureConnected()\n\n try {\n const provider = this.getBrowserProvider()\n const signature = await provider.request({\n method: 'eth_signTypedData_v4',\n params: [this.currentAccount!.nativeAddress, JSON.stringify(typedData)],\n })\n\n return signature\n } catch (error: any) {\n if (error.code === 4001) {\n throw new SignatureRejectedError()\n }\n throw error\n }\n }\n\n /**\n * 签名交易\n * \n * Note: This signs a raw transaction without sending it.\n * The transaction can be broadcast later using the returned signature.\n */\n async signTransaction(transaction: any): Promise<string> {\n this.ensureConnected()\n\n try {\n const provider = this.getBrowserProvider()\n \n // Prepare transaction object with proper formatting\n const tx = {\n from: this.currentAccount!.nativeAddress,\n to: transaction.to,\n value: transaction.value ? `0x${BigInt(transaction.value).toString(16)}` : undefined,\n data: transaction.data || '0x',\n gas: transaction.gas ? `0x${BigInt(transaction.gas).toString(16)}` : undefined,\n gasPrice: transaction.gasPrice && transaction.gasPrice !== 'auto' ? `0x${BigInt(transaction.gasPrice).toString(16)}` : undefined,\n maxFeePerGas: transaction.maxFeePerGas ? `0x${BigInt(transaction.maxFeePerGas).toString(16)}` : undefined,\n maxPriorityFeePerGas: transaction.maxPriorityFeePerGas ? `0x${BigInt(transaction.maxPriorityFeePerGas).toString(16)}` : undefined,\n nonce: transaction.nonce !== undefined ? `0x${transaction.nonce.toString(16)}` : undefined,\n chainId: transaction.chainId || this.currentAccount!.chainId,\n }\n\n // Sign the transaction\n const signature = await provider.request({\n method: 'eth_signTransaction',\n params: [tx],\n })\n\n return signature\n } catch (error: any) {\n if (error.code === 4001) {\n throw new SignatureRejectedError('Transaction signature was rejected by user')\n }\n throw error\n }\n }\n\n /**\n * 切换链\n */\n async switchChain(chainId: number): Promise<void> {\n // 在连接过程中允许切换链,不需要检查连接状态\n const provider = this.getBrowserProvider()\n\n try {\n await provider.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: `0x${chainId.toString(16)}` }],\n })\n\n // 更新账户信息\n if (this.currentAccount) {\n const updatedAccount: Account = {\n ...this.currentAccount,\n chainId,\n universalAddress: createUniversalAddress(chainId, this.currentAccount.nativeAddress),\n }\n this.setAccount(updatedAccount)\n this.emitChainChanged(chainId)\n }\n } catch (error: any) {\n // 链不存在,尝试添加\n if (error.code === 4902) {\n const chainInfo = getChainInfo(chainId)\n if (chainInfo) {\n await this.addChain({\n chainId: chainInfo.id,\n chainName: chainInfo.name,\n nativeCurrency: chainInfo.nativeCurrency,\n rpcUrls: chainInfo.rpcUrls,\n blockExplorerUrls: chainInfo.blockExplorerUrls,\n })\n // 添加成功后再次尝试切换\n await this.switchChain(chainId)\n } else {\n throw new Error(`Chain ${chainId} not supported`)\n }\n } else {\n throw error\n }\n }\n }\n\n /**\n * 添加链\n */\n async addChain(chainConfig: AddChainParams): Promise<void> {\n const provider = this.getBrowserProvider()\n\n await provider.request({\n method: 'wallet_addEthereumChain',\n params: [{\n chainId: `0x${chainConfig.chainId.toString(16)}`,\n chainName: chainConfig.chainName,\n nativeCurrency: chainConfig.nativeCurrency,\n rpcUrls: chainConfig.rpcUrls,\n blockExplorerUrls: chainConfig.blockExplorerUrls,\n }],\n })\n }\n\n /**\n * 读取合约\n */\n async readContract<T = any>(params: ContractReadParams): Promise<T> {\n if (!this.publicClient) {\n throw new Error('Public client not initialized')\n }\n\n const result = await this.publicClient.readContract({\n address: params.address as `0x${string}`,\n abi: params.abi,\n functionName: params.functionName,\n ...(params.args ? { args: params.args as readonly any[] } : {}),\n } as any)\n\n return result as T\n }\n\n /**\n * 写入合约\n */\n async writeContract(params: ContractWriteParams): Promise<string> {\n this.ensureConnected()\n\n if (!this.walletClient) {\n throw new Error('Wallet client not initialized')\n }\n\n try {\n // 调试日志\n console.log('🔍 [MetaMask writeContract] Gas params:', {\n gasPrice: params.gasPrice,\n maxFeePerGas: params.maxFeePerGas,\n maxPriorityFeePerGas: params.maxPriorityFeePerGas,\n });\n \n // 构建交易选项\n const txOptions: any = {\n address: params.address as `0x${string}`,\n abi: params.abi,\n functionName: params.functionName,\n ...(params.args ? { args: params.args as readonly any[] } : {}),\n value: params.value ? BigInt(params.value) : undefined,\n gas: params.gas ? BigInt(params.gas) : undefined,\n };\n\n // EIP-1559 网络优先使用 maxFeePerGas 和 maxPriorityFeePerGas\n // 如果提供了 EIP-1559 参数,使用它们;否则如果提供了 gasPrice,使用 gasPrice;否则让 viem 自动获取\n if (params.maxFeePerGas || params.maxPriorityFeePerGas) {\n // 使用 EIP-1559 参数\n if (params.maxFeePerGas) {\n txOptions.maxFeePerGas = BigInt(params.maxFeePerGas);\n }\n if (params.maxPriorityFeePerGas) {\n txOptions.maxPriorityFeePerGas = BigInt(params.maxPriorityFeePerGas);\n }\n // 在 EIP-1559 网络中,不应该同时设置 gasPrice\n console.log('🔍 [MetaMask writeContract] Using EIP-1559 gas params');\n } else if (params.gasPrice) {\n // Legacy 网络或明确指定 gasPrice\n if (params.gasPrice === 'auto') {\n // 让 viem 自动获取 gas price(会根据网络类型自动选择 EIP-1559 或 Legacy)\n console.log('🔍 [MetaMask writeContract] Auto gas price - letting viem decide');\n } else {\n txOptions.gasPrice = BigInt(params.gasPrice);\n console.log('🔍 [MetaMask writeContract] Using legacy gasPrice');\n }\n } else {\n // 没有提供任何 gas 参数,主动获取并设置合理的 gas 费用\n console.log('🔍 [MetaMask writeContract] No gas params - fetching and setting reasonable gas fees');\n \n // 获取当前网络的 gas 费用信息并设置\n if (this.publicClient) {\n try {\n // 尝试获取 EIP-1559 费用(如果网络支持)\n const feesPerGas = await this.publicClient.estimateFeesPerGas().catch(() => null);\n if (feesPerGas) {\n // 确保 maxPriorityFeePerGas 有合理的最小值(至少 0.1 Gwei = 100000000 wei)\n // 如果太小,MetaMask 可能会使用默认值导致费用过高\n const minPriorityFeeWei = BigInt(100_000_000); // 0.1 Gwei\n const maxPriorityFeePerGas = feesPerGas.maxPriorityFeePerGas > minPriorityFeeWei \n ? feesPerGas.maxPriorityFeePerGas \n : minPriorityFeeWei;\n \n // maxFeePerGas 应该至少是 baseFee + priorityFee\n // 如果估算的 maxFeePerGas 太小,增加一些缓冲\n const adjustedMaxFeePerGas = feesPerGas.maxFeePerGas > maxPriorityFeePerGas\n ? feesPerGas.maxFeePerGas\n : maxPriorityFeePerGas + BigInt(1_000_000_000); // 至少增加 1 Gwei\n \n // 设置 EIP-1559 参数\n txOptions.maxFeePerGas = adjustedMaxFeePerGas;\n txOptions.maxPriorityFeePerGas = maxPriorityFeePerGas;\n \n const maxFeePerGasGwei = Number(adjustedMaxFeePerGas) / 1e9;\n const maxPriorityFeePerGasGwei = Number(maxPriorityFeePerGas) / 1e9;\n \n console.log('💰 [MetaMask writeContract] Set gas fees (EIP-1559):', {\n maxFeePerGas: `${maxFeePerGasGwei.toFixed(6)} Gwei`,\n maxPriorityFeePerGas: `${maxPriorityFeePerGasGwei.toFixed(6)} Gwei`,\n maxFeePerGasWei: adjustedMaxFeePerGas.toString(),\n maxPriorityFeePerGasWei: maxPriorityFeePerGas.toString(),\n note: '已设置合理的 gas 费用,避免 MetaMask 使用默认值',\n });\n } else {\n // 回退到 Legacy gas price\n const gasPrice = await this.publicClient.getGasPrice();\n txOptions.gasPrice = gasPrice;\n \n const gasPriceGwei = Number(gasPrice) / 1e9;\n console.log('💰 [MetaMask writeContract] Set gas price (Legacy):', {\n gasPrice: `${gasPriceGwei.toFixed(6)} Gwei`,\n gasPriceWei: gasPrice.toString(),\n });\n }\n } catch (err) {\n console.warn('⚠️ [MetaMask writeContract] Failed to estimate gas fees, letting viem auto-estimate:', err);\n }\n }\n }\n \n const txHash = await this.walletClient.writeContract(txOptions as any)\n\n return txHash\n } catch (error: any) {\n if (error.code === 4001) {\n throw new SignatureRejectedError('Transaction was rejected by user')\n }\n throw error\n }\n }\n\n /**\n * 估算 gas\n */\n async estimateGas(params: ContractWriteParams): Promise<bigint> {\n if (!this.publicClient) {\n throw new Error('Public client not initialized')\n }\n\n const gas = await this.publicClient.estimateContractGas({\n address: params.address as `0x${string}`,\n abi: params.abi,\n functionName: params.functionName,\n ...(params.args ? { args: params.args as readonly any[] } : {}),\n value: params.value ? BigInt(params.value) : undefined,\n account: this.currentAccount!.nativeAddress as `0x${string}`,\n } as any)\n\n return gas\n }\n\n /**\n * 等待交易确认\n */\n async waitForTransaction(txHash: string, confirmations: number = 1): Promise<TransactionReceipt> {\n if (!this.publicClient) {\n throw new Error('Public client not initialized')\n }\n\n const receipt = await this.publicClient.waitForTransactionReceipt({\n hash: txHash as `0x${string}`,\n confirmations,\n })\n\n if (receipt.status === 'reverted') {\n throw new TransactionFailedError(txHash, 'Transaction reverted')\n }\n\n return {\n transactionHash: receipt.transactionHash,\n blockNumber: Number(receipt.blockNumber),\n blockHash: receipt.blockHash,\n from: receipt.from,\n to: receipt.to || undefined,\n status: receipt.status === 'success' ? 'success' : 'failed',\n gasUsed: receipt.gasUsed.toString(),\n effectiveGasPrice: receipt.effectiveGasPrice?.toString(),\n logs: receipt.logs,\n }\n }\n\n /**\n * 获取 Provider\n */\n getProvider(): any {\n return this.getBrowserProvider()\n }\n\n /**\n * 获取 Signer\n */\n getSigner(): WalletClient | null {\n return this.walletClient\n }\n\n /**\n * 获取浏览器中的 MetaMask provider\n */\n protected getBrowserProvider(): any | undefined {\n if (typeof window === 'undefined') {\n return undefined\n }\n const w = window as any\n // 支持所有提供 window.ethereum 接口的钱包(MetaMask、TP钱包、Trust Wallet等)\n return w.ethereum ? w.ethereum : undefined\n }\n\n /**\n * 获取下载链接\n */\n protected getDownloadUrl(): string {\n return 'https://metamask.io/download/'\n }\n\n /**\n * 设置事件监听\n */\n protected setupEventListeners(): void {\n const provider = this.getBrowserProvider()\n if (!provider) return\n\n provider.on('accountsChanged', this.handleAccountsChanged)\n provider.on('chainChanged', this.handleChainChanged)\n provider.on('disconnect', this.handleDisconnect)\n }\n\n /**\n * 移除事件监听\n */\n protected removeEventListeners(): void {\n const provider = this.getBrowserProvider()\n if (!provider) return\n\n provider.removeListener('accountsChanged', this.handleAccountsChanged)\n provider.removeListener('chainChanged', this.handleChainChanged)\n provider.removeListener('disconnect', this.handleDisconnect)\n }\n\n /**\n * 处理账户变化\n * \n * 注意:MetaMask 的行为\n * - 切换到已连接的账户:触发事件,返回新账户 ['0xNewAddress']\n * - 切换到未连接的账户:不触发事件(用户需要手动断开和重新连接)\n * - 锁定钱包:触发事件,返回空数组 []\n */\n private handleAccountsChanged = (accounts: string[]) => {\n console.log('[MetaMask] accountsChanged event triggered:', accounts)\n \n if (accounts.length === 0) {\n // 用户锁定钱包或手动断开连接\n console.log('[MetaMask] Disconnecting: wallet locked or manually disconnected')\n this.setState(WalletState.DISCONNECTED)\n this.setAccount(null)\n this.emitAccountChanged(null)\n } else {\n // 用户在已连接的账户之间切换\n const address = formatEVMAddress(accounts[0])\n console.log('[MetaMask] Account changed to:', address)\n const account: Account = {\n universalAddress: createUniversalAddress(this.currentAccount!.chainId, address),\n nativeAddress: address,\n chainId: this.currentAccount!.chainId,\n chainType: ChainType.EVM,\n isActive: true,\n }\n this.setAccount(account)\n this.emitAccountChanged(account)\n }\n }\n\n /**\n * 处理链变化\n */\n private handleChainChanged = (chainIdHex: string) => {\n const chainId = parseInt(chainIdHex, 16)\n\n if (this.currentAccount) {\n const account: Account = {\n ...this.currentAccount,\n chainId,\n universalAddress: createUniversalAddress(chainId, this.currentAccount.nativeAddress),\n }\n this.setAccount(account)\n this.emitChainChanged(chainId)\n }\n }\n\n /**\n * 处理断开连接\n */\n private handleDisconnect = () => {\n this.setState(WalletState.DISCONNECTED)\n this.setAccount(null)\n this.emitDisconnected()\n }\n\n /**\n * 获取 viem chain 配置(简化版)\n */\n private getViemChain(chainId: number): any {\n const chainInfo = getChainInfo(chainId)\n if (chainInfo) {\n return {\n id: chainId,\n name: chainInfo.name,\n network: chainInfo.name.toLowerCase().replace(/\\s+/g, '-'),\n nativeCurrency: chainInfo.nativeCurrency,\n rpcUrls: {\n default: { http: chainInfo.rpcUrls },\n public: { http: chainInfo.rpcUrls },\n },\n blockExplorers: chainInfo.blockExplorerUrls ? {\n default: { name: 'Explorer', url: chainInfo.blockExplorerUrls[0] },\n } : undefined,\n }\n }\n\n // 默认配置\n return {\n id: chainId,\n name: `Chain ${chainId}`,\n network: `chain-${chainId}`,\n nativeCurrency: {\n name: 'ETH',\n symbol: 'ETH',\n decimals: 18,\n },\n rpcUrls: {\n default: { http: [] },\n public: { http: [] },\n },\n }\n }\n}\n\n","/**\n * Universal Address 工具\n * 格式: \"chainId:address\"\n */\n\nimport type { UniversalAddress } from '../../core/types'\n\n/**\n * 创建 Universal Address\n */\nexport function createUniversalAddress(\n chainId: number,\n address: string\n): UniversalAddress {\n return `${chainId}:${address}`\n}\n\n/**\n * 解析 Universal Address\n */\nexport function parseUniversalAddress(universalAddress: UniversalAddress): {\n chainId: number\n address: string\n} | null {\n const parts = universalAddress.split(':')\n if (parts.length !== 2) {\n return null\n }\n \n const chainId = parseInt(parts[0], 10)\n if (isNaN(chainId)) {\n return null\n }\n \n return {\n chainId,\n address: parts[1],\n }\n}\n\n/**\n * 验证 Universal Address 格式\n */\nexport function isValidUniversalAddress(universalAddress: string): boolean {\n return parseUniversalAddress(universalAddress) !== null\n}\n\n/**\n * 从 Universal Address 提取链 ID\n */\nexport function getChainIdFromUniversalAddress(\n universalAddress: UniversalAddress\n): number | null {\n const parsed = parseUniversalAddress(universalAddress)\n return parsed ? parsed.chainId : null\n}\n\n/**\n * 从 Universal Address 提取地址\n */\nexport function getAddressFromUniversalAddress(\n universalAddress: UniversalAddress\n): string | null {\n const parsed = parseUniversalAddress(universalAddress)\n return parsed ? parsed.address : null\n}\n\n/**\n * 比较两个 Universal Address 是否相同\n */\nexport function compareUniversalAddresses(\n a: UniversalAddress,\n b: UniversalAddress\n): boolean {\n return a.toLowerCase() === b.toLowerCase()\n}\n\n\n","/**\n * EVM 地址工具\n */\n\nimport { getAddress, isAddress } from 'viem'\n\n/**\n * 验证 EVM 地址\n */\nexport function isValidEVMAddress(address: string): boolean {\n return isAddress(address)\n}\n\n/**\n * 格式化 EVM 地址(checksum)\n */\nexport function formatEVMAddress(address: string): string {\n if (!isAddress(address)) {\n throw new Error(`Invalid EVM address: ${address}`)\n }\n return getAddress(address)\n}\n\n/**\n * 比较两个 EVM 地址是否相同\n */\nexport function compareEVMAddresses(a: string, b: string): boolean {\n try {\n return getAddress(a) === getAddress(b)\n } catch {\n return false\n }\n}\n\n/**\n * 缩短地址显示\n * 例如: 0x1234...5678\n */\nexport function shortenAddress(address: string, chars = 4): string {\n if (!isAddress(address)) {\n return address\n }\n const formatted = getAddress(address)\n return `${formatted.substring(0, chars + 2)}...${formatted.substring(42 - chars)}`\n}\n\n\n","/**\n * Chain information constants\n */\n\nimport { \n ChainType,\n nativeToSlip44,\n slip44ToNative,\n ChainInfo as ChainUtilsChainInfo\n} from '@enclave-hq/chain-utils'\n\n/**\n * Extended chain information interface (adds RPC and explorer URLs)\n */\nexport interface ChainInfo extends Omit<ChainUtilsChainInfo, 'nativeChainId' | 'slip44'> {\n id: number // Native chain ID\n slip44?: number // SLIP-44 ID (optional)\n nativeCurrency: {\n name: string\n symbol: string\n decimals: number\n }\n rpcUrls: string[]\n blockExplorerUrls?: string[]\n iconUrls?: string[]\n}\n\n/**\n * Predefined chain information\n */\nexport const CHAIN_INFO: Record<number, ChainInfo> = {\n // EVM Mainnet\n 1: {\n id: 1,\n slip44: 60, // Ethereum SLIP-44\n name: 'Ethereum Mainnet',\n chainType: ChainType.EVM,\n symbol: 'ETH',\n nativeCurrency: {\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n rpcUrls: ['https://eth.llamarpc.com'],\n blockExplorerUrls: ['https://etherscan.io'],\n },\n \n // EVM Testnets\n 11155111: {\n id: 11155111,\n name: 'Sepolia Testnet',\n chainType: ChainType.EVM,\n symbol: 'ETH',\n nativeCurrency: {\n name: 'Sepolia Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n rpcUrls: ['https://rpc.sepolia.org'],\n blockExplorerUrls: ['https://sepolia.etherscan.io'],\n },\n \n // Binance Smart Chain\n 56: {\n id: 56,\n slip44: 714, // BSC SLIP-44\n name: 'BNB Smart Chain',\n chainType: ChainType.EVM,\n symbol: 'BNB',\n nativeCurrency: {\n name: 'BNB',\n symbol: 'BNB',\n decimals: 18,\n },\n rpcUrls: ['https://bsc-dataseed.binance.org'],\n blockExplorerUrls: ['https://bscscan.com'],\n },\n \n 97: {\n id: 97,\n name: 'BNB Smart Chain Testnet',\n chainType: ChainType.EVM,\n symbol: 'BNB',\n nativeCurrency: {\n name: 'BNB',\n symbol: 'BNB',\n decimals: 18,\n },\n rpcUrls: [\n 'https://data-seed-prebsc-2-s1.binance.org:8545',\n 'https://data-seed-prebsc-1-s2.binance.org:8545',\n 'https://data-seed-prebsc-2-s2.binance.org:8545',\n 'https://data-seed-prebsc-1-s3.binance.org:8545',\n 'https://data-seed-prebsc-2-s3.binance.org:8545',\n 'https://data-seed-prebsc-1-s1.binance.org:8545' // Original main node as last fallback\n ],\n blockExplorerUrls: ['https://testnet.bscscan.com'],\n },\n \n // Polygon\n 137: {\n id: 137,\n slip44: 966, // Polygon SLIP-44\n name: 'Polygon Mainnet',\n chainType: ChainType.EVM,\n symbol: 'MATIC',\n nativeCurrency: {\n name: 'MATIC',\n symbol: 'MATIC',\n decimals: 18,\n },\n rpcUrls: ['https://polygon-rpc.com'],\n blockExplorerUrls: ['https://polygonscan.com'],\n },\n \n 80002: {\n id: 80002,\n name: 'Polygon Amoy Testnet',\n chainType: ChainType.EVM,\n symbol: 'MATIC',\n nativeCurrency: {\n name: 'MATIC',\n symbol: 'MATIC',\n decimals: 18,\n },\n rpcUrls: ['https://rpc-amoy.polygon.technology'],\n blockExplorerUrls: ['https://www.oklink.com/amoy'],\n },\n \n // Tron\n 195: {\n id: 195,\n slip44: 195, // Tron SLIP-44\n name: 'Tron Mainnet',\n chainType: ChainType.TRON,\n symbol: 'TRX',\n nativeCurrency: {\n name: 'TRX',\n symbol: 'TRX',\n decimals: 6,\n },\n rpcUrls: ['https://api.trongrid.io'],\n blockExplorerUrls: ['https://tronscan.org'],\n },\n \n // Arbitrum\n 42161: {\n id: 42161,\n slip44: 1042161, // Custom SLIP-44 (1000000 + 42161)\n name: 'Arbitrum One',\n chainType: ChainType.EVM,\n symbol: 'ETH',\n nativeCurrency: {\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n rpcUrls: ['https://arb1.arbitrum.io/rpc'],\n blockExplorerUrls: ['https://arbiscan.io'],\n },\n \n // Optimism\n 10: {\n id: 10,\n slip44: 1000010, // Custom SLIP-44 (1000000 + 10)\n name: 'Optimism',\n chainType: ChainType.EVM,\n symbol: 'ETH',\n nativeCurrency: {\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n rpcUrls: ['https://mainnet.optimism.io'],\n blockExplorerUrls: ['https://optimistic.etherscan.io'],\n },\n \n // Avalanche\n 43114: {\n id: 43114,\n slip44: 9000, // Avalanche SLIP-44\n name: 'Avalanche C-Chain',\n chainType: ChainType.EVM,\n symbol: 'AVAX',\n nativeCurrency: {\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 18,\n },\n rpcUrls: ['https://api.avax.network/ext/bc/C/rpc'],\n blockExplorerUrls: ['https://snowtrace.io'],\n },\n}\n\n/**\n * Get chain information\n */\nexport function getChainInfo(chainId: number): ChainInfo | undefined {\n return CHAIN_INFO[chainId]\n}\n\n/**\n * Get chain type\n */\nexport function getChainType(chainId: number): ChainType | undefined {\n return CHAIN_INFO[chainId]?.chainType\n}\n\n/**\n * Check if chain is EVM\n */\nexport function isEVMChain(chainId: number): boolean {\n return getChainType(chainId) === ChainType.EVM\n}\n\n/**\n * Check if chain is Tron\n */\nexport function isTronChain(chainId: number): boolean {\n return getChainType(chainId) === ChainType.TRON\n}\n\n/**\n * Get SLIP-44 ID from native chain ID\n */\nexport function getSlip44(chainId: number): number | null {\n // Check local config first\n const localInfo = CHAIN_INFO[chainId]\n if (localInfo?.slip44) {\n return localInfo.slip44\n }\n \n // Fall back to chain-utils\n return nativeToSlip44(chainId)\n}\n\n/**\n * Get native chain ID from SLIP-44 ID\n */\nexport function getNativeChainId(slip44: number): number | string | null {\n return slip44ToNative(slip44)\n}\n\n/**\n * Get all supported chains (combines local and chain-utils data)\n */\nexport function getAllChains(): ChainInfo[] {\n return Object.values(CHAIN_INFO)\n}\n\n","/**\n * TronWeb 兼容钱包适配器\n * 支持所有提供 TronWeb 接口的钱包,包括但不限于:\n * - TronLink\n * - TokenPocket\n * - 其他 TronWeb 兼容的钱包\n */\n\nimport { BrowserWalletAdapter } from '../base/browser-wallet-adapter'\nimport {\n WalletType,\n ChainType,\n WalletState,\n Account,\n ContractReadParams,\n ContractWriteParams,\n TransactionReceipt,\n} from '../../core/types'\nimport { createUniversalAddress } from '../../utils/address/universal-address'\nimport { ConnectionRejectedError, SignatureRejectedError, TransactionFailedError } from '../../core/errors'\n\n/**\n * TronWeb 兼容钱包适配器\n * 支持所有提供 window.tronWeb 或 window.tronLink.tronWeb 接口的钱包\n */\nexport class TronLinkAdapter extends BrowserWalletAdapter {\n readonly type = WalletType.TRONLINK\n readonly chainType = ChainType.TRON\n readonly name = 'TronWeb'\n readonly icon = 'https://www.tronlink.org/static/logoIcon.svg'\n\n // Tron 主网链 ID\n private static readonly TRON_MAINNET_CHAIN_ID = 195\n\n /**\n * 连接钱包\n */\n async connect(chainId?: number | number[]): Promise<Account> {\n await this.ensureAvailable()\n \n // For TronLink, use first chain ID if array is provided\n const targetChainId = Array.isArray(chainId) ? chainId[0] : chainId\n\n try {\n this.setState(WalletState.CONNECTING)\n\n const w = window as any\n const tronWeb = this.getTronWeb()\n\n // 等待 TronWeb 就绪(如果支持 ready 属性)\n if (tronWeb.ready) {\n await tronWeb.ready\n }\n\n // 先检查是否已经有地址(已授权),避免不必要的连接请求\n let address = tronWeb.defaultAddress?.base58\n \n // 如果还没有地址,尝试从 hex 地址转换(某些钱包可能只提供 hex)\n if (!address && tronWeb.defaultAddress?.hex && tronWeb.address && typeof tronWeb.address.fromHex === 'function') {\n try {\n address = tronWeb.address.fromHex(tronWeb.defaultAddress.hex)\n } catch (e) {\n // 转换失败,继续尝试其他方式\n }\n }\n\n // 如果仍然没有地址,等待一小段时间让钱包初始化\n if (!address) {\n // 某些钱包需要时间初始化,等待最多 2 秒\n for (let i = 0; i < 20; i++) {\n await new Promise(resolve => setTimeout(resolve, 100))\n address = tronWeb.defaultAddress?.base58\n if (address) break\n }\n }\n\n // 只有在没有地址时才请求连接\n if (!address) {\n // 优先使用 TronLink 特定的 request API(如果存在)\n if (w.tronLink && typeof w.tronLink.request === 'function') {\n try {\n const result = await w.tronLink.request({\n method: 'tron_requestAccounts',\n })\n\n if (!result || result.code !== 200) {\n throw new ConnectionRejectedError(this.type)\n }\n } catch (error: any) {\n // 如果用户拒绝连接\n if (error.code === 4001 || error.message?.includes('User rejected') || error.message?.includes('rejected')) {\n throw new ConnectionRejectedError(this.type)\n }\n // 其他错误继续,尝试直接获取地址\n }\n }\n\n // 请求连接后,再次尝试获取地址\n address = tronWeb.defaultAddress?.base58\n \n // 如果还没有地址,尝试从 hex 地址转换\n if (!address && tronWeb.defaultAddress?.hex && tronWeb.address && typeof tronWeb.address.fromHex === 'function') {\n try {\n address = tronWeb.address.fromHex(tronWeb.defaultAddress.hex)\n } catch (e) {\n // 转换失败\n }\n }\n\n // 如果仍然没有地址,等待一小段时间让钱包初始化\n if (!address) {\n for (let i = 0; i < 20; i++) {\n await new Promise(resolve => setTimeout(resolve, 100))\n address = tronWeb.defaultAddress?.base58\n if (address) break\n }\n }\n }\n\n if (!address) {\n throw new Error('Failed to get Tron address. Please make sure your wallet is unlocked and try again.')\n }\n\n // Tron 主网的链 ID (use targetChainId which is already extracted from chainId)\n const tronChainId = targetChainId || TronLinkAdapter.TRON_MAINNET_CHAIN_ID\n\n // 创建账户信息\n const account: Account = {\n universalAddress: createUniversalAddress(tronChainId, address),\n nativeAddress: address,\n chainId: tronChainId,\n chainType: ChainType.TRON,\n isActive: true,\n }\n\n this.setState(WalletState.CONNECTED)\n this.setAccount(account)\n this.setupEventListeners()\n\n return account\n } catch (error: any) {\n this.setState(WalletState.ERROR)\n this.setAccount(null)\n\n if (error.code === 4001 || error.message?.includes('User rejected')) {\n throw new ConnectionRejectedError(this.type)\n }\n\n throw error\n }\n }\n\n /**\n * 签名消息\n * \n * Note: TronWeb 兼容钱包支持两种签名方法:\n * - trx.sign(): 签名交易对象\n * - trx.signMessageV2(): 签名纯文本消息(我们使用此方法)\n */\n async signMessage(message: string): Promise<string> {\n this.ensureConnected()\n\n try {\n const tronWeb = this.getTronWeb()\n\n // Use signMessageV2 for plain text message signing (not transaction signing)\n // This is equivalent to personal_sign in EVM\n if (typeof tronWeb.trx.signMessageV2 === 'function') {\n // signMessageV2 returns a hex signature\n const signature = await tronWeb.trx.signMessageV2(message)\n return signature\n } else {\n // Fallback to older method if signMessageV2 not available\n // Note: This might not work correctly for message signing\n console.warn('[TronLink] signMessageV2 not available, falling back to sign()')\n const signature = await tronWeb.trx.sign(message)\n return signature\n }\n } catch (error: any) {\n if (error.message?.includes('User rejected') || error.message?.includes('Confirmation declined')) {\n throw new SignatureRejectedError()\n }\n \n // Better error message for invalid input\n if (error.message?.includes('Invalid transaction')) {\n throw new Error('Invalid message format. For transaction signing, use signTransaction() instead.')\n }\n \n throw error\n }\n }\n\n /**\n * 签名交易\n * \n * Note: This uses trx.sign() which is specifically for signing transaction objects.\n * For plain text message signing, use signMessage() instead.\n */\n async signTransaction(transaction: any): Promise<string> {\n this.ensureConnected()\n\n try {\n const tronWeb = this.getTronWeb()\n\n // TronLink's trx.sign() expects a transaction object\n // The transaction should be properly formatted with fields like:\n // - txID, raw_data, raw_data_hex, etc.\n const signature = await tronWeb.trx.sign(transaction)\n\n return signature\n } catch (error: any) {\n if (error.message?.includes('User rejected') || error.message?.includes('Confirmation declined')) {\n throw new SignatureRejectedError('Transaction signature was rejected by user')\n }\n \n // Better error message for invalid input\n if (error.message?.includes('Invalid transaction')) {\n throw new Error('Invalid transaction format. Please provide a properly formatted Tron transaction object.')\n }\n \n throw error\n }\n }\n\n /**\n * 读取合约\n * 参考 webserver 的实现,使用 TronWeb 合约实例的标准 call() 方法\n */\n async readContract<T = any>(params: ContractReadParams): Promise<T> {\n this.ensureConnected()\n\n try {\n const tronWeb = this.getTronWeb()\n \n if (!this.currentAccount) {\n throw new Error('No account connected')\n }\n \n // 方法1: 使用 TronWeb 标准方法(参考 webserver 的实现)\n try {\n // 创建合约实例(使用 ABI)\n const contract = await tronWeb.contract(params.abi, params.address)\n \n // 获取方法\n const method = contract[params.functionName]\n if (!method || typeof method !== 'function') {\n throw new Error(`Function ${params.functionName} not found in contract ABI`)\n }\n \n // 直接调用 call() 方法(不需要传入地址参数)\n // 这是 TronWeb 的标准只读调用方式\n const result = await method(...(params.args || [])).call()\n \n return result as T\n } catch (method1Error: any) {\n // 如果方法1失败,尝试方法2:不使用 ABI,直接使用合约地址\n console.warn('⚠️ [方法1] TronWeb标准方法失败,尝试方法2:', method1Error.message)\n \n try {\n // 方法2: 不使用 ABI,直接使用合约地址(某些钱包可能不支持 ABI)\n const contract2 = await (tronWeb as any).contract().at(params.address)\n const method2 = contract2[params.functionName]\n \n if (!method2 || typeof method2 !== 'function') {\n throw new Error(`Function ${params.functionName} not found in contract`)\n }\n \n const result = await method2(...(params.args || [])).call()\n return result as T\n } catch (method2Error: any) {\n console.error('⚠️ [方法2] 也失败:', method2Error.message)\n // 如果两种方法都失败,抛出原始错误\n throw method1Error\n }\n }\n } catch (error: any) {\n console.error('Read contract error:', error)\n throw new Error(`Failed to read contract: ${error.message || 'Unknown error'}`)\n }\n }\n\n /**\n * 写入合约\n */\n async writeContract(params: ContractWriteParams): Promise<string> {\n this.ensureConnected()\n\n try {\n const tronWeb = this.getTronWeb()\n \n console.log('[TronLink] writeContract params:', {\n address: params.address,\n functionName: params.functionName,\n args: params.args,\n value: params.value,\n gas: params.gas,\n })\n \n // 验证参数\n if (!params.args || params.args.length === 0) {\n throw new Error('Contract function arguments are required')\n }\n \n // 检查参数是否包含 undefined\n const hasUndefined = params.args.some(arg => arg === undefined || arg === null)\n if (hasUndefined) {\n console.error('[TronLink] Invalid args detected:', params.args)\n throw new Error(`Invalid contract arguments: some arguments are undefined or null`)\n }\n \n // 使用 TronWeb 的 transactionBuilder.triggerSmartContract API\n // 这是更底层、更可靠的 API\n \n // 构建函数签名\n const functionAbi = params.abi.find((item: any) => \n item.name === params.functionName && item.type === 'function'\n )\n \n if (!functionAbi) {\n throw new Error(`Function ${params.functionName} not found in ABI`)\n }\n \n console.log('[TronLink] Function ABI:', functionAbi)\n console.log('[TronLink] Calling with args:', params.args)\n \n // 准备交易参数\n const options = {\n feeLimit: params.gas || 100_000_000, // 默认 100 TRX 的能量限制\n callValue: params.value || 0, // 发送的 TRX 数量(单位:SUN)\n }\n \n // 构建参数数组\n const parameter = functionAbi.inputs.map((input: any, index: number) => ({\n type: input.type,\n value: params.args![index]\n }))\n \n console.log('[TronLink] Transaction options:', options)\n console.log('[TronLink] Parameters:', parameter)\n \n // 构建函数选择器(参考 webserver 的实现)\n const functionSelector = params.functionName + '(' + functionAbi.inputs.map((i: any) => i.type).join(',') + ')'\n \n console.log('[TronLink] Function selector:', functionSelector)\n console.log('[TronLink] Transaction options:', options)\n console.log('[TronLink] Parameters:', parameter)\n \n // 使用 triggerSmartContract 触发合约(参考 webserver 的实现)\n const tx = await tronWeb.transactionBuilder.triggerSmartContract(\n params.address,\n functionSelector,\n options,\n parameter,\n this.currentAccount!.nativeAddress\n )\n \n console.log('[TronLink] Transaction built:', tx)\n \n // 验证交易构建结果\n if (!tx || !tx.transaction) {\n throw new Error('Failed to build transaction')\n }\n \n // 请求用户签名(参考 webserver 的实现)\n console.log('[TronLink] Requesting user signature...')\n const signedTx = await tronWeb.trx.sign(tx.transaction)\n console.log('[TronLink] Transaction signed:', signedTx)\n \n // ✅ 从签名的交易中提取 txID(这是最可靠的方式,参考 webserver)\n const txID = signedTx.txID\n console.log('[TronLink] Transaction hash (txID):', txID)\n \n // 广播交易(参考 webserver 的实现)\n console.log('[TronLink] Broadcasting transaction...')\n const broadcast = await tronWeb.trx.sendRawTransaction(signedTx)\n console.log('[TronLink] Broadcast result:', broadcast)\n \n // 验证广播结果\n if (broadcast && broadcast.result === true) {\n // 广播成功,返回交易哈希\n return txID || broadcast.txid || ''\n } else {\n // 广播失败,但如果有 txID,仍然返回(交易可能已经上链)\n if (txID) {\n console.warn('[TronLink] Broadcast returned false but txID exists:', txID)\n return txID\n }\n throw new Error(broadcast?.message || 'Transaction broadcast failed')\n }\n } catch (error: any) {\n console.error('Write contract error:', error)\n \n if (error.message?.includes('User rejected') || error.message?.includes('Confirmation declined')) {\n throw new SignatureRejectedError('Transaction was rejected by user')\n }\n \n throw new Error(`Failed to write contract: ${error.message}`)\n }\n }\n\n /**\n * 等待交易确认\n */\n async waitForTransaction(txHash: string, _confirmations: number = 1): Promise<TransactionReceipt> {\n try {\n const tronWeb = this.getTronWeb()\n \n // 等待交易确认\n let attempts = 0\n const maxAttempts = 60 // 最多等待 60 秒\n \n while (attempts < maxAttempts) {\n try {\n const txInfo = await tronWeb.trx.getTransactionInfo(txHash)\n \n if (txInfo && txInfo.id) {\n // 交易已确认\n const receipt: TransactionReceipt = {\n transactionHash: txHash,\n blockNumber: txInfo.blockNumber || 0,\n blockHash: txInfo.blockHash || '',\n from: this.currentAccount!.nativeAddress,\n to: txInfo.contract_address || '',\n status: txInfo.receipt?.result === 'SUCCESS' ? 'success' : 'failed',\n gasUsed: (txInfo.receipt?.energy_usage_total || 0).toString(),\n logs: txInfo.log || [],\n }\n \n if (receipt.status === 'failed') {\n throw new TransactionFailedError(txHash, 'Transaction failed on Tron network')\n }\n \n return receipt\n }\n } catch (error) {\n // 交易可能还未确认,继续等待\n }\n \n await new Promise(resolve => setTimeout(resolve, 1000))\n attempts++\n }\n \n throw new Error('Transaction confirmation timeout')\n } catch (error: any) {\n throw new Error(`Failed to wait for transaction: ${error.message}`)\n }\n }\n\n /**\n * 获取 Provider\n */\n getProvider(): any {\n return this.getTronWeb()\n }\n\n /**\n * 获取浏览器中的 TronWeb 实例\n * 支持所有 TronWeb 兼容的钱包,包括:\n * - TronLink (window.tronLink.tronWeb 或 window.tronWeb)\n * - TokenPocket (window.tronWeb)\n * - 其他提供 window.tronWeb 接口的钱包\n */\n protected getBrowserProvider(): any | undefined {\n if (typeof window === 'undefined') {\n return undefined\n }\n const w = window as any\n // 优先使用 window.tronWeb(所有 TronWeb 兼容钱包都提供)\n // 如果没有,则尝试 window.tronLink.tronWeb(TronLink 特定)\n return w.tronWeb || w.tronLink?.tronWeb\n }\n\n /**\n * 获取 TronWeb 实例\n */\n private getTronWeb(): any {\n const provider = this.getBrowserProvider()\n if (!provider) {\n throw new Error('未检测到 TronWeb 兼容的钱包。请安装 TronLink 或其他 TronWeb 兼容的钱包。')\n }\n return provider\n }\n\n /**\n * 获取下载链接\n */\n protected getDownloadUrl(): string {\n return 'https://www.tronlink.org/'\n }\n\n /**\n * 设置事件监听\n */\n protected setupEventListeners(): void {\n // TronWeb 兼容钱包事件监听\n if (typeof window === 'undefined') return\n\n const w = window as any\n \n // TronWeb 兼容钱包的事件监听方式可能因钱包而异\n // TronLink 使用 tronLink.on,其他钱包可能使用不同的方式\n try {\n if (w.tronLink && typeof w.tronLink.on === 'function') {\n // TronLink 特定的事件监听\n w.tronLink.on('accountsChanged', this.handleAccountsChanged)\n w.tronLink.on('disconnect', this.handleDisconnect)\n } else if (w.tronWeb && w.tronWeb.eventServer) {\n // 其他 TronWeb 兼容钱包可能使用 eventServer\n // 备用方案:使用轮询检测账户变化\n this.startPolling()\n } else {\n // 如果没有事件监听支持,使用轮询\n this.startPolling()\n }\n } catch (error) {\n console.warn('TronWeb 钱包事件监听设置失败,使用轮询方式:', error)\n // 降级到轮询\n this.startPolling()\n }\n }\n\n /**\n * 移除事件监听\n */\n protected removeEventListeners(): void {\n if (typeof window === 'undefined') return\n\n const w = window as any\n\n try {\n if (w.tronLink && typeof w.tronLink.off === 'function') {\n // TronLink 特定的事件移除\n w.tronLink.off('accountsChanged', this.handleAccountsChanged)\n w.tronLink.off('disconnect', this.handleDisconnect)\n }\n } catch (error) {\n console.warn('TronWeb 钱包事件监听移除失败:', error)\n }\n\n this.stopPolling()\n }\n\n /**\n * 轮询检测账户变化(备用方案)\n */\n private pollingInterval: NodeJS.Timeout | null = null\n private lastKnownAddress: string | null = null\n\n private startPolling(): void {\n if (this.pollingInterval) return\n\n this.lastKnownAddress = this.currentAccount?.nativeAddress || null\n\n this.pollingInterval = setInterval(async () => {\n try {\n const tronWeb = this.getTronWeb()\n const currentAddress = tronWeb.defaultAddress?.base58\n\n if (currentAddress && currentAddress !== this.lastKnownAddress) {\n this.lastKnownAddress = currentAddress\n this.handleAccountsChanged({ address: { base58: currentAddress } })\n } else if (!currentAddress && this.lastKnownAddress) {\n this.lastKnownAddress = null\n this.handleAccountsChanged(null)\n }\n } catch (error) {\n // 忽略轮询错误\n }\n }, 2000) // 每 2 秒检查一次\n }\n\n private stopPolling(): void {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval)\n this.pollingInterval = null\n }\n }\n\n /**\n * 处理账户变化\n */\n private handleAccountsChanged = (data: any) => {\n if (!data || !data.address) {\n // 用户断开连接\n this.setState(WalletState.DISCONNECTED)\n this.setAccount(null)\n this.emitAccountChanged(null)\n } else {\n // 用户切换账户\n const address = data.address.base58 || data.address\n const account: Account = {\n universalAddress: createUniversalAddress(this.currentAccount!.chainId, address),\n nativeAddress: address,\n chainId: this.currentAccount!.chainId,\n chainType: ChainType.TRON,\n isActive: true,\n }\n this.setAccount(account)\n this.emitAccountChanged(account)\n }\n }\n\n /**\n * 处理断开连接\n */\n private handleDisconnect = () => {\n this.setState(WalletState.DISCONNECTED)\n this.setAccount(null)\n this.emitDisconnected()\n }\n}\n\n","/**\n * EVM 私钥适配器\n * 用于开发和测试,不推荐在生产环境中使用\n */\n\nimport { createWalletClient, createPublicClient, http, type WalletClient, type PublicClient } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { WalletAdapter } from '../base/wallet-adapter'\nimport {\n WalletType,\n ChainType,\n WalletState,\n Account,\n ContractReadParams,\n ContractWriteParams,\n TransactionReceipt,\n} from '../../core/types'\nimport { createUniversalAddress } from '../../utils/address/universal-address'\nimport { formatEVMAddress } from '../../utils/address/evm-utils'\nimport { TransactionFailedError } from '../../core/errors'\nimport { getChainInfo } from '../../utils/chain-info'\n\n/**\n * EVM 私钥适配器\n */\nexport class EVMPrivateKeyAdapter extends WalletAdapter {\n readonly type = WalletType.PRIVATE_KEY\n readonly chainType = ChainType.EVM\n readonly name = 'Private Key (EVM)'\n\n private privateKey: string | null = null\n private walletClient: WalletClient | null = null\n private publicClient: PublicClient | null = null\n\n /**\n * 连接(导入私钥)\n */\n async connect(chainId?: number | number[]): Promise<Account> {\n if (!this.privateKey) {\n throw new Error('Private key not set. Call setPrivateKey() first.')\n }\n\n try {\n this.setState(WalletState.CONNECTING)\n\n // 从私钥创建账户\n const account = privateKeyToAccount(this.privateKey as `0x${string}`)\n\n // For private key adapter, use first chain ID if array is provided\n const targetChainId = Array.isArray(chainId) ? chainId[0] : (chainId || 1)\n\n // 创建客户端\n this.walletClient = createWalletClient({\n account,\n chain: this.getViemChain(targetChainId),\n transport: http(),\n })\n\n this.publicClient = createPublicClient({\n chain: this.getViemChain(targetChainId) as any,\n transport: http(),\n }) as any\n\n // 创建账户信息\n const address = formatEVMAddress(account.address)\n const accountInfo: Account = {\n universalAddress: createUniversalAddress(targetChainId, address),\n nativeAddress: address,\n chainId: targetChainId,\n chainType: ChainType.EVM,\n isActive: true,\n }\n\n this.setState(WalletState.CONNECTED)\n this.setAccount(accountInfo)\n\n return accountInfo\n } catch (error) {\n this.setState(WalletState.ERROR)\n this.setAccount(null)\n throw error\n }\n }\n\n /**\n * 断开连接\n */\n async disconnect(): Promise<void> {\n this.privateKey = null\n this.walletClient = null\n this.publicClient = null\n this.setState(WalletState.DISCONNECTED)\n this.setAccount(null)\n this.emitDisconnected()\n }\n\n /**\n * 检查是否可用(私钥钱包总是可用)\n */\n async isAvailable(): Promise<boolean> {\n return true\n }\n\n /**\n * 设置私钥\n */\n setPrivateKey(privateKey: string): void {\n // 确保私钥有 0x 前缀\n this.privateKey = privateKey.startsWith('0x') ? privateKey : `0x${privateKey}`\n }\n\n /**\n * 签名消息\n */\n async signMessage(message: string): Promise<string> {\n this.ensureConnected()\n\n if (!this.walletClient || !this.walletClient.account) {\n throw new Error('Wallet client not initialized')\n }\n\n const signature = await this.walletClient.signMessage({\n message,\n account: this.walletClient.account,\n })\n\n return signature\n }\n\n /**\n * 签名 TypedData\n */\n async signTypedData(typedData: any): Promise<string> {\n this.ensureConnected()\n\n if (!this.walletClient || !this.walletClient.account) {\n throw new Error('Wallet client not initialized')\n }\n\n const signature = await this.walletClient.signTypedData({\n ...typedData,\n account: this.walletClient.account,\n })\n\n return signature\n }\n\n /**\n * 切换链\n */\n async switchChain(chainId: number): Promise<void> {\n this.ensureConnected()\n\n // 重新创建客户端\n const account = this.walletClient!.account!\n\n this.walletClient = createWalletClient({\n account,\n chain: this.getViemChain(chainId),\n transport: http(),\n })\n\n this.publicClient = createPublicClient({\n chain: this.getViemChain(chainId) as any,\n transport: http(),\n }) as any\n\n // 更新账户信息\n const updatedAccount: Account = {\n ...this.currentAccount!,\n chainId,\n universalAddress: createUniversalAddress(chainId, this.currentAccount!.nativeAddress),\n }\n this.setAccount(updatedAccount)\n this.emitChainChanged(chainId)\n }\n\n /**\n * 读取合约\n */\n async readContract<T = any>(params: ContractReadParams): Promise<T> {\n if (!this.publicClient) {\n throw new Error('Public client not initialized')\n }\n\n const result = await this.publicClient.readContract({\n address: params.address as `0x${string}`,\n abi: params.abi,\n functionName: params.functionName,\n ...(params.args ? { args: params.args as readonly any[] } : {}),\n } as any)\n\n return result as T\n }\n\n /**\n * 写入合约\n */\n async writeContract(params: ContractWriteParams): Promise<string> {\n this.ensureConnected()\n\n if (!this.walletClient) {\n throw new Error('Wallet client not initialized')\n }\n\n const txHash = await this.walletClient.writeContract({\n address: params.address as `0x${string}`,\n abi: params.abi,\n functionName: params.functionName,\n ...(params.args ? { args: params.args as readonly any[] } : {}),\n value: params.value ? BigInt(params.value) : undefined,\n gas: params.gas ? BigInt(params.gas) : undefined,\n gasPrice: params.gasPrice ? BigInt(params.gasPrice) : undefined,\n } as any)\n\n return txHash\n }\n\n /**\n * 估算 gas\n */\n async estimateGas(params: ContractWriteParams): Promise<bigint> {\n if (!this.publicClient || !this.currentAccount) {\n throw new Error('Client not initialized')\n }\n\n const gas = await this.publicClient.estimateContractGas({\n address: params.address as `0x${string}`,\n abi: params.abi,\n functionName: params.functionName,\n ...(params.args ? { args: params.args as readonly any[] } : {}),\n value: params.value ? BigInt(params.value) : undefined,\n account: this.currentAccount.nativeAddress as `0x${string}`,\n } as any)\n\n return gas\n }\n\n /**\n * 等待交易确认\n */\n async waitForTransaction(txHash: string, confirmations: number = 1): Promise<TransactionReceipt> {\n if (!this.publicClient) {\n throw new Error('Public client not initialized')\n }\n\n const receipt = await this.publicClient.waitForTransactionReceipt({\n hash: txHash as `0x${string}`,\n confirmations,\n })\n\n if (receipt.status === 'reverted') {\n throw new TransactionFailedError(txHash, 'Transaction reverted')\n }\n\n return {\n transactionHash: receipt.transactionHash,\n blockNumber: Number(receipt.blockNumber),\n blockHash: receipt.blockHash,\n from: receipt.from,\n to: receipt.to || undefined,\n status: receipt.status === 'success' ? 'success' : 'failed',\n gasUsed: receipt.gasUsed.toString(),\n effectiveGasPrice: receipt.effectiveGasPrice?.toString(),\n logs: receipt.logs,\n }\n }\n\n /**\n * 获取 Provider\n */\n getProvider(): any {\n return this.publicClient\n }\n\n /**\n * 获取 Signer\n */\n getSigner(): WalletClient | null {\n return this.walletClient\n }\n\n /**\n * 获取 viem chain 配置\n */\n private getViemChain(chainId: number): any {\n const chainInfo = getChainInfo(chainId)\n if (chainInfo) {\n return {\n id: chainId,\n name: chainInfo.name,\n network: chainInfo.name.toLowerCase().replace(/\\s+/g, '-'),\n nativeCurrency: chainInfo.nativeCurrency,\n rpcUrls: {\n default: { http: chainInfo.rpcUrls },\n public: { http: chainInfo.rpcUrls },\n },\n blockExplorers: chainInfo.blockExplorerUrls ? {\n default: { name: 'Explorer', url: chainInfo.blockExplorerUrls[0] },\n } : undefined,\n }\n }\n\n return {\n id: chainId,\n name: `Chain ${chainId}`,\n network: `chain-${chainId}`,\n nativeCurrency: {\n name: 'ETH',\n symbol: 'ETH',\n decimals: 18,\n },\n rpcUrls: {\n default: { http: [] },\n public: { http: [] },\n },\n }\n }\n}\n\n","/**\n * WalletConnect Adapter\n */\n\nimport EthereumProvider from '@walletconnect/ethereum-provider'\nimport { createWalletClient, createPublicClient, custom, http, type WalletClient, type PublicClient } from 'viem'\nimport { WalletAdapter } from '../base/wallet-adapter'\nimport {\n WalletType,\n ChainType,\n WalletState,\n Account,\n AddChainParams,\n ContractReadParams,\n ContractWriteParams,\n TransactionReceipt,\n} from '../../core/types'\nimport { createUniversalAddress } from '../../utils/address/universal-address'\nimport { formatEVMAddress } from '../../utils/address/evm-utils'\nimport { \n ConnectionRejectedError, \n SignatureRejectedError, \n TransactionFailedError,\n ConfigurationError,\n} from '../../core/errors'\nimport { getChainInfo } from '../../utils/chain-info'\n\n/**\n * WalletConnect Adapter\n */\nexport class WalletConnectAdapter extends WalletAdapter {\n readonly type = WalletType.WALLETCONNECT\n readonly chainType = ChainType.EVM\n readonly name = 'WalletConnect'\n readonly icon = 'https://avatars.githubusercontent.com/u/37784886'\n\n private provider: InstanceType<typeof EthereumProvider> | null = null\n private walletClient: WalletClient | null = null\n private publicClient: PublicClient | null = null\n private projectId: string\n private supportedChains: number[] = [] // Store supported chains from connection\n\n // Static provider instance to avoid multiple initializations\n private static providerInstance: InstanceType<typeof EthereumProvider> | null = null\n private static providerProjectId: string | null = null\n private static providerChains: number[] | null = null // Store the chains used during initialization\n private static isInitializing: boolean = false\n private static initPromise: Promise<InstanceType<typeof EthereumProvider>> | null = null\n\n constructor(projectId: string) {\n super()\n if (!projectId) {\n throw new ConfigurationError('WalletConnect projectId is required')\n }\n this.projectId = projectId\n }\n\n /**\n * Check if WalletConnect is available\n * WalletConnect is always available (it's a web-based connection)\n * Also works in Telegram Mini Apps\n */\n async isAvailable(): Promise<boolean> {\n return typeof window !== 'undefined'\n }\n\n /**\n * Check if running in Telegram environment (Mini App or Web)\n * Both Telegram Mini App (in client) and Telegram Web (web.telegram.org) \n * provide window.Telegram.WebApp API, so they are treated the same way.\n * \n * Reference: https://docs.reown.com/appkit/integrations/telegram-mini-apps\n */\n private isTelegramMiniApp(): boolean {\n if (typeof window === 'undefined') return false\n \n // Check for Telegram WebApp API\n // This works in both:\n // - Telegram Mini App (in Telegram client: iOS, Android, Desktop)\n // - Telegram Web (web.telegram.org)\n // @ts-ignore\n const tg = window.Telegram?.WebApp\n if (!tg) return false\n \n // Log platform info for debugging\n // @ts-ignore\n const platform = tg.platform || 'unknown'\n console.log('[WalletConnect] Telegram environment detected:', {\n platform: platform,\n version: tg.version,\n isMiniApp: platform !== 'web', // Mini App if not web platform\n isWeb: platform === 'web', // Telegram Web if web platform\n })\n \n return true\n }\n\n /**\n * Get Telegram WebApp instance if available\n */\n private getTelegramWebApp(): any {\n if (typeof window === 'undefined') return null\n // @ts-ignore\n return window.Telegram?.WebApp || null\n }\n\n /**\n * Close Telegram deep link popup (wc:// links)\n * In Telegram Mini Apps, WalletConnect may open a wc:// deep link popup\n * that doesn't automatically close after the operation completes.\n * This method attempts to close it by:\n * 1. Trying to close any open windows/popups\n * 2. Using Telegram WebApp API if available\n * 3. Navigating back or closing the popup\n */\n private closeTelegramDeepLinkPopup(): void {\n if (!this.isTelegramMiniApp()) {\n return\n }\n\n try {\n const tg = this.getTelegramWebApp()\n if (!tg) {\n return\n }\n\n // Method 1: Try to close any open windows (popups opened by WalletConnect)\n // Check if there are any child windows or popups\n if (typeof window !== 'undefined') {\n // Try to close any popup windows that might have been opened\n // Note: We can't directly access popup windows due to CORS, but we can try to focus back\n window.focus()\n \n // Method 2: Use Telegram WebApp's back button or close functionality\n // If there's a back button visible, it might indicate a popup is open\n if (tg.BackButton && tg.BackButton.isVisible) {\n // Simulate back button click to close the popup\n console.log('[WalletConnect] Closing Telegram deep link popup via BackButton')\n // Note: We can't programmatically click the back button, but we can hide it\n // The popup should close automatically when the operation completes\n }\n\n // Method 3: Wait a bit and then try to close any wc:// protocol handlers\n // Some wallets may leave the popup open, so we try to close it after a delay\n setTimeout(() => {\n // Try to detect if a popup is still open by checking window focus\n if (document.hasFocus()) {\n // Main window has focus, popup might have closed\n console.log('[WalletConnect] Main window has focus, popup likely closed')\n } else {\n // Try to bring focus back to main window\n window.focus()\n console.log('[WalletConnect] Attempted to focus main window to close popup')\n }\n }, 500) // Wait 500ms for the wallet to process the response\n\n // Method 4: Listen for visibility change (popup closing)\n const handleVisibilityChange = () => {\n if (document.visibilityState === 'visible') {\n console.log('[WalletConnect] Page became visible, popup may have closed')\n // Clean up listener\n document.removeEventListener('visibilitychange', handleVisibilityChange)\n }\n }\n document.addEventListener('visibilitychange', handleVisibilityChange)\n \n // Clean up listener after 2 seconds\n setTimeout(() => {\n document.removeEventListener('visibilitychange', handleVisibilityChange)\n }, 2000)\n }\n } catch (error) {\n console.warn('[WalletConnect] Error closing Telegram deep link popup:', error)\n }\n }\n\n /**\n * Connect wallet\n * \n * @param chainId - Single chain ID or array of chain IDs to request\n * If array is provided, wallet will be requested to connect to multiple chains\n * When multiple chains are requested, the wallet can switch between them\n * Default: 1 (Ethereum Mainnet)\n * \n * @example\n * // Single chain\n * await adapter.connect(1) // Ethereum only\n * \n * @example\n * // Multiple chains\n * await adapter.connect([1, 56, 137]) // Ethereum, BSC, Polygon\n */\n async connect(chainId?: number | number[]): Promise<Account> {\n if (typeof window === 'undefined') {\n throw new Error('WalletConnect requires a browser environment')\n }\n\n // First, check if we have a static provider instance that's already connected\n // This handles cases where state was lost (e.g., page refresh) but provider still has session\n if (WalletConnectAdapter.providerInstance && \n WalletConnectAdapter.providerProjectId === this.projectId) {\n const existingProvider = WalletConnectAdapter.providerInstance\n if (existingProvider.accounts && existingProvider.accounts.length > 0) {\n // Provider has active session, reuse it\n this.provider = existingProvider\n \n // Support both single chain ID and array of chain IDs\n let targetChains: number[]\n if (Array.isArray(chainId)) {\n targetChains = chainId.length > 0 ? chainId : [1]\n } else if (chainId) {\n targetChains = [chainId]\n } else {\n targetChains = [1] // Default to Ethereum Mainnet\n }\n\n // Update supported chains if new chains are requested\n const existingChains = this.supportedChains || []\n const mergedChains = [...new Set([...existingChains, ...targetChains])]\n this.supportedChains = mergedChains\n\n // Get current chain ID\n const currentChainId = existingProvider.chainId || targetChains[0]\n const address = formatEVMAddress(existingProvider.accounts[0])\n \n // Create account info\n const account: Account = {\n universalAddress: createUniversalAddress(currentChainId, address),\n nativeAddress: address,\n chainId: currentChainId,\n chainType: ChainType.EVM,\n isActive: true,\n }\n\n this.setState(WalletState.CONNECTED)\n this.setAccount(account)\n \n // Setup event listeners if not already set up\n if (!this.walletClient) {\n const viemChain = this.getViemChain(currentChainId) as any\n this.walletClient = createWalletClient({\n account: existingProvider.accounts[0] as `0x${string}`,\n chain: viemChain,\n transport: custom(existingProvider),\n })\n \n const chainInfo = getChainInfo(currentChainId)\n const primaryRpcUrl = chainInfo?.rpcUrls[0]\n this.publicClient = createPublicClient({\n chain: viemChain,\n transport: primaryRpcUrl ? http(primaryRpcUrl) : custom(existingProvider),\n }) as any\n \n this.setupEventListeners()\n }\n\n console.log('[WalletConnect] Reusing existing provider session')\n return account\n }\n }\n\n // Check if already connected - reuse existing connection\n if (this.state === WalletState.CONNECTED && this.currentAccount && this.provider) {\n // Check if provider still has active session\n if (this.provider.accounts && this.provider.accounts.length > 0) {\n // If already connected, check if we need to update supported chains\n // Support both single chain ID and array of chain IDs\n let targetChains: number[]\n if (Array.isArray(chainId)) {\n targetChains = chainId.length > 0 ? chainId : [1]\n } else if (chainId) {\n targetChains = [chainId]\n } else {\n targetChains = [1] // Default to Ethereum Mainnet\n }\n\n // Update supported chains if new chains are requested\n // Merge with existing chains to avoid losing previously connected chains\n const existingChains = this.supportedChains || []\n const mergedChains = [...new Set([...existingChains, ...targetChains])]\n this.supportedChains = mergedChains\n\n // Return existing account\n console.log('[WalletConnect] Already connected, reusing existing connection')\n return this.currentAccount\n } else {\n // Provider exists but no accounts, reset state\n this.setState(WalletState.DISCONNECTED)\n this.setAccount(null)\n this.provider = null\n }\n }\n\n try {\n this.setState(WalletState.CONNECTING)\n\n // Support both single chain ID and array of chain IDs\n let targetChains: number[]\n if (Array.isArray(chainId)) {\n targetChains = chainId.length > 0 ? chainId : [1]\n } else if (chainId) {\n targetChains = [chainId]\n } else {\n targetChains = [1] // Default to Ethereum Mainnet\n }\n\n // Store supported chains for later use\n this.supportedChains = targetChains\n\n // Initialize WalletConnect provider with multiple chains\n // EthereumProvider v2 requires:\n // - chains: primary chain (required, at least one)\n // - optionalChains: additional chains (required, at least one)\n const primaryChain = targetChains[0]\n const optionalChains = targetChains.slice(1)\n\n // Build init options\n // For Telegram Mini Apps, we may need to adjust the modal behavior\n const isTelegram = this.isTelegramMiniApp()\n const telegramWebApp = this.getTelegramWebApp()\n \n // Get valid URL for metadata\n // In Telegram Mini App, window.location.origin might be invalid or empty\n let appUrl = ''\n if (typeof window !== 'undefined') {\n try {\n // Try to get origin from window.location\n if (window.location && window.location.origin) {\n appUrl = window.location.origin\n } else if (window.location && window.location.href) {\n // Fallback: extract origin from href\n const url = new URL(window.location.href)\n appUrl = url.origin\n }\n } catch (error) {\n console.warn('[WalletConnect] Failed to get origin from window.location:', error)\n }\n \n // If still empty, use default URL\n if (!appUrl) {\n appUrl = 'https://enclave.network' // Default fallback URL\n }\n } else {\n appUrl = 'https://enclave.network' // Server-side fallback\n }\n\n // Ensure URL is valid (must be https:// or http://)\n if (!appUrl || (!appUrl.startsWith('http://') && !appUrl.startsWith('https://'))) {\n appUrl = 'https://enclave.network'\n }\n\n // Valid icons array (must be valid URLs)\n const icons = [\n 'https://walletconnect.com/walletconnect-logo.svg',\n 'https://avatars.githubusercontent.com/u/37784886', // WalletConnect GitHub avatar\n ]\n \n const initOptions: any = {\n projectId: this.projectId,\n chains: [primaryChain], // Primary chain (required)\n showQrModal: true, // QR modal works in Telegram Mini Apps\n metadata: {\n name: 'Enclave Wallet SDK',\n description: 'Multi-chain wallet adapter for Enclave',\n url: appUrl,\n icons: icons,\n },\n }\n\n // Telegram environment specific configuration (Mini App or Web)\n // Both Telegram Mini App and Telegram Web provide the same WebApp API\n // Reference: https://docs.reown.com/appkit/integrations/telegram-mini-apps\n if (isTelegram && telegramWebApp) {\n // @ts-ignore\n const platform = telegramWebApp.platform || 'unknown'\n const isMiniApp = platform !== 'web'\n console.log('[WalletConnect] Detected Telegram environment:', {\n platform: platform,\n isMiniApp: isMiniApp,\n isWeb: platform === 'web',\n })\n \n // Telegram WebApp can expand to full screen for better QR code display\n // This works in both Mini App and Telegram Web\n if (telegramWebApp.isExpanded === false) {\n telegramWebApp.expand()\n }\n }\n\n // Add optionalChains if there are additional chains\n if (optionalChains.length > 0) {\n initOptions.optionalChains = optionalChains\n } else {\n // If only one chain, still need to provide optionalChains (can be empty or same as chains)\n // Some versions require optionalChains to be present\n initOptions.optionalChains = [primaryChain]\n }\n\n // Check if provider is already initialized\n const hasExistingProvider = WalletConnectAdapter.providerInstance && \n WalletConnectAdapter.providerProjectId === this.projectId\n \n // Check if we need to reinitialize due to different chains\n const needsReinit = hasExistingProvider && \n WalletConnectAdapter.providerChains !== null &&\n JSON.stringify(WalletConnectAdapter.providerChains.sort()) !== JSON.stringify(targetChains.sort())\n \n if (needsReinit) {\n // Provider exists but with different chains, need to disconnect and reinitialize\n console.log('[WalletConnect] Provider initialized with different chains, reinitializing...', {\n existing: WalletConnectAdapter.providerChains,\n requested: targetChains,\n })\n \n const existingProvider = WalletConnectAdapter.providerInstance\n if (existingProvider) {\n try {\n // Disconnect existing provider\n if (existingProvider.accounts && existingProvider.accounts.length > 0) {\n await existingProvider.disconnect()\n }\n } catch (error) {\n console.warn('[WalletConnect] Error disconnecting existing provider:', error)\n }\n }\n \n // Clear static instance to allow reinitialization\n WalletConnectAdapter.providerInstance = null\n WalletConnectAdapter.providerChains = null\n }\n \n // Use singleton pattern to avoid multiple initializations\n if (WalletConnectAdapter.providerInstance && \n WalletConnectAdapter.providerProjectId === this.projectId) {\n // Reuse existing provider instance\n this.provider = WalletConnectAdapter.providerInstance\n console.log('[WalletConnect] Reusing existing provider instance')\n \n // IMPORTANT: Check if provider already has accounts BEFORE calling enable()\n // If it does, we're already connected and should skip enable()\n if (this.provider.accounts && this.provider.accounts.length > 0) {\n console.log('[WalletConnect] Provider already has accounts, skipping enable()')\n // Skip to account retrieval - don't call enable()\n } else {\n // Provider exists but no accounts, need to enable\n // Check if there's a session that might interfere\n const hasSession = this.provider.session !== undefined && this.provider.session !== null\n console.log('[WalletConnect] Provider has no accounts, calling enable() to show QR modal')\n console.log('[WalletConnect] Provider state:', {\n accounts: this.provider.accounts,\n chainId: this.provider.chainId,\n hasSession,\n sessionTopic: this.provider.session?.topic,\n })\n \n // If there's a session but no accounts, it might be a stale session\n // Disconnect it first to ensure clean state\n if (hasSession && (!this.provider.accounts || this.provider.accounts.length === 0)) {\n console.log('[WalletConnect] Found stale session, disconnecting before reconnecting...')\n try {\n await this.provider.disconnect()\n // Wait a bit for disconnect to complete\n await new Promise(resolve => setTimeout(resolve, 100))\n } catch (disconnectError) {\n console.warn('[WalletConnect] Error disconnecting stale session:', disconnectError)\n // Continue anyway\n }\n }\n \n try {\n // enable() returns a promise that resolves when connection is established\n // But accounts might not be immediately available, so we'll wait for them\n console.log('[WalletConnect] Calling enable()...')\n const enableResult = await this.provider.enable()\n console.log('[WalletConnect] enable() completed, result:', enableResult)\n console.log('[WalletConnect] Provider state after enable():', {\n accounts: this.provider.accounts,\n chainId: this.provider.chainId,\n session: this.provider.session ? {\n topic: (this.provider.session as any).topic,\n namespaces: (this.provider.session as any).namespaces ? Object.keys((this.provider.session as any).namespaces) : 'none',\n } : 'none',\n })\n } catch (error: any) {\n console.error('[WalletConnect] enable() error:', error)\n // Check if this is a real user rejection or a state issue\n if (error.code === 4001 || error.message?.includes('rejected') || error.message?.includes('User rejected')) {\n throw new ConnectionRejectedError(this.type)\n }\n throw error\n }\n }\n } else if (WalletConnectAdapter.providerInstance && \n WalletConnectAdapter.providerProjectId === this.projectId) {\n // Provider exists but not connected, reuse it\n this.provider = WalletConnectAdapter.providerInstance\n console.log('[WalletConnect] Reusing existing provider instance (not connected)')\n \n // Check if provider already has accounts\n if (this.provider.accounts && this.provider.accounts.length > 0) {\n console.log('[WalletConnect] Provider already has accounts after init, skipping enable()')\n } else {\n const hasSession = this.provider.session !== undefined && this.provider.session !== null\n console.log('[WalletConnect] Provider has no accounts, calling enable() to show QR modal')\n console.log('[WalletConnect] Provider state:', {\n accounts: this.provider.accounts,\n chainId: this.provider.chainId,\n hasSession,\n sessionTopic: this.provider.session?.topic,\n })\n \n if (hasSession && (!this.provider.accounts || this.provider.accounts.length === 0)) {\n console.log('[WalletConnect] Found stale session after init, disconnecting before reconnecting...')\n try {\n await this.provider.disconnect()\n await new Promise(resolve => setTimeout(resolve, 100))\n } catch (disconnectError) {\n console.warn('[WalletConnect] Error disconnecting stale session:', disconnectError)\n }\n }\n \n try {\n await this.provider.enable()\n } catch (error: any) {\n console.error('[WalletConnect] enable() error:', error)\n if (error.code === 4001 || error.message?.includes('rejected') || error.message?.includes('User rejected')) {\n throw new ConnectionRejectedError(this.type)\n }\n throw error\n }\n }\n } else if (WalletConnectAdapter.isInitializing && WalletConnectAdapter.initPromise) {\n // Wait for ongoing initialization\n console.log('[WalletConnect] Waiting for ongoing initialization...')\n this.provider = await WalletConnectAdapter.initPromise\n WalletConnectAdapter.providerInstance = this.provider\n WalletConnectAdapter.providerProjectId = this.projectId\n WalletConnectAdapter.providerChains = targetChains // Store the chains used\n \n // Check if provider already has accounts after initialization\n if (this.provider.accounts && this.provider.accounts.length > 0) {\n console.log('[WalletConnect] Provider already has accounts after init, skipping enable()')\n } else {\n try {\n await this.provider.enable()\n } catch (error: any) {\n if (error.code === 4001 || error.message?.includes('rejected') || error.message?.includes('User rejected')) {\n throw new ConnectionRejectedError(this.type)\n }\n throw error\n }\n }\n } else {\n // Initialize new provider with requested chains\n console.log('[WalletConnect] Initializing new provider with chains:', {\n primary: primaryChain,\n optional: optionalChains,\n all: targetChains,\n })\n \n WalletConnectAdapter.isInitializing = true\n WalletConnectAdapter.initPromise = EthereumProvider.init(initOptions)\n \n try {\n this.provider = await WalletConnectAdapter.initPromise\n WalletConnectAdapter.providerInstance = this.provider\n WalletConnectAdapter.providerProjectId = this.projectId\n WalletConnectAdapter.providerChains = targetChains // Store the chains used\n \n // Check if provider already has accounts (session restored from storage)\n if (this.provider.accounts && this.provider.accounts.length > 0) {\n console.log('[WalletConnect] Provider has restored session, skipping enable()')\n } else {\n // Not connected yet, enable provider (this will show QR code modal)\n const hasSession = this.provider.session !== undefined && this.provider.session !== null\n console.log('[WalletConnect] New provider initialized, calling enable() to show QR modal')\n console.log('[WalletConnect] Provider state:', {\n accounts: this.provider.accounts,\n chainId: this.provider.chainId,\n hasSession,\n sessionTopic: this.provider.session?.topic,\n })\n \n // If there's a session but no accounts, it might be a stale session\n if (hasSession && (!this.provider.accounts || this.provider.accounts.length === 0)) {\n console.log('[WalletConnect] Found stale session after init, disconnecting before reconnecting...')\n try {\n await this.provider.disconnect()\n await new Promise(resolve => setTimeout(resolve, 100))\n } catch (disconnectError) {\n console.warn('[WalletConnect] Error disconnecting stale session:', disconnectError)\n }\n }\n \n try {\n await this.provider.enable()\n } catch (error: any) {\n console.error('[WalletConnect] enable() error:', error)\n if (error.code === 4001 || error.message?.includes('rejected') || error.message?.includes('User rejected')) {\n throw new ConnectionRejectedError(this.type)\n }\n throw error\n }\n }\n } finally {\n WalletConnectAdapter.isInitializing = false\n WalletConnectAdapter.initPromise = null\n }\n }\n\n // Get accounts - WalletConnect v2 stores accounts in session.namespaces.eip155.accounts\n // Format: CAIP-10 \"eip155:chainId:address\" (e.g., \"eip155:1:0xab16a96d359ec26a11e2c2b3d8f8b8942d5bfcdb\")\n // Reference: https://specs.walletconnect.com/2.0/specs/clients/sign/namespaces\n let accounts = this.provider.accounts\n \n // If provider.accounts is empty, extract from session.namespaces.eip155.accounts\n if (!accounts || accounts.length === 0) {\n console.log('[WalletConnect] provider.accounts is empty, checking session.namespaces.eip155.accounts...')\n \n const session = this.provider.session as any\n if (session && session.namespaces?.eip155?.accounts) {\n // Extract addresses from CAIP-10 format: \"eip155:chainId:address\"\n const sessionAccounts = session.namespaces.eip155.accounts.map((acc: string) => {\n // CAIP-10 format: \"eip155:chainId:address\"\n const parts = acc.split(':')\n if (parts.length >= 3 && parts[0] === 'eip155') {\n return parts[2] // Extract address (third part)\n }\n return null\n }).filter((addr: string | null) => addr !== null && addr.startsWith('0x')) as string[]\n \n if (sessionAccounts.length > 0) {\n // Remove duplicates\n const uniqueAccounts = [...new Set(sessionAccounts)]\n console.log('[WalletConnect] Found accounts in session.namespaces.eip155.accounts:', {\n raw: session.namespaces.eip155.accounts,\n extracted: uniqueAccounts,\n chains: session.namespaces.eip155.chains,\n })\n accounts = uniqueAccounts\n }\n }\n }\n \n // If still no accounts, wait a bit for provider.accounts to be populated\n if (!accounts || accounts.length === 0) {\n console.log('[WalletConnect] Accounts not available, waiting for provider.accounts to populate...')\n \n const maxWaitTime = 3000 // 3 seconds\n const checkInterval = 100 // Check every 100ms\n const maxChecks = maxWaitTime / checkInterval\n \n for (let i = 0; i < maxChecks; i++) {\n await new Promise(resolve => setTimeout(resolve, checkInterval))\n accounts = this.provider.accounts\n \n if (accounts && accounts.length > 0) {\n console.log(`[WalletConnect] Accounts available after ${(i + 1) * checkInterval}ms`)\n break\n }\n }\n }\n \n if (!accounts || accounts.length === 0) {\n // Get detailed provider state for debugging\n const session = this.provider.session as any\n const providerState = {\n providerAccounts: this.provider.accounts,\n providerChainId: this.provider.chainId,\n session: session ? {\n exists: true,\n topic: session.topic,\n namespaces: session.namespaces ? Object.keys(session.namespaces) : 'none',\n eip155Namespace: session.namespaces?.eip155 ? {\n accounts: session.namespaces.eip155.accounts, // CAIP-10 format\n chains: session.namespaces.eip155.chains, // CAIP-2 format\n methods: session.namespaces.eip155.methods,\n events: session.namespaces.eip155.events,\n } : 'none',\n // Log full session structure for debugging\n fullSession: JSON.stringify(session, null, 2),\n } : 'none',\n // Check if provider has any other properties that might contain accounts\n providerKeys: Object.keys(this.provider),\n }\n \n console.error('[WalletConnect] No accounts available after enable() and wait', providerState)\n console.error('[WalletConnect] Full provider object:', this.provider)\n console.error('[WalletConnect] Full session object:', session)\n console.error('[WalletConnect] Session namespaces structure:', session?.namespaces)\n \n // Don't throw ConnectionRejectedError - this is a technical issue, not user rejection\n throw new Error('WalletConnect connection established but no accounts available. Please check session.namespaces.eip155.accounts in the console logs above.')\n }\n\n // Get current chain ID (use first chain as default if multiple chains requested)\n const currentChainId = this.provider.chainId || targetChains[0]\n\n // Create viem chain config\n const viemChain = this.getViemChain(currentChainId) as any\n\n // Create wallet client\n this.walletClient = createWalletClient({\n account: accounts[0] as `0x${string}`,\n chain: viemChain,\n transport: custom(this.provider),\n })\n\n // Create public client (use configured RPC for reads)\n const chainInfo = getChainInfo(currentChainId)\n const primaryRpcUrl = chainInfo?.rpcUrls[0]\n \n this.publicClient = createPublicClient({\n chain: viemChain,\n transport: primaryRpcUrl ? http(primaryRpcUrl) : custom(this.provider),\n }) as any\n\n // Create account info\n const address = formatEVMAddress(accounts[0])\n const account: Account = {\n universalAddress: createUniversalAddress(currentChainId, address),\n nativeAddress: address,\n chainId: currentChainId,\n chainType: ChainType.EVM,\n isActive: true,\n }\n\n this.setState(WalletState.CONNECTED)\n this.setAccount(account)\n this.setupEventListeners()\n\n return account\n } catch (error: any) {\n this.setState(WalletState.ERROR)\n this.setAccount(null)\n\n // WalletConnect relay reject: origin not allowlisted for this projectId\n const origin = (typeof window !== 'undefined' && window.location) ? window.location.origin : ''\n const errorCode = error?.code\n const errorMessage = error?.message || String(error)\n const isOriginNotAllowed =\n errorCode === 3000 ||\n /origin not allowed/i.test(errorMessage) ||\n /Unauthorized:\\s*origin not allowed/i.test(errorMessage)\n\n // Log the actual error for debugging\n const session = this.provider?.session as any\n const providerState = this.provider ? {\n accounts: this.provider.accounts,\n chainId: this.provider.chainId,\n session: session ? {\n exists: true,\n topic: session.topic,\n namespaces: session.namespaces ? Object.keys(session.namespaces) : 'none',\n eip155Namespace: session.namespaces?.eip155 ? {\n accounts: session.namespaces.eip155.accounts,\n chains: session.namespaces.eip155.chains,\n methods: session.namespaces.eip155.methods,\n events: session.namespaces.eip155.events,\n } : 'none',\n } : 'none',\n providerKeys: Object.keys(this.provider),\n } : 'no provider'\n \n console.error('[WalletConnect] Connection error:', {\n error,\n code: error.code,\n message: error.message,\n stack: error.stack,\n providerState,\n })\n \n // Also log full provider and session for detailed debugging\n if (this.provider) {\n console.error('[WalletConnect] Full provider object:', this.provider)\n console.error('[WalletConnect] Full session object:', session)\n }\n\n // Only treat as user rejection if it's explicitly a rejection error\n // Don't treat other errors (like \"no accounts\") as user rejection\n if (error.code === 4001 || \n (error.message && (\n error.message.includes('User rejected') || \n error.message.includes('rejected by user') ||\n error.message.includes('User cancelled')\n ))) {\n throw new ConnectionRejectedError(this.type)\n }\n\n if (isOriginNotAllowed) {\n throw new ConfigurationError(\n `WalletConnect relayer rejected this origin (code 3000: Unauthorized: origin not allowed).\\n\\n` +\n `Fix:\\n` +\n `1) Open WalletConnect Cloud → your project (${this.projectId})\\n` +\n `2) Add this site origin to the allowlist:\\n` +\n ` - ${origin || '(unknown origin)'}\\n\\n` +\n `Common dev origins to allow:\\n` +\n `- http://localhost:5173\\n` +\n `- http://192.168.0.221:5173 (your LAN dev URL)\\n` +\n `- https://wallet-test.enclave-hq.com (your Cloudflare Tunnel/custom domain)\\n\\n` +\n `Original error: ${errorMessage}`\n )\n }\n\n // For other errors, re-throw with original error message\n throw error\n }\n }\n\n /**\n * Disconnect wallet\n */\n async disconnect(): Promise<void> {\n if (this.provider) {\n try {\n await this.provider.disconnect()\n } catch (error) {\n // Ignore disconnect errors\n console.warn('[WalletConnect] Error during disconnect:', error)\n }\n \n // Clear static instance if it matches this adapter's provider\n if (WalletConnectAdapter.providerInstance === this.provider) {\n WalletConnectAdapter.providerInstance = null\n WalletConnectAdapter.providerProjectId = null\n WalletConnectAdapter.providerChains = null\n }\n \n this.provider = null\n }\n\n this.removeEventListeners()\n this.walletClient = null\n this.publicClient = null\n this.setState(WalletState.DISCONNECTED)\n this.setAccount(null)\n this.emitDisconnected()\n }\n\n /**\n * Sign message\n */\n async signMessage(message: string): Promise<string> {\n this.ensureConnected()\n\n try {\n if (!this.provider) {\n throw new Error('Provider not initialized')\n }\n\n const signature = await this.provider.request({\n method: 'personal_sign',\n params: [message, this.currentAccount!.nativeAddress],\n })\n\n // In Telegram Mini App, close any wc:// deep link popups after signing\n this.closeTelegramDeepLinkPopup()\n\n return signature as string\n } catch (error: any) {\n if (error.code === 4001 || error.message?.includes('rejected')) {\n throw new SignatureRejectedError()\n }\n throw error\n }\n }\n\n /**\n * Sign TypedData (EIP-712)\n */\n async signTypedData(typedData: any): Promise<string> {\n this.ensureConnected()\n\n try {\n if (!this.provider) {\n throw new Error('Provider not initialized')\n }\n\n const signature = await this.provider.request({\n method: 'eth_signTypedData_v4',\n params: [this.currentAccount!.nativeAddress, JSON.stringify(typedData)],\n })\n\n // In Telegram Mini App, close any wc:// deep link popups after signing\n this.closeTelegramDeepLinkPopup()\n\n return signature as string\n } catch (error: any) {\n if (error.code === 4001 || error.message?.includes('rejected')) {\n throw new SignatureRejectedError()\n }\n throw error\n }\n }\n\n /**\n * Sign transaction\n */\n async signTransaction(transaction: any): Promise<string> {\n this.ensureConnected()\n\n try {\n if (!this.provider) {\n throw new Error('Provider not initialized')\n }\n\n const tx = {\n from: this.currentAccount!.nativeAddress,\n to: transaction.to,\n value: transaction.value ? `0x${BigInt(transaction.value).toString(16)}` : undefined,\n data: transaction.data || '0x',\n gas: transaction.gas ? `0x${BigInt(transaction.gas).toString(16)}` : undefined,\n gasPrice: transaction.gasPrice && transaction.gasPrice !== 'auto' \n ? `0x${BigInt(transaction.gasPrice).toString(16)}` : undefined,\n maxFeePerGas: transaction.maxFeePerGas \n ? `0x${BigInt(transaction.maxFeePerGas).toString(16)}` : undefined,\n maxPriorityFeePerGas: transaction.maxPriorityFeePerGas \n ? `0x${BigInt(transaction.maxPriorityFeePerGas).toString(16)}` : undefined,\n nonce: transaction.nonce !== undefined \n ? `0x${transaction.nonce.toString(16)}` : undefined,\n chainId: transaction.chainId || this.currentAccount!.chainId,\n }\n\n const signature = await this.provider.request({\n method: 'eth_signTransaction',\n params: [tx],\n })\n\n // In Telegram Mini App, close any wc:// deep link popups after signing\n this.closeTelegramDeepLinkPopup()\n\n return signature as string\n } catch (error: any) {\n if (error.code === 4001 || error.message?.includes('rejected')) {\n throw new SignatureRejectedError('Transaction signature was rejected by user')\n }\n throw error\n }\n }\n\n /**\n * Get supported chains from current connection\n * Returns the chains that were requested during connection\n */\n getSupportedChains(): number[] {\n return [...this.supportedChains]\n }\n\n /**\n * Switch chain\n * \n * Note: WalletConnect v2 with mobile wallets may not support chain switching reliably.\n * Some wallets may ignore the switch request or fail silently.\n * It's recommended to include all needed chains in the initial connection.\n * \n * Reference: https://specs.walletconnect.com/2.0/specs/clients/sign/namespaces\n */\n async switchChain(chainId: number): Promise<void> {\n if (!this.provider) {\n throw new Error('Provider not initialized')\n }\n\n // Check if chain is in the supported chains list\n const session = this.provider.session as any\n const supportedChains = session?.namespaces?.eip155?.chains || []\n const targetChainCAIP = `eip155:${chainId}`\n \n // Check if chain is in the session's approved chains\n const isChainApproved = supportedChains.includes(targetChainCAIP)\n \n if (!isChainApproved) {\n console.warn(`[WalletConnect] Chain ${chainId} (${targetChainCAIP}) not in session approved chains:`, supportedChains)\n console.warn('[WalletConnect] Chain switching may fail. Consider including all chains in initial connection.')\n }\n\n try {\n console.log(`[WalletConnect] Attempting to switch to chain ${chainId} (${targetChainCAIP})`)\n \n const result = await this.provider.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: `0x${chainId.toString(16)}` }],\n })\n\n // Success returns null\n if (result !== null && result !== undefined) {\n console.warn('[WalletConnect] wallet_switchEthereumChain returned non-null result:', result)\n }\n\n // Verify the switch actually happened by checking provider.chainId\n // Note: Some wallets may not update this immediately\n await new Promise(resolve => setTimeout(resolve, 500)) // Wait a bit for chain to update\n \n const currentChainId = this.provider.chainId\n if (currentChainId !== chainId) {\n console.warn(`[WalletConnect] Chain switch may have failed. Expected ${chainId}, got ${currentChainId}`)\n console.warn('[WalletConnect] Some mobile wallets may not support chain switching via WalletConnect.')\n console.warn('[WalletConnect] User may need to manually switch chains in the wallet app.')\n // Don't throw error - some wallets may not support switching but still allow transactions\n }\n\n // Update account info\n if (this.currentAccount) {\n const updatedAccount: Account = {\n ...this.currentAccount,\n chainId,\n universalAddress: createUniversalAddress(chainId, this.currentAccount.nativeAddress),\n }\n this.setAccount(updatedAccount)\n this.emitChainChanged(chainId)\n\n // Update viem clients\n const viemChain = this.getViemChain(chainId) as any\n const chainInfo = getChainInfo(chainId)\n const primaryRpcUrl = chainInfo?.rpcUrls[0]\n\n this.walletClient = createWalletClient({\n account: this.currentAccount.nativeAddress as `0x${string}`,\n chain: viemChain,\n transport: custom(this.provider),\n })\n\n this.publicClient = createPublicClient({\n chain: viemChain,\n transport: primaryRpcUrl ? http(primaryRpcUrl) : custom(this.provider),\n }) as any\n }\n } catch (error: any) {\n console.error('[WalletConnect] Chain switch error:', {\n chainId,\n errorCode: error.code,\n errorMessage: error.message,\n supportedChains,\n })\n\n // Chain doesn't exist (error code 4902), try to add it\n if (error.code === 4902) {\n console.log(`[WalletConnect] Chain ${chainId} not found in wallet, attempting to add...`)\n const chainInfo = getChainInfo(chainId)\n if (chainInfo) {\n try {\n await this.addChain({\n chainId: chainInfo.id,\n chainName: chainInfo.name,\n nativeCurrency: chainInfo.nativeCurrency,\n rpcUrls: chainInfo.rpcUrls,\n blockExplorerUrls: chainInfo.blockExplorerUrls,\n })\n // Try switching again after adding\n console.log(`[WalletConnect] Chain added, attempting to switch again...`)\n await this.switchChain(chainId)\n } catch (addError: any) {\n console.error('[WalletConnect] Failed to add chain:', addError)\n throw new Error(`Failed to add chain ${chainId}: ${addError.message}`)\n }\n } else {\n throw new Error(`Chain ${chainId} not supported`)\n }\n } else if (error.code === 4001) {\n // User rejected\n throw new Error('User rejected chain switch')\n } else if (error.code === 4100) {\n // Unsupported method\n throw new Error('Wallet does not support wallet_switchEthereumChain. Please switch chains manually in your wallet app.')\n } else {\n // Other errors - may indicate wallet doesn't support switching\n console.warn('[WalletConnect] Chain switch may not be supported by this wallet. User may need to switch manually.')\n throw error\n }\n }\n }\n\n /**\n * Add chain\n */\n async addChain(chainConfig: AddChainParams): Promise<void> {\n if (!this.provider) {\n throw new Error('Provider not initialized')\n }\n\n await this.provider.request({\n method: 'wallet_addEthereumChain',\n params: [{\n chainId: `0x${chainConfig.chainId.toString(16)}`,\n chainName: chainConfig.chainName,\n nativeCurrency: chainConfig.nativeCurrency,\n rpcUrls: chainConfig.rpcUrls,\n blockExplorerUrls: chainConfig.blockExplorerUrls,\n }],\n })\n }\n\n /**\n * Read contract\n */\n async readContract<T = any>(params: ContractReadParams): Promise<T> {\n if (!this.publicClient) {\n throw new Error('Public client not initialized')\n }\n\n const result = await this.publicClient.readContract({\n address: params.address as `0x${string}`,\n abi: params.abi,\n functionName: params.functionName,\n ...(params.args ? { args: params.args as readonly any[] } : {}),\n } as any)\n\n return result as T\n }\n\n /**\n * Write contract\n */\n async writeContract(params: ContractWriteParams): Promise<string> {\n this.ensureConnected()\n\n if (!this.walletClient) {\n throw new Error('Wallet client not initialized')\n }\n\n try {\n // Build transaction options\n const txOptions: any = {\n address: params.address as `0x${string}`,\n abi: params.abi,\n functionName: params.functionName,\n ...(params.args ? { args: params.args as readonly any[] } : {}),\n value: params.value ? BigInt(params.value) : undefined,\n gas: params.gas ? BigInt(params.gas) : undefined,\n }\n\n // Handle gas pricing (EIP-1559 or legacy)\n if (params.maxFeePerGas || params.maxPriorityFeePerGas) {\n if (params.maxFeePerGas) {\n txOptions.maxFeePerGas = BigInt(params.maxFeePerGas)\n }\n if (params.maxPriorityFeePerGas) {\n txOptions.maxPriorityFeePerGas = BigInt(params.maxPriorityFeePerGas)\n }\n } else if (params.gasPrice && params.gasPrice !== 'auto') {\n txOptions.gasPrice = BigInt(params.gasPrice)\n } else {\n // Auto-estimate gas fees\n if (this.publicClient) {\n try {\n const feesPerGas = await this.publicClient.estimateFeesPerGas().catch(() => null)\n if (feesPerGas) {\n const minPriorityFeeWei = BigInt(100_000_000) // 0.1 Gwei\n const maxPriorityFeePerGas = feesPerGas.maxPriorityFeePerGas > minPriorityFeeWei \n ? feesPerGas.maxPriorityFeePerGas \n : minPriorityFeeWei\n \n const adjustedMaxFeePerGas = feesPerGas.maxFeePerGas > maxPriorityFeePerGas\n ? feesPerGas.maxFeePerGas\n : maxPriorityFeePerGas + BigInt(1_000_000_000)\n \n txOptions.maxFeePerGas = adjustedMaxFeePerGas\n txOptions.maxPriorityFeePerGas = maxPriorityFeePerGas\n } else {\n const gasPrice = await this.publicClient.getGasPrice()\n txOptions.gasPrice = gasPrice\n }\n } catch (err) {\n // Let viem auto-estimate\n }\n }\n }\n\n const txHash = await this.walletClient.writeContract(txOptions as any)\n \n // In Telegram Mini App, close any wc:// deep link popups after transaction\n this.closeTelegramDeepLinkPopup()\n \n return txHash\n } catch (error: any) {\n if (error.code === 4001 || error.message?.includes('rejected')) {\n throw new SignatureRejectedError('Transaction was rejected by user')\n }\n throw error\n }\n }\n\n /**\n * Estimate gas\n */\n async estimateGas(params: ContractWriteParams): Promise<bigint> {\n if (!this.publicClient) {\n throw new Error('Public client not initialized')\n }\n\n const gas = await this.publicClient.estimateContractGas({\n address: params.address as `0x${string}`,\n abi: params.abi,\n functionName: params.functionName,\n ...(params.args ? { args: params.args as readonly any[] } : {}),\n value: params.value ? BigInt(params.value) : undefined,\n account: this.currentAccount!.nativeAddress as `0x${string}`,\n } as any)\n\n return gas\n }\n\n /**\n * Wait for transaction\n */\n async waitForTransaction(txHash: string, confirmations: number = 1): Promise<TransactionReceipt> {\n if (!this.publicClient) {\n throw new Error('Public client not initialized')\n }\n\n const receipt = await this.publicClient.waitForTransactionReceipt({\n hash: txHash as `0x${string}`,\n confirmations,\n })\n\n if (receipt.status === 'reverted') {\n throw new TransactionFailedError(txHash, 'Transaction reverted')\n }\n\n return {\n transactionHash: receipt.transactionHash,\n blockNumber: Number(receipt.blockNumber),\n blockHash: receipt.blockHash,\n from: receipt.from,\n to: receipt.to || undefined,\n status: receipt.status === 'success' ? 'success' : 'failed',\n gasUsed: receipt.gasUsed.toString(),\n effectiveGasPrice: receipt.effectiveGasPrice?.toString(),\n logs: receipt.logs,\n }\n }\n\n /**\n * Get provider\n */\n getProvider(): any {\n return this.provider\n }\n\n /**\n * Get signer\n */\n getSigner(): WalletClient | null {\n return this.walletClient\n }\n\n /**\n * Setup event listeners\n */\n protected setupEventListeners(): void {\n if (!this.provider) return\n\n this.provider.on('accountsChanged', this.handleAccountsChanged)\n this.provider.on('chainChanged', this.handleChainChanged)\n this.provider.on('disconnect', this.handleDisconnect)\n }\n\n /**\n * Remove event listeners\n */\n protected removeEventListeners(): void {\n if (!this.provider) return\n\n this.provider.removeListener('accountsChanged', this.handleAccountsChanged)\n this.provider.removeListener('chainChanged', this.handleChainChanged)\n this.provider.removeListener('disconnect', this.handleDisconnect)\n }\n\n /**\n * Handle accounts changed\n */\n private handleAccountsChanged = (accounts: string[]) => {\n if (accounts.length === 0) {\n this.setState(WalletState.DISCONNECTED)\n this.setAccount(null)\n this.emitAccountChanged(null)\n } else {\n const address = formatEVMAddress(accounts[0])\n const account: Account = {\n universalAddress: createUniversalAddress(this.currentAccount!.chainId, address),\n nativeAddress: address,\n chainId: this.currentAccount!.chainId,\n chainType: ChainType.EVM,\n isActive: true,\n }\n this.setAccount(account)\n this.emitAccountChanged(account)\n }\n }\n\n /**\n * Handle chain changed\n */\n private handleChainChanged = (chainIdHex: string) => {\n const chainId = parseInt(chainIdHex, 16)\n \n if (this.currentAccount) {\n const account: Account = {\n ...this.currentAccount,\n chainId,\n universalAddress: createUniversalAddress(chainId, this.currentAccount.nativeAddress),\n }\n this.setAccount(account)\n this.emitChainChanged(chainId)\n\n // Update viem clients\n const viemChain = this.getViemChain(chainId) as any\n const chainInfo = getChainInfo(chainId)\n const primaryRpcUrl = chainInfo?.rpcUrls[0]\n\n if (this.provider) {\n this.walletClient = createWalletClient({\n account: this.currentAccount.nativeAddress as `0x${string}`,\n chain: viemChain,\n transport: custom(this.provider),\n })\n\n this.publicClient = createPublicClient({\n chain: viemChain,\n transport: primaryRpcUrl ? http(primaryRpcUrl) : custom(this.provider),\n }) as any\n }\n }\n }\n\n /**\n * Handle disconnect\n */\n private handleDisconnect = () => {\n this.setState(WalletState.DISCONNECTED)\n this.setAccount(null)\n // Clear static instance if it matches this adapter's provider\n if (WalletConnectAdapter.providerInstance === this.provider) {\n WalletConnectAdapter.providerInstance = null\n WalletConnectAdapter.providerProjectId = null\n }\n \n this.provider = null\n this.walletClient = null\n this.publicClient = null\n this.emitDisconnected()\n }\n\n /**\n * Get viem chain config\n */\n private getViemChain(chainId: number): any {\n const chainInfo = getChainInfo(chainId)\n if (chainInfo) {\n return {\n id: chainId,\n name: chainInfo.name,\n network: chainInfo.name.toLowerCase().replace(/\\s+/g, '-'),\n nativeCurrency: chainInfo.nativeCurrency,\n rpcUrls: {\n default: { http: chainInfo.rpcUrls },\n public: { http: chainInfo.rpcUrls },\n },\n blockExplorers: chainInfo.blockExplorerUrls ? {\n default: { name: 'Explorer', url: chainInfo.blockExplorerUrls[0] },\n } : undefined,\n }\n }\n\n // Default config\n return {\n id: chainId,\n name: `Chain ${chainId}`,\n network: `chain-${chainId}`,\n nativeCurrency: {\n name: 'ETH',\n symbol: 'ETH',\n decimals: 18,\n },\n rpcUrls: {\n default: { http: [] },\n public: { http: [] },\n },\n }\n }\n}\n\n","/**\n * WalletConnect Tron Adapter\n * \n * Uses @tronweb3/walletconnect-tron official package for TRON WalletConnect support\n */\n\nimport { WalletConnectWallet, WalletConnectChainID } from '@tronweb3/walletconnect-tron'\nimport { WalletAdapter } from '../base/wallet-adapter'\nimport {\n WalletType,\n ChainType,\n WalletState,\n Account,\n ContractReadParams,\n ContractWriteParams,\n TransactionReceipt,\n} from '../../core/types'\nimport { createUniversalAddress } from '../../utils/address/universal-address'\nimport { \n ConnectionRejectedError, \n SignatureRejectedError, \n ConfigurationError,\n} from '../../core/errors'\n\n/**\n * WalletConnect Tron Adapter\n * \n * Uses the official @tronweb3/walletconnect-tron package for better compatibility\n */\nexport class WalletConnectTronAdapter extends WalletAdapter {\n readonly type = WalletType.WALLETCONNECT_TRON\n readonly chainType = ChainType.TRON\n readonly name = 'WalletConnect (Tron)'\n readonly icon = 'https://avatars.githubusercontent.com/u/37784886'\n\n private wallet: WalletConnectWallet | null = null\n private projectId: string\n private currentAddress: string | null = null\n\n // Tron 主网链 ID\n private static readonly TRON_MAINNET_CHAIN_ID = 195\n\n // Static wallet instance to avoid multiple initializations\n private static walletInstance: WalletConnectWallet | null = null\n private static walletProjectId: string | null = null\n\n constructor(projectId: string) {\n super()\n if (!projectId) {\n throw new ConfigurationError('WalletConnect projectId is required')\n }\n this.projectId = projectId\n }\n\n /**\n * Check if WalletConnect is available\n */\n async isAvailable(): Promise<boolean> {\n return typeof window !== 'undefined'\n }\n\n /**\n * Check if running in Telegram environment (Mini App or Web)\n * Both Telegram Mini App (in client) and Telegram Web (web.telegram.org) \n * provide window.Telegram.WebApp API, so they are treated the same way.\n */\n private isTelegramMiniApp(): boolean {\n if (typeof window === 'undefined') return false\n // @ts-ignore\n const tg = window.Telegram?.WebApp\n if (!tg) return false\n \n // Log platform info for debugging\n // @ts-ignore\n const platform = tg.platform || 'unknown'\n console.log('[WalletConnect Tron] Telegram environment detected:', {\n platform: platform,\n version: tg.version,\n isMiniApp: platform !== 'web', // Mini App if not web platform\n isWeb: platform === 'web', // Telegram Web if web platform\n })\n \n return true\n }\n\n /**\n * Restore session from existing wallet (for storage restoration)\n */\n async restoreSession(chainId?: number | number[]): Promise<Account | null> {\n if (typeof window === 'undefined') {\n return null\n }\n\n try {\n // For restoreSession, use first chain ID if array is provided\n const targetChainId = Array.isArray(chainId) ? (chainId[0] || WalletConnectTronAdapter.TRON_MAINNET_CHAIN_ID) : (chainId || WalletConnectTronAdapter.TRON_MAINNET_CHAIN_ID)\n\n // Initialize wallet if not already initialized (pass chainId to ensure correct network)\n if (!WalletConnectTronAdapter.walletInstance || \n WalletConnectTronAdapter.walletProjectId !== this.projectId) {\n this.initializeWallet(targetChainId)\n }\n\n this.wallet = WalletConnectTronAdapter.walletInstance\n\n if (!this.wallet) {\n return null\n }\n\n // Check if wallet is already connected\n const status = await this.wallet.checkConnectStatus()\n if (status && status.address) {\n this.currentAddress = status.address\n const account: Account = {\n universalAddress: createUniversalAddress(targetChainId, status.address),\n nativeAddress: status.address,\n chainId: targetChainId,\n chainType: ChainType.TRON,\n isActive: true,\n }\n this.setState(WalletState.CONNECTED)\n this.setAccount(account)\n this.setupEventListeners()\n return account\n }\n\n return null\n } catch (error) {\n console.debug('[WalletConnect Tron] Restore session failed:', error)\n return null\n }\n }\n\n /**\n * Initialize WalletConnect wallet instance\n * @param chainId - Optional chain ID to determine network (default: Mainnet)\n */\n private initializeWallet(chainId?: number): void {\n if (WalletConnectTronAdapter.walletInstance && \n WalletConnectTronAdapter.walletProjectId === this.projectId) {\n return\n }\n\n // Get valid URL for metadata\n // In Telegram Mini App, window.location.origin might be invalid or empty\n // Also support serveo.net and other tunnel services for development\n let appUrl = ''\n if (typeof window !== 'undefined') {\n try {\n // Try to get origin from window.location\n if (window.location && window.location.origin) {\n appUrl = window.location.origin\n } else if (window.location && window.location.href) {\n // Fallback: extract origin from href\n const url = new URL(window.location.href)\n appUrl = url.origin\n }\n } catch (error) {\n console.warn('[WalletConnect Tron] Failed to get origin from window.location:', error)\n }\n \n // Check if current URL is from serveo.net or other tunnel services\n // These URLs should be allowed in WalletConnect Cloud project settings\n if (appUrl && (\n appUrl.includes('serveo.net') ||\n appUrl.includes('loca.lt') ||\n appUrl.includes('ngrok.io') ||\n appUrl.includes('ngrok-free.app') ||\n appUrl.includes('cloudflared.io')\n )) {\n console.log('[WalletConnect Tron] Detected tunnel service URL:', appUrl)\n console.log('[WalletConnect Tron] ⚠️ Make sure this URL is added to WalletConnect Cloud project allowlist')\n }\n \n // If still empty, try to get from Telegram WebApp\n if (!appUrl) {\n // @ts-ignore\n const tg = window.Telegram?.WebApp\n if (tg && tg.initDataUnsafe?.start_param) {\n // Use a default URL if we can't determine the origin\n appUrl = 'https://enclave.network'\n } else {\n appUrl = 'https://enclave.network' // Default fallback URL\n }\n }\n } else {\n appUrl = 'https://enclave.network' // Server-side fallback\n }\n\n // Ensure URL is valid (must be https:// or http://)\n if (!appUrl || (!appUrl.startsWith('http://') && !appUrl.startsWith('https://'))) {\n appUrl = 'https://enclave.network'\n }\n\n // Valid icons array (must be valid URLs)\n const icons = [\n 'https://walletconnect.com/walletconnect-logo.svg',\n 'https://avatars.githubusercontent.com/u/37784886', // WalletConnect GitHub avatar\n ]\n\n // Determine network based on chainId\n // WalletConnectChainID.Mainnet = TRON Mainnet\n // WalletConnectChainID.Shasta = TRON Testnet (Shasta)\n // WalletConnectChainID.Nile = TRON Testnet (Nile)\n let network = WalletConnectChainID.Mainnet // Default to mainnet\n \n if (chainId !== undefined) {\n // TRON Mainnet chain ID is 195\n if (chainId === 195 || chainId === WalletConnectTronAdapter.TRON_MAINNET_CHAIN_ID) {\n network = WalletConnectChainID.Mainnet\n } else if (chainId === 201910292) {\n // TRON Testnet (Shasta)\n network = WalletConnectChainID.Shasta\n } else if (chainId === 2494104990) {\n // TRON Testnet (Nile)\n network = WalletConnectChainID.Nile\n }\n }\n\n // Log detailed metadata configuration for debugging\n const metadataInfo = {\n name: 'Enclave Wallet SDK',\n description: 'Multi-chain wallet adapter for Enclave',\n url: appUrl,\n icons: icons,\n network: network,\n chainId: chainId,\n isTelegram: this.isTelegramMiniApp(),\n projectId: this.projectId,\n urlValid: appUrl && (appUrl.startsWith('http://') || appUrl.startsWith('https://')),\n iconsValid: icons && icons.length > 0 && icons.every(icon => icon && icon.startsWith('http')),\n currentLocation: typeof window !== 'undefined' ? window.location.href : 'N/A',\n telegramPlatform: (typeof window !== 'undefined' && (window as any).Telegram?.WebApp?.platform) || 'N/A',\n }\n \n console.log('[WalletConnect Tron] Initializing with metadata:', metadataInfo)\n \n // Warn if configuration might be invalid\n if (!metadataInfo.urlValid) {\n console.warn('[WalletConnect Tron] ⚠️ Invalid URL in metadata:', appUrl)\n }\n if (!metadataInfo.iconsValid) {\n console.warn('[WalletConnect Tron] ⚠️ Invalid icons in metadata:', icons)\n }\n\n // Create new wallet instance\n // According to official docs: https://developers.tron.network/docs/walletconnect-tron\n //\n // IMPORTANT: If no wallets are registered in WalletConnect Explorer for TRON:\n // - explorerRecommendedWalletIds will have no effect (wallets not in Explorer)\n // - The AppKit will show a QR code for scanning\n // - Users can still connect by scanning the QR code with any WalletConnect-compatible wallet\n // - Deep link (wc://) may work if the wallet app supports it\n //\n // The @tronweb3/walletconnect-tron package uses createAppKit with allWallets: 'HIDE',\n // which means it only shows wallets discovered via WalletConnect Explorer API.\n // If Explorer has no TRON wallets, it will fall back to QR code display.\n //\n // Connection flow:\n // 1. If no wallets in Explorer → Shows QR code\n // 2. User scans QR code with wallet app (TokenPocket, etc.)\n // 3. Wallet app connects via WalletConnect protocol\n // 4. Connection established\n console.log('[WalletConnect Tron] Initializing wallet...', {\n network,\n chainId,\n note: 'If no wallets are in WalletConnect Explorer for TRON, QR code will be displayed for scanning',\n })\n \n WalletConnectTronAdapter.walletInstance = new WalletConnectWallet({\n network: network,\n options: {\n projectId: this.projectId,\n metadata: {\n name: 'Enclave Wallet SDK',\n description: 'Multi-chain wallet adapter for Enclave',\n url: appUrl,\n icons: icons,\n },\n },\n // Theme configuration\n themeMode: 'light',\n themeVariables: {\n '--w3m-z-index': 10000, // Ensure modal appears above Telegram UI\n },\n // Web3Modal configuration for recommended wallets\n // According to official docs: https://developers.tron.network/docs/walletconnect-tron\n // Note: If no wallets are registered in WalletConnect Explorer for TRON,\n // explorerRecommendedWalletIds will have no effect, and QR code will be shown instead.\n // @ts-ignore - web3ModalConfig is supported but may not be in TypeScript types\n web3ModalConfig: {\n themeMode: 'light',\n themeVariables: {\n '--w3m-z-index': 10000,\n },\n /**\n * Recommended Wallets are fetched from WalletConnect explore api:\n * https://walletconnect.com/explorer?type=wallet&version=2\n * \n * IMPORTANT: If wallets are not registered in Explorer for TRON, this list will be ignored.\n * The AppKit will show a QR code instead, which users can scan with any WalletConnect-compatible wallet.\n * \n * Wallet IDs (for reference, may not work if not in Explorer):\n * - TokenPocket: 20459438007b75f4f4acb98bf29aa3b800550309646d375da5fd4aac6c2a2c66\n * - TronLink: 1ae92b26df02f0abca6304df07debccd18262fdf5fe82daa81593582dac9a369\n */\n explorerRecommendedWalletIds: [\n // These IDs are kept for when wallets register in WalletConnect Explorer\n // Currently, if no TRON wallets are in Explorer, QR code will be shown\n '20459438007b75f4f4acb98bf29aa3b800550309646d375da5fd4aac6c2a2c66', // TokenPocket\n '1ae92b26df02f0abca6304df07debccd18262fdf5fe82daa81593582dac9a369', // TronLink\n '4622a2b2d6af1c9844944291e5e7351a6aa24cd7b23099efac1b2fd875da31a0', // TokenPocket (backup)\n ],\n },\n } as any)\n\n WalletConnectTronAdapter.walletProjectId = this.projectId\n }\n\n /**\n * Connect wallet\n */\n async connect(chainId?: number | number[]): Promise<Account> {\n if (typeof window === 'undefined') {\n throw new Error('WalletConnect requires a browser environment')\n }\n\n // Prevent multiple simultaneous connection attempts\n const currentState = this.state\n if (currentState === WalletState.CONNECTING) {\n console.warn('[WalletConnect Tron] Connection already in progress, waiting...')\n let attempts = 0\n while (this.state === WalletState.CONNECTING && attempts < 50) {\n await new Promise(resolve => setTimeout(resolve, 100))\n attempts++\n }\n if (this.state === WalletState.CONNECTED && this.currentAccount) {\n return this.currentAccount\n }\n if (this.state === WalletState.CONNECTING) {\n throw new Error('Connection timeout - previous connection attempt is still pending')\n }\n }\n\n // If already connected, return current account\n if (this.state === WalletState.CONNECTED && this.currentAccount) {\n return this.currentAccount\n }\n\n try {\n this.setState(WalletState.CONNECTING)\n\n // For WalletConnect Tron, use first chain ID if array is provided (single chain only)\n const targetChainId = Array.isArray(chainId) ? (chainId[0] || WalletConnectTronAdapter.TRON_MAINNET_CHAIN_ID) : (chainId || WalletConnectTronAdapter.TRON_MAINNET_CHAIN_ID)\n\n // Initialize wallet if needed (pass chainId to ensure correct network)\n if (!WalletConnectTronAdapter.walletInstance || \n WalletConnectTronAdapter.walletProjectId !== this.projectId) {\n this.initializeWallet(targetChainId)\n }\n\n this.wallet = WalletConnectTronAdapter.walletInstance\n\n if (!this.wallet) {\n throw new Error('Failed to initialize WalletConnect wallet')\n }\n\n // Get network info for error reporting\n let network = WalletConnectChainID.Mainnet\n if (targetChainId === 195) {\n network = WalletConnectChainID.Mainnet\n } else if (targetChainId === 201910292) {\n network = WalletConnectChainID.Shasta\n } else if (targetChainId === 2494104990) {\n network = WalletConnectChainID.Nile\n }\n\n // Connect to wallet\n // In Telegram Mini App, this may trigger a deep link (wc://) to open the wallet app\n // The official @tronweb3/walletconnect-tron package handles this automatically\n // However, \"Invalid App Configuration\" error may occur if:\n // 1. Metadata URL/icons are invalid\n // 2. Deep link (wc://) cannot be handled in Telegram Mini App\n // 3. Network/chainId mismatch\n let address: string\n try {\n console.log('[WalletConnect Tron] Attempting to connect...', {\n network,\n chainId: targetChainId,\n isTelegram: this.isTelegramMiniApp(),\n projectId: this.projectId,\n })\n \n const result = await this.wallet.connect()\n address = result.address\n\n if (!address) {\n throw new ConnectionRejectedError(this.type)\n }\n \n // Log connection success for debugging\n console.log('[WalletConnect Tron] Connection successful:', {\n address,\n network,\n chainId: targetChainId,\n isTelegram: this.isTelegramMiniApp(),\n })\n } catch (error: any) {\n const errorMessage = error.message || String(error)\n const errorCode = error.code || error.error?.code\n const origin = (typeof window !== 'undefined' && window.location) ? window.location.origin : ''\n \n // Extract more detailed error information\n let detailedError = errorMessage\n if (error.error) {\n if (typeof error.error === 'string') {\n detailedError = error.error\n } else if (error.error.message) {\n detailedError = error.error.message\n } else if (error.error.data) {\n detailedError = JSON.stringify(error.error.data)\n }\n }\n \n // Check for common error patterns\n const isNoWalletFound = \n errorMessage.includes('没有找到支持的钱包') ||\n errorMessage.includes('No matching wallet') ||\n errorMessage.includes('No wallet found') ||\n errorMessage.includes('找不到钱包') ||\n errorMessage.includes('not found') ||\n errorMessage.includes('no matching')\n \n const isTimeout = \n errorMessage.includes('timeout') ||\n errorMessage.includes('超时') ||\n errorCode === 'TIMEOUT'\n \n const isRejected = \n errorMessage.includes('rejected') ||\n errorMessage.includes('拒绝') ||\n errorCode === 4001\n\n // WalletConnect relay reject: origin not allowlisted for this projectId\n const isOriginNotAllowed =\n errorCode === 3000 ||\n /origin not allowed/i.test(errorMessage) ||\n /Unauthorized:\\s*origin not allowed/i.test(errorMessage)\n \n // Get current metadata configuration for error reporting\n const currentMetadata = this.wallet ? {\n // Try to get metadata from wallet instance if available\n projectId: this.projectId,\n network: network,\n } : null\n \n // Build detailed error information\n const errorDetails = {\n error: errorMessage,\n detailedError: detailedError,\n code: errorCode,\n isTelegram: this.isTelegramMiniApp(),\n network: network,\n chainId: targetChainId,\n projectId: this.projectId,\n metadata: currentMetadata,\n // Get URL from window.location if available\n currentUrl: typeof window !== 'undefined' ? window.location.href : 'N/A',\n telegramPlatform: (typeof window !== 'undefined' && (window as any).Telegram?.WebApp?.platform) || 'N/A',\n errorType: isNoWalletFound ? 'NO_WALLET_FOUND' : \n isTimeout ? 'TIMEOUT' : \n isRejected ? 'REJECTED' : \n 'UNKNOWN',\n }\n \n console.error('[WalletConnect Tron] Connection error - Full details:', errorDetails)\n console.error('[WalletConnect Tron] Error object:', error)\n console.error('[WalletConnect Tron] Error stack:', error.stack)\n \n // Handle \"No wallet found\" error specifically\n if (isNoWalletFound) {\n const noWalletErrorDetails = [\n `\\n=== WalletConnect Tron: No Matching Wallet Found ===`,\n `Error: ${errorMessage}`,\n `Detailed: ${detailedError}`,\n `Code: ${errorCode || 'N/A'}`,\n ``,\n `Environment:`,\n ` - Telegram Mini App: ${this.isTelegramMiniApp() ? 'Yes' : 'No'}`,\n ` - Platform: ${errorDetails.telegramPlatform}`,\n ` - Current URL: ${errorDetails.currentUrl}`,\n ``,\n `Configuration:`,\n ` - Project ID: ${this.projectId ? 'Set' : 'Missing'}`,\n ` - Network: ${network}`,\n ` - Chain ID: ${targetChainId}`,\n ` - Metadata URL: ${typeof window !== 'undefined' ? window.location.origin : 'N/A'}`,\n ``,\n `Possible Causes:`,\n ` 1. No WalletConnect-compatible wallet (TokenPocket, etc.) installed on device`,\n ` 2. Wallet app not opened or not responding to deep link (wc://)`,\n ` 3. Deep link handling issue in Telegram Mini App environment`,\n ` 4. WalletConnect session timeout (user took too long to approve)`,\n ` 5. Network connectivity issue preventing WalletConnect relay connection`,\n ``,\n `Solutions:`,\n ` 1. Ensure TokenPocket or other WalletConnect-compatible wallet is installed`,\n ` 2. Try opening the wallet app manually before connecting`,\n ` 3. In Telegram Mini App, ensure the deep link popup is not blocked`,\n ` 4. Try connecting again (may need to wait a few seconds)`,\n ` 5. Check network connection and WalletConnect relay server accessibility`,\n ``,\n `For more details, see the error object logged above.`,\n `===========================================\\n`,\n ].join('\\n')\n \n console.error(noWalletErrorDetails)\n \n throw new ConnectionRejectedError(\n `WalletConnect Tron: 没有找到支持的钱包 (No matching wallet found)\\n\\n` +\n `可能的原因:\\n` +\n `1. 设备上未安装支持 WalletConnect 的钱包(如 TokenPocket)\\n` +\n `2. 钱包应用未打开或未响应 deep link (wc://)\\n` +\n `3. 在 Telegram Mini App 中,deep link 处理可能有问题\\n` +\n `4. 连接超时(用户未及时批准)\\n` +\n `5. 网络连接问题\\n\\n` +\n `解决方案:\\n` +\n `1. 确保已安装 TokenPocket 或其他支持 WalletConnect 的钱包\\n` +\n `2. 尝试手动打开钱包应用后再连接\\n` +\n `3. 在 Telegram Mini App 中,确保 deep link 弹窗未被阻止\\n` +\n `4. 稍等几秒后重试连接\\n` +\n `5. 检查网络连接和 WalletConnect 中继服务器可访问性\\n\\n` +\n `详细错误信息请查看控制台日志。`\n )\n }\n \n // Check if it's a configuration error (often related to deep links in Telegram Mini App)\n if (errorMessage.includes('Invalid') || \n errorMessage.includes('Configuration') ||\n errorMessage.includes('App Config') ||\n errorMessage.includes('Invalid App')) {\n \n // Build detailed configuration error message\n const configErrorDetails = [\n `\\n=== WalletConnect Tron Configuration Error ===`,\n `Error: ${errorMessage}`,\n `Detailed: ${detailedError}`,\n `Code: ${errorCode || 'N/A'}`,\n `\\nEnvironment:`,\n ` - Telegram Mini App: ${this.isTelegramMiniApp() ? 'Yes' : 'No'}`,\n ` - Platform: ${errorDetails.telegramPlatform}`,\n ` - Current URL: ${errorDetails.currentUrl}`,\n `\\nConfiguration:`,\n ` - Project ID: ${this.projectId ? 'Set' : 'Missing'}`,\n ` - Network: ${network}`,\n ` - Chain ID: ${targetChainId}`,\n `\\nPossible Causes:`,\n ` 1. Deep link (wc://) handling issue in Telegram Mini App`,\n ` 2. Invalid metadata configuration (URL or icons not accessible)`,\n ` 3. Network/chainId mismatch`,\n ` 4. WalletConnect project ID not configured correctly`,\n ` 5. Domain not added to WalletConnect Cloud allowlist`,\n `\\nPlease check:`,\n ` - WalletConnect Project ID is valid and active`,\n ` - Domain is added to WalletConnect Cloud allowlist (for serveo.net, etc.)`,\n ` - Metadata URL is accessible: Check console for metadata logs`,\n ` - Icons are accessible: Check console for icon URLs`,\n ` - Network matches chainId: Expected ${network} for chainId ${targetChainId}`,\n `\\nFor more details, see the error object logged above.`,\n `===========================================\\n`,\n ].join('\\n')\n \n console.error(configErrorDetails)\n \n throw new ConfigurationError(\n `WalletConnect Tron connection failed: ${errorMessage}\\n\\n` +\n `Configuration Details:\\n` +\n `- Telegram Mini App: ${this.isTelegramMiniApp() ? 'Yes' : 'No'}\\n` +\n `- Platform: ${errorDetails.telegramPlatform}\\n` +\n `- Origin: ${origin || '(unknown)'}\\n` +\n `- Project ID: ${this.projectId ? 'Set' : 'Missing'}\\n` +\n `- Network: ${network}\\n` +\n `- Chain ID: ${targetChainId}\\n\\n` +\n `This \"Invalid App Configuration\" error may be caused by:\\n` +\n `1. Deep link (wc://) handling issue in Telegram Mini App\\n` +\n `2. Invalid metadata configuration (URL or icons)\\n` +\n `3. Network/chainId mismatch\\n` +\n `4. Domain not added to WalletConnect Cloud allowlist\\n\\n` +\n `Please check the console for detailed error information.`\n )\n }\n\n // Handle WalletConnect Cloud origin allowlist errors with a very explicit action item\n if (isOriginNotAllowed) {\n throw new ConfigurationError(\n `WalletConnect Tron relayer rejected this origin (code 3000: Unauthorized: origin not allowed).\\n\\n` +\n `Fix:\\n` +\n `1) Open WalletConnect Cloud → your project (${this.projectId})\\n` +\n `2) Add this site origin to the allowlist:\\n` +\n ` - ${origin || '(unknown origin)'}\\n\\n` +\n `Common dev origins to allow:\\n` +\n `- http://localhost:5173\\n` +\n `- http://192.168.0.221:5173 (your LAN dev URL)\\n` +\n `- https://wallet-test.enclave-hq.com (your Cloudflare Tunnel/custom domain)\\n\\n` +\n `Original error: ${errorMessage}`\n )\n }\n \n // Handle timeout errors\n if (isTimeout) {\n throw new ConnectionRejectedError(\n `WalletConnect Tron connection timeout. Please try again and ensure your wallet app is open and ready.`\n )\n }\n \n // Handle user rejection\n if (isRejected) {\n throw new ConnectionRejectedError(this.type)\n }\n \n throw error\n }\n\n this.currentAddress = address\n\n // Create account info\n const account: Account = {\n universalAddress: createUniversalAddress(targetChainId, address),\n nativeAddress: address,\n chainId: targetChainId,\n chainType: ChainType.TRON,\n isActive: true,\n }\n\n this.setState(WalletState.CONNECTED)\n this.setAccount(account)\n this.setupEventListeners()\n\n return account\n } catch (error: any) {\n this.setState(WalletState.ERROR)\n this.setAccount(null)\n this.currentAddress = null\n\n if (error.message?.includes('rejected') || error.code === 4001) {\n throw new ConnectionRejectedError(this.type)\n }\n\n throw error\n }\n }\n\n /**\n * Disconnect wallet\n */\n async disconnect(): Promise<void> {\n // Remove event listeners first\n this.removeEventListeners()\n\n // Disconnect wallet if exists\n if (this.wallet) {\n try {\n await this.wallet.disconnect()\n } catch (error) {\n console.warn('[WalletConnect Tron] Error during disconnect:', error)\n }\n }\n\n // Clean up instance state (but keep static wallet for reuse)\n this.wallet = null\n this.currentAddress = null\n this.setState(WalletState.DISCONNECTED)\n this.setAccount(null)\n this.emitDisconnected()\n }\n\n /**\n * Sign message\n */\n async signMessage(message: string): Promise<string> {\n this.ensureConnected()\n\n try {\n if (!this.wallet) {\n throw new Error('Wallet not initialized')\n }\n\n const signature = await this.wallet.signMessage(message)\n\n // Handle different response formats\n if (typeof signature === 'string') {\n return signature\n } else if (signature && typeof signature === 'object') {\n if ('signature' in signature) {\n return (signature as any).signature\n } else if ('result' in signature) {\n return (signature as any).result\n } else {\n return JSON.stringify(signature)\n }\n }\n\n throw new Error('Invalid signature format returned from wallet')\n } catch (error: any) {\n console.error('[WalletConnect Tron] Sign message error:', error)\n\n let errorMessage = 'Unknown error'\n if (typeof error === 'string') {\n errorMessage = error\n } else if (error?.message) {\n errorMessage = error.message\n } else if (error?.error?.message) {\n errorMessage = error.error.message\n } else {\n try {\n errorMessage = JSON.stringify(error)\n } catch {\n errorMessage = String(error)\n }\n }\n\n if (errorMessage?.includes('rejected') ||\n errorMessage?.includes('declined') ||\n errorMessage?.includes('User rejected') ||\n error?.code === 4001 ||\n error?.code === 'USER_REJECTED' ||\n error?.error?.code === 4001) {\n throw new SignatureRejectedError()\n }\n\n if (errorMessage?.includes('not supported') ||\n errorMessage?.includes('method not found') ||\n errorMessage?.includes('Method not found') ||\n error?.code === -32601 ||\n error?.error?.code === -32601) {\n throw new Error('tron_signMessage is not supported by the connected wallet. Please use a wallet that supports WalletConnect Tron signing, or use TronLink extension for browser-based signing.')\n }\n\n throw new Error(`WalletConnect Tron sign message failed: ${errorMessage}`)\n }\n }\n\n /**\n * Sign transaction\n * \n * @param transaction - Tron transaction object\n * Can be created using TronWeb (if available) or any TRON transaction builder\n * Format: { raw_data: {...}, raw_data_hex: \"...\", txID: \"...\" }\n * @returns Signed transaction object or signature\n */\n async signTransaction(transaction: any): Promise<string> {\n this.ensureConnected()\n\n try {\n if (!this.wallet) {\n throw new Error('Wallet not initialized')\n }\n\n if (!transaction) {\n throw new Error('Transaction object is required')\n }\n\n console.log('[WalletConnect Tron] Signing transaction:', {\n hasRawData: !!transaction.raw_data,\n hasRawDataHex: !!transaction.raw_data_hex,\n hasTxID: !!transaction.txID,\n })\n\n // Use official package's signTransaction method\n const result = await this.wallet.signTransaction(transaction)\n\n // Handle different response formats\n if (typeof result === 'string') {\n return result\n } else if (result && typeof result === 'object') {\n // If result is a signed transaction object, extract txID or return the object\n if ('txID' in result && typeof result.txID === 'string') {\n return result.txID\n } else if ('txid' in result && typeof result.txid === 'string') {\n return result.txid\n } else if ('signature' in result) {\n // Return the signed transaction object as JSON string\n return JSON.stringify(result)\n } else {\n // Return the full result as JSON string\n return JSON.stringify(result)\n }\n }\n\n throw new Error('Invalid signature format returned from wallet')\n } catch (error: any) {\n console.error('[WalletConnect Tron] Sign transaction error:', error)\n\n let errorMessage = 'Unknown error'\n if (typeof error === 'string') {\n errorMessage = error\n } else if (error?.message) {\n errorMessage = error.message\n } else if (error?.error?.message) {\n errorMessage = error.error.message\n } else if (error?.data?.message) {\n errorMessage = error.data.message\n } else {\n try {\n errorMessage = JSON.stringify(error)\n } catch {\n errorMessage = String(error)\n }\n }\n\n if (errorMessage?.includes('rejected') ||\n errorMessage?.includes('declined') ||\n errorMessage?.includes('User rejected') ||\n error?.code === 4001 ||\n error?.code === 'USER_REJECTED' ||\n error?.error?.code === 4001) {\n throw new SignatureRejectedError('Transaction signature was rejected by user')\n }\n\n if (errorMessage?.includes('not supported') ||\n errorMessage?.includes('method not found') ||\n errorMessage?.includes('Method not found') ||\n errorMessage?.includes('Not support') ||\n error?.code === -32601 ||\n error?.error?.code === -32601) {\n throw new Error('tron_signTransaction is not supported by the connected wallet. Please use a wallet that supports WalletConnect Tron signing, or use TronLink extension for browser-based signing.')\n }\n\n throw new Error(`WalletConnect Tron sign transaction failed: ${errorMessage}`)\n }\n }\n\n /**\n * Read contract (not supported by WalletConnect)\n */\n async readContract<T = any>(_params: ContractReadParams): Promise<T> {\n this.ensureConnected()\n throw new Error('WalletConnect Tron does not support direct contract reading. Please use direct Tron RPC calls or a wallet extension (like TronLink) for read operations.')\n }\n\n /**\n * Write contract (not yet implemented)\n */\n async writeContract(_params: ContractWriteParams): Promise<string> {\n throw new Error('Contract write not yet implemented for WalletConnect Tron')\n }\n\n /**\n * Estimate gas (not yet implemented)\n */\n async estimateGas(_params: ContractWriteParams): Promise<bigint> {\n throw new Error('Gas estimation not yet implemented for WalletConnect Tron')\n }\n\n /**\n * Wait for transaction (not yet implemented)\n */\n async waitForTransaction(_txHash: string, _confirmations?: number): Promise<TransactionReceipt> {\n throw new Error('Transaction waiting not yet implemented for WalletConnect Tron')\n }\n\n /**\n * Setup event listeners\n */\n private setupEventListeners(): void {\n if (!this.wallet) {\n return\n }\n\n // Listen for account changes\n this.wallet.on('accountsChanged', (accounts: string[]) => {\n if (accounts && accounts.length > 0 && accounts[0] !== this.currentAddress) {\n const newAddress = accounts[0]\n this.currentAddress = newAddress\n if (this.currentAccount) {\n const newAccount: Account = {\n ...this.currentAccount,\n nativeAddress: newAddress,\n universalAddress: createUniversalAddress(this.currentAccount.chainId, newAddress),\n }\n this.setAccount(newAccount)\n this.emit('accountChanged', newAccount)\n }\n } else if (!accounts || accounts.length === 0) {\n // Accounts array is empty, meaning wallet disconnected\n this.disconnect()\n }\n })\n\n // Listen for disconnect\n this.wallet.on('disconnect', () => {\n this.disconnect()\n })\n }\n\n /**\n * Remove event listeners\n */\n private removeEventListeners(): void {\n if (!this.wallet) {\n return\n }\n\n this.wallet.removeAllListeners('accountsChanged')\n this.wallet.removeAllListeners('disconnect')\n }\n\n /**\n * Get provider (returns wallet instance)\n */\n getProvider(): WalletConnectWallet | null {\n return this.wallet\n }\n\n /**\n * Clear static wallet instance (for complete cleanup)\n */\n static clearWalletInstance(): void {\n if (WalletConnectTronAdapter.walletInstance) {\n WalletConnectTronAdapter.walletInstance.disconnect().catch(() => {\n // Ignore errors\n })\n WalletConnectTronAdapter.walletInstance = null\n WalletConnectTronAdapter.walletProjectId = null\n }\n }\n}\n","/**\n * Deep Link Adapter\n * \n * 通用深度链接适配器,与 WalletConnect 同级\n * 支持多链(EVM、TRON等)\n * 使用提供者模式,支持不同的钱包(TokenPocket、ImToken、TronLink等)\n */\n\nimport { WalletAdapter } from '../base/wallet-adapter'\nimport {\n WalletType,\n ChainType,\n WalletState,\n Account,\n} from '../../core/types'\nimport { \n ConnectionRejectedError, \n SignatureRejectedError,\n WalletNotConnectedError,\n} from '../../core/errors'\nimport { createUniversalAddress } from '../../utils/address/universal-address'\nimport { IDeepLinkProvider } from './providers/base'\n\n/**\n * Deep Link Provider Type\n * 支持的深度链接提供者类型\n */\nexport enum DeepLinkProviderType {\n TOKENPOCKET = 'tokenpocket',\n TRONLINK = 'tronlink',\n IMTOKEN = 'imtoken',\n METAMASK = 'metamask',\n OKX = 'okx',\n}\n\n/**\n * Deep Link Adapter Configuration\n */\nexport interface DeepLinkAdapterConfig {\n providerType: DeepLinkProviderType\n callbackUrl?: string\n callbackSchema?: string\n}\n\n/**\n * Deep Link Adapter\n * \n * 通用的深度链接适配器,支持多链和多个钱包提供者\n */\nexport class DeepLinkAdapter extends WalletAdapter {\n readonly type: WalletType\n readonly chainType: ChainType\n readonly name: string\n readonly icon: string\n\n private provider: IDeepLinkProvider\n private currentChainId: number | null = null\n private currentChainType: ChainType | null = null\n\n // Static map to store pending actions across all instances\n // Key: actionId, Value: { resolve, reject }\n private static pendingActions: Map<string, { resolve: (value: any) => void; reject: (error: any) => void }> = new Map()\n\n constructor(config: DeepLinkAdapterConfig) {\n super()\n\n // Create provider instance based on type\n this.provider = this.createProvider(config)\n\n // Set adapter metadata based on provider\n this.name = `${this.provider.name} (Deep Link)`\n this.icon = this.provider.icon\n\n // Determine chain type from provider's supported chains\n // For now, we'll use the first supported chain type\n // In the future, this could be determined during connect()\n if (this.provider.supportedChainTypes.includes(ChainType.EVM)) {\n this.chainType = ChainType.EVM\n this.type = WalletType.DEEP_LINK_EVM\n } else if (this.provider.supportedChainTypes.includes(ChainType.TRON)) {\n this.chainType = ChainType.TRON\n this.type = WalletType.DEEP_LINK_TRON\n } else {\n // Default to EVM if unknown\n this.chainType = ChainType.EVM\n this.type = WalletType.DEEP_LINK_EVM\n }\n\n // Setup callback handler\n if (typeof window !== 'undefined') {\n this.setupCallbackHandler()\n }\n }\n\n /**\n * Create provider instance based on type\n */\n private createProvider(config: DeepLinkAdapterConfig): IDeepLinkProvider {\n switch (config.providerType) {\n case DeepLinkProviderType.TOKENPOCKET: {\n const { TokenPocketDeepLinkProvider } = require('./providers/tokenpocket')\n return new TokenPocketDeepLinkProvider({\n callbackUrl: config.callbackUrl,\n callbackSchema: config.callbackSchema,\n })\n }\n case DeepLinkProviderType.TRONLINK: {\n const { TronLinkDeepLinkProvider } = require('./providers/tronlink')\n return new TronLinkDeepLinkProvider()\n }\n case DeepLinkProviderType.IMTOKEN: {\n const { ImTokenDeepLinkProvider } = require('./providers/imtoken')\n return new ImTokenDeepLinkProvider({\n callbackUrl: config.callbackUrl,\n callbackSchema: config.callbackSchema,\n })\n }\n case DeepLinkProviderType.METAMASK: {\n const { MetaMaskDeepLinkProvider } = require('./providers/metamask')\n return new MetaMaskDeepLinkProvider()\n }\n case DeepLinkProviderType.OKX: {\n const { OKXDeepLinkProvider } = require('./providers/okx')\n return new OKXDeepLinkProvider()\n }\n default:\n throw new Error(`Unsupported deep link provider type: ${config.providerType}`)\n }\n }\n\n /**\n * Setup callback handler for deep link results\n */\n private setupCallbackHandler(): void {\n if (typeof window === 'undefined') {\n return\n }\n\n const handleUrlChange = () => {\n const urlParams = new URLSearchParams(window.location.search)\n const result = this.provider.parseCallbackResult(urlParams)\n \n if (result.actionId && DeepLinkAdapter.pendingActions.has(result.actionId)) {\n const callback = DeepLinkAdapter.pendingActions.get(result.actionId)!\n \n if (result.error) {\n callback.reject(new Error(result.error))\n } else if (result.result) {\n callback.resolve(result.result)\n }\n \n DeepLinkAdapter.pendingActions.delete(result.actionId)\n }\n }\n\n // Listen for URL changes\n window.addEventListener('popstate', handleUrlChange)\n window.addEventListener('hashchange', handleUrlChange)\n \n // Check on initial load\n handleUrlChange()\n }\n\n /**\n * Check if deep link is available\n */\n async isAvailable(): Promise<boolean> {\n return this.provider.isAvailable()\n }\n\n /**\n * Connect to wallet via deep link\n * \n * Note: Deep links typically don't support persistent connections\n * This method may throw ConnectionRejectedError as deep links are\n * primarily used for signing operations, not connection\n */\n async connect(chainId?: number | number[]): Promise<Account> {\n // Extract first chain ID if array is provided\n const targetChainId = Array.isArray(chainId) ? chainId[0] : (chainId || 1)\n \n // Determine chain type from chain ID\n // For now, we'll use a simple heuristic:\n // - Chain ID 195 = TRON Mainnet\n // - Other chain IDs = EVM chains\n let chainType: ChainType\n if (targetChainId === 195) {\n chainType = ChainType.TRON\n } else {\n chainType = ChainType.EVM\n }\n\n // Check if provider supports this chain type\n if (!this.provider.supportedChainTypes.includes(chainType)) {\n throw new Error(\n `Provider ${this.provider.name} does not support chain type ${chainType}`\n )\n }\n\n // Deep links typically don't support connection\n // They're used for signing operations\n // If the provider supports connect, we can try it\n if (this.provider.buildConnectLink) {\n const linkInfo = this.provider.buildConnectLink({\n chainId: targetChainId,\n chainType: chainType,\n })\n\n if (linkInfo.actionId) {\n // If there's a callback mechanism, wait for it\n return new Promise<Account>((resolve, reject) => {\n DeepLinkAdapter.pendingActions.set(linkInfo.actionId!, {\n resolve: (result: any) => {\n // Extract address from result\n // The result format depends on the provider\n // For now, we'll assume the result contains an address\n const address = result?.address || result?.account || result\n if (!address || typeof address !== 'string') {\n reject(new ConnectionRejectedError('Invalid connection result: no address found'))\n return\n }\n\n const account: Account = {\n universalAddress: createUniversalAddress(targetChainId, address),\n nativeAddress: address,\n chainId: targetChainId,\n chainType: chainType,\n isActive: true,\n }\n\n this.setState(WalletState.CONNECTED)\n this.setAccount(account)\n this.emit('connected', account)\n resolve(account)\n },\n reject: (error: any) => {\n this.setState(WalletState.DISCONNECTED)\n reject(error)\n },\n })\n window.location.href = linkInfo.url\n \n setTimeout(() => {\n if (DeepLinkAdapter.pendingActions.has(linkInfo.actionId!)) {\n DeepLinkAdapter.pendingActions.delete(linkInfo.actionId!)\n this.setState(WalletState.DISCONNECTED)\n reject(new ConnectionRejectedError('Deep link connection timeout'))\n }\n }, 30000)\n })\n } else {\n // No callback, just open the link\n window.location.href = linkInfo.url\n throw new ConnectionRejectedError(\n 'Deep link connection initiated. Please complete the connection in your wallet app.'\n )\n }\n } else {\n // Provider doesn't support connection\n throw new ConnectionRejectedError(\n `Deep link connection is not supported by ${this.provider.name}. ` +\n 'Deep links are primarily used for signing operations.'\n )\n }\n }\n\n /**\n * Disconnect from wallet\n */\n async disconnect(): Promise<void> {\n this.setState(WalletState.DISCONNECTED)\n this.setAccount(null)\n this.currentChainId = null\n this.currentChainType = null\n this.emitDisconnected()\n }\n\n /**\n * Sign a message\n */\n async signMessage(message: string): Promise<string> {\n this.ensureConnected()\n\n if (!this.currentChainId || !this.currentChainType) {\n throw new WalletNotConnectedError(this.type)\n }\n\n const linkInfo = this.provider.buildSignMessageLink({\n message,\n chainId: this.currentChainId,\n chainType: this.currentChainType,\n })\n\n // If there's a callback mechanism, wait for the result\n if (linkInfo.callbackSchema || linkInfo.callbackUrl) {\n return new Promise<string>((resolve, reject) => {\n DeepLinkAdapter.pendingActions.set(linkInfo.actionId, { resolve, reject })\n window.location.href = linkInfo.url\n\n setTimeout(() => {\n if (DeepLinkAdapter.pendingActions.has(linkInfo.actionId)) {\n DeepLinkAdapter.pendingActions.delete(linkInfo.actionId)\n reject(new SignatureRejectedError('Message signature timeout'))\n }\n }, 30000)\n })\n } else {\n // No callback mechanism, just open the link\n window.location.href = linkInfo.url\n throw new SignatureRejectedError(\n 'Deep link signature initiated. Please complete the signature in your wallet app.'\n )\n }\n }\n\n /**\n * Sign a transaction\n */\n async signTransaction(transaction: any): Promise<string> {\n this.ensureConnected()\n\n if (!this.currentChainId || !this.currentChainType) {\n throw new WalletNotConnectedError(this.type)\n }\n\n const linkInfo = this.provider.buildSignTransactionLink({\n transaction,\n chainId: this.currentChainId,\n chainType: this.currentChainType,\n })\n\n // If there's a callback mechanism, wait for the result\n if (linkInfo.callbackSchema || linkInfo.callbackUrl) {\n return new Promise<string>((resolve, reject) => {\n DeepLinkAdapter.pendingActions.set(linkInfo.actionId, { resolve, reject })\n window.location.href = linkInfo.url\n\n setTimeout(() => {\n if (DeepLinkAdapter.pendingActions.has(linkInfo.actionId)) {\n DeepLinkAdapter.pendingActions.delete(linkInfo.actionId)\n reject(new SignatureRejectedError('Transaction signature timeout'))\n }\n }, 30000)\n })\n } else {\n // No callback mechanism, just open the link\n window.location.href = linkInfo.url\n throw new SignatureRejectedError(\n 'Deep link transaction signature initiated. Please complete the signature in your wallet app.'\n )\n }\n }\n\n /**\n * Get provider (not applicable for deep links)\n */\n getProvider(): any {\n // Deep links don't provide a direct provider object\n return null\n }\n\n /**\n * Static method to handle callback from wallet apps\n * This can be called from anywhere in the application\n */\n static handleCallback(): void {\n if (typeof window === 'undefined') {\n return\n }\n\n const urlParams = new URLSearchParams(window.location.search)\n // We need to know which provider to use, but we can't determine that from the URL alone\n // This method should be called with a specific provider instance\n // For now, we'll iterate through all pending actions\n const actionId = urlParams.get('actionId')\n if (actionId && DeepLinkAdapter.pendingActions.has(actionId)) {\n const callback = DeepLinkAdapter.pendingActions.get(actionId)!\n const result = urlParams.get('result')\n const error = urlParams.get('error')\n\n if (error) {\n callback.reject(new Error(error))\n } else if (result) {\n try {\n const parsedResult = JSON.parse(decodeURIComponent(result))\n callback.resolve(parsedResult)\n } catch (e) {\n callback.resolve(result)\n }\n }\n\n DeepLinkAdapter.pendingActions.delete(actionId)\n }\n }\n\n /**\n * Set current account (called after successful connection)\n */\n protected setAccount(account: Account | null): void {\n this.currentAccount = account\n if (account) {\n this.currentChainId = account.chainId\n this.currentChainType = account.chainType\n }\n }\n\n /**\n * Emit disconnected event\n */\n protected emitDisconnected(): void {\n this.emit('disconnected')\n }\n}\n\n","/**\n * Wallet Manager (Core)\n */\n\nimport { TypedEventEmitter } from './events'\nimport { AdapterRegistry } from './adapter-registry'\nimport {\n Account,\n ChainType,\n WalletType,\n IWalletAdapter,\n WalletManagerConfig,\n WalletManagerEvents,\n ConnectedWallet,\n StorageData,\n WalletHistoryRecord,\n TransactionReceipt,\n AddChainParams,\n} from './types'\nimport {\n WalletNotConnectedError,\n WalletNotAvailableError,\n} from './errors'\nimport { EVMPrivateKeyAdapter } from '../adapters/evm/private-key'\nimport { QRCodeSigner } from '../utils/qrcode-signer'\nimport type { QRCodeSignerConfig } from '../utils/qrcode-signer'\n\n/**\n * Wallet Manager\n */\nexport class WalletManager extends TypedEventEmitter<WalletManagerEvents> {\n private config: Required<WalletManagerConfig>\n private registry: AdapterRegistry\n\n // Primary wallet\n private primaryWallet: IWalletAdapter | null = null\n\n // Connected wallet pool\n private connectedWallets: Map<ChainType, IWalletAdapter> = new Map()\n\n constructor(config: WalletManagerConfig = {}) {\n super()\n\n this.config = {\n enableStorage: config.enableStorage ?? true,\n storagePrefix: config.storagePrefix ?? 'enclave_wallet_',\n defaultChainId: config.defaultChainId ?? 1,\n defaultTronChainId: config.defaultTronChainId ?? 195,\n walletConnectProjectId: config.walletConnectProjectId ?? '',\n }\n\n this.registry = new AdapterRegistry(this.config)\n\n // Note: No longer auto-restoring connection in constructor\n // Async operations should be handled in WalletProvider by calling restoreFromStorage()\n }\n\n // ===== Connection Management =====\n\n /**\n * Check if adapter is registered for a wallet type\n */\n hasAdapter(type: WalletType): boolean {\n return this.registry.has(type)\n }\n\n /**\n * Connect primary wallet\n */\n async connect(type: WalletType, chainId?: number | number[]): Promise<Account> {\n const adapter = this.registry.getAdapter(type)\n if (!adapter) {\n throw new WalletNotAvailableError(type)\n }\n\n // Check if available\n const isAvailable = await adapter.isAvailable()\n if (!isAvailable) {\n throw new WalletNotAvailableError(type)\n }\n\n // Connect wallet\n const account = await adapter.connect(chainId)\n\n // Set as primary wallet\n this.setPrimaryWallet(adapter)\n\n // Add to connected wallet pool\n this.connectedWallets.set(adapter.chainType, adapter)\n\n // Setup event listeners\n this.setupAdapterListeners(adapter, true)\n\n // Save to storage\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n\n return account\n }\n\n /**\n * Connect additional wallet (without changing primary wallet)\n */\n async connectAdditional(type: WalletType, chainId?: number | number[]): Promise<Account> {\n const adapter = this.registry.getAdapter(type)\n if (!adapter) {\n throw new WalletNotAvailableError(type)\n }\n\n const isAvailable = await adapter.isAvailable()\n if (!isAvailable) {\n throw new WalletNotAvailableError(type)\n }\n\n // Support both single chain ID and array of chain IDs for multi-chain support\n const account = await adapter.connect(chainId)\n\n // Add to connected wallet pool (without setting as primary)\n this.connectedWallets.set(adapter.chainType, adapter)\n\n // Setup event listeners\n this.setupAdapterListeners(adapter, false)\n\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n\n return account\n }\n\n /**\n * Connect with private key (for development/testing only)\n */\n async connectWithPrivateKey(privateKey: string, chainId?: number): Promise<Account> {\n const adapter = new EVMPrivateKeyAdapter()\n adapter.setPrivateKey(privateKey)\n\n const account = await adapter.connect(chainId || this.config.defaultChainId)\n\n this.setPrimaryWallet(adapter)\n this.connectedWallets.set(adapter.chainType, adapter)\n this.setupAdapterListeners(adapter, true)\n\n return account\n }\n\n /**\n * Disconnect primary wallet\n */\n async disconnect(): Promise<void> {\n if (!this.primaryWallet) {\n return\n }\n\n // Save chainType first, as it may be cleared after disconnect()\n const chainType = this.primaryWallet.chainType\n\n await this.primaryWallet.disconnect()\n\n // Remove listeners\n this.removeAdapterListeners(this.primaryWallet)\n\n // Remove from connected wallet pool\n this.connectedWallets.delete(chainType)\n\n this.primaryWallet = null\n\n // Clear storage when disconnecting (important: prevents auto-restore on page reload)\n // This ensures that if user explicitly disconnects, the connection won't be restored automatically\n if (this.config.enableStorage) {\n this.clearStorage()\n }\n\n this.emit('disconnected')\n }\n\n /**\n * Disconnect all wallets\n */\n async disconnectAll(): Promise<void> {\n const wallets = Array.from(this.connectedWallets.values())\n\n for (const wallet of wallets) {\n await wallet.disconnect()\n this.removeAdapterListeners(wallet)\n }\n\n this.primaryWallet = null\n this.connectedWallets.clear()\n\n if (this.config.enableStorage) {\n this.clearStorage()\n }\n\n this.emit('disconnected')\n }\n\n // ===== Primary Wallet Management =====\n\n /**\n * Switch primary wallet\n */\n async switchPrimaryWallet(chainType: ChainType): Promise<Account> {\n const adapter = this.connectedWallets.get(chainType)\n if (!adapter || !adapter.currentAccount) {\n throw new WalletNotConnectedError(`Wallet for chain type ${chainType} not connected`)\n }\n\n const oldPrimary = this.primaryWallet?.currentAccount || null\n\n // Remove listeners from old primary wallet\n if (this.primaryWallet) {\n this.removeAdapterListeners(this.primaryWallet)\n }\n\n // Set new primary wallet\n this.setPrimaryWallet(adapter)\n\n // Setup listeners for new primary wallet\n this.setupAdapterListeners(adapter, true)\n\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n\n this.emit('primaryWalletSwitched', adapter.currentAccount, oldPrimary, chainType)\n\n return adapter.currentAccount\n }\n\n /**\n * Get primary wallet account\n */\n getPrimaryAccount(): Account | null {\n return this.primaryWallet?.currentAccount || null\n }\n\n /**\n * Get all connected wallets\n */\n getConnectedWallets(): ConnectedWallet[] {\n return Array.from(this.connectedWallets.values()).map(adapter => ({\n account: adapter.currentAccount!,\n walletType: adapter.type,\n chainType: adapter.chainType,\n isPrimary: adapter === this.primaryWallet,\n canSwitchChain: this.canSwitchChain(adapter),\n adapter,\n }))\n }\n\n /**\n * Get wallet by chain type\n */\n getWalletByChainType(chainType: ChainType): IWalletAdapter | null {\n return this.connectedWallets.get(chainType) || null\n }\n\n // ===== Signing =====\n\n /**\n * Sign message with primary wallet\n */\n async signMessage(message: string): Promise<string> {\n if (!this.primaryWallet) {\n throw new WalletNotConnectedError()\n }\n\n return this.primaryWallet.signMessage(message)\n }\n\n /**\n * Sign message with wallet of specified chain type\n */\n async signMessageWithChainType(message: string, chainType?: ChainType): Promise<string> {\n if (!chainType) {\n return this.signMessage(message)\n }\n\n const adapter = this.connectedWallets.get(chainType)\n if (!adapter) {\n throw new WalletNotConnectedError(`Wallet for chain type ${chainType}`)\n }\n\n return adapter.signMessage(message)\n }\n\n /**\n * Create QR code signer for message signing\n * \n * This method creates a QR code signer that can be used to display a QR code\n * for users to scan with their wallet app to sign a message.\n * \n * @param message - Message to sign\n * @param config - QR code signer configuration\n * @returns QRCodeSigner instance\n * \n * @example\n * ```typescript\n * const signer = walletManager.createQRCodeSigner('Hello World', {\n * requestId: 'sign-123',\n * requestUrl: 'https://example.com/sign?requestId=sign-123&message=Hello%20World',\n * pollUrl: 'https://api.example.com/sign/status',\n * })\n * \n * const qrCodeUrl = await signer.generateQRCode()\n * const signature = await signer.startPolling()\n * ```\n */\n createQRCodeSigner(\n message: string,\n config: Omit<QRCodeSignerConfig, 'requestId' | 'requestUrl'> & {\n requestId: string\n requestUrl: string\n }\n ): QRCodeSigner {\n return new QRCodeSigner({\n ...config,\n // Encode message in request URL if not already encoded\n requestUrl: config.requestUrl.includes(encodeURIComponent(message))\n ? config.requestUrl\n : `${config.requestUrl}${config.requestUrl.includes('?') ? '&' : '?'}message=${encodeURIComponent(message)}`,\n })\n }\n\n /**\n * Sign TypedData (EVM only)\n */\n async signTypedData(typedData: any, chainType?: ChainType): Promise<string> {\n const adapter = chainType\n ? this.connectedWallets.get(chainType)\n : this.primaryWallet\n\n if (!adapter) {\n throw new WalletNotConnectedError()\n }\n\n if (!adapter.signTypedData) {\n throw new Error(`signTypedData not supported by ${adapter.type}`)\n }\n\n return adapter.signTypedData(typedData)\n }\n\n /**\n * Sign transaction (with primary wallet)\n */\n async signTransaction(transaction: any): Promise<string> {\n if (!this.primaryWallet) {\n throw new WalletNotConnectedError()\n }\n\n if (!this.primaryWallet.signTransaction) {\n throw new Error(`signTransaction not supported by ${this.primaryWallet.type}`)\n }\n\n return this.primaryWallet.signTransaction(transaction)\n }\n\n /**\n * Sign transaction with wallet of specified chain type\n */\n async signTransactionWithChainType(transaction: any, chainType?: ChainType): Promise<string> {\n if (!chainType) {\n return this.signTransaction(transaction)\n }\n\n const adapter = this.connectedWallets.get(chainType)\n if (!adapter) {\n throw new WalletNotConnectedError(`Wallet for chain type ${chainType}`)\n }\n\n if (!adapter.signTransaction) {\n throw new Error(`signTransaction not supported by ${adapter.type}`)\n }\n\n return adapter.signTransaction(transaction)\n }\n\n // ===== Chain Switching =====\n\n /**\n * Request chain switch (EVM only)\n */\n async requestSwitchChain(chainId: number, options?: {\n addChainIfNotExists?: boolean\n chainConfig?: AddChainParams\n }): Promise<Account> {\n if (!this.primaryWallet) {\n throw new WalletNotConnectedError()\n }\n\n if (!this.primaryWallet.switchChain) {\n throw new Error(`Chain switching not supported by ${this.primaryWallet.type}`)\n }\n\n try {\n await this.primaryWallet.switchChain(chainId)\n return this.primaryWallet.currentAccount!\n } catch (error: any) {\n // If chain doesn't exist and auto-add is configured\n if (options?.addChainIfNotExists && options.chainConfig && this.primaryWallet.addChain) {\n await this.primaryWallet.addChain(options.chainConfig)\n await this.primaryWallet.switchChain(chainId)\n return this.primaryWallet.currentAccount!\n }\n throw error\n }\n }\n\n // ===== Contract Calls =====\n\n /**\n * Read contract\n */\n async readContract<T = any>(\n address: string,\n abi: any[],\n functionName: string,\n args?: any[],\n chainType?: ChainType\n ): Promise<T> {\n const adapter = chainType\n ? this.connectedWallets.get(chainType)\n : this.primaryWallet\n\n if (!adapter) {\n throw new WalletNotConnectedError()\n }\n\n if (!adapter.readContract) {\n throw new Error(`readContract not supported by ${adapter.type}`)\n }\n\n return adapter.readContract({ address, abi, functionName, args })\n }\n\n /**\n * Write contract\n */\n async writeContract(\n address: string,\n abi: any[],\n functionName: string,\n args?: any[],\n options?: {\n value?: string\n gas?: number\n gasPrice?: string // Legacy gas price (for pre-EIP-1559 networks)\n maxFeePerGas?: string // EIP-1559: Maximum fee per gas (in wei)\n maxPriorityFeePerGas?: string // EIP-1559: Maximum priority fee per gas (in wei)\n },\n chainType?: ChainType\n ): Promise<string> {\n const adapter = chainType\n ? this.connectedWallets.get(chainType)\n : this.primaryWallet\n\n if (!adapter) {\n throw new WalletNotConnectedError()\n }\n\n if (!adapter.writeContract) {\n throw new Error(`writeContract not supported by ${adapter.type}`)\n }\n\n return adapter.writeContract({\n address,\n abi,\n functionName,\n args,\n ...options,\n })\n }\n\n /**\n * Estimate gas\n */\n async estimateGas(\n address: string,\n abi: any[],\n functionName: string,\n args?: any[],\n chainType?: ChainType\n ): Promise<bigint> {\n const adapter = chainType\n ? this.connectedWallets.get(chainType)\n : this.primaryWallet\n\n if (!adapter) {\n throw new WalletNotConnectedError()\n }\n\n if (!adapter.estimateGas) {\n throw new Error(`estimateGas not supported by ${adapter.type}`)\n }\n\n return adapter.estimateGas({ address, abi, functionName, args })\n }\n\n /**\n * Wait for transaction confirmation\n */\n async waitForTransaction(\n txHash: string,\n confirmations?: number,\n chainType?: ChainType\n ): Promise<TransactionReceipt> {\n const adapter = chainType\n ? this.connectedWallets.get(chainType)\n : this.primaryWallet\n\n if (!adapter) {\n throw new WalletNotConnectedError()\n }\n\n if (!adapter.waitForTransaction) {\n throw new Error(`waitForTransaction not supported by ${adapter.type}`)\n }\n\n return adapter.waitForTransaction(txHash, confirmations)\n }\n\n // ===== Provider Access =====\n\n /**\n * Get primary wallet Provider\n */\n getProvider(): any {\n if (!this.primaryWallet) {\n throw new WalletNotConnectedError()\n }\n\n return this.primaryWallet.getProvider()\n }\n\n /**\n * Get Provider by chain type\n */\n getProviderByChainType(chainType: ChainType): any {\n const adapter = this.connectedWallets.get(chainType)\n if (!adapter) {\n throw new WalletNotConnectedError(`Wallet for chain type ${chainType}`)\n }\n\n return adapter.getProvider()\n }\n\n // ===== Private Methods =====\n\n /**\n * Set primary wallet\n */\n private setPrimaryWallet(adapter: IWalletAdapter): void {\n this.primaryWallet = adapter\n }\n\n /**\n * Check if wallet supports chain switching\n */\n private canSwitchChain(adapter: IWalletAdapter): boolean {\n return !!adapter.switchChain\n }\n\n /**\n * Setup adapter event listeners\n */\n private setupAdapterListeners(adapter: IWalletAdapter, isPrimary: boolean): void {\n adapter.on('accountChanged', (account: Account | null) => {\n if (isPrimary) {\n this.emit('accountChanged', account)\n }\n this.emit('walletAccountChanged', adapter.chainType, account, isPrimary)\n\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n })\n\n adapter.on('chainChanged', (chainId: number) => {\n if (isPrimary && adapter.currentAccount) {\n this.emit('chainChanged', chainId, adapter.currentAccount)\n }\n if (adapter.currentAccount) {\n this.emit('walletChainChanged', adapter.chainType, chainId, adapter.currentAccount, isPrimary)\n }\n\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n })\n\n adapter.on('disconnected', () => {\n if (isPrimary) {\n this.emit('disconnected')\n }\n this.emit('walletDisconnected', adapter.chainType, isPrimary)\n\n this.connectedWallets.delete(adapter.chainType)\n\n if (adapter === this.primaryWallet) {\n this.primaryWallet = null\n }\n\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n })\n\n adapter.on('error', (error: Error) => {\n this.emit('error', error)\n })\n }\n\n /**\n * Remove adapter event listeners\n */\n private removeAdapterListeners(adapter: IWalletAdapter | null): void {\n if (!adapter) return\n adapter.removeAllListeners()\n }\n\n // ===== Storage =====\n\n /**\n * Save to storage\n */\n private saveToStorage(): void {\n if (typeof window === 'undefined' || !this.config.enableStorage) {\n return\n }\n\n const data: StorageData = {\n current: this.primaryWallet?.currentAccount?.universalAddress || null,\n primaryWalletType: this.primaryWallet?.type,\n primaryChainId: this.primaryWallet?.currentAccount?.chainId,\n history: this.getHistoryRecords(),\n }\n\n try {\n localStorage.setItem(\n `${this.config.storagePrefix}data`,\n JSON.stringify(data)\n )\n } catch (error) {\n console.error('Failed to save wallet data to storage:', error)\n }\n }\n\n /**\n * Restore from storage\n * Returns a Promise that can be used for auto-reconnection\n */\n async restoreFromStorage(): Promise<Account | null> {\n if (typeof window === 'undefined' || !this.config.enableStorage) {\n return null\n }\n\n try {\n const stored = localStorage.getItem(`${this.config.storagePrefix}data`)\n if (!stored) {\n console.debug('[WalletManager] No stored wallet data found')\n return null\n }\n\n const data: StorageData = JSON.parse(stored)\n console.debug('[WalletManager] Restoring from storage:', data)\n \n // Cannot restore if primary wallet info is missing\n if (!data.primaryWalletType || !data.current) {\n console.debug('[WalletManager] Missing primary wallet info in storage')\n return null\n }\n\n // Get adapter\n const adapter = this.registry.getAdapter(data.primaryWalletType)\n if (!adapter) {\n console.debug('[WalletManager] Adapter not found for type:', data.primaryWalletType)\n return null\n }\n\n // Check if wallet is available\n const isAvailable = await adapter.isAvailable()\n if (!isAvailable) {\n console.debug('[WalletManager] Wallet not available:', data.primaryWalletType)\n return null\n }\n\n console.debug('[WalletManager] Wallet is available, attempting restoration')\n\n // For browser wallets (e.g., MetaMask), try to silently get authorized accounts first\n if (adapter.chainType === ChainType.EVM && data.primaryWalletType === WalletType.METAMASK) {\n try {\n // Try to silently get authorized accounts (no popup)\n const provider = typeof window !== 'undefined' ? (window as any).ethereum : null\n if (provider) {\n const accounts = await provider.request({\n method: 'eth_accounts',\n })\n\n console.debug('[WalletManager] Checking authorized accounts:', accounts)\n\n if (accounts && accounts.length > 0) {\n // Check if account matches saved address\n const savedAddress = data.current.split(':')[1] // Extract address from universalAddress\n const currentAddress = accounts[0].toLowerCase()\n \n console.debug('[WalletManager] Comparing addresses - saved:', savedAddress, 'current:', currentAddress)\n \n if (currentAddress === savedAddress.toLowerCase()) {\n // Authorized account found and address matches, call connect directly\n // If account is already authorized, eth_requestAccounts should not popup\n console.debug('[WalletManager] Address matches, attempting connect (should be silent if already authorized)')\n try {\n const account = await adapter.connect(data.primaryChainId)\n \n // Set as primary wallet and setup listeners\n this.setPrimaryWallet(adapter)\n this.connectedWallets.set(adapter.chainType, adapter)\n this.setupAdapterListeners(adapter, true)\n this.emit('accountChanged', account)\n \n console.debug('[WalletManager] Connect successful')\n return account\n } catch (connectError: any) {\n // If connection fails (might be user rejection), fail silently\n console.debug('[WalletManager] Connect failed (might be user rejection):', connectError?.message)\n return null\n }\n } else {\n console.debug('[WalletManager] Address mismatch, will try normal connect')\n }\n } else {\n console.debug('[WalletManager] No authorized accounts found')\n }\n }\n } catch (silentError) {\n // Silent connection failed, continue with normal connection\n console.debug('Silent connection failed, trying normal connection:', silentError)\n }\n }\n\n // For TronLink, similar handling\n if (adapter.chainType === ChainType.TRON && data.primaryWalletType === WalletType.TRONLINK) {\n try {\n const tronWeb = (adapter as any).getTronWeb?.()\n if (tronWeb && tronWeb.defaultAddress?.base58) {\n // TronLink is authorized, connect directly\n const account = await adapter.connect(data.primaryChainId)\n \n // Set as primary wallet\n this.setPrimaryWallet(adapter)\n this.connectedWallets.set(adapter.chainType, adapter)\n this.setupAdapterListeners(adapter, true)\n this.emit('accountChanged', account)\n \n return account\n }\n } catch (silentError) {\n console.debug('Silent TronLink connection failed:', silentError)\n }\n }\n\n // For WalletConnect Tron, use restoreSession method to avoid re-initialization\n if (data.primaryWalletType === WalletType.WALLETCONNECT_TRON) {\n try {\n // Use restoreSession method which initializes provider once and checks for existing session\n const wcAdapter = adapter as any\n if (typeof wcAdapter.restoreSession === 'function') {\n console.debug('[WalletManager] Attempting to restore WalletConnect Tron session...')\n const account = await wcAdapter.restoreSession(data.primaryChainId)\n \n if (account) {\n // Session restored successfully\n console.debug('[WalletManager] WalletConnect Tron session restored successfully')\n \n // Set as primary wallet\n this.setPrimaryWallet(adapter)\n this.connectedWallets.set(adapter.chainType, adapter)\n this.setupAdapterListeners(adapter, true)\n this.emit('accountChanged', account)\n \n return account\n } else {\n console.debug('[WalletManager] No valid WalletConnect Tron session found')\n // No valid session found - don't try to connect again as it will cause duplicate initialization\n // Just return null to indicate restoration failed\n return null\n }\n }\n } catch (restoreError) {\n console.debug('[WalletManager] WalletConnect Tron restore failed:', restoreError)\n // Don't try to connect again - restoration failed, user needs to manually connect\n return null\n }\n }\n\n // Try normal connection (may popup) - only for non-WalletConnect Tron wallets\n const account = await adapter.connect(data.primaryChainId)\n\n // Set as primary wallet\n this.setPrimaryWallet(adapter)\n this.connectedWallets.set(adapter.chainType, adapter)\n this.setupAdapterListeners(adapter, true)\n\n // Don't save to storage here again to avoid loop\n this.emit('accountChanged', account)\n\n return account\n } catch (error) {\n // Silently handle errors, might be user rejection or wallet unavailable\n console.debug('Failed to restore wallet from storage:', error)\n return null\n }\n }\n\n /**\n * Clear storage\n */\n private clearStorage(): void {\n if (typeof window === 'undefined') {\n return\n }\n\n try {\n localStorage.removeItem(`${this.config.storagePrefix}data`)\n } catch (error) {\n console.error('Failed to clear wallet data from storage:', error)\n }\n }\n\n /**\n * Get history records\n */\n private getHistoryRecords(): WalletHistoryRecord[] {\n const records: WalletHistoryRecord[] = []\n\n for (const adapter of this.connectedWallets.values()) {\n if (adapter.currentAccount) {\n records.push({\n universalAddress: adapter.currentAccount.universalAddress,\n nativeAddress: adapter.currentAccount.nativeAddress,\n chainId: adapter.currentAccount.chainId,\n chainType: adapter.chainType,\n walletType: adapter.type,\n lastConnected: Date.now(),\n name: adapter.currentAccount.name,\n })\n }\n }\n\n return records\n }\n}\n\n","/**\n * QR Code Signer\n * \n * 二维码签名工具类,支持生成二维码并轮询签名结果\n */\n\nimport QRCode from 'qrcode'\nimport { SignatureRejectedError, NetworkError } from '../core/errors'\n\n/**\n * 二维码签名配置\n */\nexport interface QRCodeSignerConfig {\n /** 签名请求 ID(用于轮询结果) */\n requestId: string\n /** 签名请求 URL(二维码内容) */\n requestUrl: string\n /** 轮询结果的后端 API URL */\n pollUrl?: string\n /** 轮询间隔(毫秒),默认 2000ms */\n pollInterval?: number\n /** 超时时间(毫秒),默认 300000ms (5分钟) */\n timeout?: number\n /** 自定义轮询函数 */\n pollFn?: (requestId: string) => Promise<QRCodeSignResult | null>\n}\n\n/**\n * 二维码签名结果\n */\nexport interface QRCodeSignResult {\n /** 签名是否完成 */\n completed: boolean\n /** 签名结果(hex string) */\n signature?: string\n /** 错误信息 */\n error?: string\n /** 签名者地址 */\n signer?: string\n}\n\n/**\n * 二维码签名状态\n */\nexport enum QRCodeSignStatus {\n /** 等待扫描 */\n WAITING = 'waiting',\n /** 已扫描,等待确认 */\n PENDING = 'pending',\n /** 签名成功 */\n SUCCESS = 'success',\n /** 签名失败 */\n FAILED = 'failed',\n /** 超时 */\n TIMEOUT = 'timeout',\n /** 已取消 */\n CANCELLED = 'cancelled',\n}\n\n/**\n * QR Code Signer\n * \n * 用于生成二维码并轮询签名结果的工具类\n */\nexport class QRCodeSigner {\n private config: Required<Omit<QRCodeSignerConfig, 'pollFn'>> & { pollFn?: QRCodeSignerConfig['pollFn'] }\n private pollTimer: NodeJS.Timeout | null = null\n private timeoutTimer: NodeJS.Timeout | null = null\n private status: QRCodeSignStatus = QRCodeSignStatus.WAITING\n private qrCodeDataUrl: string | null = null\n private result: QRCodeSignResult | null = null\n\n constructor(config: QRCodeSignerConfig) {\n this.config = {\n requestId: config.requestId,\n requestUrl: config.requestUrl,\n pollUrl: config.pollUrl || '',\n pollInterval: config.pollInterval || 2000,\n timeout: config.timeout || 300000, // 5 minutes\n pollFn: config.pollFn,\n }\n }\n\n /**\n * 生成二维码图片(Data URL)\n */\n async generateQRCode(options?: {\n width?: number\n margin?: number\n color?: {\n dark?: string\n light?: string\n }\n }): Promise<string> {\n if (this.qrCodeDataUrl) {\n return this.qrCodeDataUrl\n }\n\n try {\n const qrCodeOptions: QRCode.QRCodeToDataURLOptions = {\n width: options?.width || 300,\n margin: options?.margin || 2,\n color: {\n dark: options?.color?.dark || '#000000',\n light: options?.color?.light || '#FFFFFF',\n },\n }\n\n this.qrCodeDataUrl = await QRCode.toDataURL(this.config.requestUrl, qrCodeOptions)\n return this.qrCodeDataUrl\n } catch (error) {\n throw new Error(`Failed to generate QR code: ${error instanceof Error ? error.message : String(error)}`)\n }\n }\n\n /**\n * 开始轮询签名结果\n */\n async startPolling(\n onStatusChange?: (status: QRCodeSignStatus) => void,\n onResult?: (result: QRCodeSignResult) => void\n ): Promise<string> {\n if (this.status === QRCodeSignStatus.SUCCESS && this.result?.signature) {\n return this.result.signature\n }\n\n if (this.status === QRCodeSignStatus.CANCELLED || this.status === QRCodeSignStatus.TIMEOUT) {\n throw new SignatureRejectedError('Signature request was cancelled or timed out')\n }\n\n // 设置超时\n this.timeoutTimer = setTimeout(() => {\n this.stopPolling()\n this.status = QRCodeSignStatus.TIMEOUT\n onStatusChange?.(this.status)\n throw new SignatureRejectedError('Signature request timed out')\n }, this.config.timeout)\n\n // 开始轮询\n return new Promise<string>((resolve, reject) => {\n const poll = async () => {\n try {\n let result: QRCodeSignResult | null = null\n\n if (this.config.pollFn) {\n // 使用自定义轮询函数\n result = await this.config.pollFn(this.config.requestId)\n } else if (this.config.pollUrl) {\n // 使用默认 HTTP 轮询\n result = await this.defaultPoll(this.config.requestId)\n } else {\n // 没有轮询配置,等待用户手动完成\n return\n }\n\n if (result?.completed) {\n this.stopPolling()\n this.result = result\n\n if (result.signature) {\n this.status = QRCodeSignStatus.SUCCESS\n onStatusChange?.(this.status)\n onResult?.(result)\n resolve(result.signature)\n } else if (result.error) {\n this.status = QRCodeSignStatus.FAILED\n onStatusChange?.(this.status)\n reject(new SignatureRejectedError(result.error))\n }\n } else if (result) {\n // 已扫描但未完成\n if (this.status === QRCodeSignStatus.WAITING) {\n this.status = QRCodeSignStatus.PENDING\n onStatusChange?.(this.status)\n }\n // 继续轮询\n this.pollTimer = setTimeout(poll, this.config.pollInterval)\n } else {\n // 继续轮询\n this.pollTimer = setTimeout(poll, this.config.pollInterval)\n }\n } catch (error) {\n this.stopPolling()\n this.status = QRCodeSignStatus.FAILED\n onStatusChange?.(this.status)\n reject(error)\n }\n }\n\n // 开始第一次轮询\n poll()\n })\n }\n\n /**\n * 默认 HTTP 轮询函数\n */\n private async defaultPoll(requestId: string): Promise<QRCodeSignResult | null> {\n if (!this.config.pollUrl) {\n return null\n }\n\n try {\n const url = `${this.config.pollUrl}?requestId=${encodeURIComponent(requestId)}`\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n if (response.status === 404) {\n // 请求不存在,继续轮询\n return null\n }\n throw new NetworkError(`Poll request failed: ${response.statusText}`)\n }\n\n const data = await response.json()\n return {\n completed: data.completed === true,\n signature: data.signature,\n error: data.error,\n signer: data.signer,\n }\n } catch (error) {\n if (error instanceof NetworkError) {\n throw error\n }\n // 网络错误,继续轮询\n return null\n }\n }\n\n /**\n * 停止轮询\n */\n stopPolling(): void {\n if (this.pollTimer) {\n clearTimeout(this.pollTimer)\n this.pollTimer = null\n }\n if (this.timeoutTimer) {\n clearTimeout(this.timeoutTimer)\n this.timeoutTimer = null\n }\n }\n\n /**\n * 取消签名请求\n */\n cancel(): void {\n this.stopPolling()\n this.status = QRCodeSignStatus.CANCELLED\n }\n\n /**\n * 获取当前状态\n */\n getStatus(): QRCodeSignStatus {\n return this.status\n }\n\n /**\n * 获取二维码 URL\n */\n getQRCodeUrl(): string {\n return this.config.requestUrl\n }\n\n /**\n * 获取结果\n */\n getResult(): QRCodeSignResult | null {\n return this.result\n }\n\n /**\n * 清理资源\n */\n cleanup(): void {\n this.stopPolling()\n this.qrCodeDataUrl = null\n this.result = null\n this.status = QRCodeSignStatus.WAITING\n }\n}\n\n\n\n\n\n\n\n\n\n\n","/**\n * @enclave-hq/wallet-sdk\n * \n * Multi-chain wallet adapter for Enclave\n * Supports EVM and Tron ecosystems\n */\n\n// ===== Core =====\nexport { WalletManager } from './core/wallet-manager'\nexport { AdapterRegistry } from './core/adapter-registry'\n\n// ===== Types =====\nexport type {\n Account,\n UniversalAddress,\n ISigner,\n IWalletAdapter,\n WalletManagerConfig,\n WalletManagerEvents,\n ConnectedWallet,\n ContractReadParams,\n ContractWriteParams,\n TransactionReceipt,\n AddChainParams,\n WalletHistoryRecord,\n StorageData,\n WalletAvailability,\n EVMTransaction,\n TronTransaction,\n Transaction,\n} from './core/types'\n\nexport {\n ChainType,\n WalletType,\n WalletState,\n} from './core/types'\n\n// ===== Errors =====\nexport {\n WalletSDKError,\n WalletNotConnectedError,\n WalletNotAvailableError,\n ConnectionRejectedError,\n ChainNotSupportedError,\n SignatureRejectedError,\n TransactionFailedError,\n MethodNotSupportedError,\n ConfigurationError,\n NetworkError,\n} from './core/errors'\n\n// ===== Adapters =====\nexport { WalletAdapter } from './adapters/base/wallet-adapter'\nexport { BrowserWalletAdapter } from './adapters/base/browser-wallet-adapter'\nexport { MetaMaskAdapter } from './adapters/evm/metamask'\nexport { WalletConnectAdapter } from './adapters/evm/wallet-connect'\nexport { TronLinkAdapter } from './adapters/tron/tronlink'\nexport { WalletConnectTronAdapter } from './adapters/tron/wallet-connect'\nexport { EVMPrivateKeyAdapter } from './adapters/evm/private-key'\n// Deep Link (通用深度链接,与 WalletConnect 同级)\nexport { DeepLinkAdapter, DeepLinkProviderType } from './adapters/deep-link/adapter'\nexport { IDeepLinkProvider } from './adapters/deep-link/providers/base'\nexport { TokenPocketDeepLinkProvider } from './adapters/deep-link/providers/tokenpocket'\nexport { TronLinkDeepLinkProvider } from './adapters/deep-link/providers/tronlink'\nexport { ImTokenDeepLinkProvider } from './adapters/deep-link/providers/imtoken'\nexport { MetaMaskDeepLinkProvider } from './adapters/deep-link/providers/metamask'\nexport { OKXDeepLinkProvider } from './adapters/deep-link/providers/okx'\n// Legacy: 保留旧的 TronDeepLinkAdapter 以保持向后兼容\nexport { TronDeepLinkAdapter, DeepLinkWalletType } from './adapters/tron/deep-link'\n\n// ===== Auth =====\nexport { AuthMessageGenerator } from './auth/message-generator'\nexport { SignatureVerifier } from './auth/signature-verifier'\nexport type { AuthMessageParams } from './auth/message-generator'\n\n// ===== Detection =====\nexport { WalletDetector } from './detection/detector'\nexport { SUPPORTED_WALLETS, getWalletMetadata, getEVMWallets, getTronWallets } from './detection/supported-wallets'\nexport type { WalletMetadata } from './detection/supported-wallets'\n\n// ===== Utils =====\nexport {\n createUniversalAddress,\n parseUniversalAddress,\n isValidUniversalAddress,\n getChainIdFromUniversalAddress,\n getAddressFromUniversalAddress,\n compareUniversalAddresses,\n} from './utils/address/universal-address'\n\n// QR Code Signer\nexport { QRCodeSigner } from './utils/qrcode-signer'\nexport type {\n QRCodeSignerConfig,\n QRCodeSignResult,\n} from './utils/qrcode-signer'\nexport { QRCodeSignStatus } from './utils/qrcode-signer'\n\nexport {\n isValidEVMAddress,\n formatEVMAddress,\n compareEVMAddresses,\n shortenAddress,\n} from './utils/address/evm-utils'\n\nexport {\n isValidTronAddress,\n isValidTronHexAddress,\n compareTronAddresses,\n shortenTronAddress,\n} from './utils/address/tron-converter'\n\nexport {\n CHAIN_INFO,\n getChainInfo,\n getChainType,\n isEVMChain,\n isTronChain,\n} from './utils/chain-info'\n\nexport type { ChainInfo } from './utils/chain-info'\n\nexport {\n validateAddress,\n validateAddressForChain,\n isValidChainId,\n isValidSignature,\n isValidTransactionHash,\n} from './utils/validation'\n\nexport {\n isHex,\n toHex,\n fromHex,\n numberToHex,\n hexToNumber,\n ensureHexPrefix,\n removeHexPrefix,\n} from './utils/hex'\n\n// ===== Default Export =====\nimport { WalletManager as WM } from './core/wallet-manager'\nexport default WM\n\n","/**\n * TRON Deep Link Adapter\n * \n * Supports deep linking to mobile TRON wallets (TokenPocket, TronLink, etc.)\n * Uses wallet-specific URL schemes to launch mobile wallet apps\n * \n * References:\n * - TokenPocket: https://help.tokenpocket.pro/developer-cn/scan-protocol/tron\n * - TronLink: https://docs.tronlink.org/zh/mobile/deeplink\n */\n\nimport { WalletAdapter } from '../base/wallet-adapter'\nimport {\n WalletType,\n ChainType,\n WalletState,\n Account,\n ContractReadParams,\n ContractWriteParams,\n TransactionReceipt,\n} from '../../core/types'\nimport { \n ConnectionRejectedError, \n SignatureRejectedError,\n MethodNotSupportedError,\n} from '../../core/errors'\n\n/**\n * Supported deep link wallet types\n */\nexport enum DeepLinkWalletType {\n TOKENPOCKET = 'tokenpocket',\n TRONLINK = 'tronlink',\n}\n\n/**\n * TRON Deep Link Adapter\n * \n * Supports connecting to mobile TRON wallets via deep links\n * This is useful when WalletConnect is not available or when you want\n * to directly launch a specific wallet app\n */\nexport class TronDeepLinkAdapter extends WalletAdapter {\n readonly type = WalletType.TRONLINK // Reuse TRONLINK type for now\n readonly chainType = ChainType.TRON\n readonly name: string\n readonly icon: string\n\n private walletType: DeepLinkWalletType\n private callbackUrl?: string\n private callbackSchema?: string\n private pendingActions: Map<string, { resolve: (value: any) => void; reject: (error: any) => void }> = new Map()\n\n // TRON Mainnet chain ID\n private static readonly TRON_MAINNET_CHAIN_ID = 195\n\n constructor(\n walletType: DeepLinkWalletType = DeepLinkWalletType.TOKENPOCKET,\n options?: {\n callbackUrl?: string\n callbackSchema?: string\n }\n ) {\n super()\n this.walletType = walletType\n this.callbackUrl = options?.callbackUrl\n this.callbackSchema = options?.callbackSchema\n \n // Set name and icon based on wallet type\n if (walletType === DeepLinkWalletType.TOKENPOCKET) {\n this.name = 'TokenPocket (Deep Link)'\n this.icon = 'https://tokenpocket.pro/icon.png'\n } else if (walletType === DeepLinkWalletType.TRONLINK) {\n this.name = 'TronLink (Deep Link)'\n this.icon = 'https://www.tronlink.org/static/logoIcon.svg'\n } else {\n this.name = 'TRON Deep Link'\n this.icon = 'https://www.tronlink.org/static/logoIcon.svg'\n }\n\n // Setup callback handler for TokenPocket\n if (walletType === DeepLinkWalletType.TOKENPOCKET && typeof window !== 'undefined') {\n this.setupCallbackHandler()\n }\n }\n\n /**\n * Setup callback handler for TokenPocket deep link results\n * \n * According to TokenPocket docs:\n * - callbackUrl: Wallet sends result to this URL (server-side callback)\n * - callbackSchema: Wallet launches H5 app through this schema (client-side callback)\n * \n * For H5 apps, we use callbackSchema to receive results in the same page\n */\n private setupCallbackHandler(): void {\n if (typeof window === 'undefined') {\n return\n }\n\n // Listen for page visibility change (user returns from wallet app)\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') {\n console.log('[TronDeepLink] Page became visible, user may have returned from wallet app')\n // Check if there's a callback in URL parameters\n this.checkCallbackFromUrl()\n }\n })\n\n // Check URL parameters on load (in case app was opened via callbackSchema)\n this.checkCallbackFromUrl()\n }\n\n /**\n * Check if callback result is in URL parameters\n * TokenPocket may append callback results to URL when using callbackSchema\n */\n private checkCallbackFromUrl(): void {\n if (typeof window === 'undefined') {\n return\n }\n\n const urlParams = new URLSearchParams(window.location.search)\n const actionId = urlParams.get('actionId')\n const result = urlParams.get('result')\n const error = urlParams.get('error')\n\n if (actionId && this.pendingActions.has(actionId)) {\n const { resolve, reject } = this.pendingActions.get(actionId)!\n \n if (error) {\n reject(new Error(error))\n } else if (result) {\n try {\n const parsedResult = JSON.parse(decodeURIComponent(result))\n resolve(parsedResult)\n } catch (e) {\n resolve(result)\n }\n }\n \n this.pendingActions.delete(actionId)\n \n // Clean URL\n const newUrl = window.location.pathname\n window.history.replaceState({}, '', newUrl)\n }\n }\n\n /**\n * Check if deep link is available (mobile device or Telegram Mini App)\n * \n * Note: In Telegram Mini App, we're more lenient - even if platform detection\n * fails, deep links may still work, so the caller should handle Telegram Mini App\n * separately if needed.\n */\n async isAvailable(): Promise<boolean> {\n if (typeof window === 'undefined') {\n return false\n }\n\n // Check if in Telegram Mini App (which can run on mobile)\n // @ts-ignore\n const isTelegramMiniApp = !!(window.Telegram && window.Telegram.WebApp)\n if (isTelegramMiniApp) {\n // @ts-ignore\n const platform = window.Telegram.WebApp.platform || 'unknown'\n // @ts-ignore\n const version = window.Telegram.WebApp.version || 'unknown'\n \n // Telegram Mini App on mobile platforms (ios, android) can use deep links\n // Even on web platform, deep links might work in some cases\n // So we return true for Telegram Mini App to be more permissive\n console.log(`[TronDeepLink] Telegram Mini App detected, platform: ${platform}, version: ${version}`)\n \n // If platform is unknown, try to detect from user agent\n if (platform === 'unknown') {\n const userAgent = navigator.userAgent || ''\n if (/iPhone|iPad|iPod/i.test(userAgent)) {\n console.log(`[TronDeepLink] Detected iOS from user agent`)\n } else if (/Android/i.test(userAgent)) {\n console.log(`[TronDeepLink] Detected Android from user agent`)\n }\n }\n \n // Return true for Telegram Mini App - let the app decide based on platform\n // The example app can handle this more gracefully\n return true\n }\n\n // Deep links work on mobile devices\n const isMobile = /Mobile|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent\n )\n\n return isMobile\n }\n\n\n /**\n * Connect wallet via deep link\n * \n * IMPORTANT: Deep links for TRON wallets are primarily for SIGNING, not connection.\n * TokenPocket and TronLink deep links support:\n * - Signing transactions: tron:signTransaction-version=1.0&protocol=TokenPocket&network=tron&chain_id=195&data={...}\n * - Signing messages: tron:signMessage-version=1.0&protocol=TokenPocket&network=tron&chain_id=195&data={...}\n * \n * For CONNECTION, you should use:\n * - WalletConnect (recommended for mobile)\n * - Browser extension (TronWeb/TronLink)\n * \n * Note: You can sign directly using signMessage() or signTransaction() without calling connect() first.\n * The wallet app will open and use the user's account automatically.\n * \n * This method attempts to open the wallet app, but cannot establish a connection\n * or retrieve the wallet address directly. The user must complete connection\n * through WalletConnect or browser extension after opening the app.\n */\n async connect(chainId?: number | number[]): Promise<Account> {\n if (typeof window === 'undefined') {\n throw new Error('Deep link requires a browser environment')\n }\n\n // For deep link adapter, use first chain ID if array is provided\n const targetChainId = Array.isArray(chainId) \n ? (chainId[0] || TronDeepLinkAdapter.TRON_MAINNET_CHAIN_ID) \n : (chainId || TronDeepLinkAdapter.TRON_MAINNET_CHAIN_ID)\n\n try {\n this.setState(WalletState.CONNECTING)\n\n // Check if deep link is available (mobile device or Telegram Mini App)\n const isAvailable = await this.isAvailable()\n if (!isAvailable) {\n // @ts-ignore\n const isTelegram = !!(window.Telegram && window.Telegram.WebApp)\n if (isTelegram) {\n // @ts-ignore\n const platform = window.Telegram?.WebApp?.platform || 'unknown'\n throw new Error(\n `Deep link is not available in Telegram Mini App on ${platform} platform. ` +\n `Please use WalletConnect or browser extension, or test on a mobile device.`\n )\n } else {\n throw new Error('Deep link is only available on mobile devices or Telegram Mini App. Please use WalletConnect or browser extension.')\n }\n }\n\n // Construct deep link URL to open wallet app\n let deepLinkUrl = ''\n \n if (this.walletType === DeepLinkWalletType.TOKENPOCKET) {\n // TokenPocket: Open app (connection must be done via WalletConnect)\n // TokenPocket deep links are for signing, not connection\n // But we can open the app to help user get started\n // Using tpoutside:// format (official format)\n const actionId = `web-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`\n const param = {\n action: 'login', // Login action to open wallet\n actionId: actionId,\n blockchains: [{\n chainId: String(targetChainId),\n network: 'tron'\n }],\n dappName: 'Enclave Wallet SDK',\n dappIcon: 'https://walletconnect.com/walletconnect-logo.svg',\n protocol: 'TokenPocket',\n version: '1.0',\n expired: 1602, // 30 minutes\n }\n const encodedParam = encodeURIComponent(JSON.stringify(param))\n deepLinkUrl = `tpoutside://pull.activity?param=${encodedParam}`\n } else if (this.walletType === DeepLinkWalletType.TRONLINK) {\n // TronLink: Open app\n deepLinkUrl = `tronlink://open?action=connect&network=tron`\n }\n\n if (!deepLinkUrl) {\n throw new Error(`Unsupported wallet type: ${this.walletType}`)\n }\n\n console.log(`[TronDeepLink] ===== Connect via Deep Link =====`)\n console.log(`[TronDeepLink] Wallet Type:`, this.walletType)\n console.log(`[TronDeepLink] Chain ID:`, targetChainId)\n console.log(`[TronDeepLink] Deep Link URL:`, deepLinkUrl)\n console.log(`[TronDeepLink] Note: Deep links are for signing, not connection. ` +\n `After opening the app, please use WalletConnect to establish connection.`)\n console.log(`[TronDeepLink] ==================================`)\n\n // Open deep link\n // This will attempt to open the wallet app\n window.location.href = deepLinkUrl\n\n // Wait a bit for the app to open\n await new Promise(resolve => setTimeout(resolve, 1000))\n\n // Deep links cannot return connection status or address\n // User must complete connection via WalletConnect or browser extension\n throw new ConnectionRejectedError(\n `已打开 ${this.walletType === DeepLinkWalletType.TOKENPOCKET ? 'TokenPocket' : 'TronLink'} 应用。\\n\\n` +\n `注意:深度链接主要用于签名交易,不能直接建立连接。\\n\\n` +\n `请使用以下方式完成连接:\\n` +\n `1. 在钱包应用中使用 WalletConnect 扫描二维码\\n` +\n `2. 或使用浏览器扩展(如 TronLink)连接\\n\\n` +\n `Deep link opened ${this.walletType} app. ` +\n `Please use WalletConnect or browser extension to complete the connection.`\n )\n\n } catch (error: any) {\n this.setState(WalletState.ERROR)\n this.setAccount(null)\n\n if (error instanceof ConnectionRejectedError) {\n throw error\n }\n\n throw new Error(`Failed to open ${this.walletType} via deep link: ${error.message}`)\n }\n }\n\n /**\n * Disconnect wallet\n */\n async disconnect(): Promise<void> {\n this.setState(WalletState.DISCONNECTED)\n this.setAccount(null)\n }\n\n /**\n * Sign message via deep link\n * \n * TokenPocket deep link format for signing:\n * tron:signMessage-version=1.0&protocol=TokenPocket&network=tron&chain_id=195&data={message}\n * \n * Reference: https://help.tokenpocket.pro/developer-cn/scan-protocol/tron\n * \n * Note: Deep links can sign directly without establishing a connection first.\n * The wallet app will open and use the user's account to sign the message.\n * The signature result will be returned via callback URL or app-to-app communication.\n */\n async signMessage(message: string): Promise<string> {\n // Deep links don't require connection - they directly open the wallet app\n // The wallet app already has the user's account information\n\n if (typeof window === 'undefined') {\n throw new Error('Deep link requires a browser environment')\n }\n\n const isAvailable = await this.isAvailable()\n if (!isAvailable) {\n // @ts-ignore\n const isTelegram = !!(window.Telegram && window.Telegram.WebApp)\n if (isTelegram) {\n // @ts-ignore\n const platform = window.Telegram?.WebApp?.platform || 'unknown'\n throw new Error(\n `Deep link signing is not available in Telegram Mini App on ${platform} platform. ` +\n `Please use WalletConnect or test on a mobile device.`\n )\n } else {\n throw new Error('Deep link signing is only available on mobile devices or Telegram Mini App.')\n }\n }\n\n // Construct deep link for signing\n let deepLinkUrl = ''\n \n if (this.walletType === DeepLinkWalletType.TOKENPOCKET) {\n // TokenPocket sign message deep link\n // Using tpoutside://pull.activity format (recommended by official docs)\n // See: https://help.tokenpocket.pro/developer-en/wallet/pull-up-wallet-with-deeplink\n // \n // Alternative format (QRCode Protocol): tron:signMessage-version=1.0&protocol=TokenPocket&network=tron&chain_id=195&data={message}\n // But this format may not work reliably, so we use tpoutside:// format\n \n // Generate unique actionId\n const actionId = `web-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`\n \n // Build param object according to TokenPocket docs\n const param = {\n action: 'sign',\n actionId: actionId,\n message: message,\n hash: false,\n signType: 'ethPersonalSign', // For TRON, we use ethPersonalSign as it's similar\n memo: 'TRON message signature',\n blockchains: [{\n chainId: '195', // TRON Mainnet chain ID as string\n network: 'tron'\n }],\n dappName: 'Enclave Wallet SDK',\n dappIcon: 'https://walletconnect.com/walletconnect-logo.svg',\n protocol: 'TokenPocket',\n version: '1.1.8',\n expired: 0, // No expiration\n // callbackUrl: optional, if you want to receive callback\n // callbackSchema: optional, custom schema for callback\n }\n \n const encodedParam = encodeURIComponent(JSON.stringify(param))\n deepLinkUrl = `tpoutside://pull.activity?param=${encodedParam}`\n \n console.log(`[TronDeepLink] Using TokenPocket tpoutside:// format for signMessage`)\n console.log(`[TronDeepLink] Param object:`, param)\n } else if (this.walletType === DeepLinkWalletType.TRONLINK) {\n // TronLink sign message deep link (if supported)\n const encodedMessage = encodeURIComponent(message)\n deepLinkUrl = `tronlink://signMessage?message=${encodedMessage}`\n }\n\n if (!deepLinkUrl) {\n throw new MethodNotSupportedError('signMessage', this.type)\n }\n\n console.log(`[TronDeepLink] ===== Sign Message via Deep Link =====`)\n console.log(`[TronDeepLink] Wallet Type:`, this.walletType)\n console.log(`[TronDeepLink] Message:`, message)\n console.log(`[TronDeepLink] Deep Link URL:`, deepLinkUrl)\n console.log(`[TronDeepLink] Full URL length:`, deepLinkUrl.length)\n console.log(`[TronDeepLink] ========================================`)\n\n // Open deep link\n window.location.href = deepLinkUrl\n\n // Note: Deep links don't return the signature directly\n // The wallet app will handle signing and may return the result via callback\n // This is a limitation of deep link approach\n throw new Error(\n `Deep link opened ${this.walletType} for signing. ` +\n `The signature will be handled by the wallet app. ` +\n `This adapter cannot retrieve the signature directly from deep links. ` +\n `Consider using WalletConnect or browser extension for programmatic signing.`\n )\n }\n\n /**\n * Sign transaction via deep link\n * \n * TokenPocket deep link format:\n * tron:signTransaction-version=1.0&protocol=TokenPocket&network=tron&chain_id=195&data={transaction}\n * \n * Reference: https://help.tokenpocket.pro/developer-cn/scan-protocol/tron\n * \n * Note: Deep links can sign directly without establishing a connection first.\n * The wallet app will open and use the user's account to sign the transaction.\n * The transaction data should be a JSON string containing the TRON transaction object.\n * The signature result will be returned via callback URL or app-to-app communication.\n */\n async signTransaction(transaction: any): Promise<string> {\n // Deep links don't require connection - they directly open the wallet app\n // The wallet app already has the user's account information\n\n if (typeof window === 'undefined') {\n throw new Error('Deep link requires a browser environment')\n }\n\n const isAvailable = await this.isAvailable()\n if (!isAvailable) {\n // @ts-ignore\n const isTelegram = !!(window.Telegram && window.Telegram.WebApp)\n if (isTelegram) {\n // @ts-ignore\n const platform = window.Telegram?.WebApp?.platform || 'unknown'\n throw new Error(\n `Deep link signing is not available in Telegram Mini App on ${platform} platform. ` +\n `Please use WalletConnect or test on a mobile device.`\n )\n } else {\n throw new Error('Deep link signing is only available on mobile devices or Telegram Mini App.')\n }\n }\n\n // Construct deep link for transaction signing\n let deepLinkUrl = ''\n let actionId = ''\n let param: any = null\n \n if (this.walletType === DeepLinkWalletType.TOKENPOCKET) {\n // TokenPocket sign transaction deep link\n // Using tpoutside://pull.activity format (recommended by official docs)\n // See: https://help.tokenpocket.pro/developer-en/wallet/pull-up-wallet-with-deeplink\n // \n // Alternative format (QRCode Protocol): tron:signTransaction-version=1.0&protocol=TokenPocket&network=tron&chain_id=195&data={transaction}\n // But this format may not work reliably, so we use tpoutside:// format\n \n // Generate unique actionId\n actionId = `web-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`\n \n // Prepare transaction data\n let transactionData: string\n if (typeof transaction === 'string') {\n transactionData = transaction\n } else if (transaction.raw_data_hex) {\n // If transaction has raw_data_hex, use it directly\n transactionData = JSON.stringify(transaction)\n } else {\n // Convert transaction object to JSON string\n transactionData = JSON.stringify(transaction)\n }\n \n // Build param object according to TokenPocket docs\n // See: https://help.tokenpocket.pro/developer-en/wallet/pull-up-wallet-with-deeplink\n // For TRON, we need to convert the transaction to the format TokenPocket expects\n param = {\n action: 'pushTransaction',\n actionId: actionId,\n txData: transactionData, // Transaction data as JSON string\n blockchains: [{\n chainId: '195', // TRON Mainnet chain ID as string\n network: 'tron'\n }],\n dappName: 'Enclave Wallet SDK',\n dappIcon: 'https://walletconnect.com/walletconnect-logo.svg',\n protocol: 'TokenPocket',\n version: '1.1.8',\n expired: 0, // No expiration\n }\n\n // Add callback configuration\n // callbackUrl: Server-side callback (wallet sends POST request to this URL)\n // callbackSchema: Client-side callback (wallet opens H5 app with this schema)\n // For H5 apps, callbackSchema is more suitable\n if (this.callbackSchema) {\n param.callbackSchema = this.callbackSchema\n } else if (this.callbackUrl) {\n param.callbackUrl = this.callbackUrl\n } else {\n // Default: use current page URL as callbackSchema\n // TokenPocket will append ?actionId=xxx&result=xxx to the URL\n if (typeof window !== 'undefined' && window.location) {\n param.callbackSchema = `${window.location.protocol}//${window.location.host}${window.location.pathname}`\n }\n }\n \n const encodedParam = encodeURIComponent(JSON.stringify(param))\n deepLinkUrl = `tpoutside://pull.activity?param=${encodedParam}`\n \n console.log(`[TronDeepLink] Using TokenPocket tpoutside:// format for signTransaction`)\n console.log(`[TronDeepLink] Param object (without txData):`, { ...param, txData: '[TRANSACTION DATA]' })\n } else if (this.walletType === DeepLinkWalletType.TRONLINK) {\n // TronLink sign transaction deep link (if supported)\n // Reference: https://docs.tronlink.org/zh/mobile/deeplink\n const transactionData = typeof transaction === 'string' \n ? transaction \n : JSON.stringify(transaction)\n const encodedData = encodeURIComponent(transactionData)\n deepLinkUrl = `tronlink://signTransaction?transaction=${encodedData}`\n }\n\n if (!deepLinkUrl) {\n throw new MethodNotSupportedError('signTransaction', this.type)\n }\n\n console.log(`[TronDeepLink] ===== Sign Transaction via Deep Link =====`)\n console.log(`[TronDeepLink] Wallet Type:`, this.walletType)\n console.log(`[TronDeepLink] Transaction:`, transaction)\n console.log(`[TronDeepLink] Transaction keys:`, transaction ? Object.keys(transaction) : 'N/A')\n if (transaction && typeof transaction === 'object') {\n console.log(`[TronDeepLink] Transaction has raw_data:`, !!transaction.raw_data)\n console.log(`[TronDeepLink] Transaction has raw_data_hex:`, !!transaction.raw_data_hex)\n console.log(`[TronDeepLink] Transaction has txID:`, !!transaction.txID)\n }\n if (actionId) {\n console.log(`[TronDeepLink] Action ID:`, actionId)\n }\n if (param) {\n console.log(`[TronDeepLink] Callback Schema:`, param.callbackSchema || param.callbackUrl || 'None')\n }\n console.log(`[TronDeepLink] Deep Link URL:`, deepLinkUrl)\n console.log(`[TronDeepLink] Full URL length:`, deepLinkUrl.length)\n if (deepLinkUrl.length > 200) {\n console.log(`[TronDeepLink] URL (first 200 chars):`, deepLinkUrl.substring(0, 200) + '...')\n console.log(`[TronDeepLink] URL (last 100 chars):`, '...' + deepLinkUrl.substring(deepLinkUrl.length - 100))\n }\n console.log(`[TronDeepLink] ===========================================`)\n\n // For TokenPocket with callbackSchema, we can wait for the callback\n if (this.walletType === DeepLinkWalletType.TOKENPOCKET && param && param.callbackSchema) {\n // Create a promise that will be resolved when callback is received\n return new Promise<string>((resolve, reject) => {\n this.pendingActions.set(actionId, { resolve, reject })\n \n // Open deep link\n window.location.href = deepLinkUrl\n \n // Set timeout (30 seconds)\n setTimeout(() => {\n if (this.pendingActions.has(actionId)) {\n this.pendingActions.delete(actionId)\n reject(new Error('Transaction signature timeout: No response from wallet app'))\n }\n }, 30000)\n })\n }\n\n // Open deep link\n window.location.href = deepLinkUrl\n\n // Note: Deep links don't return the signature directly\n throw new SignatureRejectedError(\n `已打开 ${this.walletType === DeepLinkWalletType.TOKENPOCKET ? 'TokenPocket' : 'TronLink'} 进行交易签名。\\n\\n` +\n `注意:深度链接无法直接返回签名结果。\\n\\n` +\n `签名结果将通过以下方式返回:\\n` +\n `1. 钱包应用的回调 URL\\n` +\n `2. 应用间通信(App-to-App)\\n\\n` +\n `如需程序化获取签名,请使用 WalletConnect 或浏览器扩展。\\n\\n` +\n `Deep link opened ${this.walletType} for transaction signing. ` +\n `The signature will be handled by the wallet app via callback. ` +\n `For programmatic signing, use WalletConnect or browser extension.`\n )\n }\n\n /**\n * Read contract (not supported via deep link)\n */\n async readContract<T = any>(_params: ContractReadParams): Promise<T> {\n throw new MethodNotSupportedError('readContract', this.type)\n }\n\n /**\n * Write contract (not supported via deep link)\n */\n async writeContract(_params: ContractWriteParams): Promise<string> {\n throw new MethodNotSupportedError('writeContract', this.type)\n }\n\n /**\n * Estimate gas (not supported)\n */\n async estimateGas(_params: ContractWriteParams): Promise<bigint> {\n throw new MethodNotSupportedError('estimateGas', this.type)\n }\n\n /**\n * Wait for transaction (not supported)\n */\n async waitForTransaction(_txHash: string, _confirmations?: number): Promise<TransactionReceipt> {\n throw new MethodNotSupportedError('waitForTransaction', this.type)\n }\n\n /**\n * Get provider (not applicable for deep links)\n */\n getProvider(): any {\n return null\n }\n}\n\n","/**\n * 认证消息生成器\n */\n\nimport { ChainType } from '../core/types'\n\n/**\n * 认证消息参数\n */\nexport interface AuthMessageParams {\n domain: string\n nonce: string\n chainId: number\n timestamp: number\n statement?: string\n}\n\n/**\n * 认证消息生成器\n */\nexport class AuthMessageGenerator {\n constructor(private readonly domain: string) {}\n\n /**\n * 生成认证消息\n */\n generateAuthMessage(\n chainType: ChainType,\n nonce: string,\n chainId: number,\n timestamp: number = Date.now(),\n statement?: string\n ): string {\n switch (chainType) {\n case ChainType.EVM:\n return this.generateEIP191Message({\n domain: this.domain,\n nonce,\n chainId,\n timestamp,\n statement,\n })\n case ChainType.TRON:\n return this.generateTIP191Message({\n domain: this.domain,\n nonce,\n chainId,\n timestamp,\n statement,\n })\n default:\n throw new Error(`Unsupported chain type: ${chainType}`)\n }\n }\n\n /**\n * 生成 EIP-191 格式的认证消息\n */\n private generateEIP191Message(params: AuthMessageParams): string {\n const lines = [\n `${params.domain} wants you to sign in.`,\n '',\n ]\n\n if (params.statement) {\n lines.push(params.statement, '')\n }\n\n lines.push(\n `Nonce: ${params.nonce}`,\n `Chain ID: ${params.chainId}`,\n `Issued At: ${new Date(params.timestamp).toISOString()}`\n )\n\n return lines.join('\\n')\n }\n\n /**\n * 生成 TIP-191 格式的认证消息\n */\n private generateTIP191Message(params: AuthMessageParams): string {\n // TIP-191 与 EIP-191 格式相同,但使用 \"Tron\" 而不是 \"Ethereum\"\n const lines = [\n `${params.domain} wants you to sign in with your Tron account.`,\n '',\n ]\n\n if (params.statement) {\n lines.push(params.statement, '')\n }\n\n lines.push(\n `Nonce: ${params.nonce}`,\n `Chain ID: ${params.chainId}`,\n `Issued At: ${new Date(params.timestamp).toISOString()}`\n )\n\n return lines.join('\\n')\n }\n\n /**\n * 生成随机 nonce\n */\n static generateNonce(): string {\n const array = new Uint8Array(16)\n crypto.getRandomValues(array)\n return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('')\n }\n}\n\n\n","/**\n * 签名验证器\n */\n\nimport { verifyMessage } from 'viem'\nimport { ChainType } from '../core/types'\n\n/**\n * 签名验证器\n */\nexport class SignatureVerifier {\n /**\n * 验证签名\n */\n async verifySignature(\n message: string,\n signature: string,\n expectedAddress: string,\n chainType: ChainType\n ): Promise<boolean> {\n switch (chainType) {\n case ChainType.EVM:\n return this.verifyEIP191Signature(message, signature, expectedAddress)\n case ChainType.TRON:\n return this.verifyTIP191Signature(message, signature, expectedAddress)\n default:\n throw new Error(`Unsupported chain type: ${chainType}`)\n }\n }\n\n /**\n * 验证 EIP-191 签名\n */\n private async verifyEIP191Signature(\n message: string,\n signature: string,\n expectedAddress: string\n ): Promise<boolean> {\n try {\n const isValid = await verifyMessage({\n address: expectedAddress as `0x${string}`,\n message,\n signature: signature as `0x${string}`,\n })\n\n return isValid\n } catch (error) {\n console.error('EIP-191 signature verification failed:', error)\n return false\n }\n }\n\n /**\n * 验证 TIP-191 签名\n * 注意:这里需要 TronWeb 或类似库来验证 Tron 签名\n * 这是一个占位实现\n */\n private async verifyTIP191Signature(\n _message: string,\n _signature: string,\n _expectedAddress: string\n ): Promise<boolean> {\n // TODO: 实现 Tron 签名验证\n // 需要使用 TronWeb 的 verifyMessage 方法\n console.warn('TIP-191 signature verification not implemented yet')\n return false\n }\n}\n\n","/**\n * Wallet Detector\n */\n\nimport { WalletType, ChainType, WalletAvailability } from '../core/types'\nimport { SUPPORTED_WALLETS } from './supported-wallets'\n\n/**\n * Wallet Detector\n */\nexport class WalletDetector {\n /**\n * Detect all wallet availability\n */\n async detectAllWallets(): Promise<WalletAvailability[]> {\n const walletTypes = Object.values(WalletType).filter(\n type => type !== WalletType.PRIVATE_KEY // Private key wallet does not need detection\n )\n\n const results = await Promise.all(\n walletTypes.map(type => this.detectWallet(type))\n )\n\n return results\n }\n\n /**\n * Detect specific wallet\n */\n async detectWallet(walletType: WalletType): Promise<WalletAvailability> {\n const metadata = SUPPORTED_WALLETS[walletType]\n \n if (!metadata) {\n return {\n walletType,\n chainType: ChainType.EVM, // Default\n isAvailable: false,\n detected: false,\n }\n }\n\n const isAvailable = await this.isWalletAvailable(walletType)\n\n return {\n walletType,\n chainType: metadata.chainType,\n isAvailable,\n downloadUrl: metadata.downloadUrl,\n detected: isAvailable,\n }\n }\n\n /**\n * Determine if wallet is available\n */\n private async isWalletAvailable(walletType: WalletType): Promise<boolean> {\n if (typeof window === 'undefined') {\n return false\n }\n\n switch (walletType) {\n case WalletType.METAMASK:\n return this.isMetaMaskAvailable()\n\n case WalletType.TRONLINK:\n return this.isTronLinkAvailable()\n\n case WalletType.COINBASE_WALLET:\n return this.isCoinbaseWalletAvailable()\n\n case WalletType.WALLETCONNECT:\n case WalletType.WALLETCONNECT_TRON:\n // WalletConnect does not need installation, always available\n return true\n\n case WalletType.PRIVATE_KEY:\n // Private key wallet is always available\n return true\n\n default:\n return false\n }\n }\n\n /**\n * 检测 MetaMask(现在支持所有 window.ethereum 钱包)\n */\n private isMetaMaskAvailable(): boolean {\n const w = window as any\n // 支持所有提供 window.ethereum 接口的钱包\n return !!w.ethereum\n }\n\n /**\n * 检测 TronWeb 兼容钱包\n * 支持所有提供 window.tronWeb 或 window.tronLink 接口的钱包\n * 包括但不限于:TronLink、TokenPocket 等\n */\n private isTronLinkAvailable(): boolean {\n const w = window as any\n // 检测 window.tronWeb(所有 TronWeb 兼容钱包都提供)\n // 或 window.tronLink(TronLink 特定)\n return !!(w.tronLink || w.tronWeb)\n }\n\n /**\n * 检测 Coinbase Wallet\n */\n private isCoinbaseWalletAvailable(): boolean {\n const w = window as any\n return !!(w.ethereum && w.ethereum.isCoinbaseWallet)\n }\n\n /**\n * 等待钱包加载(有些钱包可能延迟注入)\n */\n async waitForWallet(\n walletType: WalletType,\n timeout: number = 3000\n ): Promise<boolean> {\n const startTime = Date.now()\n\n while (Date.now() - startTime < timeout) {\n if (await this.isWalletAvailable(walletType)) {\n return true\n }\n await new Promise(resolve => setTimeout(resolve, 100))\n }\n\n return false\n }\n}\n\n\n","/**\n * 支持的钱包列表\n */\n\nimport { ChainType, WalletType } from '../core/types'\n\n/**\n * 钱包元数据\n */\nexport interface WalletMetadata {\n type: WalletType\n name: string\n chainType: ChainType\n icon?: string\n downloadUrl?: string\n description?: string\n}\n\n/**\n * 支持的钱包列表\n */\nexport const SUPPORTED_WALLETS: Record<WalletType, WalletMetadata> = {\n [WalletType.METAMASK]: {\n type: WalletType.METAMASK,\n name: 'MetaMask',\n chainType: ChainType.EVM,\n icon: 'https://upload.wikimedia.org/wikipedia/commons/3/36/MetaMask_Fox.svg',\n downloadUrl: 'https://metamask.io/download/',\n description: 'The most popular Ethereum wallet',\n },\n\n [WalletType.WALLETCONNECT]: {\n type: WalletType.WALLETCONNECT,\n name: 'WalletConnect',\n chainType: ChainType.EVM,\n icon: 'https://avatars.githubusercontent.com/u/37784886',\n downloadUrl: 'https://walletconnect.com/',\n description: 'Connect to 170+ wallets',\n },\n\n [WalletType.COINBASE_WALLET]: {\n type: WalletType.COINBASE_WALLET,\n name: 'Coinbase Wallet',\n chainType: ChainType.EVM,\n icon: 'https://www.coinbase.com/img/favicon/favicon-96x96.png',\n downloadUrl: 'https://www.coinbase.com/wallet',\n description: 'Coinbase self-custody wallet',\n },\n\n [WalletType.TRONLINK]: {\n type: WalletType.TRONLINK,\n name: 'TronWeb',\n chainType: ChainType.TRON,\n icon: 'https://www.tronlink.org/static/logoIcon.svg',\n downloadUrl: 'https://www.tronlink.org/',\n description: 'TronWeb 兼容钱包(支持 TronLink、TokenPocket 等)',\n },\n\n [WalletType.WALLETCONNECT_TRON]: {\n type: WalletType.WALLETCONNECT_TRON,\n name: 'WalletConnect (Tron)',\n chainType: ChainType.TRON,\n downloadUrl: 'https://walletconnect.com/',\n description: 'WalletConnect for Tron',\n },\n\n [WalletType.PRIVATE_KEY]: {\n type: WalletType.PRIVATE_KEY,\n name: 'Private Key',\n chainType: ChainType.EVM, // 可以用于任何链\n description: 'Import wallet using private key (for development)',\n },\n\n [WalletType.DEEP_LINK_EVM]: {\n type: WalletType.DEEP_LINK_EVM,\n name: 'Deep Link (EVM)',\n chainType: ChainType.EVM,\n icon: 'https://tokenpocket.pro/icon.png',\n description: 'Deep link connection for EVM chains (TokenPocket, ImToken, etc.)',\n },\n\n [WalletType.DEEP_LINK_TRON]: {\n type: WalletType.DEEP_LINK_TRON,\n name: 'Deep Link (TRON)',\n chainType: ChainType.TRON,\n icon: 'https://tokenpocket.pro/icon.png',\n description: 'Deep link connection for TRON chain (TokenPocket, TronLink, etc.)',\n },\n}\n\n/**\n * 根据类型获取钱包元数据\n */\nexport function getWalletMetadata(type: WalletType): WalletMetadata | undefined {\n return SUPPORTED_WALLETS[type]\n}\n\n/**\n * 获取所有 EVM 钱包\n */\nexport function getEVMWallets(): WalletMetadata[] {\n return Object.values(SUPPORTED_WALLETS).filter(\n wallet => wallet.chainType === ChainType.EVM\n )\n}\n\n/**\n * 获取所有 Tron 钱包\n */\nexport function getTronWallets(): WalletMetadata[] {\n return Object.values(SUPPORTED_WALLETS).filter(\n wallet => wallet.chainType === ChainType.TRON\n )\n}\n\n","/**\n * Tron 地址转换工具\n */\n\n/**\n * 验证 Tron 地址(Base58 格式)\n */\nexport function isValidTronAddress(address: string): boolean {\n // Tron 地址以 T 开头,长度为 34\n if (!address || typeof address !== 'string') {\n return false\n }\n if (address.length !== 34 || !address.startsWith('T')) {\n return false\n }\n // Base58 字符集\n const base58Regex = /^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$/\n return base58Regex.test(address)\n}\n\n/**\n * 验证 Tron 地址(Hex 格式)\n */\nexport function isValidTronHexAddress(address: string): boolean {\n // Tron Hex 地址以 41 开头,长度为 42\n if (!address || typeof address !== 'string') {\n return false\n }\n if (address.length !== 42 || !address.startsWith('41')) {\n return false\n }\n const hexRegex = /^[0-9a-fA-F]+$/\n return hexRegex.test(address.substring(2))\n}\n\n/**\n * 比较两个 Tron 地址是否相同\n */\nexport function compareTronAddresses(a: string, b: string): boolean {\n // 简单比较(实际应该转换为同一格式后比较)\n return a === b\n}\n\n/**\n * 缩短 Tron 地址显示\n * 例如: TJmm...d7PK\n */\nexport function shortenTronAddress(address: string, chars = 4): string {\n if (!isValidTronAddress(address)) {\n return address\n }\n return `${address.substring(0, chars + 1)}...${address.substring(34 - chars)}`\n}\n\n/**\n * 注意:完整的 Tron 地址转换(Base58 <-> Hex)需要额外的库\n * 如 tronweb 或 @tronscan/client\n * 这里只提供基础验证功能\n */\n\n\n","/**\n * 验证工具函数\n */\n\nimport { isValidEVMAddress } from './address/evm-utils'\nimport { isValidTronAddress } from './address/tron-converter'\nimport { ChainType } from '../core/types'\nimport { getChainType } from './chain-info'\n\n/**\n * 根据链类型验证地址\n */\nexport function validateAddress(address: string, chainType: ChainType): boolean {\n switch (chainType) {\n case ChainType.EVM:\n return isValidEVMAddress(address)\n case ChainType.TRON:\n return isValidTronAddress(address)\n default:\n return false\n }\n}\n\n/**\n * 根据链 ID 验证地址\n */\nexport function validateAddressForChain(address: string, chainId: number): boolean {\n const chainType = getChainType(chainId)\n if (!chainType) {\n return false\n }\n return validateAddress(address, chainType)\n}\n\n/**\n * 验证链 ID\n */\nexport function isValidChainId(chainId: number): boolean {\n return Number.isInteger(chainId) && chainId > 0\n}\n\n/**\n * 验证签名\n */\nexport function isValidSignature(signature: string): boolean {\n // 基本验证:以 0x 开头,长度为 132(65 字节)\n return /^0x[0-9a-fA-F]{130}$/.test(signature)\n}\n\n/**\n * 验证交易哈希\n */\nexport function isValidTransactionHash(txHash: string, chainType: ChainType): boolean {\n switch (chainType) {\n case ChainType.EVM:\n // EVM: 0x + 64 hex chars\n return /^0x[0-9a-fA-F]{64}$/.test(txHash)\n case ChainType.TRON:\n // Tron: 64 hex chars (no 0x prefix)\n return /^[0-9a-fA-F]{64}$/.test(txHash)\n default:\n return false\n }\n}\n\n\n","/**\n * Hex 工具函数\n */\n\n/**\n * 判断是否为有效的 Hex 字符串\n */\nexport function isHex(value: string): boolean {\n return /^0x[0-9a-fA-F]*$/.test(value)\n}\n\n/**\n * 将字符串转换为 Hex\n */\nexport function toHex(value: string): string {\n let hex = ''\n for (let i = 0; i < value.length; i++) {\n hex += value.charCodeAt(i).toString(16)\n }\n return `0x${hex}`\n}\n\n/**\n * 将 Hex 转换为字符串\n */\nexport function fromHex(hex: string): string {\n const hexString = hex.startsWith('0x') ? hex.slice(2) : hex\n let str = ''\n for (let i = 0; i < hexString.length; i += 2) {\n str += String.fromCharCode(parseInt(hexString.substr(i, 2), 16))\n }\n return str\n}\n\n/**\n * 将数字转换为 Hex\n */\nexport function numberToHex(value: number | bigint): string {\n return `0x${value.toString(16)}`\n}\n\n/**\n * 将 Hex 转换为数字\n */\nexport function hexToNumber(hex: string): number {\n return parseInt(hex, 16)\n}\n\n/**\n * 确保 Hex 字符串有 0x 前缀\n */\nexport function ensureHexPrefix(value: string): string {\n return value.startsWith('0x') ? value : `0x${value}`\n}\n\n/**\n * 移除 Hex 字符串的 0x 前缀\n */\nexport function removeHexPrefix(value: string): string {\n return value.startsWith('0x') ? value.slice(2) : value\n}\n\n\n"]}
|