@enclave-hq/wallet-sdk 1.1.4 → 1.1.6
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.d.mts +7 -2
- package/dist/index.d.ts +7 -2
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +11 -0
- package/dist/index.mjs.map +1 -1
- package/dist/react/index.d.mts +5 -1
- package/dist/react/index.d.ts +5 -1
- package/dist/react/index.js +11 -0
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +11 -0
- package/dist/react/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/react/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/events.ts","../../src/core/types.ts","../../src/core/errors.ts","../../src/adapters/base/wallet-adapter.ts","../../src/adapters/base/browser-wallet-adapter.ts","../../src/utils/address/universal-address.ts","../../src/utils/address/evm-utils.ts","../../src/utils/chain-info.ts","../../src/adapters/evm/metamask.ts","../../src/adapters/tron/tronlink.ts","../../src/adapters/evm/private-key.ts","../../src/core/adapter-registry.ts","../../src/core/wallet-manager.ts","../../src/react/WalletContext.tsx","../../src/react/hooks/useAccount.ts","../../src/react/hooks/useConnect.ts","../../src/react/hooks/useDisconnect.ts","../../src/react/hooks/useSignMessage.ts","../../src/react/hooks/useSignTransaction.ts"],"names":["ChainUtilsChainType","EventEmitter","ChainType","createWalletClient","http","createPublicClient","account","useState","error"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Event System\n */\n\nimport EventEmitter from 'eventemitter3'\n\n/**\n * Type-safe Event Emitter\n * Uses type assertion to provide type-safe API while avoiding type conflicts with base class\n */\nexport class TypedEventEmitter<\n TEvents extends Record<string, (...args: any[]) => void>\n> {\n private emitter = new EventEmitter()\n\n on<K extends keyof TEvents>(\n event: K,\n handler: TEvents[K]\n ): this {\n this.emitter.on(event as string, handler as any)\n return this\n }\n\n once<K extends keyof TEvents>(\n event: K,\n handler: TEvents[K]\n ): this {\n this.emitter.once(event as string, handler as any)\n return this\n }\n\n off<K extends keyof TEvents>(\n event: K,\n handler: TEvents[K]\n ): this {\n this.emitter.off(event as string, handler as any)\n return this\n }\n\n emit<K extends keyof TEvents>(\n event: K,\n ...args: Parameters<TEvents[K]>\n ): boolean {\n return this.emitter.emit(event as string, ...args)\n }\n\n removeAllListeners<K extends keyof TEvents>(event?: K): this {\n if (event !== undefined) {\n this.emitter.removeAllListeners(event as string)\n } else {\n this.emitter.removeAllListeners()\n }\n return this\n }\n}\n\n","/**\n * Core type definitions\n */\n\nimport { ChainType as ChainUtilsChainType } from '@enclave-hq/chain-utils'\n\n// ========== Enumerations ==========\n\n/**\n * Chain type (re-exported from chain-utils)\n */\nexport const ChainType = ChainUtilsChainType\nexport type ChainType = ChainUtilsChainType\n\n/**\n * Wallet Types\n */\nexport enum WalletType {\n METAMASK = 'metamask',\n WALLETCONNECT = 'walletconnect',\n COINBASE_WALLET = 'coinbase-wallet',\n TRONLINK = 'tronlink',\n WALLETCONNECT_TRON = 'walletconnect-tron',\n PRIVATE_KEY = 'private-key',\n}\n\n/**\n * Wallet States\n */\nexport enum WalletState {\n DISCONNECTED = 'disconnected',\n CONNECTING = 'connecting',\n CONNECTED = 'connected',\n ERROR = 'error',\n}\n\n// ========== Account Related ==========\n\n/**\n * Universal Address (chain-agnostic address)\n * Format: \"chainId:address\"\n */\nexport type UniversalAddress = string\n\n/**\n * Account Information\n */\nexport interface Account {\n /** Universal Address (chainId:address) */\n universalAddress: UniversalAddress\n /** Native address (e.g., 0x... or T...) */\n nativeAddress: string\n /** Chain ID */\n chainId: number\n /** Chain Type */\n chainType: ChainType\n /** Whether this is an active account */\n isActive: boolean\n /** Account balance (optional) */\n balance?: string\n /** Account name (optional) */\n name?: string\n}\n\n// ========== 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 primaryWalletType?: WalletType\n /** 主钱包的 ChainID(用于自动恢复连接) */\n primaryChainId?: number\n /** 历史记录 */\n history: WalletHistoryRecord[]\n}\n\n// ========== 钱包检测 ==========\n\n/**\n * 钱包可用性信息\n */\nexport interface WalletAvailability {\n walletType: WalletType\n chainType: ChainType\n isAvailable: boolean\n downloadUrl?: string\n detected: boolean\n}\n\n","/**\n * Error Type Definitions\n */\n\n/**\n * Base Error Class\n */\nexport class WalletSDKError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: any\n ) {\n super(message)\n this.name = 'WalletSDKError'\n Object.setPrototypeOf(this, WalletSDKError.prototype)\n }\n}\n\n/**\n * Wallet Not Connected Error\n */\nexport class WalletNotConnectedError extends WalletSDKError {\n constructor(walletType?: string) {\n super(\n walletType\n ? `Wallet ${walletType} is not connected`\n : 'No wallet is connected',\n 'WALLET_NOT_CONNECTED',\n { walletType }\n )\n this.name = 'WalletNotConnectedError'\n }\n}\n\n/**\n * Wallet Not Available Error\n */\nexport class WalletNotAvailableError extends WalletSDKError {\n constructor(walletType: string, downloadUrl?: string) {\n super(\n `Wallet ${walletType} is not available. Please install it first.`,\n 'WALLET_NOT_AVAILABLE',\n { walletType, downloadUrl }\n )\n this.name = 'WalletNotAvailableError'\n }\n}\n\n/**\n * Connection Rejected Error\n */\nexport class ConnectionRejectedError extends WalletSDKError {\n constructor(walletType: string) {\n super(\n `Connection to ${walletType} was rejected by user`,\n 'CONNECTION_REJECTED',\n { walletType }\n )\n this.name = 'ConnectionRejectedError'\n }\n}\n\n/**\n * Chain Not Supported Error\n */\nexport class ChainNotSupportedError extends WalletSDKError {\n constructor(chainId: number, walletType: string) {\n super(\n `Chain ${chainId} is not supported by ${walletType}`,\n 'CHAIN_NOT_SUPPORTED',\n { chainId, walletType }\n )\n this.name = 'ChainNotSupportedError'\n }\n}\n\n/**\n * Signature Rejected Error\n */\nexport class SignatureRejectedError extends WalletSDKError {\n constructor(message?: string) {\n super(\n message || 'Signature was rejected by user',\n 'SIGNATURE_REJECTED'\n )\n this.name = 'SignatureRejectedError'\n }\n}\n\n/**\n * Transaction Failed Error\n */\nexport class TransactionFailedError extends WalletSDKError {\n constructor(txHash: string, reason?: string) {\n super(\n `Transaction ${txHash} failed${reason ? `: ${reason}` : ''}`,\n 'TRANSACTION_FAILED',\n { txHash, reason }\n )\n this.name = 'TransactionFailedError'\n }\n}\n\n/**\n * Method Not Supported Error\n */\nexport class MethodNotSupportedError extends WalletSDKError {\n constructor(method: string, walletType: string) {\n super(\n `Method ${method} is not supported by ${walletType}`,\n 'METHOD_NOT_SUPPORTED',\n { method, walletType }\n )\n this.name = 'MethodNotSupportedError'\n }\n}\n\n/**\n * 配置错误\n */\nexport class ConfigurationError extends WalletSDKError {\n constructor(message: string, details?: any) {\n super(message, 'CONFIGURATION_ERROR', details)\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * 网络错误\n */\nexport class NetworkError extends WalletSDKError {\n constructor(message: string, details?: any) {\n super(message, 'NETWORK_ERROR', details)\n this.name = 'NetworkError'\n }\n}\n\n\n","/**\n * 钱包适配器基类\n */\n\nimport EventEmitter from 'eventemitter3'\nimport {\n WalletType,\n ChainType,\n WalletState,\n Account,\n IWalletAdapter,\n ContractReadParams,\n ContractWriteParams,\n TransactionReceipt,\n} from '../../core/types'\nimport { WalletNotConnectedError, MethodNotSupportedError } from '../../core/errors'\n\n/**\n * 钱包适配器基类\n */\nexport abstract class WalletAdapter extends EventEmitter implements IWalletAdapter {\n // 元数据\n abstract readonly type: WalletType\n abstract readonly chainType: ChainType\n abstract readonly name: string\n readonly icon?: string\n\n // 状态\n state: WalletState = WalletState.DISCONNECTED\n currentAccount: Account | null = null\n\n // 连接管理\n abstract connect(chainId?: number): Promise<Account>\n abstract disconnect(): Promise<void>\n abstract isAvailable(): Promise<boolean>\n\n // 签名\n abstract signMessage(message: string): Promise<string>\n\n 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 // Note: No longer auto-restoring connection in constructor\n // Async operations should be handled in WalletProvider by calling restoreFromStorage()\n }\n\n // ===== Connection Management =====\n\n /**\n * Connect primary wallet\n */\n async connect(type: WalletType, chainId?: number): Promise<Account> {\n const adapter = this.registry.getAdapter(type)\n if (!adapter) {\n throw new WalletNotAvailableError(type)\n }\n\n // Check if available\n const isAvailable = await adapter.isAvailable()\n if (!isAvailable) {\n throw new WalletNotAvailableError(type)\n }\n\n // Connect wallet\n const account = await adapter.connect(chainId)\n\n // Set as primary wallet\n this.setPrimaryWallet(adapter)\n\n // Add to connected wallet pool\n this.connectedWallets.set(adapter.chainType, adapter)\n\n // Setup event listeners\n this.setupAdapterListeners(adapter, true)\n\n // Save to storage\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n\n return account\n }\n\n /**\n * Connect additional wallet (without changing primary wallet)\n */\n async connectAdditional(type: WalletType, chainId?: number): Promise<Account> {\n const adapter = this.registry.getAdapter(type)\n if (!adapter) {\n throw new WalletNotAvailableError(type)\n }\n\n const isAvailable = await adapter.isAvailable()\n if (!isAvailable) {\n throw new WalletNotAvailableError(type)\n }\n\n const account = await adapter.connect(chainId)\n\n // Add to connected wallet pool (without setting as primary)\n this.connectedWallets.set(adapter.chainType, adapter)\n\n // Setup event listeners\n this.setupAdapterListeners(adapter, false)\n\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n\n return account\n }\n\n /**\n * Connect with private key (for development/testing only)\n */\n async connectWithPrivateKey(privateKey: string, chainId?: number): Promise<Account> {\n const adapter = new EVMPrivateKeyAdapter()\n adapter.setPrivateKey(privateKey)\n\n const account = await adapter.connect(chainId || this.config.defaultChainId)\n\n this.setPrimaryWallet(adapter)\n this.connectedWallets.set(adapter.chainType, adapter)\n this.setupAdapterListeners(adapter, true)\n\n return account\n }\n\n /**\n * Disconnect primary wallet\n */\n async disconnect(): Promise<void> {\n if (!this.primaryWallet) {\n return\n }\n\n // Save chainType first, as it may be cleared after disconnect()\n const chainType = this.primaryWallet.chainType\n\n await this.primaryWallet.disconnect()\n\n // Remove listeners\n this.removeAdapterListeners(this.primaryWallet)\n\n // Remove from connected wallet pool\n this.connectedWallets.delete(chainType)\n\n this.primaryWallet = null\n\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n\n this.emit('disconnected')\n }\n\n /**\n * Disconnect all wallets\n */\n async disconnectAll(): Promise<void> {\n const wallets = Array.from(this.connectedWallets.values())\n\n for (const wallet of wallets) {\n await wallet.disconnect()\n this.removeAdapterListeners(wallet)\n }\n\n this.primaryWallet = null\n this.connectedWallets.clear()\n\n if (this.config.enableStorage) {\n this.clearStorage()\n }\n\n this.emit('disconnected')\n }\n\n // ===== Primary Wallet Management =====\n\n /**\n * Switch primary wallet\n */\n async switchPrimaryWallet(chainType: ChainType): Promise<Account> {\n const adapter = this.connectedWallets.get(chainType)\n if (!adapter || !adapter.currentAccount) {\n throw new WalletNotConnectedError(`Wallet for chain type ${chainType} not connected`)\n }\n\n const oldPrimary = this.primaryWallet?.currentAccount || null\n\n // Remove listeners from old primary wallet\n if (this.primaryWallet) {\n this.removeAdapterListeners(this.primaryWallet)\n }\n\n // Set new primary wallet\n this.setPrimaryWallet(adapter)\n\n // Setup listeners for new primary wallet\n this.setupAdapterListeners(adapter, true)\n\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n\n this.emit('primaryWalletSwitched', adapter.currentAccount, oldPrimary, chainType)\n\n return adapter.currentAccount\n }\n\n /**\n * Get primary wallet account\n */\n getPrimaryAccount(): Account | null {\n return this.primaryWallet?.currentAccount || null\n }\n\n /**\n * Get all connected wallets\n */\n getConnectedWallets(): ConnectedWallet[] {\n return Array.from(this.connectedWallets.values()).map(adapter => ({\n account: adapter.currentAccount!,\n walletType: adapter.type,\n chainType: adapter.chainType,\n isPrimary: adapter === this.primaryWallet,\n canSwitchChain: this.canSwitchChain(adapter),\n adapter,\n }))\n }\n\n /**\n * Get wallet by chain type\n */\n getWalletByChainType(chainType: ChainType): IWalletAdapter | null {\n return this.connectedWallets.get(chainType) || null\n }\n\n // ===== Signing =====\n\n /**\n * Sign message with primary wallet\n */\n async signMessage(message: string): Promise<string> {\n if (!this.primaryWallet) {\n throw new WalletNotConnectedError()\n }\n\n return this.primaryWallet.signMessage(message)\n }\n\n /**\n * Sign message with wallet of specified chain type\n */\n async signMessageWithChainType(message: string, chainType?: ChainType): Promise<string> {\n if (!chainType) {\n return this.signMessage(message)\n }\n\n const adapter = this.connectedWallets.get(chainType)\n if (!adapter) {\n throw new WalletNotConnectedError(`Wallet for chain type ${chainType}`)\n }\n\n return adapter.signMessage(message)\n }\n\n /**\n * Sign TypedData (EVM only)\n */\n async signTypedData(typedData: any, chainType?: ChainType): Promise<string> {\n const adapter = chainType\n ? this.connectedWallets.get(chainType)\n : this.primaryWallet\n\n if (!adapter) {\n throw new WalletNotConnectedError()\n }\n\n if (!adapter.signTypedData) {\n throw new Error(`signTypedData not supported by ${adapter.type}`)\n }\n\n return adapter.signTypedData(typedData)\n }\n\n /**\n * Sign transaction (with primary wallet)\n */\n async signTransaction(transaction: any): Promise<string> {\n if (!this.primaryWallet) {\n throw new WalletNotConnectedError()\n }\n\n if (!this.primaryWallet.signTransaction) {\n throw new Error(`signTransaction not supported by ${this.primaryWallet.type}`)\n }\n\n return this.primaryWallet.signTransaction(transaction)\n }\n\n /**\n * Sign transaction with wallet of specified chain type\n */\n async signTransactionWithChainType(transaction: any, chainType?: ChainType): Promise<string> {\n if (!chainType) {\n return this.signTransaction(transaction)\n }\n\n const adapter = this.connectedWallets.get(chainType)\n if (!adapter) {\n throw new WalletNotConnectedError(`Wallet for chain type ${chainType}`)\n }\n\n if (!adapter.signTransaction) {\n throw new Error(`signTransaction not supported by ${adapter.type}`)\n }\n\n return adapter.signTransaction(transaction)\n }\n\n // ===== Chain Switching =====\n\n /**\n * Request chain switch (EVM only)\n */\n async requestSwitchChain(chainId: number, options?: {\n addChainIfNotExists?: boolean\n chainConfig?: AddChainParams\n }): Promise<Account> {\n if (!this.primaryWallet) {\n throw new WalletNotConnectedError()\n }\n\n if (!this.primaryWallet.switchChain) {\n throw new Error(`Chain switching not supported by ${this.primaryWallet.type}`)\n }\n\n try {\n await this.primaryWallet.switchChain(chainId)\n return this.primaryWallet.currentAccount!\n } catch (error: any) {\n // If chain doesn't exist and auto-add is configured\n if (options?.addChainIfNotExists && options.chainConfig && this.primaryWallet.addChain) {\n await this.primaryWallet.addChain(options.chainConfig)\n await this.primaryWallet.switchChain(chainId)\n return this.primaryWallet.currentAccount!\n }\n throw error\n }\n }\n\n // ===== Contract Calls =====\n\n /**\n * Read contract\n */\n async readContract<T = any>(\n address: string,\n abi: any[],\n functionName: string,\n args?: any[],\n chainType?: ChainType\n ): Promise<T> {\n const adapter = chainType\n ? this.connectedWallets.get(chainType)\n : this.primaryWallet\n\n if (!adapter) {\n throw new WalletNotConnectedError()\n }\n\n if (!adapter.readContract) {\n throw new Error(`readContract not supported by ${adapter.type}`)\n }\n\n return adapter.readContract({ address, abi, functionName, args })\n }\n\n /**\n * Write contract\n */\n async writeContract(\n address: string,\n abi: any[],\n functionName: string,\n args?: any[],\n options?: {\n value?: string\n gas?: number\n gasPrice?: string\n },\n chainType?: ChainType\n ): Promise<string> {\n const adapter = chainType\n ? this.connectedWallets.get(chainType)\n : this.primaryWallet\n\n if (!adapter) {\n throw new WalletNotConnectedError()\n }\n\n if (!adapter.writeContract) {\n throw new Error(`writeContract not supported by ${adapter.type}`)\n }\n\n return adapter.writeContract({\n address,\n abi,\n functionName,\n args,\n ...options,\n })\n }\n\n /**\n * Estimate gas\n */\n async estimateGas(\n address: string,\n abi: any[],\n functionName: string,\n args?: any[],\n chainType?: ChainType\n ): Promise<bigint> {\n const adapter = chainType\n ? this.connectedWallets.get(chainType)\n : this.primaryWallet\n\n if (!adapter) {\n throw new WalletNotConnectedError()\n }\n\n if (!adapter.estimateGas) {\n throw new Error(`estimateGas not supported by ${adapter.type}`)\n }\n\n return adapter.estimateGas({ address, abi, functionName, args })\n }\n\n /**\n * Wait for transaction confirmation\n */\n async waitForTransaction(\n txHash: string,\n confirmations?: number,\n chainType?: ChainType\n ): Promise<TransactionReceipt> {\n const adapter = chainType\n ? this.connectedWallets.get(chainType)\n : this.primaryWallet\n\n if (!adapter) {\n throw new WalletNotConnectedError()\n }\n\n if (!adapter.waitForTransaction) {\n throw new Error(`waitForTransaction not supported by ${adapter.type}`)\n }\n\n return adapter.waitForTransaction(txHash, confirmations)\n }\n\n // ===== Provider Access =====\n\n /**\n * Get primary wallet Provider\n */\n getProvider(): any {\n if (!this.primaryWallet) {\n throw new WalletNotConnectedError()\n }\n\n return this.primaryWallet.getProvider()\n }\n\n /**\n * Get Provider by chain type\n */\n getProviderByChainType(chainType: ChainType): any {\n const adapter = this.connectedWallets.get(chainType)\n if (!adapter) {\n throw new WalletNotConnectedError(`Wallet for chain type ${chainType}`)\n }\n\n return adapter.getProvider()\n }\n\n // ===== Private Methods =====\n\n /**\n * Set primary wallet\n */\n private setPrimaryWallet(adapter: IWalletAdapter): void {\n this.primaryWallet = adapter\n }\n\n /**\n * Check if wallet supports chain switching\n */\n private canSwitchChain(adapter: IWalletAdapter): boolean {\n return !!adapter.switchChain\n }\n\n /**\n * Setup adapter event listeners\n */\n private setupAdapterListeners(adapter: IWalletAdapter, isPrimary: boolean): void {\n adapter.on('accountChanged', (account: Account | null) => {\n if (isPrimary) {\n this.emit('accountChanged', account)\n }\n this.emit('walletAccountChanged', adapter.chainType, account, isPrimary)\n\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n })\n\n adapter.on('chainChanged', (chainId: number) => {\n if (isPrimary && adapter.currentAccount) {\n this.emit('chainChanged', chainId, adapter.currentAccount)\n }\n if (adapter.currentAccount) {\n this.emit('walletChainChanged', adapter.chainType, chainId, adapter.currentAccount, isPrimary)\n }\n\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n })\n\n adapter.on('disconnected', () => {\n if (isPrimary) {\n this.emit('disconnected')\n }\n this.emit('walletDisconnected', adapter.chainType, isPrimary)\n\n this.connectedWallets.delete(adapter.chainType)\n\n if (adapter === this.primaryWallet) {\n this.primaryWallet = null\n }\n\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n })\n\n adapter.on('error', (error: Error) => {\n this.emit('error', error)\n })\n }\n\n /**\n * Remove adapter event listeners\n */\n private removeAdapterListeners(adapter: IWalletAdapter | null): void {\n if (!adapter) return\n adapter.removeAllListeners()\n }\n\n // ===== Storage =====\n\n /**\n * Save to storage\n */\n private saveToStorage(): void {\n if (typeof window === 'undefined' || !this.config.enableStorage) {\n return\n }\n\n const data: StorageData = {\n current: this.primaryWallet?.currentAccount?.universalAddress || null,\n primaryWalletType: this.primaryWallet?.type,\n primaryChainId: this.primaryWallet?.currentAccount?.chainId,\n history: this.getHistoryRecords(),\n }\n\n try {\n localStorage.setItem(\n `${this.config.storagePrefix}data`,\n JSON.stringify(data)\n )\n } catch (error) {\n console.error('Failed to save wallet data to storage:', error)\n }\n }\n\n /**\n * Restore from storage\n * Returns a Promise that can be used for auto-reconnection\n */\n async restoreFromStorage(): Promise<Account | null> {\n if (typeof window === 'undefined' || !this.config.enableStorage) {\n return null\n }\n\n try {\n const stored = localStorage.getItem(`${this.config.storagePrefix}data`)\n if (!stored) {\n console.debug('[WalletManager] No stored wallet data found')\n return null\n }\n\n const data: StorageData = JSON.parse(stored)\n console.debug('[WalletManager] Restoring from storage:', data)\n \n // Cannot restore if primary wallet info is missing\n if (!data.primaryWalletType || !data.current) {\n console.debug('[WalletManager] Missing primary wallet info in storage')\n return null\n }\n\n // Get adapter\n const adapter = this.registry.getAdapter(data.primaryWalletType)\n if (!adapter) {\n console.debug('[WalletManager] Adapter not found for type:', data.primaryWalletType)\n return null\n }\n\n // Check if wallet is available\n const isAvailable = await adapter.isAvailable()\n if (!isAvailable) {\n console.debug('[WalletManager] Wallet not available:', data.primaryWalletType)\n return null\n }\n\n console.debug('[WalletManager] Wallet is available, attempting restoration')\n\n // For browser wallets (e.g., MetaMask), try to silently get authorized accounts first\n if (adapter.chainType === ChainType.EVM && data.primaryWalletType === WalletType.METAMASK) {\n try {\n // Try to silently get authorized accounts (no popup)\n const provider = typeof window !== 'undefined' ? (window as any).ethereum : null\n if (provider) {\n const accounts = await provider.request({\n method: 'eth_accounts',\n })\n\n console.debug('[WalletManager] Checking authorized accounts:', accounts)\n\n if (accounts && accounts.length > 0) {\n // Check if account matches saved address\n const savedAddress = data.current.split(':')[1] // Extract address from universalAddress\n const currentAddress = accounts[0].toLowerCase()\n \n console.debug('[WalletManager] Comparing addresses - saved:', savedAddress, 'current:', currentAddress)\n \n if (currentAddress === savedAddress.toLowerCase()) {\n // Authorized account found and address matches, call connect directly\n // If account is already authorized, eth_requestAccounts should not popup\n console.debug('[WalletManager] Address matches, attempting connect (should be silent if already authorized)')\n try {\n const account = await adapter.connect(data.primaryChainId)\n \n // Set as primary wallet and setup listeners\n this.setPrimaryWallet(adapter)\n this.connectedWallets.set(adapter.chainType, adapter)\n this.setupAdapterListeners(adapter, true)\n this.emit('accountChanged', account)\n \n console.debug('[WalletManager] Connect successful')\n return account\n } catch (connectError: any) {\n // If connection fails (might be user rejection), fail silently\n console.debug('[WalletManager] Connect failed (might be user rejection):', connectError?.message)\n return null\n }\n } else {\n console.debug('[WalletManager] Address mismatch, will try normal connect')\n }\n } else {\n console.debug('[WalletManager] No authorized accounts found')\n }\n }\n } catch (silentError) {\n // Silent connection failed, continue with normal connection\n console.debug('Silent connection failed, trying normal connection:', silentError)\n }\n }\n\n // For TronLink, similar handling\n if (adapter.chainType === ChainType.TRON && data.primaryWalletType === WalletType.TRONLINK) {\n try {\n const tronWeb = (adapter as any).getTronWeb?.()\n if (tronWeb && tronWeb.defaultAddress?.base58) {\n // TronLink is authorized, connect directly\n const account = await adapter.connect(data.primaryChainId)\n \n // Set as primary wallet\n this.setPrimaryWallet(adapter)\n this.connectedWallets.set(adapter.chainType, adapter)\n this.setupAdapterListeners(adapter, true)\n this.emit('accountChanged', account)\n \n return account\n }\n } catch (silentError) {\n console.debug('Silent TronLink connection failed:', silentError)\n }\n }\n\n // Try normal connection (may popup)\n const account = await adapter.connect(data.primaryChainId)\n\n // Set as primary wallet\n this.setPrimaryWallet(adapter)\n this.connectedWallets.set(adapter.chainType, adapter)\n this.setupAdapterListeners(adapter, true)\n\n // Don't save to storage here again to avoid loop\n this.emit('accountChanged', account)\n\n return account\n } catch (error) {\n // Silently handle errors, might be user rejection or wallet unavailable\n console.debug('Failed to restore wallet from storage:', error)\n return null\n }\n }\n\n /**\n * Clear storage\n */\n private clearStorage(): void {\n if (typeof window === 'undefined') {\n return\n }\n\n try {\n localStorage.removeItem(`${this.config.storagePrefix}data`)\n } catch (error) {\n console.error('Failed to clear wallet data from storage:', error)\n }\n }\n\n /**\n * Get history records\n */\n private getHistoryRecords(): WalletHistoryRecord[] {\n const records: WalletHistoryRecord[] = []\n\n for (const adapter of this.connectedWallets.values()) {\n if (adapter.currentAccount) {\n records.push({\n universalAddress: adapter.currentAccount.universalAddress,\n nativeAddress: adapter.currentAccount.nativeAddress,\n chainId: adapter.currentAccount.chainId,\n chainType: adapter.chainType,\n walletType: adapter.type,\n lastConnected: Date.now(),\n name: adapter.currentAccount.name,\n })\n }\n }\n\n return records\n }\n}\n\n","/**\n * React Context for Wallet SDK\n */\n\nimport React, { createContext, useContext, useEffect, useState, useCallback, ReactNode } from 'react'\nimport { WalletManager } from '../core/wallet-manager'\nimport { Account, WalletType, ConnectedWallet, ChainType } from '../core/types'\n\n/**\n * Wallet Context Type\n */\nexport interface WalletContextValue {\n // State\n walletManager: WalletManager\n account: Account | null\n isConnected: boolean\n connectedWallets: ConnectedWallet[]\n isRestoring: boolean // Whether connection is being restored\n\n // Methods\n connect: (type: WalletType, chainId?: number) => Promise<Account>\n connectAdditional: (type: WalletType, chainId?: number) => Promise<Account>\n disconnect: () => Promise<void>\n switchPrimaryWallet: (chainType: ChainType) => Promise<Account>\n signMessage: (message: string) => Promise<string>\n signTransaction: (transaction: any) => Promise<string>\n}\n\n/**\n * Wallet Context\n */\nconst WalletContext = createContext<WalletContextValue | null>(null)\n\n/**\n * Wallet Provider Props\n */\nexport interface WalletProviderProps {\n children: ReactNode\n walletManager?: WalletManager\n}\n\n/**\n * Wallet Provider\n */\nexport function WalletProvider({ children, walletManager: externalWalletManager }: WalletProviderProps) {\n const [walletManager] = useState(() => externalWalletManager || new WalletManager())\n const [account, setAccount] = useState<Account | null>(null)\n const [connectedWallets, setConnectedWallets] = useState<ConnectedWallet[]>([])\n const [isRestoring, setIsRestoring] = useState(true)\n\n // Update connected wallets list\n const updateConnectedWallets = useCallback(() => {\n setConnectedWallets(walletManager.getConnectedWallets())\n }, [walletManager])\n\n // Connect wallet\n const connect = useCallback(async (type: WalletType, chainId?: number) => {\n const account = await walletManager.connect(type, chainId)\n setAccount(account)\n updateConnectedWallets()\n return account\n }, [walletManager, updateConnectedWallets])\n\n // Connect additional wallet\n const connectAdditional = useCallback(async (type: WalletType, chainId?: number) => {\n const account = await walletManager.connectAdditional(type, chainId)\n updateConnectedWallets()\n return account\n }, [walletManager, updateConnectedWallets])\n\n // Disconnect wallet\n const disconnect = useCallback(async () => {\n await walletManager.disconnect()\n setAccount(null)\n updateConnectedWallets()\n }, [walletManager, updateConnectedWallets])\n\n // Switch primary wallet\n const switchPrimaryWallet = useCallback(async (chainType: ChainType) => {\n const account = await walletManager.switchPrimaryWallet(chainType)\n setAccount(account)\n updateConnectedWallets()\n return account\n }, [walletManager, updateConnectedWallets])\n\n // Sign message\n const signMessage = useCallback(async (message: string) => {\n return walletManager.signMessage(message)\n }, [walletManager])\n\n // Sign transaction\n const signTransaction = useCallback(async (transaction: any) => {\n return walletManager.signTransaction(transaction)\n }, [walletManager])\n\n // Auto-restore connection (only on mount)\n useEffect(() => {\n const restoreConnection = async () => {\n try {\n // Try to restore connection from storage\n const restoredAccount = await walletManager.restoreFromStorage()\n if (restoredAccount) {\n setAccount(restoredAccount)\n updateConnectedWallets()\n }\n } catch (error) {\n console.debug('Failed to restore wallet connection:', error)\n } finally {\n setIsRestoring(false)\n }\n }\n\n restoreConnection()\n }, [walletManager, updateConnectedWallets])\n\n // Listen to events\n useEffect(() => {\n const handleAccountChanged = (newAccount: Account | null) => {\n setAccount(newAccount)\n updateConnectedWallets()\n }\n\n const handleChainChanged = (_chainId: number, newAccount: Account) => {\n setAccount(newAccount)\n updateConnectedWallets()\n }\n\n const handleDisconnected = () => {\n setAccount(null)\n updateConnectedWallets()\n }\n\n const handlePrimaryWalletSwitched = (newPrimary: Account) => {\n setAccount(newPrimary)\n updateConnectedWallets()\n }\n\n walletManager.on('accountChanged', handleAccountChanged)\n walletManager.on('chainChanged', handleChainChanged)\n walletManager.on('disconnected', handleDisconnected)\n walletManager.on('primaryWalletSwitched', handlePrimaryWalletSwitched)\n\n // Initialize account (if already connected)\n if (!isRestoring) {\n const primaryAccount = walletManager.getPrimaryAccount()\n if (primaryAccount) {\n setAccount(primaryAccount)\n updateConnectedWallets()\n }\n }\n\n return () => {\n walletManager.off('accountChanged', handleAccountChanged)\n walletManager.off('chainChanged', handleChainChanged)\n walletManager.off('disconnected', handleDisconnected)\n walletManager.off('primaryWalletSwitched', handlePrimaryWalletSwitched)\n }\n }, [walletManager, updateConnectedWallets, isRestoring])\n\n const value: WalletContextValue = {\n walletManager,\n account,\n isConnected: account !== null,\n connectedWallets,\n isRestoring,\n connect,\n connectAdditional,\n disconnect,\n switchPrimaryWallet,\n signMessage,\n signTransaction,\n }\n\n return <WalletContext.Provider value={value}>{children}</WalletContext.Provider>\n}\n\n/**\n * useWallet Hook\n */\nexport function useWallet(): WalletContextValue {\n const context = useContext(WalletContext)\n if (!context) {\n throw new Error('useWallet must be used within a WalletProvider')\n }\n return context\n}\n\n","/**\n * useAccount Hook\n * 获取当前账户信息\n */\n\nimport { useWallet } from '../WalletContext'\nimport { Account } from '../../core/types'\n\nexport interface UseAccountResult {\n account: Account | null\n isConnected: boolean\n address: string | null\n chainId: number | null\n universalAddress: string | null\n}\n\n/**\n * useAccount Hook\n */\nexport function useAccount(): UseAccountResult {\n const { account, isConnected } = useWallet()\n\n return {\n account,\n isConnected,\n address: account?.nativeAddress || null,\n chainId: account?.chainId || null,\n universalAddress: account?.universalAddress || null,\n }\n}\n\n\n","/**\n * useConnect Hook\n * 连接钱包\n */\n\nimport { useState } from 'react'\nimport { useWallet } from '../WalletContext'\nimport { WalletType, Account } from '../../core/types'\n\nexport interface UseConnectResult {\n connect: (type: WalletType, chainId?: number) => Promise<Account>\n connectAdditional: (type: WalletType, chainId?: number) => Promise<Account>\n isConnecting: boolean\n error: Error | null\n}\n\n/**\n * useConnect Hook\n */\nexport function useConnect(): UseConnectResult {\n const { connect: contextConnect, connectAdditional: contextConnectAdditional } = useWallet()\n const [isConnecting, setIsConnecting] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n\n const connect = async (type: WalletType, chainId?: number): Promise<Account> => {\n setIsConnecting(true)\n setError(null)\n\n try {\n const account = await contextConnect(type, chainId)\n return account\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsConnecting(false)\n }\n }\n\n const connectAdditional = async (type: WalletType, chainId?: number): Promise<Account> => {\n setIsConnecting(true)\n setError(null)\n\n try {\n const account = await contextConnectAdditional(type, chainId)\n return account\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsConnecting(false)\n }\n }\n\n return {\n connect,\n connectAdditional,\n isConnecting,\n error,\n }\n}\n\n\n","/**\n * useDisconnect Hook\n * 断开钱包连接\n */\n\nimport { useState } from 'react'\nimport { useWallet } from '../WalletContext'\n\nexport interface UseDisconnectResult {\n disconnect: () => Promise<void>\n isDisconnecting: boolean\n error: Error | null\n}\n\n/**\n * useDisconnect Hook\n */\nexport function useDisconnect(): UseDisconnectResult {\n const { disconnect: contextDisconnect } = useWallet()\n const [isDisconnecting, setIsDisconnecting] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n\n const disconnect = async (): Promise<void> => {\n setIsDisconnecting(true)\n setError(null)\n\n try {\n await contextDisconnect()\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsDisconnecting(false)\n }\n }\n\n return {\n disconnect,\n isDisconnecting,\n error,\n }\n}\n\n\n","/**\n * useSignMessage Hook\n * 签名消息\n */\n\nimport { useState } from 'react'\nimport { useWallet } from '../WalletContext'\n\nexport interface UseSignMessageResult {\n signMessage: (message: string) => Promise<string>\n isSigning: boolean\n error: Error | null\n}\n\n/**\n * useSignMessage Hook\n */\nexport function useSignMessage(): UseSignMessageResult {\n const { signMessage: contextSignMessage } = useWallet()\n const [isSigning, setIsSigning] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n\n const signMessage = async (message: string): Promise<string> => {\n setIsSigning(true)\n setError(null)\n\n try {\n const signature = await contextSignMessage(message)\n return signature\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsSigning(false)\n }\n }\n\n return {\n signMessage,\n isSigning,\n error,\n }\n}\n\n","/**\n * useSignTransaction Hook\n * 签名交易\n */\n\nimport { useState } from 'react'\nimport { useWallet } from '../WalletContext'\n\nexport interface UseSignTransactionResult {\n signTransaction: (transaction: any) => Promise<string>\n isSigning: boolean\n error: Error | null\n}\n\n/**\n * useSignTransaction Hook\n */\nexport function useSignTransaction(): UseSignTransactionResult {\n const { signTransaction: contextSignTransaction } = useWallet()\n const [isSigning, setIsSigning] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n\n const signTransaction = async (transaction: any): Promise<string> => {\n setIsSigning(true)\n setError(null)\n\n try {\n const signature = await contextSignTransaction(transaction)\n return signature\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsSigning(false)\n }\n }\n\n return {\n signTransaction,\n isSigning,\n error,\n }\n}\n\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/react/WalletContext.tsx","../../src/react/hooks/useAccount.ts","../../src/react/hooks/useConnect.ts","../../src/react/hooks/useDisconnect.ts","../../src/react/hooks/useSignMessage.ts","../../src/react/hooks/useSignTransaction.ts"],"names":["ChainUtilsChainType","EventEmitter","ChainType","createWalletClient","http","createPublicClient","account","useState","error"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Event System\n */\n\nimport EventEmitter from 'eventemitter3'\n\n/**\n * Type-safe Event Emitter\n * Uses type assertion to provide type-safe API while avoiding type conflicts with base class\n */\nexport class TypedEventEmitter<\n TEvents extends Record<string, (...args: any[]) => void>\n> {\n private emitter = new EventEmitter()\n\n on<K extends keyof TEvents>(\n event: K,\n handler: TEvents[K]\n ): this {\n this.emitter.on(event as string, handler as any)\n return this\n }\n\n once<K extends keyof TEvents>(\n event: K,\n handler: TEvents[K]\n ): this {\n this.emitter.once(event as string, handler as any)\n return this\n }\n\n off<K extends keyof TEvents>(\n event: K,\n handler: TEvents[K]\n ): this {\n this.emitter.off(event as string, handler as any)\n return this\n }\n\n emit<K extends keyof TEvents>(\n event: K,\n ...args: Parameters<TEvents[K]>\n ): boolean {\n return this.emitter.emit(event as string, ...args)\n }\n\n removeAllListeners<K extends keyof TEvents>(event?: K): this {\n if (event !== undefined) {\n this.emitter.removeAllListeners(event as string)\n } else {\n this.emitter.removeAllListeners()\n }\n return this\n }\n}\n\n","/**\n * Core type definitions\n */\n\nimport { ChainType as ChainUtilsChainType } from '@enclave-hq/chain-utils'\n\n// ========== Enumerations ==========\n\n/**\n * Chain type (re-exported from chain-utils)\n */\nexport const ChainType = ChainUtilsChainType\nexport type ChainType = ChainUtilsChainType\n\n/**\n * Wallet Types\n */\nexport enum WalletType {\n METAMASK = 'metamask',\n WALLETCONNECT = 'walletconnect',\n COINBASE_WALLET = 'coinbase-wallet',\n TRONLINK = 'tronlink',\n WALLETCONNECT_TRON = 'walletconnect-tron',\n PRIVATE_KEY = 'private-key',\n}\n\n/**\n * Wallet States\n */\nexport enum WalletState {\n DISCONNECTED = 'disconnected',\n CONNECTING = 'connecting',\n CONNECTED = 'connected',\n ERROR = 'error',\n}\n\n// ========== Account Related ==========\n\n/**\n * Universal Address (chain-agnostic address)\n * Format: \"chainId:address\"\n */\nexport type UniversalAddress = string\n\n/**\n * Account Information\n */\nexport interface Account {\n /** Universal Address (chainId:address) */\n universalAddress: UniversalAddress\n /** Native address (e.g., 0x... or T...) */\n nativeAddress: string\n /** Chain ID */\n chainId: number\n /** Chain Type */\n chainType: ChainType\n /** Whether this is an active account */\n isActive: boolean\n /** Account balance (optional) */\n balance?: string\n /** Account name (optional) */\n name?: string\n}\n\n// ========== Signer Interface ==========\n\n/**\n * Signer interface\n * Compatible with Enclave SDK's ISigner interface\n * Provides a unified interface for signing operations\n * \n * Note: The signer should handle the appropriate signature standard:\n * - EIP-191 for EVM chains\n * - TIP-191 for TRON\n * - Other standards for other chains\n */\nexport interface ISigner {\n /**\n * Sign a message (raw message string, not hash)\n * @param message - Raw message string to sign\n * The signer should handle the appropriate signature standard\n * @returns Signature (hex string with 0x prefix)\n */\n signMessage(message: string): Promise<string>;\n\n /**\n * Get the signer's address\n * @returns Address (hex string with 0x prefix for EVM, Base58 for TRON)\n */\n getAddress(): Promise<string>;\n}\n\n// ========== Adapter Related ==========\n\n/**\n * 钱包适配器接口\n * Extends ISigner to provide unified signing interface\n */\nexport interface IWalletAdapter extends ISigner {\n // 元数据\n readonly type: WalletType\n readonly chainType: ChainType\n readonly name: string\n readonly icon?: string\n \n // 状态\n state: WalletState\n currentAccount: Account | null\n \n // 连接管理\n connect(chainId?: number): Promise<Account>\n disconnect(): Promise<void>\n isAvailable(): Promise<boolean>\n \n // 签名\n signMessage(message: string): Promise<string>\n signTransaction?(transaction: Transaction): Promise<string>\n signTypedData?(typedData: any): Promise<string>\n \n // 链切换(仅 EVM 支持)\n switchChain?(chainId: number): Promise<void>\n addChain?(chainConfig: AddChainParams): Promise<void>\n \n // 合约调用\n readContract?<T = any>(params: ContractReadParams): Promise<T>\n writeContract?(params: ContractWriteParams): Promise<string>\n estimateGas?(params: ContractWriteParams): Promise<bigint>\n waitForTransaction?(txHash: string, confirmations?: number): Promise<TransactionReceipt>\n \n // Provider 访问\n getProvider(): any\n getSigner?(): any\n \n // 事件监听\n on(event: string, handler: (...args: any[]) => void): void\n off(event: string, handler: (...args: any[]) => void): void\n removeAllListeners(event?: string): void\n}\n\n/**\n * 合约读取参数\n */\nexport interface ContractReadParams {\n address: string\n abi: any[]\n functionName: string\n args?: any[]\n}\n\n/**\n * 合约写入参数\n */\nexport interface ContractWriteParams extends ContractReadParams {\n value?: string // 发送的原生代币数量(wei)\n gas?: number\n gasPrice?: string\n}\n\n/**\n * EVM 交易参数\n */\nexport interface EVMTransaction {\n to: string\n value?: string | bigint\n data?: string\n gas?: string | bigint\n gasPrice?: string | bigint\n maxFeePerGas?: string | bigint\n maxPriorityFeePerGas?: string | bigint\n nonce?: number\n chainId?: number\n}\n\n/**\n * Tron 交易参数\n */\nexport interface TronTransaction {\n // Tron 交易格式\n txID?: string\n raw_data?: any\n raw_data_hex?: string\n visible?: boolean\n}\n\n/**\n * 通用交易类型\n */\nexport type Transaction = EVMTransaction | TronTransaction\n\n/**\n * 交易回执\n */\nexport interface TransactionReceipt {\n transactionHash: string\n blockNumber: number\n blockHash: string\n from: string\n to?: string\n status: 'success' | 'failed'\n gasUsed: string\n effectiveGasPrice?: string\n logs?: any[]\n}\n\n/**\n * 添加链参数\n */\nexport interface AddChainParams {\n chainId: number\n chainName: string\n nativeCurrency: {\n name: string\n symbol: string\n decimals: number\n }\n rpcUrls: string[]\n blockExplorerUrls?: string[]\n iconUrls?: string[]\n}\n\n// ========== WalletManager 相关 ==========\n\n/**\n * WalletManager 配置\n */\nexport interface WalletManagerConfig {\n /** 是否启用自动存储(localStorage) */\n enableStorage?: boolean\n /** 存储键前缀 */\n storagePrefix?: string\n /** 默认链 ID(EVM) */\n defaultChainId?: number\n /** 默认 Tron 链 ID */\n defaultTronChainId?: number\n /** WalletConnect 项目 ID */\n walletConnectProjectId?: string\n}\n\n/**\n * 已连接的钱包信息\n */\nexport interface ConnectedWallet {\n /** 账户信息 */\n account: Account\n /** 钱包类型 */\n walletType: WalletType\n /** Chain Type */\n chainType: ChainType\n /** 是否为主钱包 */\n isPrimary: boolean\n /** 是否支持链切换 */\n canSwitchChain: boolean\n /** 适配器实例 */\n adapter: IWalletAdapter\n}\n\n// ========== 事件相关 ==========\n\n/**\n * WalletManager 事件类型\n */\nexport interface WalletManagerEvents extends Record<string, (...args: any[]) => void> {\n // 主钱包事件\n accountChanged: (account: Account | null) => void\n chainChanged: (chainId: number, account: Account) => void\n disconnected: () => void\n \n // 任意钱包事件\n walletAccountChanged: (chainType: ChainType, account: Account | null, isPrimary: boolean) => void\n walletChainChanged: (chainType: ChainType, chainId: number, account: Account, isPrimary: boolean) => void\n walletDisconnected: (chainType: ChainType, isPrimary: boolean) => void\n \n // 主钱包切换\n primaryWalletSwitched: (newPrimary: Account, oldPrimary: Account | null, chainType: ChainType) => void\n \n // 错误\n error: (error: Error) => void\n}\n\n// ========== 存储相关 ==========\n\n/**\n * 存储的钱包历史记录\n */\nexport interface WalletHistoryRecord {\n universalAddress: UniversalAddress\n nativeAddress: string\n chainId: number\n chainType: ChainType\n walletType: WalletType\n lastConnected: number // 时间戳\n name?: string\n}\n\n/**\n * 存储的数据结构\n */\nexport interface StorageData {\n /** 当前 Universal Address */\n current: UniversalAddress | null\n /** 主钱包类型(用于自动恢复连接) */\n primaryWalletType?: WalletType\n /** 主钱包的 ChainID(用于自动恢复连接) */\n primaryChainId?: number\n /** 历史记录 */\n history: WalletHistoryRecord[]\n}\n\n// ========== 钱包检测 ==========\n\n/**\n * 钱包可用性信息\n */\nexport interface WalletAvailability {\n walletType: WalletType\n chainType: ChainType\n isAvailable: boolean\n downloadUrl?: string\n detected: boolean\n}\n\n","/**\n * Error Type Definitions\n */\n\n/**\n * Base Error Class\n */\nexport class WalletSDKError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: any\n ) {\n super(message)\n this.name = 'WalletSDKError'\n Object.setPrototypeOf(this, WalletSDKError.prototype)\n }\n}\n\n/**\n * Wallet Not Connected Error\n */\nexport class WalletNotConnectedError extends WalletSDKError {\n constructor(walletType?: string) {\n super(\n walletType\n ? `Wallet ${walletType} is not connected`\n : 'No wallet is connected',\n 'WALLET_NOT_CONNECTED',\n { walletType }\n )\n this.name = 'WalletNotConnectedError'\n }\n}\n\n/**\n * Wallet Not Available Error\n */\nexport class WalletNotAvailableError extends WalletSDKError {\n constructor(walletType: string, downloadUrl?: string) {\n super(\n `Wallet ${walletType} is not available. Please install it first.`,\n 'WALLET_NOT_AVAILABLE',\n { walletType, downloadUrl }\n )\n this.name = 'WalletNotAvailableError'\n }\n}\n\n/**\n * Connection Rejected Error\n */\nexport class ConnectionRejectedError extends WalletSDKError {\n constructor(walletType: string) {\n super(\n `Connection to ${walletType} was rejected by user`,\n 'CONNECTION_REJECTED',\n { walletType }\n )\n this.name = 'ConnectionRejectedError'\n }\n}\n\n/**\n * Chain Not Supported Error\n */\nexport class ChainNotSupportedError extends WalletSDKError {\n constructor(chainId: number, walletType: string) {\n super(\n `Chain ${chainId} is not supported by ${walletType}`,\n 'CHAIN_NOT_SUPPORTED',\n { chainId, walletType }\n )\n this.name = 'ChainNotSupportedError'\n }\n}\n\n/**\n * Signature Rejected Error\n */\nexport class SignatureRejectedError extends WalletSDKError {\n constructor(message?: string) {\n super(\n message || 'Signature was rejected by user',\n 'SIGNATURE_REJECTED'\n )\n this.name = 'SignatureRejectedError'\n }\n}\n\n/**\n * Transaction Failed Error\n */\nexport class TransactionFailedError extends WalletSDKError {\n constructor(txHash: string, reason?: string) {\n super(\n `Transaction ${txHash} failed${reason ? `: ${reason}` : ''}`,\n 'TRANSACTION_FAILED',\n { txHash, reason }\n )\n this.name = 'TransactionFailedError'\n }\n}\n\n/**\n * Method Not Supported Error\n */\nexport class MethodNotSupportedError extends WalletSDKError {\n constructor(method: string, walletType: string) {\n super(\n `Method ${method} is not supported by ${walletType}`,\n 'METHOD_NOT_SUPPORTED',\n { method, walletType }\n )\n this.name = 'MethodNotSupportedError'\n }\n}\n\n/**\n * 配置错误\n */\nexport class ConfigurationError extends WalletSDKError {\n constructor(message: string, details?: any) {\n super(message, 'CONFIGURATION_ERROR', details)\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * 网络错误\n */\nexport class NetworkError extends WalletSDKError {\n constructor(message: string, details?: any) {\n super(message, 'NETWORK_ERROR', details)\n this.name = 'NetworkError'\n }\n}\n\n\n","/**\n * 钱包适配器基类\n */\n\nimport EventEmitter from 'eventemitter3'\nimport {\n WalletType,\n ChainType,\n WalletState,\n Account,\n IWalletAdapter,\n ContractReadParams,\n ContractWriteParams,\n TransactionReceipt,\n} from '../../core/types'\nimport { WalletNotConnectedError, MethodNotSupportedError } from '../../core/errors'\n\n/**\n * 钱包适配器基类\n */\nexport abstract class WalletAdapter extends EventEmitter implements IWalletAdapter {\n // 元数据\n abstract readonly type: WalletType\n abstract readonly chainType: ChainType\n abstract readonly name: string\n readonly icon?: string\n\n // 状态\n state: WalletState = WalletState.DISCONNECTED\n currentAccount: Account | null = null\n\n // 连接管理\n abstract connect(chainId?: number): Promise<Account>\n abstract disconnect(): Promise<void>\n abstract isAvailable(): Promise<boolean>\n\n // 签名\n abstract signMessage(message: string): Promise<string>\n\n /**\n * Get the signer's address (implements ISigner interface)\n * Returns the native address of the current account\n */\n async getAddress(): Promise<string> {\n this.ensureConnected()\n if (!this.currentAccount) {\n throw new WalletNotConnectedError(this.type)\n }\n return this.currentAccount.nativeAddress\n }\n\n signTransaction?(_transaction: any): Promise<string> {\n throw new MethodNotSupportedError('signTransaction', this.type)\n }\n\n signTypedData?(_typedData: any): Promise<string> {\n throw new MethodNotSupportedError('signTypedData', this.type)\n }\n\n // 链切换(默认不支持)\n switchChain?(_chainId: number): Promise<void> {\n throw new MethodNotSupportedError('switchChain', this.type)\n }\n\n addChain?(_chainConfig: any): Promise<void> {\n throw new MethodNotSupportedError('addChain', this.type)\n }\n\n // 合约调用(默认不支持)\n async readContract<T = any>(_params: ContractReadParams): Promise<T> {\n throw new MethodNotSupportedError('readContract', this.type)\n }\n\n async writeContract(_params: ContractWriteParams): Promise<string> {\n throw new MethodNotSupportedError('writeContract', this.type)\n }\n\n async estimateGas(_params: ContractWriteParams): Promise<bigint> {\n throw new MethodNotSupportedError('estimateGas', this.type)\n }\n\n async waitForTransaction(_txHash: string, _confirmations?: number): Promise<TransactionReceipt> {\n throw new MethodNotSupportedError('waitForTransaction', this.type)\n }\n\n // Provider 访问\n abstract getProvider(): any\n\n getSigner?(): any {\n throw new MethodNotSupportedError('getSigner', this.type)\n }\n\n // 工具方法\n protected ensureConnected(): void {\n if (this.state !== WalletState.CONNECTED || !this.currentAccount) {\n throw new WalletNotConnectedError(this.type)\n }\n }\n\n protected setState(state: WalletState): void {\n this.state = state\n }\n\n protected setAccount(account: Account | null): void {\n this.currentAccount = account\n }\n\n protected emitAccountChanged(account: Account | null): void {\n this.emit('accountChanged', account)\n }\n\n protected emitChainChanged(chainId: number): void {\n this.emit('chainChanged', chainId)\n }\n\n protected emitDisconnected(): void {\n this.emit('disconnected')\n }\n\n protected emitError(error: Error): void {\n this.emit('error', error)\n }\n\n // EventEmitter 方法(从 EventEmitter3 继承)\n // removeAllListeners 已经由 EventEmitter 提供\n}\n\n","/**\n * 浏览器钱包适配器基类\n * 用于 MetaMask、TronLink 等浏览器插件钱包\n */\n\nimport { WalletAdapter } from './wallet-adapter'\nimport { WalletState } from '../../core/types'\nimport { WalletNotAvailableError } from '../../core/errors'\n\n/**\n * 浏览器钱包适配器基类\n */\nexport abstract class BrowserWalletAdapter extends WalletAdapter {\n /**\n * 获取浏览器中的钱包 provider\n */\n protected abstract getBrowserProvider(): any | undefined\n\n /**\n * 检查钱包是否可用\n */\n async isAvailable(): Promise<boolean> {\n if (typeof window === 'undefined') {\n return false\n }\n return this.getBrowserProvider() !== undefined\n }\n\n /**\n * 确保钱包已安装\n */\n protected async ensureAvailable(): Promise<void> {\n const isAvailable = await this.isAvailable()\n if (!isAvailable) {\n throw new WalletNotAvailableError(\n this.type,\n this.getDownloadUrl()\n )\n }\n }\n\n /**\n * 获取下载链接\n */\n protected abstract getDownloadUrl(): string\n\n /**\n * 设置事件监听\n */\n protected abstract setupEventListeners(): void\n\n /**\n * 移除事件监听\n */\n protected abstract removeEventListeners(): void\n\n /**\n * 断开连接时清理\n */\n async disconnect(): Promise<void> {\n this.removeEventListeners()\n this.setState(WalletState.DISCONNECTED)\n this.setAccount(null)\n this.emitDisconnected()\n }\n}\n\n\n","/**\n * Universal Address 工具\n * 格式: \"chainId:address\"\n */\n\nimport type { UniversalAddress } from '../../core/types'\n\n/**\n * 创建 Universal Address\n */\nexport function createUniversalAddress(\n chainId: number,\n address: string\n): UniversalAddress {\n return `${chainId}:${address}`\n}\n\n/**\n * 解析 Universal Address\n */\nexport function parseUniversalAddress(universalAddress: UniversalAddress): {\n chainId: number\n address: string\n} | null {\n const parts = universalAddress.split(':')\n if (parts.length !== 2) {\n return null\n }\n \n const chainId = parseInt(parts[0], 10)\n if (isNaN(chainId)) {\n return null\n }\n \n return {\n chainId,\n address: parts[1],\n }\n}\n\n/**\n * 验证 Universal Address 格式\n */\nexport function isValidUniversalAddress(universalAddress: string): boolean {\n return parseUniversalAddress(universalAddress) !== null\n}\n\n/**\n * 从 Universal Address 提取链 ID\n */\nexport function getChainIdFromUniversalAddress(\n universalAddress: UniversalAddress\n): number | null {\n const parsed = parseUniversalAddress(universalAddress)\n return parsed ? parsed.chainId : null\n}\n\n/**\n * 从 Universal Address 提取地址\n */\nexport function getAddressFromUniversalAddress(\n universalAddress: UniversalAddress\n): string | null {\n const parsed = parseUniversalAddress(universalAddress)\n return parsed ? parsed.address : null\n}\n\n/**\n * 比较两个 Universal Address 是否相同\n */\nexport function compareUniversalAddresses(\n a: UniversalAddress,\n b: UniversalAddress\n): boolean {\n return a.toLowerCase() === b.toLowerCase()\n}\n\n\n","/**\n * EVM 地址工具\n */\n\nimport { getAddress, isAddress } from 'viem'\n\n/**\n * 验证 EVM 地址\n */\nexport function isValidEVMAddress(address: string): boolean {\n return isAddress(address)\n}\n\n/**\n * 格式化 EVM 地址(checksum)\n */\nexport function formatEVMAddress(address: string): string {\n if (!isAddress(address)) {\n throw new Error(`Invalid EVM address: ${address}`)\n }\n return getAddress(address)\n}\n\n/**\n * 比较两个 EVM 地址是否相同\n */\nexport function compareEVMAddresses(a: string, b: string): boolean {\n try {\n return getAddress(a) === getAddress(b)\n } catch {\n return false\n }\n}\n\n/**\n * 缩短地址显示\n * 例如: 0x1234...5678\n */\nexport function shortenAddress(address: string, chars = 4): string {\n if (!isAddress(address)) {\n return address\n }\n const formatted = getAddress(address)\n return `${formatted.substring(0, chars + 2)}...${formatted.substring(42 - chars)}`\n}\n\n\n","/**\n * Chain information constants\n */\n\nimport { \n ChainType,\n nativeToSlip44,\n slip44ToNative,\n ChainInfo as ChainUtilsChainInfo\n} from '@enclave-hq/chain-utils'\n\n/**\n * Extended chain information interface (adds RPC and explorer URLs)\n */\nexport interface ChainInfo extends Omit<ChainUtilsChainInfo, 'nativeChainId' | 'slip44'> {\n id: number // Native chain ID\n slip44?: number // SLIP-44 ID (optional)\n nativeCurrency: {\n name: string\n symbol: string\n decimals: number\n }\n rpcUrls: string[]\n blockExplorerUrls?: string[]\n iconUrls?: string[]\n}\n\n/**\n * Predefined chain information\n */\nexport const CHAIN_INFO: Record<number, ChainInfo> = {\n // EVM Mainnet\n 1: {\n id: 1,\n slip44: 60, // Ethereum SLIP-44\n name: 'Ethereum Mainnet',\n chainType: ChainType.EVM,\n symbol: 'ETH',\n nativeCurrency: {\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n rpcUrls: ['https://eth.llamarpc.com'],\n blockExplorerUrls: ['https://etherscan.io'],\n },\n \n // EVM Testnets\n 11155111: {\n id: 11155111,\n name: 'Sepolia Testnet',\n chainType: ChainType.EVM,\n symbol: 'ETH',\n nativeCurrency: {\n name: 'Sepolia Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n rpcUrls: ['https://rpc.sepolia.org'],\n blockExplorerUrls: ['https://sepolia.etherscan.io'],\n },\n \n // Binance Smart Chain\n 56: {\n id: 56,\n slip44: 714, // BSC SLIP-44\n name: 'BNB Smart Chain',\n chainType: ChainType.EVM,\n symbol: 'BNB',\n nativeCurrency: {\n name: 'BNB',\n symbol: 'BNB',\n decimals: 18,\n },\n rpcUrls: ['https://bsc-dataseed.binance.org'],\n blockExplorerUrls: ['https://bscscan.com'],\n },\n \n 97: {\n id: 97,\n name: 'BNB Smart Chain Testnet',\n chainType: ChainType.EVM,\n symbol: 'BNB',\n nativeCurrency: {\n name: 'BNB',\n symbol: 'BNB',\n decimals: 18,\n },\n rpcUrls: [\n 'https://data-seed-prebsc-2-s1.binance.org:8545',\n 'https://data-seed-prebsc-1-s2.binance.org:8545',\n 'https://data-seed-prebsc-2-s2.binance.org:8545',\n 'https://data-seed-prebsc-1-s3.binance.org:8545',\n 'https://data-seed-prebsc-2-s3.binance.org:8545',\n 'https://data-seed-prebsc-1-s1.binance.org:8545' // Original main node as last fallback\n ],\n blockExplorerUrls: ['https://testnet.bscscan.com'],\n },\n \n // Polygon\n 137: {\n id: 137,\n slip44: 966, // Polygon SLIP-44\n name: 'Polygon Mainnet',\n chainType: ChainType.EVM,\n symbol: 'MATIC',\n nativeCurrency: {\n name: 'MATIC',\n symbol: 'MATIC',\n decimals: 18,\n },\n rpcUrls: ['https://polygon-rpc.com'],\n blockExplorerUrls: ['https://polygonscan.com'],\n },\n \n 80002: {\n id: 80002,\n name: 'Polygon Amoy Testnet',\n chainType: ChainType.EVM,\n symbol: 'MATIC',\n nativeCurrency: {\n name: 'MATIC',\n symbol: 'MATIC',\n decimals: 18,\n },\n rpcUrls: ['https://rpc-amoy.polygon.technology'],\n blockExplorerUrls: ['https://www.oklink.com/amoy'],\n },\n \n // Tron\n 195: {\n id: 195,\n slip44: 195, // Tron SLIP-44\n name: 'Tron Mainnet',\n chainType: ChainType.TRON,\n symbol: 'TRX',\n nativeCurrency: {\n name: 'TRX',\n symbol: 'TRX',\n decimals: 6,\n },\n rpcUrls: ['https://api.trongrid.io'],\n blockExplorerUrls: ['https://tronscan.org'],\n },\n \n // Arbitrum\n 42161: {\n id: 42161,\n slip44: 1042161, // Custom SLIP-44 (1000000 + 42161)\n name: 'Arbitrum One',\n chainType: ChainType.EVM,\n symbol: 'ETH',\n nativeCurrency: {\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n rpcUrls: ['https://arb1.arbitrum.io/rpc'],\n blockExplorerUrls: ['https://arbiscan.io'],\n },\n \n // Optimism\n 10: {\n id: 10,\n slip44: 1000010, // Custom SLIP-44 (1000000 + 10)\n name: 'Optimism',\n chainType: ChainType.EVM,\n symbol: 'ETH',\n nativeCurrency: {\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n rpcUrls: ['https://mainnet.optimism.io'],\n blockExplorerUrls: ['https://optimistic.etherscan.io'],\n },\n \n // Avalanche\n 43114: {\n id: 43114,\n slip44: 9000, // Avalanche SLIP-44\n name: 'Avalanche C-Chain',\n chainType: ChainType.EVM,\n symbol: 'AVAX',\n nativeCurrency: {\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 18,\n },\n rpcUrls: ['https://api.avax.network/ext/bc/C/rpc'],\n blockExplorerUrls: ['https://snowtrace.io'],\n },\n}\n\n/**\n * Get chain information\n */\nexport function getChainInfo(chainId: number): ChainInfo | undefined {\n return CHAIN_INFO[chainId]\n}\n\n/**\n * Get chain type\n */\nexport function getChainType(chainId: number): ChainType | undefined {\n return CHAIN_INFO[chainId]?.chainType\n}\n\n/**\n * Check if chain is EVM\n */\nexport function isEVMChain(chainId: number): boolean {\n return getChainType(chainId) === ChainType.EVM\n}\n\n/**\n * Check if chain is Tron\n */\nexport function isTronChain(chainId: number): boolean {\n return getChainType(chainId) === ChainType.TRON\n}\n\n/**\n * Get SLIP-44 ID from native chain ID\n */\nexport function getSlip44(chainId: number): number | null {\n // Check local config first\n const localInfo = CHAIN_INFO[chainId]\n if (localInfo?.slip44) {\n return localInfo.slip44\n }\n \n // Fall back to chain-utils\n return nativeToSlip44(chainId)\n}\n\n/**\n * Get native chain ID from SLIP-44 ID\n */\nexport function getNativeChainId(slip44: number): number | string | null {\n return slip44ToNative(slip44)\n}\n\n/**\n * Get all supported chains (combines local and chain-utils data)\n */\nexport function getAllChains(): ChainInfo[] {\n return Object.values(CHAIN_INFO)\n}\n\n","/**\n * MetaMask Adapter\n */\n\nimport { createWalletClient, createPublicClient, custom, http, type WalletClient, type PublicClient } from 'viem'\nimport { BrowserWalletAdapter } from '../base/browser-wallet-adapter'\nimport {\n WalletType,\n ChainType,\n WalletState,\n Account,\n AddChainParams,\n ContractReadParams,\n ContractWriteParams,\n TransactionReceipt,\n} from '../../core/types'\nimport { createUniversalAddress } from '../../utils/address/universal-address'\nimport { formatEVMAddress } from '../../utils/address/evm-utils'\nimport { ConnectionRejectedError, SignatureRejectedError, TransactionFailedError } from '../../core/errors'\nimport { getChainInfo } from '../../utils/chain-info'\n\n/**\n * MetaMask Adapter\n */\nexport class MetaMaskAdapter extends BrowserWalletAdapter {\n readonly type = WalletType.METAMASK\n readonly chainType = ChainType.EVM\n readonly name = 'MetaMask'\n readonly icon = 'https://upload.wikimedia.org/wikipedia/commons/3/36/MetaMask_Fox.svg'\n\n private walletClient: WalletClient | null = null\n private publicClient: PublicClient | null = null\n\n /**\n * Connect wallet\n */\n async connect(chainId?: number): Promise<Account> {\n await this.ensureAvailable()\n\n try {\n this.setState(WalletState.CONNECTING)\n\n const provider = this.getBrowserProvider()\n\n // Request accounts\n const accounts = await provider.request({\n method: 'eth_requestAccounts',\n })\n\n if (!accounts || accounts.length === 0) {\n throw new ConnectionRejectedError(this.type)\n }\n\n // Get current chain ID\n const currentChainId = await provider.request({\n method: 'eth_chainId',\n })\n const parsedChainId = parseInt(currentChainId, 16)\n\n // If chain ID is specified and doesn't match, try to switch\n if (chainId && chainId !== parsedChainId) {\n await this.switchChain(chainId)\n }\n\n const finalChainId = chainId || parsedChainId\n const viemChain = this.getViemChain(finalChainId) as any\n\n // Create clients (need to specify chain to support writeContract)\n this.walletClient = createWalletClient({\n account: accounts[0] as `0x${string}`,\n chain: viemChain,\n transport: custom(provider),\n })\n\n // Use our configured RPC nodes for read operations to avoid MetaMask internal RPC issues\n const chainInfo = getChainInfo(finalChainId)\n const primaryRpcUrl = chainInfo?.rpcUrls[0] // Use first (most reliable) RPC node\n \n this.publicClient = createPublicClient({\n chain: viemChain,\n transport: primaryRpcUrl ? http(primaryRpcUrl) : custom(provider), // 优先使用我们的 RPC,降级到 MetaMask provider\n }) as any\n\n // 创建账户信息\n const address = formatEVMAddress(accounts[0])\n const account: Account = {\n universalAddress: createUniversalAddress(finalChainId, address),\n nativeAddress: address,\n chainId: finalChainId,\n chainType: ChainType.EVM,\n isActive: true,\n }\n\n this.setState(WalletState.CONNECTED)\n this.setAccount(account)\n this.setupEventListeners()\n\n return account\n } catch (error: any) {\n this.setState(WalletState.ERROR)\n this.setAccount(null)\n\n if (error.code === 4001) {\n throw new ConnectionRejectedError(this.type)\n }\n\n throw error\n }\n }\n\n /**\n * 签名消息\n */\n async signMessage(message: string): Promise<string> {\n this.ensureConnected()\n\n try {\n const provider = this.getBrowserProvider()\n const signature = await provider.request({\n method: 'personal_sign',\n params: [message, this.currentAccount!.nativeAddress],\n })\n\n return signature\n } catch (error: any) {\n if (error.code === 4001) {\n throw new SignatureRejectedError()\n }\n throw error\n }\n }\n\n /**\n * 签名 TypedData (EIP-712)\n */\n async signTypedData(typedData: any): Promise<string> {\n this.ensureConnected()\n\n try {\n const provider = this.getBrowserProvider()\n const signature = await provider.request({\n method: 'eth_signTypedData_v4',\n params: [this.currentAccount!.nativeAddress, JSON.stringify(typedData)],\n })\n\n return signature\n } catch (error: any) {\n if (error.code === 4001) {\n throw new SignatureRejectedError()\n }\n throw error\n }\n }\n\n /**\n * 签名交易\n * \n * Note: This signs a raw transaction without sending it.\n * The transaction can be broadcast later using the returned signature.\n */\n async signTransaction(transaction: any): Promise<string> {\n this.ensureConnected()\n\n try {\n const provider = this.getBrowserProvider()\n \n // Prepare transaction object with proper formatting\n const tx = {\n from: this.currentAccount!.nativeAddress,\n to: transaction.to,\n value: transaction.value ? `0x${BigInt(transaction.value).toString(16)}` : undefined,\n data: transaction.data || '0x',\n gas: transaction.gas ? `0x${BigInt(transaction.gas).toString(16)}` : undefined,\n gasPrice: transaction.gasPrice && transaction.gasPrice !== 'auto' ? `0x${BigInt(transaction.gasPrice).toString(16)}` : undefined,\n maxFeePerGas: transaction.maxFeePerGas ? `0x${BigInt(transaction.maxFeePerGas).toString(16)}` : undefined,\n maxPriorityFeePerGas: transaction.maxPriorityFeePerGas ? `0x${BigInt(transaction.maxPriorityFeePerGas).toString(16)}` : undefined,\n nonce: transaction.nonce !== undefined ? `0x${transaction.nonce.toString(16)}` : undefined,\n chainId: transaction.chainId || this.currentAccount!.chainId,\n }\n\n // Sign the transaction\n const signature = await provider.request({\n method: 'eth_signTransaction',\n params: [tx],\n })\n\n return signature\n } catch (error: any) {\n if (error.code === 4001) {\n throw new SignatureRejectedError('Transaction signature was rejected by user')\n }\n throw error\n }\n }\n\n /**\n * 切换链\n */\n async switchChain(chainId: number): Promise<void> {\n // 在连接过程中允许切换链,不需要检查连接状态\n const provider = this.getBrowserProvider()\n\n try {\n await provider.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: `0x${chainId.toString(16)}` }],\n })\n\n // 更新账户信息\n if (this.currentAccount) {\n const updatedAccount: Account = {\n ...this.currentAccount,\n chainId,\n universalAddress: createUniversalAddress(chainId, this.currentAccount.nativeAddress),\n }\n this.setAccount(updatedAccount)\n this.emitChainChanged(chainId)\n }\n } catch (error: any) {\n // 链不存在,尝试添加\n if (error.code === 4902) {\n const chainInfo = getChainInfo(chainId)\n if (chainInfo) {\n await this.addChain({\n chainId: chainInfo.id,\n chainName: chainInfo.name,\n nativeCurrency: chainInfo.nativeCurrency,\n rpcUrls: chainInfo.rpcUrls,\n blockExplorerUrls: chainInfo.blockExplorerUrls,\n })\n // 添加成功后再次尝试切换\n await this.switchChain(chainId)\n } else {\n throw new Error(`Chain ${chainId} not supported`)\n }\n } else {\n throw error\n }\n }\n }\n\n /**\n * 添加链\n */\n async addChain(chainConfig: AddChainParams): Promise<void> {\n const provider = this.getBrowserProvider()\n\n await provider.request({\n method: 'wallet_addEthereumChain',\n params: [{\n chainId: `0x${chainConfig.chainId.toString(16)}`,\n chainName: chainConfig.chainName,\n nativeCurrency: chainConfig.nativeCurrency,\n rpcUrls: chainConfig.rpcUrls,\n blockExplorerUrls: chainConfig.blockExplorerUrls,\n }],\n })\n }\n\n /**\n * 读取合约\n */\n async readContract<T = any>(params: ContractReadParams): Promise<T> {\n if (!this.publicClient) {\n throw new Error('Public client not initialized')\n }\n\n const result = await this.publicClient.readContract({\n address: params.address as `0x${string}`,\n abi: params.abi,\n functionName: params.functionName,\n ...(params.args ? { args: params.args as readonly any[] } : {}),\n } as any)\n\n return result as T\n }\n\n /**\n * 写入合约\n */\n async writeContract(params: ContractWriteParams): Promise<string> {\n this.ensureConnected()\n\n if (!this.walletClient) {\n throw new Error('Wallet client not initialized')\n }\n\n try {\n // 调试日志\n console.log('🔍 [MetaMask writeContract] params.gasPrice:', params.gasPrice, 'type:', typeof params.gasPrice);\n \n // 处理 gasPrice\n let processedGasPrice: bigint | 'auto' | undefined;\n if (!params.gasPrice) {\n processedGasPrice = undefined;\n } else if (params.gasPrice === 'auto') {\n processedGasPrice = undefined; // viem 会自动获取 gas price\n } else {\n processedGasPrice = BigInt(params.gasPrice);\n }\n \n console.log('🔍 [MetaMask writeContract] processedGasPrice:', processedGasPrice);\n \n const txHash = await this.walletClient.writeContract({\n address: params.address as `0x${string}`,\n abi: params.abi,\n functionName: params.functionName,\n ...(params.args ? { args: params.args as readonly any[] } : {}),\n value: params.value ? BigInt(params.value) : undefined,\n gas: params.gas ? BigInt(params.gas) : undefined,\n gasPrice: processedGasPrice,\n } as any)\n\n return txHash\n } catch (error: any) {\n if (error.code === 4001) {\n throw new SignatureRejectedError('Transaction was rejected by user')\n }\n throw error\n }\n }\n\n /**\n * 估算 gas\n */\n async estimateGas(params: ContractWriteParams): Promise<bigint> {\n if (!this.publicClient) {\n throw new Error('Public client not initialized')\n }\n\n const gas = await this.publicClient.estimateContractGas({\n address: params.address as `0x${string}`,\n abi: params.abi,\n functionName: params.functionName,\n ...(params.args ? { args: params.args as readonly any[] } : {}),\n value: params.value ? BigInt(params.value) : undefined,\n account: this.currentAccount!.nativeAddress as `0x${string}`,\n } as any)\n\n return gas\n }\n\n /**\n * 等待交易确认\n */\n async waitForTransaction(txHash: string, confirmations: number = 1): Promise<TransactionReceipt> {\n if (!this.publicClient) {\n throw new Error('Public client not initialized')\n }\n\n const receipt = await this.publicClient.waitForTransactionReceipt({\n hash: txHash as `0x${string}`,\n confirmations,\n })\n\n if (receipt.status === 'reverted') {\n throw new TransactionFailedError(txHash, 'Transaction reverted')\n }\n\n return {\n transactionHash: receipt.transactionHash,\n blockNumber: Number(receipt.blockNumber),\n blockHash: receipt.blockHash,\n from: receipt.from,\n to: receipt.to || undefined,\n status: receipt.status === 'success' ? 'success' : 'failed',\n gasUsed: receipt.gasUsed.toString(),\n effectiveGasPrice: receipt.effectiveGasPrice?.toString(),\n logs: receipt.logs,\n }\n }\n\n /**\n * 获取 Provider\n */\n getProvider(): any {\n return this.getBrowserProvider()\n }\n\n /**\n * 获取 Signer\n */\n getSigner(): WalletClient | null {\n return this.walletClient\n }\n\n /**\n * 获取浏览器中的 MetaMask provider\n */\n protected getBrowserProvider(): any | undefined {\n if (typeof window === 'undefined') {\n return undefined\n }\n const w = window as any\n // 支持所有提供 window.ethereum 接口的钱包(MetaMask、TP钱包、Trust Wallet等)\n return w.ethereum ? w.ethereum : undefined\n }\n\n /**\n * 获取下载链接\n */\n protected getDownloadUrl(): string {\n return 'https://metamask.io/download/'\n }\n\n /**\n * 设置事件监听\n */\n protected setupEventListeners(): void {\n const provider = this.getBrowserProvider()\n if (!provider) return\n\n provider.on('accountsChanged', this.handleAccountsChanged)\n provider.on('chainChanged', this.handleChainChanged)\n provider.on('disconnect', this.handleDisconnect)\n }\n\n /**\n * 移除事件监听\n */\n protected removeEventListeners(): void {\n const provider = this.getBrowserProvider()\n if (!provider) return\n\n provider.removeListener('accountsChanged', this.handleAccountsChanged)\n provider.removeListener('chainChanged', this.handleChainChanged)\n provider.removeListener('disconnect', this.handleDisconnect)\n }\n\n /**\n * 处理账户变化\n * \n * 注意:MetaMask 的行为\n * - 切换到已连接的账户:触发事件,返回新账户 ['0xNewAddress']\n * - 切换到未连接的账户:不触发事件(用户需要手动断开和重新连接)\n * - 锁定钱包:触发事件,返回空数组 []\n */\n private handleAccountsChanged = (accounts: string[]) => {\n console.log('[MetaMask] accountsChanged event triggered:', accounts)\n \n if (accounts.length === 0) {\n // 用户锁定钱包或手动断开连接\n console.log('[MetaMask] Disconnecting: wallet locked or manually disconnected')\n this.setState(WalletState.DISCONNECTED)\n this.setAccount(null)\n this.emitAccountChanged(null)\n } else {\n // 用户在已连接的账户之间切换\n const address = formatEVMAddress(accounts[0])\n console.log('[MetaMask] Account changed to:', address)\n const account: Account = {\n universalAddress: createUniversalAddress(this.currentAccount!.chainId, address),\n nativeAddress: address,\n chainId: this.currentAccount!.chainId,\n chainType: ChainType.EVM,\n isActive: true,\n }\n this.setAccount(account)\n this.emitAccountChanged(account)\n }\n }\n\n /**\n * 处理链变化\n */\n private handleChainChanged = (chainIdHex: string) => {\n const chainId = parseInt(chainIdHex, 16)\n\n if (this.currentAccount) {\n const account: Account = {\n ...this.currentAccount,\n chainId,\n universalAddress: createUniversalAddress(chainId, this.currentAccount.nativeAddress),\n }\n this.setAccount(account)\n this.emitChainChanged(chainId)\n }\n }\n\n /**\n * 处理断开连接\n */\n private handleDisconnect = () => {\n this.setState(WalletState.DISCONNECTED)\n this.setAccount(null)\n this.emitDisconnected()\n }\n\n /**\n * 获取 viem chain 配置(简化版)\n */\n private getViemChain(chainId: number): any {\n const chainInfo = getChainInfo(chainId)\n if (chainInfo) {\n return {\n id: chainId,\n name: chainInfo.name,\n network: chainInfo.name.toLowerCase().replace(/\\s+/g, '-'),\n nativeCurrency: chainInfo.nativeCurrency,\n rpcUrls: {\n default: { http: chainInfo.rpcUrls },\n public: { http: chainInfo.rpcUrls },\n },\n blockExplorers: chainInfo.blockExplorerUrls ? {\n default: { name: 'Explorer', url: chainInfo.blockExplorerUrls[0] },\n } : undefined,\n }\n }\n\n // 默认配置\n return {\n id: chainId,\n name: `Chain ${chainId}`,\n network: `chain-${chainId}`,\n nativeCurrency: {\n name: 'ETH',\n symbol: 'ETH',\n decimals: 18,\n },\n rpcUrls: {\n default: { http: [] },\n public: { http: [] },\n },\n }\n }\n}\n\n","/**\n * 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 // Note: No longer auto-restoring connection in constructor\n // Async operations should be handled in WalletProvider by calling restoreFromStorage()\n }\n\n // ===== Connection Management =====\n\n /**\n * Connect primary wallet\n */\n async connect(type: WalletType, chainId?: number): Promise<Account> {\n const adapter = this.registry.getAdapter(type)\n if (!adapter) {\n throw new WalletNotAvailableError(type)\n }\n\n // Check if available\n const isAvailable = await adapter.isAvailable()\n if (!isAvailable) {\n throw new WalletNotAvailableError(type)\n }\n\n // Connect wallet\n const account = await adapter.connect(chainId)\n\n // Set as primary wallet\n this.setPrimaryWallet(adapter)\n\n // Add to connected wallet pool\n this.connectedWallets.set(adapter.chainType, adapter)\n\n // Setup event listeners\n this.setupAdapterListeners(adapter, true)\n\n // Save to storage\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n\n return account\n }\n\n /**\n * Connect additional wallet (without changing primary wallet)\n */\n async connectAdditional(type: WalletType, chainId?: number): Promise<Account> {\n const adapter = this.registry.getAdapter(type)\n if (!adapter) {\n throw new WalletNotAvailableError(type)\n }\n\n const isAvailable = await adapter.isAvailable()\n if (!isAvailable) {\n throw new WalletNotAvailableError(type)\n }\n\n const account = await adapter.connect(chainId)\n\n // Add to connected wallet pool (without setting as primary)\n this.connectedWallets.set(adapter.chainType, adapter)\n\n // Setup event listeners\n this.setupAdapterListeners(adapter, false)\n\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n\n return account\n }\n\n /**\n * Connect with private key (for development/testing only)\n */\n async connectWithPrivateKey(privateKey: string, chainId?: number): Promise<Account> {\n const adapter = new EVMPrivateKeyAdapter()\n adapter.setPrivateKey(privateKey)\n\n const account = await adapter.connect(chainId || this.config.defaultChainId)\n\n this.setPrimaryWallet(adapter)\n this.connectedWallets.set(adapter.chainType, adapter)\n this.setupAdapterListeners(adapter, true)\n\n return account\n }\n\n /**\n * Disconnect primary wallet\n */\n async disconnect(): Promise<void> {\n if (!this.primaryWallet) {\n return\n }\n\n // Save chainType first, as it may be cleared after disconnect()\n const chainType = this.primaryWallet.chainType\n\n await this.primaryWallet.disconnect()\n\n // Remove listeners\n this.removeAdapterListeners(this.primaryWallet)\n\n // Remove from connected wallet pool\n this.connectedWallets.delete(chainType)\n\n this.primaryWallet = null\n\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n\n this.emit('disconnected')\n }\n\n /**\n * Disconnect all wallets\n */\n async disconnectAll(): Promise<void> {\n const wallets = Array.from(this.connectedWallets.values())\n\n for (const wallet of wallets) {\n await wallet.disconnect()\n this.removeAdapterListeners(wallet)\n }\n\n this.primaryWallet = null\n this.connectedWallets.clear()\n\n if (this.config.enableStorage) {\n this.clearStorage()\n }\n\n this.emit('disconnected')\n }\n\n // ===== Primary Wallet Management =====\n\n /**\n * Switch primary wallet\n */\n async switchPrimaryWallet(chainType: ChainType): Promise<Account> {\n const adapter = this.connectedWallets.get(chainType)\n if (!adapter || !adapter.currentAccount) {\n throw new WalletNotConnectedError(`Wallet for chain type ${chainType} not connected`)\n }\n\n const oldPrimary = this.primaryWallet?.currentAccount || null\n\n // Remove listeners from old primary wallet\n if (this.primaryWallet) {\n this.removeAdapterListeners(this.primaryWallet)\n }\n\n // Set new primary wallet\n this.setPrimaryWallet(adapter)\n\n // Setup listeners for new primary wallet\n this.setupAdapterListeners(adapter, true)\n\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n\n this.emit('primaryWalletSwitched', adapter.currentAccount, oldPrimary, chainType)\n\n return adapter.currentAccount\n }\n\n /**\n * Get primary wallet account\n */\n getPrimaryAccount(): Account | null {\n return this.primaryWallet?.currentAccount || null\n }\n\n /**\n * Get all connected wallets\n */\n getConnectedWallets(): ConnectedWallet[] {\n return Array.from(this.connectedWallets.values()).map(adapter => ({\n account: adapter.currentAccount!,\n walletType: adapter.type,\n chainType: adapter.chainType,\n isPrimary: adapter === this.primaryWallet,\n canSwitchChain: this.canSwitchChain(adapter),\n adapter,\n }))\n }\n\n /**\n * Get wallet by chain type\n */\n getWalletByChainType(chainType: ChainType): IWalletAdapter | null {\n return this.connectedWallets.get(chainType) || null\n }\n\n // ===== Signing =====\n\n /**\n * Sign message with primary wallet\n */\n async signMessage(message: string): Promise<string> {\n if (!this.primaryWallet) {\n throw new WalletNotConnectedError()\n }\n\n return this.primaryWallet.signMessage(message)\n }\n\n /**\n * Sign message with wallet of specified chain type\n */\n async signMessageWithChainType(message: string, chainType?: ChainType): Promise<string> {\n if (!chainType) {\n return this.signMessage(message)\n }\n\n const adapter = this.connectedWallets.get(chainType)\n if (!adapter) {\n throw new WalletNotConnectedError(`Wallet for chain type ${chainType}`)\n }\n\n return adapter.signMessage(message)\n }\n\n /**\n * Sign TypedData (EVM only)\n */\n async signTypedData(typedData: any, chainType?: ChainType): Promise<string> {\n const adapter = chainType\n ? this.connectedWallets.get(chainType)\n : this.primaryWallet\n\n if (!adapter) {\n throw new WalletNotConnectedError()\n }\n\n if (!adapter.signTypedData) {\n throw new Error(`signTypedData not supported by ${adapter.type}`)\n }\n\n return adapter.signTypedData(typedData)\n }\n\n /**\n * Sign transaction (with primary wallet)\n */\n async signTransaction(transaction: any): Promise<string> {\n if (!this.primaryWallet) {\n throw new WalletNotConnectedError()\n }\n\n if (!this.primaryWallet.signTransaction) {\n throw new Error(`signTransaction not supported by ${this.primaryWallet.type}`)\n }\n\n return this.primaryWallet.signTransaction(transaction)\n }\n\n /**\n * Sign transaction with wallet of specified chain type\n */\n async signTransactionWithChainType(transaction: any, chainType?: ChainType): Promise<string> {\n if (!chainType) {\n return this.signTransaction(transaction)\n }\n\n const adapter = this.connectedWallets.get(chainType)\n if (!adapter) {\n throw new WalletNotConnectedError(`Wallet for chain type ${chainType}`)\n }\n\n if (!adapter.signTransaction) {\n throw new Error(`signTransaction not supported by ${adapter.type}`)\n }\n\n return adapter.signTransaction(transaction)\n }\n\n // ===== Chain Switching =====\n\n /**\n * Request chain switch (EVM only)\n */\n async requestSwitchChain(chainId: number, options?: {\n addChainIfNotExists?: boolean\n chainConfig?: AddChainParams\n }): Promise<Account> {\n if (!this.primaryWallet) {\n throw new WalletNotConnectedError()\n }\n\n if (!this.primaryWallet.switchChain) {\n throw new Error(`Chain switching not supported by ${this.primaryWallet.type}`)\n }\n\n try {\n await this.primaryWallet.switchChain(chainId)\n return this.primaryWallet.currentAccount!\n } catch (error: any) {\n // If chain doesn't exist and auto-add is configured\n if (options?.addChainIfNotExists && options.chainConfig && this.primaryWallet.addChain) {\n await this.primaryWallet.addChain(options.chainConfig)\n await this.primaryWallet.switchChain(chainId)\n return this.primaryWallet.currentAccount!\n }\n throw error\n }\n }\n\n // ===== Contract Calls =====\n\n /**\n * Read contract\n */\n async readContract<T = any>(\n address: string,\n abi: any[],\n functionName: string,\n args?: any[],\n chainType?: ChainType\n ): Promise<T> {\n const adapter = chainType\n ? this.connectedWallets.get(chainType)\n : this.primaryWallet\n\n if (!adapter) {\n throw new WalletNotConnectedError()\n }\n\n if (!adapter.readContract) {\n throw new Error(`readContract not supported by ${adapter.type}`)\n }\n\n return adapter.readContract({ address, abi, functionName, args })\n }\n\n /**\n * Write contract\n */\n async writeContract(\n address: string,\n abi: any[],\n functionName: string,\n args?: any[],\n options?: {\n value?: string\n gas?: number\n gasPrice?: string\n },\n chainType?: ChainType\n ): Promise<string> {\n const adapter = chainType\n ? this.connectedWallets.get(chainType)\n : this.primaryWallet\n\n if (!adapter) {\n throw new WalletNotConnectedError()\n }\n\n if (!adapter.writeContract) {\n throw new Error(`writeContract not supported by ${adapter.type}`)\n }\n\n return adapter.writeContract({\n address,\n abi,\n functionName,\n args,\n ...options,\n })\n }\n\n /**\n * Estimate gas\n */\n async estimateGas(\n address: string,\n abi: any[],\n functionName: string,\n args?: any[],\n chainType?: ChainType\n ): Promise<bigint> {\n const adapter = chainType\n ? this.connectedWallets.get(chainType)\n : this.primaryWallet\n\n if (!adapter) {\n throw new WalletNotConnectedError()\n }\n\n if (!adapter.estimateGas) {\n throw new Error(`estimateGas not supported by ${adapter.type}`)\n }\n\n return adapter.estimateGas({ address, abi, functionName, args })\n }\n\n /**\n * Wait for transaction confirmation\n */\n async waitForTransaction(\n txHash: string,\n confirmations?: number,\n chainType?: ChainType\n ): Promise<TransactionReceipt> {\n const adapter = chainType\n ? this.connectedWallets.get(chainType)\n : this.primaryWallet\n\n if (!adapter) {\n throw new WalletNotConnectedError()\n }\n\n if (!adapter.waitForTransaction) {\n throw new Error(`waitForTransaction not supported by ${adapter.type}`)\n }\n\n return adapter.waitForTransaction(txHash, confirmations)\n }\n\n // ===== Provider Access =====\n\n /**\n * Get primary wallet Provider\n */\n getProvider(): any {\n if (!this.primaryWallet) {\n throw new WalletNotConnectedError()\n }\n\n return this.primaryWallet.getProvider()\n }\n\n /**\n * Get Provider by chain type\n */\n getProviderByChainType(chainType: ChainType): any {\n const adapter = this.connectedWallets.get(chainType)\n if (!adapter) {\n throw new WalletNotConnectedError(`Wallet for chain type ${chainType}`)\n }\n\n return adapter.getProvider()\n }\n\n // ===== Private Methods =====\n\n /**\n * Set primary wallet\n */\n private setPrimaryWallet(adapter: IWalletAdapter): void {\n this.primaryWallet = adapter\n }\n\n /**\n * Check if wallet supports chain switching\n */\n private canSwitchChain(adapter: IWalletAdapter): boolean {\n return !!adapter.switchChain\n }\n\n /**\n * Setup adapter event listeners\n */\n private setupAdapterListeners(adapter: IWalletAdapter, isPrimary: boolean): void {\n adapter.on('accountChanged', (account: Account | null) => {\n if (isPrimary) {\n this.emit('accountChanged', account)\n }\n this.emit('walletAccountChanged', adapter.chainType, account, isPrimary)\n\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n })\n\n adapter.on('chainChanged', (chainId: number) => {\n if (isPrimary && adapter.currentAccount) {\n this.emit('chainChanged', chainId, adapter.currentAccount)\n }\n if (adapter.currentAccount) {\n this.emit('walletChainChanged', adapter.chainType, chainId, adapter.currentAccount, isPrimary)\n }\n\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n })\n\n adapter.on('disconnected', () => {\n if (isPrimary) {\n this.emit('disconnected')\n }\n this.emit('walletDisconnected', adapter.chainType, isPrimary)\n\n this.connectedWallets.delete(adapter.chainType)\n\n if (adapter === this.primaryWallet) {\n this.primaryWallet = null\n }\n\n if (this.config.enableStorage) {\n this.saveToStorage()\n }\n })\n\n adapter.on('error', (error: Error) => {\n this.emit('error', error)\n })\n }\n\n /**\n * Remove adapter event listeners\n */\n private removeAdapterListeners(adapter: IWalletAdapter | null): void {\n if (!adapter) return\n adapter.removeAllListeners()\n }\n\n // ===== Storage =====\n\n /**\n * Save to storage\n */\n private saveToStorage(): void {\n if (typeof window === 'undefined' || !this.config.enableStorage) {\n return\n }\n\n const data: StorageData = {\n current: this.primaryWallet?.currentAccount?.universalAddress || null,\n primaryWalletType: this.primaryWallet?.type,\n primaryChainId: this.primaryWallet?.currentAccount?.chainId,\n history: this.getHistoryRecords(),\n }\n\n try {\n localStorage.setItem(\n `${this.config.storagePrefix}data`,\n JSON.stringify(data)\n )\n } catch (error) {\n console.error('Failed to save wallet data to storage:', error)\n }\n }\n\n /**\n * Restore from storage\n * Returns a Promise that can be used for auto-reconnection\n */\n async restoreFromStorage(): Promise<Account | null> {\n if (typeof window === 'undefined' || !this.config.enableStorage) {\n return null\n }\n\n try {\n const stored = localStorage.getItem(`${this.config.storagePrefix}data`)\n if (!stored) {\n console.debug('[WalletManager] No stored wallet data found')\n return null\n }\n\n const data: StorageData = JSON.parse(stored)\n console.debug('[WalletManager] Restoring from storage:', data)\n \n // Cannot restore if primary wallet info is missing\n if (!data.primaryWalletType || !data.current) {\n console.debug('[WalletManager] Missing primary wallet info in storage')\n return null\n }\n\n // Get adapter\n const adapter = this.registry.getAdapter(data.primaryWalletType)\n if (!adapter) {\n console.debug('[WalletManager] Adapter not found for type:', data.primaryWalletType)\n return null\n }\n\n // Check if wallet is available\n const isAvailable = await adapter.isAvailable()\n if (!isAvailable) {\n console.debug('[WalletManager] Wallet not available:', data.primaryWalletType)\n return null\n }\n\n console.debug('[WalletManager] Wallet is available, attempting restoration')\n\n // For browser wallets (e.g., MetaMask), try to silently get authorized accounts first\n if (adapter.chainType === ChainType.EVM && data.primaryWalletType === WalletType.METAMASK) {\n try {\n // Try to silently get authorized accounts (no popup)\n const provider = typeof window !== 'undefined' ? (window as any).ethereum : null\n if (provider) {\n const accounts = await provider.request({\n method: 'eth_accounts',\n })\n\n console.debug('[WalletManager] Checking authorized accounts:', accounts)\n\n if (accounts && accounts.length > 0) {\n // Check if account matches saved address\n const savedAddress = data.current.split(':')[1] // Extract address from universalAddress\n const currentAddress = accounts[0].toLowerCase()\n \n console.debug('[WalletManager] Comparing addresses - saved:', savedAddress, 'current:', currentAddress)\n \n if (currentAddress === savedAddress.toLowerCase()) {\n // Authorized account found and address matches, call connect directly\n // If account is already authorized, eth_requestAccounts should not popup\n console.debug('[WalletManager] Address matches, attempting connect (should be silent if already authorized)')\n try {\n const account = await adapter.connect(data.primaryChainId)\n \n // Set as primary wallet and setup listeners\n this.setPrimaryWallet(adapter)\n this.connectedWallets.set(adapter.chainType, adapter)\n this.setupAdapterListeners(adapter, true)\n this.emit('accountChanged', account)\n \n console.debug('[WalletManager] Connect successful')\n return account\n } catch (connectError: any) {\n // If connection fails (might be user rejection), fail silently\n console.debug('[WalletManager] Connect failed (might be user rejection):', connectError?.message)\n return null\n }\n } else {\n console.debug('[WalletManager] Address mismatch, will try normal connect')\n }\n } else {\n console.debug('[WalletManager] No authorized accounts found')\n }\n }\n } catch (silentError) {\n // Silent connection failed, continue with normal connection\n console.debug('Silent connection failed, trying normal connection:', silentError)\n }\n }\n\n // For TronLink, similar handling\n if (adapter.chainType === ChainType.TRON && data.primaryWalletType === WalletType.TRONLINK) {\n try {\n const tronWeb = (adapter as any).getTronWeb?.()\n if (tronWeb && tronWeb.defaultAddress?.base58) {\n // TronLink is authorized, connect directly\n const account = await adapter.connect(data.primaryChainId)\n \n // Set as primary wallet\n this.setPrimaryWallet(adapter)\n this.connectedWallets.set(adapter.chainType, adapter)\n this.setupAdapterListeners(adapter, true)\n this.emit('accountChanged', account)\n \n return account\n }\n } catch (silentError) {\n console.debug('Silent TronLink connection failed:', silentError)\n }\n }\n\n // Try normal connection (may popup)\n const account = await adapter.connect(data.primaryChainId)\n\n // Set as primary wallet\n this.setPrimaryWallet(adapter)\n this.connectedWallets.set(adapter.chainType, adapter)\n this.setupAdapterListeners(adapter, true)\n\n // Don't save to storage here again to avoid loop\n this.emit('accountChanged', account)\n\n return account\n } catch (error) {\n // Silently handle errors, might be user rejection or wallet unavailable\n console.debug('Failed to restore wallet from storage:', error)\n return null\n }\n }\n\n /**\n * Clear storage\n */\n private clearStorage(): void {\n if (typeof window === 'undefined') {\n return\n }\n\n try {\n localStorage.removeItem(`${this.config.storagePrefix}data`)\n } catch (error) {\n console.error('Failed to clear wallet data from storage:', error)\n }\n }\n\n /**\n * Get history records\n */\n private getHistoryRecords(): WalletHistoryRecord[] {\n const records: WalletHistoryRecord[] = []\n\n for (const adapter of this.connectedWallets.values()) {\n if (adapter.currentAccount) {\n records.push({\n universalAddress: adapter.currentAccount.universalAddress,\n nativeAddress: adapter.currentAccount.nativeAddress,\n chainId: adapter.currentAccount.chainId,\n chainType: adapter.chainType,\n walletType: adapter.type,\n lastConnected: Date.now(),\n name: adapter.currentAccount.name,\n })\n }\n }\n\n return records\n }\n}\n\n","/**\n * React Context for Wallet SDK\n */\n\nimport React, { createContext, useContext, useEffect, useState, useCallback, ReactNode } from 'react'\nimport { WalletManager } from '../core/wallet-manager'\nimport { Account, WalletType, ConnectedWallet, ChainType } from '../core/types'\n\n/**\n * Wallet Context Type\n */\nexport interface WalletContextValue {\n // State\n walletManager: WalletManager\n account: Account | null\n isConnected: boolean\n connectedWallets: ConnectedWallet[]\n isRestoring: boolean // Whether connection is being restored\n\n // Methods\n connect: (type: WalletType, chainId?: number) => Promise<Account>\n connectAdditional: (type: WalletType, chainId?: number) => Promise<Account>\n disconnect: () => Promise<void>\n switchPrimaryWallet: (chainType: ChainType) => Promise<Account>\n signMessage: (message: string) => Promise<string>\n signTransaction: (transaction: any) => Promise<string>\n}\n\n/**\n * Wallet Context\n */\nconst WalletContext = createContext<WalletContextValue | null>(null)\n\n/**\n * Wallet Provider Props\n */\nexport interface WalletProviderProps {\n children: ReactNode\n walletManager?: WalletManager\n}\n\n/**\n * Wallet Provider\n */\nexport function WalletProvider({ children, walletManager: externalWalletManager }: WalletProviderProps) {\n const [walletManager] = useState(() => externalWalletManager || new WalletManager())\n const [account, setAccount] = useState<Account | null>(null)\n const [connectedWallets, setConnectedWallets] = useState<ConnectedWallet[]>([])\n const [isRestoring, setIsRestoring] = useState(true)\n\n // Update connected wallets list\n const updateConnectedWallets = useCallback(() => {\n setConnectedWallets(walletManager.getConnectedWallets())\n }, [walletManager])\n\n // Connect wallet\n const connect = useCallback(async (type: WalletType, chainId?: number) => {\n const account = await walletManager.connect(type, chainId)\n setAccount(account)\n updateConnectedWallets()\n return account\n }, [walletManager, updateConnectedWallets])\n\n // Connect additional wallet\n const connectAdditional = useCallback(async (type: WalletType, chainId?: number) => {\n const account = await walletManager.connectAdditional(type, chainId)\n updateConnectedWallets()\n return account\n }, [walletManager, updateConnectedWallets])\n\n // Disconnect wallet\n const disconnect = useCallback(async () => {\n await walletManager.disconnect()\n setAccount(null)\n updateConnectedWallets()\n }, [walletManager, updateConnectedWallets])\n\n // Switch primary wallet\n const switchPrimaryWallet = useCallback(async (chainType: ChainType) => {\n const account = await walletManager.switchPrimaryWallet(chainType)\n setAccount(account)\n updateConnectedWallets()\n return account\n }, [walletManager, updateConnectedWallets])\n\n // Sign message\n const signMessage = useCallback(async (message: string) => {\n return walletManager.signMessage(message)\n }, [walletManager])\n\n // Sign transaction\n const signTransaction = useCallback(async (transaction: any) => {\n return walletManager.signTransaction(transaction)\n }, [walletManager])\n\n // Auto-restore connection (only on mount)\n useEffect(() => {\n const restoreConnection = async () => {\n try {\n // Try to restore connection from storage\n const restoredAccount = await walletManager.restoreFromStorage()\n if (restoredAccount) {\n setAccount(restoredAccount)\n updateConnectedWallets()\n }\n } catch (error) {\n console.debug('Failed to restore wallet connection:', error)\n } finally {\n setIsRestoring(false)\n }\n }\n\n restoreConnection()\n }, [walletManager, updateConnectedWallets])\n\n // Listen to events\n useEffect(() => {\n const handleAccountChanged = (newAccount: Account | null) => {\n setAccount(newAccount)\n updateConnectedWallets()\n }\n\n const handleChainChanged = (_chainId: number, newAccount: Account) => {\n setAccount(newAccount)\n updateConnectedWallets()\n }\n\n const handleDisconnected = () => {\n setAccount(null)\n updateConnectedWallets()\n }\n\n const handlePrimaryWalletSwitched = (newPrimary: Account) => {\n setAccount(newPrimary)\n updateConnectedWallets()\n }\n\n walletManager.on('accountChanged', handleAccountChanged)\n walletManager.on('chainChanged', handleChainChanged)\n walletManager.on('disconnected', handleDisconnected)\n walletManager.on('primaryWalletSwitched', handlePrimaryWalletSwitched)\n\n // Initialize account (if already connected)\n if (!isRestoring) {\n const primaryAccount = walletManager.getPrimaryAccount()\n if (primaryAccount) {\n setAccount(primaryAccount)\n updateConnectedWallets()\n }\n }\n\n return () => {\n walletManager.off('accountChanged', handleAccountChanged)\n walletManager.off('chainChanged', handleChainChanged)\n walletManager.off('disconnected', handleDisconnected)\n walletManager.off('primaryWalletSwitched', handlePrimaryWalletSwitched)\n }\n }, [walletManager, updateConnectedWallets, isRestoring])\n\n const value: WalletContextValue = {\n walletManager,\n account,\n isConnected: account !== null,\n connectedWallets,\n isRestoring,\n connect,\n connectAdditional,\n disconnect,\n switchPrimaryWallet,\n signMessage,\n signTransaction,\n }\n\n return <WalletContext.Provider value={value}>{children}</WalletContext.Provider>\n}\n\n/**\n * useWallet Hook\n */\nexport function useWallet(): WalletContextValue {\n const context = useContext(WalletContext)\n if (!context) {\n throw new Error('useWallet must be used within a WalletProvider')\n }\n return context\n}\n\n","/**\n * useAccount Hook\n * 获取当前账户信息\n */\n\nimport { useWallet } from '../WalletContext'\nimport { Account } from '../../core/types'\n\nexport interface UseAccountResult {\n account: Account | null\n isConnected: boolean\n address: string | null\n chainId: number | null\n universalAddress: string | null\n}\n\n/**\n * useAccount Hook\n */\nexport function useAccount(): UseAccountResult {\n const { account, isConnected } = useWallet()\n\n return {\n account,\n isConnected,\n address: account?.nativeAddress || null,\n chainId: account?.chainId || null,\n universalAddress: account?.universalAddress || null,\n }\n}\n\n\n","/**\n * useConnect Hook\n * 连接钱包\n */\n\nimport { useState } from 'react'\nimport { useWallet } from '../WalletContext'\nimport { WalletType, Account } from '../../core/types'\n\nexport interface UseConnectResult {\n connect: (type: WalletType, chainId?: number) => Promise<Account>\n connectAdditional: (type: WalletType, chainId?: number) => Promise<Account>\n isConnecting: boolean\n error: Error | null\n}\n\n/**\n * useConnect Hook\n */\nexport function useConnect(): UseConnectResult {\n const { connect: contextConnect, connectAdditional: contextConnectAdditional } = useWallet()\n const [isConnecting, setIsConnecting] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n\n const connect = async (type: WalletType, chainId?: number): Promise<Account> => {\n setIsConnecting(true)\n setError(null)\n\n try {\n const account = await contextConnect(type, chainId)\n return account\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsConnecting(false)\n }\n }\n\n const connectAdditional = async (type: WalletType, chainId?: number): Promise<Account> => {\n setIsConnecting(true)\n setError(null)\n\n try {\n const account = await contextConnectAdditional(type, chainId)\n return account\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsConnecting(false)\n }\n }\n\n return {\n connect,\n connectAdditional,\n isConnecting,\n error,\n }\n}\n\n\n","/**\n * useDisconnect Hook\n * 断开钱包连接\n */\n\nimport { useState } from 'react'\nimport { useWallet } from '../WalletContext'\n\nexport interface UseDisconnectResult {\n disconnect: () => Promise<void>\n isDisconnecting: boolean\n error: Error | null\n}\n\n/**\n * useDisconnect Hook\n */\nexport function useDisconnect(): UseDisconnectResult {\n const { disconnect: contextDisconnect } = useWallet()\n const [isDisconnecting, setIsDisconnecting] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n\n const disconnect = async (): Promise<void> => {\n setIsDisconnecting(true)\n setError(null)\n\n try {\n await contextDisconnect()\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsDisconnecting(false)\n }\n }\n\n return {\n disconnect,\n isDisconnecting,\n error,\n }\n}\n\n\n","/**\n * useSignMessage Hook\n * 签名消息\n */\n\nimport { useState } from 'react'\nimport { useWallet } from '../WalletContext'\n\nexport interface UseSignMessageResult {\n signMessage: (message: string) => Promise<string>\n isSigning: boolean\n error: Error | null\n}\n\n/**\n * useSignMessage Hook\n */\nexport function useSignMessage(): UseSignMessageResult {\n const { signMessage: contextSignMessage } = useWallet()\n const [isSigning, setIsSigning] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n\n const signMessage = async (message: string): Promise<string> => {\n setIsSigning(true)\n setError(null)\n\n try {\n const signature = await contextSignMessage(message)\n return signature\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsSigning(false)\n }\n }\n\n return {\n signMessage,\n isSigning,\n error,\n }\n}\n\n","/**\n * useSignTransaction Hook\n * 签名交易\n */\n\nimport { useState } from 'react'\nimport { useWallet } from '../WalletContext'\n\nexport interface UseSignTransactionResult {\n signTransaction: (transaction: any) => Promise<string>\n isSigning: boolean\n error: Error | null\n}\n\n/**\n * useSignTransaction Hook\n */\nexport function useSignTransaction(): UseSignTransactionResult {\n const { signTransaction: contextSignTransaction } = useWallet()\n const [isSigning, setIsSigning] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n\n const signTransaction = async (transaction: any): Promise<string> => {\n setIsSigning(true)\n setError(null)\n\n try {\n const signature = await contextSignTransaction(transaction)\n return signature\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsSigning(false)\n }\n }\n\n return {\n signTransaction,\n isSigning,\n error,\n }\n}\n\n\n"]}
|