@enclave-hq/wallet-sdk 1.1.2 → 1.1.3
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 +22 -22
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +22 -22
- package/dist/index.mjs.map +1 -1
- package/dist/react/index.js +17 -17
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +17 -17
- package/dist/react/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.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":["EventEmitter","ChainUtilsChainType","WalletType","WalletState","isAddress","getAddress","ChainType","createWalletClient","custom","createPublicClient","http","privateKeyToAccount","verifyMessage"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 事件系统\n */\n\nimport EventEmitter from 'eventemitter3'\n\n/**\n * 类型安全的事件发射器\n * 使用类型断言来提供类型安全的 API,同时避免与基类的类型冲突\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 * 钱包类型\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 * 钱包状态\n */\nexport enum WalletState {\n DISCONNECTED = 'disconnected',\n CONNECTING = 'connecting',\n CONNECTED = 'connected',\n ERROR = 'error',\n}\n\n// ========== 账户相关 ==========\n\n/**\n * Universal Address (链无关地址)\n * 格式: \"chainId:address\"\n */\nexport type UniversalAddress = string\n\n/**\n * 账户信息\n */\nexport interface Account {\n /** Universal Address (chainId:address) */\n universalAddress: UniversalAddress\n /** 原生地址(如 0x... 或 T...) */\n nativeAddress: string\n /** 链 ID */\n chainId: number\n /** 链类型 */\n chainType: ChainType\n /** 是否为活跃账户 */\n isActive: boolean\n /** 账户余额(可选) */\n balance?: string\n /** 账户名称(可选) */\n name?: string\n}\n\n// ========== 适配器相关 ==========\n\n/**\n * 钱包适配器接口\n */\nexport interface IWalletAdapter {\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 /** 链类型 */\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 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 * 错误类型定义\n */\n\n/**\n * 基础错误类\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 * 钱包未连接错误\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 * 钱包不可用错误\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 * 连接被拒绝错误\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 * 链不支持错误\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 * 签名被拒绝错误\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 * 交易失败错误\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 * 方法不支持错误\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 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' // 原来的主节点作为最后备选\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 适配器\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 适配器\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 * 连接钱包\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 // 请求账户\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 // 获取当前链 ID\n const currentChainId = await provider.request({\n method: 'eth_chainId',\n })\n const parsedChainId = parseInt(currentChainId, 16)\n\n // 如果指定了链 ID 且不匹配,尝试切换\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 // 创建客户端 (需要指定 chain 以支持 writeContract)\n this.walletClient = createWalletClient({\n account: accounts[0] as `0x${string}`,\n chain: viemChain,\n transport: custom(provider),\n })\n\n // 使用我们配置的 RPC 节点进行读取操作,避免 MetaMask 内部 RPC 问题\n const chainInfo = getChainInfo(finalChainId)\n const primaryRpcUrl = chainInfo?.rpcUrls[0] // 使用第一个(最可靠的)RPC 节点\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 * TronLink 适配器\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 * TronLink 适配器\n */\nexport class TronLinkAdapter extends BrowserWalletAdapter {\n readonly type = WalletType.TRONLINK\n readonly chainType = ChainType.TRON\n readonly name = 'TronLink'\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: TronLink supports two signing methods:\n * - trx.sign(): Signs a transaction object\n * - trx.signMessageV2(): Signs a plain text message (what we use here)\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 */\n protected getBrowserProvider(): any | undefined {\n if (typeof window === 'undefined') {\n return undefined\n }\n const w = window as any\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 not found')\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 // TronLink 事件监听\n if (typeof window === 'undefined') return\n\n const w = window as any\n \n // TronLink 的事件监听方式可能因版本而异\n // 某些版本使用 tronLink.on,某些版本使用 addEventListener\n try {\n if (w.tronLink && typeof w.tronLink.on === 'function') {\n w.tronLink.on('accountsChanged', this.handleAccountsChanged)\n w.tronLink.on('disconnect', this.handleDisconnect)\n } else if (w.tronWeb && w.tronWeb.eventServer) {\n // 备用方案:使用轮询检测账户变化\n this.startPolling()\n }\n } catch (error) {\n console.warn('TronLink event listener setup failed:', 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 w.tronLink.off('accountsChanged', this.handleAccountsChanged)\n w.tronLink.off('disconnect', this.handleDisconnect)\n }\n } catch (error) {\n console.warn('TronLink event listener removal failed:', 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 * 适配器注册表\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 * 适配器注册表\n */\nexport class AdapterRegistry {\n private adapters: Map<WalletType, () => IWalletAdapter> = new Map()\n\n constructor() {\n this.registerDefaultAdapters()\n }\n\n /**\n * 注册默认适配器\n */\n private registerDefaultAdapters(): void {\n // EVM 适配器\n this.register(WalletType.METAMASK, () => new MetaMaskAdapter())\n this.register(WalletType.PRIVATE_KEY, () => new EVMPrivateKeyAdapter())\n\n // Tron 适配器\n this.register(WalletType.TRONLINK, () => new TronLinkAdapter())\n }\n\n /**\n * 注册适配器\n */\n register(type: WalletType, factory: () => IWalletAdapter): void {\n this.adapters.set(type, factory)\n }\n\n /**\n * 获取适配器\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 * 判断适配器是否已注册\n */\n has(type: WalletType): boolean {\n return this.adapters.has(type)\n }\n\n /**\n * 获取所有已注册的适配器类型\n */\n getRegisteredTypes(): WalletType[] {\n return Array.from(this.adapters.keys())\n }\n\n /**\n * 根据链类型获取适配器类型列表\n */\n getAdapterTypesByChainType(chainType: ChainType): WalletType[] {\n const types: WalletType[] = []\n\n for (const type of this.adapters.keys()) {\n const adapter = this.getAdapter(type)\n if (adapter && adapter.chainType === chainType) {\n types.push(type)\n }\n }\n\n return types\n }\n}\n\n\n","/**\n * 钱包管理器(核心)\n */\n\nimport { 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 * 钱包管理器\n */\nexport class WalletManager extends TypedEventEmitter<WalletManagerEvents> {\n private config: Required<WalletManagerConfig>\n private registry: AdapterRegistry\n\n // 主钱包\n private primaryWallet: IWalletAdapter | null = null\n\n // 已连接钱包池\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 // 恢复之前的连接\n if (this.config.enableStorage) {\n this.restoreFromStorage()\n }\n }\n\n // ===== 连接管理 =====\n\n /**\n * 连接主钱包\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 // 检查是否可用\n const isAvailable = await adapter.isAvailable()\n if (!isAvailable) {\n throw new WalletNotAvailableError(type)\n }\n\n // 连接钱包\n const account = await adapter.connect(chainId)\n\n // 设置为主钱包\n this.setPrimaryWallet(adapter)\n\n // 添加到已连接钱包池\n this.connectedWallets.set(adapter.chainType, adapter)\n\n // 设置事件监听\n this.setupAdapterListeners(adapter, true)\n\n // 保存到存储\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n\n return account\n }\n\n /**\n * 连接额外的钱包(不改变主钱包)\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 // 添加到已连接钱包池(不设置为主钱包)\n this.connectedWallets.set(adapter.chainType, adapter)\n\n // 设置事件监听\n this.setupAdapterListeners(adapter, false)\n\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n\n return account\n }\n\n /**\n * 使用私钥连接(仅用于开发/测试)\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 * 断开主钱包\n */\n async disconnect(): Promise<void> {\n if (!this.primaryWallet) {\n return\n }\n\n // 先保存 chainType,因为 disconnect() 后可能被清空\n const chainType = this.primaryWallet.chainType\n\n await this.primaryWallet.disconnect()\n\n // 移除监听\n this.removeAdapterListeners(this.primaryWallet)\n\n // 从已连接钱包池中移除\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 * 断开所有钱包\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 // ===== 主钱包管理 =====\n\n /**\n * 切换主钱包\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 // 移除旧主钱包的监听\n if (this.primaryWallet) {\n this.removeAdapterListeners(this.primaryWallet)\n }\n\n // 设置新主钱包\n this.setPrimaryWallet(adapter)\n\n // 设置新主钱包的监听\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 * 获取主钱包账户\n */\n getPrimaryAccount(): Account | null {\n return this.primaryWallet?.currentAccount || null\n }\n\n /**\n * 获取所有已连接的钱包\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 * 根据链类型获取钱包\n */\n getWalletByChainType(chainType: ChainType): IWalletAdapter | null {\n return this.connectedWallets.get(chainType) || null\n }\n\n // ===== 签名 =====\n\n /**\n * 使用主钱包签名\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 * 使用指定链类型的钱包签名\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 * 签名 TypedData(仅 EVM)\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 * 签名交易(使用主钱包)\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 * 使用指定链类型的钱包签名交易\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 // ===== 链切换 =====\n\n /**\n * 请求切换链(仅 EVM)\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 // 如果链不存在且配置了自动添加\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 // ===== 合约调用 =====\n\n /**\n * 读取合约\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 * 写入合约\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 * 估算 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 * 等待交易确认\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 访问 =====\n\n /**\n * 获取主钱包 Provider\n */\n getProvider(): any {\n if (!this.primaryWallet) {\n throw new WalletNotConnectedError()\n }\n\n return this.primaryWallet.getProvider()\n }\n\n /**\n * 获取指定链类型的 Provider\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 // ===== 私有方法 =====\n\n /**\n * 设置主钱包\n */\n private setPrimaryWallet(adapter: IWalletAdapter): void {\n this.primaryWallet = adapter\n }\n\n /**\n * 判断钱包是否支持链切换\n */\n private canSwitchChain(adapter: IWalletAdapter): boolean {\n return !!adapter.switchChain\n }\n\n /**\n * 设置适配器事件监听\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 * 移除适配器事件监听\n */\n private removeAdapterListeners(adapter: IWalletAdapter | null): void {\n if (!adapter) return\n adapter.removeAllListeners()\n }\n\n // ===== 存储 =====\n\n /**\n * 保存到存储\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 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 * 从存储恢复\n */\n private restoreFromStorage(): void {\n // 注意:自动重连可能需要用户授权,这里只是读取历史记录\n // 实际重连需要用户主动调用 connect()\n }\n\n /**\n * 清除存储\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 * 获取历史记录\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: 'TronLink',\n chainType: ChainType.TRON,\n icon: 'https://www.tronlink.org/static/logoIcon.svg',\n downloadUrl: 'https://www.tronlink.org/',\n description: 'The official Tron wallet',\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 * 钱包检测器\n */\n\nimport { WalletType, ChainType, WalletAvailability } from '../core/types'\nimport { SUPPORTED_WALLETS } from './supported-wallets'\n\n/**\n * 钱包检测器\n */\nexport class WalletDetector {\n /**\n * 检测所有钱包可用性\n */\n async detectAllWallets(): Promise<WalletAvailability[]> {\n const walletTypes = Object.values(WalletType).filter(\n type => type !== WalletType.PRIVATE_KEY // 私钥钱包不需要检测\n )\n\n const results = await Promise.all(\n walletTypes.map(type => this.detectWallet(type))\n )\n\n return results\n }\n\n /**\n * 检测特定钱包\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, // 默认\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 * 判断钱包是否可用\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 不需要安装,总是可用\n return true\n\n case WalletType.PRIVATE_KEY:\n // 私钥钱包总是可用\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 * 检测 TronLink\n */\n private isTronLinkAvailable(): boolean {\n const w = window as any\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 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":["EventEmitter","ChainUtilsChainType","WalletType","WalletState","isAddress","getAddress","ChainType","createWalletClient","custom","createPublicClient","http","privateKeyToAccount","verifyMessage"],"mappings":"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","file":"index.js","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// ========== Adapter Related ==========\n\n/**\n * 钱包适配器接口\n */\nexport interface IWalletAdapter {\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 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 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 * TronLink 适配器\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 * TronLink 适配器\n */\nexport class TronLinkAdapter extends BrowserWalletAdapter {\n readonly type = WalletType.TRONLINK\n readonly chainType = ChainType.TRON\n readonly name = 'TronLink'\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: TronLink supports two signing methods:\n * - trx.sign(): Signs a transaction object\n * - trx.signMessageV2(): Signs a plain text message (what we use here)\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 */\n protected getBrowserProvider(): any | undefined {\n if (typeof window === 'undefined') {\n return undefined\n }\n const w = window as any\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 not found')\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 // TronLink 事件监听\n if (typeof window === 'undefined') return\n\n const w = window as any\n \n // TronLink 的事件监听方式可能因版本而异\n // 某些版本使用 tronLink.on,某些版本使用 addEventListener\n try {\n if (w.tronLink && typeof w.tronLink.on === 'function') {\n w.tronLink.on('accountsChanged', this.handleAccountsChanged)\n w.tronLink.on('disconnect', this.handleDisconnect)\n } else if (w.tronWeb && w.tronWeb.eventServer) {\n // 备用方案:使用轮询检测账户变化\n this.startPolling()\n }\n } catch (error) {\n console.warn('TronLink event listener setup failed:', 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 w.tronLink.off('accountsChanged', this.handleAccountsChanged)\n w.tronLink.off('disconnect', this.handleDisconnect)\n }\n } catch (error) {\n console.warn('TronLink event listener removal failed:', 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 // Restore previous connections\n if (this.config.enableStorage) {\n this.restoreFromStorage()\n }\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 // 移除旧主钱包的监听\n if (this.primaryWallet) {\n this.removeAdapterListeners(this.primaryWallet)\n }\n\n // 设置新主钱包\n this.setPrimaryWallet(adapter)\n\n // 设置新主钱包的监听\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 * 获取主钱包账户\n */\n getPrimaryAccount(): Account | null {\n return this.primaryWallet?.currentAccount || null\n }\n\n /**\n * 获取所有已连接的钱包\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 * 根据链类型获取钱包\n */\n getWalletByChainType(chainType: ChainType): IWalletAdapter | null {\n return this.connectedWallets.get(chainType) || null\n }\n\n // ===== 签名 =====\n\n /**\n * 使用主钱包签名\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 * 使用指定链类型的钱包签名\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 * 签名 TypedData(仅 EVM)\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 * 签名交易(使用主钱包)\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 * 使用指定链类型的钱包签名交易\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 // ===== 链切换 =====\n\n /**\n * 请求切换链(仅 EVM)\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 // 如果链不存在且配置了自动添加\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 // ===== 合约调用 =====\n\n /**\n * 读取合约\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 * 写入合约\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 * 估算 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 * 等待交易确认\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 访问 =====\n\n /**\n * 获取主钱包 Provider\n */\n getProvider(): any {\n if (!this.primaryWallet) {\n throw new WalletNotConnectedError()\n }\n\n return this.primaryWallet.getProvider()\n }\n\n /**\n * 获取指定链类型的 Provider\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 // ===== 私有方法 =====\n\n /**\n * 设置主钱包\n */\n private setPrimaryWallet(adapter: IWalletAdapter): void {\n this.primaryWallet = adapter\n }\n\n /**\n * 判断钱包是否支持链切换\n */\n private canSwitchChain(adapter: IWalletAdapter): boolean {\n return !!adapter.switchChain\n }\n\n /**\n * 设置适配器事件监听\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 * 移除适配器事件监听\n */\n private removeAdapterListeners(adapter: IWalletAdapter | null): void {\n if (!adapter) return\n adapter.removeAllListeners()\n }\n\n // ===== 存储 =====\n\n /**\n * 保存到存储\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 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 * 从存储恢复\n */\n private restoreFromStorage(): void {\n // 注意:自动重连可能需要用户授权,这里只是读取历史记录\n // 实际重连需要用户主动调用 connect()\n }\n\n /**\n * 清除存储\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 * 获取历史记录\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: 'TronLink',\n chainType: ChainType.TRON,\n icon: 'https://www.tronlink.org/static/logoIcon.svg',\n downloadUrl: 'https://www.tronlink.org/',\n description: 'The official Tron wallet',\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 * 检测 TronLink\n */\n private isTronLinkAvailable(): boolean {\n const w = window as any\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 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"]}
|