@enclave-hq/wallet-sdk 1.2.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +98 -21
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +98 -21
- package/dist/index.mjs.map +1 -1
- package/dist/react/index.js +98 -21
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +98 -21
- package/dist/react/index.mjs.map +1 -1
- package/package.json +2 -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\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] params.gasPrice:', params.gasPrice, 'type:', typeof params.gasPrice);\n \n // 处理 gasPrice\n let processedGasPrice: bigint | 'auto' | undefined;\n if (!params.gasPrice) {\n processedGasPrice = undefined;\n } else if (params.gasPrice === 'auto') {\n processedGasPrice = undefined; // viem 会自动获取 gas price\n } else {\n processedGasPrice = BigInt(params.gasPrice);\n }\n \n console.log('🔍 [MetaMask writeContract] processedGasPrice:', processedGasPrice);\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: processedGasPrice,\n } 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 tronWeb = this.getTronWeb()\n\n // 请求连接\n const result = await tronWeb.request({\n method: 'tron_requestAccounts',\n })\n\n if (!result || !result.code || result.code !== 200) {\n throw new ConnectionRejectedError(this.type)\n }\n\n // 获取当前地址\n const address = tronWeb.defaultAddress?.base58\n if (!address) {\n throw new Error('Failed to get Tron address')\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 */\n async readContract<T = any>(params: ContractReadParams): Promise<T> {\n this.ensureConnected()\n\n try {\n const tronWeb = this.getTronWeb()\n \n // 获取合约实例\n const contract = await tronWeb.contract(params.abi, params.address)\n \n // 调用合约方法(只读)\n const result = await contract[params.functionName](...(params.args || [])).call()\n \n return result as T\n } catch (error: any) {\n console.error('Read contract error:', error)\n throw new Error(`Failed to read contract: ${error.message}`)\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 // 使用 triggerSmartContract 触发合约\n const transaction = await tronWeb.transactionBuilder.triggerSmartContract(\n params.address,\n params.functionName + '(' + functionAbi.inputs.map((i: any) => i.type).join(',') + ')',\n options,\n parameter,\n this.currentAccount!.nativeAddress\n )\n \n console.log('[TronLink] Transaction built:', transaction)\n \n // 签名并广播交易\n if (!transaction || !transaction.transaction) {\n throw new Error('Failed to build transaction')\n }\n \n const signedTx = await tronWeb.trx.sign(transaction.transaction)\n const broadcast = await tronWeb.trx.sendRawTransaction(signedTx)\n \n console.log('[TronLink] Broadcast result:', broadcast)\n \n if (!broadcast.result) {\n throw new Error(broadcast.message || 'Transaction broadcast failed')\n }\n \n const txHash = broadcast.txid || broadcast.transaction?.txID\n console.log('[TronLink] Transaction hash:', txHash)\n \n // 返回交易哈希\n return txHash || ''\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\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/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\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] params.gasPrice:', params.gasPrice, 'type:', typeof params.gasPrice);\n \n // 处理 gasPrice\n let processedGasPrice: bigint | 'auto' | undefined;\n if (!params.gasPrice) {\n processedGasPrice = undefined;\n } else if (params.gasPrice === 'auto') {\n processedGasPrice = undefined; // viem 会自动获取 gas price\n } else {\n processedGasPrice = BigInt(params.gasPrice);\n }\n \n console.log('🔍 [MetaMask writeContract] processedGasPrice:', processedGasPrice);\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: processedGasPrice,\n } 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\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"]}
|